From 6586819171b635e3b17effb3bfab096da695a0e9 Mon Sep 17 00:00:00 2001 From: ailurux Date: Fri, 1 Mar 2024 19:08:54 +1100 Subject: [PATCH 1/3] WIP Commit- Lua setters for volume, bluetooth todo --- src/audio/audio_fsm.cpp | 19 ++++++++++++++++++- src/audio/bt_audio_output.cpp | 12 ++++++++++++ src/audio/i2s_audio_output.cpp | 14 ++++++++++++++ src/audio/include/audio_sink.hpp | 3 +++ src/audio/include/bt_audio_output.hpp | 2 ++ src/audio/include/i2s_audio_output.hpp | 2 ++ 6 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/audio/audio_fsm.cpp b/src/audio/audio_fsm.cpp index ea0315eb..7800802e 100644 --- a/src/audio/audio_fsm.cpp +++ b/src/audio/audio_fsm.cpp @@ -98,7 +98,24 @@ void AudioState::react(const system_fsm::HasPhonesChanged& ev) { } void AudioState::react(const SetVolume& ev) { - // TODO. + if (ev.db.has_value()) { + if (sOutput->SetVolumeDb(ev.db.value())) { + commitVolume(); + events::Ui().Dispatch(VolumeChanged{ + .percent = sOutput->GetVolumePct(), + .db = sOutput->GetVolumeDb(), + }); + } + + } else if (ev.percent.has_value()) { + if (sOutput->SetVolumePct(ev.percent.value())) { + commitVolume(); + events::Ui().Dispatch(VolumeChanged{ + .percent = sOutput->GetVolumePct(), + .db = sOutput->GetVolumeDb(), + }); + } + } } void AudioState::react(const SetVolumeLimit& ev) { diff --git a/src/audio/bt_audio_output.cpp b/src/audio/bt_audio_output.cpp index 41c89069..6deb1f71 100644 --- a/src/audio/bt_audio_output.cpp +++ b/src/audio/bt_audio_output.cpp @@ -57,10 +57,22 @@ auto BluetoothAudioOutput::GetVolumePct() -> uint_fast8_t { return static_cast(static_cast(volume_) * 100 / 0x7f); } +auto BluetoothAudioOutput::SetVolumePct(uint_fast8_t val) -> bool { + // TODO + ESP_LOGE(kTag, "Not implemented"); + return false; +} + auto BluetoothAudioOutput::GetVolumeDb() -> int_fast16_t { return 0; } +auto BluetoothAudioOutput::SetVolumeDb(int_fast16_t) -> bool { + // TODO + ESP_LOGE(kTag, "Not implemented"); + return false; +} + auto BluetoothAudioOutput::AdjustVolumeUp() -> bool { if (volume_ == 0x7f) { return false; diff --git a/src/audio/i2s_audio_output.cpp b/src/audio/i2s_audio_output.cpp index 4043574e..7739fa17 100644 --- a/src/audio/i2s_audio_output.cpp +++ b/src/audio/i2s_audio_output.cpp @@ -111,6 +111,15 @@ auto I2SAudioOutput::GetVolumePct() -> uint_fast8_t { return (current_volume_ - kMinVolume) * 100 / (max_volume_ - kMinVolume); } +auto I2SAudioOutput::SetVolumePct(uint_fast8_t val) -> bool { + if (val > 100) { + return false; + } + uint16_t vol = (val * (max_volume_ - kMinVolume))/100 + kMinVolume; + SetVolume(vol); + return true; +} + auto I2SAudioOutput::GetVolumeDb() -> int_fast16_t { // Add two before dividing in order to round correctly. return (static_cast(current_volume_) - @@ -118,6 +127,11 @@ auto I2SAudioOutput::GetVolumeDb() -> int_fast16_t { 4; } +auto I2SAudioOutput::SetVolumeDb(int_fast16_t val) -> bool { + SetVolume(val * 4 + static_cast(drivers::wm8523::kLineLevelReferenceVolume) - 2); + return true; +} + auto I2SAudioOutput::AdjustVolumeUp() -> bool { if (GetVolume() >= max_volume_) { return false; diff --git a/src/audio/include/audio_sink.hpp b/src/audio/include/audio_sink.hpp index eba55eb5..116410f6 100644 --- a/src/audio/include/audio_sink.hpp +++ b/src/audio/include/audio_sink.hpp @@ -52,6 +52,9 @@ class IAudioOutput { virtual auto GetVolumePct() -> uint_fast8_t = 0; virtual auto GetVolumeDb() -> int_fast16_t = 0; + virtual auto SetVolumePct(uint_fast8_t) -> bool = 0; + virtual auto SetVolumeDb(int_fast16_t) -> bool = 0; + virtual auto AdjustVolumeUp() -> bool = 0; virtual auto AdjustVolumeDown() -> bool = 0; diff --git a/src/audio/include/bt_audio_output.hpp b/src/audio/include/bt_audio_output.hpp index f6d2200c..dff25131 100644 --- a/src/audio/include/bt_audio_output.hpp +++ b/src/audio/include/bt_audio_output.hpp @@ -37,7 +37,9 @@ class BluetoothAudioOutput : public IAudioOutput { auto GetVolume() -> uint16_t override; auto GetVolumePct() -> uint_fast8_t override; + auto SetVolumePct(uint_fast8_t val) -> bool override; auto GetVolumeDb() -> int_fast16_t override; + auto SetVolumeDb(int_fast16_t) -> bool override; auto AdjustVolumeUp() -> bool override; auto AdjustVolumeDown() -> bool override; diff --git a/src/audio/include/i2s_audio_output.hpp b/src/audio/include/i2s_audio_output.hpp index 7c297106..538eafb6 100644 --- a/src/audio/include/i2s_audio_output.hpp +++ b/src/audio/include/i2s_audio_output.hpp @@ -35,7 +35,9 @@ class I2SAudioOutput : public IAudioOutput { auto GetVolume() -> uint16_t override; auto GetVolumePct() -> uint_fast8_t override; + auto SetVolumePct(uint_fast8_t val) -> bool override; auto GetVolumeDb() -> int_fast16_t override; + auto SetVolumeDb(int_fast16_t) -> bool override; auto AdjustVolumeUp() -> bool override; auto AdjustVolumeDown() -> bool override; From a750af35aa6afda40aadca8f7cf8db75f41a43b2 Mon Sep 17 00:00:00 2001 From: ailurux Date: Tue, 2 Apr 2024 11:11:44 +1100 Subject: [PATCH 2/3] Added bluetooth db impl --- src/audio/bt_audio_output.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/audio/bt_audio_output.cpp b/src/audio/bt_audio_output.cpp index 6deb1f71..f431a49b 100644 --- a/src/audio/bt_audio_output.cpp +++ b/src/audio/bt_audio_output.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include #include @@ -58,19 +59,22 @@ auto BluetoothAudioOutput::GetVolumePct() -> uint_fast8_t { } auto BluetoothAudioOutput::SetVolumePct(uint_fast8_t val) -> bool { - // TODO - ESP_LOGE(kTag, "Not implemented"); - return false; + if (val < 100) { + return false; + } + SetVolume(val / 100 * 0x7f); + return true; } auto BluetoothAudioOutput::GetVolumeDb() -> int_fast16_t { - return 0; + return log(GetVolumePct()/100) * 20; } -auto BluetoothAudioOutput::SetVolumeDb(int_fast16_t) -> bool { - // TODO - ESP_LOGE(kTag, "Not implemented"); - return false; +auto BluetoothAudioOutput::SetVolumeDb(int_fast16_t val) -> bool { + auto pct = pow(2, val / 20.0) * 100; + ESP_LOGI("Audio", "Bluetooth audio pct: %d", (int)pct); + SetVolumePct(pct); + return true; } auto BluetoothAudioOutput::AdjustVolumeUp() -> bool { From 25dca40e5dab82c5a814233813c24180fcf975eb Mon Sep 17 00:00:00 2001 From: ailurux Date: Tue, 2 Apr 2024 15:03:49 +1100 Subject: [PATCH 3/3] Fix volume getters/setters for bluetooth --- src/audio/bt_audio_output.cpp | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/audio/bt_audio_output.cpp b/src/audio/bt_audio_output.cpp index 20ed7bb3..7d6bade2 100644 --- a/src/audio/bt_audio_output.cpp +++ b/src/audio/bt_audio_output.cpp @@ -55,26 +55,30 @@ auto BluetoothAudioOutput::GetVolume() -> uint16_t { } auto BluetoothAudioOutput::GetVolumePct() -> uint_fast8_t { - return static_cast(static_cast(volume_) * 100 / 0x7f); + return static_cast(round(static_cast(volume_) * 100.0 / 0x7f)); } auto BluetoothAudioOutput::SetVolumePct(uint_fast8_t val) -> bool { - if (val < 100) { + if (val > 100) { return false; } - SetVolume(val / 100 * 0x7f); + uint16_t vol = (val * (0x7f))/100; + SetVolume(vol); return true; } auto BluetoothAudioOutput::GetVolumeDb() -> int_fast16_t { - return log(GetVolumePct()/100) * 20; + double pct = GetVolumePct()/100.0; + if (pct <= 0) { + pct = 0.01; + } + int_fast16_t db = log(pct) * 20; + return db; } auto BluetoothAudioOutput::SetVolumeDb(int_fast16_t val) -> bool { - auto pct = pow(2, val / 20.0) * 100; - ESP_LOGI("Audio", "Bluetooth audio pct: %d", (int)pct); - SetVolumePct(pct); - return true; + double pct = exp(val / 20.0) * 100; + return SetVolumePct(pct); } auto BluetoothAudioOutput::AdjustVolumeUp() -> bool {