From 12d2ffdab70df573610b81d8a24545da33bb67e3 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Tue, 21 Feb 2023 09:28:36 +1100 Subject: Add logging to the DAC --- src/audio/audio_playback.cpp | 5 +++++ src/audio/audio_task.cpp | 8 ++++++++ src/audio/i2s_audio_output.cpp | 5 +++++ src/audio/include/audio_element.hpp | 2 ++ src/audio/include/audio_playback.hpp | 2 ++ src/audio/include/i2s_audio_output.hpp | 1 + src/audio/include/stream_event.hpp | 2 ++ src/audio/stream_event.cpp | 10 ++++++++++ 8 files changed, 35 insertions(+) (limited to 'src/audio') 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& chunk) } auto I2SAudioOutput::ProcessEndOfStream() -> void { + dac_->Stop(); SendOrBufferEvent(std::unique_ptr( StreamEvent::CreateEndOfStream(input_events_))); } +auto I2SAudioOutput::ProcessLogStatus() -> void { + dac_->LogStatus(); +} + auto I2SAudioOutput::Process() -> cpp::result { // 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& chunk) -> cpp::result override; auto ProcessEndOfStream() -> void override; + auto ProcessLogStatus() -> void override; auto Process() -> cpp::result 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; } -- cgit v1.2.3