From ade00945951ff49481a161479f7d9798cc4c564f Mon Sep 17 00:00:00 2001 From: jacqueline Date: Fri, 12 Apr 2024 14:36:03 +1000 Subject: switch to software volume scaling (it's bad tho i need daniel to do maths for me please) --- src/drivers/bluetooth.cpp | 31 +++++++++++++++---------------- src/drivers/include/bluetooth.hpp | 7 +------ 2 files changed, 16 insertions(+), 22 deletions(-) (limited to 'src/drivers') diff --git a/src/drivers/bluetooth.cpp b/src/drivers/bluetooth.cpp index d15ffd7f..edd5f67e 100644 --- a/src/drivers/bluetooth.cpp +++ b/src/drivers/bluetooth.cpp @@ -25,6 +25,7 @@ #include "freertos/portmacro.h" #include "freertos/projdefs.h" #include "freertos/timers.h" +#include "sample.hpp" #include "tinyfsm/include/tinyfsm.hpp" #include "bluetooth_types.hpp" @@ -37,6 +38,8 @@ namespace drivers { [[maybe_unused]] static constexpr char kTag[] = "bluetooth"; DRAM_ATTR static StreamBufferHandle_t sStream = nullptr; +DRAM_ATTR static std::atomic sVolumeFactor = 1.f; + static tasks::WorkerPool* sBgWorker; auto gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t* param) -> void { @@ -69,7 +72,16 @@ IRAM_ATTR auto a2dp_data_cb(uint8_t* buf, int32_t buf_size) -> int32_t { if (stream == nullptr) { return 0; } - return xStreamBufferReceive(stream, buf, buf_size, 0); + size_t bytes_received = xStreamBufferReceive(stream, buf, buf_size, 0); + + // Apply software volume scaling. + int16_t* samples = reinterpret_cast(buf); + float factor = sVolumeFactor.load(); + for (size_t i = 0; i < bytes_received / 2; i++) { + samples[i] *= factor; + } + + return bytes_received; } Bluetooth::Bluetooth(NvsStorage& storage, tasks::WorkerPool& bg_worker) { @@ -150,10 +162,8 @@ auto Bluetooth::SetSource(StreamBufferHandle_t src) -> void { bluetooth::events::SourceChanged{}); } -auto Bluetooth::SetVolume(uint8_t vol) -> void { - auto lock = bluetooth::BluetoothState::lock(); - tinyfsm::FsmList::dispatch( - bluetooth::events::ChangeVolume{.volume = vol}); +auto Bluetooth::SetVolumeFactor(float f) -> void { + sVolumeFactor = f; } auto Bluetooth::SetEventHandler(std::function cb) @@ -654,17 +664,6 @@ void Connected::react(const events::SourceChanged& ev) { } } -void Connected::react(const events::ChangeVolume& ev) { - esp_err_t err = esp_avrc_ct_send_set_absolute_volume_cmd( - transaction_num_++, std::clamp(ev.volume, 0, 0x7f)); - if (err != ESP_OK) { - ESP_LOGW(kTag, "send vol failed %u", err); - } - if (transaction_num_ > ESP_AVRC_TRANS_LABEL_MAX) { - transaction_num_ = 0; - } -} - void Connected::react(const events::internal::Gap& ev) { sScanner_->HandleGapEvent(ev); switch (ev.type) { diff --git a/src/drivers/include/bluetooth.hpp b/src/drivers/include/bluetooth.hpp index 988c7e93..8da5ce2e 100644 --- a/src/drivers/include/bluetooth.hpp +++ b/src/drivers/include/bluetooth.hpp @@ -43,7 +43,7 @@ class Bluetooth { auto PreferredDevice() -> std::optional; auto SetSource(StreamBufferHandle_t) -> void; - auto SetVolume(uint8_t) -> void; + auto SetVolumeFactor(float) -> void; auto SetEventHandler(std::function cb) -> void; }; @@ -60,9 +60,6 @@ struct SourceChanged : public tinyfsm::Event {}; struct DeviceDiscovered : public tinyfsm::Event { const Device& device; }; -struct ChangeVolume : public tinyfsm::Event { - const uint8_t volume; -}; namespace internal { struct Gap : public tinyfsm::Event { @@ -131,7 +128,6 @@ class BluetoothState : public tinyfsm::Fsm { virtual void react(const events::ConnectTimedOut& ev){}; virtual void react(const events::PreferredDeviceChanged& ev){}; virtual void react(const events::SourceChanged& ev){}; - virtual void react(const events::ChangeVolume&) {} virtual void react(const events::DeviceDiscovered&); @@ -204,7 +200,6 @@ class Connected : public BluetoothState { void react(const events::PreferredDeviceChanged& ev) override; void react(const events::SourceChanged& ev) override; - void react(const events::ChangeVolume&) override; void react(const events::Disable& ev) override; void react(const events::internal::Gap& ev) override; -- cgit v1.2.3