OSDN Git Service

Fix for AV lockup on local and remote start collision
authorKausik Sinnaswamy <kausik@broadcom.com>
Wed, 22 May 2013 10:48:31 +0000 (16:18 +0530)
committerZhihai Xu <zhihaixu@google.com>
Wed, 29 May 2013 22:49:53 +0000 (15:49 -0700)
Bug: 7002859

Change-Id: I6170be864b44011b98e08d7e2599021a3eec70a3

bta/av/bta_av_aact.c
btif/src/btif_av.c

index 0f92677..9a38689 100644 (file)
@@ -723,10 +723,10 @@ void bta_av_role_res (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data)
     {
         if (p_scb->wait & BTA_AV_WAIT_ROLE_SW_STARTED)
         {
-            p_scb->role &= ~BTA_AV_ROLE_START_INT;
             p_scb->wait &= ~BTA_AV_WAIT_ROLE_SW_BITS;
             if (p_data->role_res.hci_status != HCI_SUCCESS)
             {
+                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 failed because of role switch. */
                 start.chnl   = p_scb->chnl;
@@ -1779,9 +1779,11 @@ void bta_av_do_start (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data)
 
         AVDT_StartReq(&p_scb->avdt_handle, 1);
     }
-    else
+    else if (p_scb->started)
     {
-        bta_av_start_ok(p_scb, NULL);
+        p_scb->role |= BTA_AV_ROLE_START_INT;
+        if ( p_scb->wait == 0 )
+           bta_av_start_ok(p_scb, NULL);
     }
     APPL_TRACE_DEBUG2("started %d role:x%x", p_scb->started, p_scb->role);
 }
index fbbd564..6bb6bfb 100755 (executable)
@@ -485,10 +485,10 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data)
             BTIF_TRACE_EVENT3("BTA_AV_START_EVT status %d, suspending %d, init %d",
                 p_av->start.status, p_av->start.suspending, p_av->start.initiator);
 
-            btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
             if ((p_av->start.status == BTA_SUCCESS) && (p_av->start.suspending == TRUE))
                 return TRUE;
 
+            btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
             btif_a2dp_on_started(&p_av->start);
 
             /* remain in open state if status failed */