Loading system/bta/av/bta_av_aact.c +30 −12 Original line number Diff line number Diff line Loading @@ -253,6 +253,28 @@ static void bta_av_save_addr(tBTA_AV_SCB *p_scb, const BD_ADDR b) bdcpy(p_scb->peer_addr, b); } /******************************************************************************* ** ** Function notify_start_failed ** ** Description notify up-layer AV start failed ** ** ** Returns void ** *******************************************************************************/ static void notify_start_failed(tBTA_AV_SCB *p_scb) { tBTA_AV_START start; /* if start failed, clear role */ p_scb->role &= ~BTA_AV_ROLE_START_INT; start.chnl = p_scb->chnl; start.status = BTA_AV_FAIL; start.initiator = TRUE; start.hndl = p_scb->hndl; (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); } /******************************************************************************* ** ** Function bta_av_st_rc_timer Loading Loading @@ -1782,9 +1804,14 @@ void bta_av_do_start (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) else if (p_scb->started) { p_scb->role |= BTA_AV_ROLE_START_INT; if ( p_scb->wait == 0 ) if ( p_scb->wait == 0 ) { if (p_scb->role & BTA_AV_ROLE_SUSPEND) { notify_start_failed(p_scb); } else { bta_av_start_ok(p_scb, NULL); } } } APPL_TRACE_DEBUG2("started %d role:x%x", p_scb->started, p_scb->role); } Loading Loading @@ -2233,19 +2260,10 @@ void bta_av_start_ok (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) *******************************************************************************/ void bta_av_start_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) { tBTA_AV_START start; if(p_scb->started == FALSE && p_scb->co_started == FALSE) { /* if start failed, clear role */ p_scb->role &= ~BTA_AV_ROLE_START_INT; bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); start.chnl = p_scb->chnl; start.status = BTA_AV_FAIL; start.initiator = TRUE; start.hndl = p_scb->hndl; (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); notify_start_failed(p_scb); } bta_sys_set_policy(BTA_ID_AV, (HCI_ENABLE_SNIFF_MODE|HCI_ENABLE_MASTER_SLAVE_SWITCH), p_scb->peer_addr); Loading system/btif/include/btif_media.h +1 −1 Original line number Diff line number Diff line Loading @@ -236,7 +236,7 @@ void btif_a2dp_on_init(void); void btif_a2dp_setup_codec(void); void btif_a2dp_on_idle(void); void btif_a2dp_on_open(void); void btif_a2dp_on_started(tBTA_AV_START *p_av); BOOLEAN btif_a2dp_on_started(tBTA_AV_START *p_av, BOOLEAN pending_start); void btif_a2dp_ack_fail(void); void btif_a2dp_on_stop_req(void); void btif_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av); Loading system/btif/src/btif_av.c +16 −4 Original line number Diff line number Diff line Loading @@ -491,14 +491,21 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data) if ((p_av->start.status == BTA_SUCCESS) && (p_av->start.suspending == TRUE)) return TRUE; if (btif_a2dp_on_started(&p_av->start, ((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) != 0))) { /* only clear pending flag after acknowledgement */ btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START; btif_a2dp_on_started(&p_av->start); } /* remain in open state if status failed */ if (p_av->start.status != BTA_AV_SUCCESS) return FALSE; /* change state to started */ /* change state to started, send acknowledgement if start is pending */ if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) { btif_a2dp_on_started(NULL, TRUE); /* pending start flag will be cleared when exit current state */ } btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_STARTED); } break; Loading @@ -520,6 +527,11 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data) HAL_CBACK(bt_av_callbacks, connection_state_cb, BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda)); /* change state to idle, send acknowledgement if start is pending */ if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) { btif_a2dp_ack_fail(); /* pending start flag will be cleared when exit current state */ } btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE); break; Loading Loading @@ -581,7 +593,7 @@ static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data case BTIF_AV_START_STREAM_REQ_EVT: /* we were remotely started, just ack back the local request */ btif_a2dp_on_started(NULL); btif_a2dp_on_started(NULL, TRUE); break; /* fixme -- use suspend = true always to work around issue with BTA AV */ Loading system/btif/src/btif_media_task.c +10 −4 Original line number Diff line number Diff line Loading @@ -844,9 +844,10 @@ void btif_a2dp_on_open(void) ** *******************************************************************************/ void btif_a2dp_on_started(tBTA_AV_START *p_av) BOOLEAN btif_a2dp_on_started(tBTA_AV_START *p_av, BOOLEAN pending_start) { tBTIF_STATUS status; BOOLEAN ack = FALSE; APPL_TRACE_EVENT0("## ON A2DP STARTED ##"); Loading @@ -854,7 +855,7 @@ void btif_a2dp_on_started(tBTA_AV_START *p_av) { /* ack back a local start request */ a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); return; return TRUE; } if (p_av->status == BTA_AV_SUCCESS) Loading @@ -863,7 +864,10 @@ void btif_a2dp_on_started(tBTA_AV_START *p_av) { if (p_av->initiator) { if (pending_start) { a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); ack = TRUE; } } else { Loading @@ -875,10 +879,12 @@ void btif_a2dp_on_started(tBTA_AV_START *p_av) /* media task is autostarted upon a2dp audiopath connection */ } } else else if (pending_start) { a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); ack = TRUE; } return ack; } Loading Loading
system/bta/av/bta_av_aact.c +30 −12 Original line number Diff line number Diff line Loading @@ -253,6 +253,28 @@ static void bta_av_save_addr(tBTA_AV_SCB *p_scb, const BD_ADDR b) bdcpy(p_scb->peer_addr, b); } /******************************************************************************* ** ** Function notify_start_failed ** ** Description notify up-layer AV start failed ** ** ** Returns void ** *******************************************************************************/ static void notify_start_failed(tBTA_AV_SCB *p_scb) { tBTA_AV_START start; /* if start failed, clear role */ p_scb->role &= ~BTA_AV_ROLE_START_INT; start.chnl = p_scb->chnl; start.status = BTA_AV_FAIL; start.initiator = TRUE; start.hndl = p_scb->hndl; (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); } /******************************************************************************* ** ** Function bta_av_st_rc_timer Loading Loading @@ -1782,9 +1804,14 @@ void bta_av_do_start (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) else if (p_scb->started) { p_scb->role |= BTA_AV_ROLE_START_INT; if ( p_scb->wait == 0 ) if ( p_scb->wait == 0 ) { if (p_scb->role & BTA_AV_ROLE_SUSPEND) { notify_start_failed(p_scb); } else { bta_av_start_ok(p_scb, NULL); } } } APPL_TRACE_DEBUG2("started %d role:x%x", p_scb->started, p_scb->role); } Loading Loading @@ -2233,19 +2260,10 @@ void bta_av_start_ok (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) *******************************************************************************/ void bta_av_start_failed (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data) { tBTA_AV_START start; if(p_scb->started == FALSE && p_scb->co_started == FALSE) { /* if start failed, clear role */ p_scb->role &= ~BTA_AV_ROLE_START_INT; bta_sys_idle(BTA_ID_AV, bta_av_cb.audio_open_cnt, p_scb->peer_addr); start.chnl = p_scb->chnl; start.status = BTA_AV_FAIL; start.initiator = TRUE; start.hndl = p_scb->hndl; (*bta_av_cb.p_cback)(BTA_AV_START_EVT, (tBTA_AV *) &start); notify_start_failed(p_scb); } bta_sys_set_policy(BTA_ID_AV, (HCI_ENABLE_SNIFF_MODE|HCI_ENABLE_MASTER_SLAVE_SWITCH), p_scb->peer_addr); Loading
system/btif/include/btif_media.h +1 −1 Original line number Diff line number Diff line Loading @@ -236,7 +236,7 @@ void btif_a2dp_on_init(void); void btif_a2dp_setup_codec(void); void btif_a2dp_on_idle(void); void btif_a2dp_on_open(void); void btif_a2dp_on_started(tBTA_AV_START *p_av); BOOLEAN btif_a2dp_on_started(tBTA_AV_START *p_av, BOOLEAN pending_start); void btif_a2dp_ack_fail(void); void btif_a2dp_on_stop_req(void); void btif_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av); Loading
system/btif/src/btif_av.c +16 −4 Original line number Diff line number Diff line Loading @@ -491,14 +491,21 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data) if ((p_av->start.status == BTA_SUCCESS) && (p_av->start.suspending == TRUE)) return TRUE; if (btif_a2dp_on_started(&p_av->start, ((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) != 0))) { /* only clear pending flag after acknowledgement */ btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START; btif_a2dp_on_started(&p_av->start); } /* remain in open state if status failed */ if (p_av->start.status != BTA_AV_SUCCESS) return FALSE; /* change state to started */ /* change state to started, send acknowledgement if start is pending */ if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) { btif_a2dp_on_started(NULL, TRUE); /* pending start flag will be cleared when exit current state */ } btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_STARTED); } break; Loading @@ -520,6 +527,11 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data) HAL_CBACK(bt_av_callbacks, connection_state_cb, BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda)); /* change state to idle, send acknowledgement if start is pending */ if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) { btif_a2dp_ack_fail(); /* pending start flag will be cleared when exit current state */ } btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE); break; Loading Loading @@ -581,7 +593,7 @@ static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data case BTIF_AV_START_STREAM_REQ_EVT: /* we were remotely started, just ack back the local request */ btif_a2dp_on_started(NULL); btif_a2dp_on_started(NULL, TRUE); break; /* fixme -- use suspend = true always to work around issue with BTA AV */ Loading
system/btif/src/btif_media_task.c +10 −4 Original line number Diff line number Diff line Loading @@ -844,9 +844,10 @@ void btif_a2dp_on_open(void) ** *******************************************************************************/ void btif_a2dp_on_started(tBTA_AV_START *p_av) BOOLEAN btif_a2dp_on_started(tBTA_AV_START *p_av, BOOLEAN pending_start) { tBTIF_STATUS status; BOOLEAN ack = FALSE; APPL_TRACE_EVENT0("## ON A2DP STARTED ##"); Loading @@ -854,7 +855,7 @@ void btif_a2dp_on_started(tBTA_AV_START *p_av) { /* ack back a local start request */ a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); return; return TRUE; } if (p_av->status == BTA_AV_SUCCESS) Loading @@ -863,7 +864,10 @@ void btif_a2dp_on_started(tBTA_AV_START *p_av) { if (p_av->initiator) { if (pending_start) { a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); ack = TRUE; } } else { Loading @@ -875,10 +879,12 @@ void btif_a2dp_on_started(tBTA_AV_START *p_av) /* media task is autostarted upon a2dp audiopath connection */ } } else else if (pending_start) { a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); ack = TRUE; } return ack; } Loading