diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-04-20 11:25:43 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-04-20 11:25:43 +1000 |
| commit | 731b2cfa77a063e98da8fa26acc1e7ed1de8c169 (patch) | |
| tree | 13a8cca13f2e6ea665a87cc0f1c036de7c326d60 /src/audio | |
| parent | 4c77950e702a329f3136456a932efbea36e03d42 (diff) | |
| download | tangara-fw-731b2cfa77a063e98da8fa26acc1e7ed1de8c169.tar.gz | |
working isr-based sink, but still grainy
Diffstat (limited to 'src/audio')
| -rw-r--r-- | src/audio/audio_playback.cpp | 2 | ||||
| -rw-r--r-- | src/audio/audio_task.cpp | 8 | ||||
| -rw-r--r-- | src/audio/i2s_audio_output.cpp | 4 | ||||
| -rw-r--r-- | src/audio/include/audio_sink.hpp | 28 |
4 files changed, 23 insertions, 19 deletions
diff --git a/src/audio/audio_playback.cpp b/src/audio/audio_playback.cpp index 9a978535..fac4bfab 100644 --- a/src/audio/audio_playback.cpp +++ b/src/audio/audio_playback.cpp @@ -41,7 +41,7 @@ AudioPlayback::AudioPlayback(std::unique_ptr<I2SAudioOutput> output) pipeline->AddInput(file_source_.get()); task::StartPipeline(pipeline, i2s_output_.get()); - task::StartDrain(i2s_output_.get()); + // task::StartDrain(i2s_output_.get()); } AudioPlayback::~AudioPlayback() {} diff --git a/src/audio/audio_task.cpp b/src/audio/audio_task.cpp index 1670f9f6..45db0b60 100644 --- a/src/audio/audio_task.cpp +++ b/src/audio/audio_task.cpp @@ -58,7 +58,7 @@ auto StartDrain(IAudioSink* sink) -> void { ESP_LOGI(kTag, "starting audio drain task"); xTaskCreate(&AudioDrainMain, "drain", kDrainStackSize, drain_args, - kTaskPriorityAudioDrain, NULL); + kTaskPriorityAudioDrain, NULL); } void AudioTaskMain(void* args) { @@ -134,7 +134,7 @@ void AudioTaskMain(void* args) { // The format of the stream within the sink stream has changed. We // need to reconfigure the sink, but shouldn't do so until we've fully // drained the current buffer. - if (xStreamBufferIsEmpty(*sink->buffer())) { + if (xStreamBufferIsEmpty(sink->buffer())) { ESP_LOGI(kTag, "reconfiguring dac"); output_format = sink_stream.info().format; sink->Configure(*output_format); @@ -149,7 +149,7 @@ void AudioTaskMain(void* args) { // throttle this task's CPU time. Maybe also hold off on the pipeline // if the buffer is already close to full? std::size_t sent = xStreamBufferSend( - *sink->buffer(), sink_stream.data().data(), + sink->buffer(), sink_stream.data().data(), sink_stream.data().size_bytes(), pdMS_TO_TICKS(10)); sink_stream.consume(sent); } @@ -172,7 +172,7 @@ void AudioDrainMain(void* args) { // TODO(jacqueline): implement PAUSE without busy-waiting. while (*command != QUIT) { - std::size_t len = xStreamBufferReceive(*sink->buffer(), sDrainBuf, + std::size_t len = xStreamBufferReceive(sink->buffer(), sDrainBuf, sizeof(sDrainBuf), portMAX_DELAY); if (len > 0) { sink->Send({sDrainBuf, len}); diff --git a/src/audio/i2s_audio_output.cpp b/src/audio/i2s_audio_output.cpp index 7e9e9353..63563a10 100644 --- a/src/audio/i2s_audio_output.cpp +++ b/src/audio/i2s_audio_output.cpp @@ -39,8 +39,8 @@ auto I2SAudioOutput::create(drivers::GpioExpander* expander) I2SAudioOutput::I2SAudioOutput(drivers::GpioExpander* expander, std::unique_ptr<drivers::AudioDac> dac) : expander_(expander), dac_(std::move(dac)), current_config_() { - //dac_->SetSource(buffer()); - } + dac_->SetSource(buffer()); +} I2SAudioOutput::~I2SAudioOutput() { dac_->SetSource(nullptr); diff --git a/src/audio/include/audio_sink.hpp b/src/audio/include/audio_sink.hpp index a11a9c92..eaed04ec 100644 --- a/src/audio/include/audio_sink.hpp +++ b/src/audio/include/audio_sink.hpp @@ -11,22 +11,26 @@ class IAudioSink { private: // TODO: tune. at least about 12KiB seems right for mp3 static const std::size_t kDrainBufferSize = 24 * 1024; - uint8_t *buffer_; - StaticStreamBuffer_t *metadata_; - StreamBufferHandle_t *handle_; + uint8_t* buffer_; + StaticStreamBuffer_t* metadata_; + StreamBufferHandle_t handle_; public: - IAudioSink() : - buffer_(reinterpret_cast<uint8_t*>(heap_caps_malloc(kDrainBufferSize, MALLOC_CAP_DMA))), - metadata_(reinterpret_cast<StaticStreamBuffer_t*>(heap_caps_malloc(sizeof(StaticStreamBuffer_t), MALLOC_CAP_DMA))), - handle_(reinterpret_cast<StreamBufferHandle_t*>(heap_caps_malloc(sizeof(StreamBufferHandle_t), MALLOC_CAP_DMA))) { - *handle_ = xStreamBufferCreateStatic(kDrainBufferSize, 1, buffer_, metadata_); - } + IAudioSink() + : buffer_(reinterpret_cast<uint8_t*>( + heap_caps_malloc(kDrainBufferSize, + MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT))), + metadata_(reinterpret_cast<StaticStreamBuffer_t*>( + heap_caps_malloc(sizeof(StaticStreamBuffer_t), + MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT))), + handle_(xStreamBufferCreateStatic(kDrainBufferSize, + 1, + buffer_, + metadata_)) {} virtual ~IAudioSink() { - vStreamBufferDelete(*handle_); + vStreamBufferDelete(handle_); free(buffer_); - free(handle_); free(metadata_); } @@ -34,7 +38,7 @@ class IAudioSink { virtual auto Send(const cpp::span<std::byte>& data) -> void = 0; virtual auto Log() -> void {} - auto buffer() -> StreamBufferHandle_t* { return handle_; } + auto buffer() -> StreamBufferHandle_t { return handle_; } }; } // namespace audio |
