Bluetooth® A2DP API
Application Examples
bluetooth/bluedroid/classic_bt/a2dp_sink demonstrates how to implement an audio sink device using the Advanced Audio Distribution Profile (A2DP) to receive audio streams. This example also shows how to use AVRCP for media information notifications and I2S for audio stream output.
bluetooth/bluedroid/classic_bt/a2dp_source demonstrates how to use A2DP APIs to transmit audio streams.
bluetooth/bluedroid/coex/a2dp_gatts_coex demonstrates how to use the ESP-IDF A2DP-GATTS_COEX demo to create a GATT service and A2DP profile.
API Reference
Header File
This header file can be included with:
#include "esp_a2dp_api.h"
This header file is a part of the API provided by the
bt
component. To declare that your component depends onbt
, add the following to your CMakeLists.txt:REQUIRES bt
or
PRIV_REQUIRES bt
Functions
-
esp_err_t esp_a2d_register_callback(esp_a2d_cb_t callback)
Register application callback function to A2DP module. This function should be called only after esp_bluedroid_enable() completes successfully, used by both A2DP source and sink.
- Parameters
callback -- [in] A2DP event callback function
- Returns
ESP_OK: success
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: if callback is a NULL function pointer
-
esp_err_t esp_a2d_sink_register_data_callback(esp_a2d_sink_data_cb_t callback)
Register A2DP sink data output function; For now the output is PCM data stream decoded from SBC format. This function should be called only after esp_bluedroid_enable() completes successfully, used only by A2DP sink. The callback is invoked in the context of A2DP sink task whose stack size is configurable through menuconfig.
- Parameters
callback -- [in] A2DP sink data callback function
- Returns
ESP_OK: success
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: if callback is a NULL function pointer
-
esp_err_t esp_a2d_sink_init(void)
Initialize the bluetooth A2DP sink module. This function should be called after esp_bluedroid_enable() completes successfully, and ESP_A2D_PROF_STATE_EVT with ESP_A2D_INIT_SUCCESS will reported to the APP layer. Note: A2DP can work independently. If you want to use AVRC together, you should initiate AVRC first. This function should be called after esp_bluedroid_enable() completes successfully.
- Returns
ESP_OK: if the initialization request is sent successfully
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: others
-
esp_err_t esp_a2d_sink_deinit(void)
De-initialize for A2DP sink module. This function should be called only after esp_bluedroid_enable() completes successfully, and ESP_A2D_PROF_STATE_EVT with ESP_A2D_DEINIT_SUCCESS will reported to APP layer.
- Returns
ESP_OK: if the deinitialization request is sent successfully
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: others
-
esp_err_t esp_a2d_sink_connect(esp_bd_addr_t remote_bda)
Connect to remote bluetooth A2DP source device. This API must be called after esp_a2d_sink_init() and before esp_a2d_sink_deinit().
- Parameters
remote_bda -- [in] remote bluetooth device address
- Returns
ESP_OK: connect request is sent to lower layer successfully
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: others
-
esp_err_t esp_a2d_sink_disconnect(esp_bd_addr_t remote_bda)
Disconnect from the remote A2DP source device. This API must be called after esp_a2d_sink_init() and before esp_a2d_sink_deinit().
- Parameters
remote_bda -- [in] remote bluetooth device address
- Returns
ESP_OK: disconnect request is sent to lower layer successfully
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: others
-
esp_err_t esp_a2d_sink_set_delay_value(uint16_t delay_value)
Set delay reporting value. The delay value of sink is caused by buffering (including protocol stack and application layer), decoding and rendering. The default delay value is 120ms, if the set value is less than 120ms, the setting will fail. This API must be called after esp_a2d_sink_init() and before esp_a2d_sink_deinit().
- Parameters
delay_value -- [in] reporting value is in 1/10 millisecond
- Returns
ESP_OK: delay value is sent to lower layer successfully
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: others
-
esp_err_t esp_a2d_sink_get_delay_value(void)
Get delay reporting value. This API must be called after esp_a2d_sink_init() and before esp_a2d_sink_deinit().
- Returns
ESP_OK: if the request is sent successfully
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: others
-
esp_err_t esp_a2d_media_ctrl(esp_a2d_media_ctrl_t ctrl)
Media control commands. This API can be used for both A2DP sink and source and must be called after esp_a2d_sink_init() and before esp_a2d_sink_deinit().
- Parameters
ctrl -- [in] control commands for A2DP data channel
- Returns
ESP_OK: control command is sent to lower layer successfully
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: others
-
esp_err_t esp_a2d_source_init(void)
Initialize the bluetooth A2DP source module. A2DP can work independently. If you want to use AVRC together, you should initiate AVRC first. This function should be called after esp_bluedroid_enable() completes successfully, and ESP_A2D_PROF_STATE_EVT with ESP_A2D_INIT_SUCCESS will reported to the APP layer. Note: A2DP can work independently. If you want to use AVRC together, you should initiate AVRC first.
- Returns
ESP_OK: if the initialization request is sent to lower layer successfully
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: others
-
esp_err_t esp_a2d_source_deinit(void)
De-initialize for A2DP source module. This function should be called only after esp_bluedroid_enable() completes successfully, and ESP_A2D_PROF_STATE_EVT with ESP_A2D_DEINIT_SUCCESS will reported to APP layer.
- Returns
ESP_OK: success
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: others
-
esp_err_t esp_a2d_source_register_data_callback(esp_a2d_source_data_cb_t callback)
Register A2DP source data input function. For now, the input shoule be PCM data stream. This function should be called only after esp_bluedroid_enable() completes successfully. The callback is invoked in the context of A2DP source task whose stack size is configurable through menuconfig.
- Parameters
callback -- [in] A2DP source data callback function
- Returns
ESP_OK: success
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: if callback is a NULL function pointer
-
esp_err_t esp_a2d_source_connect(esp_bd_addr_t remote_bda)
Connect to remote A2DP sink device. This API must be called after esp_a2d_source_init() and before esp_a2d_source_deinit().
- Parameters
remote_bda -- [in] remote bluetooth device address
- Returns
ESP_OK: connect request is sent to lower layer successfully
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: others
-
esp_err_t esp_a2d_source_disconnect(esp_bd_addr_t remote_bda)
Disconnect from the remote A2DP sink device. This API must be called after esp_a2d_source_init() and before esp_a2d_source_deinit().
- Parameters
remote_bda -- [in] remote bluetooth device address
- Returns
ESP_OK: disconnect request is sent to lower layer
ESP_ERR_INVALID_STATE: if bluetooth stack is not yet enabled
ESP_FAIL: others
Unions
-
union esp_a2d_cb_param_t
- #include <esp_a2dp_api.h>
A2DP state callback parameters.
Public Members
-
struct esp_a2d_cb_param_t::a2d_conn_stat_param conn_stat
A2DP connection status
-
struct esp_a2d_cb_param_t::a2d_audio_stat_param audio_stat
audio stream playing state
-
struct esp_a2d_cb_param_t::a2d_audio_cfg_param audio_cfg
media codec configuration information
-
struct esp_a2d_cb_param_t::media_ctrl_stat_param media_ctrl_stat
status in acknowledgement to media control commands
-
struct esp_a2d_cb_param_t::a2d_prof_stat_param a2d_prof_stat
status to indicate a2d prof init or deinit
-
struct esp_a2d_cb_param_t::a2d_psc_cfg_param a2d_psc_cfg_stat
status to indicate protocol service capabilities configured
-
struct esp_a2d_cb_param_t::a2d_set_stat_param a2d_set_delay_value_stat
A2DP sink set delay report value status
-
struct esp_a2d_cb_param_t::a2d_get_stat_param a2d_get_delay_value_stat
A2DP sink get delay report value status
-
struct esp_a2d_cb_param_t::a2d_report_delay_stat_param a2d_report_delay_value_stat
A2DP source received sink report value status
-
struct a2d_audio_cfg_param
- #include <esp_a2dp_api.h>
ESP_A2D_AUDIO_CFG_EVT.
Public Members
-
esp_bd_addr_t remote_bda
remote bluetooth device address
-
esp_a2d_mcc_t mcc
A2DP media codec capability information
-
esp_bd_addr_t remote_bda
-
struct a2d_audio_stat_param
- #include <esp_a2dp_api.h>
ESP_A2D_AUDIO_STATE_EVT.
Public Members
-
esp_a2d_audio_state_t state
one of the values from esp_a2d_audio_state_t
-
esp_bd_addr_t remote_bda
remote bluetooth device address
-
esp_a2d_audio_state_t state
-
struct a2d_conn_stat_param
- #include <esp_a2dp_api.h>
ESP_A2D_CONNECTION_STATE_EVT.
Public Members
-
esp_a2d_connection_state_t state
one of values from esp_a2d_connection_state_t
-
esp_bd_addr_t remote_bda
remote bluetooth device address
-
esp_a2d_disc_rsn_t disc_rsn
reason of disconnection for "DISCONNECTED"
-
esp_a2d_connection_state_t state
-
struct a2d_get_stat_param
- #include <esp_a2dp_api.h>
ESP_A2D_SNK_GET_DELAY_VALUE_EVT.
Public Members
-
uint16_t delay_value
delay report value
-
uint16_t delay_value
-
struct a2d_prof_stat_param
- #include <esp_a2dp_api.h>
ESP_A2D_PROF_STATE_EVT.
Public Members
-
esp_a2d_init_state_t init_state
a2dp profile state param
-
esp_a2d_init_state_t init_state
-
struct a2d_psc_cfg_param
- #include <esp_a2dp_api.h>
ESP_A2D_SNK_PSC_CFG_EVT.
Public Members
-
esp_a2d_psc_t psc_mask
protocol service capabilities configured
-
esp_a2d_psc_t psc_mask
-
struct a2d_report_delay_stat_param
- #include <esp_a2dp_api.h>
ESP_A2D_REPORT_SNK_DELAY_VALUE_EVT.
Public Members
-
uint16_t delay_value
delay report value
-
uint16_t delay_value
-
struct a2d_set_stat_param
- #include <esp_a2dp_api.h>
ESP_A2D_SNK_SET_DELAY_VALUE_EVT.
Public Members
-
esp_a2d_set_delay_value_state_t set_state
a2dp profile state param
-
uint16_t delay_value
delay report value
-
esp_a2d_set_delay_value_state_t set_state
-
struct media_ctrl_stat_param
- #include <esp_a2dp_api.h>
ESP_A2D_MEDIA_CTRL_ACK_EVT.
Public Members
-
esp_a2d_media_ctrl_t cmd
media control commands to acknowledge
-
esp_a2d_media_ctrl_ack_t status
acknowledgement to media control commands
-
esp_a2d_media_ctrl_t cmd
-
struct esp_a2d_cb_param_t::a2d_conn_stat_param conn_stat
Structures
-
struct esp_a2d_mcc_t
A2DP media codec capabilities union.
Public Members
-
esp_a2d_mct_t type
A2DP media codec type
-
uint8_t sbc[ESP_A2D_CIE_LEN_SBC]
SBC codec capabilities
-
uint8_t m12[ESP_A2D_CIE_LEN_M12]
MPEG-1,2 audio codec capabilities
-
uint8_t m24[ESP_A2D_CIE_LEN_M24]
MPEG-2, 4 AAC audio codec capabilities
-
uint8_t atrac[ESP_A2D_CIE_LEN_ATRAC]
ATRAC family codec capabilities
-
union esp_a2d_mcc_t::[anonymous] cie
A2DP codec information element
-
esp_a2d_mct_t type
Macros
-
ESP_A2D_MCT_SBC
Media codec types supported by A2DP.
SBC
-
ESP_A2D_MCT_M12
MPEG-1, 2 Audio
-
ESP_A2D_MCT_M24
MPEG-2, 4 AAC
-
ESP_A2D_MCT_ATRAC
ATRAC family
-
ESP_A2D_MCT_NON_A2DP
NON-A2DP
-
ESP_A2D_PSC_DELAY_RPT
Protocol service capabilities. This value is a mask.
Delay Report
-
ESP_A2D_CIE_LEN_SBC
-
ESP_A2D_CIE_LEN_M12
-
ESP_A2D_CIE_LEN_M24
-
ESP_A2D_CIE_LEN_ATRAC
Type Definitions
-
typedef uint8_t esp_a2d_mct_t
-
typedef uint16_t esp_a2d_psc_t
-
typedef void (*esp_a2d_cb_t)(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param)
A2DP profile callback function type.
- Param event
: Event type
- Param param
: Pointer to callback parameter
-
typedef void (*esp_a2d_sink_data_cb_t)(const uint8_t *buf, uint32_t len)
A2DP sink data callback function.
- Param buf
[in] : pointer to the data received from A2DP source device and is PCM format decoded from SBC decoder; buf references to a static memory block and can be overwritten by upcoming data
- Param len
[in] : size(in bytes) in buf
-
typedef int32_t (*esp_a2d_source_data_cb_t)(uint8_t *buf, int32_t len)
A2DP source data read callback function.
- Param buf
[in] : buffer to be filled with PCM data stream from higher layer
- Param len
[in] : size(in bytes) of data block to be copied to buf. -1 is an indication to user that data buffer shall be flushed
- Return
size of bytes read successfully, if the argument len is -1, this value is ignored.
Enumerations
-
enum esp_a2d_connection_state_t
Bluetooth A2DP connection states.
Values:
-
enumerator ESP_A2D_CONNECTION_STATE_DISCONNECTED
connection released
-
enumerator ESP_A2D_CONNECTION_STATE_CONNECTING
connecting remote device
-
enumerator ESP_A2D_CONNECTION_STATE_CONNECTED
connection established
-
enumerator ESP_A2D_CONNECTION_STATE_DISCONNECTING
disconnecting remote device
-
enumerator ESP_A2D_CONNECTION_STATE_DISCONNECTED
-
enum esp_a2d_disc_rsn_t
Bluetooth A2DP disconnection reason.
Values:
-
enumerator ESP_A2D_DISC_RSN_NORMAL
Finished disconnection that is initiated by local or remote device
-
enumerator ESP_A2D_DISC_RSN_ABNORMAL
Abnormal disconnection caused by signal loss
-
enumerator ESP_A2D_DISC_RSN_NORMAL
-
enum esp_a2d_audio_state_t
Bluetooth A2DP datapath states.
Values:
-
enumerator ESP_A2D_AUDIO_STATE_SUSPEND
audio stream datapath suspended by remote device
-
enumerator ESP_A2D_AUDIO_STATE_STARTED
audio stream datapath started
-
enumerator ESP_A2D_AUDIO_STATE_STOPPED
Note
Deprecated
-
enumerator ESP_A2D_AUDIO_STATE_REMOTE_SUSPEND
Note
Deprecated
-
enumerator ESP_A2D_AUDIO_STATE_SUSPEND
-
enum esp_a2d_media_ctrl_ack_t
A2DP media control command acknowledgement code.
Values:
-
enumerator ESP_A2D_MEDIA_CTRL_ACK_SUCCESS
media control command is acknowledged with success
-
enumerator ESP_A2D_MEDIA_CTRL_ACK_FAILURE
media control command is acknowledged with failure
-
enumerator ESP_A2D_MEDIA_CTRL_ACK_BUSY
media control command is rejected, as previous command is not yet acknowledged
-
enumerator ESP_A2D_MEDIA_CTRL_ACK_SUCCESS
-
enum esp_a2d_media_ctrl_t
A2DP media control commands.
Values:
-
enumerator ESP_A2D_MEDIA_CTRL_NONE
Not for application use, use inside stack only.
-
enumerator ESP_A2D_MEDIA_CTRL_CHECK_SRC_RDY
check whether AVDTP is connected, only used in A2DP source
-
enumerator ESP_A2D_MEDIA_CTRL_START
command to set up media transmission channel
-
enumerator ESP_A2D_MEDIA_CTRL_SUSPEND
command to suspend media transmission
-
enumerator ESP_A2D_MEDIA_CTRL_STOP
Note
Deprecated, Please use ESP_A2D_MEDIA_CTRL_SUSPEND
-
enumerator ESP_A2D_MEDIA_CTRL_NONE
-
enum esp_a2d_init_state_t
Bluetooth A2DP Initiation states.
Values:
-
enumerator ESP_A2D_DEINIT_SUCCESS
A2DP profile deinit successful event
-
enumerator ESP_A2D_INIT_SUCCESS
A2DP profile deinit successful event
-
enumerator ESP_A2D_DEINIT_SUCCESS
-
enum esp_a2d_set_delay_value_state_t
Bluetooth A2DP set delay report value states.
Values:
-
enumerator ESP_A2D_SET_SUCCESS
A2DP profile set delay report value successful
-
enumerator ESP_A2D_SET_INVALID_PARAMS
A2DP profile set delay report value is invalid parameter
-
enumerator ESP_A2D_SET_SUCCESS
-
enum esp_a2d_cb_event_t
A2DP callback events.
Values:
-
enumerator ESP_A2D_CONNECTION_STATE_EVT
connection state changed event
-
enumerator ESP_A2D_AUDIO_STATE_EVT
audio stream transmission state changed event
-
enumerator ESP_A2D_AUDIO_CFG_EVT
audio codec is configured, only used for A2DP SINK
-
enumerator ESP_A2D_MEDIA_CTRL_ACK_EVT
acknowledge event in response to media control commands
-
enumerator ESP_A2D_PROF_STATE_EVT
indicate a2dp init&deinit complete
-
enumerator ESP_A2D_SNK_PSC_CFG_EVT
protocol service capabilities configured,only used for A2DP SINK
-
enumerator ESP_A2D_SNK_SET_DELAY_VALUE_EVT
indicate a2dp sink set delay report value complete, only used for A2DP SINK
-
enumerator ESP_A2D_SNK_GET_DELAY_VALUE_EVT
indicate a2dp sink get delay report value complete, only used for A2DP SINK
-
enumerator ESP_A2D_REPORT_SNK_DELAY_VALUE_EVT
report delay value, only used for A2DP SRC
-
enumerator ESP_A2D_CONNECTION_STATE_EVT