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