From c8f807502482e76a6052b74d01405e72a40ab9df Mon Sep 17 00:00:00 2001 From: Sanket Agarwal Date: Wed, 22 Feb 2017 11:55:34 -0800 Subject: [PATCH] BTA HF_CLIENT: Always reply to +BCS Phones don't like when we don't reply to +BCS codec-negotiation. We were having this behavior because not always do we want to accept a connection request over SCO. Instead of not replying to +BCS (which is essentially a codec negotiation) we rather refuse the SCO request when it comes in. This creates other issues such as some phones trying to connect SCO in an infinite loop but it still keeps interoperability with other devices such as iPhones and Microsoft phones intact Bug: b/35469963 Bug: b/35431871 Bug: b/35419773 Test: SCO (Phone Audio) test with iPhone, Microsoft and Nexus phones Change-Id: I5319edcb4da9d66c6d6b3a49742248c90dee98e6 (cherry picked from commit ad372cfa3376f882046284a5655ed9c6fdf24daf) --- bta/hf_client/bta_hf_client_at.cc | 18 ++++++------------ bta/hf_client/bta_hf_client_sco.cc | 21 +++++++++++++++------ 2 files changed, 21 insertions(+), 18 deletions(-) diff --git a/bta/hf_client/bta_hf_client_at.cc b/bta/hf_client/bta_hf_client_at.cc index 94ce4638b..4076e1e3c 100644 --- a/bta/hf_client/bta_hf_client_at.cc +++ b/bta/hf_client/bta_hf_client_at.cc @@ -445,18 +445,12 @@ static void bta_hf_client_handle_bcs(tBTA_HF_CLIENT_CB* client_cb, uint32_t codec) { APPL_TRACE_DEBUG("%s: codec: %u sco listen state: %d", __func__, codec, client_cb->sco_state); - - // Only send acceptance for the codec request if we are ready to accept the - // SCO connection. sco_state is set to listen when the upper layer calls for - // audio connection. - if (client_cb->sco_state == BTA_HF_CLIENT_SCO_LISTEN_ST) { - if (codec == BTM_SCO_CODEC_CVSD || codec == BTM_SCO_CODEC_MSBC) { - client_cb->negotiated_codec = codec; - bta_hf_client_send_at_bcs(client_cb, codec); - } else { - client_cb->negotiated_codec = BTM_SCO_CODEC_CVSD; - bta_hf_client_send_at_bac(client_cb); - } + if (codec == BTM_SCO_CODEC_CVSD || codec == BTM_SCO_CODEC_MSBC) { + client_cb->negotiated_codec = codec; + bta_hf_client_send_at_bcs(client_cb, codec); + } else { + client_cb->negotiated_codec = BTM_SCO_CODEC_CVSD; + bta_hf_client_send_at_bac(client_cb); } } diff --git a/bta/hf_client/bta_hf_client_sco.cc b/bta/hf_client/bta_hf_client_sco.cc index f23b3f5b9..0e063366c 100644 --- a/bta/hf_client/bta_hf_client_sco.cc +++ b/bta/hf_client/bta_hf_client_sco.cc @@ -330,12 +330,25 @@ static void bta_hf_client_sco_event(tBTA_HF_CLIENT_CB* client_cb, switch (client_cb->sco_state) { case BTA_HF_CLIENT_SCO_SHUTDOWN_ST: switch (event) { + // For WBS we only listen to SCO requests. Even for outgoing SCO + // requests we first do a AT+BCC and wait for remote to initiate SCO case BTA_HF_CLIENT_SCO_LISTEN_E: /* create sco listen connection */ bta_hf_client_sco_create(client_cb, false); client_cb->sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST; break; + // For non WBS cases and enabling outgoing SCO requests we need to force + // open a SCO channel + case BTA_HF_CLIENT_SCO_OPEN_E: + /* remove listening connection */ + bta_hf_client_sco_remove(client_cb); + + /* create sco connection to peer */ + bta_hf_client_sco_create(client_cb, true); + client_cb->sco_state = BTA_HF_CLIENT_SCO_OPENING_ST; + break; + default: APPL_TRACE_WARNING("BTA_HF_CLIENT_SCO_SHUTDOWN_ST: Ignoring event %d", event); @@ -345,10 +358,6 @@ static void bta_hf_client_sco_event(tBTA_HF_CLIENT_CB* client_cb, case BTA_HF_CLIENT_SCO_LISTEN_ST: switch (event) { - case BTA_HF_CLIENT_SCO_LISTEN_E: - /* Ignore */ - break; - case BTA_HF_CLIENT_SCO_OPEN_E: /* remove listening connection */ bta_hf_client_sco_remove(client_cb); @@ -396,8 +405,8 @@ static void bta_hf_client_sco_event(tBTA_HF_CLIENT_CB* client_cb, case BTA_HF_CLIENT_SCO_CONN_CLOSE_E: /* sco failed; create sco listen connection */ - bta_hf_client_sco_create(client_cb, false); - client_cb->sco_state = BTA_HF_CLIENT_SCO_LISTEN_ST; + // bta_hf_client_sco_create(client_cb, false); + client_cb->sco_state = BTA_HF_CLIENT_SCO_SHUTDOWN_ST; break; default: -- 2.11.0