diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-09-04 16:17:55 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-09-04 16:17:55 +1000 |
| commit | d5d6e3993cd67238ff245446e69e2f200c3fd0e5 (patch) | |
| tree | 6245939ab341694363eac8bc24ab1b91b5140c6e /src/audio | |
| parent | 6d831fa7a8c50e15424814fd2be1dd3951e06a4f (diff) | |
| download | tangara-fw-d5d6e3993cd67238ff245446e69e2f200c3fd0e5.tar.gz | |
Support changing max volume, persisted to nvs
Diffstat (limited to 'src/audio')
| -rw-r--r-- | src/audio/audio_fsm.cpp | 20 | ||||
| -rw-r--r-- | src/audio/i2s_audio_output.cpp | 18 | ||||
| -rw-r--r-- | src/audio/include/audio_events.hpp | 4 | ||||
| -rw-r--r-- | src/audio/include/audio_fsm.hpp | 2 | ||||
| -rw-r--r-- | src/audio/include/i2s_audio_output.hpp | 4 |
5 files changed, 43 insertions, 5 deletions
diff --git a/src/audio/audio_fsm.cpp b/src/audio/audio_fsm.cpp index 9121cb5a..f5ce2957 100644 --- a/src/audio/audio_fsm.cpp +++ b/src/audio/audio_fsm.cpp @@ -5,6 +5,7 @@ */ #include "audio_fsm.hpp" +#include <stdint.h> #include <future> #include <memory> @@ -29,6 +30,7 @@ #include "system_events.hpp" #include "track.hpp" #include "track_queue.hpp" +#include "wm8523.hpp" namespace audio { @@ -39,6 +41,7 @@ std::shared_ptr<system_fsm::ServiceLocator> AudioState::sServices; std::shared_ptr<FatfsAudioInput> AudioState::sFileSource; std::unique_ptr<Decoder> AudioState::sDecoder; std::shared_ptr<SampleConverter> AudioState::sSampleConverter; +std::shared_ptr<I2SAudioOutput> AudioState::sI2SOutput; std::shared_ptr<IAudioOutput> AudioState::sOutput; std::optional<database::TrackId> AudioState::sCurrentTrack; @@ -65,6 +68,13 @@ void AudioState::react(const system_fsm::HasPhonesChanged& ev) { } } +void AudioState::react(const ChangeMaxVolume& ev) { + ESP_LOGI(kTag, "new max volume %u db", + (ev.new_max - drivers::wm8523::kLineLevelReferenceVolume) / 4); + sI2SOutput->SetMaxVolume(ev.new_max); + sServices->nvs().AmpMaxVolume(ev.new_max); +} + namespace states { void Uninitialised::react(const system_fsm::BootComplete& ev) { @@ -78,8 +88,14 @@ void Uninitialised::react(const system_fsm::BootComplete& ev) { } sFileSource.reset(new FatfsAudioInput(sServices->tag_parser())); - sOutput.reset(new I2SAudioOutput(sServices->gpios(), - std::unique_ptr<drivers::I2SDac>{*dac})); + sI2SOutput.reset(new I2SAudioOutput(sServices->gpios(), + std::unique_ptr<drivers::I2SDac>{*dac})); + + auto& nvs = sServices->nvs(); + sI2SOutput->SetMaxVolume(nvs.AmpMaxVolume().get()); + sI2SOutput->SetVolumeDb(nvs.AmpCurrentVolume().get()); + + sOutput = sI2SOutput; // sOutput.reset(new BluetoothAudioOutput(bluetooth)); sSampleConverter.reset(new SampleConverter()); diff --git a/src/audio/i2s_audio_output.cpp b/src/audio/i2s_audio_output.cpp index 927f6541..68b03145 100644 --- a/src/audio/i2s_audio_output.cpp +++ b/src/audio/i2s_audio_output.cpp @@ -5,6 +5,7 @@ */ #include "i2s_audio_output.hpp" +#include <stdint.h> #include <algorithm> #include <cstddef> @@ -48,9 +49,8 @@ I2SAudioOutput::I2SAudioOutput(drivers::IGpios& expander, dac_(std::move(dac)), current_config_(), left_difference_(0), - current_volume_(kDefaultVolume), - max_volume_(kLineLevelVolume) { - SetVolume(GetVolume()); + current_volume_(0), + max_volume_(0) { dac_->SetSource(stream()); } @@ -72,6 +72,18 @@ auto I2SAudioOutput::SetVolumeImbalance(int_fast8_t balance) -> void { SetVolume(GetVolume()); } +auto I2SAudioOutput::SetMaxVolume(uint16_t max) -> void { + max_volume_ = std::clamp(max, drivers::wm8523::kAbsoluteMinVolume, + drivers::wm8523::kAbsoluteMaxVolume); + SetVolume(GetVolume()); +} + +auto I2SAudioOutput::SetVolumeDb(uint16_t vol) -> void { + current_volume_ = + std::clamp(vol, drivers::wm8523::kAbsoluteMinVolume, max_volume_); + SetVolume(GetVolume()); +} + auto I2SAudioOutput::SetVolume(uint_fast8_t percent) -> void { percent = std::min<uint_fast8_t>(percent, 100); float new_value = static_cast<float>(max_volume_) / 100 * percent; diff --git a/src/audio/include/audio_events.hpp b/src/audio/include/audio_events.hpp index 8ee8b057..7433d159 100644 --- a/src/audio/include/audio_events.hpp +++ b/src/audio/include/audio_events.hpp @@ -6,6 +6,7 @@ #pragma once +#include <stdint.h> #include <cstdint> #include <string> @@ -36,6 +37,9 @@ struct PlayFile : tinyfsm::Event { }; struct VolumeChanged : tinyfsm::Event {}; +struct ChangeMaxVolume : tinyfsm::Event { + uint16_t new_max; +}; struct TogglePlayPause : tinyfsm::Event {}; diff --git a/src/audio/include/audio_fsm.hpp b/src/audio/include/audio_fsm.hpp index 1376feae..46d3d338 100644 --- a/src/audio/include/audio_fsm.hpp +++ b/src/audio/include/audio_fsm.hpp @@ -44,6 +44,7 @@ class AudioState : public tinyfsm::Fsm<AudioState> { void react(const system_fsm::KeyUpChanged&); void react(const system_fsm::KeyDownChanged&); void react(const system_fsm::HasPhonesChanged&); + void react(const ChangeMaxVolume&); virtual void react(const system_fsm::BootComplete&) {} @@ -63,6 +64,7 @@ class AudioState : public tinyfsm::Fsm<AudioState> { static std::shared_ptr<FatfsAudioInput> sFileSource; static std::unique_ptr<Decoder> sDecoder; static std::shared_ptr<SampleConverter> sSampleConverter; + static std::shared_ptr<I2SAudioOutput> sI2SOutput; static std::shared_ptr<IAudioOutput> sOutput; static std::optional<database::TrackId> sCurrentTrack; diff --git a/src/audio/include/i2s_audio_output.hpp b/src/audio/include/i2s_audio_output.hpp index fa09deef..17f6b71a 100644 --- a/src/audio/include/i2s_audio_output.hpp +++ b/src/audio/include/i2s_audio_output.hpp @@ -6,6 +6,7 @@ #pragma once +#include <stdint.h> #include <cstdint> #include <memory> #include <vector> @@ -25,6 +26,9 @@ class I2SAudioOutput : public IAudioOutput { auto SetInUse(bool) -> void override; + auto SetMaxVolume(uint16_t) -> void; + auto SetVolumeDb(uint16_t) -> void; + auto SetVolumeImbalance(int_fast8_t balance) -> void override; auto SetVolume(uint_fast8_t percent) -> void override; auto GetVolume() -> uint_fast8_t override; |
