summaryrefslogtreecommitdiff
path: root/src/drivers
diff options
context:
space:
mode:
authorjacqueline <me@jacqueline.id.au>2024-04-12 14:36:03 +1000
committerjacqueline <me@jacqueline.id.au>2024-04-12 14:36:03 +1000
commitade00945951ff49481a161479f7d9798cc4c564f (patch)
tree3e244f54c4fa3f5d640d6017cf0f05ad079a90ab /src/drivers
parentb319b3f07f61ce7212f84ea6e7e69d27ef97ef5e (diff)
downloadtangara-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.cpp31
-rw-r--r--src/drivers/include/bluetooth.hpp7
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;