From 912f9c0757a911b10478a2b498d551dc1fe6e7e4 Mon Sep 17 00:00:00 2001 From: jacqueline Date: Thu, 19 Oct 2023 13:01:28 +1100 Subject: Free the i2s dma channel when it's not in use It turns out this is why bluetooth playback keeps running out of memory /facepalm --- src/audio/i2s_audio_output.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'src/audio/i2s_audio_output.cpp') diff --git a/src/audio/i2s_audio_output.cpp b/src/audio/i2s_audio_output.cpp index fb52a7a8..624cf0a5 100644 --- a/src/audio/i2s_audio_output.cpp +++ b/src/audio/i2s_audio_output.cpp @@ -43,18 +43,15 @@ static constexpr uint16_t kDefaultVolume = 0x100; static constexpr size_t kDrainBufferSize = 8 * 1024; I2SAudioOutput::I2SAudioOutput(StreamBufferHandle_t s, - drivers::IGpios& expander, - std::unique_ptr dac) + drivers::IGpios& expander) : IAudioOutput(s), expander_(expander), - dac_(std::move(dac)), + dac_(), current_mode_(Modes::kOff), current_config_(), left_difference_(0), current_volume_(0), - max_volume_(0) { - dac_->SetSource(stream()); -} + max_volume_(0) {} I2SAudioOutput::~I2SAudioOutput() { dac_->Stop(); @@ -67,8 +64,15 @@ auto I2SAudioOutput::SetMode(Modes mode) -> void { } if (mode == Modes::kOff) { dac_->Stop(); + dac_.reset(); return; } else if (current_mode_ == Modes::kOff) { + auto instance = drivers::I2SDac::create(expander_); + if (!instance) { + return; + } + dac_.reset(*instance); + dac_->SetSource(stream()); dac_->Start(); } current_mode_ = mode; -- cgit v1.2.3