summaryrefslogtreecommitdiff
path: root/src/audio
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-04-20 11:25:43 +1000
committerjacqueline <me@jacqueline.id.au>2023-04-20 11:25:43 +1000
commit731b2cfa77a063e98da8fa26acc1e7ed1de8c169 (patch)
tree13a8cca13f2e6ea665a87cc0f1c036de7c326d60 /src/audio
parent4c77950e702a329f3136456a932efbea36e03d42 (diff)
downloadtangara-fw-731b2cfa77a063e98da8fa26acc1e7ed1de8c169.tar.gz
working isr-based sink, but still grainy
Diffstat (limited to 'src/audio')
-rw-r--r--src/audio/audio_playback.cpp2
-rw-r--r--src/audio/audio_task.cpp8
-rw-r--r--src/audio/i2s_audio_output.cpp4
-rw-r--r--src/audio/include/audio_sink.hpp28
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