Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 55b6e80e authored by Zhihai Xu's avatar Zhihai Xu Committed by Android Git Automerger
Browse files

am 0abdf53e: Failure to start playback on A2DP sink after connection

* commit '0abdf53e':
  Failure to start playback on A2DP sink after connection
parents 5a947084 0abdf53e
Loading
Loading
Loading
Loading
+30 −12
Original line number Diff line number Diff line
@@ -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
@@ -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);
}

@@ -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);
+1 −1
Original line number Diff line number Diff line
@@ -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);
+16 −4
Original line number Diff line number Diff line
@@ -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;
@@ -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;

@@ -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 */
+10 −4
Original line number Diff line number Diff line
@@ -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 ##");

@@ -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)
@@ -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
            {
@@ -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;
}