Arduino A2DP
BluetoothA2DPSinkQueued.h
1 #pragma once
2 
3 #include "BluetoothA2DPSink.h"
4 
5 #define RINGBUF_HIGHEST_WATER_LEVEL (32 * 1024)
6 #define RINGBUF_PREFETCH_PERCENT 65
7 
8 enum A2DPRingBufferMode : char {
9  RINGBUFFER_MODE_PROCESSING, /* ringbuffer is buffering incoming audio data,
10  I2S is working */
11  RINGBUFFER_MODE_PREFETCHING, /* ringbuffer is buffering incoming audio data,
12  I2S is waiting */
13  RINGBUFFER_MODE_DROPPING /* ringbuffer is not buffering (dropping) incoming
14  audio data, I2S is working */
15 };
16 
25  public:
26  BluetoothA2DPSinkQueued() = default;
27 
28 #if A2DP_I2S_AUDIOTOOLS
30  BluetoothA2DPSinkQueued(audio_tools::AudioOutput &output) {
31  actual_bluetooth_a2dp_sink = this;
32  out->set_output(output);
33  }
35  BluetoothA2DPSinkQueued(audio_tools::AudioStream &output) {
36  actual_bluetooth_a2dp_sink = this;
37  out->set_output(output);
38  }
39 #endif
40 
41 #ifdef ARDUINO
43  BluetoothA2DPSinkQueued(Print &output) {
44  actual_bluetooth_a2dp_sink = this;
45  out->set_output(output);
46  }
47 #endif
48 
50  void set_i2s_stack_size(int size) { i2s_stack_size = size; }
51 
53  void set_i2s_ringbuffer_size(int size) { i2s_ringbuffer_size = size; }
54 
57  if (percent < 0) return;
58  if (percent > 100) return;
59  ringbuffer_prefetch_percent = percent;
60  }
61 
63  void set_i2s_task_priority(UBaseType_t prio) { i2s_task_priority = prio; }
64 
65  void set_i2s_write_size_upto(size_t size) { i2s_write_size_upto = size; }
66 
67  void set_i2s_ticks(int ticks) { i2s_ticks = ticks; }
68 
69  protected:
70  TaskHandle_t s_bt_i2s_task_handle = nullptr; /* handle of I2S task */
71  RingbufHandle_t s_ringbuf_i2s = nullptr; /* handle of ringbuffer for I2S */
72  SemaphoreHandle_t s_i2s_write_semaphore = nullptr;
73  // I2S task
74  int i2s_stack_size = 2048;
75  int i2s_ringbuffer_size = RINGBUF_HIGHEST_WATER_LEVEL;
76  UBaseType_t i2s_task_priority = configMAX_PRIORITIES - 3;
77  volatile A2DPRingBufferMode ringbuffer_mode = RINGBUFFER_MODE_PROCESSING;
78  volatile bool is_starting = true;
79  size_t i2s_write_size_upto = 240 * 6;
80  int i2s_ticks = 20;
81  int ringbuffer_prefetch_percent = RINGBUF_PREFETCH_PERCENT;
82 
83  void bt_i2s_task_start_up(void) override;
84  void bt_i2s_task_shut_down(void) override;
85  void i2s_task_handler(void *arg) override;
86  size_t write_audio(const uint8_t *data, size_t size) override;
87 
88  void set_i2s_active(bool active) override {
89  BluetoothA2DPSink::set_i2s_active(active);
90  if (active) {
91  ringbuffer_mode = RINGBUFFER_MODE_PREFETCHING;
92  is_starting = true;
93  }
94  }
95 
96  int i2s_ringbuffer_prefetch_size() {
97  int bytes = i2s_ringbuffer_size * ringbuffer_prefetch_percent / 100;
98  return (bytes / 4 * 4);
99  }
100 };
virtual void set_output(audio_tools::AudioOutput &output)
Not implemented.
Definition: BluetoothA2DPOutput.h:32
A2DP Bluethooth Sink - We initialize and start the Bluetooth A2DP Sink. The example https://github....
Definition: BluetoothA2DPSink.h:59
The BluetoothA2DPSinkQueued is using a separate Task with an additinal Queue to write the I2S data....
Definition: BluetoothA2DPSinkQueued.h:24
size_t write_audio(const uint8_t *data, size_t size) override
output audio data e.g. to i2s or to queue
Definition: BluetoothA2DPSinkQueued.cpp:87
BluetoothA2DPSinkQueued(audio_tools::AudioOutput &output)
Output AudioOutput using AudioTools library.
Definition: BluetoothA2DPSinkQueued.h:30
BluetoothA2DPSinkQueued(audio_tools::AudioStream &output)
Output AudioStream using AudioTools library.
Definition: BluetoothA2DPSinkQueued.h:35
void set_i2s_task_priority(UBaseType_t prio)
Defines the priority of the I2S task.
Definition: BluetoothA2DPSinkQueued.h:63
BluetoothA2DPSinkQueued(Print &output)
Output to Arduino Print.
Definition: BluetoothA2DPSinkQueued.h:43
void set_i2s_ringbuffer_prefetch_percent(int percent)
Audio starts to play when limit exeeded.
Definition: BluetoothA2DPSinkQueued.h:56
void set_i2s_stack_size(int size)
Defines the stack size of the i2s task (in bytes)
Definition: BluetoothA2DPSinkQueued.h:50
void i2s_task_handler(void *arg) override
dummy functions needed for BluetoothA2DPSinkQueued
Definition: BluetoothA2DPSinkQueued.cpp:43
void set_i2s_ringbuffer_size(int size)
Defines the ringbuffer size used by the i2s task (in bytes)
Definition: BluetoothA2DPSinkQueued.h:53