diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-10-19 13:01:28 +1100 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-10-19 13:01:28 +1100 |
| commit | 912f9c0757a911b10478a2b498d551dc1fe6e7e4 (patch) | |
| tree | f6e7bbdb0fd724e1d735141921f2029652ccc27f /src/audio/i2s_audio_output.cpp | |
| parent | 782e8dc8c25402171fc4724075b998eae4fa2c76 (diff) | |
| download | tangara-fw-912f9c0757a911b10478a2b498d551dc1fe6e7e4.tar.gz | |
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
Diffstat (limited to 'src/audio/i2s_audio_output.cpp')
| -rw-r--r-- | src/audio/i2s_audio_output.cpp | 16 |
1 files changed, 10 insertions, 6 deletions
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<drivers::I2SDac> 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; |
