summaryrefslogtreecommitdiff
path: root/src/audio/i2s_audio_output.cpp
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2023-10-19 13:01:28 +1100
committerjacqueline <me@jacqueline.id.au>2023-10-19 13:01:28 +1100
commit912f9c0757a911b10478a2b498d551dc1fe6e7e4 (patch)
treef6e7bbdb0fd724e1d735141921f2029652ccc27f /src/audio/i2s_audio_output.cpp
parent782e8dc8c25402171fc4724075b998eae4fa2c76 (diff)
downloadtangara-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.cpp16
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;