Merge branch 'bugfix/a2dp_api_init_check_v6.0' into 'release/v6.0'

fix(bt): Fix compatibility with A2DP API legacy usage methods (v6.0)

See merge request espressif/esp-idf!51328
This commit is contained in:
Wang Meng Yang
2026-09-06 11:20:08 +08:00
8 changed files with 284 additions and 108 deletions

View File

@@ -68,10 +68,57 @@ static void bt_app_gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *pa
bredr_app_gap_evt_def_hdl(event, param);
}
static void bt_app_a2d_evt_hdl(uint16_t event, void *param)
{
esp_a2d_cb_param_t *a2d = (esp_a2d_cb_param_t *)(param);
switch (event) {
/* when a2dp init or deinit completed, this event comes */
case ESP_A2D_PROF_STATE_EVT: {
if (ESP_A2D_INIT_SUCCESS == a2d->a2d_prof_stat.init_state) {
ESP_LOGI(BT_AV_TAG, "A2DP PROF STATE: Init Complete");
#if CONFIG_EXAMPLE_A2DP_SINK_USE_EXTERNAL_CODEC == TRUE
esp_a2d_mcc_t mcc = {0};
mcc.type = ESP_A2D_MCT_SBC;
mcc.cie.sbc_info.samp_freq = ESP_A2D_SBC_CIE_SF_16K |
ESP_A2D_SBC_CIE_SF_32K |
ESP_A2D_SBC_CIE_SF_44K |
ESP_A2D_SBC_CIE_SF_48K;
mcc.cie.sbc_info.ch_mode = ESP_A2D_SBC_CIE_CH_MODE_MONO |
ESP_A2D_SBC_CIE_CH_MODE_DUAL_CHANNEL |
ESP_A2D_SBC_CIE_CH_MODE_STEREO |
ESP_A2D_SBC_CIE_CH_MODE_JOINT_STEREO;
mcc.cie.sbc_info.block_len = ESP_A2D_SBC_CIE_BLOCK_LEN_4 |
ESP_A2D_SBC_CIE_BLOCK_LEN_8 |
ESP_A2D_SBC_CIE_BLOCK_LEN_12 |
ESP_A2D_SBC_CIE_BLOCK_LEN_16;
mcc.cie.sbc_info.num_subbands = ESP_A2D_SBC_CIE_NUM_SUBBANDS_4 | ESP_A2D_SBC_CIE_NUM_SUBBANDS_8;
mcc.cie.sbc_info.alloc_mthd = ESP_A2D_SBC_CIE_ALLOC_MTHD_SNR | ESP_A2D_SBC_CIE_ALLOC_MTHD_LOUDNESS;
mcc.cie.sbc_info.max_bitpool = 250;
mcc.cie.sbc_info.min_bitpool = 2;
ESP_ERROR_CHECK(esp_a2d_sink_register_stream_endpoint(0, &mcc));
#endif
/* Get the default value of the delay value */
esp_a2d_sink_get_delay_value();
} else {
ESP_LOGI(BT_AV_TAG, "A2DP PROF STATE: Deinit Complete");
}
break;
}
/* others */
default:
ESP_LOGE(BT_AV_TAG, "%s unhandled event: %d", __func__, event);
break;
}
}
static void bt_app_a2d_cb(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param)
{
switch (event) {
case ESP_A2D_PROF_STATE_EVT:
case ESP_A2D_PROF_STATE_EVT: {
bt_app_work_dispatch(bt_app_a2d_evt_hdl, event, param, sizeof(esp_a2d_cb_param_t), NULL, NULL);
break;
}
case ESP_A2D_SNK_PSC_CFG_EVT:
case ESP_A2D_SNK_SET_DELAY_VALUE_EVT:
case ESP_A2D_SNK_GET_DELAY_VALUE_EVT: {
@@ -124,31 +171,9 @@ static void bt_av_hdl_stack_evt(uint16_t event, void *p_param)
#if CONFIG_EXAMPLE_A2DP_SINK_USE_EXTERNAL_CODEC == FALSE
esp_a2d_sink_register_data_callback(bt_app_a2d_data_cb);
#else
esp_a2d_mcc_t mcc = {0};
mcc.type = ESP_A2D_MCT_SBC;
mcc.cie.sbc_info.samp_freq = ESP_A2D_SBC_CIE_SF_16K |
ESP_A2D_SBC_CIE_SF_32K |
ESP_A2D_SBC_CIE_SF_44K |
ESP_A2D_SBC_CIE_SF_48K;
mcc.cie.sbc_info.ch_mode = ESP_A2D_SBC_CIE_CH_MODE_MONO |
ESP_A2D_SBC_CIE_CH_MODE_DUAL_CHANNEL |
ESP_A2D_SBC_CIE_CH_MODE_STEREO |
ESP_A2D_SBC_CIE_CH_MODE_JOINT_STEREO;
mcc.cie.sbc_info.block_len = ESP_A2D_SBC_CIE_BLOCK_LEN_4 |
ESP_A2D_SBC_CIE_BLOCK_LEN_8 |
ESP_A2D_SBC_CIE_BLOCK_LEN_12 |
ESP_A2D_SBC_CIE_BLOCK_LEN_16;
mcc.cie.sbc_info.num_subbands = ESP_A2D_SBC_CIE_NUM_SUBBANDS_4 | ESP_A2D_SBC_CIE_NUM_SUBBANDS_8;
mcc.cie.sbc_info.alloc_mthd = ESP_A2D_SBC_CIE_ALLOC_MTHD_SNR | ESP_A2D_SBC_CIE_ALLOC_MTHD_LOUDNESS;
mcc.cie.sbc_info.max_bitpool = 250;
mcc.cie.sbc_info.min_bitpool = 2;
/* register stream end point, only support SBC currently */
esp_a2d_sink_register_stream_endpoint(0, &mcc);
esp_a2d_sink_register_audio_data_callback(bt_app_a2d_audio_data_cb);
#endif
/* Get the default value of the delay value */
esp_a2d_sink_get_delay_value();
/* Get local device name */
esp_bt_gap_get_device_name();

View File

@@ -47,6 +47,7 @@ static void bt_app_dev_cb(esp_bt_dev_cb_event_t event, esp_bt_dev_cb_param_t *pa
static void bt_app_gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *param);
/* callback function for A2DP sink */
static void bt_app_a2d_evt_hdl(uint16_t event, void *param);
static void bt_app_a2d_cb(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param);
#if CONFIG_EXAMPLE_A2DP_SINK_STREAM_ENABLE
@@ -82,10 +83,59 @@ static void bt_app_gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *pa
bredr_app_gap_evt_def_hdl(event, param);
}
static void bt_app_a2d_evt_hdl(uint16_t event, void *param)
{
esp_a2d_cb_param_t *a2d = (esp_a2d_cb_param_t *)(param);
switch (event) {
/* when a2dp init or deinit completed, this event comes */
case ESP_A2D_PROF_STATE_EVT: {
if (ESP_A2D_INIT_SUCCESS == a2d->a2d_prof_stat.init_state) {
ESP_LOGI(BT_AV_TAG, "A2DP PROF STATE: Init Complete");
#if CONFIG_EXAMPLE_A2DP_SINK_STREAM_ENABLE
#if CONFIG_EXAMPLE_A2DP_SINK_USE_EXTERNAL_CODEC == TRUE
esp_a2d_mcc_t mcc = {0};
mcc.type = ESP_A2D_MCT_SBC;
mcc.cie.sbc_info.samp_freq = ESP_A2D_SBC_CIE_SF_16K |
ESP_A2D_SBC_CIE_SF_32K |
ESP_A2D_SBC_CIE_SF_44K |
ESP_A2D_SBC_CIE_SF_48K;
mcc.cie.sbc_info.ch_mode = ESP_A2D_SBC_CIE_CH_MODE_MONO |
ESP_A2D_SBC_CIE_CH_MODE_DUAL_CHANNEL |
ESP_A2D_SBC_CIE_CH_MODE_STEREO |
ESP_A2D_SBC_CIE_CH_MODE_JOINT_STEREO;
mcc.cie.sbc_info.block_len = ESP_A2D_SBC_CIE_BLOCK_LEN_4 |
ESP_A2D_SBC_CIE_BLOCK_LEN_8 |
ESP_A2D_SBC_CIE_BLOCK_LEN_12 |
ESP_A2D_SBC_CIE_BLOCK_LEN_16;
mcc.cie.sbc_info.num_subbands = ESP_A2D_SBC_CIE_NUM_SUBBANDS_4 | ESP_A2D_SBC_CIE_NUM_SUBBANDS_8;
mcc.cie.sbc_info.alloc_mthd = ESP_A2D_SBC_CIE_ALLOC_MTHD_SNR | ESP_A2D_SBC_CIE_ALLOC_MTHD_LOUDNESS;
mcc.cie.sbc_info.max_bitpool = 250;
mcc.cie.sbc_info.min_bitpool = 2;
ESP_ERROR_CHECK(esp_a2d_sink_register_stream_endpoint(0, &mcc));
#endif
#endif
/* Get the default value of the delay value */
esp_a2d_sink_get_delay_value();
} else {
ESP_LOGI(BT_AV_TAG, "A2DP PROF STATE: Deinit Complete");
}
break;
}
/* others */
default:
ESP_LOGE(BT_AV_TAG, "%s unhandled event: %d", __func__, event);
break;
}
}
static void bt_app_a2d_cb(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param)
{
switch (event) {
case ESP_A2D_PROF_STATE_EVT:
case ESP_A2D_PROF_STATE_EVT: {
bt_app_work_dispatch(bt_app_a2d_evt_hdl, event, param, sizeof(esp_a2d_cb_param_t), NULL, NULL);
break;
}
case ESP_A2D_SNK_PSC_CFG_EVT:
case ESP_A2D_SNK_SET_DELAY_VALUE_EVT:
case ESP_A2D_SNK_GET_DELAY_VALUE_EVT: {
@@ -194,32 +244,10 @@ static void bt_av_hdl_stack_evt(uint16_t event, void *p_param)
#if CONFIG_EXAMPLE_A2DP_SINK_USE_EXTERNAL_CODEC == FALSE
esp_a2d_sink_register_data_callback(bt_app_a2d_data_cb);
#else
esp_a2d_mcc_t mcc = {0};
mcc.type = ESP_A2D_MCT_SBC;
mcc.cie.sbc_info.samp_freq = ESP_A2D_SBC_CIE_SF_16K |
ESP_A2D_SBC_CIE_SF_32K |
ESP_A2D_SBC_CIE_SF_44K |
ESP_A2D_SBC_CIE_SF_48K;
mcc.cie.sbc_info.ch_mode = ESP_A2D_SBC_CIE_CH_MODE_MONO |
ESP_A2D_SBC_CIE_CH_MODE_DUAL_CHANNEL |
ESP_A2D_SBC_CIE_CH_MODE_STEREO |
ESP_A2D_SBC_CIE_CH_MODE_JOINT_STEREO;
mcc.cie.sbc_info.block_len = ESP_A2D_SBC_CIE_BLOCK_LEN_4 |
ESP_A2D_SBC_CIE_BLOCK_LEN_8 |
ESP_A2D_SBC_CIE_BLOCK_LEN_12 |
ESP_A2D_SBC_CIE_BLOCK_LEN_16;
mcc.cie.sbc_info.num_subbands = ESP_A2D_SBC_CIE_NUM_SUBBANDS_4 | ESP_A2D_SBC_CIE_NUM_SUBBANDS_8;
mcc.cie.sbc_info.alloc_mthd = ESP_A2D_SBC_CIE_ALLOC_MTHD_SNR | ESP_A2D_SBC_CIE_ALLOC_MTHD_LOUDNESS;
mcc.cie.sbc_info.max_bitpool = 250;
mcc.cie.sbc_info.min_bitpool = 2;
/* register stream end point, only support SBC currently */
esp_a2d_sink_register_stream_endpoint(0, &mcc);
esp_a2d_sink_register_audio_data_callback(bt_app_a2d_audio_data_cb);
#endif
#endif
/* Get the default value of the delay value */
esp_a2d_sink_get_delay_value();
/* Get local device name */
esp_bt_gap_get_device_name();

View File

@@ -13,6 +13,7 @@
#include "esp_log.h"
#include "esp_bt_device.h"
#include "esp_gap_bt_api.h"
#include "esp_a2dp_api.h"
#include "esp_avrc_api.h"
#include "freertos/FreeRTOS.h"
@@ -108,10 +109,59 @@ static void bt_app_avrc_ct_evt_hdl(uint16_t event, void *param)
* EXTERNAL FUNCTION DEFINITIONS
*******************************/
static void bt_app_a2d_evt_hdl(uint16_t event, void *param)
{
esp_a2d_cb_param_t *a2d = (esp_a2d_cb_param_t *)(param);
switch (event) {
/* when a2dp init or deinit completed, this event comes */
case ESP_A2D_PROF_STATE_EVT: {
if (ESP_A2D_INIT_SUCCESS == a2d->a2d_prof_stat.init_state) {
ESP_LOGI(BT_AV_TAG, "A2DP PROF STATE: Init Complete");
#if CONFIG_EXAMPLE_A2DP_SINK_STREAM_ENABLE
#if CONFIG_EXAMPLE_A2DP_SINK_USE_EXTERNAL_CODEC == TRUE
esp_a2d_mcc_t mcc = {0};
mcc.type = ESP_A2D_MCT_SBC;
mcc.cie.sbc_info.samp_freq = ESP_A2D_SBC_CIE_SF_16K |
ESP_A2D_SBC_CIE_SF_32K |
ESP_A2D_SBC_CIE_SF_44K |
ESP_A2D_SBC_CIE_SF_48K;
mcc.cie.sbc_info.ch_mode = ESP_A2D_SBC_CIE_CH_MODE_MONO |
ESP_A2D_SBC_CIE_CH_MODE_DUAL_CHANNEL |
ESP_A2D_SBC_CIE_CH_MODE_STEREO |
ESP_A2D_SBC_CIE_CH_MODE_JOINT_STEREO;
mcc.cie.sbc_info.block_len = ESP_A2D_SBC_CIE_BLOCK_LEN_4 |
ESP_A2D_SBC_CIE_BLOCK_LEN_8 |
ESP_A2D_SBC_CIE_BLOCK_LEN_12 |
ESP_A2D_SBC_CIE_BLOCK_LEN_16;
mcc.cie.sbc_info.num_subbands = ESP_A2D_SBC_CIE_NUM_SUBBANDS_4 | ESP_A2D_SBC_CIE_NUM_SUBBANDS_8;
mcc.cie.sbc_info.alloc_mthd = ESP_A2D_SBC_CIE_ALLOC_MTHD_SNR | ESP_A2D_SBC_CIE_ALLOC_MTHD_LOUDNESS;
mcc.cie.sbc_info.max_bitpool = 250;
mcc.cie.sbc_info.min_bitpool = 2;
ESP_ERROR_CHECK(esp_a2d_sink_register_stream_endpoint(0, &mcc));
#endif
#endif
/* Get the default value of the delay value */
esp_a2d_sink_get_delay_value();
} else {
ESP_LOGI(BT_AV_TAG, "A2DP PROF STATE: Deinit Complete");
}
break;
}
/* others */
default:
ESP_LOGE(BT_AV_TAG, "%s unhandled event: %d", __func__, event);
break;
}
}
void bt_app_a2d_cb(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param)
{
switch (event) {
case ESP_A2D_PROF_STATE_EVT:
case ESP_A2D_PROF_STATE_EVT: {
bt_app_work_dispatch(bt_app_a2d_evt_hdl, event, param, sizeof(esp_a2d_cb_param_t), NULL, NULL);
break;
}
case ESP_A2D_SNK_PSC_CFG_EVT:
case ESP_A2D_SNK_SET_DELAY_VALUE_EVT:
case ESP_A2D_SNK_GET_DELAY_VALUE_EVT: {

View File

@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Unlicense OR CC0-1.0
*/
@@ -79,32 +79,10 @@ static void bt_av_hdl_stack_evt(uint16_t event, void *p_param)
#if CONFIG_EXAMPLE_A2DP_SINK_USE_EXTERNAL_CODEC == FALSE
esp_a2d_sink_register_data_callback(bt_app_a2d_data_cb);
#else
esp_a2d_mcc_t mcc = {0};
mcc.type = ESP_A2D_MCT_SBC;
mcc.cie.sbc_info.samp_freq = ESP_A2D_SBC_CIE_SF_16K |
ESP_A2D_SBC_CIE_SF_32K |
ESP_A2D_SBC_CIE_SF_44K |
ESP_A2D_SBC_CIE_SF_48K;
mcc.cie.sbc_info.ch_mode = ESP_A2D_SBC_CIE_CH_MODE_MONO |
ESP_A2D_SBC_CIE_CH_MODE_DUAL_CHANNEL |
ESP_A2D_SBC_CIE_CH_MODE_STEREO |
ESP_A2D_SBC_CIE_CH_MODE_JOINT_STEREO;
mcc.cie.sbc_info.block_len = ESP_A2D_SBC_CIE_BLOCK_LEN_4 |
ESP_A2D_SBC_CIE_BLOCK_LEN_8 |
ESP_A2D_SBC_CIE_BLOCK_LEN_12 |
ESP_A2D_SBC_CIE_BLOCK_LEN_16;
mcc.cie.sbc_info.num_subbands = ESP_A2D_SBC_CIE_NUM_SUBBANDS_4 | ESP_A2D_SBC_CIE_NUM_SUBBANDS_8;
mcc.cie.sbc_info.alloc_mthd = ESP_A2D_SBC_CIE_ALLOC_MTHD_SNR | ESP_A2D_SBC_CIE_ALLOC_MTHD_LOUDNESS;
mcc.cie.sbc_info.max_bitpool = 250;
mcc.cie.sbc_info.min_bitpool = 2;
/* register stream end point, only support SBC currently */
esp_a2d_sink_register_stream_endpoint(0, &mcc);
esp_a2d_sink_register_audio_data_callback(bt_app_a2d_audio_data_cb);
#endif
#endif
/* Get the default value of the delay value */
esp_a2d_sink_get_delay_value();
/* Get local device name */
esp_bt_gap_get_device_name();

View File

@@ -47,6 +47,7 @@ static void bt_app_dev_cb(esp_bt_dev_cb_event_t event, esp_bt_dev_cb_param_t *pa
static void bt_app_gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *param);
/* callback function for A2DP sink */
static void bt_app_a2d_evt_hdl(uint16_t event, void *param);
static void bt_app_a2d_cb(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param);
#if CONFIG_EXAMPLE_A2DP_SINK_STREAM_ENABLE
@@ -85,10 +86,59 @@ static void bt_app_gap_cb(esp_bt_gap_cb_event_t event, esp_bt_gap_cb_param_t *pa
bredr_app_gap_evt_def_hdl(event, param);
}
static void bt_app_a2d_evt_hdl(uint16_t event, void *param)
{
esp_a2d_cb_param_t *a2d = (esp_a2d_cb_param_t *)(param);
switch (event) {
/* when a2dp init or deinit completed, this event comes */
case ESP_A2D_PROF_STATE_EVT: {
if (ESP_A2D_INIT_SUCCESS == a2d->a2d_prof_stat.init_state) {
ESP_LOGI(BT_AV_TAG, "A2DP PROF STATE: Init Complete");
#if CONFIG_EXAMPLE_A2DP_SINK_STREAM_ENABLE
#if CONFIG_EXAMPLE_A2DP_SINK_USE_EXTERNAL_CODEC == TRUE
esp_a2d_mcc_t mcc = {0};
mcc.type = ESP_A2D_MCT_SBC;
mcc.cie.sbc_info.samp_freq = ESP_A2D_SBC_CIE_SF_16K |
ESP_A2D_SBC_CIE_SF_32K |
ESP_A2D_SBC_CIE_SF_44K |
ESP_A2D_SBC_CIE_SF_48K;
mcc.cie.sbc_info.ch_mode = ESP_A2D_SBC_CIE_CH_MODE_MONO |
ESP_A2D_SBC_CIE_CH_MODE_DUAL_CHANNEL |
ESP_A2D_SBC_CIE_CH_MODE_STEREO |
ESP_A2D_SBC_CIE_CH_MODE_JOINT_STEREO;
mcc.cie.sbc_info.block_len = ESP_A2D_SBC_CIE_BLOCK_LEN_4 |
ESP_A2D_SBC_CIE_BLOCK_LEN_8 |
ESP_A2D_SBC_CIE_BLOCK_LEN_12 |
ESP_A2D_SBC_CIE_BLOCK_LEN_16;
mcc.cie.sbc_info.num_subbands = ESP_A2D_SBC_CIE_NUM_SUBBANDS_4 | ESP_A2D_SBC_CIE_NUM_SUBBANDS_8;
mcc.cie.sbc_info.alloc_mthd = ESP_A2D_SBC_CIE_ALLOC_MTHD_SNR | ESP_A2D_SBC_CIE_ALLOC_MTHD_LOUDNESS;
mcc.cie.sbc_info.max_bitpool = 250;
mcc.cie.sbc_info.min_bitpool = 2;
ESP_ERROR_CHECK(esp_a2d_sink_register_stream_endpoint(0, &mcc));
#endif
#endif
/* Get the default value of the delay value */
esp_a2d_sink_get_delay_value();
} else {
ESP_LOGI(BT_AV_TAG, "A2DP PROF STATE: Deinit Complete");
}
break;
}
/* others */
default:
ESP_LOGE(BT_AV_TAG, "%s unhandled event: %d", __func__, event);
break;
}
}
static void bt_app_a2d_cb(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param)
{
switch (event) {
case ESP_A2D_PROF_STATE_EVT:
case ESP_A2D_PROF_STATE_EVT: {
bt_app_work_dispatch(bt_app_a2d_evt_hdl, event, param, sizeof(esp_a2d_cb_param_t), NULL, NULL);
break;
}
case ESP_A2D_SNK_PSC_CFG_EVT:
case ESP_A2D_SNK_SET_DELAY_VALUE_EVT:
case ESP_A2D_SNK_GET_DELAY_VALUE_EVT: {
@@ -248,32 +298,10 @@ static void bt_av_hdl_stack_evt(uint16_t event, void *p_param)
#if CONFIG_EXAMPLE_A2DP_SINK_USE_EXTERNAL_CODEC == FALSE
esp_a2d_sink_register_data_callback(bt_app_a2d_data_cb);
#else
esp_a2d_mcc_t mcc = {0};
mcc.type = ESP_A2D_MCT_SBC;
mcc.cie.sbc_info.samp_freq = ESP_A2D_SBC_CIE_SF_16K |
ESP_A2D_SBC_CIE_SF_32K |
ESP_A2D_SBC_CIE_SF_44K |
ESP_A2D_SBC_CIE_SF_48K;
mcc.cie.sbc_info.ch_mode = ESP_A2D_SBC_CIE_CH_MODE_MONO |
ESP_A2D_SBC_CIE_CH_MODE_DUAL_CHANNEL |
ESP_A2D_SBC_CIE_CH_MODE_STEREO |
ESP_A2D_SBC_CIE_CH_MODE_JOINT_STEREO;
mcc.cie.sbc_info.block_len = ESP_A2D_SBC_CIE_BLOCK_LEN_4 |
ESP_A2D_SBC_CIE_BLOCK_LEN_8 |
ESP_A2D_SBC_CIE_BLOCK_LEN_12 |
ESP_A2D_SBC_CIE_BLOCK_LEN_16;
mcc.cie.sbc_info.num_subbands = ESP_A2D_SBC_CIE_NUM_SUBBANDS_4 | ESP_A2D_SBC_CIE_NUM_SUBBANDS_8;
mcc.cie.sbc_info.alloc_mthd = ESP_A2D_SBC_CIE_ALLOC_MTHD_SNR | ESP_A2D_SBC_CIE_ALLOC_MTHD_LOUDNESS;
mcc.cie.sbc_info.max_bitpool = 250;
mcc.cie.sbc_info.min_bitpool = 2;
/* register stream end point, only support SBC currently */
esp_a2d_sink_register_stream_endpoint(0, &mcc);
esp_a2d_sink_register_audio_data_callback(bt_app_a2d_audio_data_cb);
#endif
#endif
/* Get the default value of the delay value */
esp_a2d_sink_get_delay_value();
/* Get local device name */
esp_bt_gap_get_device_name();

View File

@@ -82,6 +82,30 @@ static void bt_app_avrc_ct_evt_hdl(uint16_t event, void *param)
}
}
/* handler for A2DP callback events */
static void bt_app_a2d_evt_hdl(uint16_t event, void *param)
{
esp_a2d_cb_param_t *a2d = (esp_a2d_cb_param_t *)(param);
switch (event) {
/* when a2dp init or deinit completed, this event comes */
case ESP_A2D_PROF_STATE_EVT: {
if (ESP_A2D_INIT_SUCCESS == a2d->a2d_prof_stat.init_state) {
ESP_LOGI(BT_AV_TAG, "A2DP PROF STATE: Init Complete");
/* Get the default value of the delay value */
esp_a2d_sink_get_delay_value();
} else {
ESP_LOGI(BT_AV_TAG, "A2DP PROF STATE: Deinit Complete");
}
break;
}
/* others */
default:
ESP_LOGE(BT_AV_TAG, "%s unhandled event: %d", __func__, event);
break;
}
}
/********************************
* EXTERNAL FUNCTION DEFINITIONS
*******************************/
@@ -89,13 +113,16 @@ static void bt_app_avrc_ct_evt_hdl(uint16_t event, void *param)
void bt_app_a2d_cb(esp_a2d_cb_event_t event, esp_a2d_cb_param_t *param)
{
switch (event) {
case ESP_A2D_PROF_STATE_EVT: {
bt_app_work_dispatch(bt_app_a2d_evt_hdl, event, param, sizeof(esp_a2d_cb_param_t), NULL, NULL);
break;
}
case ESP_A2D_CONNECTION_STATE_EVT:
case ESP_A2D_AUDIO_STATE_EVT:
case ESP_A2D_AUDIO_CFG_EVT: {
bt_app_work_dispatch(bt_a2d_evt_int_codec_hdl, event, param, sizeof(esp_a2d_cb_param_t), NULL, NULL);
break;
}
case ESP_A2D_PROF_STATE_EVT:
case ESP_A2D_SNK_PSC_CFG_EVT:
case ESP_A2D_SNK_SET_DELAY_VALUE_EVT:
case ESP_A2D_SNK_GET_DELAY_VALUE_EVT: {

View File

@@ -644,9 +644,6 @@ static void bt_av_hdl_stack_evt(uint16_t event, void *p_param)
esp_a2d_register_callback(&bt_app_a2d_cb);
esp_a2d_sink_register_data_callback(bt_app_a2d_data_cb);
/* Get the default value of the delay value */
esp_a2d_sink_get_delay_value();
/* set discoverable and connectable mode, wait to be connected */
esp_bt_gap_set_scan_mode(ESP_BT_CONNECTABLE, ESP_BT_GENERAL_DISCOVERABLE);
break;