component/bt: A2DP APIs refactor
1. change A2DP typedef and API prefixes 2. modify function audio configuration callback
This commit is contained in:
parent
5b120186f1
commit
859e2d5578
3 changed files with 88 additions and 96 deletions
|
@ -32,7 +32,7 @@ typedef union {
|
||||||
static void bt_stack_evt(tBT_APP_EVT event, tBT_APP_EVT_DATA *p_data);
|
static void bt_stack_evt(tBT_APP_EVT event, tBT_APP_EVT_DATA *p_data);
|
||||||
static void bt_stack_state_changed(bt_state_t state);
|
static void bt_stack_state_changed(bt_state_t state);
|
||||||
|
|
||||||
static bt_bdaddr_t peer_bd_addr = {{0x00, 0x1b, 0xdc, 0x08, 0x0f, 0xe7}};
|
// static bt_bdaddr_t peer_bd_addr = {{0x00, 0x1b, 0xdc, 0x08, 0x0f, 0xe7}};
|
||||||
|
|
||||||
static bt_callbacks_t bt_callbacks = {
|
static bt_callbacks_t bt_callbacks = {
|
||||||
bt_stack_state_changed
|
bt_stack_state_changed
|
||||||
|
@ -40,14 +40,14 @@ static bt_callbacks_t bt_callbacks = {
|
||||||
|
|
||||||
osi_alarm_t *app_alarm = NULL;
|
osi_alarm_t *app_alarm = NULL;
|
||||||
|
|
||||||
static void btav_conn_state_cb(esp_a2dp_connection_state_t state,
|
static void btav_conn_state_cb(esp_a2d_connection_state_t state,
|
||||||
esp_bd_addr_t *bd_addr)
|
esp_bd_addr_t *bd_addr)
|
||||||
{
|
{
|
||||||
LOG_ERROR("===esp_a2dp_conn_state_cb %d ===\n", state);
|
LOG_ERROR("===esp_a2dp_conn_state_cb %d ===\n", state);
|
||||||
(void) bd_addr;
|
(void) bd_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void btav_audio_state_cb(esp_a2dp_audio_state_t state, esp_bd_addr_t *bd_addr)
|
static void btav_audio_state_cb(esp_a2d_audio_state_t state, esp_bd_addr_t *bd_addr)
|
||||||
{
|
{
|
||||||
LOG_ERROR("===esp_a2dp_audio_state_cb %d ===\n", state);
|
LOG_ERROR("===esp_a2dp_audio_state_cb %d ===\n", state);
|
||||||
(void) bd_addr;
|
(void) bd_addr;
|
||||||
|
@ -59,7 +59,7 @@ static void btav_audio_cfg_cb(esp_bd_addr_t *bd_addr, uint32_t sample_rate, uint
|
||||||
(void) bd_addr;
|
(void) bd_addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static esp_a2dp_callbacks_t btav_cbs = {
|
static esp_a2d_callbacks_t btav_cbs = {
|
||||||
btav_conn_state_cb,
|
btav_conn_state_cb,
|
||||||
btav_audio_state_cb,
|
btav_audio_state_cb,
|
||||||
btav_audio_cfg_cb
|
btav_audio_cfg_cb
|
||||||
|
@ -92,7 +92,7 @@ static void bt_app_stack_evt(UINT16 event, char *p_param)
|
||||||
btav_set_device_class();
|
btav_set_device_class();
|
||||||
BTA_DmSetDeviceName(dev_name);
|
BTA_DmSetDeviceName(dev_name);
|
||||||
esp_bt_gap_set_scan_mode(BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE);
|
esp_bt_gap_set_scan_mode(BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE);
|
||||||
esp_a2dp_sink_init(&btav_cbs);
|
esp_a2d_sink_init(&btav_cbs);
|
||||||
// btif_av_get_sink_interface()->init(&btav_cbs);
|
// btif_av_get_sink_interface()->init(&btav_cbs);
|
||||||
|
|
||||||
// app_alarm = osi_alarm_new("app_alarm", bt_sdp_add_record_to, NULL, 1000, false);
|
// app_alarm = osi_alarm_new("app_alarm", bt_sdp_add_record_to, NULL, 1000, false);
|
||||||
|
|
|
@ -91,15 +91,10 @@ typedef struct {
|
||||||
uint16_t uuid;
|
uint16_t uuid;
|
||||||
} btif_av_connect_req_t;
|
} btif_av_connect_req_t;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int sample_rate;
|
|
||||||
int channel_count;
|
|
||||||
} btif_av_sink_config_req_t;
|
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
** Static variables
|
** Static variables
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
static esp_a2dp_callbacks_t *bt_av_sink_callbacks = NULL;
|
static esp_a2d_callbacks_t *bt_av_sink_callbacks = NULL;
|
||||||
|
|
||||||
static btif_av_cb_t btif_av_cb = {0};
|
static btif_av_cb_t btif_av_cb = {0};
|
||||||
// static TIMER_LIST_ENT tle_av_open_on_rc;
|
// static TIMER_LIST_ENT tle_av_open_on_rc;
|
||||||
|
@ -207,7 +202,7 @@ const char *dump_av_sm_event_name(btif_av_sm_event_t event)
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
** Static functions
|
** Static functions
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
static void btif_report_connection_state(esp_a2dp_connection_state_t state, bt_bdaddr_t *bd_addr)
|
static void btif_report_connection_state(esp_a2d_connection_state_t state, bt_bdaddr_t *bd_addr)
|
||||||
{
|
{
|
||||||
if (bt_av_sink_callbacks != NULL) {
|
if (bt_av_sink_callbacks != NULL) {
|
||||||
esp_bd_addr_t remote_bda;
|
esp_bd_addr_t remote_bda;
|
||||||
|
@ -220,7 +215,7 @@ static void btif_report_connection_state(esp_a2dp_connection_state_t state, bt_b
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void btif_report_audio_state(esp_a2dp_audio_state_t state, bt_bdaddr_t *bd_addr)
|
static void btif_report_audio_state(esp_a2d_audio_state_t state, bt_bdaddr_t *bd_addr)
|
||||||
{
|
{
|
||||||
if (bt_av_sink_callbacks != NULL) {
|
if (bt_av_sink_callbacks != NULL) {
|
||||||
esp_bd_addr_t remote_bda;
|
esp_bd_addr_t remote_bda;
|
||||||
|
@ -320,7 +315,7 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case BTIF_SM_ENTER_EVT:
|
case BTIF_SM_ENTER_EVT:
|
||||||
/* inform the application that we are entering connecting state */
|
/* inform the application that we are entering connecting state */
|
||||||
btif_report_connection_state(ESP_A2DP_CONNECTION_STATE_CONNECTING, &(btif_av_cb.peer_bda));
|
btif_report_connection_state(ESP_A2D_CONNECTION_STATE_CONNECTING, &(btif_av_cb.peer_bda));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BTIF_SM_EXIT_EVT:
|
case BTIF_SM_EXIT_EVT:
|
||||||
|
@ -328,19 +323,19 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
|
||||||
|
|
||||||
case BTA_AV_REJECT_EVT:
|
case BTA_AV_REJECT_EVT:
|
||||||
BTIF_TRACE_DEBUG(" Received BTA_AV_REJECT_EVT \n");
|
BTIF_TRACE_DEBUG(" Received BTA_AV_REJECT_EVT \n");
|
||||||
btif_report_connection_state(ESP_A2DP_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
|
btif_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
|
||||||
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
|
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BTA_AV_OPEN_EVT: {
|
case BTA_AV_OPEN_EVT: {
|
||||||
tBTA_AV *p_bta_data = (tBTA_AV *)p_data;
|
tBTA_AV *p_bta_data = (tBTA_AV *)p_data;
|
||||||
esp_a2dp_connection_state_t state;
|
esp_a2d_connection_state_t state;
|
||||||
btif_sm_state_t av_state;
|
btif_sm_state_t av_state;
|
||||||
BTIF_TRACE_DEBUG("status:%d, edr 0x%x\n", p_bta_data->open.status,
|
BTIF_TRACE_DEBUG("status:%d, edr 0x%x\n", p_bta_data->open.status,
|
||||||
p_bta_data->open.edr);
|
p_bta_data->open.edr);
|
||||||
|
|
||||||
if (p_bta_data->open.status == BTA_AV_SUCCESS) {
|
if (p_bta_data->open.status == BTA_AV_SUCCESS) {
|
||||||
state = ESP_A2DP_CONNECTION_STATE_CONNECTED;
|
state = ESP_A2D_CONNECTION_STATE_CONNECTED;
|
||||||
av_state = BTIF_AV_STATE_OPENED;
|
av_state = BTIF_AV_STATE_OPENED;
|
||||||
btif_av_cb.edr = p_bta_data->open.edr;
|
btif_av_cb.edr = p_bta_data->open.edr;
|
||||||
|
|
||||||
|
@ -349,7 +344,7 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
|
||||||
} else {
|
} else {
|
||||||
BTIF_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d\n",
|
BTIF_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d\n",
|
||||||
p_bta_data->open.status );
|
p_bta_data->open.status );
|
||||||
state = ESP_A2DP_CONNECTION_STATE_DISCONNECTED;
|
state = ESP_A2D_CONNECTION_STATE_DISCONNECTED;
|
||||||
av_state = BTIF_AV_STATE_IDLE;
|
av_state = BTIF_AV_STATE_IDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -373,17 +368,14 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case BTIF_AV_SINK_CONFIG_REQ_EVT: {
|
case BTIF_AV_SINK_CONFIG_REQ_EVT: {
|
||||||
btif_av_sink_config_req_t req;
|
esp_a2d_mcc_t mcc;
|
||||||
// copy to avoid alignment problems
|
// copy to avoid alignment problems
|
||||||
memcpy(&req, p_data, sizeof(req));
|
memcpy(&mcc, p_data, sizeof(mcc));
|
||||||
|
BTIF_TRACE_DEBUG("BTIF_AV_SINK_CONFIG_REQ_EVT SBC 0x%x %x %x %x\n", mcc.cie.sbc.oct[0], mcc.cie.sbc.oct[1], mcc.cie.sbc.oct[2], mcc.cie.sbc.oct[3]);
|
||||||
BTIF_TRACE_WARNING("BTIF_AV_SINK_CONFIG_REQ_EVT %d %d\n", req.sample_rate,
|
|
||||||
req.channel_count);
|
|
||||||
if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) {
|
if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) {
|
||||||
esp_bd_addr_t remote_bda;
|
esp_bd_addr_t remote_bda;
|
||||||
memcpy(&remote_bda, &btif_av_cb.peer_bda, sizeof(esp_bd_addr_t));
|
memcpy(&remote_bda, &btif_av_cb.peer_bda, sizeof(esp_bd_addr_t));
|
||||||
HAL_CBACK(bt_av_sink_callbacks, audio_config_cb, &remote_bda,
|
HAL_CBACK(bt_av_sink_callbacks, audio_config_cb, &remote_bda, &mcc);
|
||||||
req.sample_rate, req.channel_count);
|
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
@ -396,7 +388,7 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
BTIF_TRACE_DEBUG("%s: Moved from idle by Incoming Connection request\n", __func__);
|
BTIF_TRACE_DEBUG("%s: Moved from idle by Incoming Connection request\n", __func__);
|
||||||
btif_report_connection_state(ESP_A2DP_CONNECTION_STATE_DISCONNECTED, (bt_bdaddr_t *)p_data);
|
btif_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, (bt_bdaddr_t *)p_data);
|
||||||
btif_queue_advance();
|
btif_queue_advance();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -476,7 +468,7 @@ static BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *p_data
|
||||||
case BTA_AV_CLOSE_EVT:
|
case BTA_AV_CLOSE_EVT:
|
||||||
|
|
||||||
/* inform the application that we are disconnecting */
|
/* inform the application that we are disconnecting */
|
||||||
btif_report_connection_state(ESP_A2DP_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
|
btif_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
|
||||||
|
|
||||||
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
|
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
|
||||||
break;
|
break;
|
||||||
|
@ -594,7 +586,7 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data)
|
||||||
BTA_AvClose(btif_av_cb.bta_handle);
|
BTA_AvClose(btif_av_cb.bta_handle);
|
||||||
|
|
||||||
/* inform the application that we are disconnecting */
|
/* inform the application that we are disconnecting */
|
||||||
btif_report_connection_state(ESP_A2DP_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
|
btif_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BTA_AV_CLOSE_EVT:
|
case BTA_AV_CLOSE_EVT:
|
||||||
|
@ -602,7 +594,7 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data)
|
||||||
btif_a2dp_on_stopped(NULL);
|
btif_a2dp_on_stopped(NULL);
|
||||||
|
|
||||||
/* inform the application that we are disconnected */
|
/* inform the application that we are disconnected */
|
||||||
btif_report_connection_state(ESP_A2DP_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
|
btif_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
|
||||||
|
|
||||||
/* change state to idle, send acknowledgement if start is pending */
|
/* change state to idle, send acknowledgement if start is pending */
|
||||||
if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) {
|
if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) {
|
||||||
|
@ -629,7 +621,7 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data)
|
||||||
BTIF_TRACE_DEBUG("%s: Ignore BTIF_AV_CONNECT_REQ_EVT for same device\n", __func__);
|
BTIF_TRACE_DEBUG("%s: Ignore BTIF_AV_CONNECT_REQ_EVT for same device\n", __func__);
|
||||||
} else {
|
} else {
|
||||||
BTIF_TRACE_DEBUG("%s: Moved to opened by Other Incoming Conn req\n", __func__);
|
BTIF_TRACE_DEBUG("%s: Moved to opened by Other Incoming Conn req\n", __func__);
|
||||||
btif_report_connection_state(ESP_A2DP_CONNECTION_STATE_DISCONNECTED,
|
btif_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED,
|
||||||
(bt_bdaddr_t *)p_data);
|
(bt_bdaddr_t *)p_data);
|
||||||
}
|
}
|
||||||
btif_queue_advance();
|
btif_queue_advance();
|
||||||
|
@ -669,7 +661,7 @@ static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data
|
||||||
/* we are again in started state, clear any remote suspend flags */
|
/* we are again in started state, clear any remote suspend flags */
|
||||||
btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
|
btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
|
||||||
|
|
||||||
btif_report_audio_state(ESP_A2DP_AUDIO_STATE_STARTED, &(btif_av_cb.peer_bda));
|
btif_report_audio_state(ESP_A2D_AUDIO_STATE_STARTED, &(btif_av_cb.peer_bda));
|
||||||
|
|
||||||
/* increase the a2dp consumer task priority temporarily when start
|
/* increase the a2dp consumer task priority temporarily when start
|
||||||
** audio playing, to avoid overflow the audio packet queue. */
|
** audio playing, to avoid overflow the audio packet queue. */
|
||||||
|
@ -723,7 +715,7 @@ static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data
|
||||||
BTA_AvClose(btif_av_cb.bta_handle);
|
BTA_AvClose(btif_av_cb.bta_handle);
|
||||||
|
|
||||||
/* inform the application that we are disconnecting */
|
/* inform the application that we are disconnecting */
|
||||||
btif_report_connection_state(ESP_A2DP_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
|
btif_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
|
||||||
|
|
||||||
/* wait in closing state until fully closed */
|
/* wait in closing state until fully closed */
|
||||||
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_CLOSING);
|
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_CLOSING);
|
||||||
|
@ -759,9 +751,9 @@ static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data
|
||||||
btif_av_cb.flags |= BTIF_AV_FLAG_REMOTE_SUSPEND;
|
btif_av_cb.flags |= BTIF_AV_FLAG_REMOTE_SUSPEND;
|
||||||
}
|
}
|
||||||
|
|
||||||
btif_report_audio_state(ESP_A2DP_AUDIO_STATE_REMOTE_SUSPEND, &(btif_av_cb.peer_bda));
|
btif_report_audio_state(ESP_A2D_AUDIO_STATE_REMOTE_SUSPEND, &(btif_av_cb.peer_bda));
|
||||||
} else {
|
} else {
|
||||||
btif_report_audio_state(ESP_A2DP_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
|
btif_report_audio_state(ESP_A2D_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
|
||||||
}
|
}
|
||||||
|
|
||||||
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENED);
|
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENED);
|
||||||
|
@ -775,7 +767,7 @@ static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data
|
||||||
btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP;
|
btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP;
|
||||||
btif_a2dp_on_stopped(&p_av->suspend);
|
btif_a2dp_on_stopped(&p_av->suspend);
|
||||||
|
|
||||||
btif_report_audio_state(ESP_A2DP_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
|
btif_report_audio_state(ESP_A2D_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
|
||||||
|
|
||||||
/* if stop was successful, change state to open */
|
/* if stop was successful, change state to open */
|
||||||
if (p_av->suspend.status == BTA_AV_SUCCESS) {
|
if (p_av->suspend.status == BTA_AV_SUCCESS) {
|
||||||
|
@ -792,7 +784,7 @@ static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data
|
||||||
btif_a2dp_on_stopped(NULL);
|
btif_a2dp_on_stopped(NULL);
|
||||||
|
|
||||||
/* inform the application that we are disconnected */
|
/* inform the application that we are disconnected */
|
||||||
btif_report_connection_state(ESP_A2DP_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
|
btif_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
|
||||||
|
|
||||||
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
|
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
|
||||||
break;
|
break;
|
||||||
|
@ -891,7 +883,7 @@ static void bte_av_media_callback(tBTA_AV_EVT event, tBTA_AV_MEDIA *p_data)
|
||||||
UINT8 que_len;
|
UINT8 que_len;
|
||||||
tA2D_STATUS a2d_status;
|
tA2D_STATUS a2d_status;
|
||||||
tA2D_SBC_CIE sbc_cie;
|
tA2D_SBC_CIE sbc_cie;
|
||||||
btif_av_sink_config_req_t config_req;
|
esp_a2d_mcc_t mcc;
|
||||||
|
|
||||||
if (event == BTA_AV_MEDIA_DATA_EVT) { /* Switch to BTIF_MEDIA context */
|
if (event == BTA_AV_MEDIA_DATA_EVT) { /* Switch to BTIF_MEDIA context */
|
||||||
state = btif_sm_get_state(btif_av_cb.sm_handle);
|
state = btif_sm_get_state(btif_av_cb.sm_handle);
|
||||||
|
@ -908,13 +900,14 @@ static void bte_av_media_callback(tBTA_AV_EVT event, tBTA_AV_MEDIA *p_data)
|
||||||
/* send a command to BT Media Task */
|
/* send a command to BT Media Task */
|
||||||
btif_reset_decoder((UINT8 *)p_data);
|
btif_reset_decoder((UINT8 *)p_data);
|
||||||
|
|
||||||
|
/* currently only supportes SBC */
|
||||||
a2d_status = A2D_ParsSbcInfo(&sbc_cie, (UINT8 *)p_data, FALSE);
|
a2d_status = A2D_ParsSbcInfo(&sbc_cie, (UINT8 *)p_data, FALSE);
|
||||||
if (a2d_status == A2D_SUCCESS) {
|
if (a2d_status == A2D_SUCCESS) {
|
||||||
|
mcc.type = ESP_A2D_MCT_SBC;
|
||||||
|
memcpy(&mcc.cie, (uint8_t *)p_data + 3, ESP_A2D_CIE_LEN_SBC);
|
||||||
/* Switch to BTIF context */
|
/* Switch to BTIF context */
|
||||||
config_req.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq);
|
|
||||||
config_req.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode);
|
|
||||||
btif_transfer_context(btif_av_handle_event, BTIF_AV_SINK_CONFIG_REQ_EVT,
|
btif_transfer_context(btif_av_handle_event, BTIF_AV_SINK_CONFIG_REQ_EVT,
|
||||||
(char *)&config_req, sizeof(config_req), NULL);
|
(char *)&mcc, sizeof(mcc), NULL);
|
||||||
} else {
|
} else {
|
||||||
APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d\n", a2d_status);
|
APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d\n", a2d_status);
|
||||||
}
|
}
|
||||||
|
@ -985,7 +978,7 @@ static bt_status_t init_src(btav_callbacks_t *callbacks)
|
||||||
** Returns bt_status_t
|
** Returns bt_status_t
|
||||||
**
|
**
|
||||||
*******************************************************************************/
|
*******************************************************************************/
|
||||||
esp_err_t esp_a2dp_sink_init(esp_a2dp_callbacks_t *callbacks)
|
esp_err_t esp_a2d_sink_init(esp_a2d_callbacks_t *callbacks)
|
||||||
// static bt_status_t init_sink(btav_callbacks_t *callbacks)
|
// static bt_status_t init_sink(btav_callbacks_t *callbacks)
|
||||||
{
|
{
|
||||||
BTIF_TRACE_EVENT("%s()\n", __func__);
|
BTIF_TRACE_EVENT("%s()\n", __func__);
|
||||||
|
@ -1030,7 +1023,7 @@ static bt_status_t src_connect_sink(bt_bdaddr_t *bd_addr)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
esp_err_t esp_a2dp_sink_connect(esp_bd_addr_t *remote_bda)
|
esp_err_t esp_a2d_sink_connect(esp_bd_addr_t *remote_bda)
|
||||||
// static bt_status_t sink_connect_src(bt_bdaddr_t *bd_addr)
|
// static bt_status_t sink_connect_src(bt_bdaddr_t *bd_addr)
|
||||||
{
|
{
|
||||||
BTIF_TRACE_EVENT("%s\n", __FUNCTION__);
|
BTIF_TRACE_EVENT("%s\n", __FUNCTION__);
|
||||||
|
@ -1064,7 +1057,7 @@ static bt_status_t disconnect(bt_bdaddr_t *bd_addr)
|
||||||
(char *)bd_addr, sizeof(bt_bdaddr_t), NULL);
|
(char *)bd_addr, sizeof(bt_bdaddr_t), NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
esp_err_t esp_a2dp_sink_disconnect(esp_bd_addr_t *remote_bda)
|
esp_err_t esp_a2d_sink_disconnect(esp_bd_addr_t *remote_bda)
|
||||||
{
|
{
|
||||||
bt_status_t stat;
|
bt_status_t stat;
|
||||||
bt_bdaddr_t bd_addr;
|
bt_bdaddr_t bd_addr;
|
||||||
|
@ -1115,7 +1108,7 @@ static void cleanup_src(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void esp_a2dp_sink_deinit(void)
|
void esp_a2d_sink_deinit(void)
|
||||||
{
|
{
|
||||||
BTIF_TRACE_EVENT("%s\n", __FUNCTION__);
|
BTIF_TRACE_EVENT("%s\n", __FUNCTION__);
|
||||||
|
|
||||||
|
|
|
@ -4,88 +4,87 @@
|
||||||
#include "esp_err.h"
|
#include "esp_err.h"
|
||||||
#include "esp_bt_defs.h"
|
#include "esp_bt_defs.h"
|
||||||
|
|
||||||
/* Codec types */
|
/* Media codec types */
|
||||||
#define ESP_A2DP_CODEC_SBC (0)
|
#define ESP_A2D_MCT_SBC (0)
|
||||||
#define ESP_A2DP_CODEC_M12 (0x01)
|
#define ESP_A2D_MCT_M12 (0x01)
|
||||||
#define ESP_A2DP_CODEC_M24 (0x02)
|
#define ESP_A2D_MCT_M24 (0x02)
|
||||||
#define ESP_A2DP_CODEC_ATRAC (0x04)
|
#define ESP_A2D_MCT_ATRAC (0x04)
|
||||||
#define ESP_A2DP_CODEC_NON_A2DP (0xff)
|
#define ESP_A2D_MCT_NON_A2DP (0xff)
|
||||||
typedef uint8_t esp_a2dp_codec_type_t;
|
typedef uint8_t esp_a2d_mct_t;
|
||||||
|
|
||||||
/* codec specific information element */
|
/* codec specific information element */
|
||||||
typedef struct {
|
#define ESP_A2D_CIE_LEN_SBC (4)
|
||||||
uint8_t oct[4];
|
#define ESP_A2D_CIE_LEN_M12 (4)
|
||||||
} esp_sbc_cie_t;
|
#define ESP_A2D_CIE_LEN_M24 (6)
|
||||||
|
#define ESP_A2D_CIE_LEN_ATRAC (7)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t oct[4];
|
uint8_t oct[ESP_A2D_CIE_LEN_SBC];
|
||||||
} esp_mpeg12_audio_cie_t;
|
} esp_a2d_cie_sbc_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t oct[6];
|
uint8_t oct[ESP_A2D_CIE_LEN_M12];
|
||||||
} esp_mpeg24_aac_cie_t;
|
} esp_a2d_cie_m12_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint8_t oct[7];
|
uint8_t oct[ESP_A2D_CIE_LEN_M24];
|
||||||
} esp_atrac_cie_t;
|
} esp_a2d_cie_m24_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
esp_a2dp_codec_type_t type; /* A2DP codec type*/
|
uint8_t oct[ESP_A2D_CIE_LEN_ATRAC];
|
||||||
|
} esp_a2d_cie_atrac_t;
|
||||||
|
|
||||||
|
/* media codec capabilities */
|
||||||
|
typedef struct {
|
||||||
|
esp_a2d_mct_t type; /* A2DP media codec type*/
|
||||||
union {
|
union {
|
||||||
esp_sbc_cie_t sbc;
|
esp_a2d_cie_sbc_t sbc;
|
||||||
esp_mpeg12_audio_cie_t mpeg12;
|
esp_a2d_cie_m12_t m12;
|
||||||
esp_mpeg24_aac_cie_t mpeg24;
|
esp_a2d_cie_m24_t m24;
|
||||||
esp_atrac_cie_t atrac;
|
esp_a2d_cie_atrac_t atrac;
|
||||||
} cie;
|
} cie;
|
||||||
} esp_a2dp_codec_cfg_t;
|
} esp_a2d_mcc_t;
|
||||||
|
|
||||||
/* Bluetooth A2DP connection states */
|
/* Bluetooth A2DP connection states */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ESP_A2DP_CONNECTION_STATE_DISCONNECTED = 0,
|
ESP_A2D_CONNECTION_STATE_DISCONNECTED = 0,
|
||||||
ESP_A2DP_CONNECTION_STATE_CONNECTING,
|
ESP_A2D_CONNECTION_STATE_CONNECTING,
|
||||||
ESP_A2DP_CONNECTION_STATE_CONNECTED,
|
ESP_A2D_CONNECTION_STATE_CONNECTED,
|
||||||
ESP_A2DP_CONNECTION_STATE_DISCONNECTING
|
ESP_A2D_CONNECTION_STATE_DISCONNECTING
|
||||||
} esp_a2dp_connection_state_t;
|
} esp_a2d_connection_state_t;
|
||||||
|
|
||||||
/* Bluetooth A2DP datapath states */
|
/* Bluetooth A2DP datapath states */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
ESP_A2DP_AUDIO_STATE_REMOTE_SUSPEND = 0,
|
ESP_A2D_AUDIO_STATE_REMOTE_SUSPEND = 0,
|
||||||
ESP_A2DP_AUDIO_STATE_STOPPED,
|
ESP_A2D_AUDIO_STATE_STOPPED,
|
||||||
ESP_A2DP_AUDIO_STATE_STARTED,
|
ESP_A2D_AUDIO_STATE_STARTED,
|
||||||
} esp_a2dp_audio_state_t;
|
} esp_a2d_audio_state_t;
|
||||||
|
|
||||||
/** Callback for connection state change.
|
/** Callback for connection state change.
|
||||||
* state will have one of the values from btav_connection_state_t
|
* state will have one of the values from btav_connection_state_t
|
||||||
*/
|
*/
|
||||||
typedef void (* esp_a2dp_connection_state_cb_t)(esp_a2dp_connection_state_t state,
|
typedef void (* esp_a2d_connection_state_cb_t)(esp_a2d_connection_state_t state,
|
||||||
esp_bd_addr_t *remote_bda);
|
esp_bd_addr_t *remote_bda);
|
||||||
|
|
||||||
/** Callback for audiopath state change.
|
/** Callback for audiopath state change.
|
||||||
* state will have one of the values from btav_audio_state_t
|
* state will have one of the values from btav_audio_state_t
|
||||||
*/
|
*/
|
||||||
typedef void (* esp_a2dp_audio_state_cb_t)(esp_a2dp_audio_state_t state,
|
typedef void (* esp_a2d_audio_state_cb_t)(esp_a2d_audio_state_t state,
|
||||||
esp_bd_addr_t *remote_bda);
|
esp_bd_addr_t *remote_bda);
|
||||||
|
|
||||||
/** Callback for audio configuration change.
|
/** Callback for audio configuration change.
|
||||||
* Used only for the A2DP sink interface.
|
* Used only for the A2DP sink interface.
|
||||||
* state will have one of the values from btav_audio_state_t
|
* state will have one of the values from btav_audio_state_t
|
||||||
* sample_rate: sample rate in Hz
|
|
||||||
* channel_count: number of channels (1 for mono, 2 for stereo)
|
|
||||||
*/
|
*/
|
||||||
/*
|
typedef void (* esp_a2d_audio_config_cb_t)(esp_bd_addr_t *remote_bda,
|
||||||
typedef void (* esp_a2dp_audio_config_cb_t)(esp_bd_addr_t *remote_bda,
|
esp_a2d_mcc_t *mcc);
|
||||||
esp_a2dp_codec_cfg_t *cfg);
|
|
||||||
*/
|
|
||||||
typedef void (* esp_a2dp_audio_config_cb_t)(esp_bd_addr_t *remote_bda,
|
|
||||||
uint32_t sample_rate, uint8_t channel_count); // TODO: to be modified
|
|
||||||
|
|
||||||
/** BT-a2dp callback structure. */
|
/** BT-a2dp callback structure. */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
esp_a2dp_connection_state_cb_t connection_state_cb;
|
esp_a2d_connection_state_cb_t connection_state_cb;
|
||||||
esp_a2dp_audio_state_cb_t audio_state_cb;
|
esp_a2d_audio_state_cb_t audio_state_cb;
|
||||||
esp_a2dp_audio_config_cb_t audio_config_cb;
|
esp_a2d_audio_config_cb_t audio_config_cb;
|
||||||
} esp_a2dp_callbacks_t;
|
} esp_a2d_callbacks_t;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* NOTE:
|
* NOTE:
|
||||||
|
@ -98,19 +97,19 @@ typedef struct {
|
||||||
void (* close)(void);
|
void (* close)(void);
|
||||||
int (* ioctl)(int cmd, void *param); // not used for now
|
int (* ioctl)(int cmd, void *param); // not used for now
|
||||||
uint32_t (* write)(uint8_t *buf, uint32_t len);
|
uint32_t (* write)(uint8_t *buf, uint32_t len);
|
||||||
} esp_a2dp_sink_audio_hal_t;
|
} esp_a2d_sink_audio_hal_t;
|
||||||
|
|
||||||
#define ESP_A2DP_AUDIO_HAL_IOC_WRITE_FLUSH (1) // ioctl command, which is not used for now
|
#define ESP_A2D_AUDIO_HAL_IOC_WRITE_FLUSH (1) // ioctl command, which is not used for now
|
||||||
|
|
||||||
|
|
||||||
/** Represents the A2DP sink interface.
|
/** Represents the A2DP sink interface.
|
||||||
*/
|
*/
|
||||||
esp_err_t esp_a2dp_sink_init(esp_a2dp_callbacks_t *callbacks);
|
esp_err_t esp_a2d_sink_init(esp_a2d_callbacks_t *callbacks);
|
||||||
|
|
||||||
esp_err_t esp_a2dp_sink_connect(esp_bd_addr_t *remote_bda);
|
esp_err_t esp_a2d_sink_connect(esp_bd_addr_t *remote_bda);
|
||||||
|
|
||||||
esp_err_t esp_a2dp_sink_disconnect(esp_bd_addr_t *remote_bda);
|
esp_err_t esp_a2d_sink_disconnect(esp_bd_addr_t *remote_bda);
|
||||||
|
|
||||||
void esp_a2dp_sink_deinit(void);
|
void esp_a2d_sink_deinit(void);
|
||||||
|
|
||||||
#endif /* __ESP_A2DP_API_H__ */
|
#endif /* __ESP_A2DP_API_H__ */
|
||||||
|
|
Loading…
Reference in a new issue