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 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Filename: btif_av.c 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Description: Bluedroid AV implementation 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bluetooth.h> 293e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood#include <system/audio.h> 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "hardware/bt_av.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LOG_TAG "BTIF_AV" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_av.h" 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_util.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_profile_queue.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_media.h" 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_av_api.h" 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h" 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bd.h" 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h" 434128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu#include "bt_utils.h" 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Constants & Macros 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_AV_SERVICE_NAME "Advanced Audio" 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_TIMEOUT_AV_OPEN_ON_RC_SECS 2 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef enum { 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_AV_STATE_IDLE = 0x0, 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_AV_STATE_OPENING, 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_AV_STATE_OPENED, 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_AV_STATE_STARTED, 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_AV_STATE_CLOSING 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} btif_av_state_t; 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Should not need dedicated suspend state as actual actions are no 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project different than open state. Suspend flags are needed however to prevent 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project media task from trying to restart stream during remote suspend or while 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project we are in the process of a local suspend */ 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING 0x1 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_AV_FLAG_REMOTE_SUSPEND 0x2 675fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren#define BTIF_AV_FLAG_PENDING_START 0x4 685fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren#define BTIF_AV_FLAG_PENDING_STOP 0x8 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local type definitions 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_HNDL bta_handle; 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bt_bdaddr_t peer_bda; 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_handle_t sm_handle; 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 flags; 80b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren tBTA_AV_EDR edr; 813e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood UINT8 peer_sep; /* sep type of peer device */ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} btif_av_cb_t; 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 84f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptatypedef struct 85f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 86f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta bt_bdaddr_t *target_bda; 87f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta uint16_t uuid; 88f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} btif_av_connect_req_t; 893e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 903e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodtypedef struct 913e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood{ 923e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood int sample_rate; 933e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood int channel_count; 943e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood} btif_av_sink_config_req_t; 953e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static variables 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 993e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic btav_callbacks_t *bt_av_src_callbacks = NULL; 1003e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic btav_callbacks_t *bt_av_sink_callbacks = NULL; 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic btif_av_cb_t btif_av_cb; 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic TIMER_LIST_ENT tle_av_open_on_rc; 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* both interface and media task needs to be ready to alloc incoming request */ 1053e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood#define CHECK_BTAV_INIT() if (((bt_av_src_callbacks == NULL) &&(bt_av_sink_callbacks == NULL)) \ 1063e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood || (btif_av_cb.sm_handle == NULL))\ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{\ 108e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s: BTAV not initialized", __FUNCTION__);\ 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_NOT_READY;\ 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}\ 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectelse\ 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{\ 113e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__);\ 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Helper macro to avoid code duplication in the state machine handlers */ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define CHECK_RC_EVENT(e, d) \ 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_OPEN_EVT: \ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_CLOSE_EVT: \ 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_REMOTE_CMD_EVT: \ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_VENDOR_CMD_EVT: \ 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_META_MSG_EVT: \ 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_FEAT_EVT: \ 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { \ 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_rc_handler(e, d);\ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project }break; \ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *data); 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *data); 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *data); 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *data); 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *data); 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const btif_sm_handler_t btif_av_state_handlers[] = 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_state_idle_handler, 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_state_opening_handler, 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_state_opened_handler, 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_state_started_handler, 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_state_closing_handler 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************* 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Extern functions 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*************************************************************************/ 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void btif_rc_handler(tBTA_AV_EVT event, tBTA_AV *p_data); 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern BOOLEAN btif_rc_get_connected_peer(BD_ADDR peer_addr); 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectextern void btif_rc_check_handle_pending_play (BD_ADDR peer_addr, BOOLEAN bSendToApp); 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local helper functions 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst char *dump_av_sm_state_name(btif_av_state_t state) 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (state) 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_STATE_IDLE) 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_STATE_OPENING) 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_STATE_OPENED) 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_STATE_STARTED) 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_STATE_CLOSING) 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: return "UNKNOWN_STATE"; 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst char *dump_av_sm_event_name(btif_av_sm_event_t event) 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch((int)event) 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_ENABLE_EVT) 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_REGISTER_EVT) 1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_OPEN_EVT) 1745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_CLOSE_EVT) 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_START_EVT) 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_STOP_EVT) 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_PROTECT_REQ_EVT) 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_PROTECT_RSP_EVT) 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_RC_OPEN_EVT) 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_RC_CLOSE_EVT) 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_REMOTE_CMD_EVT) 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_REMOTE_RSP_EVT) 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_VENDOR_CMD_EVT) 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_VENDOR_RSP_EVT) 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_RECONFIG_EVT) 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_SUSPEND_EVT) 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_PENDING_EVT) 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_META_MSG_EVT) 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_REJECT_EVT) 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTA_AV_RC_FEAT_EVT) 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_SM_ENTER_EVT) 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_SM_EXIT_EVT) 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_CONNECT_REQ_EVT) 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_DISCONNECT_REQ_EVT) 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_START_STREAM_REQ_EVT) 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_STOP_STREAM_REQ_EVT) 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_AV_SUSPEND_STREAM_REQ_EVT) 1983e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood CASE_RETURN_STR(BTIF_AV_SINK_CONFIG_REQ_EVT) 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: return "UNKNOWN_EVENT"; 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/**************************************************************************** 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local helper functions 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_initiate_av_open_tmr_hdlr 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Timer to trigger AV open if the remote headset establishes 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** RC connection w/o AV connection. The timer is needed to IOP 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** with headsets that do establish AV after RC connection. 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns void 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_initiate_av_open_tmr_hdlr(TIMER_LIST_ENT *tle) 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR peer_addr; 2205cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(tle); 221f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_av_connect_req_t connect_req; 222f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UNUSED(tle); 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* is there at least one RC connection - There should be */ 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_rc_get_connected_peer(peer_addr)) { 225e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s Issuing connect to the remote RC peer", __FUNCTION__); 226f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* In case of AVRCP connection request, we will initiate SRC connection */ 227f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta connect_req.target_bda = (bt_bdaddr_t*)&peer_addr; 228f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta connect_req.uuid = UUID_SERVCLASS_AUDIO_SOURCE; 229f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req); 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 233e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_ERROR("%s No connected RC peers", __FUNCTION__); 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Static functions 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2413e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic void btif_report_connection_state(btav_connection_state_t state, bt_bdaddr_t *bd_addr) 2423e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood{ 2433e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) { 2443e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood HAL_CBACK(bt_av_sink_callbacks, connection_state_cb, state, bd_addr); 2453e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } else if (btif_av_cb.peer_sep == AVDT_TSEP_SNK && bt_av_src_callbacks != NULL) { 2463e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood HAL_CBACK(bt_av_src_callbacks, connection_state_cb, state, bd_addr); 2473e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 2483e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood} 2493e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 2503e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic void btif_report_audio_state(btav_audio_state_t state, bt_bdaddr_t *bd_addr) 2513e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood{ 2523e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) { 2533e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood HAL_CBACK(bt_av_sink_callbacks, audio_state_cb, state, bd_addr); 2543e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } else if (btif_av_cb.peer_sep == AVDT_TSEP_SNK && bt_av_src_callbacks != NULL) { 2553e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood HAL_CBACK(bt_av_src_callbacks, audio_state_cb, state, bd_addr); 2563e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 2573e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood} 2583e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 261f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Function btif_av_state_idle_handler 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description State managing disconnected AV link 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if event was processed, FALSE otherwise 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *p_data) 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 271e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event), btif_av_cb.flags); 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_ENTER_EVT: 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear the peer_bda */ 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&btif_av_cb.peer_bda, 0, sizeof(bt_bdaddr_t)); 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags = 0; 280b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_av_cb.edr = 0; 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_on_idle(); 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_EXIT_EVT: 2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_ENABLE_EVT: 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_REGISTER_EVT: 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.bta_handle = ((tBTA_AV*)p_data)->registr.hndl; 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_PENDING_EVT: 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_CONNECT_REQ_EVT: 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event == BTIF_AV_CONNECT_REQ_EVT) 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 299f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta memcpy(&btif_av_cb.peer_bda, ((btif_av_connect_req_t*)p_data)->target_bda, 300f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta sizeof(bt_bdaddr_t)); 301f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle, 302f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta TRUE, BTA_SEC_NONE, ((btif_av_connect_req_t*)p_data)->uuid); 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (event == BTA_AV_PENDING_EVT) 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(btif_av_cb.peer_bda.address, ((tBTA_AV*)p_data)->pend.bd_addr); 307f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle, 308f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta TRUE, BTA_SEC_NONE, UUID_SERVCLASS_AUDIO_SOURCE); 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENING); 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } break; 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_OPEN_EVT: 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* IOP_FIX: Jabra 620 only does RC open without AV open whenever it connects. So 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * as per the AV WP, an AVRC connection cannot exist without an AV connection. Therefore, 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * we initiate an AV connection if an RC_OPEN_EVT is received when we are in AV_CLOSED state. 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * We initiate the AV connection after a small 3s timeout to avoid any collisions from the 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * headsets, as some headsets initiate the AVRC connection first and then 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * immediately initiate the AV connection 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * TODO: We may need to do this only on an AVRCP Play. FixMe 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 324e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_AV_RC_OPEN_EVT received w/o AV"); 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&tle_av_open_on_rc, 0, sizeof(tle_av_open_on_rc)); 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tle_av_open_on_rc.param = (UINT32)btif_initiate_av_open_tmr_hdlr; 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_start_timer(&tle_av_open_on_rc, BTU_TTYPE_USER_FUNC, 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_TIMEOUT_AV_OPEN_ON_RC_SECS); 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_rc_handler(event, p_data); 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_REMOTE_CMD_EVT: 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_VENDOR_CMD_EVT: 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_META_MSG_EVT: 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_FEAT_EVT: 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_rc_handler(event, (tBTA_AV*)p_data); 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_CLOSE_EVT: 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (tle_av_open_on_rc.in_use) { 341e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("BTA_AV_RC_CLOSE_EVT: Stopping AV timer."); 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btu_stop_timer(&tle_av_open_on_rc); 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_rc_handler(event, p_data); 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 348e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event)); 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_state_opening_handler 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Intermediate state managing events during establishment 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** of avdtp channel 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if event was processed, FALSE otherwise 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data) 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 368e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event), btif_av_cb.flags); 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_ENTER_EVT: 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application that we are entering connecting state */ 3753e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_CONNECTING, &(btif_av_cb.peer_bda)); 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_EXIT_EVT: 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 381f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case BTA_AV_REJECT_EVT: 382e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG(" Received BTA_AV_REJECT_EVT "); 3833e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda)); 384f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE); 385f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 386f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_OPEN_EVT: 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV *p_bta_data = (tBTA_AV*)p_data; 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btav_connection_state_t state; 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_state_t av_state; 392e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("status:%d, edr 0x%x",p_bta_data->open.status, 393b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren p_bta_data->open.edr); 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_bta_data->open.status == BTA_AV_SUCCESS) 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project state = BTAV_CONNECTION_STATE_CONNECTED; 3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project av_state = BTIF_AV_STATE_OPENED; 399b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_av_cb.edr = p_bta_data->open.edr; 400f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 4013e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_av_cb.peer_sep = p_bta_data->open.sep; 4023e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_a2dp_set_peer_sep(p_bta_data->open.sep); 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 406e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d", 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_bta_data->open.status ); 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project state = BTAV_CONNECTION_STATE_DISCONNECTED; 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project av_state = BTIF_AV_STATE_IDLE; 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application of the event */ 4133e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(state, &(btif_av_cb.peer_bda)); 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* change state to open/idle based on the status */ 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, av_state); 4163e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 417f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 418f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* if queued PLAY command, send it now */ 419f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr, 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_bta_data->open.status == BTA_AV_SUCCESS)); 421f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 4223e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood else if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) 423f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 424f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* if queued PLAY command, send it now */ 425f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr, FALSE); 4264ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood /* Bring up AVRCP connection too */ 4274ad470e33021be4246ae539e1bcb7a346dbb4405Mike Lockwood BTA_AvOpenRc(btif_av_cb.bta_handle); 428f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_queue_advance(); 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } break; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4323e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood case BTIF_AV_SINK_CONFIG_REQ_EVT: 4333e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood { 4343e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_av_sink_config_req_t req; 4353e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood // copy to avoid alignment problems 4363e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood memcpy(&req, p_data, sizeof(req)); 4373e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 438e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("BTIF_AV_SINK_CONFIG_REQ_EVT %d %d", req.sample_rate, 4393e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood req.channel_count); 4403e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) { 4413e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood HAL_CBACK(bt_av_sink_callbacks, audio_config_cb, &(btif_av_cb.peer_bda), 4423e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood req.sample_rate, req.channel_count); 4433e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 4443e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } break; 4453e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_RC_EVENT(event, p_data); 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 449e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event)); 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_state_closing_handler 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Intermediate state managing events during closing 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** of avdtp channel 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if event was processed, FALSE otherwise 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *p_data) 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 471e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event), btif_av_cb.flags); 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_ENTER_EVT: 4773e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 478f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 479f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* immediately stop transmission of frames */ 480f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_tx_flush(TRUE); 481f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* wait for audioflinger to stop a2dp */ 482f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 4833e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) 484f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 485f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_rx_flush(TRUE); 486f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4895fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren case BTA_AV_STOP_EVT: 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_STOP_STREAM_REQ_EVT: 4913e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 492f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* immediately flush any pending tx frames while suspend is pending */ 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_set_tx_flush(TRUE); 495f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 4963e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) 497f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 498f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_rx_flush(TRUE); 499f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 501f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_on_stopped(NULL); 5023e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood break; 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_EXIT_EVT: 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_CLOSE_EVT: 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application that we are disconnecting */ 5103e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda)); 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE); 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Handle the RC_CLOSE event for the cleanup */ 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_RC_CLOSE_EVT: 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_rc_handler(event, (tBTA_AV*)p_data); 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 521e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event)); 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_state_opened_handler 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handles AV events while AVDTP is in OPEN state 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if event was processed, FALSE otherwise 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data) 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV *p_av = (tBTA_AV*)p_data; 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 543e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event), btif_av_cb.flags); 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( (event == BTA_AV_REMOTE_CMD_EVT) && (btif_av_cb.flags & BTIF_AV_FLAG_REMOTE_SUSPEND) && 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_av->remote_cmd.rc_id == BTA_AV_RC_PLAY) ) 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 549e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s: Resetting remote suspend flag on RC PLAY", __FUNCTION__); 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND; 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_ENTER_EVT: 5565fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_STOP; 5575fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START; 558b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren break; 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_EXIT_EVT: 5615fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START; 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_START_STREAM_REQ_EVT: 565ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach if (btif_av_cb.peer_sep != AVDT_TSEP_SRC) 566ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach btif_a2dp_setup_codec(); 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvStart(); 5685fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_START; 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_START_EVT: 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 573e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("BTA_AV_START_EVT status %d, suspending %d, init %d", 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_av->start.status, p_av->start.suspending, p_av->start.initiator); 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_av->start.status == BTA_SUCCESS) && (p_av->start.suspending == TRUE)) 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 579f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* In case peer is A2DP SRC we do not want to ack commands on UIPC*/ 5803e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 581f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 582f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (btif_a2dp_on_started(&p_av->start, 583f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) != 0))) 584f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 585f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* only clear pending flag after acknowledgement */ 586f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START; 587f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 588379743beded881127703334e1dda2cd327ec651dZhihai Xu } 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remain in open state if status failed */ 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->start.status != BTA_AV_SUCCESS) 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5943e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) 595f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 596f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_rx_flush(FALSE); /* remove flush state, ready for streaming*/ 597f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 598f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 599379743beded881127703334e1dda2cd327ec651dZhihai Xu /* change state to started, send acknowledgement if start is pending */ 600379743beded881127703334e1dda2cd327ec651dZhihai Xu if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) { 6013e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 602f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_on_started(NULL, TRUE); 603379743beded881127703334e1dda2cd327ec651dZhihai Xu /* pending start flag will be cleared when exit current state */ 604379743beded881127703334e1dda2cd327ec651dZhihai Xu } 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_STARTED); 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } break; 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_DISCONNECT_REQ_EVT: 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvClose(btif_av_cb.bta_handle); 6113e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) { 6123e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood BTA_AvCloseRc(btif_av_cb.bta_handle); 6133e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application that we are disconnecting */ 6163e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda)); 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_CLOSE_EVT: 620f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* avdtp link is closed */ 6215fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_a2dp_on_stopped(NULL); 6225fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application that we are disconnected */ 6243e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda)); 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 626379743beded881127703334e1dda2cd327ec651dZhihai Xu /* change state to idle, send acknowledgement if start is pending */ 627379743beded881127703334e1dda2cd327ec651dZhihai Xu if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) { 628379743beded881127703334e1dda2cd327ec651dZhihai Xu btif_a2dp_ack_fail(); 629379743beded881127703334e1dda2cd327ec651dZhihai Xu /* pending start flag will be cleared when exit current state */ 630379743beded881127703334e1dda2cd327ec651dZhihai Xu } 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE); 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6345fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren case BTA_AV_RECONFIG_EVT: 6355fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren if((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) && 6365fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren (p_av->reconfig.status == BTA_AV_SUCCESS)) 6375fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren { 638e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("reconfig done BTA_AVstart()"); 6395fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren BTA_AvStart(); 6405fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren } 6415fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren else if(btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) 6425fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren { 6435fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START; 6445fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_a2dp_ack_fail(); 6455fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren } 6465fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren break; 6475fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_RC_EVENT(event, p_data); 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 651e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event)); 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_state_started_handler 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Handles AV events while A2DP stream is started 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns TRUE if event was processed, FALSE otherwise 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data) 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV *p_av = (tBTA_AV*)p_data; 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 673e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event), btif_av_cb.flags); 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (event) 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_ENTER_EVT: 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are again in started state, clear any remote suspend flags */ 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND; 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6833e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_audio_state(BTAV_AUDIO_STATE_STARTED, &(btif_av_cb.peer_bda)); 6844128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu 6854128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu /* increase the a2dp consumer task priority temporarily when start 6864128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu ** audio playing, to avoid overflow the audio packet queue. */ 6874128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu adjust_priority_a2dp(TRUE); 6884128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_SM_EXIT_EVT: 6924128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu /* restore the a2dp consumer task priority when stop audio playing. */ 6934128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu adjust_priority_a2dp(FALSE); 6944128e36cd8430dfbed16d364e6ab5265e1642db5Zhihai Xu 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6975fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren case BTIF_AV_START_STREAM_REQ_EVT: 6985fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren /* we were remotely started, just ack back the local request */ 6993e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 700f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_on_started(NULL, TRUE); 7015fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren break; 7025fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fixme -- use suspend = true always to work around issue with BTA AV */ 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_STOP_STREAM_REQ_EVT: 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_SUSPEND_STREAM_REQ_EVT: 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set pending flag to ensure btif task is not trying to restart 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stream while suspend is in progress */ 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags |= BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING; 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we were remotely suspended but suspend locally, local suspend 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project always overrides */ 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND; 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7153e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 716f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* immediately stop transmission of frames while suspend is pending */ 718f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_tx_flush(TRUE); 719f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 720f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 7213e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) { 722f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_rx_flush(TRUE); 7233e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_a2dp_on_stopped(NULL); 7243e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvStop(TRUE); 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_DISCONNECT_REQ_EVT: 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* request avdtp to close */ 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvClose(btif_av_cb.bta_handle); 7333e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) { 7343e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood BTA_AvCloseRc(btif_av_cb.bta_handle); 7353e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application that we are disconnecting */ 7383e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda)); 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* wait in closing state until fully closed */ 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_CLOSING); 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_SUSPEND_EVT: 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 746e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("BTA_AV_SUSPEND_EVT status %d, init %d", 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_av->suspend.status, p_av->suspend.initiator); 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* a2dp suspended, stop media task until resumed */ 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_on_suspended(&p_av->suspend); 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if not successful, remain in current state */ 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->suspend.status != BTA_AV_SUCCESS) 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags &= ~BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING; 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7573e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) 758f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* suspend failed, reset back tx flush state */ 760f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_a2dp_set_tx_flush(FALSE); 761f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->suspend.initiator != TRUE) 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* remote suspend, notify HAL and await audioflinger to 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project suspend/stop stream */ 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* set remote suspend flag to block media task from restarting 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project stream only if we did not already initiate a local suspend */ 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btif_av_cb.flags & BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING) == 0) 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags |= BTIF_AV_FLAG_REMOTE_SUSPEND; 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7753e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_audio_state(BTAV_AUDIO_STATE_REMOTE_SUSPEND, &(btif_av_cb.peer_bda)); 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7793e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_audio_state(BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda)); 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENED); 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* suspend completed and state changed, clear pending status */ 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.flags &= ~BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING; 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_STOP_EVT: 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7905fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP; 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_on_stopped(&p_av->suspend); 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7933e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_audio_state(BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda)); 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if stop was successful, change state to open */ 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->suspend.status == BTA_AV_SUCCESS) 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENED); 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_CLOSE_EVT: 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8035fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP; 8045fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* avdtp link is closed */ 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_on_stopped(NULL); 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* inform the application that we are disconnected */ 8093e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda)); 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE); 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_RC_EVENT(event, p_data); 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 817e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dump_av_sm_event_name(event)); 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local event handlers 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project******************************************************************************/ 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_av_handle_event(UINT16 event, char* p_param) 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_dispatch(btif_av_cb.sm_handle, event, (void*)p_param); 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bte_av_callback(tBTA_AV_EVT event, tBTA_AV *p_data) 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Switch to BTIF context */ 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_transfer_context(btif_av_handle_event, event, 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char*)p_data, sizeof(tBTA_AV), NULL); 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 841f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void bte_av_media_callback(tBTA_AV_EVT event, tBTA_AV_MEDIA *p_data) 842f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 843f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_sm_state_t state; 844f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 que_len; 8453e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood tA2D_STATUS a2d_status; 8463e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood tA2D_SBC_CIE sbc_cie; 8473e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_av_sink_config_req_t config_req; 848f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 849f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (event == BTA_AV_MEDIA_DATA_EVT)/* Switch to BTIF_MEDIA context */ 850f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 851f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta state= btif_sm_get_state(btif_av_cb.sm_handle); 852f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if ( (state == BTIF_AV_STATE_STARTED) || /* send SBC packets only in Started State */ 853f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta (state == BTIF_AV_STATE_OPENED) ) 854f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 855f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta que_len = btif_media_sink_enque_buf((BT_HDR *)p_data); 856e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG(" Packets in Que %d",que_len); 857f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 858f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else 859f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return; 860f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 861f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 8623e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (event == BTA_AV_MEDIA_SINK_CFG_EVT) { 8633e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood /* send a command to BT Media Task */ 864f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_reset_decoder((UINT8*)p_data); 8653e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 8663e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood a2d_status = A2D_ParsSbcInfo(&sbc_cie, (UINT8 *)p_data, FALSE); 8673e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (a2d_status == A2D_SUCCESS) { 8683e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood /* Switch to BTIF context */ 8693e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood config_req.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq); 8703e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood config_req.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode); 8713e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_transfer_context(btif_av_handle_event, BTIF_AV_SINK_CONFIG_REQ_EVT, 8723e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood (char*)&config_req, sizeof(config_req), NULL); 8733e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } else { 874e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status); 8753e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 8763e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 877f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_init 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initializes btif AV if not already done 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8883e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodbt_status_t btif_av_init() 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_av_cb.sm_handle == NULL) 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_a2dp_start_media_task() != GKI_SUCCESS) 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_FAIL; 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_enable_service(BTA_A2DP_SERVICE_ID); 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Also initialize the AV state machine */ 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.sm_handle = btif_sm_init((const btif_sm_handler_t*)btif_av_state_handlers, BTIF_AV_STATE_IDLE); 8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_on_init(); 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9023e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood return BT_STATUS_SUCCESS; 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_DONE; 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9103e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Function init_src 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9123e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Description Initializes the AV interface for source mode 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9183e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic bt_status_t init_src(btav_callbacks_t* callbacks) 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9203e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood bt_status_t status; 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 922e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9243e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (bt_av_sink_callbacks != NULL) { 9253e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood // already did btif_av_init() 9263e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood status = BT_STATUS_SUCCESS; 9273e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } else { 9283e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood status = btif_av_init(); 9293e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9313e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (status == BT_STATUS_SUCCESS) { 9323e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood bt_av_src_callbacks = callbacks; 9333e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 9343e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 9353e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood return status; 9363e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood} 9373e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 9383e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood/******************************************************************************* 9393e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 9403e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Function init_sink 9413e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 9423e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Description Initializes the AV interface for sink mode 9433e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 9443e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Returns bt_status_t 9453e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 9463e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood*******************************************************************************/ 9473e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 9483e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic bt_status_t init_sink(btav_callbacks_t* callbacks) 9493e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood{ 9503e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood bt_status_t status; 9513e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 952e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 9533e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 9543e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (bt_av_src_callbacks != NULL) { 9553e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood // already did btif_av_init() 9563e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood status = BT_STATUS_SUCCESS; 9573e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } else { 9583e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood status = btif_av_init(); 9593e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 9603e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 9613e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (status == BT_STATUS_SUCCESS) { 9623e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood bt_av_sink_callbacks = callbacks; 9633e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood BTA_AvEnable_Sink(TRUE); 9643e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9663e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood return status; 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function connect 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Establishes the AV signalling channel with the remote headset 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 979f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic bt_status_t connect_int(bt_bdaddr_t *bd_addr, uint16_t uuid) 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 981f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_av_connect_req_t connect_req; 982f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta connect_req.target_bda = bd_addr; 983f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta connect_req.uuid = uuid; 984e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 986f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req); 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 991d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xiestatic bt_status_t src_connect_sink(bt_bdaddr_t *bd_addr) 992f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 993e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 994f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta CHECK_BTAV_INIT(); 9953e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 996d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, bd_addr, connect_int); 997f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 998f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 999d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xiestatic bt_status_t sink_connect_src(bt_bdaddr_t *bd_addr) 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1001e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_BTAV_INIT(); 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1004d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie return btif_queue_connect(UUID_SERVCLASS_AUDIO_SINK, bd_addr, connect_int); 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function disconnect 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Tears down the AV signalling channel with the remote headset 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns bt_status_t 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic bt_status_t disconnect(bt_bdaddr_t *bd_addr) 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1018e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CHECK_BTAV_INIT(); 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Switch to BTIF context */ 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btif_transfer_context(btif_av_handle_event, BTIF_AV_DISCONNECT_REQ_EVT, 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char*)bd_addr, sizeof(bt_bdaddr_t), NULL); 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function cleanup 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Shuts down the AV interface and does the cleanup 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void cleanup(void) 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1038e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10403e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_a2dp_stop_media_task(); 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10423e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_disable_service(BTA_A2DP_SERVICE_ID); 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10443e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood /* Also shut down the AV state machine */ 10453e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_sm_shutdown(btif_av_cb.sm_handle); 10463e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_av_cb.sm_handle = NULL; 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10493e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic void cleanup_src(void) { 1050e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 10513e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 10523e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (bt_av_src_callbacks) 1053f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 10543e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood bt_av_src_callbacks = NULL; 10553e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (bt_av_sink_callbacks == NULL) 10563e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood cleanup(); 1057f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1058f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 1059f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 10603e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic void cleanup_sink(void) { 1061e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 1062f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 10633e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (bt_av_sink_callbacks) 10643e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood { 10653e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood bt_av_sink_callbacks = NULL; 10663e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (bt_av_src_callbacks == NULL) 10673e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood cleanup(); 10683e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 1069f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 1070f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 10713e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic const btav_interface_t bt_av_src_interface = { 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sizeof(btav_interface_t), 10733e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood init_src, 1074d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie src_connect_sink, 10753e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood disconnect, 10763e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood cleanup_src, 10773e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood}; 10783e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 10793e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodstatic const btav_interface_t bt_av_sink_interface = { 10803e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood sizeof(btav_interface_t), 10813e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood init_sink, 1082d6151e9811a35ac965bfb96ad77c427d9a4f1325Matthew Xie sink_connect_src, 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project disconnect, 10843e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood cleanup_sink, 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_get_sm_handle 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Fetches current av SM handle 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbtif_sm_handle_t btif_av_get_sm_handle(void) 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return btif_av_cb.sm_handle; 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_stream_ready 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Checks whether AV is ready for starting a stream 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_av_stream_ready(void) 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle); 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1116e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("btif_av_stream_ready : sm hdl %d, state %d, flags %x", 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.sm_handle, state, btif_av_cb.flags); 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* also make sure main adapter is enabled */ 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_is_enabled() == 0) 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1122e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("main adapter not enabled"); 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11265fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren /* check if we are remotely suspended or stop is pending */ 11275fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren if (btif_av_cb.flags & (BTIF_AV_FLAG_REMOTE_SUSPEND|BTIF_AV_FLAG_PENDING_STOP)) 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (state == BTIF_AV_STATE_OPENED); 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_stream_started_ready 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Checks whether AV ready for media start in streaming state 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_av_stream_started_ready(void) 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle); 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1147e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_DEBUG("btif_av_stream_started : sm hdl %d, state %d, flags %x", 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_av_cb.sm_handle, state, btif_av_cb.flags); 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11505fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren /* disallow media task to start if we have pending actions */ 11515fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren if (btif_av_cb.flags & (BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING | BTIF_AV_FLAG_REMOTE_SUSPEND 11525fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren | BTIF_AV_FLAG_PENDING_STOP)) 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return (state == BTIF_AV_STATE_STARTED); 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_dispatch_sm_event 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Send event to AV statemachine 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns None 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* used to pass events to AV statemachine from other tasks */ 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_dispatch_sm_event(btif_av_sm_event_t event, void *p_data, int len) 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Switch to BTIF context */ 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_transfer_context(btif_av_handle_event, event, 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (char*)p_data, len, NULL); 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_av_execute_service 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Initializes/Shuts down the service 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbt_status_t btif_av_execute_service(BOOLEAN b_enable) 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (b_enable) 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* TODO: Removed BTA_SEC_AUTHORIZE since the Java/App does not 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * handle this request in order to allow incoming connections to succeed. 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * We need to put this back once support for this is added */ 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Added BTA_AV_FEAT_NO_SCO_SSPD - this ensures that the BTA does not 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * auto-suspend av streaming on AG events(SCO or Call). The suspend shall 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * be initiated by the app/audioflinger layers */ 11969adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#if (AVRC_METADATA_INCLUDED == TRUE) 11979adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan BTA_AvEnable(BTA_SEC_AUTHENTICATE, 1198247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji BTA_AV_FEAT_RCTG|BTA_AV_FEAT_METADATA|BTA_AV_FEAT_VENDOR|BTA_AV_FEAT_NO_SCO_SSPD 1199247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#if (AVRC_ADV_CTRL_INCLUDED == TRUE) 1200247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji |BTA_AV_FEAT_RCCT 1201247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji |BTA_AV_FEAT_ADV_CTRL 1202247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji#endif 1203247c68fe6eee3660cbdcf4509195fe735ae25573Satya Calloji ,bte_av_callback); 12049adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#else 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvEnable(BTA_SEC_AUTHENTICATE, (BTA_AV_FEAT_RCTG | BTA_AV_FEAT_NO_SCO_SSPD), 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bte_av_callback); 12079adddf4965e9ddb01e339b934c343fcbd842a977Ravi Nagarajan#endif 1208f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta BTA_AvRegister(BTA_AV_CHNL_AUDIO, BTIF_AV_SERVICE_NAME, 0, bte_av_media_callback); 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else { 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvDeregister(btif_av_cb.bta_handle); 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvDisable(); 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return BT_STATUS_SUCCESS; 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12193e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Function btif_av_get_src_interface 12203e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 12213e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Description Get the AV callback interface for A2DP source profile 12223e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 12233e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Returns btav_interface_t 12243e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 12253e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood*******************************************************************************/ 12263e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodconst btav_interface_t *btif_av_get_src_interface(void) 12273e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood{ 1228e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 12293e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood return &bt_av_src_interface; 12303e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood} 12313e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 12323e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood/******************************************************************************* 12333e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** 12343e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Function btif_av_get_sink_interface 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12363e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood** Description Get the AV callback interface for A2DP sink profile 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns btav_interface_t 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12413e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodconst btav_interface_t *btif_av_get_sink_interface(void) 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1243e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati BTIF_TRACE_EVENT("%s", __FUNCTION__); 12443e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood return &bt_av_sink_interface; 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12495fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Function btif_av_is_connected 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12515fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Description Checks if av has a connected sink 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12535fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Returns BOOLEAN 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_av_is_connected(void) 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle); 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return ((state == BTIF_AV_STATE_OPENED) || (state == BTIF_AV_STATE_STARTED)); 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1261b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 1262b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren/******************************************************************************* 1263b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** 1264b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** Function btif_av_is_peer_edr 1265b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** 1266b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** Description Check if the connected a2dp device supports 1267b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** EDR or not. Only when connected this function 1268b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** will accurately provide a true capability of 1269b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** remote peer. If not connected it will always be false. 1270b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** 1271b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** Returns TRUE if remote device is capable of EDR 1272b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren** 1273b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren*******************************************************************************/ 1274b8ceaa484a09be14263d5f10d022a272f9602378Mattias AgrenBOOLEAN btif_av_is_peer_edr(void) 1275b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren{ 1276b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren ASSERTC(btif_av_is_connected(), "No active a2dp connection", 0); 1277b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 1278b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren if (btif_av_cb.edr) 1279b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren return TRUE; 1280b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren else 1281b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren return FALSE; 1282b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren} 1283b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 1284