summaryrefslogtreecommitdiff
path: root/src/audio
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-02-21 09:28:36 +1100
committerjacqueline <me@jacqueline.id.au>2023-02-21 09:28:36 +1100
commit12d2ffdab70df573610b81d8a24545da33bb67e3 (patch)
treeeb082a249eab8647c8450dbbd5c320f83b923d6b /src/audio
parent644601b636c28cf82281148a392454cdf9e632f9 (diff)
downloadtangara-fw-12d2ffdab70df573610b81d8a24545da33bb67e3.tar.gz
Add logging to the DAC
Diffstat (limited to 'src/audio')
-rw-r--r--src/audio/audio_playback.cpp5
-rw-r--r--src/audio/audio_task.cpp8
-rw-r--r--src/audio/i2s_audio_output.cpp5
-rw-r--r--src/audio/include/audio_element.hpp2
-rw-r--r--src/audio/include/audio_playback.hpp2
-rw-r--r--src/audio/include/i2s_audio_output.hpp1
-rw-r--r--src/audio/include/stream_event.hpp2
-rw-r--r--src/audio/stream_event.cpp10
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;
}