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
52typedef 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
74typedef 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
84typedef struct {
85  bt_bdaddr_t* target_bda;
86  uint16_t uuid;
87} btif_av_connect_req_t;
88
89typedef 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 *****************************************************************************/
98static btav_source_callbacks_t* bt_av_src_callbacks = NULL;
99static btav_sink_callbacks_t* bt_av_sink_callbacks = NULL;
100static btif_av_cb_t btif_av_cb = {
101    0, {{0}}, 0, 0, 0, 0, std::vector<btav_a2dp_codec_config_t>()};
102static 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
128static bool btif_av_state_idle_handler(btif_sm_event_t event, void* data);
129static bool btif_av_state_opening_handler(btif_sm_event_t event, void* data);
130static bool btif_av_state_opened_handler(btif_sm_event_t event, void* data);
131static bool btif_av_state_started_handler(btif_sm_event_t event, void* data);
132static bool btif_av_state_closing_handler(btif_sm_event_t event, void* data);
133
134static 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
139static void btif_av_event_free_data(btif_sm_event_t event, void* p_data);
140
141/*************************************************************************
142 * Extern functions
143 ************************************************************************/
144extern void btif_rc_handler(tBTA_AV_EVT event, tBTA_AV* p_data);
145extern bool btif_rc_get_connected_peer(BD_ADDR peer_addr);
146extern uint8_t btif_rc_get_connected_peer_handle(BD_ADDR peer_addr);
147extern void btif_rc_check_handle_pending_play(BD_ADDR peer_addr,
148                                              bool bSendToApp);
149
150extern fixed_queue_t* btu_general_alarm_queue;
151
152/*****************************************************************************
153 * Local helper functions
154 *****************************************************************************/
155
156const 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
168const 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 ******************************************************************************/
223static 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 ******************************************************************************/
257static 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 ******************************************************************************/
279static 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
288static 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
297static 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
328static 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
507static 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
672static 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
748static 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
913static 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
1085static 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
1106void 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
1144static 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
1163static 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
1168static 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
1219bt_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
1257static 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
1279static 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 ******************************************************************************/
1298static 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 ******************************************************************************/
1312static 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
1328static 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
1340static 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
1347static 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 ******************************************************************************/
1363static 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
1372static 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 ******************************************************************************/
1403static 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
1419static 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
1428static 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
1437static 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
1446static 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
1466bt_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
1477bool 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
1491bool 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
1521bool 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 */
1547void 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 ******************************************************************************/
1561bt_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 ******************************************************************************/
1604bt_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 ******************************************************************************/
1633const 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 ******************************************************************************/
1647const 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 ******************************************************************************/
1661bool 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
1666uint8_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 ******************************************************************************/
1680bool 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 *****************************************************************************/
1697void 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 ******************************************************************************/
1713bool 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 ******************************************************************************/
1732void 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