diff options
Diffstat (limited to 'src/tangara/audio')
| -rw-r--r-- | src/tangara/audio/audio_events.hpp | 6 | ||||
| -rw-r--r-- | src/tangara/audio/audio_fsm.cpp | 34 |
2 files changed, 30 insertions, 10 deletions
diff --git a/src/tangara/audio/audio_events.hpp b/src/tangara/audio/audio_events.hpp index 55095d85..503664cc 100644 --- a/src/tangara/audio/audio_events.hpp +++ b/src/tangara/audio/audio_events.hpp @@ -116,6 +116,12 @@ struct SetVolumeBalance : tinyfsm::Event { int left_bias; }; +/* + Event emitted when the hardware volume for a connected Bluetooth device has changed. +*/ +struct RemoteVolumeChanged : tinyfsm::Event { + uint_fast8_t value; // 0..127 +}; struct VolumeChanged : tinyfsm::Event { uint_fast8_t percent; int db; diff --git a/src/tangara/audio/audio_fsm.cpp b/src/tangara/audio/audio_fsm.cpp index d6ddff8d..80611082 100644 --- a/src/tangara/audio/audio_fsm.cpp +++ b/src/tangara/audio/audio_fsm.cpp @@ -217,18 +217,32 @@ void AudioState::react(const internal::StreamEnded& ev) { } void AudioState::react(const system_fsm::BluetoothEvent& ev) { - if (ev.event != drivers::bluetooth::Event::kConnectionStateChanged) { - return; + using drivers::bluetooth::SimpleEvent; + if (std::holds_alternative<SimpleEvent>(ev.event)) { + auto simpleEvent = std::get<SimpleEvent>(ev.event); + switch (simpleEvent) { + case SimpleEvent::kConnectionStateChanged: { + auto dev = sServices->bluetooth().ConnectedDevice(); + if (!dev) { + return; + } + sBtOutput->SetVolume(sServices->nvs().BluetoothVolume(dev->mac)); + events::Ui().Dispatch(VolumeChanged{ + .percent = sOutput->GetVolumePct(), + .db = sOutput->GetVolumeDb(), + }); + break; + } + default: + break; + } } - auto dev = sServices->bluetooth().ConnectedDevice(); - if (!dev) { - return; + if (std::holds_alternative<drivers::bluetooth::RemoteVolumeChanged>(ev.event)) { + auto volume_chg = std::get<drivers::bluetooth::RemoteVolumeChanged>(ev.event).new_vol; + events::Ui().Dispatch(RemoteVolumeChanged{ + .value = volume_chg + }); } - sBtOutput->SetVolume(sServices->nvs().BluetoothVolume(dev->mac)); - events::Ui().Dispatch(VolumeChanged{ - .percent = sOutput->GetVolumePct(), - .db = sOutput->GetVolumeDb(), - }); } void AudioState::react(const StepUpVolume& ev) { |
