From d6b83fcf4a1a3039c06e0b1d1a1f7e2af2351efb Mon Sep 17 00:00:00 2001 From: jacqueline Date: Tue, 15 Aug 2023 13:53:30 +1000 Subject: Flesh out basic bluetooth support No ui yet, and performance isn't great. It kinda works though!! --- src/audio/include/audio_fsm.hpp | 3 +++ src/audio/include/audio_sink.hpp | 8 ++---- src/audio/include/bt_audio_output.hpp | 49 +++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 6 deletions(-) create mode 100644 src/audio/include/bt_audio_output.hpp (limited to 'src/audio/include') diff --git a/src/audio/include/audio_fsm.hpp b/src/audio/include/audio_fsm.hpp index d10f31e1..5d44fcda 100644 --- a/src/audio/include/audio_fsm.hpp +++ b/src/audio/include/audio_fsm.hpp @@ -12,6 +12,7 @@ #include "audio_events.hpp" #include "audio_task.hpp" +#include "bt_audio_output.hpp" #include "database.hpp" #include "display.hpp" #include "fatfs_audio_input.hpp" @@ -33,6 +34,7 @@ class AudioState : public tinyfsm::Fsm { static auto Init(drivers::IGpios* gpio_expander, std::weak_ptr, std::shared_ptr, + drivers::Bluetooth* bluetooth, TrackQueue* queue) -> bool; virtual ~AudioState() {} @@ -68,6 +70,7 @@ class AudioState : public tinyfsm::Fsm { static std::unique_ptr sTask; static std::unique_ptr sFileSource; static std::unique_ptr sI2SOutput; + static std::unique_ptr sBtOutput; static TrackQueue* sTrackQueue; static std::optional sCurrentTrack; diff --git a/src/audio/include/audio_sink.hpp b/src/audio/include/audio_sink.hpp index 2fb4bf63..b5d6ef57 100644 --- a/src/audio/include/audio_sink.hpp +++ b/src/audio/include/audio_sink.hpp @@ -18,15 +18,11 @@ namespace audio { class IAudioSink { private: - static const std::size_t kDrainBufferSize = 24 * 1024; StreamBufferHandle_t stream_; public: - IAudioSink() - : stream_(xStreamBufferCreateWithCaps( - kDrainBufferSize, - 1, - MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)) {} + IAudioSink(size_t buffer_size, uint32_t caps) + : stream_(xStreamBufferCreateWithCaps(buffer_size, 1, caps)) {} virtual ~IAudioSink() { vStreamBufferDeleteWithCaps(stream_); } diff --git a/src/audio/include/bt_audio_output.hpp b/src/audio/include/bt_audio_output.hpp new file mode 100644 index 00000000..e11a5d44 --- /dev/null +++ b/src/audio/include/bt_audio_output.hpp @@ -0,0 +1,49 @@ +/* + * Copyright 2023 jacqueline + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#pragma once + +#include +#include +#include +#include + +#include "audio_element.hpp" +#include "audio_sink.hpp" +#include "bluetooth.hpp" +#include "chunk.hpp" +#include "result.hpp" + +#include "gpios.hpp" +#include "i2s_dac.hpp" +#include "stream_info.hpp" + +namespace audio { + +class BluetoothAudioOutput : public IAudioSink { + public: + BluetoothAudioOutput(drivers::Bluetooth* bt); + ~BluetoothAudioOutput(); + + auto SetInUse(bool) -> void override; + + auto SetVolumeImbalance(int_fast8_t balance) -> void override; + auto SetVolume(uint_fast8_t percent) -> void override; + auto GetVolume() -> uint_fast8_t override; + auto AdjustVolumeUp() -> bool override; + auto AdjustVolumeDown() -> bool override; + + auto PrepareFormat(const Format&) -> Format override; + auto Configure(const Format& format) -> void override; + + BluetoothAudioOutput(const BluetoothAudioOutput&) = delete; + BluetoothAudioOutput& operator=(const BluetoothAudioOutput&) = delete; + + private: + drivers::Bluetooth* bluetooth_; +}; + +} // namespace audio -- cgit v1.2.3