1 /******************************************************************************
3 * Copyright (C) 2009-2012 Broadcom Corporation
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:
9 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 ******************************************************************************/
20 /*****************************************************************************
24 * Description: Bluedroid AV implementation
26 *****************************************************************************/
28 #include <hardware/bluetooth.h>
29 #include <system/audio.h>
30 #include "hardware/bt_av.h"
32 #define LOG_TAG "BTIF_AV"
35 #include "btif_util.h"
36 #include "btif_profile_queue.h"
38 #include "btif_media.h"
39 #include "bta_av_api.h"
45 /*****************************************************************************
47 ******************************************************************************/
48 #define BTIF_AV_SERVICE_NAME "Advanced Audio"
50 #define BTIF_TIMEOUT_AV_OPEN_ON_RC_SECS 2
53 BTIF_AV_STATE_IDLE = 0x0,
54 BTIF_AV_STATE_OPENING,
56 BTIF_AV_STATE_STARTED,
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 */
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
70 /*****************************************************************************
71 ** Local type definitions
72 ******************************************************************************/
76 tBTA_AV_HNDL bta_handle;
78 btif_sm_handle_t sm_handle;
81 UINT8 peer_sep; /* sep type of peer device */
86 bt_bdaddr_t *target_bda;
88 } btif_av_connect_req_t;
94 } btif_av_sink_config_req_t;
96 /*****************************************************************************
98 ******************************************************************************/
99 static btav_callbacks_t *bt_av_src_callbacks = NULL;
100 static btav_callbacks_t *bt_av_sink_callbacks = NULL;
101 static btif_av_cb_t btif_av_cb;
102 static TIMER_LIST_ENT tle_av_open_on_rc;
104 /* both interface and media task needs to be ready to alloc incoming request */
105 #define CHECK_BTAV_INIT() if (((bt_av_src_callbacks == NULL) &&(bt_av_sink_callbacks == NULL)) \
106 || (btif_av_cb.sm_handle == NULL))\
108 BTIF_TRACE_WARNING("%s: BTAV not initialized", __FUNCTION__);\
109 return BT_STATUS_NOT_READY;\
113 BTIF_TRACE_EVENT("%s", __FUNCTION__);\
116 /* Helper macro to avoid code duplication in the state machine handlers */
117 #define CHECK_RC_EVENT(e, d) \
118 case BTA_AV_RC_OPEN_EVT: \
119 case BTA_AV_RC_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: \
125 btif_rc_handler(e, d);\
128 static BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *data);
129 static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *data);
130 static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *data);
131 static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *data);
132 static BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *data);
134 static const btif_sm_handler_t btif_av_state_handlers[] =
136 btif_av_state_idle_handler,
137 btif_av_state_opening_handler,
138 btif_av_state_opened_handler,
139 btif_av_state_started_handler,
140 btif_av_state_closing_handler
143 /*************************************************************************
145 *************************************************************************/
146 extern void btif_rc_handler(tBTA_AV_EVT event, tBTA_AV *p_data);
147 extern BOOLEAN btif_rc_get_connected_peer(BD_ADDR peer_addr);
148 extern void btif_rc_check_handle_pending_play (BD_ADDR peer_addr, BOOLEAN bSendToApp);
150 /*****************************************************************************
151 ** Local helper functions
152 ******************************************************************************/
154 const char *dump_av_sm_state_name(btif_av_state_t 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: return "UNKNOWN_STATE";
167 const char *dump_av_sm_event_name(btif_av_sm_event_t event)
171 CASE_RETURN_STR(BTA_AV_ENABLE_EVT)
172 CASE_RETURN_STR(BTA_AV_REGISTER_EVT)
173 CASE_RETURN_STR(BTA_AV_OPEN_EVT)
174 CASE_RETURN_STR(BTA_AV_CLOSE_EVT)
175 CASE_RETURN_STR(BTA_AV_START_EVT)
176 CASE_RETURN_STR(BTA_AV_STOP_EVT)
177 CASE_RETURN_STR(BTA_AV_PROTECT_REQ_EVT)
178 CASE_RETURN_STR(BTA_AV_PROTECT_RSP_EVT)
179 CASE_RETURN_STR(BTA_AV_RC_OPEN_EVT)
180 CASE_RETURN_STR(BTA_AV_RC_CLOSE_EVT)
181 CASE_RETURN_STR(BTA_AV_REMOTE_CMD_EVT)
182 CASE_RETURN_STR(BTA_AV_REMOTE_RSP_EVT)
183 CASE_RETURN_STR(BTA_AV_VENDOR_CMD_EVT)
184 CASE_RETURN_STR(BTA_AV_VENDOR_RSP_EVT)
185 CASE_RETURN_STR(BTA_AV_RECONFIG_EVT)
186 CASE_RETURN_STR(BTA_AV_SUSPEND_EVT)
187 CASE_RETURN_STR(BTA_AV_PENDING_EVT)
188 CASE_RETURN_STR(BTA_AV_META_MSG_EVT)
189 CASE_RETURN_STR(BTA_AV_REJECT_EVT)
190 CASE_RETURN_STR(BTA_AV_RC_FEAT_EVT)
191 CASE_RETURN_STR(BTIF_SM_ENTER_EVT)
192 CASE_RETURN_STR(BTIF_SM_EXIT_EVT)
193 CASE_RETURN_STR(BTIF_AV_CONNECT_REQ_EVT)
194 CASE_RETURN_STR(BTIF_AV_DISCONNECT_REQ_EVT)
195 CASE_RETURN_STR(BTIF_AV_START_STREAM_REQ_EVT)
196 CASE_RETURN_STR(BTIF_AV_STOP_STREAM_REQ_EVT)
197 CASE_RETURN_STR(BTIF_AV_SUSPEND_STREAM_REQ_EVT)
198 CASE_RETURN_STR(BTIF_AV_SINK_CONFIG_REQ_EVT)
199 default: return "UNKNOWN_EVENT";
203 /****************************************************************************
204 ** Local helper functions
205 *****************************************************************************/
206 /*******************************************************************************
208 ** Function btif_initiate_av_open_tmr_hdlr
210 ** Description Timer to trigger AV open if the remote headset establishes
211 ** RC connection w/o AV connection. The timer is needed to IOP
212 ** with headsets that do establish AV after RC connection.
216 *******************************************************************************/
217 static void btif_initiate_av_open_tmr_hdlr(TIMER_LIST_ENT *tle)
221 btif_av_connect_req_t connect_req;
223 /* is there at least one RC connection - There should be */
224 if (btif_rc_get_connected_peer(peer_addr)) {
225 BTIF_TRACE_DEBUG("%s Issuing connect to the remote RC peer", __FUNCTION__);
226 /* In case of AVRCP connection request, we will initiate SRC connection */
227 connect_req.target_bda = (bt_bdaddr_t*)&peer_addr;
228 connect_req.uuid = UUID_SERVCLASS_AUDIO_SOURCE;
229 btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req);
233 BTIF_TRACE_ERROR("%s No connected RC peers", __FUNCTION__);
237 /*****************************************************************************
239 ******************************************************************************/
241 static void btif_report_connection_state(btav_connection_state_t state, bt_bdaddr_t *bd_addr)
243 if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) {
244 HAL_CBACK(bt_av_sink_callbacks, connection_state_cb, state, bd_addr);
245 } else if (btif_av_cb.peer_sep == AVDT_TSEP_SNK && bt_av_src_callbacks != NULL) {
246 HAL_CBACK(bt_av_src_callbacks, connection_state_cb, state, bd_addr);
250 static void btif_report_audio_state(btav_audio_state_t state, bt_bdaddr_t *bd_addr)
252 if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) {
253 HAL_CBACK(bt_av_sink_callbacks, audio_state_cb, state, bd_addr);
254 } else if (btif_av_cb.peer_sep == AVDT_TSEP_SNK && bt_av_src_callbacks != NULL) {
255 HAL_CBACK(bt_av_src_callbacks, audio_state_cb, state, bd_addr);
259 /*****************************************************************************
261 ** Function btif_av_state_idle_handler
263 ** Description State managing disconnected AV link
265 ** Returns TRUE if event was processed, FALSE otherwise
267 *******************************************************************************/
269 static BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *p_data)
271 BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
272 dump_av_sm_event_name(event), btif_av_cb.flags);
276 case BTIF_SM_ENTER_EVT:
277 /* clear the peer_bda */
278 memset(&btif_av_cb.peer_bda, 0, sizeof(bt_bdaddr_t));
279 btif_av_cb.flags = 0;
284 case BTIF_SM_EXIT_EVT:
287 case BTA_AV_ENABLE_EVT:
290 case BTA_AV_REGISTER_EVT:
291 btif_av_cb.bta_handle = ((tBTA_AV*)p_data)->registr.hndl;
294 case BTA_AV_PENDING_EVT:
295 case BTIF_AV_CONNECT_REQ_EVT:
297 if (event == BTIF_AV_CONNECT_REQ_EVT)
299 memcpy(&btif_av_cb.peer_bda, ((btif_av_connect_req_t*)p_data)->target_bda,
300 sizeof(bt_bdaddr_t));
301 BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle,
302 TRUE, BTA_SEC_NONE, ((btif_av_connect_req_t*)p_data)->uuid);
304 else if (event == BTA_AV_PENDING_EVT)
306 bdcpy(btif_av_cb.peer_bda.address, ((tBTA_AV*)p_data)->pend.bd_addr);
307 BTA_AvOpen(btif_av_cb.peer_bda.address, btif_av_cb.bta_handle,
308 TRUE, BTA_SEC_NONE, UUID_SERVCLASS_AUDIO_SOURCE);
310 btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENING);
313 case BTA_AV_RC_OPEN_EVT:
314 /* IOP_FIX: Jabra 620 only does RC open without AV open whenever it connects. So
315 * as per the AV WP, an AVRC connection cannot exist without an AV connection. Therefore,
316 * we initiate an AV connection if an RC_OPEN_EVT is received when we are in AV_CLOSED state.
317 * We initiate the AV connection after a small 3s timeout to avoid any collisions from the
318 * headsets, as some headsets initiate the AVRC connection first and then
319 * immediately initiate the AV connection
321 * TODO: We may need to do this only on an AVRCP Play. FixMe
324 BTIF_TRACE_DEBUG("BTA_AV_RC_OPEN_EVT received w/o AV");
325 memset(&tle_av_open_on_rc, 0, sizeof(tle_av_open_on_rc));
326 tle_av_open_on_rc.param = (UINT32)btif_initiate_av_open_tmr_hdlr;
327 btu_start_timer(&tle_av_open_on_rc, BTU_TTYPE_USER_FUNC,
328 BTIF_TIMEOUT_AV_OPEN_ON_RC_SECS);
329 btif_rc_handler(event, p_data);
332 case BTA_AV_REMOTE_CMD_EVT:
333 case BTA_AV_VENDOR_CMD_EVT:
334 case BTA_AV_META_MSG_EVT:
335 case BTA_AV_RC_FEAT_EVT:
336 btif_rc_handler(event, (tBTA_AV*)p_data);
339 case BTA_AV_RC_CLOSE_EVT:
340 if (tle_av_open_on_rc.in_use) {
341 BTIF_TRACE_DEBUG("BTA_AV_RC_CLOSE_EVT: Stopping AV timer.");
342 btu_stop_timer(&tle_av_open_on_rc);
344 btif_rc_handler(event, p_data);
348 BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
349 dump_av_sm_event_name(event));
355 /*****************************************************************************
357 ** Function btif_av_state_opening_handler
359 ** Description Intermediate state managing events during establishment
362 ** Returns TRUE if event was processed, FALSE otherwise
364 *******************************************************************************/
366 static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data)
368 BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
369 dump_av_sm_event_name(event), btif_av_cb.flags);
373 case BTIF_SM_ENTER_EVT:
374 /* inform the application that we are entering connecting state */
375 btif_report_connection_state(BTAV_CONNECTION_STATE_CONNECTING, &(btif_av_cb.peer_bda));
378 case BTIF_SM_EXIT_EVT:
381 case BTA_AV_REJECT_EVT:
382 BTIF_TRACE_DEBUG(" Received BTA_AV_REJECT_EVT ");
383 btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
384 btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
387 case BTA_AV_OPEN_EVT:
389 tBTA_AV *p_bta_data = (tBTA_AV*)p_data;
390 btav_connection_state_t state;
391 btif_sm_state_t av_state;
392 BTIF_TRACE_DEBUG("status:%d, edr 0x%x",p_bta_data->open.status,
393 p_bta_data->open.edr);
395 if (p_bta_data->open.status == BTA_AV_SUCCESS)
397 state = BTAV_CONNECTION_STATE_CONNECTED;
398 av_state = BTIF_AV_STATE_OPENED;
399 btif_av_cb.edr = p_bta_data->open.edr;
401 btif_av_cb.peer_sep = p_bta_data->open.sep;
402 btif_a2dp_set_peer_sep(p_bta_data->open.sep);
406 BTIF_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d",
407 p_bta_data->open.status );
408 state = BTAV_CONNECTION_STATE_DISCONNECTED;
409 av_state = BTIF_AV_STATE_IDLE;
412 /* inform the application of the event */
413 btif_report_connection_state(state, &(btif_av_cb.peer_bda));
414 /* change state to open/idle based on the status */
415 btif_sm_change_state(btif_av_cb.sm_handle, av_state);
416 if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
418 /* if queued PLAY command, send it now */
419 btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr,
420 (p_bta_data->open.status == BTA_AV_SUCCESS));
422 else if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
424 /* if queued PLAY command, send it now */
425 btif_rc_check_handle_pending_play(p_bta_data->open.bd_addr, FALSE);
426 /* Bring up AVRCP connection too */
427 BTA_AvOpenRc(btif_av_cb.bta_handle);
429 btif_queue_advance();
432 case BTIF_AV_SINK_CONFIG_REQ_EVT:
434 btif_av_sink_config_req_t req;
435 // copy to avoid alignment problems
436 memcpy(&req, p_data, sizeof(req));
438 BTIF_TRACE_WARNING("BTIF_AV_SINK_CONFIG_REQ_EVT %d %d", req.sample_rate,
440 if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) {
441 HAL_CBACK(bt_av_sink_callbacks, audio_config_cb, &(btif_av_cb.peer_bda),
442 req.sample_rate, req.channel_count);
446 CHECK_RC_EVENT(event, p_data);
449 BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
450 dump_av_sm_event_name(event));
458 /*****************************************************************************
460 ** Function btif_av_state_closing_handler
462 ** Description Intermediate state managing events during closing
465 ** Returns TRUE if event was processed, FALSE otherwise
467 *******************************************************************************/
469 static BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *p_data)
471 BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
472 dump_av_sm_event_name(event), btif_av_cb.flags);
476 case BTIF_SM_ENTER_EVT:
477 if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
479 /* immediately stop transmission of frames */
480 btif_a2dp_set_tx_flush(TRUE);
481 /* wait for audioflinger to stop a2dp */
483 if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
485 btif_a2dp_set_rx_flush(TRUE);
489 case BTA_AV_STOP_EVT:
490 case BTIF_AV_STOP_STREAM_REQ_EVT:
491 if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
493 /* immediately flush any pending tx frames while suspend is pending */
494 btif_a2dp_set_tx_flush(TRUE);
496 if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
498 btif_a2dp_set_rx_flush(TRUE);
501 btif_a2dp_on_stopped(NULL);
504 case BTIF_SM_EXIT_EVT:
507 case BTA_AV_CLOSE_EVT:
509 /* inform the application that we are disconnecting */
510 btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
512 btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
515 /* Handle the RC_CLOSE event for the cleanup */
516 case BTA_AV_RC_CLOSE_EVT:
517 btif_rc_handler(event, (tBTA_AV*)p_data);
521 BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
522 dump_av_sm_event_name(event));
529 /*****************************************************************************
531 ** Function btif_av_state_opened_handler
533 ** Description Handles AV events while AVDTP is in OPEN state
535 ** Returns TRUE if event was processed, FALSE otherwise
537 *******************************************************************************/
539 static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data)
541 tBTA_AV *p_av = (tBTA_AV*)p_data;
543 BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
544 dump_av_sm_event_name(event), btif_av_cb.flags);
546 if ( (event == BTA_AV_REMOTE_CMD_EVT) && (btif_av_cb.flags & BTIF_AV_FLAG_REMOTE_SUSPEND) &&
547 (p_av->remote_cmd.rc_id == BTA_AV_RC_PLAY) )
549 BTIF_TRACE_EVENT("%s: Resetting remote suspend flag on RC PLAY", __FUNCTION__);
550 btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
555 case BTIF_SM_ENTER_EVT:
556 btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_STOP;
557 btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
560 case BTIF_SM_EXIT_EVT:
561 btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
564 case BTIF_AV_START_STREAM_REQ_EVT:
565 if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
568 btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_START;
571 btif_a2dp_setup_codec();
573 btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_START;
576 case BTA_AV_START_EVT:
578 BTIF_TRACE_EVENT("BTA_AV_START_EVT status %d, suspending %d, init %d",
579 p_av->start.status, p_av->start.suspending, p_av->start.initiator);
581 if ((p_av->start.status == BTA_SUCCESS) && (p_av->start.suspending == TRUE))
584 /* In case peer is A2DP SRC we do not want to ack commands on UIPC*/
585 if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
587 if (btif_a2dp_on_started(&p_av->start,
588 ((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) != 0)))
590 /* only clear pending flag after acknowledgement */
591 btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
595 /* remain in open state if status failed */
596 if (p_av->start.status != BTA_AV_SUCCESS)
599 if (btif_av_cb.peer_sep == AVDT_TSEP_SRC)
601 btif_a2dp_set_rx_flush(FALSE); /* remove flush state, ready for streaming*/
604 /* change state to started, send acknowledgement if start is pending */
605 if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) {
606 if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
607 btif_a2dp_on_started(NULL, TRUE);
608 /* pending start flag will be cleared when exit current state */
610 btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_STARTED);
614 case BTIF_AV_DISCONNECT_REQ_EVT:
615 BTA_AvClose(btif_av_cb.bta_handle);
616 if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) {
617 BTA_AvCloseRc(btif_av_cb.bta_handle);
620 /* inform the application that we are disconnecting */
621 btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
624 case BTA_AV_CLOSE_EVT:
625 /* avdtp link is closed */
626 btif_a2dp_on_stopped(NULL);
628 /* inform the application that we are disconnected */
629 btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
631 /* change state to idle, send acknowledgement if start is pending */
632 if (btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) {
633 btif_a2dp_ack_fail();
634 /* pending start flag will be cleared when exit current state */
636 btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
639 case BTA_AV_RECONFIG_EVT:
640 if((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) &&
641 (p_av->reconfig.status == BTA_AV_SUCCESS))
643 APPL_TRACE_WARNING("reconfig done BTA_AVstart()");
646 else if(btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START)
648 btif_av_cb.flags &= ~BTIF_AV_FLAG_PENDING_START;
649 btif_a2dp_ack_fail();
653 CHECK_RC_EVENT(event, p_data);
656 BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
657 dump_av_sm_event_name(event));
664 /*****************************************************************************
666 ** Function btif_av_state_started_handler
668 ** Description Handles AV events while A2DP stream is started
670 ** Returns TRUE if event was processed, FALSE otherwise
672 *******************************************************************************/
674 static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data)
676 tBTA_AV *p_av = (tBTA_AV*)p_data;
678 BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__,
679 dump_av_sm_event_name(event), btif_av_cb.flags);
683 case BTIF_SM_ENTER_EVT:
685 /* we are again in started state, clear any remote suspend flags */
686 btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
688 btif_report_audio_state(BTAV_AUDIO_STATE_STARTED, &(btif_av_cb.peer_bda));
690 /* increase the a2dp consumer task priority temporarily when start
691 ** audio playing, to avoid overflow the audio packet queue. */
692 adjust_priority_a2dp(TRUE);
696 case BTIF_SM_EXIT_EVT:
697 /* restore the a2dp consumer task priority when stop audio playing. */
698 adjust_priority_a2dp(FALSE);
702 case BTIF_AV_START_STREAM_REQ_EVT:
703 /* we were remotely started, just ack back the local request */
704 if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
705 btif_a2dp_on_started(NULL, TRUE);
708 /* fixme -- use suspend = true always to work around issue with BTA AV */
709 case BTIF_AV_STOP_STREAM_REQ_EVT:
710 case BTIF_AV_SUSPEND_STREAM_REQ_EVT:
712 /* set pending flag to ensure btif task is not trying to restart
713 stream while suspend is in progress */
714 btif_av_cb.flags |= BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING;
716 /* if we were remotely suspended but suspend locally, local suspend
718 btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
720 if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
722 /* immediately stop transmission of frames while suspend is pending */
723 btif_a2dp_set_tx_flush(TRUE);
726 if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) {
727 btif_a2dp_set_rx_flush(TRUE);
728 btif_a2dp_on_stopped(NULL);
734 case BTIF_AV_DISCONNECT_REQ_EVT:
736 /* request avdtp to close */
737 BTA_AvClose(btif_av_cb.bta_handle);
738 if (btif_av_cb.peer_sep == AVDT_TSEP_SRC) {
739 BTA_AvCloseRc(btif_av_cb.bta_handle);
742 /* inform the application that we are disconnecting */
743 btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTING, &(btif_av_cb.peer_bda));
745 /* wait in closing state until fully closed */
746 btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_CLOSING);
749 case BTA_AV_SUSPEND_EVT:
751 BTIF_TRACE_EVENT("BTA_AV_SUSPEND_EVT status %d, init %d",
752 p_av->suspend.status, p_av->suspend.initiator);
754 /* a2dp suspended, stop media task until resumed */
755 btif_a2dp_on_suspended(&p_av->suspend);
757 /* if not successful, remain in current state */
758 if (p_av->suspend.status != BTA_AV_SUCCESS)
760 btif_av_cb.flags &= ~BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING;
762 if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
764 /* suspend failed, reset back tx flush state */
765 btif_a2dp_set_tx_flush(FALSE);
770 if (p_av->suspend.initiator != TRUE)
772 /* remote suspend, notify HAL and await audioflinger to
773 suspend/stop stream */
775 /* set remote suspend flag to block media task from restarting
776 stream only if we did not already initiate a local suspend */
777 if ((btif_av_cb.flags & BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING) == 0)
778 btif_av_cb.flags |= BTIF_AV_FLAG_REMOTE_SUSPEND;
780 btif_report_audio_state(BTAV_AUDIO_STATE_REMOTE_SUSPEND, &(btif_av_cb.peer_bda));
784 btif_report_audio_state(BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
787 btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENED);
789 /* suspend completed and state changed, clear pending status */
790 btif_av_cb.flags &= ~BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING;
793 case BTA_AV_STOP_EVT:
795 btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP;
796 btif_a2dp_on_stopped(&p_av->suspend);
798 btif_report_audio_state(BTAV_AUDIO_STATE_STOPPED, &(btif_av_cb.peer_bda));
800 /* if stop was successful, change state to open */
801 if (p_av->suspend.status == BTA_AV_SUCCESS)
802 btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_OPENED);
806 case BTA_AV_CLOSE_EVT:
808 btif_av_cb.flags |= BTIF_AV_FLAG_PENDING_STOP;
810 /* avdtp link is closed */
811 btif_a2dp_on_stopped(NULL);
813 /* inform the application that we are disconnected */
814 btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
816 btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
819 CHECK_RC_EVENT(event, p_data);
822 BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__,
823 dump_av_sm_event_name(event));
830 /*****************************************************************************
831 ** Local event handlers
832 ******************************************************************************/
834 static void btif_av_handle_event(UINT16 event, char* p_param)
836 btif_sm_dispatch(btif_av_cb.sm_handle, event, (void*)p_param);
839 static void bte_av_callback(tBTA_AV_EVT event, tBTA_AV *p_data)
841 /* Switch to BTIF context */
842 btif_transfer_context(btif_av_handle_event, event,
843 (char*)p_data, sizeof(tBTA_AV), NULL);
846 static void bte_av_media_callback(tBTA_AV_EVT event, tBTA_AV_MEDIA *p_data)
848 btif_sm_state_t state;
850 tA2D_STATUS a2d_status;
851 tA2D_SBC_CIE sbc_cie;
852 btif_av_sink_config_req_t config_req;
854 if (event == BTA_AV_MEDIA_DATA_EVT)/* Switch to BTIF_MEDIA context */
856 state= btif_sm_get_state(btif_av_cb.sm_handle);
857 if ( (state == BTIF_AV_STATE_STARTED) || /* send SBC packets only in Started State */
858 (state == BTIF_AV_STATE_OPENED) )
860 que_len = btif_media_sink_enque_buf((BT_HDR *)p_data);
861 BTIF_TRACE_DEBUG(" Packets in Que %d",que_len);
867 if (event == BTA_AV_MEDIA_SINK_CFG_EVT) {
868 /* send a command to BT Media Task */
869 btif_reset_decoder((UINT8*)p_data);
871 a2d_status = A2D_ParsSbcInfo(&sbc_cie, (UINT8 *)p_data, FALSE);
872 if (a2d_status == A2D_SUCCESS) {
873 /* Switch to BTIF context */
874 config_req.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq);
875 config_req.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode);
876 btif_transfer_context(btif_av_handle_event, BTIF_AV_SINK_CONFIG_REQ_EVT,
877 (char*)&config_req, sizeof(config_req), NULL);
879 APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
883 /*******************************************************************************
885 ** Function btif_av_init
887 ** Description Initializes btif AV if not already done
889 ** Returns bt_status_t
891 *******************************************************************************/
893 bt_status_t btif_av_init()
895 btif_av_cb.sm_handle = NULL;
897 if (btif_av_cb.sm_handle == NULL)
899 if (btif_a2dp_start_media_task() != GKI_SUCCESS)
900 return BT_STATUS_FAIL;
902 btif_enable_service(BTA_A2DP_SERVICE_ID);
904 /* Also initialize the AV state machine */
905 btif_av_cb.sm_handle = btif_sm_init((const btif_sm_handler_t*)btif_av_state_handlers, BTIF_AV_STATE_IDLE);
909 return BT_STATUS_SUCCESS;
912 return BT_STATUS_DONE;
915 /*******************************************************************************
919 ** Description Initializes the AV interface for source mode
921 ** Returns bt_status_t
923 *******************************************************************************/
925 static bt_status_t init_src(btav_callbacks_t* callbacks)
929 BTIF_TRACE_EVENT("%s", __FUNCTION__);
931 if (bt_av_sink_callbacks != NULL) {
932 // already did btif_av_init()
933 status = BT_STATUS_SUCCESS;
935 status = btif_av_init();
938 if (status == BT_STATUS_SUCCESS) {
939 bt_av_src_callbacks = callbacks;
945 /*******************************************************************************
947 ** Function init_sink
949 ** Description Initializes the AV interface for sink mode
951 ** Returns bt_status_t
953 *******************************************************************************/
955 static bt_status_t init_sink(btav_callbacks_t* callbacks)
959 BTIF_TRACE_EVENT("%s", __FUNCTION__);
961 if (bt_av_src_callbacks != NULL) {
962 // already did btif_av_init()
963 status = BT_STATUS_SUCCESS;
965 status = btif_av_init();
968 if (status == BT_STATUS_SUCCESS) {
969 bt_av_sink_callbacks = callbacks;
970 BTA_AvEnable_Sink(TRUE);
976 /*******************************************************************************
980 ** Description Establishes the AV signalling channel with the remote headset
982 ** Returns bt_status_t
984 *******************************************************************************/
986 static bt_status_t connect_int(bt_bdaddr_t *bd_addr, uint16_t uuid)
988 btif_av_connect_req_t connect_req;
989 connect_req.target_bda = bd_addr;
990 connect_req.uuid = uuid;
991 BTIF_TRACE_EVENT("%s", __FUNCTION__);
993 btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req);
995 return BT_STATUS_SUCCESS;
998 static bt_status_t src_connect_sink(bt_bdaddr_t *bd_addr)
1000 BTIF_TRACE_EVENT("%s", __FUNCTION__);
1003 return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, bd_addr, connect_int);
1006 static bt_status_t sink_connect_src(bt_bdaddr_t *bd_addr)
1008 BTIF_TRACE_EVENT("%s", __FUNCTION__);
1011 return btif_queue_connect(UUID_SERVCLASS_AUDIO_SINK, bd_addr, connect_int);
1014 /*******************************************************************************
1016 ** Function disconnect
1018 ** Description Tears down the AV signalling channel with the remote headset
1020 ** Returns bt_status_t
1022 *******************************************************************************/
1023 static bt_status_t disconnect(bt_bdaddr_t *bd_addr)
1025 BTIF_TRACE_EVENT("%s", __FUNCTION__);
1029 /* Switch to BTIF context */
1030 return btif_transfer_context(btif_av_handle_event, BTIF_AV_DISCONNECT_REQ_EVT,
1031 (char*)bd_addr, sizeof(bt_bdaddr_t), NULL);
1034 /*******************************************************************************
1038 ** Description Shuts down the AV interface and does the cleanup
1042 *******************************************************************************/
1043 static void cleanup(void)
1045 BTIF_TRACE_EVENT("%s", __FUNCTION__);
1047 btif_a2dp_stop_media_task();
1049 btif_disable_service(BTA_A2DP_SERVICE_ID);
1051 /* Also shut down the AV state machine */
1052 btif_sm_shutdown(btif_av_cb.sm_handle);
1053 btif_av_cb.sm_handle = NULL;
1056 static void cleanup_src(void) {
1057 BTIF_TRACE_EVENT("%s", __FUNCTION__);
1059 if (bt_av_src_callbacks)
1061 bt_av_src_callbacks = NULL;
1062 if (bt_av_sink_callbacks == NULL)
1067 static void cleanup_sink(void) {
1068 BTIF_TRACE_EVENT("%s", __FUNCTION__);
1070 if (bt_av_sink_callbacks)
1072 bt_av_sink_callbacks = NULL;
1073 if (bt_av_src_callbacks == NULL)
1078 static const btav_interface_t bt_av_src_interface = {
1079 sizeof(btav_interface_t),
1086 static const btav_interface_t bt_av_sink_interface = {
1087 sizeof(btav_interface_t),
1094 /*******************************************************************************
1096 ** Function btif_av_get_sm_handle
1098 ** Description Fetches current av SM handle
1102 *******************************************************************************/
1104 btif_sm_handle_t btif_av_get_sm_handle(void)
1106 return btif_av_cb.sm_handle;
1109 /*******************************************************************************
1111 ** Function btif_av_stream_ready
1113 ** Description Checks whether AV is ready for starting a stream
1117 *******************************************************************************/
1119 BOOLEAN btif_av_stream_ready(void)
1121 btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle);
1123 BTIF_TRACE_DEBUG("btif_av_stream_ready : sm hdl %d, state %d, flags %x",
1124 btif_av_cb.sm_handle, state, btif_av_cb.flags);
1126 /* also make sure main adapter is enabled */
1127 if (btif_is_enabled() == 0)
1129 BTIF_TRACE_EVENT("main adapter not enabled");
1133 /* check if we are remotely suspended or stop is pending */
1134 if (btif_av_cb.flags & (BTIF_AV_FLAG_REMOTE_SUSPEND|BTIF_AV_FLAG_PENDING_STOP))
1137 return (state == BTIF_AV_STATE_OPENED);
1140 /*******************************************************************************
1142 ** Function btif_av_stream_started_ready
1144 ** Description Checks whether AV ready for media start in streaming state
1148 *******************************************************************************/
1150 BOOLEAN btif_av_stream_started_ready(void)
1152 btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle);
1154 BTIF_TRACE_DEBUG("btif_av_stream_started : sm hdl %d, state %d, flags %x",
1155 btif_av_cb.sm_handle, state, btif_av_cb.flags);
1157 /* disallow media task to start if we have pending actions */
1158 if (btif_av_cb.flags & (BTIF_AV_FLAG_LOCAL_SUSPEND_PENDING | BTIF_AV_FLAG_REMOTE_SUSPEND
1159 | BTIF_AV_FLAG_PENDING_STOP))
1162 return (state == BTIF_AV_STATE_STARTED);
1165 /*******************************************************************************
1167 ** Function btif_dispatch_sm_event
1169 ** Description Send event to AV statemachine
1173 *******************************************************************************/
1175 /* used to pass events to AV statemachine from other tasks */
1176 void btif_dispatch_sm_event(btif_av_sm_event_t event, void *p_data, int len)
1178 /* Switch to BTIF context */
1179 btif_transfer_context(btif_av_handle_event, event,
1180 (char*)p_data, len, NULL);
1183 /*******************************************************************************
1185 ** Function btif_av_execute_service
1187 ** Description Initializes/Shuts down the service
1189 ** Returns BT_STATUS_SUCCESS on success, BT_STATUS_FAIL otherwise
1191 *******************************************************************************/
1192 bt_status_t btif_av_execute_service(BOOLEAN b_enable)
1196 /* TODO: Removed BTA_SEC_AUTHORIZE since the Java/App does not
1197 * handle this request in order to allow incoming connections to succeed.
1198 * We need to put this back once support for this is added */
1200 /* Added BTA_AV_FEAT_NO_SCO_SSPD - this ensures that the BTA does not
1201 * auto-suspend av streaming on AG events(SCO or Call). The suspend shall
1202 * be initiated by the app/audioflinger layers */
1203 #if (AVRC_METADATA_INCLUDED == TRUE)
1204 BTA_AvEnable(BTA_SEC_AUTHENTICATE,
1205 BTA_AV_FEAT_RCTG|BTA_AV_FEAT_METADATA|BTA_AV_FEAT_VENDOR|BTA_AV_FEAT_NO_SCO_SSPD
1206 #if (AVRC_ADV_CTRL_INCLUDED == TRUE)
1208 |BTA_AV_FEAT_ADV_CTRL
1212 BTA_AvEnable(BTA_SEC_AUTHENTICATE, (BTA_AV_FEAT_RCTG | BTA_AV_FEAT_NO_SCO_SSPD),
1215 BTA_AvRegister(BTA_AV_CHNL_AUDIO, BTIF_AV_SERVICE_NAME, 0, bte_av_media_callback);
1218 BTA_AvDeregister(btif_av_cb.bta_handle);
1221 return BT_STATUS_SUCCESS;
1224 /*******************************************************************************
1226 ** Function btif_av_get_src_interface
1228 ** Description Get the AV callback interface for A2DP source profile
1230 ** Returns btav_interface_t
1232 *******************************************************************************/
1233 const btav_interface_t *btif_av_get_src_interface(void)
1235 BTIF_TRACE_EVENT("%s", __FUNCTION__);
1236 return &bt_av_src_interface;
1239 /*******************************************************************************
1241 ** Function btif_av_get_sink_interface
1243 ** Description Get the AV callback interface for A2DP sink profile
1245 ** Returns btav_interface_t
1247 *******************************************************************************/
1248 const btav_interface_t *btif_av_get_sink_interface(void)
1250 BTIF_TRACE_EVENT("%s", __FUNCTION__);
1251 return &bt_av_sink_interface;
1254 /*******************************************************************************
1256 ** Function btif_av_is_connected
1258 ** Description Checks if av has a connected sink
1262 *******************************************************************************/
1263 BOOLEAN btif_av_is_connected(void)
1265 btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle);
1266 return ((state == BTIF_AV_STATE_OPENED) || (state == BTIF_AV_STATE_STARTED));
1269 /*******************************************************************************
1271 ** Function btif_av_is_peer_edr
1273 ** Description Check if the connected a2dp device supports
1274 ** EDR or not. Only when connected this function
1275 ** will accurately provide a true capability of
1276 ** remote peer. If not connected it will always be false.
1278 ** Returns TRUE if remote device is capable of EDR
1280 *******************************************************************************/
1281 BOOLEAN btif_av_is_peer_edr(void)
1283 ASSERTC(btif_av_is_connected(), "No active a2dp connection", 0);