|
|
@@ -42,6 +42,13 @@
|
|
|
|
|
|
#if BTC_AV_INCLUDED
|
|
|
|
|
|
+// global variable to inidcate avrc is initialized with a2dp
|
|
|
+bool g_av_with_rc;
|
|
|
+// global variable to indicate a2dp is initialized
|
|
|
+bool g_a2dp_on_init;
|
|
|
+// global variable to indicate a2dp is deinitialized
|
|
|
+bool g_a2dp_on_deinit;
|
|
|
+
|
|
|
/*****************************************************************************
|
|
|
** Constants & Macros
|
|
|
******************************************************************************/
|
|
|
@@ -86,6 +93,10 @@ typedef struct {
|
|
|
uint16_t uuid;
|
|
|
} btc_av_connect_req_t;
|
|
|
|
|
|
+typedef struct {
|
|
|
+ bt_bdaddr_t target_bda;
|
|
|
+} btc_av_disconn_req_t;
|
|
|
+
|
|
|
/*****************************************************************************
|
|
|
** Static variables
|
|
|
******************************************************************************/
|
|
|
@@ -284,7 +295,7 @@ static void btc_report_audio_state(esp_a2d_audio_state_t state, bt_bdaddr_t *bd_
|
|
|
|
|
|
static BOOLEAN btc_av_state_idle_handler(btc_sm_event_t event, void *p_data)
|
|
|
{
|
|
|
- BTC_TRACE_DEBUG("%s event:%s flags %x\n", __FUNCTION__,
|
|
|
+ BTC_TRACE_DEBUG("%s event: %s flags %x\n", __FUNCTION__,
|
|
|
dump_av_sm_event_name(event), btc_av_cb.flags);
|
|
|
|
|
|
switch (event) {
|
|
|
@@ -309,20 +320,34 @@ static BOOLEAN btc_av_state_idle_handler(btc_sm_event_t event, void *p_data)
|
|
|
case BTA_AV_PENDING_EVT:
|
|
|
case BTC_AV_CONNECT_REQ_EVT: {
|
|
|
if (event == BTC_AV_CONNECT_REQ_EVT) {
|
|
|
- memcpy(&btc_av_cb.peer_bda, &((btc_av_connect_req_t *)p_data)->target_bda,
|
|
|
- sizeof(bt_bdaddr_t));
|
|
|
- BTA_AvOpen(btc_av_cb.peer_bda.address, btc_av_cb.bta_handle,
|
|
|
- TRUE, BTA_SEC_AUTHENTICATE, ((btc_av_connect_req_t *)p_data)->uuid);
|
|
|
+ memcpy(&btc_av_cb.peer_bda, &((btc_av_connect_req_t *)p_data)->target_bda, sizeof(bt_bdaddr_t));
|
|
|
+ if (g_av_with_rc) {
|
|
|
+ BTA_AvOpen(btc_av_cb.peer_bda.address, btc_av_cb.bta_handle,
|
|
|
+ TRUE, BTA_SEC_AUTHENTICATE, ((btc_av_connect_req_t *)p_data)->uuid);
|
|
|
+ } else {
|
|
|
+ BTA_AvOpen(btc_av_cb.peer_bda.address, btc_av_cb.bta_handle,
|
|
|
+ FALSE, BTA_SEC_AUTHENTICATE, ((btc_av_connect_req_t *)p_data)->uuid);
|
|
|
+ }
|
|
|
} else if (event == BTA_AV_PENDING_EVT) {
|
|
|
bdcpy(btc_av_cb.peer_bda.address, ((tBTA_AV *)p_data)->pend.bd_addr);
|
|
|
- UINT16 uuid = (btc_av_cb.service_id == BTA_A2DP_SOURCE_SERVICE_ID) ? UUID_SERVCLASS_AUDIO_SOURCE :
|
|
|
- UUID_SERVCLASS_AUDIO_SINK;
|
|
|
- BTA_AvOpen(btc_av_cb.peer_bda.address, btc_av_cb.bta_handle,
|
|
|
- TRUE, BTA_SEC_AUTHENTICATE, uuid);
|
|
|
+ UINT16 uuid = (btc_av_cb.service_id == BTA_A2DP_SOURCE_SERVICE_ID) ? UUID_SERVCLASS_AUDIO_SOURCE : UUID_SERVCLASS_AUDIO_SINK;
|
|
|
+ if (g_av_with_rc) {
|
|
|
+ BTA_AvOpen(btc_av_cb.peer_bda.address, btc_av_cb.bta_handle,
|
|
|
+ TRUE, BTA_SEC_AUTHENTICATE, uuid);
|
|
|
+ } else {
|
|
|
+ BTA_AvOpen(btc_av_cb.peer_bda.address, btc_av_cb.bta_handle,
|
|
|
+ FALSE, BTA_SEC_AUTHENTICATE, uuid);
|
|
|
+ }
|
|
|
}
|
|
|
btc_sm_change_state(btc_av_cb.sm_handle, BTC_AV_STATE_OPENING);
|
|
|
} break;
|
|
|
|
|
|
+
|
|
|
+ case BTC_AV_DISCONNECT_REQ_EVT:
|
|
|
+ BTC_TRACE_WARNING("No Link At All.");
|
|
|
+ btc_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, &((btc_av_disconn_req_t *)p_data)->target_bda, 0);
|
|
|
+ break;
|
|
|
+
|
|
|
case BTA_AV_RC_OPEN_EVT:
|
|
|
/* IOP_FIX: Jabra 620 only does RC open without AV open whenever it connects. So
|
|
|
* as per the AV WP, an AVRC connection cannot exist without an AV connection. Therefore,
|
|
|
@@ -333,7 +358,6 @@ static BOOLEAN btc_av_state_idle_handler(btc_sm_event_t event, void *p_data)
|
|
|
*
|
|
|
* TODO: We may need to do this only on an AVRCP Play. FixMe
|
|
|
*/
|
|
|
-
|
|
|
#if BTC_AV_SRC_INCLUDED
|
|
|
BTC_TRACE_DEBUG("BTA_AV_RC_OPEN_EVT received w/o AV");
|
|
|
tle_av_open_on_rc = osi_alarm_new("AVconn", btc_initiate_av_open_tmr_hdlr, NULL, BTC_TIMEOUT_AV_OPEN_ON_RC_SECS * 1000);
|
|
|
@@ -361,15 +385,13 @@ static BOOLEAN btc_av_state_idle_handler(btc_sm_event_t event, void *p_data)
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
- BTC_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__,
|
|
|
- dump_av_sm_event_name(event));
|
|
|
+ BTC_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__, dump_av_sm_event_name(event));
|
|
|
return FALSE;
|
|
|
-
|
|
|
}
|
|
|
-
|
|
|
return TRUE;
|
|
|
}
|
|
|
-/*****************************************************************************
|
|
|
+
|
|
|
+ /*****************************************************************************
|
|
|
**
|
|
|
** Function btc_av_state_opening_handler
|
|
|
**
|
|
|
@@ -382,7 +404,7 @@ static BOOLEAN btc_av_state_idle_handler(btc_sm_event_t event, void *p_data)
|
|
|
|
|
|
static BOOLEAN btc_av_state_opening_handler(btc_sm_event_t event, void *p_data)
|
|
|
{
|
|
|
- BTC_TRACE_DEBUG("%s event:%s flags %x\n", __FUNCTION__,
|
|
|
+ BTC_TRACE_DEBUG("%s event: %s flags %x\n", __FUNCTION__,
|
|
|
dump_av_sm_event_name(event), btc_av_cb.flags);
|
|
|
|
|
|
switch (event) {
|
|
|
@@ -395,35 +417,36 @@ static BOOLEAN btc_av_state_opening_handler(btc_sm_event_t event, void *p_data)
|
|
|
break;
|
|
|
|
|
|
case BTA_AV_REJECT_EVT:
|
|
|
- BTC_TRACE_DEBUG(" Received BTA_AV_REJECT_EVT \n");
|
|
|
+ BTC_TRACE_WARNING(" Received BTA_AV_REJECT_EVT \n");
|
|
|
btc_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, &(btc_av_cb.peer_bda), 0);
|
|
|
btc_sm_change_state(btc_av_cb.sm_handle, BTC_AV_STATE_IDLE);
|
|
|
break;
|
|
|
|
|
|
case BTA_AV_OPEN_EVT: {
|
|
|
tBTA_AV *p_bta_data = (tBTA_AV *)p_data;
|
|
|
- esp_a2d_connection_state_t state;
|
|
|
+ esp_a2d_connection_state_t conn_stat;
|
|
|
btc_sm_state_t av_state;
|
|
|
BTC_TRACE_DEBUG("status:%d, edr 0x%x, peer sep %d\n", p_bta_data->open.status,
|
|
|
p_bta_data->open.edr, p_bta_data->open.sep);
|
|
|
|
|
|
if (p_bta_data->open.status == BTA_AV_SUCCESS) {
|
|
|
- state = ESP_A2D_CONNECTION_STATE_CONNECTED;
|
|
|
- av_state = BTC_AV_STATE_OPENED;
|
|
|
btc_av_cb.edr = p_bta_data->open.edr;
|
|
|
-
|
|
|
btc_av_cb.peer_sep = p_bta_data->open.sep;
|
|
|
+
|
|
|
+ conn_stat = ESP_A2D_CONNECTION_STATE_CONNECTED;
|
|
|
+ av_state = BTC_AV_STATE_OPENED;
|
|
|
} else {
|
|
|
- BTC_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d\n",
|
|
|
- p_bta_data->open.status );
|
|
|
- state = ESP_A2D_CONNECTION_STATE_DISCONNECTED;
|
|
|
- av_state = BTC_AV_STATE_IDLE;
|
|
|
+ BTC_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d\n", p_bta_data->open.status );
|
|
|
+
|
|
|
+ conn_stat = ESP_A2D_CONNECTION_STATE_DISCONNECTED;
|
|
|
+ av_state = BTC_AV_STATE_IDLE;
|
|
|
}
|
|
|
|
|
|
/* inform the application of the event */
|
|
|
- btc_report_connection_state(state, &(btc_av_cb.peer_bda), 0);
|
|
|
+ btc_report_connection_state(conn_stat, &(btc_av_cb.peer_bda), 0);
|
|
|
/* change state to open/idle based on the status */
|
|
|
btc_sm_change_state(btc_av_cb.sm_handle, av_state);
|
|
|
+
|
|
|
if (btc_av_cb.peer_sep == AVDT_TSEP_SNK) {
|
|
|
/* if queued PLAY command, send it now */
|
|
|
/* necessary to add this?
|
|
|
@@ -432,8 +455,12 @@ static BOOLEAN btc_av_state_opening_handler(btc_sm_event_t event, void *p_data)
|
|
|
*/
|
|
|
} else if (btc_av_cb.peer_sep == AVDT_TSEP_SRC &&
|
|
|
(p_bta_data->open.status == BTA_AV_SUCCESS)) {
|
|
|
- /* Bring up AVRCP connection too */
|
|
|
- BTA_AvOpenRc(btc_av_cb.bta_handle);
|
|
|
+ /* Bring up AVRCP connection too if AVRC Initialized */
|
|
|
+ if(g_av_with_rc) {
|
|
|
+ BTA_AvOpenRc(btc_av_cb.bta_handle);
|
|
|
+ } else {
|
|
|
+ BTC_TRACE_WARNING("AVRC not Init, not using it.");
|
|
|
+ }
|
|
|
}
|
|
|
btc_queue_advance();
|
|
|
} break;
|
|
|
@@ -473,11 +500,10 @@ static BOOLEAN btc_av_state_opening_handler(btc_sm_event_t event, void *p_data)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- CHECK_RC_EVENT(event, p_data);
|
|
|
+ CHECK_RC_EVENT(event, p_data);
|
|
|
|
|
|
default:
|
|
|
- BTC_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__,
|
|
|
- dump_av_sm_event_name(event));
|
|
|
+ BTC_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__, dump_av_sm_event_name(event));
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
@@ -498,7 +524,7 @@ static BOOLEAN btc_av_state_opening_handler(btc_sm_event_t event, void *p_data)
|
|
|
|
|
|
static BOOLEAN btc_av_state_closing_handler(btc_sm_event_t event, void *p_data)
|
|
|
{
|
|
|
- BTC_TRACE_DEBUG("%s event:%s flags %x\n", __FUNCTION__,
|
|
|
+ BTC_TRACE_DEBUG("%s event: %s flags %x\n", __FUNCTION__,
|
|
|
dump_av_sm_event_name(event), btc_av_cb.flags);
|
|
|
|
|
|
switch (event) {
|
|
|
@@ -539,9 +565,7 @@ static BOOLEAN btc_av_state_closing_handler(btc_sm_event_t event, void *p_data)
|
|
|
case BTA_AV_CLOSE_EVT: {
|
|
|
tBTA_AV_CLOSE *close = (tBTA_AV_CLOSE *)p_data;
|
|
|
/* inform the application that we are disconnecting */
|
|
|
- btc_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, &(btc_av_cb.peer_bda),
|
|
|
- close->disc_rsn);
|
|
|
-
|
|
|
+ btc_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, &(btc_av_cb.peer_bda), close->disc_rsn);
|
|
|
btc_sm_change_state(btc_av_cb.sm_handle, BTC_AV_STATE_IDLE);
|
|
|
break;
|
|
|
}
|
|
|
@@ -552,14 +576,12 @@ static BOOLEAN btc_av_state_closing_handler(btc_sm_event_t event, void *p_data)
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
- BTC_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__,
|
|
|
- dump_av_sm_event_name(event));
|
|
|
+ BTC_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__, dump_av_sm_event_name(event));
|
|
|
return FALSE;
|
|
|
}
|
|
|
return TRUE;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
/*****************************************************************************
|
|
|
**
|
|
|
** Function btc_av_state_opened_handler
|
|
|
@@ -569,12 +591,11 @@ static BOOLEAN btc_av_state_closing_handler(btc_sm_event_t event, void *p_data)
|
|
|
** Returns TRUE if event was processed, FALSE otherwise
|
|
|
**
|
|
|
*******************************************************************************/
|
|
|
-
|
|
|
static BOOLEAN btc_av_state_opened_handler(btc_sm_event_t event, void *p_data)
|
|
|
{
|
|
|
tBTA_AV *p_av = (tBTA_AV *)p_data;
|
|
|
|
|
|
- BTC_TRACE_DEBUG("%s event:%s flags %x\n", __FUNCTION__,
|
|
|
+ BTC_TRACE_DEBUG("%s event: %s flags %x\n", __FUNCTION__,
|
|
|
dump_av_sm_event_name(event), btc_av_cb.flags);
|
|
|
|
|
|
if ( (event == BTA_AV_REMOTE_CMD_EVT) && (btc_av_cb.flags & BTC_AV_FLAG_REMOTE_SUSPEND) &&
|
|
|
@@ -654,10 +675,9 @@ static BOOLEAN btc_av_state_opened_handler(btc_sm_event_t event, void *p_data)
|
|
|
|
|
|
case BTC_AV_DISCONNECT_REQ_EVT:
|
|
|
BTA_AvClose(btc_av_cb.bta_handle);
|
|
|
- if (btc_av_cb.peer_sep == AVDT_TSEP_SRC) {
|
|
|
+ if (btc_av_cb.peer_sep == AVDT_TSEP_SRC && g_av_with_rc == true) {
|
|
|
BTA_AvCloseRc(btc_av_cb.bta_handle);
|
|
|
}
|
|
|
-
|
|
|
/* inform the application that we are disconnecting */
|
|
|
btc_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTING, &(btc_av_cb.peer_bda), 0);
|
|
|
break;
|
|
|
@@ -665,17 +685,15 @@ static BOOLEAN btc_av_state_opened_handler(btc_sm_event_t event, void *p_data)
|
|
|
case BTA_AV_CLOSE_EVT: {
|
|
|
/* avdtp link is closed */
|
|
|
btc_a2dp_on_stopped(NULL);
|
|
|
-
|
|
|
tBTA_AV_CLOSE *close = (tBTA_AV_CLOSE *)p_data;
|
|
|
/* inform the application that we are disconnected */
|
|
|
- btc_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, &(btc_av_cb.peer_bda),
|
|
|
- close->disc_rsn);
|
|
|
-
|
|
|
+ btc_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, &(btc_av_cb.peer_bda), close->disc_rsn);
|
|
|
/* change state to idle, send acknowledgement if start is pending */
|
|
|
if (btc_av_cb.flags & BTC_AV_FLAG_PENDING_START) {
|
|
|
btc_a2dp_control_command_ack(ESP_A2D_MEDIA_CTRL_ACK_FAILURE);
|
|
|
/* pending start flag will be cleared when exit current state */
|
|
|
}
|
|
|
+ /* change state to idle, send acknowledgement if start is pending */
|
|
|
btc_sm_change_state(btc_av_cb.sm_handle, BTC_AV_STATE_IDLE);
|
|
|
break;
|
|
|
}
|
|
|
@@ -703,11 +721,10 @@ static BOOLEAN btc_av_state_opened_handler(btc_sm_event_t event, void *p_data)
|
|
|
btc_queue_advance();
|
|
|
break;
|
|
|
|
|
|
- CHECK_RC_EVENT(event, p_data);
|
|
|
+ CHECK_RC_EVENT(event, p_data);
|
|
|
|
|
|
default:
|
|
|
- BTC_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__,
|
|
|
- dump_av_sm_event_name(event));
|
|
|
+ BTC_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__, dump_av_sm_event_name(event));
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
@@ -728,27 +745,22 @@ static BOOLEAN btc_av_state_started_handler(btc_sm_event_t event, void *p_data)
|
|
|
{
|
|
|
tBTA_AV *p_av = (tBTA_AV *)p_data;
|
|
|
|
|
|
- BTC_TRACE_DEBUG("%s event:%s flags %x\n", __FUNCTION__,
|
|
|
+ BTC_TRACE_DEBUG("%s event: %s flags %x\n", __FUNCTION__,
|
|
|
dump_av_sm_event_name(event), btc_av_cb.flags);
|
|
|
|
|
|
switch (event) {
|
|
|
case BTC_SM_ENTER_EVT:
|
|
|
-
|
|
|
/* we are again in started state, clear any remote suspend flags */
|
|
|
btc_av_cb.flags &= ~BTC_AV_FLAG_REMOTE_SUSPEND;
|
|
|
-
|
|
|
btc_report_audio_state(ESP_A2D_AUDIO_STATE_STARTED, &(btc_av_cb.peer_bda));
|
|
|
-
|
|
|
/* increase the a2dp consumer task priority temporarily when start
|
|
|
** audio playing, to avoid overflow the audio packet queue. */
|
|
|
// adjust_priority_a2dp(TRUE);
|
|
|
-
|
|
|
break;
|
|
|
|
|
|
case BTC_SM_EXIT_EVT:
|
|
|
/* restore the a2dp consumer task priority when stop audio playing. */
|
|
|
// adjust_priority_a2dp(FALSE);
|
|
|
-
|
|
|
break;
|
|
|
|
|
|
case BTC_AV_START_STREAM_REQ_EVT:
|
|
|
@@ -763,11 +775,9 @@ static BOOLEAN btc_av_state_started_handler(btc_sm_event_t event, void *p_data)
|
|
|
/* fixme -- use suspend = true always to work around issue with BTA AV */
|
|
|
case BTC_AV_STOP_STREAM_REQ_EVT:
|
|
|
case BTC_AV_SUSPEND_STREAM_REQ_EVT:
|
|
|
-
|
|
|
/* set pending flag to ensure btc task is not trying to restart
|
|
|
stream while suspend is in progress */
|
|
|
btc_av_cb.flags |= BTC_AV_FLAG_LOCAL_SUSPEND_PENDING;
|
|
|
-
|
|
|
/* if we were remotely suspended but suspend locally, local suspend
|
|
|
always overrides */
|
|
|
btc_av_cb.flags &= ~BTC_AV_FLAG_REMOTE_SUSPEND;
|
|
|
@@ -787,25 +797,19 @@ static BOOLEAN btc_av_state_started_handler(btc_sm_event_t event, void *p_data)
|
|
|
break;
|
|
|
|
|
|
case BTC_AV_DISCONNECT_REQ_EVT:
|
|
|
-
|
|
|
/* request avdtp to close */
|
|
|
BTA_AvClose(btc_av_cb.bta_handle);
|
|
|
- if (btc_av_cb.peer_sep == AVDT_TSEP_SRC) {
|
|
|
+ if (btc_av_cb.peer_sep == AVDT_TSEP_SRC && g_av_with_rc == true) {
|
|
|
BTA_AvCloseRc(btc_av_cb.bta_handle);
|
|
|
}
|
|
|
-
|
|
|
/* inform the application that we are disconnecting */
|
|
|
btc_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTING, &(btc_av_cb.peer_bda), 0);
|
|
|
-
|
|
|
/* wait in closing state until fully closed */
|
|
|
btc_sm_change_state(btc_av_cb.sm_handle, BTC_AV_STATE_CLOSING);
|
|
|
break;
|
|
|
|
|
|
case BTA_AV_SUSPEND_EVT:
|
|
|
-
|
|
|
- BTC_TRACE_DEBUG("BTA_AV_SUSPEND_EVT status %d, init %d\n",
|
|
|
- p_av->suspend.status, p_av->suspend.initiator);
|
|
|
-
|
|
|
+ BTC_TRACE_DEBUG("BTA_AV_SUSPEND_EVT status %d, init %d\n", p_av->suspend.status, p_av->suspend.initiator);
|
|
|
/* a2dp suspended, stop media task until resumed */
|
|
|
btc_a2dp_on_suspended(&p_av->suspend);
|
|
|
|
|
|
@@ -824,7 +828,6 @@ static BOOLEAN btc_av_state_started_handler(btc_sm_event_t event, void *p_data)
|
|
|
if (p_av->suspend.initiator != TRUE) {
|
|
|
/* remote suspend, notify HAL and await audioflinger to
|
|
|
suspend/stop stream */
|
|
|
-
|
|
|
/* set remote suspend flag to block media task from restarting
|
|
|
stream only if we did not already initiate a local suspend */
|
|
|
if ((btc_av_cb.flags & BTC_AV_FLAG_LOCAL_SUSPEND_PENDING) == 0) {
|
|
|
@@ -843,31 +846,24 @@ static BOOLEAN btc_av_state_started_handler(btc_sm_event_t event, void *p_data)
|
|
|
break;
|
|
|
|
|
|
case BTA_AV_STOP_EVT:
|
|
|
-
|
|
|
btc_av_cb.flags |= BTC_AV_FLAG_PENDING_STOP;
|
|
|
btc_a2dp_on_stopped(&p_av->suspend);
|
|
|
-
|
|
|
btc_report_audio_state(ESP_A2D_AUDIO_STATE_STOPPED, &(btc_av_cb.peer_bda));
|
|
|
|
|
|
/* if stop was successful, change state to open */
|
|
|
if (p_av->suspend.status == BTA_AV_SUCCESS) {
|
|
|
btc_sm_change_state(btc_av_cb.sm_handle, BTC_AV_STATE_OPENED);
|
|
|
}
|
|
|
-
|
|
|
break;
|
|
|
|
|
|
case BTA_AV_CLOSE_EVT: {
|
|
|
-
|
|
|
btc_av_cb.flags |= BTC_AV_FLAG_PENDING_STOP;
|
|
|
-
|
|
|
/* avdtp link is closed */
|
|
|
btc_a2dp_on_stopped(NULL);
|
|
|
|
|
|
tBTA_AV_CLOSE *close = (tBTA_AV_CLOSE *)p_data;
|
|
|
/* inform the application that we are disconnected */
|
|
|
- btc_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, &(btc_av_cb.peer_bda),
|
|
|
- close->disc_rsn);
|
|
|
-
|
|
|
+ btc_report_connection_state(ESP_A2D_CONNECTION_STATE_DISCONNECTED, &(btc_av_cb.peer_bda), close->disc_rsn);
|
|
|
btc_sm_change_state(btc_av_cb.sm_handle, BTC_AV_STATE_IDLE);
|
|
|
break;
|
|
|
}
|
|
|
@@ -875,10 +871,8 @@ static BOOLEAN btc_av_state_started_handler(btc_sm_event_t event, void *p_data)
|
|
|
CHECK_RC_EVENT(event, p_data);
|
|
|
|
|
|
default:
|
|
|
- BTC_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__,
|
|
|
- dump_av_sm_event_name(event));
|
|
|
+ BTC_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__, dump_av_sm_event_name(event));
|
|
|
return FALSE;
|
|
|
-
|
|
|
}
|
|
|
return TRUE;
|
|
|
}
|
|
|
@@ -957,7 +951,6 @@ static void btc_av_event_free_data(btc_sm_event_t event, void *p_data)
|
|
|
** Returns bt_status_t
|
|
|
**
|
|
|
*******************************************************************************/
|
|
|
-
|
|
|
static bt_status_t btc_av_init(int service_id)
|
|
|
{
|
|
|
if (btc_av_cb.sm_handle == NULL) {
|
|
|
@@ -974,6 +967,8 @@ static bt_status_t btc_av_init(int service_id)
|
|
|
}
|
|
|
|
|
|
if (!stat) {
|
|
|
+ g_a2dp_on_init = false;
|
|
|
+ g_a2dp_on_deinit = true;
|
|
|
return BT_STATUS_FAIL;
|
|
|
}
|
|
|
|
|
|
@@ -992,6 +987,8 @@ static bt_status_t btc_av_init(int service_id)
|
|
|
return BT_STATUS_SUCCESS;
|
|
|
}
|
|
|
|
|
|
+ g_a2dp_on_init = true;
|
|
|
+ g_a2dp_on_deinit = false;
|
|
|
return BT_STATUS_FAIL;
|
|
|
}
|
|
|
|
|
|
@@ -1038,11 +1035,13 @@ static void clean_up(int service_id)
|
|
|
tle_av_open_on_rc = NULL;
|
|
|
}
|
|
|
#endif /* BTC_AV_SRC_INCLUDED */
|
|
|
+ btc_dm_disable_service(BTA_A2DP_SOURCE_SERVICE_ID);
|
|
|
}
|
|
|
|
|
|
- btc_dm_disable_service(BTA_A2DP_SOURCE_SERVICE_ID);
|
|
|
-
|
|
|
if (service_id == BTA_A2DP_SINK_SERVICE_ID) {
|
|
|
+#if BTC_AV_SINK_INCLUDED
|
|
|
+ btc_a2dp_sink_shutdown();
|
|
|
+#endif /* BTC_AV_SINK_INCLUDED */
|
|
|
btc_dm_disable_service(BTA_A2DP_SINK_SERVICE_ID);
|
|
|
}
|
|
|
|
|
|
@@ -1050,11 +1049,8 @@ static void clean_up(int service_id)
|
|
|
btc_sm_shutdown(btc_av_cb.sm_handle);
|
|
|
btc_av_cb.sm_handle = NULL;
|
|
|
|
|
|
- if (service_id == BTA_A2DP_SINK_SERVICE_ID) {
|
|
|
-#if BTC_AV_SINK_INCLUDED
|
|
|
- btc_a2dp_sink_shutdown();
|
|
|
-#endif /* BTC_AV_SINK_INCLUDED */
|
|
|
- }
|
|
|
+ g_a2dp_on_init = false;
|
|
|
+ g_a2dp_on_deinit = true;
|
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
|
@@ -1229,10 +1225,16 @@ bt_status_t btc_av_execute_service(BOOLEAN b_enable, UINT8 tsep)
|
|
|
/* Added BTA_AV_FEAT_NO_SCO_SSPD - this ensures that the BTA does not
|
|
|
* auto-suspend av streaming on AG events(SCO or Call). The suspend shall
|
|
|
* be initiated by the app/audioflinger layers */
|
|
|
- BTA_AvEnable(BTA_SEC_AUTHENTICATE, (BTA_AV_FEAT_NO_SCO_SSPD)
|
|
|
- | BTA_AV_FEAT_RCTG | BTA_AV_FEAT_METADATA | BTA_AV_FEAT_VENDOR
|
|
|
- | BTA_AV_FEAT_RCCT | BTA_AV_FEAT_ADV_CTRL,
|
|
|
- bte_av_callback);
|
|
|
+ if (g_av_with_rc) {
|
|
|
+ BTC_TRACE_WARNING("A2DP Enable with AVRC")
|
|
|
+ BTA_AvEnable(BTA_SEC_AUTHENTICATE, BTA_AV_FEAT_NO_SCO_SSPD |
|
|
|
+ BTA_AV_FEAT_RCTG | BTA_AV_FEAT_METADATA | BTA_AV_FEAT_VENDOR |
|
|
|
+ BTA_AV_FEAT_RCCT | BTA_AV_FEAT_ADV_CTRL,
|
|
|
+ bte_av_callback);
|
|
|
+ } else {
|
|
|
+ BTC_TRACE_WARNING("A2DP Enable without AVRC")
|
|
|
+ BTA_AvEnable(BTA_SEC_AUTHENTICATE, BTA_AV_FEAT_NO_SCO_SSPD, bte_av_callback);
|
|
|
+ }
|
|
|
BTA_AvRegister(BTA_AV_CHNL_AUDIO, BTC_AV_SERVICE_NAME, 0, bte_av_media_callback, &bta_av_a2d_cos, tsep);
|
|
|
} else {
|
|
|
BTA_AvDeregister(btc_av_cb.bta_handle);
|
|
|
@@ -1384,7 +1386,9 @@ void btc_a2dp_call_handler(btc_msg_t *msg)
|
|
|
}
|
|
|
case BTC_AV_SINK_API_DISCONNECT_EVT: {
|
|
|
CHECK_BTAV_INIT();
|
|
|
- btc_sm_dispatch(btc_av_cb.sm_handle, BTC_AV_DISCONNECT_REQ_EVT, NULL);
|
|
|
+ btc_av_disconn_req_t disconn_req;
|
|
|
+ memcpy(&disconn_req.target_bda, &arg->disconn, sizeof(bt_bdaddr_t));
|
|
|
+ btc_sm_dispatch(btc_av_cb.sm_handle, BTC_AV_DISCONNECT_REQ_EVT, &disconn_req);
|
|
|
break;
|
|
|
}
|
|
|
case BTC_AV_SINK_API_REG_DATA_CB_EVT: {
|
|
|
@@ -1407,7 +1411,9 @@ void btc_a2dp_call_handler(btc_msg_t *msg)
|
|
|
}
|
|
|
case BTC_AV_SRC_API_DISCONNECT_EVT: {
|
|
|
CHECK_BTAV_INIT();
|
|
|
- btc_sm_dispatch(btc_av_cb.sm_handle, BTC_AV_DISCONNECT_REQ_EVT, NULL);
|
|
|
+ btc_av_disconn_req_t disconn_req;
|
|
|
+ memcpy(&disconn_req.target_bda, &arg->src_disconn, sizeof(bt_bdaddr_t));
|
|
|
+ btc_sm_dispatch(btc_av_cb.sm_handle, BTC_AV_DISCONNECT_REQ_EVT, &disconn_req);
|
|
|
break;
|
|
|
}
|
|
|
case BTC_AV_SRC_API_REG_DATA_CB_EVT: {
|