|
|
| BluetoothA2DPSinkQueued (audio_tools::AudioOutput &output) |
| | Output AudioOutput using AudioTools library.
|
| |
|
| BluetoothA2DPSinkQueued (audio_tools::AudioStream &output) |
| | Output AudioStream using AudioTools library.
|
| |
|
| BluetoothA2DPSinkQueued (Print &output) |
| | Output to Arduino Print.
|
| |
|
virtual void | activate_pin_code (bool active) |
| | We need to confirm a new seesion by calling confirm_pin_code()
|
| |
|
virtual uint16_t | channels () |
| | Provides the actually set number of channels (1=mono,2=stereo)
|
| |
|
virtual void | clean_last_connection () |
| | clean last connection (delete)
|
| |
|
void | clear_references () |
| | Clear all references.
|
| |
|
virtual void | confirm_pin_code () |
| | confirms the connection request by returning the receivedn pin code
|
| |
|
virtual void | confirm_pin_code (int code) |
| | confirms the connection request by returning the indicated pin code
|
| |
|
virtual bool | connect_to (esp_bd_addr_t peer) |
| | Connnects to the indicated address.
|
| |
| virtual void | debounce (void(*cb)(void), int ms) |
| |
|
void | delay_ms (uint32_t millis) |
| | calls vTaskDelay to pause for the indicated number of milliseconds
|
| |
|
virtual void | disconnect () |
| | Closes the connection.
|
| |
| virtual void | end (bool release_memory=false) |
| |
|
virtual void | fast_forward () |
| | AVRC fast_forward.
|
| |
|
virtual esp_a2d_audio_state_t | get_audio_state () |
| | Determine the actual audio state.
|
| |
|
virtual esp_a2d_mct_t | get_audio_type () |
| | Determine the actual audio type.
|
| |
|
virtual esp_a2d_connection_state_t | get_connection_state () |
| | Determine the connection state.
|
| |
|
virtual esp_bd_addr_t * | get_current_peer_address () |
| | Provides the address of the connected device.
|
| |
|
virtual esp_bd_addr_t * | get_last_peer_address () |
| | Provides the address of the last device.
|
| |
|
esp_bt_gap_cb_param_t::read_rssi_delta_param | get_last_rssi () |
| | provides the last rssi parameters
|
| |
|
unsigned long | get_millis () |
| | Provides the time in milliseconds since the last system boot.
|
| |
|
virtual const char * | get_name () |
| | Provides the actual SSID name.
|
| |
|
BluetoothA2DPOutput * | get_output () |
| | Provides access to the output class.
|
| |
|
virtual const char * | get_peer_name () |
| | Get the name of the connected source device.
|
| |
|
void * | get_reference (int type=0) |
| | Get the reference to an object (e.g. to use in the callbacks)
|
| |
| virtual int | get_volume () |
| | Determines the volume.
|
| |
|
virtual bool | is_avrc_connected () |
| | returns true if the avrc service is connected
|
| |
| bool | is_avrc_peer_rn_cap (esp_avrc_rn_event_ids_t cmd) |
| |
|
bool | is_avrc_peer_rn_cap_available () |
| | Returns true if the is_avrc_peer_rn_cap() method can be called.
|
| |
|
virtual bool | is_connected () |
| | Checks if A2DP is connected.
|
| |
|
bool | is_output_active () |
| | Checks if output is active.
|
| |
|
void | log_free_heap () |
| | Logs the free heap.
|
| |
|
virtual void | next () |
| | AVRC next.
|
| |
|
virtual void | pause () |
| | AVRC pause.
|
| |
|
virtual int | pin_code () |
| | provides the requested pin code (0 = undefined)
|
| |
|
virtual void | play () |
| | Starts to play music using AVRC.
|
| |
|
virtual void | previous () |
| | AVRC previous.
|
| |
|
virtual bool | reconnect () |
| | Reconnects to the last device.
|
| |
|
virtual void | rewind () |
| | AVRC rewind.
|
| |
|
virtual uint16_t | sample_rate () |
| | Provides the actually set data rate (in samples per second)
|
| |
|
virtual void | set_address_validator (bool(*callBack)(esp_bd_addr_t remote_bda)) |
| | Allows you to reject unauthorized addresses.
|
| |
| void | set_auto_reconnect (bool active) |
| |
| virtual void | set_auto_reconnect (bool reconnect, int count=AUTOCONNECT_TRY_NUM) |
| |
|
virtual void | set_avrc_connection_state_callback (void(*callback)(bool)) |
| | Define a callback method which provides connection state of AVRC service.
|
| |
| virtual void | set_avrc_metadata_attribute_mask (int flags) |
| |
|
virtual void | set_avrc_metadata_callback (void(*callback)(uint8_t, const uint8_t *)) |
| | Define a callback method which provides the meta data.
|
| |
| virtual void | set_avrc_rn_events (std::vector< esp_avrc_rn_event_ids_t > events) |
| |
| virtual void | set_avrc_rn_play_pos_callback (void(*callback)(uint32_t play_pos), uint32_t notif_interval=10) |
| |
| virtual void | set_avrc_rn_playstatus_callback (void(*callback)(esp_avrc_playback_stat_t playback)) |
| |
| virtual void | set_avrc_rn_track_change_callback (void(*callback)(uint8_t *id)) |
| |
|
virtual void | set_avrc_rn_volumechange (void(*callBack)(int)) |
| | Set the callback that is called when remote changes the volume.
|
| |
| virtual void | set_avrc_rn_volumechange_completed (void(*callBack)(int)) |
| |
|
void | set_bluedroid_config_t (esp_bluedroid_config_t cfg) |
| | Defines the esp_bluedroid_config_t: Available from IDF 5.2.1.
|
| |
| bool | set_codec (A2DPCodec codec, void(*encoded_cb)(const uint8_t *data, size_t len)=nullptr) |
| |
|
virtual void | set_connectable (bool connectable) |
| | Bluetooth connectable.
|
| |
|
virtual void | set_connected (bool active) |
| | Calls disconnect or reconnect.
|
| |
| virtual void | set_default_bt_mode (esp_bt_mode_t mode) |
| |
| virtual void | set_discoverability (esp_bt_discovery_mode_t d) |
| | Bluetooth discoverability.
|
| |
|
void | set_event_queue_size (int size) |
| | Defines the queue size of the event task.
|
| |
|
void | set_event_stack_size (int size) |
| | Defines the stack size of the event task (in bytes)
|
| |
|
void | set_i2s_ringbuffer_prefetch_percent (int percent) |
| | Audio starts to play when limit exeeded.
|
| |
|
void | set_i2s_ringbuffer_size (int size) |
| | Defines the ringbuffer size used by the i2s task (in bytes)
|
| |
|
void | set_i2s_stack_size (int size) |
| | Defines the stack size of the i2s task (in bytes)
|
| |
|
void | set_i2s_task_priority (UBaseType_t prio) |
| | Defines the priority of the I2S task.
|
| |
|
void | set_i2s_ticks (int ticks) |
| |
|
void | set_i2s_write_size_upto (size_t size) |
| |
|
void | set_max_write_delay_ms (int delay) |
| | defines a small delay after each write: default is 0 ms
|
| |
|
void | set_max_write_size (int size) |
| | defines the max write size: default is A2DP_I2S_MAX_WRITE_SIZE
|
| |
|
virtual void | set_mono_downmix (bool enabled) |
| | mix stereo into single mono signal
|
| |
| virtual void | set_on_audio_state_changed (void(*callBack)(esp_a2d_audio_state_t state, void *), void *obj=nullptr) |
| | Set the callback that is called when the audio state is changed.
|
| |
| virtual void | set_on_audio_state_changed_post (void(*callBack)(esp_a2d_audio_state_t state, void *), void *obj=nullptr) |
| |
| virtual void | set_on_connection_state_changed (void(*callBack)(esp_a2d_connection_state_t state, void *), void *obj=nullptr) |
| | Set the callback that is called when the connection state is changed.
|
| |
|
virtual void | set_on_data_received (void(*callBack)()) |
| | Define callback which is called when we receive data.
|
| |
| virtual void | set_on_volumechange (void(*callBack)(int)) |
| |
|
void | set_output (audio_tools::AudioOutput &output) |
| | Output AudioOutput using AudioTools library.
|
| |
|
void | set_output (audio_tools::AudioStream &output) |
| | Output AudioStream using AudioTools library.
|
| |
|
void | set_output (BluetoothA2DPOutput &output) |
| | Defines the output class: by default we use BluetoothA2DPOutputDefault.
|
| |
|
void | set_output (Print &output) |
| | Output to Arduino Print.
|
| |
|
void | set_output_active (bool flag) |
| | Activate/Deactivate output e.g. to I2S.
|
| |
|
void | set_peer_name_callback (void(*callback)(char *peer_name)) |
| | Defines the callback that is called when we get the peer name.
|
| |
| virtual void | set_raw_stream_reader (void(*callBack)(const uint8_t *, uint32_t)) |
| |
| void | set_reconnect_delay (int delay) |
| |
|
void | set_reference (void *ref, int type=0) |
| | Store a reference to an object (e.g. to use in the callbacks)
|
| |
|
void | set_rssi_active (bool active) |
| | Activates the rssi reporting.
|
| |
|
void | set_rssi_callback (void(*callback)(esp_bt_gap_cb_param_t::read_rssi_delta_param &rssi)) |
| | Defines the callback that is called when we get an new rssi value.
|
| |
|
virtual void | set_sample_rate_callback (void(*callback)(uint16_t rate)) |
| | Defines the method which will be called with the sample rate is updated.
|
| |
|
void | set_spp_active (bool flag) |
| | Activates SSP (Serial protocol)
|
| |
|
void | set_spp_config (esp_spp_cfg_t cfg) |
| | Set SPP configuration (only before start)
|
| |
| virtual void | set_stream_reader (void(*callBack)(const uint8_t *, uint32_t), bool i2s_output=true) |
| |
|
virtual void | set_swap_lr_channels (bool swap) |
| | swaps the left and right channel
|
| |
| void | set_task_core (BaseType_t core) |
| |
|
void | set_task_priority (UBaseType_t priority) |
| | defines the task priority (the default value is configMAX_PRIORITIES - 10)
|
| |
| virtual void | set_volume (uint8_t volume) |
| | Changes the volume.
|
| |
|
virtual void | set_volume_control (A2DPVolumeControl *ptr) |
| | you can define a custom VolumeControl implementation
|
| |
| virtual void | start (const char *name) |
| | starts the I2S bluetooth sink with the inidicated name
|
| |
|
virtual void | start (const char *name, bool auto_reconect) |
| | starts the I2S bluetooth sink with the inidicated name
|
| |
|
virtual void | stop () |
| | AVRC stop.
|
| |
|
const char * | to_str (esp_a2d_audio_state_t state) |
| | converts a esp_a2d_audio_state_t to a string
|
| |
|
const char * | to_str (esp_a2d_connection_state_t state) |
| | converts esp_a2d_connection_state_t to a string
|
| |
| const char * | to_str (esp_avrc_playback_stat_t state) |
| | converts esp_avrc_playback_stat_t to a string
|
| |
|
const char * | to_str (esp_bd_addr_t bda) |
| | converts a esp_bd_addr_t to a string - the string is 18 characters long!
|
| |
|
const char * | to_str (esp_bt_gap_discovery_state_t state) |
| | converts esp_bt_gap_discovery_state_t to a string
|
| |
|
bool | update_rssi () |
| | Requests an update of the rssi delta value.
|
| |
|
virtual void | volume_down () |
| | AVRC decrease the volume.
|
| |
|
virtual void | volume_up () |
| | AVRC increase the volume.
|
| |
|
| void | app_a2d_callback (esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param) override |
| | callback function for A2DP source
|
| |
|
virtual void | app_alloc_meta_buffer (esp_avrc_ct_cb_param_t *param) |
| |
| void | app_gap_callback (esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *param) override |
| |
| void | app_rc_ct_callback (esp_avrc_ct_cb_event_t event, esp_avrc_ct_cb_param_t *param) override |
| | callback function for AVRCP controller
|
| |
| virtual void | app_rc_tg_callback (esp_avrc_tg_cb_event_t event, esp_avrc_tg_cb_param_t *param) override |
| |
|
virtual bool | app_send_msg (bt_app_msg_t *msg) |
| |
|
virtual void | app_task_handler (void *arg) |
| |
|
virtual void | app_task_shut_down () |
| |
|
virtual void | app_task_start_up () |
| |
|
virtual bool | app_work_dispatch (app_callback_t p_cback, uint16_t event, void *p_params, int param_len) |
| |
|
virtual void | app_work_dispatched (bt_app_msg_t *msg) |
| |
| virtual void | audio_data_callback (const uint8_t *data, uint32_t len) |
| |
|
virtual void | av_hdl_a2d_evt (uint16_t event, void *p_param) |
| |
|
virtual void | av_hdl_avrc_evt (uint16_t event, void *p_param) |
| |
| virtual void | av_hdl_avrc_tg_evt (uint16_t event, void *p_param) override |
| |
| void | av_hdl_stack_evt (uint16_t event, void *p_param) override |
| |
|
virtual void | av_new_track () |
| |
|
virtual void | av_notify_evt_handler (uint8_t event_id, esp_avrc_rn_param_t *event_parameter) |
| |
|
virtual void | av_play_pos_changed () |
| |
|
virtual void | av_playback_changed () |
| |
|
virtual esp_err_t | bluedroid_init () |
| |
| void | bt_i2s_task_shut_down (void) override |
| |
| void | bt_i2s_task_start_up (void) override |
| |
| virtual bool | bt_start () |
| | Startup logic as implemented by Arduino.
|
| |
| esp_err_t | esp_a2d_connect (esp_bd_addr_t peer) override |
| |
| esp_err_t | esp_a2d_disconnect (esp_bd_addr_t remote_bda) override |
| |
|
virtual void | execute_avrc_command (int cmd) |
| |
| virtual const char * | get_connected_source_name () |
| |
|
virtual bool | get_last_connection () |
| |
|
virtual void | handle_audio_cfg (uint16_t event, void *p_param) |
| |
|
virtual void | handle_audio_state (uint16_t event, void *p_param) |
| |
|
virtual void | handle_avrc_connection_state (bool connected) |
| |
|
virtual void | handle_connection_state (uint16_t event, void *p_param) |
| |
|
virtual bool | has_last_connection () |
| |
|
int | i2s_ringbuffer_prefetch_size () |
| |
| void | i2s_task_handler (void *arg) override |
| | dummy functions needed for BluetoothA2DPSinkQueued
|
| |
|
size_t | i2s_write_data (const uint8_t *data, size_t item_size) |
| | writes the data to i2s
|
| |
|
virtual int | init_bluetooth () |
| |
|
virtual void | init_i2s () |
| |
|
virtual void | init_nvs () |
| |
|
bool | is_encoded_output () |
| |
|
virtual bool | is_reconnect (esp_a2d_disc_rsn_t type) |
| |
| virtual bool | isSource () |
| |
| virtual const char * | last_bda_nvs_name () |
| |
|
virtual bool | read_address (const char *name, esp_bd_addr_t &bda) |
| |
| void | set_i2s_active (bool active) override |
| |
|
virtual void | set_last_connection (esp_bd_addr_t bda) |
| |
|
virtual void | set_scan_mode_connectable (bool connectable) |
| | Defines if the bluetooth is connectable.
|
| |
| void | set_scan_mode_connectable_default () override |
| |
|
virtual A2DPVolumeControl * | volume_control () |
| | provides access to the VolumeControl object
|
| |
|
virtual void | volume_set_by_controller (uint8_t volume) |
| |
|
virtual void | volume_set_by_local_host (uint8_t volume) |
| |
|
virtual bool | write_address (const char *name, esp_bd_addr_t bda) |
| |
| size_t | write_audio (const uint8_t *data, size_t size) override |
| | output audio data e.g. to i2s or to queue
|
| |
|
|
bool(* | address_validator )(esp_bd_addr_t remote_bda) = nullptr |
| |
|
TaskHandle_t | app_task_handle = nullptr |
| |
|
QueueHandle_t | app_task_queue = nullptr |
| |
|
esp_a2d_audio_state_t | audio_state = ESP_A2D_AUDIO_STATE_STOPPED |
| |
|
void(* | audio_state_callback )(esp_a2d_audio_state_t state, void *obj) = nullptr |
| |
|
void(* | audio_state_callback_post )(esp_a2d_audio_state_t state, void *obj) = nullptr |
| |
|
void * | audio_state_obj = nullptr |
| |
|
void * | audio_state_obj_post = nullptr |
| |
|
esp_a2d_mct_t | audio_type |
| |
|
bool | avrc_connection_state = false |
| |
|
void(* | avrc_connection_state_callback )(bool connected) = nullptr |
| |
|
void(* | avrc_metadata_callback )(uint8_t, const uint8_t *) = nullptr |
| |
| int | avrc_metadata_flags |
| |
| std::vector< esp_avrc_rn_event_ids_t > | avrc_rn_events |
| |
|
void(* | avrc_rn_play_pos_callback )(uint32_t) = nullptr |
| |
|
void(* | avrc_rn_playstatus_callback )(esp_avrc_playback_stat_t) = nullptr |
| |
|
void(* | avrc_rn_track_change_callback )(uint8_t *) = nullptr |
| |
|
void(* | avrc_rn_volchg_complete_callback )(int) = nullptr |
| |
|
esp_bluedroid_config_t | bluedroid_config {.ssp_en = true} |
| |
|
void(* | bt_connected )() = nullptr |
| |
|
void(* | bt_dis_connected )() = nullptr |
| |
|
esp_bt_mode_t | bt_mode = ESP_BT_MODE_CLASSIC_BT |
| |
|
const char * | bt_name = {0} |
| |
|
void(* | bt_volumechange )(int) = nullptr |
| |
|
int | connection_rety_count = 0 |
| |
| esp_a2d_connection_state_t | connection_state |
| |
|
void(* | connection_state_callback )(esp_a2d_connection_state_t state, void *obj) = nullptr |
| |
|
void * | connection_state_obj = nullptr |
| |
|
void(* | data_received )() = nullptr |
| |
|
uint32_t | debounce_ms = 0 |
| |
|
unsigned int | default_reconnect_timout = 10000 |
| |
|
A2DPDefaultVolumeControl | default_volume_control |
| |
|
A2DPCodec | desired_codec = A2DP_CODEC_SBC |
| |
|
esp_bt_discovery_mode_t | discoverability = ESP_BT_GENERAL_DISCOVERABLE |
| |
|
void(* | encoded_stream_reader )(const uint8_t *, size_t) = nullptr |
| |
|
int | event_queue_size = 20 |
| |
|
int | event_stack_size = 3072 |
| |
|
int | i2s_ringbuffer_size = RINGBUF_HIGHEST_WATER_LEVEL |
| |
|
int | i2s_stack_size = 2048 |
| |
|
UBaseType_t | i2s_task_priority = configMAX_PRIORITIES - 3 |
| |
|
int | i2s_ticks = 20 |
| |
|
size_t | i2s_write_size_upto = 240 * 6 |
| |
|
bool | is_autoreconnect_allowed = false |
| |
|
bool | is_bluedroid_initialized = false |
| |
|
volatile bool | is_i2s_active = false |
| |
|
bool | is_output = true |
| |
|
bool | is_pin_code_active = false |
| |
|
bool | is_start_disabled = false |
| |
|
volatile bool | is_starting = true |
| |
|
bool | is_target_status_active = true |
| |
|
bool | is_volume_used = false |
| |
|
esp_bd_addr_t | last_connection = {0, 0, 0, 0, 0, 0} |
| |
|
esp_bt_gap_cb_param_t::read_rssi_delta_param | last_rssi_delta |
| |
|
const char * | m_a2d_audio_state_str [4] = {"Suspended", "Started", "Suspended", "Suspended"} |
| |
| const char * | m_a2d_conn_state_str [4] |
| |
| const char * | m_avrc_playback_state_str [5] |
| |
|
uint8_t | m_channels = 2 |
| |
|
const char * | m_esp_bt_gap_discovery_state_t [2] = {"Stopped", "Started"} |
| |
|
uint32_t | m_pkt_cnt = 0 |
| |
|
uint16_t | m_sample_rate = 44100 |
| |
|
int | max_write_delay_ms = A2DP_I2S_MAX_WRITE_DELAY_MS |
| |
|
int | max_write_size = A2DP_I2S_MAX_WRITE_SIZE |
| |
|
esp_a2d_mcc_t | mcc {} |
| |
|
uint32_t | notif_interval_s = 10 |
| |
|
BluetoothA2DPOutput * | out = &out_default |
| |
|
BluetoothA2DPOutputDefault | out_default |
| |
|
esp_bd_addr_t | peer_bd_addr |
| |
|
void(* | peer_name_callback )(char *peer_name) = nullptr |
| |
|
int | pin_code_int = 0 |
| |
|
PinCodeRequest | pin_code_request = Undefined |
| |
|
char | pin_code_str [20] = {0} |
| |
|
void(* | raw_stream_reader )(const uint8_t *, uint32_t) = nullptr |
| |
|
int | reconnect_delay = 1000 |
| |
|
ReconnectStatus | reconnect_status = NoReconnect |
| |
|
unsigned long | reconnect_timout = 0 |
| |
|
std::map< int, void * > | references |
| |
|
char | remote_name [ESP_BT_GAP_MAX_BDNAME_LEN+1] |
| |
|
volatile A2DPRingBufferMode | ringbuffer_mode = RINGBUFFER_MODE_PROCESSING |
| |
|
int | ringbuffer_prefetch_percent = RINGBUF_PREFETCH_PERCENT |
| |
|
bool | rssi_active = false |
| |
| void(* | rssi_callback )(esp_bt_gap_cb_param_t::read_rssi_delta_param &rssi) |
| |
|
esp_avrc_rn_evt_cap_mask_t | s_avrc_peer_rn_cap = {0} |
| |
|
TaskHandle_t | s_bt_i2s_task_handle = nullptr |
| |
|
SemaphoreHandle_t | s_i2s_write_semaphore = nullptr |
| |
|
RingbufHandle_t | s_ringbuf_i2s = nullptr |
| |
|
uint8_t | s_volume = 0 |
| |
|
_lock_t | s_volume_lock |
| |
|
bool | s_volume_notify |
| |
|
void(* | sample_rate_callback )(uint16_t rate) = nullptr |
| |
|
bool | spp_active = false |
| |
|
esp_spp_cfg_t | spp_cfg = BT_SPP_DEFAULT_CONFIG() |
| |
|
void(* | stream_reader )(const uint8_t *, uint32_t) = nullptr |
| |
|
bool | swap_left_right = false |
| |
|
BaseType_t | task_core = 1 |
| |
|
UBaseType_t | task_priority = configMAX_PRIORITIES - 10 |
| |
|
int | try_reconnect_max_count = AUTOCONNECT_TRY_NUM |
| |
|
A2DPVolumeControl * | volume_control_ptr = nullptr |
| |
|
uint8_t | volume_value = 0 |
| |
BluetoothA2DPSinkQueued provides an A2DP sink implementation with a queued, task-based I2S output to address the volume delay and jitter issues observed in the standard BluetoothA2DPSink implementation, especially under high load or with certain Bluetooth sources.
This class extends BluetoothA2DPSink by introducing a dedicated FreeRTOS task and a ring buffer for handling audio data. Incoming audio data is buffered in the ring buffer and then written to the I2S interface by the background task. This design helps decouple Bluetooth and I2S timing, improving robustness against jitter and allowing for prefetching and flow control.
The ring buffer operates in different modes, controlled by the enum A2DPRingBufferMode:
- RINGBUFFER_MODE_PROCESSING: Buffering and playback are active (normal operation).
- RINGBUFFER_MODE_PREFETCHING: Buffering is active, playback waits until a prefetch threshold is reached.
- RINGBUFFER_MODE_DROPPING: Incoming audio is dropped (e.g., buffer overflow or underrun recovery).
The mode can be inspected or extended for advanced flow control and diagnostics.
Key features:
- Separate I2S task for audio output
- Configurable ring buffer size and prefetch threshold
- Adjustable I2S task priority and stack size
- Support for Arduino Print and AudioTools output
- See also
- A2DPRingBufferMode
- Author
- Phil Schatzmann
- Copyright
- Apache License Version 2