diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-02-21 09:28:36 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-02-21 09:28:36 +1100 |
| commit | 12d2ffdab70df573610b81d8a24545da33bb67e3 (patch) | |
| tree | eb082a249eab8647c8450dbbd5c320f83b923d6b /src/audio | |
| parent | 644601b636c28cf82281148a392454cdf9e632f9 (diff) | |
| download | tangara-fw-12d2ffdab70df573610b81d8a24545da33bb67e3.tar.gz | |
Add logging to the DAC
Diffstat (limited to 'src/audio')
| -rw-r--r-- | src/audio/audio_playback.cpp | 5 | ||||
| -rw-r--r-- | src/audio/audio_task.cpp | 8 | ||||
| -rw-r--r-- | src/audio/i2s_audio_output.cpp | 5 | ||||
| -rw-r--r-- | src/audio/include/audio_element.hpp | 2 | ||||
| -rw-r--r-- | src/audio/include/audio_playback.hpp | 2 | ||||
| -rw-r--r-- | src/audio/include/i2s_audio_output.hpp | 1 | ||||
| -rw-r--r-- | src/audio/include/stream_event.hpp | 2 | ||||
| -rw-r--r-- | src/audio/stream_event.cpp | 10 |
8 files changed, 35 insertions, 0 deletions
diff --git a/src/audio/audio_playback.cpp b/src/audio/audio_playback.cpp index 504a2a4e..edbdcea7 100644 --- a/src/audio/audio_playback.cpp +++ b/src/audio/audio_playback.cpp @@ -64,6 +64,11 @@ auto AudioPlayback::Play(const std::string& filename) -> void { xQueueSend(input_handle_, &event, portMAX_DELAY); } +auto AudioPlayback::LogStatus() -> void { + auto event = StreamEvent::CreateLogStatus(); + xQueueSendToFront(input_handle_, &event, portMAX_DELAY); +} + auto AudioPlayback::ConnectElements(IAudioElement* src, IAudioElement* sink) -> void { src->OutputEventQueue(sink->InputEventQueue()); diff --git a/src/audio/audio_task.cpp b/src/audio/audio_task.cpp index 9d0c4bd0..14f3462d 100644 --- a/src/audio/audio_task.cpp +++ b/src/audio/audio_task.cpp @@ -92,6 +92,14 @@ void AudioTaskMain(void* args) { } else if (new_event->tag == StreamEvent::CHUNK_NOTIFICATION) { ESP_LOGD(kTag, "marking chunk as used"); element->OnChunkProcessed(); + delete new_event; + } else if (new_event->tag == StreamEvent::LOG_STATUS) { + element->ProcessLogStatus(); + if (element->OutputEventQueue() != nullptr) { + xQueueSendToFront(element->OutputEventQueue(), &new_event, 0); + } else { + delete new_event; + } } else { // This isn't an event that needs to be actioned immediately. Add it // to our work queue. diff --git a/src/audio/i2s_audio_output.cpp b/src/audio/i2s_audio_output.cpp index 7ecadc03..9a41adff 100644 --- a/src/audio/i2s_audio_output.cpp +++ b/src/audio/i2s_audio_output.cpp @@ -110,10 +110,15 @@ auto I2SAudioOutput::ProcessChunk(const cpp::span<std::byte>& chunk) } auto I2SAudioOutput::ProcessEndOfStream() -> void { + dac_->Stop(); SendOrBufferEvent(std::unique_ptr<StreamEvent>( StreamEvent::CreateEndOfStream(input_events_))); } +auto I2SAudioOutput::ProcessLogStatus() -> void { + dac_->LogStatus(); +} + auto I2SAudioOutput::Process() -> cpp::result<void, AudioProcessingError> { // Note: no logging here! std::size_t bytes_written = dac_->WriteData(latest_chunk_); diff --git a/src/audio/include/audio_element.hpp b/src/audio/include/audio_element.hpp index 0c80524c..b881404c 100644 --- a/src/audio/include/audio_element.hpp +++ b/src/audio/include/audio_element.hpp @@ -107,6 +107,8 @@ class IAudioElement { virtual auto ProcessEndOfStream() -> void = 0; + virtual auto ProcessLogStatus() -> void {} + /* * Called when there has been no data received over the input buffer for some * time. This could be used to synthesize output, or to save memory by diff --git a/src/audio/include/audio_playback.hpp b/src/audio/include/audio_playback.hpp index f05ca327..fc266c9b 100644 --- a/src/audio/include/audio_playback.hpp +++ b/src/audio/include/audio_playback.hpp @@ -37,6 +37,8 @@ class AudioPlayback { */ auto Play(const std::string& filename) -> void; + auto LogStatus() -> void; + // Not copyable or movable. AudioPlayback(const AudioPlayback&) = delete; AudioPlayback& operator=(const AudioPlayback&) = delete; diff --git a/src/audio/include/i2s_audio_output.hpp b/src/audio/include/i2s_audio_output.hpp index fc406665..de2f1f58 100644 --- a/src/audio/include/i2s_audio_output.hpp +++ b/src/audio/include/i2s_audio_output.hpp @@ -29,6 +29,7 @@ class I2SAudioOutput : public IAudioElement { auto ProcessChunk(const cpp::span<std::byte>& chunk) -> cpp::result<std::size_t, AudioProcessingError> override; auto ProcessEndOfStream() -> void override; + auto ProcessLogStatus() -> void override; auto Process() -> cpp::result<void, AudioProcessingError> override; I2SAudioOutput(const I2SAudioOutput&) = delete; diff --git a/src/audio/include/stream_event.hpp b/src/audio/include/stream_event.hpp index e84c8388..d42de411 100644 --- a/src/audio/include/stream_event.hpp +++ b/src/audio/include/stream_event.hpp @@ -17,6 +17,7 @@ struct StreamEvent { -> StreamEvent*; static auto CreateChunkNotification(QueueHandle_t source) -> StreamEvent*; static auto CreateEndOfStream(QueueHandle_t source) -> StreamEvent*; + static auto CreateLogStatus() -> StreamEvent*; StreamEvent(); ~StreamEvent(); @@ -30,6 +31,7 @@ struct StreamEvent { CHUNK_DATA, CHUNK_NOTIFICATION, END_OF_STREAM, + LOG_STATUS, } tag; union { diff --git a/src/audio/stream_event.cpp b/src/audio/stream_event.cpp index 6efebbca..af470584 100644 --- a/src/audio/stream_event.cpp +++ b/src/audio/stream_event.cpp @@ -44,6 +44,12 @@ auto StreamEvent::CreateEndOfStream(QueueHandle_t source) -> StreamEvent* { return event; } +auto StreamEvent::CreateLogStatus() -> StreamEvent* { + auto event = new StreamEvent; + event->tag = StreamEvent::LOG_STATUS; + return event; +} + StreamEvent::StreamEvent() : tag(StreamEvent::UNINITIALISED) {} StreamEvent::~StreamEvent() { @@ -60,6 +66,8 @@ StreamEvent::~StreamEvent() { break; case END_OF_STREAM: break; + case LOG_STATUS: + break; } } @@ -81,6 +89,8 @@ StreamEvent::StreamEvent(StreamEvent&& other) { break; case END_OF_STREAM: break; + case LOG_STATUS: + break; } other.tag = StreamEvent::UNINITIALISED; } |
