diff options
| author | jacqueline <me@jacqueline.id.au> | 2023-08-15 13:53:30 +1000 |
|---|---|---|
| committer | jacqueline <me@jacqueline.id.au> | 2023-08-15 13:53:30 +1000 |
| commit | d6b83fcf4a1a3039c06e0b1d1a1f7e2af2351efb (patch) | |
| tree | 03c6a534931736a2755aacef86e271ecc5b8e87c /src/audio/include | |
| parent | 205e3053506191fab69d01e7523e733dccc09d77 (diff) | |
| download | tangara-fw-d6b83fcf4a1a3039c06e0b1d1a1f7e2af2351efb.tar.gz | |
Flesh out basic bluetooth support
No ui yet, and performance isn't great. It kinda works though!!
Diffstat (limited to 'src/audio/include')
| -rw-r--r-- | src/audio/include/audio_fsm.hpp | 3 | ||||
| -rw-r--r-- | src/audio/include/audio_sink.hpp | 8 | ||||
| -rw-r--r-- | src/audio/include/bt_audio_output.hpp | 49 |
3 files changed, 54 insertions, 6 deletions
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<AudioState> { static auto Init(drivers::IGpios* gpio_expander, std::weak_ptr<database::Database>, std::shared_ptr<database::ITagParser>, + drivers::Bluetooth* bluetooth, TrackQueue* queue) -> bool; virtual ~AudioState() {} @@ -68,6 +70,7 @@ class AudioState : public tinyfsm::Fsm<AudioState> { static std::unique_ptr<AudioTask> sTask; static std::unique_ptr<FatfsAudioInput> sFileSource; static std::unique_ptr<I2SAudioOutput> sI2SOutput; + static std::unique_ptr<BluetoothAudioOutput> sBtOutput; static TrackQueue* sTrackQueue; static std::optional<database::TrackId> 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 <me@jacqueline.id.au> + * + * SPDX-License-Identifier: GPL-3.0-only + */ + +#pragma once + +#include <sys/_stdint.h> +#include <cstdint> +#include <memory> +#include <vector> + +#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 |
