diff options
| author | jacqueline <me@jacqueline.id.au> | 2024-04-12 14:36:03 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2024-04-12 14:36:03 +1000 |
| commit | ade00945951ff49481a161479f7d9798cc4c564f (patch) | |
| tree | 3e244f54c4fa3f5d640d6017cf0f05ad079a90ab /src/drivers | |
| parent | b319b3f07f61ce7212f84ea6e7e69d27ef97ef5e (diff) | |
| download | tangara-fw-ade00945951ff49481a161479f7d9798cc4c564f.tar.gz | |
switch to software volume scaling (it's bad tho i need daniel to do maths for me please)
Diffstat (limited to 'src/drivers')
| -rw-r--r-- | src/drivers/bluetooth.cpp | 31 | ||||
| -rw-r--r-- | src/drivers/include/bluetooth.hpp | 7 |
2 files changed, 16 insertions, 22 deletions
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<float> 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<int16_t*>(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<bluetooth::BluetoothState>::dispatch( - bluetooth::events::ChangeVolume{.volume = vol}); +auto Bluetooth::SetVolumeFactor(float f) -> void { + sVolumeFactor = f; } auto Bluetooth::SetEventHandler(std::function<void(bluetooth::Event)> 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<uint8_t>(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<bluetooth::MacAndName>; auto SetSource(StreamBufferHandle_t) -> void; - auto SetVolume(uint8_t) -> void; + auto SetVolumeFactor(float) -> void; auto SetEventHandler(std::function<void(bluetooth::Event)> 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<BluetoothState> { 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; |
