15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2009-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19a41dbb156068a33e7cccafe93c4b520406781c9fJakub Pawlowski#define LOG_TAG "btif_av" 20a41dbb156068a33e7cccafe93c4b520406781c9fJakub Pawlowski 2149a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btif_av.h" 2249a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen 23ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach#include <assert.h> 24ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach#include <string.h> 25ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach 263e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood#include <system/audio.h> 2749a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include <hardware/bluetooth.h> 2849a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include <hardware/bt_av.h> 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3049a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "bt_utils.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_media.h" 3349a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btif_profile_queue.h" 3449a86709488e5cfd5e23759da18bf9613e15b04dMarie Janssen#include "btif_util.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 36258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 3708393054f0867d0f86a7f9c2eb156e67a86382c7Marie Janssen#include "osi/include/allocator.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants & Macros 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_AV_SERVICE_NAME "Advanced Audio" 436b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#define BTIF_AVK_SERVICE_NAME "Advanced Audio Sink" 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov#define BTIF_TIMEOUT_AV_OPEN_ON_RC_MS (2 * 1000) 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef enum { 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_AV_STATE_IDLE = 0x0, 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_AV_STATE_OPENING, 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_AV_STATE_OPENED, 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_AV_STATE_STARTED, 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_AV_STATE_CLOSING 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} btif_av_state_t; 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Should not need dedicated suspend state as actual actions are no 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project different than open state. Suspend flags are needed however to prevent 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project media task from trying to restart stream during remote suspend or while 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project we are in the process of a local suspend */ 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING 0x1 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_AV_FLAG_REMOTE_SUSPEND 0x2 625fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren#define BTIF_AV_FLAG_PENDING_START 0x4 635fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren#define BTIF_AV_FLAG_PENDING_STOP 0x8 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local type definitions 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_HNDL bta_handle; 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_bdaddr_t peer_bda; 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_handle_t sm_handle; 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 flags; 75b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren tBTA_AV_EDR edr; 768bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh UINT8 peer_sep; /* sep type of peer device */ 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} btif_av_cb_t; 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 79f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptatypedef struct 80f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 81f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bt_bdaddr_t *target_bda; 82f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta uint16_t uuid; 83f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} btif_av_connect_req_t; 843e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 853e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodtypedef struct 863e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood{ 873e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood int sample_rate; 883e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood int channel_count; 896b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta bt_bdaddr_t peer_bd; 903e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood} btif_av_sink_config_req_t; 913e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static variables 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 953e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic btav_callbacks_t *bt_av_src_callbacks = NULL; 963e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic btav_callbacks_t *bt_av_sink_callbacks = NULL; 9712265e39b511f28425236b0dc97c78e7d837304bPavlin Radoslavovstatic btif_av_cb_t btif_av_cb = {0, {{0}}, 0, 0, 0, 0}; 9878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic alarm_t *av_open_on_rc_timer = NULL; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* both interface and media task needs to be ready to alloc incoming request */ 1013e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood#define CHECK_BTAV_INIT() if (((bt_av_src_callbacks == NULL) &&(bt_av_sink_callbacks == NULL)) \ 1023e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood || (btif_av_cb.sm_handle == NULL))\ 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{\ 104e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s: BTAV not initialized", __FUNCTION__);\ 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_NOT_READY;\ 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}\ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectelse\ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{\ 109e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__);\ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Helper macro to avoid code duplication in the state machine handlers */ 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define CHECK_RC_EVENT(e, d) \ 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_OPEN_EVT: \ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_CLOSE_EVT: \ 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_REMOTE_CMD_EVT: \ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_VENDOR_CMD_EVT: \ 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_META_MSG_EVT: \ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_FEAT_EVT: \ 120399e89150b3df87172bdf92d54712b379324b149Anubhav Gupta case BTA_AV_REMOTE_RSP_EVT: \ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { \ 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_rc_handler(e, d);\ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project }break; \ 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *data); 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *data); 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *data); 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *data); 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *data); 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const btif_sm_handler_t btif_av_state_handlers[] = 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_state_idle_handler, 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_state_opening_handler, 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_state_opened_handler, 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_state_started_handler, 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_state_closing_handler 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 140ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbachstatic void btif_av_event_free_data(btif_sm_event_t event, void *p_data); 141ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************* 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Extern functions 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*************************************************************************/ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void btif_rc_handler(tBTA_AV_EVT event, tBTA_AV *p_data); 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern BOOLEAN btif_rc_get_connected_peer(BD_ADDR peer_addr); 1476b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Guptaextern UINT8 btif_rc_get_connected_peer_handle(void); 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void btif_rc_check_handle_pending_play (BD_ADDR peer_addr, BOOLEAN bSendToApp); 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovextern fixed_queue_t *btu_general_alarm_queue; 15178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local helper functions 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst char *dump_av_sm_state_name(btif_av_state_t state) 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (state) 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_STATE_IDLE) 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_STATE_OPENING) 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_STATE_OPENED) 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_STATE_STARTED) 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_STATE_CLOSING) 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: return "UNKNOWN_STATE"; 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst char *dump_av_sm_event_name(btif_av_sm_event_t event) 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch((int)event) 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_ENABLE_EVT) 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_REGISTER_EVT) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_OPEN_EVT) 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_CLOSE_EVT) 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_START_EVT) 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_STOP_EVT) 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_PROTECT_REQ_EVT) 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_PROTECT_RSP_EVT) 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_RC_OPEN_EVT) 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_RC_CLOSE_EVT) 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_REMOTE_CMD_EVT) 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_REMOTE_RSP_EVT) 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_VENDOR_CMD_EVT) 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_VENDOR_RSP_EVT) 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_RECONFIG_EVT) 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_SUSPEND_EVT) 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_PENDING_EVT) 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_META_MSG_EVT) 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_REJECT_EVT) 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_RC_FEAT_EVT) 19347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule CASE_RETURN_STR(BTA_AV_OFFLOAD_START_RSP_EVT) 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_SM_ENTER_EVT) 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_SM_EXIT_EVT) 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_CONNECT_REQ_EVT) 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_DISCONNECT_REQ_EVT) 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_START_STREAM_REQ_EVT) 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_STOP_STREAM_REQ_EVT) 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_SUSPEND_STREAM_REQ_EVT) 2013e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood CASE_RETURN_STR(BTIF_AV_SINK_CONFIG_REQ_EVT) 20247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule CASE_RETURN_STR(BTIF_AV_OFFLOAD_START_REQ_EVT) 2036b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 2046b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta CASE_RETURN_STR(BTIF_AV_SINK_FOCUS_REQ_EVT) 2056b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: return "UNKNOWN_EVENT"; 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/**************************************************************************** 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local helper functions 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 21578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov** Function btif_initiate_av_open_timer_timeout 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Timer to trigger AV open if the remote headset establishes 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** RC connection w/o AV connection. The timer is needed to IOP 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with headsets that do establish AV after RC connection. 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 22478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavovstatic void btif_initiate_av_open_timer_timeout(UNUSED_ATTR void *data) 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR peer_addr; 227f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_av_connect_req_t connect_req; 22878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* is there at least one RC connection - There should be */ 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_rc_get_connected_peer(peer_addr)) { 231e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s Issuing connect to the remote RC peer", __FUNCTION__); 232f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* In case of AVRCP connection request, we will initiate SRC connection */ 233f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta connect_req.target_bda = (bt_bdaddr_t*)&peer_addr; 2346b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta if(bt_av_sink_callbacks != NULL) 2356b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta connect_req.uuid = UUID_SERVCLASS_AUDIO_SINK; 2366b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta else if(bt_av_src_callbacks != NULL) 2376b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta connect_req.uuid = UUID_SERVCLASS_AUDIO_SOURCE; 238f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req); 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 242e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s No connected RC peers", __FUNCTION__); 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static functions 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 250547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal/******************************************************************************* 251547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** 252547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** Function btif_report_connection_state 253547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** 254547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** Description Updates the components via the callbacks about the connection 255547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** state of a2dp connection. 256547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** 257547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** Returns None 258547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** 259547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal*******************************************************************************/ 2603e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic void btif_report_connection_state(btav_connection_state_t state, bt_bdaddr_t *bd_addr) 2613e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood{ 2625e45edb7f50497436d00423327c55707588211ebAnubhav Gupta if (bt_av_sink_callbacks != NULL) { 2633e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood HAL_CBACK(bt_av_sink_callbacks, connection_state_cb, state, bd_addr); 2645e45edb7f50497436d00423327c55707588211ebAnubhav Gupta } else if (bt_av_src_callbacks != NULL) { 2653e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood HAL_CBACK(bt_av_src_callbacks, connection_state_cb, state, bd_addr); 2663e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 2673e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood} 2683e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 269547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal/******************************************************************************* 270547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** 271547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** Function btif_report_audio_state 272547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** 273547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** Description Updates the components via the callbacks about the audio 274547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** state of a2dp connection. The state is updated when either 275547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** the remote ends starts streaming (started state) or whenever 276547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** it transitions out of started state (to opened or streaming) 277547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** state. 278547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** 279547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** Returns None 280547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** 281547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal*******************************************************************************/ 2823e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic void btif_report_audio_state(btav_audio_state_t state, bt_bdaddr_t *bd_addr) 2833e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood{ 2845e45edb7f50497436d00423327c55707588211ebAnubhav Gupta if (bt_av_sink_callbacks != NULL) { 2853e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood HAL_CBACK(bt_av_sink_callbacks, audio_state_cb, state, bd_addr); 2865e45edb7f50497436d00423327c55707588211ebAnubhav Gupta } else if (bt_av_src_callbacks != NULL) { 2873e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood HAL_CBACK(bt_av_src_callbacks, audio_state_cb, state, bd_addr); 2883e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 2893e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood} 2903e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 293f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Function btif_av_state_idle_handler 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description State managing disconnected AV link 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if event was processed, FALSE otherwise 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *p_data) 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 303e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event), btif_av_cb.flags); 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_ENTER_EVT: 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear the peer_bda */ 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&btif_av_cb.peer_bda, 0, sizeof(bt_bdaddr_t)); 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags = 0; 312b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_av_cb.edr = 0; 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_on_idle(); 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_EXIT_EVT: 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_ENABLE_EVT: 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_REGISTER_EVT: 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.bta_handle = ((tBTA_AV*)p_data)->registr.hndl; 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_PENDING_EVT: 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_CONNECT_REQ_EVT: 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == BTIF_AV_CONNECT_REQ_EVT) 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 331f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta memcpy(&btif_av_cb.peer_bda, ((btif_av_connect_req_t*)p_data)->target_bda, 332f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta sizeof(bt_bdaddr_t)); 333f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle, 3349c264e92305f84a5e8a92bc859812def0ce71792Anubhav Gupta TRUE, BTA_SEC_AUTHENTICATE, ((btif_av_connect_req_t*)p_data)->uuid); 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (event == BTA_AV_PENDING_EVT) 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(btif_av_cb.peer_bda.address, ((tBTA_AV*)p_data)->pend.bd_addr); 3396b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta if (bt_av_src_callbacks != NULL) 3406b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta { 3416b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle, 3426b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta TRUE, BTA_SEC_AUTHENTICATE, UUID_SERVCLASS_AUDIO_SOURCE); 3436b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 3446b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta if (bt_av_sink_callbacks != NULL) 3456b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta { 3466b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle, 3476b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta TRUE, BTA_SEC_AUTHENTICATE, UUID_SERVCLASS_AUDIO_SINK); 3486b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENING); 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } break; 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_OPEN_EVT: 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* IOP_FIX: Jabra 620 only does RC open without AV open whenever it connects. So 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * as per the AV WP, an AVRC connection cannot exist without an AV connection. Therefore, 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * we initiate an AV connection if an RC_OPEN_EVT is received when we are in AV_CLOSED state. 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * We initiate the AV connection after a small 3s timeout to avoid any collisions from the 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * headsets, as some headsets initiate the AVRC connection first and then 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * immediately initiate the AV connection 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * TODO: We may need to do this only on an AVRCP Play. FixMe 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 364e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_AV_RC_OPEN_EVT received w/o AV"); 36578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set_on_queue(av_open_on_rc_timer, 36678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTIF_TIMEOUT_AV_OPEN_ON_RC_MS, 36778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_initiate_av_open_timer_timeout, NULL, 36878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btu_general_alarm_queue); 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_rc_handler(event, p_data); 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3726b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta /* 3736b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * In case Signalling channel is not down 3746b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * and remote started Streaming Procedure 3756b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * we have to handle config and open event in 3766b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * idle_state. We hit these scenarios while running 3776b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * PTS test case for AVRCP Controller 3786b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta */ 3796b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta case BTIF_AV_SINK_CONFIG_REQ_EVT: 3806b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta { 3816b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_av_sink_config_req_t req; 3826b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta // copy to avoid alignment problems 3836b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta memcpy(&req, p_data, sizeof(req)); 3846b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 3856b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTIF_TRACE_WARNING("BTIF_AV_SINK_CONFIG_REQ_EVT %d %d", req.sample_rate, 3866b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta req.channel_count); 3876b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta if (bt_av_sink_callbacks != NULL) { 3886b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta HAL_CBACK(bt_av_sink_callbacks, audio_config_cb, &(req.peer_bd), 3896b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta req.sample_rate, req.channel_count); 3906b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 3916b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } break; 3926b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 3936b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta case BTA_AV_OPEN_EVT: 3946b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta { 3956b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta tBTA_AV *p_bta_data = (tBTA_AV*)p_data; 3966b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btav_connection_state_t state; 3976b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_sm_state_t av_state; 3986b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTIF_TRACE_DEBUG("status:%d, edr 0x%x",p_bta_data->open.status, 3996b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta p_bta_data->open.edr); 4006b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 4016b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta if (p_bta_data->open.status == BTA_AV_SUCCESS) 4026b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta { 4036b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta state = BTAV_CONNECTION_STATE_CONNECTED; 4046b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta av_state = BTIF_AV_STATE_OPENED; 4056b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_av_cb.edr = p_bta_data->open.edr; 4066b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 4076b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_av_cb.peer_sep = p_bta_data->open.sep; 4086b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_a2dp_set_peer_sep(p_bta_data->open.sep); 4096b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 4106b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta else 4116b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta { 4126b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTIF_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d", 4136b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta p_bta_data->open.status ); 4146b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta state = BTAV_CONNECTION_STATE_DISCONNECTED; 4156b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta av_state = BTIF_AV_STATE_IDLE; 4166b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 4176b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 4186b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta /* inform the application of the event */ 4196b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_report_connection_state(state, &(btif_av_cb.peer_bda)); 4206b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta /* change state to open/idle based on the status */ 4216b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_sm_change_state(btif_av_cb.sm_handle, av_state); 4226b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 4236b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta { 4246b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta /* if queued PLAY command, send it now */ 4256b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr, 4266b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta (p_bta_data->open.status == BTA_AV_SUCCESS)); 4276b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 4286b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta else if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) 4296b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta { 4306b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta /* if queued PLAY command, send it now */ 4316b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr, FALSE); 4326b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta /* Bring up AVRCP connection too */ 4336b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTA_AvOpenRc(btif_av_cb.bta_handle); 4346b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 4356b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_queue_advance(); 4366b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } break; 4376b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_REMOTE_CMD_EVT: 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_VENDOR_CMD_EVT: 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_META_MSG_EVT: 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_FEAT_EVT: 442399e89150b3df87172bdf92d54712b379324b149Anubhav Gupta case BTA_AV_REMOTE_RSP_EVT: 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_rc_handler(event, (tBTA_AV*)p_data); 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_CLOSE_EVT: 44778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTIF_TRACE_DEBUG("BTA_AV_RC_CLOSE_EVT: Stopping AV timer."); 44878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_cancel(av_open_on_rc_timer); 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_rc_handler(event, p_data); 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule case BTIF_AV_OFFLOAD_START_REQ_EVT: 45347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule BTIF_TRACE_ERROR("BTIF_AV_OFFLOAD_START_REQ_EVT: Stream not Started IDLE"); 45447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule btif_a2dp_on_offload_started(BTA_AV_FAIL); 45547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule break; 45647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 458e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event)); 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 463ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_state_opening_handler 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Intermediate state managing events during establishment 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** of avdtp channel 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if event was processed, FALSE otherwise 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data) 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 479e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event), btif_av_cb.flags); 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_ENTER_EVT: 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application that we are entering connecting state */ 4863e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_CONNECTING, &(btif_av_cb.peer_bda)); 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_EXIT_EVT: 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 492f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case BTA_AV_REJECT_EVT: 493e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG(" Received BTA_AV_REJECT_EVT "); 4943e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda)); 495f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE); 496f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 497f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_OPEN_EVT: 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV *p_bta_data = (tBTA_AV*)p_data; 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btav_connection_state_t state; 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_state_t av_state; 503e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("status:%d, edr 0x%x",p_bta_data->open.status, 504b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren p_bta_data->open.edr); 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bta_data->open.status == BTA_AV_SUCCESS) 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project state = BTAV_CONNECTION_STATE_CONNECTED; 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project av_state = BTIF_AV_STATE_OPENED; 510b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_av_cb.edr = p_bta_data->open.edr; 511f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 5123e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_av_cb.peer_sep = p_bta_data->open.sep; 5133e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_a2dp_set_peer_sep(p_bta_data->open.sep); 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 517e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d", 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bta_data->open.status ); 5196b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BD_ADDR peer_addr; 5206b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta if ((btif_rc_get_connected_peer(peer_addr)) 5216b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta &&(!bdcmp(btif_av_cb.peer_bda.address, peer_addr))) 5226b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta { 5236b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta /* 5246b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * Disconnect AVRCP connection, if 5256b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * A2DP conneciton failed, for any reason 5266b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta */ 5276b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTIF_TRACE_WARNING(" Disconnecting AVRCP "); 5286b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTA_AvCloseRc(btif_rc_get_connected_peer_handle()); 5296b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project state = BTAV_CONNECTION_STATE_DISCONNECTED; 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project av_state = BTIF_AV_STATE_IDLE; 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application of the event */ 5353e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(state, &(btif_av_cb.peer_bda)); 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* change state to open/idle based on the status */ 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, av_state); 5383e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 539f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 540f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* if queued PLAY command, send it now */ 541f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr, 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_bta_data->open.status == BTA_AV_SUCCESS)); 543f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 5443e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood else if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) 545f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 546f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* if queued PLAY command, send it now */ 547f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr, FALSE); 5484ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood /* Bring up AVRCP connection too */ 5494ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood BTA_AvOpenRc(btif_av_cb.bta_handle); 550f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_queue_advance(); 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } break; 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5543e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood case BTIF_AV_SINK_CONFIG_REQ_EVT: 5553e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood { 5563e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_av_sink_config_req_t req; 5573e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood // copy to avoid alignment problems 5583e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood memcpy(&req, p_data, sizeof(req)); 5593e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 560e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("BTIF_AV_SINK_CONFIG_REQ_EVT %d %d", req.sample_rate, 5613e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood req.channel_count); 5623e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) { 5633e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood HAL_CBACK(bt_av_sink_callbacks, audio_config_cb, &(btif_av_cb.peer_bda), 5643e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood req.sample_rate, req.channel_count); 5653e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 5663e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } break; 5673e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 568fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta case BTIF_AV_CONNECT_REQ_EVT: 569fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta // Check for device, if same device which moved to opening then ignore callback 570fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta if (memcmp ((bt_bdaddr_t*)p_data, &(btif_av_cb.peer_bda), 571fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta sizeof(btif_av_cb.peer_bda)) == 0) 572fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta { 573fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta BTIF_TRACE_DEBUG("%s: Same device moved to Opening state,ignore Connect Req", __func__); 574fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta btif_queue_advance(); 575fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta break; 576fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta } 577fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta else 578fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta { 579fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta BTIF_TRACE_DEBUG("%s: Moved from idle by Incoming Connection request", __func__); 580fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, (bt_bdaddr_t*)p_data); 581fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta btif_queue_advance(); 582fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta break; 583fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta } 584fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta 585fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta case BTA_AV_PENDING_EVT: 586fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta // Check for device, if same device which moved to opening then ignore callback 587fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta if (memcmp (((tBTA_AV*)p_data)->pend.bd_addr, &(btif_av_cb.peer_bda), 588fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta sizeof(btif_av_cb.peer_bda)) == 0) 589fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta { 590fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta BTIF_TRACE_DEBUG("%s: Same device moved to Opening state,ignore Pending Req", __func__); 591fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta break; 592fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta } 593fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta else 594fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta { 595fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta BTIF_TRACE_DEBUG("%s: Moved from idle by outgoing Connection request", __func__); 596fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta BTA_AvDisconnect(((tBTA_AV*)p_data)->pend.bd_addr); 597fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta break; 598fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta } 599fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta 60047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule case BTIF_AV_OFFLOAD_START_REQ_EVT: 60147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule btif_a2dp_on_offload_started(BTA_AV_FAIL); 60247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule BTIF_TRACE_ERROR("BTIF_AV_OFFLOAD_START_REQ_EVT: Stream not Started OPENING"); 60347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule break; 60447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 6052a6246f85c515f33eb4f9ff708f50680b1cb1653Ayan Ghosh case BTA_AV_CLOSE_EVT: 6062a6246f85c515f33eb4f9ff708f50680b1cb1653Ayan Ghosh btif_a2dp_on_stopped(NULL); 6072a6246f85c515f33eb4f9ff708f50680b1cb1653Ayan Ghosh btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, 6082a6246f85c515f33eb4f9ff708f50680b1cb1653Ayan Ghosh &(btif_av_cb.peer_bda)); 6092a6246f85c515f33eb4f9ff708f50680b1cb1653Ayan Ghosh btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE); 6102a6246f85c515f33eb4f9ff708f50680b1cb1653Ayan Ghosh break; 6112a6246f85c515f33eb4f9ff708f50680b1cb1653Ayan Ghosh 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_RC_EVENT(event, p_data); 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 615e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event)); 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_state_closing_handler 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Intermediate state managing events during closing 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** of avdtp channel 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if event was processed, FALSE otherwise 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *p_data) 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 636e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event), btif_av_cb.flags); 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_ENTER_EVT: 6423e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 643f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 644f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* immediately stop transmission of frames */ 645f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_tx_flush(TRUE); 646f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* wait for audioflinger to stop a2dp */ 647f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 6483e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) 649f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 650f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_rx_flush(TRUE); 651f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6545fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren case BTA_AV_STOP_EVT: 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_STOP_STREAM_REQ_EVT: 6563e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 657f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* immediately flush any pending tx frames while suspend is pending */ 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_set_tx_flush(TRUE); 660f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 6613e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) 662f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 663f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_rx_flush(TRUE); 664f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 666f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_on_stopped(NULL); 6673e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood break; 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_EXIT_EVT: 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_CLOSE_EVT: 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application that we are disconnecting */ 6753e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda)); 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE); 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Handle the RC_CLOSE event for the cleanup */ 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_CLOSE_EVT: 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_rc_handler(event, (tBTA_AV*)p_data); 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 68547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule case BTIF_AV_OFFLOAD_START_REQ_EVT: 68647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule btif_a2dp_on_offload_started(BTA_AV_FAIL); 68747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule BTIF_TRACE_ERROR("BTIF_AV_OFFLOAD_START_REQ_EVT: Stream not Started Closing"); 68847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule break; 68947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 691e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event)); 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_state_opened_handler 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handles AV events while AVDTP is in OPEN state 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if event was processed, FALSE otherwise 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data) 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV *p_av = (tBTA_AV*)p_data; 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 712e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event), btif_av_cb.flags); 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (event == BTA_AV_REMOTE_CMD_EVT) && (btif_av_cb.flags & BTIF_AV_FLAG_REMOTE_SUSPEND) && 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_av->remote_cmd.rc_id == BTA_AV_RC_PLAY) ) 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 718e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s: Resetting remote suspend flag on RC PLAY", __FUNCTION__); 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND; 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_ENTER_EVT: 7255fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_STOP; 7265fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START; 727b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren break; 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_EXIT_EVT: 7305fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START; 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_START_STREAM_REQ_EVT: 734ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach if (btif_av_cb.peer_sep != AVDT_TSEP_SRC) 735ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach btif_a2dp_setup_codec(); 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvStart(); 7375fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_START; 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_START_EVT: 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 742e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("BTA_AV_START_EVT status %d, suspending %d, init %d", 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_av->start.status, p_av->start.suspending, p_av->start.initiator); 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_av->start.status == BTA_SUCCESS) && (p_av->start.suspending == TRUE)) 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 748a0124571e3d5455448dbfcea7617f583b20210f9Anubhav Gupta /* if remote tries to start a2dp when DUT is a2dp source 749a0124571e3d5455448dbfcea7617f583b20210f9Anubhav Gupta * then suspend. In case a2dp is sink and call is active 750a0124571e3d5455448dbfcea7617f583b20210f9Anubhav Gupta * then disconnect the AVDTP channel 751a0124571e3d5455448dbfcea7617f583b20210f9Anubhav Gupta */ 752a0124571e3d5455448dbfcea7617f583b20210f9Anubhav Gupta if (!(btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START)) 753a0124571e3d5455448dbfcea7617f583b20210f9Anubhav Gupta { 754a0124571e3d5455448dbfcea7617f583b20210f9Anubhav Gupta if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 755a0124571e3d5455448dbfcea7617f583b20210f9Anubhav Gupta { 756a0124571e3d5455448dbfcea7617f583b20210f9Anubhav Gupta BTIF_TRACE_EVENT("%s: trigger suspend as remote initiated!!", __FUNCTION__); 757a0124571e3d5455448dbfcea7617f583b20210f9Anubhav Gupta btif_dispatch_sm_event(BTIF_AV_SUSPEND_STREAM_REQ_EVT, NULL, 0); 758a0124571e3d5455448dbfcea7617f583b20210f9Anubhav Gupta } 759a0124571e3d5455448dbfcea7617f583b20210f9Anubhav Gupta } 760a0124571e3d5455448dbfcea7617f583b20210f9Anubhav Gupta 761f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* In case peer is A2DP SRC we do not want to ack commands on UIPC*/ 7623e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 763f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 764f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (btif_a2dp_on_started(&p_av->start, 765f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) != 0))) 766f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 767f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* only clear pending flag after acknowledgement */ 768f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START; 769f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 770379743beded881127703334e1dda2cd327ec651dZhihai Xu } 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remain in open state if status failed */ 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->start.status != BTA_AV_SUCCESS) 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7763e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) 777f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 778f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_rx_flush(FALSE); /* remove flush state, ready for streaming*/ 779f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 780f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 781379743beded881127703334e1dda2cd327ec651dZhihai Xu /* change state to started, send acknowledgement if start is pending */ 782379743beded881127703334e1dda2cd327ec651dZhihai Xu if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) { 7833e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 784f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_on_started(NULL, TRUE); 785379743beded881127703334e1dda2cd327ec651dZhihai Xu /* pending start flag will be cleared when exit current state */ 786379743beded881127703334e1dda2cd327ec651dZhihai Xu } 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_STARTED); 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } break; 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_DISCONNECT_REQ_EVT: 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvClose(btif_av_cb.bta_handle); 7933e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) { 7943e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood BTA_AvCloseRc(btif_av_cb.bta_handle); 7953e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application that we are disconnecting */ 7983e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda)); 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_CLOSE_EVT: 802f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* avdtp link is closed */ 8035fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_a2dp_on_stopped(NULL); 8045fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application that we are disconnected */ 8063e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda)); 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 808379743beded881127703334e1dda2cd327ec651dZhihai Xu /* change state to idle, send acknowledgement if start is pending */ 809379743beded881127703334e1dda2cd327ec651dZhihai Xu if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) { 810379743beded881127703334e1dda2cd327ec651dZhihai Xu btif_a2dp_ack_fail(); 811379743beded881127703334e1dda2cd327ec651dZhihai Xu /* pending start flag will be cleared when exit current state */ 812379743beded881127703334e1dda2cd327ec651dZhihai Xu } 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE); 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8165fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren case BTA_AV_RECONFIG_EVT: 8175fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren if((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) && 8185fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren (p_av->reconfig.status == BTA_AV_SUCCESS)) 8195fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren { 820e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("reconfig done BTA_AVstart()"); 8215fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren BTA_AvStart(); 8225fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren } 8235fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren else if(btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) 8245fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren { 8255fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START; 8265fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_a2dp_ack_fail(); 8275fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren } 8285fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren break; 8295fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 830fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta case BTIF_AV_CONNECT_REQ_EVT: 831fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta if (memcmp ((bt_bdaddr_t*)p_data, &(btif_av_cb.peer_bda), 832fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta sizeof(btif_av_cb.peer_bda)) == 0) 833fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta { 834fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta BTIF_TRACE_DEBUG("%s: Ignore BTIF_AV_CONNECT_REQ_EVT for same device", __func__); 835fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta } 836fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta else 837fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta { 838fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta BTIF_TRACE_DEBUG("%s: Moved to opened by Other Incoming Conn req", __func__); 839fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, 840fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta (bt_bdaddr_t*)p_data); 841fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta } 842fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta btif_queue_advance(); 843fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta break; 844fd0e9f1915dab624282c9d11ac6a1c7228c18c75Anubhav Gupta 84547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule case BTIF_AV_OFFLOAD_START_REQ_EVT: 84647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule btif_a2dp_on_offload_started(BTA_AV_FAIL); 84747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule BTIF_TRACE_ERROR("BTIF_AV_OFFLOAD_START_REQ_EVT: Stream not Started Opened"); 84847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule break; 84947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_RC_EVENT(event, p_data); 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 853e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event)); 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_state_started_handler 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handles AV events while A2DP stream is started 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if event was processed, FALSE otherwise 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data) 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV *p_av = (tBTA_AV*)p_data; 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 875e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event), btif_av_cb.flags); 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_ENTER_EVT: 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are again in started state, clear any remote suspend flags */ 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND; 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 885547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal /** 886547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal * Report to components above that we have entered the streaming 887547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal * stage, this should usually be followed by focus grant. 888547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal * see update_audio_focus_state() 889547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal */ 8903e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_audio_state(BTAV_AUDIO_STATE_STARTED, &(btif_av_cb.peer_bda)); 8914128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu 8924128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu /* increase the a2dp consumer task priority temporarily when start 8934128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu ** audio playing, to avoid overflow the audio packet queue. */ 8944128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu adjust_priority_a2dp(TRUE); 8954128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_EXIT_EVT: 8994128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu /* restore the a2dp consumer task priority when stop audio playing. */ 9004128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu adjust_priority_a2dp(FALSE); 9014128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9045fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren case BTIF_AV_START_STREAM_REQ_EVT: 9055fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren /* we were remotely started, just ack back the local request */ 9063e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 907f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_on_started(NULL, TRUE); 9085fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren break; 9095fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fixme -- use suspend = true always to work around issue with BTA AV */ 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_STOP_STREAM_REQ_EVT: 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_SUSPEND_STREAM_REQ_EVT: 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set pending flag to ensure btif task is not trying to restart 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stream while suspend is in progress */ 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags |= BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING; 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we were remotely suspended but suspend locally, local suspend 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project always overrides */ 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND; 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9223e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 923f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* immediately stop transmission of frames while suspend is pending */ 925f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_tx_flush(TRUE); 926f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 927f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 9283e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) { 929f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_rx_flush(TRUE); 9303e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_a2dp_on_stopped(NULL); 9313e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvStop(TRUE); 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_DISCONNECT_REQ_EVT: 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* request avdtp to close */ 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvClose(btif_av_cb.bta_handle); 9403e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) { 9413e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood BTA_AvCloseRc(btif_av_cb.bta_handle); 9423e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application that we are disconnecting */ 9453e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda)); 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* wait in closing state until fully closed */ 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_CLOSING); 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_SUSPEND_EVT: 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 953e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("BTA_AV_SUSPEND_EVT status %d, init %d", 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_av->suspend.status, p_av->suspend.initiator); 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* a2dp suspended, stop media task until resumed */ 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_on_suspended(&p_av->suspend); 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if not successful, remain in current state */ 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->suspend.status != BTA_AV_SUCCESS) 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags &= ~BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING; 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9643e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 965f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* suspend failed, reset back tx flush state */ 967f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_tx_flush(FALSE); 968f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->suspend.initiator != TRUE) 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remote suspend, notify HAL and await audioflinger to 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend/stop stream */ 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set remote suspend flag to block media task from restarting 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stream only if we did not already initiate a local suspend */ 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btif_av_cb.flags & BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING) == 0) 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags |= BTIF_AV_FLAG_REMOTE_SUSPEND; 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9823e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_audio_state(BTAV_AUDIO_STATE_REMOTE_SUSPEND, &(btif_av_cb.peer_bda)); 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9863e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_audio_state(BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda)); 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENED); 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* suspend completed and state changed, clear pending status */ 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags &= ~BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING; 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_STOP_EVT: 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9975fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP; 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_on_stopped(&p_av->suspend); 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10003e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_audio_state(BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda)); 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if stop was successful, change state to open */ 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->suspend.status == BTA_AV_SUCCESS) 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENED); 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_CLOSE_EVT: 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10105fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP; 10115fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* avdtp link is closed */ 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_on_stopped(NULL); 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application that we are disconnected */ 10163e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda)); 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE); 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 102147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule case BTIF_AV_OFFLOAD_START_REQ_EVT: 102247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule BTA_AvOffloadStart(btif_av_cb.bta_handle); 102347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule break; 102447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 102547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule case BTA_AV_OFFLOAD_START_RSP_EVT: 102647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 102747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule btif_a2dp_on_offload_started(p_av->status); 102847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule break; 102947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_RC_EVENT(event, p_data); 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1033e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event)); 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local event handlers 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_av_handle_event(UINT16 event, char* p_param) 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10476b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta switch(event) 10486b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta { 10496b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta case BTIF_AV_CLEANUP_REQ_EVT: 10506b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTIF_TRACE_EVENT("%s: BTIF_AV_CLEANUP_REQ_EVT", __FUNCTION__); 10516b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_a2dp_stop_media_task(); 10526b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta break; 10536b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 10546b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta default: 10556b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_sm_dispatch(btif_av_cb.sm_handle, event, (void*)p_param); 10566b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_av_event_free_data(event, p_param); 10576b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1060ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbachvoid btif_av_event_deep_copy(UINT16 event, char *p_dest, char *p_src) 1061ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach{ 1062ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach tBTA_AV *av_src = (tBTA_AV *)p_src; 1063ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach tBTA_AV *av_dest = (tBTA_AV *)p_dest; 1064ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach 1065ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach // First copy the structure 10663f06e14fddc0e674347ae28ea4a25218d4ce1d2aPavlin Radoslavov maybe_non_aligned_memcpy(av_dest, av_src, sizeof(*av_src)); 1067ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach 1068ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach switch (event) 1069ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach { 1070ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach case BTA_AV_META_MSG_EVT: 1071ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach if (av_src->meta_msg.p_data && av_src->meta_msg.len) 1072ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach { 1073ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach av_dest->meta_msg.p_data = osi_calloc(av_src->meta_msg.len); 10745fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov memcpy(av_dest->meta_msg.p_data, av_src->meta_msg.p_data, 10755fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov av_src->meta_msg.len); 1076ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach } 1077ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach 1078ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach if (av_src->meta_msg.p_msg) 1079ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach { 1080ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach av_dest->meta_msg.p_msg = osi_calloc(sizeof(tAVRC_MSG)); 10815fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov memcpy(av_dest->meta_msg.p_msg, av_src->meta_msg.p_msg, 10825fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov sizeof(tAVRC_MSG)); 1083ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach 1084ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach if (av_src->meta_msg.p_msg->vendor.p_vendor_data && 1085ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach av_src->meta_msg.p_msg->vendor.vendor_len) 1086ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach { 1087ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach av_dest->meta_msg.p_msg->vendor.p_vendor_data = osi_calloc( 1088ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach av_src->meta_msg.p_msg->vendor.vendor_len); 1089ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach memcpy(av_dest->meta_msg.p_msg->vendor.p_vendor_data, 1090ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach av_src->meta_msg.p_msg->vendor.p_vendor_data, 1091ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach av_src->meta_msg.p_msg->vendor.vendor_len); 1092ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach } 1093ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach } 1094ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach break; 1095ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach 1096ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach default: 1097ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach break; 1098ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach } 1099ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach} 1100ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach 1101ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbachstatic void btif_av_event_free_data(btif_sm_event_t event, void *p_data) 1102ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach{ 1103ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach switch (event) 1104ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach { 1105ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach case BTA_AV_META_MSG_EVT: 1106ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach { 110720524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov tBTA_AV *av = (tBTA_AV *)p_data; 110820524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov osi_free_and_reset((void **)&av->meta_msg.p_data); 1109ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach 111020524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov if (av->meta_msg.p_msg) { 111120524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov osi_free(av->meta_msg.p_msg->vendor.p_vendor_data); 111220524d393e8b3bea4c573f7980cd843500b0e6a4Pavlin Radoslavov osi_free_and_reset((void **)&av->meta_msg.p_msg); 1113ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach } 1114ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach } 1115ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach break; 1116ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach 1117ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach default: 1118ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach break; 1119ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach } 1120ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach} 1121ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bte_av_callback(tBTA_AV_EVT event, tBTA_AV *p_data) 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_transfer_context(btif_av_handle_event, event, 1125ee03972892ca31fe47a759f69be15dd46b0abefeAndre Eisenbach (char*)p_data, sizeof(tBTA_AV), btif_av_event_deep_copy); 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1128f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void bte_av_media_callback(tBTA_AV_EVT event, tBTA_AV_MEDIA *p_data) 1129f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 1130f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_sm_state_t state; 1131f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 que_len; 11323e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood tA2D_STATUS a2d_status; 11333e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood tA2D_SBC_CIE sbc_cie; 11343e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_av_sink_config_req_t config_req; 1135f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1136f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (event == BTA_AV_MEDIA_DATA_EVT)/* Switch to BTIF_MEDIA context */ 1137f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1138f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta state= btif_sm_get_state(btif_av_cb.sm_handle); 1139f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if ( (state == BTIF_AV_STATE_STARTED) || /* send SBC packets only in Started State */ 1140f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (state == BTIF_AV_STATE_OPENED) ) 1141f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1142f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta que_len = btif_media_sink_enque_buf((BT_HDR *)p_data); 1143e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG(" Packets in Que %d",que_len); 1144f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1145f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else 1146f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return; 1147f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1148f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 11493e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (event == BTA_AV_MEDIA_SINK_CFG_EVT) { 11503e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood /* send a command to BT Media Task */ 11516b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_reset_decoder((UINT8*)(p_data->avk_config.codec_info)); 11526b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta a2d_status = A2D_ParsSbcInfo(&sbc_cie, (UINT8 *)(p_data->avk_config.codec_info), FALSE); 11533e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (a2d_status == A2D_SUCCESS) { 11543e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood /* Switch to BTIF context */ 11553e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood config_req.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq); 11563e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood config_req.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode); 11576b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta memcpy(&config_req.peer_bd,(UINT8*)(p_data->avk_config.bd_addr), 11586b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta sizeof(config_req.peer_bd)); 11593e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_transfer_context(btif_av_handle_event, BTIF_AV_SINK_CONFIG_REQ_EVT, 11603e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood (char*)&config_req, sizeof(config_req), NULL); 11613e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } else { 1162e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status); 11633e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 11643e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 1165f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_init 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initializes btif AV if not already done 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11766b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Guptabt_status_t btif_av_init(int service_id) 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_av_cb.sm_handle == NULL) 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 118078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_free(av_open_on_rc_timer); 118178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov av_open_on_rc_timer = alarm_new("btif_av.av_open_on_rc_timer"); 1182e13fbfafe2105d264357ac41133f0ac0e054429cSharvil Nanavati if (!btif_a2dp_start_media_task()) 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11856b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_enable_service(service_id); 11866b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 11878bc9ca592a1c80d50f85b4dafba24ba2394b4ab7Avish Shah /* Also initialize the AV state machine */ 11888bc9ca592a1c80d50f85b4dafba24ba2394b4ab7Avish Shah btif_av_cb.sm_handle = 11898bc9ca592a1c80d50f85b4dafba24ba2394b4ab7Avish Shah btif_sm_init((const btif_sm_handler_t*)btif_av_state_handlers, BTIF_AV_STATE_IDLE); 11908bc9ca592a1c80d50f85b4dafba24ba2394b4ab7Avish Shah 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_on_init(); 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 119498b744f270323db14705c1251bc7bc89d196e16dAndre Eisenbach return BT_STATUS_SUCCESS; 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11993e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Function init_src 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12013e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Description Initializes the AV interface for source mode 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12073e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic bt_status_t init_src(btav_callbacks_t* callbacks) 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 120998b744f270323db14705c1251bc7bc89d196e16dAndre Eisenbach BTIF_TRACE_EVENT("%s()", __func__); 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12116b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta bt_status_t status = btif_av_init(BTA_A2DP_SOURCE_SERVICE_ID); 121298b744f270323db14705c1251bc7bc89d196e16dAndre Eisenbach if (status == BT_STATUS_SUCCESS) 12133e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood bt_av_src_callbacks = callbacks; 12143e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 12153e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood return status; 12163e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood} 12173e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 12183e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood/******************************************************************************* 12193e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 12203e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Function init_sink 12213e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 12223e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Description Initializes the AV interface for sink mode 12233e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 12243e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Returns bt_status_t 12253e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 12263e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood*******************************************************************************/ 12273e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 12283e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic bt_status_t init_sink(btav_callbacks_t* callbacks) 12293e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood{ 123098b744f270323db14705c1251bc7bc89d196e16dAndre Eisenbach BTIF_TRACE_EVENT("%s()", __func__); 12313e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 12326b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta bt_status_t status = btif_av_init(BTA_A2DP_SINK_SERVICE_ID); 123398b744f270323db14705c1251bc7bc89d196e16dAndre Eisenbach if (status == BT_STATUS_SUCCESS) 12343e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood bt_av_sink_callbacks = callbacks; 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12363e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood return status; 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12396b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 12406b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta/******************************************************************************* 12416b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta** 1242547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** Function update_audio_focus_state 12436b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta** 1244547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** Description Updates the final focus state reported by components calling 1245547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal** this module. 12466b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta** 12476b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta** Returns None 12486b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta** 12496b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta*******************************************************************************/ 1250547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwalvoid update_audio_focus_state(int state) 12516b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta{ 12526b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTIF_TRACE_DEBUG("%s state %d ",__func__, state); 12536b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_a2dp_set_audio_focus_state(state); 12546b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta} 12556b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 125638487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal/******************************************************************************* 125738487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal** 125838487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal** Function update_audio_track_gain 125938487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal** 126038487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal** Description Updates the track gain (used for ducking). 126138487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal** 126238487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal** Returns None 126338487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal** 126438487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal*******************************************************************************/ 126538487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwalvoid update_audio_track_gain(float gain) 126638487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal{ 126738487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal BTIF_TRACE_DEBUG("%s gain %f ",__func__, gain); 126838487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal btif_a2dp_set_audio_track_gain(gain); 126938487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal} 12706b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 12716b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function connect 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Establishes the AV signalling channel with the remote headset 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1282f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic bt_status_t connect_int(bt_bdaddr_t *bd_addr, uint16_t uuid) 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1284f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_av_connect_req_t connect_req; 1285f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta connect_req.target_bda = bd_addr; 1286f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta connect_req.uuid = uuid; 1287e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1289f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req); 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1294d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xiestatic bt_status_t src_connect_sink(bt_bdaddr_t *bd_addr) 1295f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 1296e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 1297f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta CHECK_BTAV_INIT(); 12983e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 1299d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, bd_addr, connect_int); 1300f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 1301f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1302d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xiestatic bt_status_t sink_connect_src(bt_bdaddr_t *bd_addr) 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1304e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_BTAV_INIT(); 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1307d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie return btif_queue_connect(UUID_SERVCLASS_AUDIO_SINK, bd_addr, connect_int); 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function disconnect 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Tears down the AV signalling channel with the remote headset 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t disconnect(bt_bdaddr_t *bd_addr) 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1321e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_BTAV_INIT(); 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Switch to BTIF context */ 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btif_transfer_context(btif_av_handle_event, BTIF_AV_DISCONNECT_REQ_EVT, 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char*)bd_addr, sizeof(bt_bdaddr_t), NULL); 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function cleanup 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Shuts down the AV interface and does the cleanup 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 13396b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Guptastatic void cleanup(int service_uuid) 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1341e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13436b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_transfer_context(btif_av_handle_event, BTIF_AV_CLEANUP_REQ_EVT, NULL, 0, NULL); 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13456b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_disable_service(service_uuid); 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13473e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood /* Also shut down the AV state machine */ 13483e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_sm_shutdown(btif_av_cb.sm_handle); 13493e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_av_cb.sm_handle = NULL; 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13523e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic void cleanup_src(void) { 1353e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 13543e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 13553e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (bt_av_src_callbacks) 1356f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 13573e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood bt_av_src_callbacks = NULL; 13583e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (bt_av_sink_callbacks == NULL) 13596b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta cleanup(BTA_A2DP_SOURCE_SERVICE_ID); 1360f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1361f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 1362f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 13633e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic void cleanup_sink(void) { 1364e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 1365f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 13663e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (bt_av_sink_callbacks) 13673e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood { 13683e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood bt_av_sink_callbacks = NULL; 13693e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (bt_av_src_callbacks == NULL) 13706b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta cleanup(BTA_A2DP_SINK_SERVICE_ID); 13713e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 1372f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 1373f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 13743e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic const btav_interface_t bt_av_src_interface = { 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sizeof(btav_interface_t), 13763e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood init_src, 1377d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie src_connect_sink, 13783e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood disconnect, 13793e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood cleanup_src, 13806b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta NULL, 138138487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal NULL, 13823e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood}; 13833e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 13843e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic const btav_interface_t bt_av_sink_interface = { 13853e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood sizeof(btav_interface_t), 13863e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood init_sink, 1387d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie sink_connect_src, 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disconnect, 13893e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood cleanup_sink, 13906b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 1391547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal update_audio_focus_state, 139238487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal update_audio_track_gain, 13936b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#else 13946b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta NULL, 139538487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal NULL, 13966b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_get_sm_handle 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Fetches current av SM handle 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbtif_sm_handle_t btif_av_get_sm_handle(void) 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btif_av_cb.sm_handle; 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 141669682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh** Function btif_av_get_addr 141769682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh** 141869682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh** Description Fetches current AV BD address 141969682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh** 142069682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh** Returns BD address 142169682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh** 142269682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh*******************************************************************************/ 142369682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh 142469682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghoshbt_bdaddr_t btif_av_get_addr(void) 142569682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh{ 142669682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh return btif_av_cb.peer_bda; 142769682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh} 142869682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh 142969682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh/******************************************************************************* 1430470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGupta** Function btif_av_is_sink_enabled 1431470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGupta** 1432470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGupta** Description Checks if A2DP Sink is enabled or not 1433470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGupta** 1434470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGupta** Returns TRUE if A2DP Sink is enabled, false otherwise 1435470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGupta** 1436470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGupta*******************************************************************************/ 1437470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGupta 1438470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGuptaBOOLEAN btif_av_is_sink_enabled(void) 1439470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGupta{ 1440470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGupta return (bt_av_sink_callbacks != NULL) ? TRUE : FALSE; 1441470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGupta} 1442470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGupta 1443470466e6beea7ee10675ec780a2afa23bd8a3cd4AnubhavGupta/******************************************************************************* 144469682acf0149e9e51cda5b8747866ca9dc37b907Ayan Ghosh** 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_stream_ready 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Checks whether AV is ready for starting a stream 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_av_stream_ready(void) 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle); 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1457e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("btif_av_stream_ready : sm hdl %d, state %d, flags %x", 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.sm_handle, state, btif_av_cb.flags); 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* also make sure main adapter is enabled */ 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_is_enabled() == 0) 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1463e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("main adapter not enabled"); 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14675fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren /* check if we are remotely suspended or stop is pending */ 14685fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren if (btif_av_cb.flags & (BTIF_AV_FLAG_REMOTE_SUSPEND|BTIF_AV_FLAG_PENDING_STOP)) 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (state == BTIF_AV_STATE_OPENED); 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_stream_started_ready 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Checks whether AV ready for media start in streaming state 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_av_stream_started_ready(void) 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle); 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1488e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("btif_av_stream_started : sm hdl %d, state %d, flags %x", 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.sm_handle, state, btif_av_cb.flags); 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14915fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren /* disallow media task to start if we have pending actions */ 14925fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren if (btif_av_cb.flags & (BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING | BTIF_AV_FLAG_REMOTE_SUSPEND 14935fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren | BTIF_AV_FLAG_PENDING_STOP)) 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (state == BTIF_AV_STATE_STARTED); 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_dispatch_sm_event 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send event to AV statemachine 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* used to pass events to AV statemachine from other tasks */ 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_dispatch_sm_event(btif_av_sm_event_t event, void *p_data, int len) 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Switch to BTIF context */ 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_transfer_context(btif_av_handle_event, event, 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char*)p_data, len, NULL); 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_execute_service 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initializes/Shuts down the service 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbt_status_t btif_av_execute_service(BOOLEAN b_enable) 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (b_enable) 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* TODO: Removed BTA_SEC_AUTHORIZE since the Java/App does not 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * handle this request in order to allow incoming connections to succeed. 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * We need to put this back once support for this is added */ 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Added BTA_AV_FEAT_NO_SCO_SSPD - this ensures that the BTA does not 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * auto-suspend av streaming on AG events(SCO or Call). The suspend shall 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * be initiated by the app/audioflinger layers */ 15376b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta /* Support for browsing for SDP record should work only if we enable BROWSE 15386b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * while registering. */ 15399adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#if (AVRC_METADATA_INCLUDED == TRUE) 15409adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan BTA_AvEnable(BTA_SEC_AUTHENTICATE, 1541247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji BTA_AV_FEAT_RCTG|BTA_AV_FEAT_METADATA|BTA_AV_FEAT_VENDOR|BTA_AV_FEAT_NO_SCO_SSPD 1542247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#if (AVRC_ADV_CTRL_INCLUDED == TRUE) 1543247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji |BTA_AV_FEAT_RCCT 1544247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji |BTA_AV_FEAT_ADV_CTRL 1545247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#endif 1546247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji ,bte_av_callback); 15479adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#else 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvEnable(BTA_SEC_AUTHENTICATE, (BTA_AV_FEAT_RCTG | BTA_AV_FEAT_NO_SCO_SSPD), 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bte_av_callback); 15509adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#endif 15516b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTA_AvRegister(BTA_AV_CHNL_AUDIO, BTIF_AV_SERVICE_NAME, 0, bte_av_media_callback, 15526b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta UUID_SERVCLASS_AUDIO_SOURCE); 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvDeregister(btif_av_cb.bta_handle); 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvDisable(); 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 15639c8dface40b8427b3dc03ddd13ca7532f7d855d5Rakesh Iyer** Function btif_av_sink_execute_service 15649c8dface40b8427b3dc03ddd13ca7532f7d855d5Rakesh Iyer** 15659c8dface40b8427b3dc03ddd13ca7532f7d855d5Rakesh Iyer** Description Initializes/Shuts down the service 15669c8dface40b8427b3dc03ddd13ca7532f7d855d5Rakesh Iyer** 15679c8dface40b8427b3dc03ddd13ca7532f7d855d5Rakesh Iyer** Returns BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise 15689c8dface40b8427b3dc03ddd13ca7532f7d855d5Rakesh Iyer** 15699c8dface40b8427b3dc03ddd13ca7532f7d855d5Rakesh Iyer*******************************************************************************/ 15709c8dface40b8427b3dc03ddd13ca7532f7d855d5Rakesh Iyerbt_status_t btif_av_sink_execute_service(BOOLEAN b_enable) 15719c8dface40b8427b3dc03ddd13ca7532f7d855d5Rakesh Iyer{ 15726b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta if (b_enable) 15736b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta { 15746b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta /* Added BTA_AV_FEAT_NO_SCO_SSPD - this ensures that the BTA does not 15756b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * auto-suspend av streaming on AG events(SCO or Call). The suspend shall 15766b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta * be initiated by the app/audioflinger layers */ 15776b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTA_AvEnable(BTA_SEC_AUTHENTICATE, BTA_AV_FEAT_NO_SCO_SSPD|BTA_AV_FEAT_RCCT| 15786b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTA_AV_FEAT_METADATA|BTA_AV_FEAT_VENDOR| 15796b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTA_AV_FEAT_ADV_CTRL|BTA_AV_FEAT_RCTG, 15806b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta bte_av_callback); 15816b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTA_AvRegister(BTA_AV_CHNL_AUDIO, BTIF_AVK_SERVICE_NAME, 0, bte_av_media_callback, 15826b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta UUID_SERVCLASS_AUDIO_SINK); 15836b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 15846b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta else { 15856b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTA_AvDeregister(btif_av_cb.bta_handle); 15866b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTA_AvDisable(); 15876b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 15886b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta return BT_STATUS_SUCCESS; 15899c8dface40b8427b3dc03ddd13ca7532f7d855d5Rakesh Iyer} 15909c8dface40b8427b3dc03ddd13ca7532f7d855d5Rakesh Iyer 15919c8dface40b8427b3dc03ddd13ca7532f7d855d5Rakesh Iyer/******************************************************************************* 15929c8dface40b8427b3dc03ddd13ca7532f7d855d5Rakesh Iyer** 15933e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Function btif_av_get_src_interface 15943e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 15953e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Description Get the AV callback interface for A2DP source profile 15963e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 15973e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Returns btav_interface_t 15983e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 15993e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood*******************************************************************************/ 16003e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodconst btav_interface_t *btif_av_get_src_interface(void) 16013e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood{ 1602e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 16033e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood return &bt_av_src_interface; 16043e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood} 16053e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 16063e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood/******************************************************************************* 16073e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 16083e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Function btif_av_get_sink_interface 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16103e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Description Get the AV callback interface for A2DP sink profile 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns btav_interface_t 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16153e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodconst btav_interface_t *btif_av_get_sink_interface(void) 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1617e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 16183e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood return &bt_av_sink_interface; 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16235fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Function btif_av_is_connected 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16255fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Description Checks if av has a connected sink 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16275fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Returns BOOLEAN 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_av_is_connected(void) 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle); 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((state == BTIF_AV_STATE_OPENED) || (state == BTIF_AV_STATE_STARTED)); 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1635b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 1636b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren/******************************************************************************* 1637b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** 1638b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** Function btif_av_is_peer_edr 1639b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** 1640b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** Description Check if the connected a2dp device supports 1641b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** EDR or not. Only when connected this function 1642b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** will accurately provide a true capability of 1643b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** remote peer. If not connected it will always be false. 1644b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** 1645b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** Returns TRUE if remote device is capable of EDR 1646b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** 1647b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren*******************************************************************************/ 1648b8ceaa484a09be14263d5f10d022a272f9602378Mattias AgrenBOOLEAN btif_av_is_peer_edr(void) 1649b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren{ 1650b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren ASSERTC(btif_av_is_connected(), "No active a2dp connection", 0); 1651b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 1652b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren if (btif_av_cb.edr) 1653b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren return TRUE; 1654b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren else 1655b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren return FALSE; 1656b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren} 1657b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 16589c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta/****************************************************************************** 16599c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta** 16609c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta** Function btif_av_clear_remote_suspend_flag 16619c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta** 16629c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta** Description Clears btif_av_cd.flags if BTIF_AV_FLAG_REMOTE_SUSPEND is set 16639c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta** 16649c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta** Returns void 16659c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta******************************************************************************/ 16669c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Guptavoid btif_av_clear_remote_suspend_flag(void) 16679c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta{ 16689c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta BTIF_TRACE_DEBUG("%s: flag :%x",__func__, btif_av_cb.flags); 16699c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND; 16709c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta} 16718bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 16728bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh/******************************************************************************* 16738bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh** 16748bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh** Function btif_av_peer_supports_3mbps 16758bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh** 16768bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh** Description Check if the connected A2DP device supports 16778bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh** 3 Mbps EDR. This function only works if connected. 16788bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh** If not connected it will always be false. 16798bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh** 16808bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh** Returns TRUE if remote device is EDR and supports 3 Mbps 16818bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh** 16828bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh*******************************************************************************/ 16838bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan GhoshBOOLEAN btif_av_peer_supports_3mbps(void) 16848bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh{ 16858bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh BOOLEAN is3mbps = ((btif_av_cb.edr & BTA_AV_EDR_3MBPS) != 0); 16868bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh BTIF_TRACE_DEBUG("%s: connected %d, edr_3mbps %d", __func__, 16878bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_av_is_connected(), is3mbps); 16888bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh return (btif_av_is_connected() && is3mbps); 16898bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh} 1690