diff options
| author | ailurux <ailuruxx@gmail.com> | 2024-08-26 15:43:00 +1000 |
|---|---|---|
| committer | ailurux <ailuruxx@gmail.com> | 2024-08-26 15:43:00 +1000 |
| commit | e6c77f17b87a4cbf358bd2ddd3b82724771ee03c (patch) | |
| tree | 98aafef4127dca67ff16b83aacb7cf3ae5261fba | |
| parent | 91f26afa755e4efd2dcb97f6010f0ceb226e91f2 (diff) | |
| download | tangara-fw-e6c77f17b87a4cbf358bd2ddd3b82724771ee03c.tar.gz | |
Switch output mode to headphones when plugged in
| -rw-r--r-- | src/tangara/audio/audio_events.hpp | 5 | ||||
| -rw-r--r-- | src/tangara/audio/audio_fsm.cpp | 13 | ||||
| -rw-r--r-- | src/tangara/audio/audio_fsm.hpp | 1 |
3 files changed, 18 insertions, 1 deletions
diff --git a/src/tangara/audio/audio_events.hpp b/src/tangara/audio/audio_events.hpp index 503664cc..50fd4b00 100644 --- a/src/tangara/audio/audio_events.hpp +++ b/src/tangara/audio/audio_events.hpp @@ -16,6 +16,7 @@ #include "tinyfsm.hpp" #include "database/track.hpp" +#include "drivers/nvs.hpp" #include "types.hpp" namespace audio { @@ -137,7 +138,9 @@ struct SetVolumeLimit : tinyfsm::Event { int limit_db; }; -struct OutputModeChanged : tinyfsm::Event {}; +struct OutputModeChanged : tinyfsm::Event { + std::optional<drivers::NvsStorage::Output> set_to; +}; namespace internal { diff --git a/src/tangara/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp index 8da11665..16c16002 100644 --- a/src/tangara/audio/audio_fsm.cpp +++ b/src/tangara/audio/audio_fsm.cpp @@ -231,6 +231,16 @@ void AudioState::react(const internal::StreamEnded& ev) { sStreamCues.addCue({}, ev.cue_at_sample); } +void AudioState::react(const system_fsm::HasPhonesChanged& ev) { + if (ev.has_headphones) { + events::Audio().Dispatch(audio::OutputModeChanged{.set_to = drivers::NvsStorage::Output::kHeadphones}); + } else { + if (sServices->bluetooth().enabled()) { + events::Audio().Dispatch(audio::OutputModeChanged{.set_to = drivers::NvsStorage::Output::kBluetooth}); + } + } +} + void AudioState::react(const system_fsm::BluetoothEvent& ev) { using drivers::bluetooth::SimpleEvent; if (std::holds_alternative<SimpleEvent>(ev.event)) { @@ -334,6 +344,9 @@ void AudioState::react(const SetVolumeBalance& ev) { void AudioState::react(const OutputModeChanged& ev) { ESP_LOGI(kTag, "output mode changed"); auto new_mode = sServices->nvs().OutputMode(); + if (ev.set_to) { + new_mode = *ev.set_to; + } sOutput->mode(IAudioOutput::Modes::kOff); switch (new_mode) { case drivers::NvsStorage::Output::kBluetooth: diff --git a/src/tangara/audio/audio_fsm.hpp b/src/tangara/audio/audio_fsm.hpp index f949ce8a..0644375f 100644 --- a/src/tangara/audio/audio_fsm.hpp +++ b/src/tangara/audio/audio_fsm.hpp @@ -67,6 +67,7 @@ class AudioState : public tinyfsm::Fsm<AudioState> { virtual void react(const system_fsm::KeyLockChanged&){}; virtual void react(const system_fsm::SdStateChanged&) {} virtual void react(const system_fsm::BluetoothEvent&); + virtual void react(const system_fsm::HasPhonesChanged&); protected: auto emitPlaybackUpdate(bool paused) -> void; |
