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