Home | History | Annotate | Download | only in src
      1 /******************************************************************************
      2  *
      3  *  Copyright (C) 2009-2012 Broadcom Corporation
      4  *
      5  *  Licensed under the Apache License, Version 2.0 (the "License");
      6  *  you may not use this file except in compliance with the License.
      7  *  You may obtain a copy of the License at:
      8  *
      9  *  http://www.apache.org/licenses/LICENSE-2.0
     10  *
     11  *  Unless required by applicable law or agreed to in writing, software
     12  *  distributed under the License is distributed on an "AS IS" BASIS,
     13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  *  See the License for the specific language governing permissions and
     15  *  limitations under the License.
     16  *
     17  ******************************************************************************/
     18 
     19 #define LOG_TAG "btif_av"
     20 
     21 #include "btif_av.h"
     22 
     23 #include <assert.h>
     24 #include <string.h>
     25 
     26 #include <system/audio.h>
     27 #include <hardware/bluetooth.h>
     28 #include <hardware/bt_av.h>
     29 
     30 #include "bt_utils.h"
     31 #include "bta_api.h"
     32 #include "btif_media.h"
     33 #include "btif_profile_queue.h"
     34 #include "btif_util.h"
     35 #include "btu.h"
     36 #include "bt_common.h"
     37 #include "osi/include/allocator.h"
     38 
     39 /*****************************************************************************
     40 **  Constants & Macros
     41 ******************************************************************************/
     42 #define BTIF_AV_SERVICE_NAME "Advanced Audio"
     43 #define BTIF_AVK_SERVICE_NAME "Advanced Audio Sink"
     44 
     45 #define BTIF_TIMEOUT_AV_OPEN_ON_RC_MS  (2 * 1000)
     46 
     47 typedef enum {
     48     BTIF_AV_STATE_IDLE = 0x0,
     49     BTIF_AV_STATE_OPENING,
     50     BTIF_AV_STATE_OPENED,
     51     BTIF_AV_STATE_STARTED,
     52     BTIF_AV_STATE_CLOSING
     53 } btif_av_state_t;
     54 
     55 /* Should not need dedicated suspend state as actual actions are no
     56    different than open state. Suspend flags are needed however to prevent
     57    media task from trying to restart stream during remote suspend or while
     58    we are in the process of a local suspend */
     59 
     60 #define BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING 0x1
     61 #define BTIF_AV_FLAG_REMOTE_SUSPEND        0x2
     62 #define BTIF_AV_FLAG_PENDING_START         0x4
     63 #define BTIF_AV_FLAG_PENDING_STOP          0x8
     64 
     65 /*****************************************************************************
     66 **  Local type definitions
     67 ******************************************************************************/
     68 
     69 typedef struct
     70 {
     71     tBTA_AV_HNDL bta_handle;
     72     bt_bdaddr_t peer_bda;
     73     btif_sm_handle_t sm_handle;
     74     UINT8 flags;
     75     tBTA_AV_EDR edr;
     76     UINT8 peer_sep;  /* sep type of peer device */
     77 } btif_av_cb_t;
     78 
     79 typedef struct
     80 {
     81     bt_bdaddr_t *target_bda;
     82     uint16_t uuid;
     83 } btif_av_connect_req_t;
     84 
     85 typedef struct
     86 {
     87     int sample_rate;
     88     int channel_count;
     89     bt_bdaddr_t peer_bd;
     90 } btif_av_sink_config_req_t;
     91 
     92 /*****************************************************************************
     93 **  Static variables
     94 ******************************************************************************/
     95 static btav_callbacks_t *bt_av_src_callbacks = NULL;
     96 static btav_callbacks_t *bt_av_sink_callbacks = NULL;
     97 static btif_av_cb_t btif_av_cb = {0, {{0}}, 0, 0, 0, 0};
     98 static alarm_t *av_open_on_rc_timer = NULL;
     99 
    100 /* both interface and media task needs to be ready to alloc incoming request */
    101 #define CHECK_BTAV_INIT() if (((bt_av_src_callbacks == NULL) &&(bt_av_sink_callbacks == NULL)) \
    102         || (btif_av_cb.sm_handle == NULL))\
    103 {\
    104      BTIF_TRACE_WARNING("%s: BTAV not initialized", __FUNCTION__);\
    105      return BT_STATUS_NOT_READY;\
    106 }\
    107 else\
    108 {\
    109      BTIF_TRACE_EVENT("%s", __FUNCTION__);\
    110 }
    111 
    112 /* Helper macro to avoid code duplication in the state machine handlers */
    113 #define CHECK_RC_EVENT(e, d) \
    114     case BTA_AV_RC_OPEN_EVT: \
    115     case BTA_AV_RC_CLOSE_EVT: \
    116     case BTA_AV_REMOTE_CMD_EVT: \
    117     case BTA_AV_VENDOR_CMD_EVT: \
    118     case BTA_AV_META_MSG_EVT: \
    119     case BTA_AV_RC_FEAT_EVT: \
    120     case BTA_AV_REMOTE_RSP_EVT: \
    121     { \
    122          btif_rc_handler(e, d);\
    123     }break; \
    124 
    125 static BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *data);
    126 static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *data);
    127 static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *data);
    128 static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *data);
    129 static BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *data);
    130 
    131 static const btif_sm_handler_t btif_av_state_handlers[] =
    132 {
    133     btif_av_state_idle_handler,
    134     btif_av_state_opening_handler,
    135     btif_av_state_opened_handler,
    136     btif_av_state_started_handler,
    137     btif_av_state_closing_handler
    138 };
    139 
    140 static void btif_av_event_free_data(btif_sm_event_t event, void *p_data);
    141 
    142 /*************************************************************************
    143 ** Extern functions
    144 *************************************************************************/
    145 extern void btif_rc_handler(tBTA_AV_EVT event, tBTA_AV *p_data);
    146 extern BOOLEAN btif_rc_get_connected_peer(BD_ADDR peer_addr);
    147 extern UINT8 btif_rc_get_connected_peer_handle(void);
    148 extern void btif_rc_check_handle_pending_play (BD_ADDR peer_addr, BOOLEAN bSendToApp);
    149 
    150 extern fixed_queue_t *btu_general_alarm_queue;
    151 
    152 /*****************************************************************************
    153 ** Local helper functions
    154 ******************************************************************************/
    155 
    156 const char *dump_av_sm_state_name(btif_av_state_t state)
    157 {
    158     switch (state)
    159     {
    160         CASE_RETURN_STR(BTIF_AV_STATE_IDLE)
    161         CASE_RETURN_STR(BTIF_AV_STATE_OPENING)
    162         CASE_RETURN_STR(BTIF_AV_STATE_OPENED)
    163         CASE_RETURN_STR(BTIF_AV_STATE_STARTED)
    164         CASE_RETURN_STR(BTIF_AV_STATE_CLOSING)
    165         default: return "UNKNOWN_STATE";
    166     }
    167 }
    168 
    169 const char *dump_av_sm_event_name(btif_av_sm_event_t event)
    170 {
    171     switch((int)event)
    172     {
    173         CASE_RETURN_STR(BTA_AV_ENABLE_EVT)
    174         CASE_RETURN_STR(BTA_AV_REGISTER_EVT)
    175         CASE_RETURN_STR(BTA_AV_OPEN_EVT)
    176         CASE_RETURN_STR(BTA_AV_CLOSE_EVT)
    177         CASE_RETURN_STR(BTA_AV_START_EVT)
    178         CASE_RETURN_STR(BTA_AV_STOP_EVT)
    179         CASE_RETURN_STR(BTA_AV_PROTECT_REQ_EVT)
    180         CASE_RETURN_STR(BTA_AV_PROTECT_RSP_EVT)
    181         CASE_RETURN_STR(BTA_AV_RC_OPEN_EVT)
    182         CASE_RETURN_STR(BTA_AV_RC_CLOSE_EVT)
    183         CASE_RETURN_STR(BTA_AV_REMOTE_CMD_EVT)
    184         CASE_RETURN_STR(BTA_AV_REMOTE_RSP_EVT)
    185         CASE_RETURN_STR(BTA_AV_VENDOR_CMD_EVT)
    186         CASE_RETURN_STR(BTA_AV_VENDOR_RSP_EVT)
    187         CASE_RETURN_STR(BTA_AV_RECONFIG_EVT)
    188         CASE_RETURN_STR(BTA_AV_SUSPEND_EVT)
    189         CASE_RETURN_STR(BTA_AV_PENDING_EVT)
    190         CASE_RETURN_STR(BTA_AV_META_MSG_EVT)
    191         CASE_RETURN_STR(BTA_AV_REJECT_EVT)
    192         CASE_RETURN_STR(BTA_AV_RC_FEAT_EVT)
    193         CASE_RETURN_STR(BTA_AV_OFFLOAD_START_RSP_EVT)
    194         CASE_RETURN_STR(BTIF_SM_ENTER_EVT)
    195         CASE_RETURN_STR(BTIF_SM_EXIT_EVT)
    196         CASE_RETURN_STR(BTIF_AV_CONNECT_REQ_EVT)
    197         CASE_RETURN_STR(BTIF_AV_DISCONNECT_REQ_EVT)
    198         CASE_RETURN_STR(BTIF_AV_START_STREAM_REQ_EVT)
    199         CASE_RETURN_STR(BTIF_AV_STOP_STREAM_REQ_EVT)
    200         CASE_RETURN_STR(BTIF_AV_SUSPEND_STREAM_REQ_EVT)
    201         CASE_RETURN_STR(BTIF_AV_SINK_CONFIG_REQ_EVT)
    202         CASE_RETURN_STR(BTIF_AV_OFFLOAD_START_REQ_EVT)
    203 #ifdef USE_AUDIO_TRACK
    204         CASE_RETURN_STR(BTIF_AV_SINK_FOCUS_REQ_EVT)
    205 #endif
    206         default: return "UNKNOWN_EVENT";
    207    }
    208 }
    209 
    210 /****************************************************************************
    211 **  Local helper functions
    212 *****************************************************************************/
    213 /*******************************************************************************
    214 **
    215 ** Function         btif_initiate_av_open_timer_timeout
    216 **
    217 ** Description      Timer to trigger AV open if the remote headset establishes
    218 **                  RC connection w/o AV connection. The timer is needed to IOP
    219 **                  with headsets that do establish AV after RC connection.
    220 **
    221 ** Returns          void
    222 **
    223 *******************************************************************************/
    224 static void btif_initiate_av_open_timer_timeout(UNUSED_ATTR void *data)
    225 {
    226     BD_ADDR peer_addr;
    227     btif_av_connect_req_t connect_req;
    228 
    229     /* is there at least one RC connection - There should be */
    230     if (btif_rc_get_connected_peer(peer_addr)) {
    231        BTIF_TRACE_DEBUG("%s Issuing connect to the remote RC peer", __FUNCTION__);
    232        /* In case of AVRCP connection request, we will initiate SRC connection */
    233        connect_req.target_bda = (bt_bdaddr_t*)&peer_addr;
    234        if(bt_av_sink_callbacks != NULL)
    235            connect_req.uuid = UUID_SERVCLASS_AUDIO_SINK;
    236        else if(bt_av_src_callbacks != NULL)
    237            connect_req.uuid = UUID_SERVCLASS_AUDIO_SOURCE;
    238        btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req);
    239     }
    240     else
    241     {
    242         BTIF_TRACE_ERROR("%s No connected RC peers", __FUNCTION__);
    243     }
    244 }
    245 
    246 /*****************************************************************************
    247 **  Static functions
    248 ******************************************************************************/
    249 
    250 /*******************************************************************************
    251 **
    252 ** Function         btif_report_connection_state
    253 **
    254 ** Description      Updates the components via the callbacks about the connection
    255 **                  state of a2dp connection.
    256 **
    257 ** Returns          None
    258 **
    259 *******************************************************************************/
    260 static void btif_report_connection_state(btav_connection_state_t state, bt_bdaddr_t *bd_addr)
    261 {
    262     if (bt_av_sink_callbacks != NULL) {
    263         HAL_CBACK(bt_av_sink_callbacks, connection_state_cb, state, bd_addr);
    264     } else if (bt_av_src_callbacks != NULL) {
    265         HAL_CBACK(bt_av_src_callbacks, connection_state_cb, state, bd_addr);
    266     }
    267 }
    268 
    269 /*******************************************************************************
    270 **
    271 ** Function         btif_report_audio_state
    272 **
    273 ** Description      Updates the components via the callbacks about the audio
    274 **                  state of a2dp connection. The state is updated when either
    275 **                  the remote ends starts streaming (started state) or whenever
    276 **                  it transitions out of started state (to opened or streaming)
    277 **                  state.
    278 **
    279 ** Returns          None
    280 **
    281 *******************************************************************************/
    282 static void btif_report_audio_state(btav_audio_state_t state, bt_bdaddr_t *bd_addr)
    283 {
    284     if (bt_av_sink_callbacks != NULL) {
    285         HAL_CBACK(bt_av_sink_callbacks, audio_state_cb, state, bd_addr);
    286     } else if (bt_av_src_callbacks != NULL) {
    287         HAL_CBACK(bt_av_src_callbacks, audio_state_cb, state, bd_addr);
    288     }
    289 }
    290 
    291 /*****************************************************************************
    292 **
    293 ** Function     btif_av_state_idle_handler
    294 **
    295 ** Description  State managing disconnected AV link
    296 **
    297 ** Returns      TRUE if event was processed, FALSE otherwise
    298 **
    299 *******************************************************************************/
    300 
    301 static BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *p_data)
    302 {
    303     BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
    304                      dump_av_sm_event_name(event), btif_av_cb.flags);
    305 
    306     switch (event)
    307     {
    308         case BTIF_SM_ENTER_EVT:
    309             /* clear the peer_bda */
    310             memset(&btif_av_cb.peer_bda, 0, sizeof(bt_bdaddr_t));
    311             btif_av_cb.flags = 0;
    312             btif_av_cb.edr = 0;
    313             btif_a2dp_on_idle();
    314             break;
    315 
    316         case BTIF_SM_EXIT_EVT:
    317             break;
    318 
    319         case BTA_AV_ENABLE_EVT:
    320             break;
    321 
    322         case BTA_AV_REGISTER_EVT:
    323             btif_av_cb.bta_handle = ((tBTA_AV*)p_data)->registr.hndl;
    324             break;
    325 
    326         case BTA_AV_PENDING_EVT:
    327         case BTIF_AV_CONNECT_REQ_EVT:
    328         {
    329              if (event == BTIF_AV_CONNECT_REQ_EVT)
    330              {
    331                  memcpy(&btif_av_cb.peer_bda, ((btif_av_connect_req_t*)p_data)->target_bda,
    332                                                                    sizeof(bt_bdaddr_t));
    333                  BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle,
    334                     TRUE, BTA_SEC_AUTHENTICATE, ((btif_av_connect_req_t*)p_data)->uuid);
    335              }
    336              else if (event == BTA_AV_PENDING_EVT)
    337              {
    338                   bdcpy(btif_av_cb.peer_bda.address, ((tBTA_AV*)p_data)->pend.bd_addr);
    339                   if (bt_av_src_callbacks != NULL)
    340                   {
    341                       BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle,
    342                         TRUE, BTA_SEC_AUTHENTICATE, UUID_SERVCLASS_AUDIO_SOURCE);
    343                   }
    344                   if (bt_av_sink_callbacks != NULL)
    345                   {
    346                       BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle,
    347                                  TRUE, BTA_SEC_AUTHENTICATE, UUID_SERVCLASS_AUDIO_SINK);
    348                   }
    349              }
    350              btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENING);
    351         } break;
    352 
    353         case BTA_AV_RC_OPEN_EVT:
    354             /* IOP_FIX: Jabra 620 only does RC open without AV open whenever it connects. So
    355              * as per the AV WP, an AVRC connection cannot exist without an AV connection. Therefore,
    356              * we initiate an AV connection if an RC_OPEN_EVT is received when we are in AV_CLOSED state.
    357              * We initiate the AV connection after a small 3s timeout to avoid any collisions from the
    358              * headsets, as some headsets initiate the AVRC connection first and then
    359              * immediately initiate the AV connection
    360              *
    361              * TODO: We may need to do this only on an AVRCP Play. FixMe
    362              */
    363 
    364             BTIF_TRACE_DEBUG("BTA_AV_RC_OPEN_EVT received w/o AV");
    365             alarm_set_on_queue(av_open_on_rc_timer,
    366                                BTIF_TIMEOUT_AV_OPEN_ON_RC_MS,
    367                                btif_initiate_av_open_timer_timeout, NULL,
    368                                btu_general_alarm_queue);
    369             btif_rc_handler(event, p_data);
    370             break;
    371 
    372            /*
    373             * In case Signalling channel is not down
    374             * and remote started Streaming Procedure
    375             * we have to handle config and open event in
    376             * idle_state. We hit these scenarios while running
    377             * PTS test case for AVRCP Controller
    378             */
    379         case BTIF_AV_SINK_CONFIG_REQ_EVT:
    380         {
    381             btif_av_sink_config_req_t req;
    382             // copy to avoid alignment problems
    383             memcpy(&req, p_data, sizeof(req));
    384 
    385             BTIF_TRACE_WARNING("BTIF_AV_SINK_CONFIG_REQ_EVT %d %d", req.sample_rate,
    386                     req.channel_count);
    387             if (bt_av_sink_callbacks != NULL) {
    388                 HAL_CBACK(bt_av_sink_callbacks, audio_config_cb, &(req.peer_bd),
    389                         req.sample_rate, req.channel_count);
    390             }
    391         } break;
    392 
    393         case BTA_AV_OPEN_EVT:
    394         {
    395             tBTA_AV *p_bta_data = (tBTA_AV*)p_data;
    396             btav_connection_state_t state;
    397             btif_sm_state_t av_state;
    398             BTIF_TRACE_DEBUG("status:%d, edr 0x%x",p_bta_data->open.status,
    399                                p_bta_data->open.edr);
    400 
    401             if (p_bta_data->open.status == BTA_AV_SUCCESS)
    402             {
    403                  state = BTAV_CONNECTION_STATE_CONNECTED;
    404                  av_state = BTIF_AV_STATE_OPENED;
    405                  btif_av_cb.edr = p_bta_data->open.edr;
    406 
    407                  btif_av_cb.peer_sep = p_bta_data->open.sep;
    408                  btif_a2dp_set_peer_sep(p_bta_data->open.sep);
    409             }
    410             else
    411             {
    412                 BTIF_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d",
    413                                      p_bta_data->open.status );
    414                 state = BTAV_CONNECTION_STATE_DISCONNECTED;
    415                 av_state  = BTIF_AV_STATE_IDLE;
    416             }
    417 
    418             /* inform the application of the event */
    419             btif_report_connection_state(state, &(btif_av_cb.peer_bda));
    420             /* change state to open/idle based on the status */
    421             btif_sm_change_state(btif_av_cb.sm_handle, av_state);
    422             if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
    423             {
    424                 /* if queued PLAY command,  send it now */
    425                 btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr,
    426                                              (p_bta_data->open.status == BTA_AV_SUCCESS));
    427             }
    428             else if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
    429             {
    430                 /* if queued PLAY command,  send it now */
    431                 btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr, FALSE);
    432                 /* Bring up AVRCP connection too */
    433                 BTA_AvOpenRc(btif_av_cb.bta_handle);
    434             }
    435             btif_queue_advance();
    436         } break;
    437 
    438         case BTA_AV_REMOTE_CMD_EVT:
    439         case BTA_AV_VENDOR_CMD_EVT:
    440         case BTA_AV_META_MSG_EVT:
    441         case BTA_AV_RC_FEAT_EVT:
    442         case BTA_AV_REMOTE_RSP_EVT:
    443             btif_rc_handler(event, (tBTA_AV*)p_data);
    444             break;
    445 
    446         case BTA_AV_RC_CLOSE_EVT:
    447             BTIF_TRACE_DEBUG("BTA_AV_RC_CLOSE_EVT: Stopping AV timer.");
    448             alarm_cancel(av_open_on_rc_timer);
    449             btif_rc_handler(event, p_data);
    450             break;
    451 
    452         case BTIF_AV_OFFLOAD_START_REQ_EVT:
    453             BTIF_TRACE_ERROR("BTIF_AV_OFFLOAD_START_REQ_EVT: Stream not Started IDLE");
    454             btif_a2dp_on_offload_started(BTA_AV_FAIL);
    455             break;
    456 
    457         default:
    458             BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
    459                                 dump_av_sm_event_name(event));
    460             return FALSE;
    461 
    462     }
    463 
    464     return TRUE;
    465 }
    466 /*****************************************************************************
    467 **
    468 ** Function        btif_av_state_opening_handler
    469 **
    470 ** Description     Intermediate state managing events during establishment
    471 **                 of avdtp channel
    472 **
    473 ** Returns         TRUE if event was processed, FALSE otherwise
    474 **
    475 *******************************************************************************/
    476 
    477 static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data)
    478 {
    479     BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
    480                      dump_av_sm_event_name(event), btif_av_cb.flags);
    481 
    482     switch (event)
    483     {
    484         case BTIF_SM_ENTER_EVT:
    485             /* inform the application that we are entering connecting state */
    486             btif_report_connection_state(BTAV_CONNECTION_STATE_CONNECTING, &(btif_av_cb.peer_bda));
    487             break;
    488 
    489         case BTIF_SM_EXIT_EVT:
    490             break;
    491 
    492         case BTA_AV_REJECT_EVT:
    493             BTIF_TRACE_DEBUG(" Received  BTA_AV_REJECT_EVT ");
    494             btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
    495             btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
    496             break;
    497 
    498         case BTA_AV_OPEN_EVT:
    499         {
    500             tBTA_AV *p_bta_data = (tBTA_AV*)p_data;
    501             btav_connection_state_t state;
    502             btif_sm_state_t av_state;
    503             BTIF_TRACE_DEBUG("status:%d, edr 0x%x",p_bta_data->open.status,
    504                                p_bta_data->open.edr);
    505 
    506             if (p_bta_data->open.status == BTA_AV_SUCCESS)
    507             {
    508                  state = BTAV_CONNECTION_STATE_CONNECTED;
    509                  av_state = BTIF_AV_STATE_OPENED;
    510                  btif_av_cb.edr = p_bta_data->open.edr;
    511 
    512                  btif_av_cb.peer_sep = p_bta_data->open.sep;
    513                  btif_a2dp_set_peer_sep(p_bta_data->open.sep);
    514             }
    515             else
    516             {
    517                 BTIF_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d",
    518                                      p_bta_data->open.status );
    519                 BD_ADDR peer_addr;
    520                 if ((btif_rc_get_connected_peer(peer_addr))
    521                     &&(!bdcmp(btif_av_cb.peer_bda.address, peer_addr)))
    522                 {
    523                     /*
    524                      * Disconnect AVRCP connection, if
    525                      * A2DP conneciton failed, for any reason
    526                      */
    527                     BTIF_TRACE_WARNING(" Disconnecting AVRCP ");
    528                     BTA_AvCloseRc(btif_rc_get_connected_peer_handle());
    529                 }
    530                 state = BTAV_CONNECTION_STATE_DISCONNECTED;
    531                 av_state  = BTIF_AV_STATE_IDLE;
    532             }
    533 
    534             /* inform the application of the event */
    535             btif_report_connection_state(state, &(btif_av_cb.peer_bda));
    536             /* change state to open/idle based on the status */
    537             btif_sm_change_state(btif_av_cb.sm_handle, av_state);
    538             if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
    539             {
    540                 /* if queued PLAY command,  send it now */
    541                 btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr,
    542                                              (p_bta_data->open.status == BTA_AV_SUCCESS));
    543             }
    544             else if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
    545             {
    546                 /* if queued PLAY command,  send it now */
    547                 btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr, FALSE);
    548                 /* Bring up AVRCP connection too */
    549                 BTA_AvOpenRc(btif_av_cb.bta_handle);
    550             }
    551             btif_queue_advance();
    552         } break;
    553 
    554         case BTIF_AV_SINK_CONFIG_REQ_EVT:
    555         {
    556             btif_av_sink_config_req_t req;
    557             // copy to avoid alignment problems
    558             memcpy(&req, p_data, sizeof(req));
    559 
    560             BTIF_TRACE_WARNING("BTIF_AV_SINK_CONFIG_REQ_EVT %d %d", req.sample_rate,
    561                     req.channel_count);
    562             if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) {
    563                 HAL_CBACK(bt_av_sink_callbacks, audio_config_cb, &(btif_av_cb.peer_bda),
    564                         req.sample_rate, req.channel_count);
    565             }
    566         } break;
    567 
    568         case BTIF_AV_CONNECT_REQ_EVT:
    569             // Check for device, if same device which moved to opening then ignore callback
    570             if (memcmp ((bt_bdaddr_t*)p_data, &(btif_av_cb.peer_bda),
    571                 sizeof(btif_av_cb.peer_bda)) == 0)
    572             {
    573                 BTIF_TRACE_DEBUG("%s: Same device moved to Opening state,ignore Connect Req", __func__);
    574                 btif_queue_advance();
    575                 break;
    576             }
    577             else
    578             {
    579                 BTIF_TRACE_DEBUG("%s: Moved from idle by Incoming Connection request", __func__);
    580                 btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, (bt_bdaddr_t*)p_data);
    581                 btif_queue_advance();
    582                 break;
    583             }
    584 
    585         case BTA_AV_PENDING_EVT:
    586             // Check for device, if same device which moved to opening then ignore callback
    587             if (memcmp (((tBTA_AV*)p_data)->pend.bd_addr, &(btif_av_cb.peer_bda),
    588                 sizeof(btif_av_cb.peer_bda)) == 0)
    589             {
    590                 BTIF_TRACE_DEBUG("%s: Same device moved to Opening state,ignore Pending Req", __func__);
    591                 break;
    592             }
    593             else
    594             {
    595                 BTIF_TRACE_DEBUG("%s: Moved from idle by outgoing Connection request", __func__);
    596                 BTA_AvDisconnect(((tBTA_AV*)p_data)->pend.bd_addr);
    597                 break;
    598             }
    599 
    600         case BTIF_AV_OFFLOAD_START_REQ_EVT:
    601             btif_a2dp_on_offload_started(BTA_AV_FAIL);
    602             BTIF_TRACE_ERROR("BTIF_AV_OFFLOAD_START_REQ_EVT: Stream not Started OPENING");
    603             break;
    604 
    605         case BTA_AV_CLOSE_EVT:
    606             btif_a2dp_on_stopped(NULL);
    607             btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED,
    608                     &(btif_av_cb.peer_bda));
    609             btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
    610             break;
    611 
    612         CHECK_RC_EVENT(event, p_data);
    613 
    614         default:
    615             BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
    616                                 dump_av_sm_event_name(event));
    617             return FALSE;
    618 
    619    }
    620    return TRUE;
    621 }
    622 
    623 /*****************************************************************************
    624 **
    625 ** Function        btif_av_state_closing_handler
    626 **
    627 ** Description     Intermediate state managing events during closing
    628 **                 of avdtp channel
    629 **
    630 ** Returns         TRUE if event was processed, FALSE otherwise
    631 **
    632 *******************************************************************************/
    633 
    634 static BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *p_data)
    635 {
    636     BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
    637                      dump_av_sm_event_name(event), btif_av_cb.flags);
    638 
    639     switch (event)
    640     {
    641         case BTIF_SM_ENTER_EVT:
    642             if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
    643             {
    644                 /* immediately stop transmission of frames */
    645                 btif_a2dp_set_tx_flush(TRUE);
    646                 /* wait for audioflinger to stop a2dp */
    647             }
    648             if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
    649             {
    650                 btif_a2dp_set_rx_flush(TRUE);
    651             }
    652             break;
    653 
    654         case BTA_AV_STOP_EVT:
    655         case BTIF_AV_STOP_STREAM_REQ_EVT:
    656             if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
    657             {
    658               /* immediately flush any pending tx frames while suspend is pending */
    659               btif_a2dp_set_tx_flush(TRUE);
    660             }
    661             if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
    662             {
    663                 btif_a2dp_set_rx_flush(TRUE);
    664             }
    665 
    666             btif_a2dp_on_stopped(NULL);
    667             break;
    668 
    669         case BTIF_SM_EXIT_EVT:
    670             break;
    671 
    672         case BTA_AV_CLOSE_EVT:
    673 
    674             /* inform the application that we are disconnecting */
    675             btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
    676 
    677             btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
    678             break;
    679 
    680         /* Handle the RC_CLOSE event for the cleanup */
    681         case BTA_AV_RC_CLOSE_EVT:
    682             btif_rc_handler(event, (tBTA_AV*)p_data);
    683             break;
    684 
    685         case BTIF_AV_OFFLOAD_START_REQ_EVT:
    686             btif_a2dp_on_offload_started(BTA_AV_FAIL);
    687             BTIF_TRACE_ERROR("BTIF_AV_OFFLOAD_START_REQ_EVT: Stream not Started Closing");
    688             break;
    689 
    690         default:
    691             BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
    692                                 dump_av_sm_event_name(event));
    693             return FALSE;
    694    }
    695    return TRUE;
    696 }
    697 
    698 /*****************************************************************************
    699 **
    700 ** Function     btif_av_state_opened_handler
    701 **
    702 ** Description  Handles AV events while AVDTP is in OPEN state
    703 **
    704 ** Returns      TRUE if event was processed, FALSE otherwise
    705 **
    706 *******************************************************************************/
    707 
    708 static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data)
    709 {
    710     tBTA_AV *p_av = (tBTA_AV*)p_data;
    711 
    712     BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
    713                      dump_av_sm_event_name(event), btif_av_cb.flags);
    714 
    715     if ( (event == BTA_AV_REMOTE_CMD_EVT) && (btif_av_cb.flags & BTIF_AV_FLAG_REMOTE_SUSPEND) &&
    716          (p_av->remote_cmd.rc_id == BTA_AV_RC_PLAY) )
    717     {
    718         BTIF_TRACE_EVENT("%s: Resetting remote suspend flag on RC PLAY", __FUNCTION__);
    719         btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
    720     }
    721 
    722     switch (event)
    723     {
    724         case BTIF_SM_ENTER_EVT:
    725             btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_STOP;
    726             btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
    727             break;
    728 
    729         case BTIF_SM_EXIT_EVT:
    730             btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
    731             break;
    732 
    733         case BTIF_AV_START_STREAM_REQ_EVT:
    734             if (btif_av_cb.peer_sep != AVDT_TSEP_SRC)
    735                 btif_a2dp_setup_codec();
    736             BTA_AvStart();
    737             btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_START;
    738             break;
    739 
    740         case BTA_AV_START_EVT:
    741         {
    742             BTIF_TRACE_EVENT("BTA_AV_START_EVT status %d, suspending %d, init %d",
    743                 p_av->start.status, p_av->start.suspending, p_av->start.initiator);
    744 
    745             if ((p_av->start.status == BTA_SUCCESS) && (p_av->start.suspending == TRUE))
    746                 return TRUE;
    747 
    748             /* if remote tries to start a2dp when DUT is a2dp source
    749              * then suspend. In case a2dp is sink and call is active
    750              * then disconnect the AVDTP channel
    751              */
    752             if (!(btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START))
    753             {
    754                 if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
    755                 {
    756                     BTIF_TRACE_EVENT("%s: trigger suspend as remote initiated!!", __FUNCTION__);
    757                     btif_dispatch_sm_event(BTIF_AV_SUSPEND_STREAM_REQ_EVT, NULL, 0);
    758                 }
    759             }
    760 
    761             /*  In case peer is A2DP SRC we do not want to ack commands on UIPC*/
    762             if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
    763             {
    764                 if (btif_a2dp_on_started(&p_av->start,
    765                     ((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) != 0)))
    766                 {
    767                     /* only clear pending flag after acknowledgement */
    768                     btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
    769                 }
    770             }
    771 
    772             /* remain in open state if status failed */
    773             if (p_av->start.status != BTA_AV_SUCCESS)
    774                 return FALSE;
    775 
    776             if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
    777             {
    778                 btif_a2dp_set_rx_flush(FALSE); /*  remove flush state, ready for streaming*/
    779             }
    780 
    781             /* change state to started, send acknowledgement if start is pending */
    782             if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) {
    783                 if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
    784                     btif_a2dp_on_started(NULL, TRUE);
    785                 /* pending start flag will be cleared when exit current state */
    786             }
    787             btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_STARTED);
    788 
    789         } break;
    790 
    791         case BTIF_AV_DISCONNECT_REQ_EVT:
    792             BTA_AvClose(btif_av_cb.bta_handle);
    793             if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) {
    794                 BTA_AvCloseRc(btif_av_cb.bta_handle);
    795             }
    796 
    797             /* inform the application that we are disconnecting */
    798             btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
    799             break;
    800 
    801         case BTA_AV_CLOSE_EVT:
    802              /* avdtp link is closed */
    803             btif_a2dp_on_stopped(NULL);
    804 
    805             /* inform the application that we are disconnected */
    806             btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
    807 
    808             /* change state to idle, send acknowledgement if start is pending */
    809             if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) {
    810                 btif_a2dp_ack_fail();
    811                 /* pending start flag will be cleared when exit current state */
    812             }
    813             btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
    814             break;
    815 
    816         case BTA_AV_RECONFIG_EVT:
    817             if((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) &&
    818                 (p_av->reconfig.status == BTA_AV_SUCCESS))
    819             {
    820                APPL_TRACE_WARNING("reconfig done BTA_AVstart()");
    821                BTA_AvStart();
    822             }
    823             else if(btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START)
    824             {
    825                btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
    826                btif_a2dp_ack_fail();
    827             }
    828             break;
    829 
    830         case BTIF_AV_CONNECT_REQ_EVT:
    831             if (memcmp ((bt_bdaddr_t*)p_data, &(btif_av_cb.peer_bda),
    832                 sizeof(btif_av_cb.peer_bda)) == 0)
    833             {
    834                 BTIF_TRACE_DEBUG("%s: Ignore BTIF_AV_CONNECT_REQ_EVT for same device", __func__);
    835             }
    836             else
    837             {
    838                 BTIF_TRACE_DEBUG("%s: Moved to opened by Other Incoming Conn req", __func__);
    839                 btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED,
    840                         (bt_bdaddr_t*)p_data);
    841             }
    842             btif_queue_advance();
    843             break;
    844 
    845         case BTIF_AV_OFFLOAD_START_REQ_EVT:
    846             btif_a2dp_on_offload_started(BTA_AV_FAIL);
    847             BTIF_TRACE_ERROR("BTIF_AV_OFFLOAD_START_REQ_EVT: Stream not Started Opened");
    848             break;
    849 
    850         CHECK_RC_EVENT(event, p_data);
    851 
    852         default:
    853             BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
    854                                dump_av_sm_event_name(event));
    855             return FALSE;
    856 
    857     }
    858     return TRUE;
    859 }
    860 
    861 /*****************************************************************************
    862 **
    863 ** Function     btif_av_state_started_handler
    864 **
    865 ** Description  Handles AV events while A2DP stream is started
    866 **
    867 ** Returns      TRUE if event was processed, FALSE otherwise
    868 **
    869 *******************************************************************************/
    870 
    871 static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data)
    872 {
    873     tBTA_AV *p_av = (tBTA_AV*)p_data;
    874 
    875     BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
    876                      dump_av_sm_event_name(event), btif_av_cb.flags);
    877 
    878     switch (event)
    879     {
    880         case BTIF_SM_ENTER_EVT:
    881 
    882             /* we are again in started state, clear any remote suspend flags */
    883             btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
    884 
    885             /**
    886              * Report to components above that we have entered the streaming
    887              * stage, this should usually be followed by focus grant.
    888              * see update_audio_focus_state()
    889              */
    890             btif_report_audio_state(BTAV_AUDIO_STATE_STARTED, &(btif_av_cb.peer_bda));
    891 
    892             /* increase the a2dp consumer task priority temporarily when start
    893             ** audio playing, to avoid overflow the audio packet queue. */
    894             adjust_priority_a2dp(TRUE);
    895 
    896             break;
    897 
    898         case BTIF_SM_EXIT_EVT:
    899             /* restore the a2dp consumer task priority when stop audio playing. */
    900             adjust_priority_a2dp(FALSE);
    901 
    902             break;
    903 
    904         case BTIF_AV_START_STREAM_REQ_EVT:
    905             /* we were remotely started, just ack back the local request */
    906             if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
    907                 btif_a2dp_on_started(NULL, TRUE);
    908             break;
    909 
    910         /* fixme -- use suspend = true always to work around issue with BTA AV */
    911         case BTIF_AV_STOP_STREAM_REQ_EVT:
    912         case BTIF_AV_SUSPEND_STREAM_REQ_EVT:
    913 
    914             /* set pending flag to ensure btif task is not trying to restart
    915                stream while suspend is in progress */
    916             btif_av_cb.flags |= BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING;
    917 
    918             /* if we were remotely suspended but suspend locally, local suspend
    919                always overrides */
    920             btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
    921 
    922             if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
    923             {
    924             /* immediately stop transmission of frames while suspend is pending */
    925                 btif_a2dp_set_tx_flush(TRUE);
    926             }
    927 
    928             if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) {
    929                 btif_a2dp_set_rx_flush(TRUE);
    930                 btif_a2dp_on_stopped(NULL);
    931             }
    932 
    933             BTA_AvStop(TRUE);
    934             break;
    935 
    936         case BTIF_AV_DISCONNECT_REQ_EVT:
    937 
    938             /* request avdtp to close */
    939             BTA_AvClose(btif_av_cb.bta_handle);
    940             if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) {
    941                 BTA_AvCloseRc(btif_av_cb.bta_handle);
    942             }
    943 
    944             /* inform the application that we are disconnecting */
    945             btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
    946 
    947             /* wait in closing state until fully closed */
    948             btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_CLOSING);
    949             break;
    950 
    951         case BTA_AV_SUSPEND_EVT:
    952 
    953             BTIF_TRACE_EVENT("BTA_AV_SUSPEND_EVT status %d, init %d",
    954                  p_av->suspend.status, p_av->suspend.initiator);
    955 
    956             /* a2dp suspended, stop media task until resumed */
    957             btif_a2dp_on_suspended(&p_av->suspend);
    958 
    959             /* if not successful, remain in current state */
    960             if (p_av->suspend.status != BTA_AV_SUCCESS)
    961             {
    962                 btif_av_cb.flags &= ~BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING;
    963 
    964                if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
    965                {
    966                 /* suspend failed, reset back tx flush state */
    967                     btif_a2dp_set_tx_flush(FALSE);
    968                }
    969                 return FALSE;
    970             }
    971 
    972             if (p_av->suspend.initiator != TRUE)
    973             {
    974                 /* remote suspend, notify HAL and await audioflinger to
    975                    suspend/stop stream */
    976 
    977                 /* set remote suspend flag to block media task from restarting
    978                    stream only if we did not already initiate a local suspend */
    979                 if ((btif_av_cb.flags & BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING) == 0)
    980                     btif_av_cb.flags |= BTIF_AV_FLAG_REMOTE_SUSPEND;
    981 
    982                 btif_report_audio_state(BTAV_AUDIO_STATE_REMOTE_SUSPEND, &(btif_av_cb.peer_bda));
    983             }
    984             else
    985             {
    986                 btif_report_audio_state(BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
    987             }
    988 
    989             btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENED);
    990 
    991             /* suspend completed and state changed, clear pending status */
    992             btif_av_cb.flags &= ~BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING;
    993             break;
    994 
    995         case BTA_AV_STOP_EVT:
    996 
    997             btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP;
    998             btif_a2dp_on_stopped(&p_av->suspend);
    999 
   1000             btif_report_audio_state(BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
   1001 
   1002             /* if stop was successful, change state to open */
   1003             if (p_av->suspend.status == BTA_AV_SUCCESS)
   1004                 btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENED);
   1005 
   1006             break;
   1007 
   1008         case BTA_AV_CLOSE_EVT:
   1009 
   1010              btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP;
   1011 
   1012             /* avdtp link is closed */
   1013             btif_a2dp_on_stopped(NULL);
   1014 
   1015             /* inform the application that we are disconnected */
   1016             btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
   1017 
   1018             btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
   1019             break;
   1020 
   1021         case BTIF_AV_OFFLOAD_START_REQ_EVT:
   1022             BTA_AvOffloadStart(btif_av_cb.bta_handle);
   1023             break;
   1024 
   1025         case BTA_AV_OFFLOAD_START_RSP_EVT:
   1026 
   1027             btif_a2dp_on_offload_started(p_av->status);
   1028             break;
   1029 
   1030         CHECK_RC_EVENT(event, p_data);
   1031 
   1032         default:
   1033             BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
   1034                                  dump_av_sm_event_name(event));
   1035             return FALSE;
   1036 
   1037     }
   1038     return TRUE;
   1039 }
   1040 
   1041 /*****************************************************************************
   1042 **  Local event handlers
   1043 ******************************************************************************/
   1044 
   1045 static void btif_av_handle_event(UINT16 event, char* p_param)
   1046 {
   1047     BTIF_TRACE_EVENT("%s event:%s", __func__,
   1048                      dump_av_sm_event_name((btif_av_sm_event_t)event));
   1049     switch(event)
   1050     {
   1051         case BTIF_AV_CLEANUP_REQ_EVT:
   1052             btif_a2dp_stop_media_task();
   1053             break;
   1054 
   1055         case BTA_AV_REGISTER_EVT:
   1056             if (btif_av_cb.sm_handle == NULL)
   1057             {
   1058                 btif_av_cb.bta_handle = ((tBTA_AV*)p_param)->registr.hndl;
   1059                 BTIF_TRACE_DEBUG("%s: BTA AV Handle updated", __func__);
   1060             }
   1061             /* FALLTHROUGH */
   1062         default:
   1063             btif_sm_dispatch(btif_av_cb.sm_handle, event, (void*)p_param);
   1064             btif_av_event_free_data(event, p_param);
   1065     }
   1066 }
   1067 
   1068 void btif_av_event_deep_copy(UINT16 event, char *p_dest, char *p_src)
   1069 {
   1070     tBTA_AV *av_src = (tBTA_AV *)p_src;
   1071     tBTA_AV *av_dest = (tBTA_AV *)p_dest;
   1072 
   1073     // First copy the structure
   1074     maybe_non_aligned_memcpy(av_dest, av_src, sizeof(*av_src));
   1075 
   1076     switch (event)
   1077     {
   1078         case BTA_AV_META_MSG_EVT:
   1079             if (av_src->meta_msg.p_data && av_src->meta_msg.len)
   1080             {
   1081                 av_dest->meta_msg.p_data = osi_calloc(av_src->meta_msg.len);
   1082                 memcpy(av_dest->meta_msg.p_data, av_src->meta_msg.p_data,
   1083                        av_src->meta_msg.len);
   1084             }
   1085 
   1086             if (av_src->meta_msg.p_msg)
   1087             {
   1088                 av_dest->meta_msg.p_msg = osi_calloc(sizeof(tAVRC_MSG));
   1089                 memcpy(av_dest->meta_msg.p_msg, av_src->meta_msg.p_msg,
   1090                        sizeof(tAVRC_MSG));
   1091 
   1092                 if (av_src->meta_msg.p_msg->vendor.p_vendor_data &&
   1093                     av_src->meta_msg.p_msg->vendor.vendor_len)
   1094                 {
   1095                     av_dest->meta_msg.p_msg->vendor.p_vendor_data = osi_calloc(
   1096                         av_src->meta_msg.p_msg->vendor.vendor_len);
   1097                     memcpy(av_dest->meta_msg.p_msg->vendor.p_vendor_data,
   1098                         av_src->meta_msg.p_msg->vendor.p_vendor_data,
   1099                         av_src->meta_msg.p_msg->vendor.vendor_len);
   1100                 }
   1101             }
   1102             break;
   1103 
   1104         default:
   1105             break;
   1106     }
   1107 }
   1108 
   1109 static void btif_av_event_free_data(btif_sm_event_t event, void *p_data)
   1110 {
   1111     switch (event)
   1112     {
   1113         case BTA_AV_META_MSG_EVT:
   1114             {
   1115                 tBTA_AV *av = (tBTA_AV *)p_data;
   1116                 osi_free_and_reset((void **)&av->meta_msg.p_data);
   1117 
   1118                 if (av->meta_msg.p_msg) {
   1119                     osi_free(av->meta_msg.p_msg->vendor.p_vendor_data);
   1120                     osi_free_and_reset((void **)&av->meta_msg.p_msg);
   1121                 }
   1122             }
   1123             break;
   1124 
   1125         default:
   1126             break;
   1127     }
   1128 }
   1129 
   1130 static void bte_av_callback(tBTA_AV_EVT event, tBTA_AV *p_data)
   1131 {
   1132     btif_transfer_context(btif_av_handle_event, event,
   1133                           (char*)p_data, sizeof(tBTA_AV), btif_av_event_deep_copy);
   1134 }
   1135 
   1136 static void bte_av_media_callback(tBTA_AV_EVT event, tBTA_AV_MEDIA *p_data)
   1137 {
   1138     btif_sm_state_t state;
   1139     UINT8 que_len;
   1140     tA2D_STATUS a2d_status;
   1141     tA2D_SBC_CIE sbc_cie;
   1142     btif_av_sink_config_req_t config_req;
   1143 
   1144     if (event == BTA_AV_MEDIA_DATA_EVT)/* Switch to BTIF_MEDIA context */
   1145     {
   1146         state= btif_sm_get_state(btif_av_cb.sm_handle);
   1147         if ( (state == BTIF_AV_STATE_STARTED) || /* send SBC packets only in Started State */
   1148              (state == BTIF_AV_STATE_OPENED) )
   1149         {
   1150             que_len = btif_media_sink_enque_buf((BT_HDR *)p_data);
   1151             BTIF_TRACE_DEBUG(" Packets in Que %d",que_len);
   1152         }
   1153         else
   1154             return;
   1155     }
   1156 
   1157     if (event == BTA_AV_MEDIA_SINK_CFG_EVT) {
   1158         /* send a command to BT Media Task */
   1159         btif_reset_decoder((UINT8*)(p_data->avk_config.codec_info));
   1160         a2d_status = A2D_ParsSbcInfo(&sbc_cie, (UINT8 *)(p_data->avk_config.codec_info), FALSE);
   1161         if (a2d_status == A2D_SUCCESS) {
   1162             /* Switch to BTIF context */
   1163             config_req.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq);
   1164             config_req.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode);
   1165             memcpy(&config_req.peer_bd,(UINT8*)(p_data->avk_config.bd_addr),
   1166                                                               sizeof(config_req.peer_bd));
   1167             btif_transfer_context(btif_av_handle_event, BTIF_AV_SINK_CONFIG_REQ_EVT,
   1168                                      (char*)&config_req, sizeof(config_req), NULL);
   1169         } else {
   1170             APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
   1171         }
   1172     }
   1173 }
   1174 /*******************************************************************************
   1175 **
   1176 ** Function         btif_av_init
   1177 **
   1178 ** Description      Initializes btif AV if not already done
   1179 **
   1180 ** Returns          bt_status_t
   1181 **
   1182 *******************************************************************************/
   1183 
   1184 bt_status_t btif_av_init(int service_id)
   1185 {
   1186     if (btif_av_cb.sm_handle == NULL)
   1187     {
   1188         alarm_free(av_open_on_rc_timer);
   1189         av_open_on_rc_timer = alarm_new("btif_av.av_open_on_rc_timer");
   1190         if (!btif_a2dp_start_media_task())
   1191             return BT_STATUS_FAIL;
   1192 
   1193         btif_enable_service(service_id);
   1194 
   1195         /* Also initialize the AV state machine */
   1196         btif_av_cb.sm_handle =
   1197                 btif_sm_init((const btif_sm_handler_t*)btif_av_state_handlers, BTIF_AV_STATE_IDLE);
   1198 
   1199         btif_a2dp_on_init();
   1200     }
   1201 
   1202     return BT_STATUS_SUCCESS;
   1203 }
   1204 
   1205 /*******************************************************************************
   1206 **
   1207 ** Function         init_src
   1208 **
   1209 ** Description      Initializes the AV interface for source mode
   1210 **
   1211 ** Returns          bt_status_t
   1212 **
   1213 *******************************************************************************/
   1214 
   1215 static bt_status_t init_src(btav_callbacks_t* callbacks)
   1216 {
   1217     BTIF_TRACE_EVENT("%s()", __func__);
   1218 
   1219     bt_status_t status = btif_av_init(BTA_A2DP_SOURCE_SERVICE_ID);
   1220     if (status == BT_STATUS_SUCCESS)
   1221         bt_av_src_callbacks = callbacks;
   1222 
   1223     return status;
   1224 }
   1225 
   1226 /*******************************************************************************
   1227 **
   1228 ** Function         init_sink
   1229 **
   1230 ** Description      Initializes the AV interface for sink mode
   1231 **
   1232 ** Returns          bt_status_t
   1233 **
   1234 *******************************************************************************/
   1235 
   1236 static bt_status_t init_sink(btav_callbacks_t* callbacks)
   1237 {
   1238     BTIF_TRACE_EVENT("%s()", __func__);
   1239 
   1240     bt_status_t status = btif_av_init(BTA_A2DP_SINK_SERVICE_ID);
   1241     if (status == BT_STATUS_SUCCESS)
   1242         bt_av_sink_callbacks = callbacks;
   1243 
   1244     return status;
   1245 }
   1246 
   1247 #ifdef USE_AUDIO_TRACK
   1248 /*******************************************************************************
   1249 **
   1250 ** Function         update_audio_focus_state
   1251 **
   1252 ** Description      Updates the final focus state reported by components calling
   1253 **                  this module.
   1254 **
   1255 ** Returns          None
   1256 **
   1257 *******************************************************************************/
   1258 void update_audio_focus_state(int state)
   1259 {
   1260     BTIF_TRACE_DEBUG("%s state %d ",__func__, state);
   1261     btif_a2dp_set_audio_focus_state(state);
   1262 }
   1263 
   1264 /*******************************************************************************
   1265 **
   1266 ** Function         update_audio_track_gain
   1267 **
   1268 ** Description      Updates the track gain (used for ducking).
   1269 **
   1270 ** Returns          None
   1271 **
   1272 *******************************************************************************/
   1273 void update_audio_track_gain(float gain)
   1274 {
   1275     BTIF_TRACE_DEBUG("%s gain %f ",__func__, gain);
   1276     btif_a2dp_set_audio_track_gain(gain);
   1277 }
   1278 #endif
   1279 
   1280 /*******************************************************************************
   1281 **
   1282 ** Function         connect
   1283 **
   1284 ** Description      Establishes the AV signalling channel with the remote headset
   1285 **
   1286 ** Returns          bt_status_t
   1287 **
   1288 *******************************************************************************/
   1289 
   1290 static bt_status_t connect_int(bt_bdaddr_t *bd_addr, uint16_t uuid)
   1291 {
   1292     btif_av_connect_req_t connect_req;
   1293     connect_req.target_bda = bd_addr;
   1294     connect_req.uuid = uuid;
   1295     BTIF_TRACE_EVENT("%s", __FUNCTION__);
   1296 
   1297     btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req);
   1298 
   1299     return BT_STATUS_SUCCESS;
   1300 }
   1301 
   1302 static bt_status_t src_connect_sink(bt_bdaddr_t *bd_addr)
   1303 {
   1304     BTIF_TRACE_EVENT("%s", __FUNCTION__);
   1305     CHECK_BTAV_INIT();
   1306 
   1307     return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, bd_addr, connect_int);
   1308 }
   1309 
   1310 static bt_status_t sink_connect_src(bt_bdaddr_t *bd_addr)
   1311 {
   1312     BTIF_TRACE_EVENT("%s", __FUNCTION__);
   1313     CHECK_BTAV_INIT();
   1314 
   1315     return btif_queue_connect(UUID_SERVCLASS_AUDIO_SINK, bd_addr, connect_int);
   1316 }
   1317 
   1318 /*******************************************************************************
   1319 **
   1320 ** Function         disconnect
   1321 **
   1322 ** Description      Tears down the AV signalling channel with the remote headset
   1323 **
   1324 ** Returns          bt_status_t
   1325 **
   1326 *******************************************************************************/
   1327 static bt_status_t disconnect(bt_bdaddr_t *bd_addr)
   1328 {
   1329     BTIF_TRACE_EVENT("%s", __FUNCTION__);
   1330 
   1331     CHECK_BTAV_INIT();
   1332 
   1333     /* Switch to BTIF context */
   1334     return btif_transfer_context(btif_av_handle_event, BTIF_AV_DISCONNECT_REQ_EVT,
   1335                                  (char*)bd_addr, sizeof(bt_bdaddr_t), NULL);
   1336 }
   1337 
   1338 /*******************************************************************************
   1339 **
   1340 ** Function         cleanup
   1341 **
   1342 ** Description      Shuts down the AV interface and does the cleanup
   1343 **
   1344 ** Returns          None
   1345 **
   1346 *******************************************************************************/
   1347 static void cleanup(int service_uuid)
   1348 {
   1349     BTIF_TRACE_EVENT("%s", __FUNCTION__);
   1350 
   1351     btif_transfer_context(btif_av_handle_event, BTIF_AV_CLEANUP_REQ_EVT, NULL, 0, NULL);
   1352 
   1353     btif_disable_service(service_uuid);
   1354 
   1355     /* Also shut down the AV state machine */
   1356     btif_sm_shutdown(btif_av_cb.sm_handle);
   1357     btif_av_cb.sm_handle = NULL;
   1358 }
   1359 
   1360 static void cleanup_src(void) {
   1361     BTIF_TRACE_EVENT("%s", __FUNCTION__);
   1362 
   1363     if (bt_av_src_callbacks)
   1364     {
   1365         bt_av_src_callbacks = NULL;
   1366         if (bt_av_sink_callbacks == NULL)
   1367             cleanup(BTA_A2DP_SOURCE_SERVICE_ID);
   1368     }
   1369 }
   1370 
   1371 static void cleanup_sink(void) {
   1372     BTIF_TRACE_EVENT("%s", __FUNCTION__);
   1373 
   1374     if (bt_av_sink_callbacks)
   1375     {
   1376         bt_av_sink_callbacks = NULL;
   1377         if (bt_av_src_callbacks == NULL)
   1378             cleanup(BTA_A2DP_SINK_SERVICE_ID);
   1379     }
   1380 }
   1381 
   1382 static const btav_interface_t bt_av_src_interface = {
   1383     sizeof(btav_interface_t),
   1384     init_src,
   1385     src_connect_sink,
   1386     disconnect,
   1387     cleanup_src,
   1388     NULL,
   1389     NULL,
   1390 };
   1391 
   1392 static const btav_interface_t bt_av_sink_interface = {
   1393     sizeof(btav_interface_t),
   1394     init_sink,
   1395     sink_connect_src,
   1396     disconnect,
   1397     cleanup_sink,
   1398 #ifdef USE_AUDIO_TRACK
   1399     update_audio_focus_state,
   1400     update_audio_track_gain,
   1401 #else
   1402     NULL,
   1403     NULL,
   1404 #endif
   1405 };
   1406 
   1407 /*******************************************************************************
   1408 **
   1409 ** Function         btif_av_get_sm_handle
   1410 **
   1411 ** Description      Fetches current av SM handle
   1412 **
   1413 ** Returns          None
   1414 **
   1415 *******************************************************************************/
   1416 
   1417 btif_sm_handle_t btif_av_get_sm_handle(void)
   1418 {
   1419     return btif_av_cb.sm_handle;
   1420 }
   1421 
   1422 /*******************************************************************************
   1423 **
   1424 ** Function         btif_av_get_addr
   1425 **
   1426 ** Description      Fetches current AV BD address
   1427 **
   1428 ** Returns          BD address
   1429 **
   1430 *******************************************************************************/
   1431 
   1432 bt_bdaddr_t btif_av_get_addr(void)
   1433 {
   1434     return btif_av_cb.peer_bda;
   1435 }
   1436 
   1437 /*******************************************************************************
   1438 ** Function         btif_av_is_sink_enabled
   1439 **
   1440 ** Description      Checks if A2DP Sink is enabled or not
   1441 **
   1442 ** Returns          TRUE if A2DP Sink is enabled, false otherwise
   1443 **
   1444 *******************************************************************************/
   1445 
   1446 BOOLEAN btif_av_is_sink_enabled(void)
   1447 {
   1448     return (bt_av_sink_callbacks != NULL) ? TRUE : FALSE;
   1449 }
   1450 
   1451 /*******************************************************************************
   1452 **
   1453 ** Function         btif_av_stream_ready
   1454 **
   1455 ** Description      Checks whether AV is ready for starting a stream
   1456 **
   1457 ** Returns          None
   1458 **
   1459 *******************************************************************************/
   1460 
   1461 BOOLEAN btif_av_stream_ready(void)
   1462 {
   1463     btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle);
   1464 
   1465     BTIF_TRACE_DEBUG("btif_av_stream_ready : sm hdl %d, state %d, flags %x",
   1466                 btif_av_cb.sm_handle, state, btif_av_cb.flags);
   1467 
   1468     /* also make sure main adapter is enabled */
   1469     if (btif_is_enabled() == 0)
   1470     {
   1471         BTIF_TRACE_EVENT("main adapter not enabled");
   1472         return FALSE;
   1473     }
   1474 
   1475     /* check if we are remotely suspended or stop is pending */
   1476     if (btif_av_cb.flags & (BTIF_AV_FLAG_REMOTE_SUSPEND|BTIF_AV_FLAG_PENDING_STOP))
   1477         return FALSE;
   1478 
   1479     return (state == BTIF_AV_STATE_OPENED);
   1480 }
   1481 
   1482 /*******************************************************************************
   1483 **
   1484 ** Function         btif_av_stream_started_ready
   1485 **
   1486 ** Description      Checks whether AV ready for media start in streaming state
   1487 **
   1488 ** Returns          None
   1489 **
   1490 *******************************************************************************/
   1491 
   1492 BOOLEAN btif_av_stream_started_ready(void)
   1493 {
   1494     btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle);
   1495 
   1496     BTIF_TRACE_DEBUG("btif_av_stream_started : sm hdl %d, state %d, flags %x",
   1497                 btif_av_cb.sm_handle, state, btif_av_cb.flags);
   1498 
   1499     /* disallow media task to start if we have pending actions */
   1500     if (btif_av_cb.flags & (BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING | BTIF_AV_FLAG_REMOTE_SUSPEND
   1501         | BTIF_AV_FLAG_PENDING_STOP))
   1502         return FALSE;
   1503 
   1504     return (state == BTIF_AV_STATE_STARTED);
   1505 }
   1506 
   1507 /*******************************************************************************
   1508 **
   1509 ** Function         btif_dispatch_sm_event
   1510 **
   1511 ** Description      Send event to AV statemachine
   1512 **
   1513 ** Returns          None
   1514 **
   1515 *******************************************************************************/
   1516 
   1517 /* used to pass events to AV statemachine from other tasks */
   1518 void btif_dispatch_sm_event(btif_av_sm_event_t event, void *p_data, int len)
   1519 {
   1520     /* Switch to BTIF context */
   1521     btif_transfer_context(btif_av_handle_event, event,
   1522                           (char*)p_data, len, NULL);
   1523 }
   1524 
   1525 /*******************************************************************************
   1526 **
   1527 ** Function         btif_av_execute_service
   1528 **
   1529 ** Description      Initializes/Shuts down the service
   1530 **
   1531 ** Returns          BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise
   1532 **
   1533 *******************************************************************************/
   1534 bt_status_t btif_av_execute_service(BOOLEAN b_enable)
   1535 {
   1536      if (b_enable)
   1537      {
   1538          /* TODO: Removed BTA_SEC_AUTHORIZE since the Java/App does not
   1539           * handle this request in order to allow incoming connections to succeed.
   1540           * We need to put this back once support for this is added */
   1541 
   1542          /* Added BTA_AV_FEAT_NO_SCO_SSPD - this ensures that the BTA does not
   1543           * auto-suspend av streaming on AG events(SCO or Call). The suspend shall
   1544           * be initiated by the app/audioflinger layers */
   1545          /* Support for browsing for SDP record should work only if we enable BROWSE
   1546           * while registering. */
   1547 #if (AVRC_METADATA_INCLUDED == TRUE)
   1548          BTA_AvEnable(BTA_SEC_AUTHENTICATE,
   1549              BTA_AV_FEAT_RCTG|BTA_AV_FEAT_METADATA|BTA_AV_FEAT_VENDOR|BTA_AV_FEAT_NO_SCO_SSPD
   1550 #if (AVRC_ADV_CTRL_INCLUDED == TRUE)
   1551              |BTA_AV_FEAT_RCCT
   1552              |BTA_AV_FEAT_ADV_CTRL
   1553 #endif
   1554              ,bte_av_callback);
   1555 #else
   1556          BTA_AvEnable(BTA_SEC_AUTHENTICATE, (BTA_AV_FEAT_RCTG | BTA_AV_FEAT_NO_SCO_SSPD),
   1557                       bte_av_callback);
   1558 #endif
   1559          BTA_AvRegister(BTA_AV_CHNL_AUDIO, BTIF_AV_SERVICE_NAME, 0, bte_av_media_callback,
   1560                                                              UUID_SERVCLASS_AUDIO_SOURCE);
   1561      }
   1562      else {
   1563          BTA_AvDeregister(btif_av_cb.bta_handle);
   1564          BTA_AvDisable();
   1565      }
   1566      return BT_STATUS_SUCCESS;
   1567 }
   1568 
   1569 /*******************************************************************************
   1570 **
   1571 ** Function         btif_av_sink_execute_service
   1572 **
   1573 ** Description      Initializes/Shuts down the service
   1574 **
   1575 ** Returns          BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise
   1576 **
   1577 *******************************************************************************/
   1578 bt_status_t btif_av_sink_execute_service(BOOLEAN b_enable)
   1579 {
   1580      if (b_enable)
   1581      {
   1582          /* Added BTA_AV_FEAT_NO_SCO_SSPD - this ensures that the BTA does not
   1583           * auto-suspend av streaming on AG events(SCO or Call). The suspend shall
   1584           * be initiated by the app/audioflinger layers */
   1585          BTA_AvEnable(BTA_SEC_AUTHENTICATE, BTA_AV_FEAT_NO_SCO_SSPD|BTA_AV_FEAT_RCCT|
   1586                                             BTA_AV_FEAT_METADATA|BTA_AV_FEAT_VENDOR|
   1587                                             BTA_AV_FEAT_ADV_CTRL|BTA_AV_FEAT_RCTG,
   1588                                                                         bte_av_callback);
   1589          BTA_AvRegister(BTA_AV_CHNL_AUDIO, BTIF_AVK_SERVICE_NAME, 0, bte_av_media_callback,
   1590                                                                 UUID_SERVCLASS_AUDIO_SINK);
   1591      }
   1592      else {
   1593          BTA_AvDeregister(btif_av_cb.bta_handle);
   1594          BTA_AvDisable();
   1595      }
   1596      return BT_STATUS_SUCCESS;
   1597 }
   1598 
   1599 /*******************************************************************************
   1600 **
   1601 ** Function         btif_av_get_src_interface
   1602 **
   1603 ** Description      Get the AV callback interface for A2DP source profile
   1604 **
   1605 ** Returns          btav_interface_t
   1606 **
   1607 *******************************************************************************/
   1608 const btav_interface_t *btif_av_get_src_interface(void)
   1609 {
   1610     BTIF_TRACE_EVENT("%s", __FUNCTION__);
   1611     return &bt_av_src_interface;
   1612 }
   1613 
   1614 /*******************************************************************************
   1615 **
   1616 ** Function         btif_av_get_sink_interface
   1617 **
   1618 ** Description      Get the AV callback interface for A2DP sink profile
   1619 **
   1620 ** Returns          btav_interface_t
   1621 **
   1622 *******************************************************************************/
   1623 const btav_interface_t *btif_av_get_sink_interface(void)
   1624 {
   1625     BTIF_TRACE_EVENT("%s", __FUNCTION__);
   1626     return &bt_av_sink_interface;
   1627 }
   1628 
   1629 /*******************************************************************************
   1630 **
   1631 ** Function         btif_av_is_connected
   1632 **
   1633 ** Description      Checks if av has a connected sink
   1634 **
   1635 ** Returns          BOOLEAN
   1636 **
   1637 *******************************************************************************/
   1638 BOOLEAN btif_av_is_connected(void)
   1639 {
   1640     btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle);
   1641     return ((state == BTIF_AV_STATE_OPENED) || (state ==  BTIF_AV_STATE_STARTED));
   1642 }
   1643 
   1644 /*******************************************************************************
   1645 **
   1646 ** Function         btif_av_is_peer_edr
   1647 **
   1648 ** Description      Check if the connected a2dp device supports
   1649 **                  EDR or not. Only when connected this function
   1650 **                  will accurately provide a true capability of
   1651 **                  remote peer. If not connected it will always be false.
   1652 **
   1653 ** Returns          TRUE if remote device is capable of EDR
   1654 **
   1655 *******************************************************************************/
   1656 BOOLEAN btif_av_is_peer_edr(void)
   1657 {
   1658     ASSERTC(btif_av_is_connected(), "No active a2dp connection", 0);
   1659 
   1660     if (btif_av_cb.edr)
   1661         return TRUE;
   1662     else
   1663         return FALSE;
   1664 }
   1665 
   1666 /******************************************************************************
   1667 **
   1668 ** Function        btif_av_clear_remote_suspend_flag
   1669 **
   1670 ** Description     Clears btif_av_cd.flags if BTIF_AV_FLAG_REMOTE_SUSPEND is set
   1671 **
   1672 ** Returns          void
   1673 ******************************************************************************/
   1674 void btif_av_clear_remote_suspend_flag(void)
   1675 {
   1676     BTIF_TRACE_DEBUG("%s: flag :%x",__func__, btif_av_cb.flags);
   1677     btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
   1678 }
   1679 
   1680 /*******************************************************************************
   1681 **
   1682 ** Function         btif_av_peer_supports_3mbps
   1683 **
   1684 ** Description      Check if the connected A2DP device supports
   1685 **                  3 Mbps EDR. This function only works if connected.
   1686 **                  If not connected it will always be false.
   1687 **
   1688 ** Returns          TRUE if remote device is EDR and supports 3 Mbps
   1689 **
   1690 *******************************************************************************/
   1691 BOOLEAN btif_av_peer_supports_3mbps(void)
   1692 {
   1693     BOOLEAN is3mbps = ((btif_av_cb.edr & BTA_AV_EDR_3MBPS) != 0);
   1694     BTIF_TRACE_DEBUG("%s: connected %d, edr_3mbps %d", __func__,
   1695             btif_av_is_connected(), is3mbps);
   1696     return (btif_av_is_connected() && is3mbps);
   1697 }
   1698