From e6c77f17b87a4cbf358bd2ddd3b82724771ee03c Mon Sep 17 00:00:00 2001 From: ailurux Date: Mon, 26 Aug 2024 15:43:00 +1000 Subject: [PATCH] Switch output mode to headphones when plugged in --- src/tangara/audio/audio_events.hpp | 5 ++++- src/tangara/audio/audio_fsm.cpp | 13 +++++++++++++ src/tangara/audio/audio_fsm.hpp | 1 + 3 files changed, 18 insertions(+), 1 deletion(-) 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 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(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 { 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;