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