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 ******************************************************************************/
19 /******************************************************************************
21 ** Name: btif_media_task.c
23 ** Description: This is the multimedia module for the BTIF system. It
24 ** contains task implementations AV, HS and HF profiles
25 ** audio & video processing
27 ******************************************************************************/
29 #define LOG_TAG "bt_btif_media"
34 #include <sys/types.h>
43 #include "bt_target.h"
44 #include "osi/include/fixed_queue.h"
49 #include "bta_sys_int.h"
51 #include "bta_av_api.h"
55 #include "bta_av_sbc.h"
56 #include "bta_av_ci.h"
59 #include "btif_av_co.h"
60 #include "btif_media.h"
62 #include "osi/include/alarm.h"
63 #include "osi/include/log.h"
64 #include "osi/include/thread.h"
66 #if (BTA_AV_INCLUDED == TRUE)
67 #include "sbc_encoder.h"
70 #include <hardware/bluetooth.h>
71 #include "audio_a2dp_hw.h"
74 #include "btif_util.h"
75 #if (BTA_AV_SINK_INCLUDED == TRUE)
76 #include "oi_codec_sbc.h"
77 #include "oi_status.h"
82 #if (BTA_AV_SINK_INCLUDED == TRUE)
83 OI_CODEC_SBC_DECODER_CONTEXT context;
84 OI_UINT32 contextData[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)];
85 OI_INT16 pcmData[15*SBC_MAX_SAMPLES_PER_FRAME*SBC_MAX_CHANNELS];
88 /*****************************************************************************
90 *****************************************************************************/
92 #ifndef AUDIO_CHANNEL_OUT_MONO
93 #define AUDIO_CHANNEL_OUT_MONO 0x01
96 #ifndef AUDIO_CHANNEL_OUT_STEREO
97 #define AUDIO_CHANNEL_OUT_STEREO 0x03
100 /* BTIF media cmd event definition : BTIF_MEDIA_TASK_CMD */
103 BTIF_MEDIA_START_AA_TX = 1,
104 BTIF_MEDIA_STOP_AA_TX,
105 BTIF_MEDIA_AA_RX_RDY,
106 BTIF_MEDIA_UIPC_RX_RDY,
107 BTIF_MEDIA_SBC_ENC_INIT,
108 BTIF_MEDIA_SBC_ENC_UPDATE,
109 BTIF_MEDIA_SBC_DEC_INIT,
110 BTIF_MEDIA_VIDEO_DEC_INIT,
111 BTIF_MEDIA_FLUSH_AA_TX,
112 BTIF_MEDIA_FLUSH_AA_RX,
113 BTIF_MEDIA_AUDIO_FEEDING_INIT,
114 BTIF_MEDIA_AUDIO_RECEIVING_INIT,
115 BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE,
116 BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK
120 MEDIA_TASK_STATE_OFF = 0,
121 MEDIA_TASK_STATE_ON = 1,
122 MEDIA_TASK_STATE_SHUTTING_DOWN = 2
125 /* Macro to multiply the media task tick */
126 #ifndef BTIF_MEDIA_NUM_TICK
127 #define BTIF_MEDIA_NUM_TICK 1
130 /* Media task tick in milliseconds, must be set to multiple of
131 (1000/TICKS_PER_SEC) (10) */
133 #define BTIF_MEDIA_TIME_TICK (20 * BTIF_MEDIA_NUM_TICK)
134 #define A2DP_DATA_READ_POLL_MS (BTIF_MEDIA_TIME_TICK / 2)
135 #define BTIF_SINK_MEDIA_TIME_TICK (20 * BTIF_MEDIA_NUM_TICK)
139 #define BTIF_MEDIA_AA_POOL_ID GKI_POOL_ID_3
140 #define BTIF_MEDIA_AA_BUF_SIZE GKI_BUF3_SIZE
143 #if (BTA_AV_CO_CP_SCMS_T == TRUE)
144 #define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE + 1)
146 #define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE)
149 /* Define the bitrate step when trying to match bitpool value */
150 #ifndef BTIF_MEDIA_BITRATE_STEP
151 #define BTIF_MEDIA_BITRATE_STEP 5
154 /* Middle quality quality setting @ 44.1 khz */
155 #define DEFAULT_SBC_BITRATE 328
157 #ifndef BTIF_A2DP_NON_EDR_MAX_RATE
158 #define BTIF_A2DP_NON_EDR_MAX_RATE 229
161 #define USEC_PER_SEC 1000000L
162 #define TPUT_STATS_INTERVAL_US (3000*1000)
165 * CONGESTION COMPENSATION CTRL ::
167 * Thus setting controls how many buffers we will hold in media task
168 * during temp link congestion. Together with the stack buffer queues
169 * it controls much temporary a2dp link congestion we can
170 * compensate for. It however also depends on the default run level of sinks
171 * jitterbuffers. Depending on type of sink this would vary.
172 * Ideally the (SRC) max tx buffer capacity should equal the sinks
173 * jitterbuffer runlevel including any intermediate buffers on the way
174 * towards the sinks codec.
177 /* fixme -- define this in pcm time instead of buffer count */
179 /* The typical runlevel of the tx queue size is ~1 buffer
180 but due to link flow control or thread preemption in lower
181 layers we might need to temporarily buffer up data */
183 /* 18 frames is equivalent to 6.89*18*2.9 ~= 360 ms @ 44.1 khz, 20 ms mediatick */
184 #define MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ 18
186 #ifndef MAX_PCM_FRAME_NUM_PER_TICK
187 #define MAX_PCM_FRAME_NUM_PER_TICK 14
190 /* In case of A2DP SINK, we will delay start by 5 AVDTP Packets*/
191 #define MAX_A2DP_DELAYED_START_FRAME_COUNT 5
192 #define PACKET_PLAYED_PER_TICK_48 8
193 #define PACKET_PLAYED_PER_TICK_44 7
194 #define PACKET_PLAYED_PER_TICK_32 5
195 #define PACKET_PLAYED_PER_TICK_16 3
199 UINT16 num_frames_to_be_processed;
202 UINT16 layer_specific;
207 UINT32 aa_frame_counter;
208 INT32 aa_feed_counter;
209 INT32 aa_feed_residue;
211 UINT32 bytes_per_tick; /* pcm bytes read each media task tick */
212 } tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE;
216 tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE pcm;
217 } tBTIF_AV_MEDIA_FEEDINGS_STATE;
221 #if (BTA_AV_INCLUDED == TRUE)
229 tBTIF_AV_FEEDING_MODE feeding_mode;
230 tBTIF_AV_MEDIA_FEEDINGS media_feeding;
231 tBTIF_AV_MEDIA_FEEDINGS_STATE media_feeding_state;
232 SBC_ENC_PARAMS encoder;
235 UINT8 a2dp_cmd_pending; /* we can have max one command pending */
236 BOOLEAN tx_flush; /* discards any outgoing data when true */
237 BOOLEAN rx_flush; /* discards any incoming data when true */
239 BOOLEAN data_channel_open;
240 UINT8 frames_to_process;
244 alarm_t *media_alarm;
245 alarm_t *decode_alarm;
255 long long ts_prev_us;
258 static UINT64 last_frame_us = 0;
260 static void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event);
261 static void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event);
262 static void btif_a2dp_encoder_update(void);
263 #if (BTA_AV_SINK_INCLUDED == TRUE)
264 extern OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
265 const OI_BYTE **frameData,
266 unsigned long *frameBytes,
268 unsigned long *pcmBytes);
269 extern OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
270 unsigned long *decoderData,
271 unsigned long decoderDataBytes,
272 OI_UINT8 maxChannels,
276 static void btif_media_flush_q(BUFFER_Q *p_q);
277 static void btif_media_task_aa_handle_stop_decoding(void );
278 static void btif_media_task_aa_rx_flush(void);
280 static const char *dump_media_event(UINT16 event);
281 static void btif_media_thread_init(void *context);
282 static void btif_media_thread_cleanup(void *context);
283 static void btif_media_thread_handle_cmd(fixed_queue_t *queue, void *context);
285 /* Handle incoming media packets A2DP SINK streaming*/
286 #if (BTA_AV_SINK_INCLUDED == TRUE)
287 static void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg);
290 #if (BTA_AV_INCLUDED == TRUE)
291 static void btif_media_send_aa_frame(void);
292 static void btif_media_task_feeding_state_reset(void);
293 static void btif_media_task_aa_start_tx(void);
294 static void btif_media_task_aa_stop_tx(void);
295 static void btif_media_task_enc_init(BT_HDR *p_msg);
296 static void btif_media_task_enc_update(BT_HDR *p_msg);
297 static void btif_media_task_audio_feeding_init(BT_HDR *p_msg);
298 static void btif_media_task_aa_tx_flush(BT_HDR *p_msg);
299 static void btif_media_aa_prep_2_send(UINT8 nb_frame);
300 #if (BTA_AV_SINK_INCLUDED == TRUE)
301 static void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg);
302 static void btif_media_task_aa_handle_clear_track(void);
304 static void btif_media_task_aa_handle_start_decoding(void);
306 BOOLEAN btif_media_task_clear_track(void);
308 static void btif_media_task_aa_handle_timer(UNUSED_ATTR void *context);
309 static void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context);
310 extern BOOLEAN btif_hf_is_call_idle();
312 static tBTIF_MEDIA_CB btif_media_cb;
313 static int media_task_running = MEDIA_TASK_STATE_OFF;
315 static fixed_queue_t *btif_media_cmd_msg_queue;
316 static thread_t *worker_thread;
318 /*****************************************************************************
319 ** Misc helper functions
320 *****************************************************************************/
322 static UINT64 time_now_us()
324 struct timespec ts_now;
325 clock_gettime(CLOCK_BOOTTIME, &ts_now);
326 return ((UINT64)ts_now.tv_sec * USEC_PER_SEC) + ((UINT64)ts_now.tv_nsec / 1000);
329 static void log_tstamps_us(char *comment)
331 static UINT64 prev_us = 0;
332 const UINT64 now_us = time_now_us();
333 APPL_TRACE_DEBUG("[%s] ts %08llu, diff : %08llu, queue sz %d", comment, now_us, now_us - prev_us,
334 GKI_queue_length(&btif_media_cb.TxAaQ));
338 UNUSED_ATTR static const char *dump_media_event(UINT16 event)
342 CASE_RETURN_STR(BTIF_MEDIA_START_AA_TX)
343 CASE_RETURN_STR(BTIF_MEDIA_STOP_AA_TX)
344 CASE_RETURN_STR(BTIF_MEDIA_AA_RX_RDY)
345 CASE_RETURN_STR(BTIF_MEDIA_UIPC_RX_RDY)
346 CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_INIT)
347 CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_UPDATE)
348 CASE_RETURN_STR(BTIF_MEDIA_SBC_DEC_INIT)
349 CASE_RETURN_STR(BTIF_MEDIA_VIDEO_DEC_INIT)
350 CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_TX)
351 CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_RX)
352 CASE_RETURN_STR(BTIF_MEDIA_AUDIO_FEEDING_INIT)
353 CASE_RETURN_STR(BTIF_MEDIA_AUDIO_RECEIVING_INIT)
354 CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE)
355 CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK)
358 return "UNKNOWN MEDIA EVENT";
362 /*****************************************************************************
364 *****************************************************************************/
366 static const char* dump_a2dp_ctrl_event(UINT8 event)
370 CASE_RETURN_STR(A2DP_CTRL_CMD_NONE)
371 CASE_RETURN_STR(A2DP_CTRL_CMD_CHECK_READY)
372 CASE_RETURN_STR(A2DP_CTRL_CMD_START)
373 CASE_RETURN_STR(A2DP_CTRL_CMD_STOP)
374 CASE_RETURN_STR(A2DP_CTRL_CMD_SUSPEND)
376 return "UNKNOWN MSG ID";
380 static void btif_audiopath_detached(void)
382 APPL_TRACE_EVENT("## AUDIO PATH DETACHED ##");
384 /* send stop request only if we are actively streaming and haven't received
385 a stop request. Potentially audioflinger detached abnormally */
386 if (btif_media_cb.is_tx_timer)
388 /* post stop event and wait for audio path to stop */
389 btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0);
393 static void a2dp_cmd_acknowledge(int status)
397 APPL_TRACE_EVENT("## a2dp ack : %s, status %d ##",
398 dump_a2dp_ctrl_event(btif_media_cb.a2dp_cmd_pending), status);
401 if (btif_media_cb.a2dp_cmd_pending == A2DP_CTRL_CMD_NONE)
403 APPL_TRACE_ERROR("warning : no command pending, ignore ack");
408 btif_media_cb.a2dp_cmd_pending = A2DP_CTRL_CMD_NONE;
410 /* acknowledge start request */
411 UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &ack, 1);
415 static void btif_recv_ctrl_data(void)
419 n = UIPC_Read(UIPC_CH_ID_AV_CTRL, NULL, &cmd, 1);
421 /* detach on ctrl channel means audioflinger process was terminated */
424 APPL_TRACE_EVENT("CTRL CH DETACHED");
425 UIPC_Close(UIPC_CH_ID_AV_CTRL);
426 /* we can operate only on datachannel, if af client wants to
427 do send additional commands the ctrl channel would be reestablished */
428 //btif_audiopath_detached();
432 APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s", dump_a2dp_ctrl_event(cmd));
434 btif_media_cb.a2dp_cmd_pending = cmd;
438 case A2DP_CTRL_CMD_CHECK_READY:
440 if (media_task_running == MEDIA_TASK_STATE_SHUTTING_DOWN)
442 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
446 /* check whether av is ready to setup a2dp datapath */
447 if ((btif_av_stream_ready() == TRUE) || (btif_av_stream_started_ready() == TRUE))
449 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
453 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
457 case A2DP_CTRL_CMD_START:
458 /* Don't sent START request to stack while we are in call.
459 Some headsets like the Sony MW600, don't allow AVDTP START
460 in call and respond BAD_STATE. */
461 if (!btif_hf_is_call_idle())
463 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_INCALL_FAILURE);
467 if (btif_av_stream_ready() == TRUE)
469 /* setup audio data channel listener */
470 UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
472 /* post start event and wait for audio path to open */
473 btif_dispatch_sm_event(BTIF_AV_START_STREAM_REQ_EVT, NULL, 0);
475 #if (BTA_AV_SINK_INCLUDED == TRUE)
476 if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
477 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
480 else if (btif_av_stream_started_ready())
482 /* already started, setup audio data channel listener
483 and ack back immediately */
484 UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
486 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
490 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
495 case A2DP_CTRL_CMD_STOP:
496 if (btif_media_cb.peer_sep == AVDT_TSEP_SNK && btif_media_cb.is_tx_timer == FALSE)
498 /* we are already stopped, just ack back */
499 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
503 btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0);
504 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
507 case A2DP_CTRL_CMD_SUSPEND:
509 if (btif_av_stream_started_ready())
511 btif_dispatch_sm_event(BTIF_AV_SUSPEND_STREAM_REQ_EVT, NULL, 0);
515 /* if we are not in started state, just ack back ok and let
516 audioflinger close the channel. This can happen if we are
517 remotely suspended, clear REMOTE SUSPEND Flag */
518 btif_av_clear_remote_suspend_flag();
519 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
523 case A2DP_CTRL_GET_AUDIO_CONFIG:
525 uint32_t sample_rate = btif_media_cb.sample_rate;
526 uint8_t channel_count = btif_media_cb.channel_count;
528 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
529 UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, (UINT8 *)&sample_rate, 4);
530 UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &channel_count, 1);
535 APPL_TRACE_ERROR("UNSUPPORTED CMD (%d)", cmd);
536 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
539 APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s DONE", dump_a2dp_ctrl_event(cmd));
542 static void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
546 APPL_TRACE_DEBUG("A2DP-CTRL-CHANNEL EVENT %s", dump_uipc_event(event));
551 /* fetch av statemachine handle */
552 btif_media_cb.av_sm_hdl = btif_av_get_sm_handle();
556 /* restart ctrl server unless we are shutting down */
557 if (media_task_running == MEDIA_TASK_STATE_ON)
558 UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb);
561 case UIPC_RX_DATA_READY_EVT:
562 btif_recv_ctrl_data();
566 APPL_TRACE_ERROR("### A2DP-CTRL-CHANNEL EVENT %d NOT HANDLED ###", event);
571 static void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
575 APPL_TRACE_DEBUG("BTIF MEDIA (A2DP-DATA) EVENT %s", dump_uipc_event(event));
581 /* read directly from media task from here on (keep callback for
583 UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_REMOVE_ACTIVE_READSET, NULL);
584 UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_SET_READ_POLL_TMO,
585 (void *)A2DP_DATA_READ_POLL_MS);
587 if (btif_media_cb.peer_sep == AVDT_TSEP_SNK) {
588 /* Start the media task to encode SBC */
589 btif_media_task_start_aa_req();
591 /* make sure we update any changed sbc encoder params */
592 btif_a2dp_encoder_update();
594 btif_media_cb.data_channel_open = TRUE;
596 /* ack back when media task is fully started */
600 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
601 btif_audiopath_detached();
602 btif_media_cb.data_channel_open = FALSE;
606 APPL_TRACE_ERROR("### A2DP-DATA EVENT %d NOT HANDLED ###", event);
612 /*****************************************************************************
614 *****************************************************************************/
616 static UINT16 btif_media_task_get_sbc_rate(void)
618 UINT16 rate = DEFAULT_SBC_BITRATE;
620 /* restrict bitrate if a2dp link is non-edr */
621 if (!btif_av_is_peer_edr())
623 rate = BTIF_A2DP_NON_EDR_MAX_RATE;
624 APPL_TRACE_DEBUG("non-edr a2dp sink detected, restrict rate to %d", rate);
630 static void btif_a2dp_encoder_init(void)
633 tBTIF_MEDIA_INIT_AUDIO msg;
634 tA2D_SBC_CIE sbc_config;
636 /* lookup table for converting channel mode */
637 UINT16 codec_mode_tbl[5] = { SBC_JOINT_STEREO, SBC_STEREO, SBC_DUAL, 0, SBC_MONO };
639 /* lookup table for converting number of blocks */
640 UINT16 codec_block_tbl[5] = { 16, 12, 8, 0, 4 };
642 /* lookup table to convert freq */
643 UINT16 freq_block_tbl[5] = { SBC_sf48000, SBC_sf44100, SBC_sf32000, 0, SBC_sf16000 };
645 APPL_TRACE_DEBUG("btif_a2dp_encoder_init");
647 /* Retrieve the current SBC configuration (default if currently not used) */
648 bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
649 msg.NumOfSubBands = (sbc_config.num_subbands == A2D_SBC_IE_SUBBAND_4) ? 4 : 8;
650 msg.NumOfBlocks = codec_block_tbl[sbc_config.block_len >> 5];
651 msg.AllocationMethod = (sbc_config.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L) ? SBC_LOUDNESS : SBC_SNR;
652 msg.ChannelMode = codec_mode_tbl[sbc_config.ch_mode >> 1];
653 msg.SamplingFreq = freq_block_tbl[sbc_config.samp_freq >> 5];
654 msg.MtuSize = minmtu;
656 APPL_TRACE_EVENT("msg.ChannelMode %x", msg.ChannelMode);
658 /* Init the media task to encode SBC properly */
659 btif_media_task_enc_init_req(&msg);
662 static void btif_a2dp_encoder_update(void)
665 tA2D_SBC_CIE sbc_config;
666 tBTIF_MEDIA_UPDATE_AUDIO msg;
670 APPL_TRACE_DEBUG("btif_a2dp_encoder_update");
672 /* Retrieve the current SBC configuration (default if currently not used) */
673 bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
675 APPL_TRACE_DEBUG("btif_a2dp_encoder_update: Common min_bitpool:%d(0x%x) max_bitpool:%d(0x%x)",
676 sbc_config.min_bitpool, sbc_config.min_bitpool,
677 sbc_config.max_bitpool, sbc_config.max_bitpool);
679 if (sbc_config.min_bitpool > sbc_config.max_bitpool)
681 APPL_TRACE_ERROR("btif_a2dp_encoder_update: ERROR btif_a2dp_encoder_update min_bitpool > max_bitpool");
684 /* check if remote sink has a preferred bitpool range */
685 if (bta_av_co_get_remote_bitpool_pref(&pref_min, &pref_max) == TRUE)
687 /* adjust our preferred bitpool with the remote preference if within
690 if (pref_min < sbc_config.min_bitpool)
691 pref_min = sbc_config.min_bitpool;
693 if (pref_max > sbc_config.max_bitpool)
694 pref_max = sbc_config.max_bitpool;
696 msg.MinBitPool = pref_min;
697 msg.MaxBitPool = pref_max;
699 if ((pref_min != sbc_config.min_bitpool) || (pref_max != sbc_config.max_bitpool))
701 APPL_TRACE_EVENT("## adjusted our bitpool range to peer pref [%d:%d] ##",
707 msg.MinBitPool = sbc_config.min_bitpool;
708 msg.MaxBitPool = sbc_config.max_bitpool;
711 msg.MinMtuSize = minmtu;
713 /* Update the media task to encode SBC properly */
714 btif_media_task_enc_update_req(&msg);
717 bool btif_a2dp_start_media_task(void)
719 if (media_task_running != MEDIA_TASK_STATE_OFF)
721 APPL_TRACE_ERROR("warning : media task already running");
725 APPL_TRACE_EVENT("## A2DP START MEDIA THREAD ##");
727 btif_media_cmd_msg_queue = fixed_queue_new(SIZE_MAX);
729 /* start a2dp media task */
730 worker_thread = thread_new("media_worker");
731 if (worker_thread == NULL)
734 fixed_queue_register_dequeue(btif_media_cmd_msg_queue,
735 thread_get_reactor(worker_thread),
736 btif_media_thread_handle_cmd,
739 thread_post(worker_thread, btif_media_thread_init, NULL);
741 APPL_TRACE_EVENT("## A2DP MEDIA THREAD STARTED ##");
746 APPL_TRACE_ERROR("%s unable to start up media thread", __func__);
750 void btif_a2dp_stop_media_task(void)
752 APPL_TRACE_EVENT("## A2DP STOP MEDIA THREAD ##");
755 alarm_free(btif_media_cb.media_alarm);
756 btif_media_cb.media_alarm = NULL;
757 btif_media_cb.is_tx_timer = FALSE;
760 fixed_queue_free(btif_media_cmd_msg_queue, NULL);
761 thread_post(worker_thread, btif_media_thread_cleanup, NULL);
762 thread_free(worker_thread);
764 worker_thread = NULL;
765 btif_media_cmd_msg_queue = NULL;
768 /*****************************************************************************
770 ** Function btif_a2dp_on_init
776 *******************************************************************************/
778 void btif_a2dp_on_init(void)
784 /*****************************************************************************
786 ** Function btif_a2dp_setup_codec
792 *******************************************************************************/
794 void btif_a2dp_setup_codec(void)
796 tBTIF_AV_MEDIA_FEEDINGS media_feeding;
799 APPL_TRACE_EVENT("## A2DP SETUP CODEC ##");
803 /* for now hardcode 44.1 khz 16 bit stereo PCM format */
804 media_feeding.cfg.pcm.sampling_freq = 44100;
805 media_feeding.cfg.pcm.bit_per_sample = 16;
806 media_feeding.cfg.pcm.num_channel = 2;
807 media_feeding.format = BTIF_AV_CODEC_PCM;
809 if (bta_av_co_audio_set_codec(&media_feeding, &status))
811 tBTIF_MEDIA_INIT_AUDIO_FEEDING mfeed;
813 /* Init the encoding task */
814 btif_a2dp_encoder_init();
816 /* Build the media task configuration */
817 mfeed.feeding = media_feeding;
818 mfeed.feeding_mode = BTIF_AV_FEEDING_ASYNCHRONOUS;
819 /* Send message to Media task to configure transcoding */
820 btif_media_task_audio_feeding_init_req(&mfeed);
827 /*****************************************************************************
829 ** Function btif_a2dp_on_idle
835 *******************************************************************************/
837 void btif_a2dp_on_idle(void)
839 APPL_TRACE_EVENT("## ON A2DP IDLE ##");
840 if (btif_media_cb.peer_sep == AVDT_TSEP_SNK)
842 /* Make sure media task is stopped */
843 btif_media_task_stop_aa_req();
847 #if (BTA_AV_SINK_INCLUDED == TRUE)
848 if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
850 btif_media_cb.rx_flush = TRUE;
851 btif_media_task_aa_rx_flush_req();
852 btif_media_task_aa_handle_stop_decoding();
853 btif_media_task_clear_track();
854 APPL_TRACE_DEBUG("Stopped BT track");
859 /*****************************************************************************
861 ** Function btif_a2dp_on_open
867 *******************************************************************************/
869 void btif_a2dp_on_open(void)
871 APPL_TRACE_EVENT("## ON A2DP OPEN ##");
873 /* always use callback to notify socket events */
874 UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
877 /*******************************************************************************
879 ** Function btif_media_task_clear_track
883 ** Returns TRUE is success
885 *******************************************************************************/
886 BOOLEAN btif_media_task_clear_track(void)
890 if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
895 p_buf->event = BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK;
897 fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
901 /*****************************************************************************
903 ** Function btif_reset_decoder
909 *******************************************************************************/
911 void btif_reset_decoder(UINT8 *p_av)
913 APPL_TRACE_EVENT("btif_reset_decoder");
914 APPL_TRACE_DEBUG("btif_reset_decoder p_codec_info[%x:%x:%x:%x:%x:%x]",
915 p_av[1], p_av[2], p_av[3],
916 p_av[4], p_av[5], p_av[6]);
918 tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf;
919 if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_SINK_CFG_UPDATE))))
921 APPL_TRACE_EVENT("btif_reset_decoder No Buffer ");
925 memcpy(p_buf->codec_info,p_av, AVDT_CODEC_SIZE);
926 p_buf->hdr.event = BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE;
928 fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
931 /*****************************************************************************
933 ** Function btif_a2dp_on_started
939 *******************************************************************************/
941 BOOLEAN btif_a2dp_on_started(tBTA_AV_START *p_av, BOOLEAN pending_start)
945 APPL_TRACE_EVENT("## ON A2DP STARTED ##");
949 /* ack back a local start request */
950 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
954 if (p_av->status == BTA_AV_SUCCESS)
956 if (p_av->suspending == FALSE)
961 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
967 /* we were remotely started, make sure codec
968 is setup before datapath is started */
969 btif_a2dp_setup_codec();
972 /* media task is autostarted upon a2dp audiopath connection */
975 else if (pending_start)
977 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
984 /*****************************************************************************
986 ** Function btif_a2dp_ack_fail
992 *******************************************************************************/
994 void btif_a2dp_ack_fail(void)
996 APPL_TRACE_EVENT("## A2DP_CTRL_ACK_FAILURE ##");
997 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
1000 /*****************************************************************************
1002 ** Function btif_a2dp_on_stopped
1008 *******************************************************************************/
1010 void btif_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av)
1012 APPL_TRACE_EVENT("## ON A2DP STOPPED ##");
1013 if (btif_media_cb.peer_sep == AVDT_TSEP_SRC) /* Handling for A2DP SINK cases*/
1015 btif_media_cb.rx_flush = TRUE;
1016 btif_media_task_aa_rx_flush_req();
1017 btif_media_task_aa_handle_stop_decoding();
1018 UIPC_Close(UIPC_CH_ID_AV_AUDIO);
1019 btif_media_cb.data_channel_open = FALSE;
1022 /* allow using this api for other than suspend */
1025 if (p_av->status != BTA_AV_SUCCESS)
1027 APPL_TRACE_EVENT("AV STOP FAILED (%d)", p_av->status);
1029 if (p_av->initiator)
1030 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
1035 /* ensure tx frames are immediately suspended */
1036 btif_media_cb.tx_flush = 1;
1038 /* request to stop media task */
1039 btif_media_task_aa_tx_flush_req();
1040 btif_media_task_stop_aa_req();
1042 /* once stream is fully stopped we will ack back */
1046 /*****************************************************************************
1048 ** Function btif_a2dp_on_suspended
1054 *******************************************************************************/
1056 void btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av)
1058 APPL_TRACE_EVENT("## ON A2DP SUSPENDED ##");
1059 if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
1061 btif_media_cb.rx_flush = TRUE;
1062 btif_media_task_aa_rx_flush_req();
1063 btif_media_task_aa_handle_stop_decoding();
1067 /* check for status failures */
1068 if (p_av->status != BTA_AV_SUCCESS)
1070 if (p_av->initiator == TRUE)
1071 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
1074 /* once stream is fully stopped we will ack back */
1076 /* ensure tx frames are immediately flushed */
1077 btif_media_cb.tx_flush = 1;
1079 /* stop timer tick */
1080 btif_media_task_stop_aa_req();
1083 /* when true media task discards any rx frames */
1084 void btif_a2dp_set_rx_flush(BOOLEAN enable)
1086 APPL_TRACE_EVENT("## DROP RX %d ##", enable);
1087 btif_media_cb.rx_flush = enable;
1090 /* when true media task discards any tx frames */
1091 void btif_a2dp_set_tx_flush(BOOLEAN enable)
1093 APPL_TRACE_EVENT("## DROP TX %d ##", enable);
1094 btif_media_cb.tx_flush = enable;
1097 #if (BTA_AV_SINK_INCLUDED == TRUE)
1098 static void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context)
1103 int num_frames_to_process;
1105 count = btif_media_cb.RxSbcQ._count;
1108 APPL_TRACE_DEBUG(" QUE EMPTY ");
1112 if (btif_media_cb.rx_flush == TRUE)
1114 btif_media_flush_q(&(btif_media_cb.RxSbcQ));
1118 num_frames_to_process = btif_media_cb.frames_to_process;
1119 APPL_TRACE_DEBUG(" Process Frames + ");
1123 p_msg = (tBT_SBC_HDR *)GKI_getfirst(&(btif_media_cb.RxSbcQ));
1126 num_sbc_frames = p_msg->num_frames_to_be_processed; /* num of frames in Que Packets */
1127 APPL_TRACE_DEBUG(" Frames left in topmost packet %d", num_sbc_frames);
1128 APPL_TRACE_DEBUG(" Remaining frames to process in tick %d", num_frames_to_process);
1129 APPL_TRACE_DEBUG(" Num of Packets in Que %d", btif_media_cb.RxSbcQ._count);
1131 if ( num_sbc_frames > num_frames_to_process) /* Que Packet has more frames*/
1133 p_msg->num_frames_to_be_processed= num_frames_to_process;
1134 btif_media_task_handle_inc_media(p_msg);
1135 p_msg->num_frames_to_be_processed = num_sbc_frames - num_frames_to_process;
1136 num_frames_to_process = 0;
1139 else /* Que packet has less frames */
1141 btif_media_task_handle_inc_media(p_msg);
1142 p_msg = (tBT_SBC_HDR *)GKI_dequeue(&(btif_media_cb.RxSbcQ));
1145 APPL_TRACE_ERROR("Insufficient data in que ");
1148 num_frames_to_process = num_frames_to_process - p_msg->num_frames_to_be_processed;
1151 }while(num_frames_to_process > 0);
1153 APPL_TRACE_DEBUG(" Process Frames - ");
1157 static void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context) {}
1160 static void btif_media_task_aa_handle_timer(UNUSED_ATTR void *context)
1162 log_tstamps_us("media task tx timer");
1164 #if (BTA_AV_INCLUDED == TRUE)
1165 if(btif_media_cb.is_tx_timer == TRUE)
1167 btif_media_send_aa_frame();
1171 APPL_TRACE_ERROR("ERROR Media task Scheduled after Suspend");
1176 #if (BTA_AV_INCLUDED == TRUE)
1177 static void btif_media_task_aa_handle_uipc_rx_rdy(void)
1179 /* process all the UIPC data */
1180 btif_media_aa_prep_2_send(0xFF);
1183 LOG_VERBOSE("btif_media_task_aa_handle_uipc_rx_rdy calls bta_av_ci_src_data_ready");
1184 bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO);
1188 static void btif_media_thread_init(UNUSED_ATTR void *context) {
1189 memset(&btif_media_cb, 0, sizeof(btif_media_cb));
1192 #if (BTA_AV_INCLUDED == TRUE)
1193 UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb);
1196 raise_priority_a2dp(TASK_HIGH_MEDIA);
1197 media_task_running = MEDIA_TASK_STATE_ON;
1200 static void btif_media_thread_cleanup(UNUSED_ATTR void *context) {
1201 /* make sure no channels are restarted while shutting down */
1202 media_task_running = MEDIA_TASK_STATE_SHUTTING_DOWN;
1204 /* this calls blocks until uipc is fully closed */
1205 UIPC_Close(UIPC_CH_ID_ALL);
1207 /* Clear media task flag */
1208 media_task_running = MEDIA_TASK_STATE_OFF;
1211 /*******************************************************************************
1213 ** Function btif_media_task_send_cmd_evt
1217 ** Returns TRUE is success
1219 *******************************************************************************/
1220 BOOLEAN btif_media_task_send_cmd_evt(UINT16 Evt)
1223 if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1230 fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
1234 /*******************************************************************************
1236 ** Function btif_media_flush_q
1242 *******************************************************************************/
1243 static void btif_media_flush_q(BUFFER_Q *p_q)
1245 while (!GKI_queue_is_empty(p_q))
1247 GKI_freebuf(GKI_dequeue(p_q));
1251 static void btif_media_thread_handle_cmd(fixed_queue_t *queue, UNUSED_ATTR void *context)
1253 BT_HDR *p_msg = (BT_HDR *)fixed_queue_dequeue(queue);
1254 LOG_VERBOSE("btif_media_thread_handle_cmd : %d %s", p_msg->event,
1255 dump_media_event(p_msg->event));
1257 switch (p_msg->event)
1259 #if (BTA_AV_INCLUDED == TRUE)
1260 case BTIF_MEDIA_START_AA_TX:
1261 btif_media_task_aa_start_tx();
1263 case BTIF_MEDIA_STOP_AA_TX:
1264 btif_media_task_aa_stop_tx();
1266 case BTIF_MEDIA_SBC_ENC_INIT:
1267 btif_media_task_enc_init(p_msg);
1269 case BTIF_MEDIA_SBC_ENC_UPDATE:
1270 btif_media_task_enc_update(p_msg);
1272 case BTIF_MEDIA_AUDIO_FEEDING_INIT:
1273 btif_media_task_audio_feeding_init(p_msg);
1275 case BTIF_MEDIA_FLUSH_AA_TX:
1276 btif_media_task_aa_tx_flush(p_msg);
1278 case BTIF_MEDIA_UIPC_RX_RDY:
1279 btif_media_task_aa_handle_uipc_rx_rdy();
1281 case BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE:
1282 #if (BTA_AV_SINK_INCLUDED == TRUE)
1283 btif_media_task_aa_handle_decoder_reset(p_msg);
1286 case BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK:
1287 #if (BTA_AV_SINK_INCLUDED == TRUE)
1288 btif_media_task_aa_handle_clear_track();
1291 case BTIF_MEDIA_FLUSH_AA_RX:
1292 btif_media_task_aa_rx_flush();
1296 APPL_TRACE_ERROR("ERROR in %s unknown event %d", __func__, p_msg->event);
1299 LOG_VERBOSE("%s: %s DONE", __func__, dump_media_event(p_msg->event));
1302 #if (BTA_AV_SINK_INCLUDED == TRUE)
1303 /*******************************************************************************
1305 ** Function btif_media_task_handle_inc_media
1311 *******************************************************************************/
1312 static void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg)
1314 UINT8 *sbc_start_frame = ((UINT8*)(p_msg + 1) + p_msg->offset + 1);
1316 UINT32 pcmBytes, availPcmBytes;
1317 OI_INT16 *pcmDataPointer = pcmData; /*Will be overwritten on next packet receipt*/
1319 int num_sbc_frames = p_msg->num_frames_to_be_processed;
1320 UINT32 sbc_frame_len = p_msg->len - 1;
1321 availPcmBytes = 2*sizeof(pcmData);
1323 if ((btif_media_cb.peer_sep == AVDT_TSEP_SNK) || (btif_media_cb.rx_flush))
1325 APPL_TRACE_DEBUG(" State Changed happened in this tick ");
1329 // ignore data if no one is listening
1330 if (!btif_media_cb.data_channel_open)
1333 APPL_TRACE_DEBUG("Number of sbc frames %d, frame_len %d", num_sbc_frames, sbc_frame_len);
1335 for(count = 0; count < num_sbc_frames && sbc_frame_len != 0; count ++)
1337 pcmBytes = availPcmBytes;
1338 status = OI_CODEC_SBC_DecodeFrame(&context, (const OI_BYTE**)&sbc_start_frame,
1339 (OI_UINT32 *)&sbc_frame_len,
1340 (OI_INT16 *)pcmDataPointer,
1341 (OI_UINT32 *)&pcmBytes);
1342 if (!OI_SUCCESS(status)) {
1343 APPL_TRACE_ERROR("Decoding failure: %d\n", status);
1346 availPcmBytes -= pcmBytes;
1347 pcmDataPointer += pcmBytes/2;
1348 p_msg->offset += (p_msg->len - 1) - sbc_frame_len;
1349 p_msg->len = sbc_frame_len + 1;
1352 UIPC_Send(UIPC_CH_ID_AV_AUDIO, 0, (UINT8 *)pcmData, (2*sizeof(pcmData) - availPcmBytes));
1356 #if (BTA_AV_INCLUDED == TRUE)
1357 /*******************************************************************************
1359 ** Function btif_media_task_enc_init_req
1363 ** Returns TRUE is success
1365 *******************************************************************************/
1366 BOOLEAN btif_media_task_enc_init_req(tBTIF_MEDIA_INIT_AUDIO *p_msg)
1368 tBTIF_MEDIA_INIT_AUDIO *p_buf;
1369 if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_INIT_AUDIO))))
1374 memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO));
1375 p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_INIT;
1377 fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
1381 /*******************************************************************************
1383 ** Function btif_media_task_enc_update_req
1387 ** Returns TRUE is success
1389 *******************************************************************************/
1390 BOOLEAN btif_media_task_enc_update_req(tBTIF_MEDIA_UPDATE_AUDIO *p_msg)
1392 tBTIF_MEDIA_UPDATE_AUDIO *p_buf;
1393 if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_UPDATE_AUDIO))))
1398 memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_UPDATE_AUDIO));
1399 p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_UPDATE;
1401 fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
1405 /*******************************************************************************
1407 ** Function btif_media_task_audio_feeding_init_req
1411 ** Returns TRUE is success
1413 *******************************************************************************/
1414 BOOLEAN btif_media_task_audio_feeding_init_req(tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_msg)
1416 tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_buf;
1417 if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING))))
1422 memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING));
1423 p_buf->hdr.event = BTIF_MEDIA_AUDIO_FEEDING_INIT;
1425 fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
1429 /*******************************************************************************
1431 ** Function btif_media_task_start_aa_req
1435 ** Returns TRUE is success
1437 *******************************************************************************/
1438 BOOLEAN btif_media_task_start_aa_req(void)
1441 if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1443 APPL_TRACE_EVENT("GKI failed");
1447 p_buf->event = BTIF_MEDIA_START_AA_TX;
1449 fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
1453 /*******************************************************************************
1455 ** Function btif_media_task_stop_aa_req
1459 ** Returns TRUE is success
1461 *******************************************************************************/
1462 BOOLEAN btif_media_task_stop_aa_req(void)
1465 if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1470 p_buf->event = BTIF_MEDIA_STOP_AA_TX;
1473 * Explicitly check whether the btif_media_cmd_msg_queue is not NULL to
1474 * avoid a race condition during shutdown of the Bluetooth stack.
1475 * This race condition is triggered when A2DP audio is streaming on
1477 * "btif_a2dp_on_stopped() -> btif_media_task_stop_aa_req()" is called
1478 * to stop the particular audio stream, and this happens right after
1479 * the "cleanup() -> btif_a2dp_stop_media_task()" processing during
1480 * the shutdown of the Bluetooth stack.
1482 if (btif_media_cmd_msg_queue != NULL)
1483 fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
1487 /*******************************************************************************
1489 ** Function btif_media_task_aa_rx_flush_req
1493 ** Returns TRUE is success
1495 *******************************************************************************/
1496 BOOLEAN btif_media_task_aa_rx_flush_req(void)
1500 if (GKI_queue_is_empty(&(btif_media_cb.RxSbcQ))== TRUE) /* Que is already empty */
1503 if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1508 p_buf->event = BTIF_MEDIA_FLUSH_AA_RX;
1510 fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
1514 /*******************************************************************************
1516 ** Function btif_media_task_aa_tx_flush_req
1520 ** Returns TRUE is success
1522 *******************************************************************************/
1523 BOOLEAN btif_media_task_aa_tx_flush_req(void)
1525 BT_HDR *p_buf = GKI_getbuf(sizeof(BT_HDR));
1530 p_buf->event = BTIF_MEDIA_FLUSH_AA_TX;
1533 * Explicitly check whether the btif_media_cmd_msg_queue is not NULL to
1534 * avoid a race condition during shutdown of the Bluetooth stack.
1535 * This race condition is triggered when A2DP audio is streaming on
1537 * "btif_a2dp_on_stopped() -> btif_media_task_aa_tx_flush_req()" is called
1538 * to stop the particular audio stream, and this happens right after
1539 * the "cleanup() -> btif_a2dp_stop_media_task()" processing during
1540 * the shutdown of the Bluetooth stack.
1542 if (btif_media_cmd_msg_queue != NULL)
1543 fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
1547 /*******************************************************************************
1549 ** Function btif_media_task_aa_rx_flush
1555 *******************************************************************************/
1556 static void btif_media_task_aa_rx_flush(void)
1558 /* Flush all enqueued GKI SBC buffers (encoded) */
1559 APPL_TRACE_DEBUG("btif_media_task_aa_rx_flush");
1561 btif_media_flush_q(&(btif_media_cb.RxSbcQ));
1565 /*******************************************************************************
1567 ** Function btif_media_task_aa_tx_flush
1573 *******************************************************************************/
1574 static void btif_media_task_aa_tx_flush(BT_HDR *p_msg)
1578 /* Flush all enqueued GKI music buffers (encoded) */
1579 APPL_TRACE_DEBUG("btif_media_task_aa_tx_flush");
1581 btif_media_cb.media_feeding_state.pcm.counter = 0;
1582 btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
1584 btif_media_flush_q(&(btif_media_cb.TxAaQ));
1586 UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REQ_RX_FLUSH, NULL);
1589 /*******************************************************************************
1591 ** Function btif_media_task_enc_init
1593 ** Description Initialize encoding task
1597 *******************************************************************************/
1598 static void btif_media_task_enc_init(BT_HDR *p_msg)
1600 tBTIF_MEDIA_INIT_AUDIO *pInitAudio = (tBTIF_MEDIA_INIT_AUDIO *) p_msg;
1602 APPL_TRACE_DEBUG("btif_media_task_enc_init");
1604 btif_media_cb.timestamp = 0;
1606 /* SBC encoder config (enforced even if not used) */
1607 btif_media_cb.encoder.s16ChannelMode = pInitAudio->ChannelMode;
1608 btif_media_cb.encoder.s16NumOfSubBands = pInitAudio->NumOfSubBands;
1609 btif_media_cb.encoder.s16NumOfBlocks = pInitAudio->NumOfBlocks;
1610 btif_media_cb.encoder.s16AllocationMethod = pInitAudio->AllocationMethod;
1611 btif_media_cb.encoder.s16SamplingFreq = pInitAudio->SamplingFreq;
1613 btif_media_cb.encoder.u16BitRate = btif_media_task_get_sbc_rate();
1615 /* Default transcoding is PCM to SBC, modified by feeding configuration */
1616 btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC;
1617 btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE-BTIF_MEDIA_AA_SBC_OFFSET-sizeof(BT_HDR))
1618 < pInitAudio->MtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET
1619 - sizeof(BT_HDR)) : pInitAudio->MtuSize;
1621 APPL_TRACE_EVENT("btif_media_task_enc_init busy %d, mtu %d, peer mtu %d",
1622 btif_media_cb.busy_level, btif_media_cb.TxAaMtuSize, pInitAudio->MtuSize);
1623 APPL_TRACE_EVENT(" ch mode %d, subnd %d, nb blk %d, alloc %d, rate %d, freq %d",
1624 btif_media_cb.encoder.s16ChannelMode, btif_media_cb.encoder.s16NumOfSubBands,
1625 btif_media_cb.encoder.s16NumOfBlocks,
1626 btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
1627 btif_media_cb.encoder.s16SamplingFreq);
1629 /* Reset entirely the SBC encoder */
1630 SBC_Encoder_Init(&(btif_media_cb.encoder));
1631 APPL_TRACE_DEBUG("btif_media_task_enc_init bit pool %d", btif_media_cb.encoder.s16BitPool);
1634 /*******************************************************************************
1636 ** Function btif_media_task_enc_update
1638 ** Description Update encoding task
1642 *******************************************************************************/
1644 static void btif_media_task_enc_update(BT_HDR *p_msg)
1646 tBTIF_MEDIA_UPDATE_AUDIO * pUpdateAudio = (tBTIF_MEDIA_UPDATE_AUDIO *) p_msg;
1647 SBC_ENC_PARAMS *pstrEncParams = &btif_media_cb.encoder;
1648 UINT16 s16SamplingFreq;
1649 SINT16 s16BitPool = 0;
1654 APPL_TRACE_DEBUG("btif_media_task_enc_update : minmtu %d, maxbp %d minbp %d",
1655 pUpdateAudio->MinMtuSize, pUpdateAudio->MaxBitPool, pUpdateAudio->MinBitPool);
1657 /* Only update the bitrate and MTU size while timer is running to make sure it has been initialized */
1658 //if (btif_media_cb.is_tx_timer)
1660 btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE -
1661 BTIF_MEDIA_AA_SBC_OFFSET - sizeof(BT_HDR))
1662 < pUpdateAudio->MinMtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET
1663 - sizeof(BT_HDR)) : pUpdateAudio->MinMtuSize;
1665 /* Set the initial target bit rate */
1666 pstrEncParams->u16BitRate = btif_media_task_get_sbc_rate();
1668 if (pstrEncParams->s16SamplingFreq == SBC_sf16000)
1669 s16SamplingFreq = 16000;
1670 else if (pstrEncParams->s16SamplingFreq == SBC_sf32000)
1671 s16SamplingFreq = 32000;
1672 else if (pstrEncParams->s16SamplingFreq == SBC_sf44100)
1673 s16SamplingFreq = 44100;
1675 s16SamplingFreq = 48000;
1679 if (pstrEncParams->s16NumOfBlocks == 0 || pstrEncParams->s16NumOfSubBands == 0
1680 || pstrEncParams->s16NumOfChannels == 0)
1682 APPL_TRACE_ERROR("btif_media_task_enc_update() - Avoiding division by zero...");
1683 APPL_TRACE_ERROR("btif_media_task_enc_update() - block=%d, subBands=%d, channels=%d",
1684 pstrEncParams->s16NumOfBlocks, pstrEncParams->s16NumOfSubBands,
1685 pstrEncParams->s16NumOfChannels);
1689 if ((pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) ||
1690 (pstrEncParams->s16ChannelMode == SBC_STEREO) )
1692 s16BitPool = (SINT16)( (pstrEncParams->u16BitRate *
1693 pstrEncParams->s16NumOfSubBands * 1000 / s16SamplingFreq)
1694 -( (32 + (4 * pstrEncParams->s16NumOfSubBands *
1695 pstrEncParams->s16NumOfChannels)
1696 + ( (pstrEncParams->s16ChannelMode - 2) *
1697 pstrEncParams->s16NumOfSubBands ) )
1698 / pstrEncParams->s16NumOfBlocks) );
1700 s16FrameLen = 4 + (4*pstrEncParams->s16NumOfSubBands*
1701 pstrEncParams->s16NumOfChannels)/8
1702 + ( ((pstrEncParams->s16ChannelMode - 2) *
1703 pstrEncParams->s16NumOfSubBands)
1704 + (pstrEncParams->s16NumOfBlocks * s16BitPool) ) / 8;
1706 s16BitRate = (8 * s16FrameLen * s16SamplingFreq)
1707 / (pstrEncParams->s16NumOfSubBands *
1708 pstrEncParams->s16NumOfBlocks * 1000);
1710 if (s16BitRate > pstrEncParams->u16BitRate)
1713 if(pstrEncParams->s16NumOfSubBands == 8)
1714 s16BitPool = (s16BitPool > 255) ? 255 : s16BitPool;
1716 s16BitPool = (s16BitPool > 128) ? 128 : s16BitPool;
1720 s16BitPool = (SINT16)( ((pstrEncParams->s16NumOfSubBands *
1721 pstrEncParams->u16BitRate * 1000)
1722 / (s16SamplingFreq * pstrEncParams->s16NumOfChannels))
1723 -( ( (32 / pstrEncParams->s16NumOfChannels) +
1724 (4 * pstrEncParams->s16NumOfSubBands) )
1725 / pstrEncParams->s16NumOfBlocks ) );
1727 pstrEncParams->s16BitPool = (s16BitPool >
1728 (16 * pstrEncParams->s16NumOfSubBands))
1729 ? (16*pstrEncParams->s16NumOfSubBands) : s16BitPool;
1737 APPL_TRACE_EVENT("bitpool candidate : %d (%d kbps)",
1738 s16BitPool, pstrEncParams->u16BitRate);
1740 if (s16BitPool > pUpdateAudio->MaxBitPool)
1742 APPL_TRACE_DEBUG("btif_media_task_enc_update computed bitpool too large (%d)",
1744 /* Decrease bitrate */
1745 btif_media_cb.encoder.u16BitRate -= BTIF_MEDIA_BITRATE_STEP;
1746 /* Record that we have decreased the bitrate */
1749 else if (s16BitPool < pUpdateAudio->MinBitPool)
1751 APPL_TRACE_WARNING("btif_media_task_enc_update computed bitpool too small (%d)", s16BitPool);
1753 /* Increase bitrate */
1754 UINT16 previous_u16BitRate = btif_media_cb.encoder.u16BitRate;
1755 btif_media_cb.encoder.u16BitRate += BTIF_MEDIA_BITRATE_STEP;
1756 /* Record that we have increased the bitrate */
1758 /* Check over-flow */
1759 if (btif_media_cb.encoder.u16BitRate < previous_u16BitRate)
1766 /* In case we have already increased and decreased the bitrate, just stop */
1769 APPL_TRACE_ERROR("btif_media_task_enc_update could not find bitpool in range");
1774 /* Finally update the bitpool in the encoder structure */
1775 pstrEncParams->s16BitPool = s16BitPool;
1777 APPL_TRACE_DEBUG("btif_media_task_enc_update final bit rate %d, final bit pool %d",
1778 btif_media_cb.encoder.u16BitRate, btif_media_cb.encoder.s16BitPool);
1780 /* make sure we reinitialize encoder with new settings */
1781 SBC_Encoder_Init(&(btif_media_cb.encoder));
1785 /*******************************************************************************
1787 ** Function btif_media_task_pcm2sbc_init
1789 ** Description Init encoding task for PCM to SBC according to feeding
1793 *******************************************************************************/
1794 static void btif_media_task_pcm2sbc_init(tBTIF_MEDIA_INIT_AUDIO_FEEDING * p_feeding)
1796 BOOLEAN reconfig_needed = FALSE;
1798 APPL_TRACE_DEBUG("PCM feeding:");
1799 APPL_TRACE_DEBUG("sampling_freq:%d", p_feeding->feeding.cfg.pcm.sampling_freq);
1800 APPL_TRACE_DEBUG("num_channel:%d", p_feeding->feeding.cfg.pcm.num_channel);
1801 APPL_TRACE_DEBUG("bit_per_sample:%d", p_feeding->feeding.cfg.pcm.bit_per_sample);
1803 /* Check the PCM feeding sampling_freq */
1804 switch (p_feeding->feeding.cfg.pcm.sampling_freq)
1812 /* For these sampling_freq the AV connection must be 48000 */
1813 if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf48000)
1815 /* Reconfiguration needed at 48000 */
1816 APPL_TRACE_DEBUG("SBC Reconfiguration needed at 48000");
1817 btif_media_cb.encoder.s16SamplingFreq = SBC_sf48000;
1818 reconfig_needed = TRUE;
1825 /* For these sampling_freq the AV connection must be 44100 */
1826 if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf44100)
1828 /* Reconfiguration needed at 44100 */
1829 APPL_TRACE_DEBUG("SBC Reconfiguration needed at 44100");
1830 btif_media_cb.encoder.s16SamplingFreq = SBC_sf44100;
1831 reconfig_needed = TRUE;
1835 APPL_TRACE_DEBUG("Feeding PCM sampling_freq unsupported");
1839 /* Some AV Headsets do not support Mono => always ask for Stereo */
1840 if (btif_media_cb.encoder.s16ChannelMode == SBC_MONO)
1842 APPL_TRACE_DEBUG("SBC Reconfiguration needed in Stereo");
1843 btif_media_cb.encoder.s16ChannelMode = SBC_JOINT_STEREO;
1844 reconfig_needed = TRUE;
1847 if (reconfig_needed != FALSE)
1849 APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init :: mtu %d", btif_media_cb.TxAaMtuSize);
1850 APPL_TRACE_DEBUG("ch mode %d, nbsubd %d, nb %d, alloc %d, rate %d, freq %d",
1851 btif_media_cb.encoder.s16ChannelMode,
1852 btif_media_cb.encoder.s16NumOfSubBands, btif_media_cb.encoder.s16NumOfBlocks,
1853 btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
1854 btif_media_cb.encoder.s16SamplingFreq);
1856 SBC_Encoder_Init(&(btif_media_cb.encoder));
1860 APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init no SBC reconfig needed");
1865 /*******************************************************************************
1867 ** Function btif_media_task_audio_feeding_init
1869 ** Description Initialize the audio path according to the feeding format
1873 *******************************************************************************/
1874 static void btif_media_task_audio_feeding_init(BT_HDR *p_msg)
1876 tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_feeding = (tBTIF_MEDIA_INIT_AUDIO_FEEDING *) p_msg;
1878 APPL_TRACE_DEBUG("btif_media_task_audio_feeding_init format:%d", p_feeding->feeding.format);
1880 /* Save Media Feeding information */
1881 btif_media_cb.feeding_mode = p_feeding->feeding_mode;
1882 btif_media_cb.media_feeding = p_feeding->feeding;
1884 /* Handle different feeding formats */
1885 switch (p_feeding->feeding.format)
1887 case BTIF_AV_CODEC_PCM:
1888 btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC;
1889 btif_media_task_pcm2sbc_init(p_feeding);
1893 APPL_TRACE_ERROR("unknown feeding format %d", p_feeding->feeding.format);
1898 int btif_a2dp_get_track_frequency(UINT8 frequency) {
1900 switch (frequency) {
1901 case A2D_SBC_IE_SAMP_FREQ_16:
1904 case A2D_SBC_IE_SAMP_FREQ_32:
1907 case A2D_SBC_IE_SAMP_FREQ_44:
1910 case A2D_SBC_IE_SAMP_FREQ_48:
1917 int btif_a2dp_get_track_channel_count(UINT8 channeltype) {
1919 switch (channeltype) {
1920 case A2D_SBC_IE_CH_MD_MONO:
1923 case A2D_SBC_IE_CH_MD_DUAL:
1924 case A2D_SBC_IE_CH_MD_STEREO:
1925 case A2D_SBC_IE_CH_MD_JOINT:
1932 void btif_a2dp_set_peer_sep(UINT8 sep) {
1933 btif_media_cb.peer_sep = sep;
1936 static void btif_decode_alarm_cb(UNUSED_ATTR void *context) {
1937 thread_post(worker_thread, btif_media_task_avk_handle_timer, NULL);
1940 static void btif_media_task_aa_handle_stop_decoding(void) {
1941 alarm_free(btif_media_cb.decode_alarm);
1942 btif_media_cb.decode_alarm = NULL;
1945 static void btif_media_task_aa_handle_start_decoding(void) {
1946 if (btif_media_cb.decode_alarm)
1949 btif_media_cb.decode_alarm = alarm_new();
1950 if (!btif_media_cb.decode_alarm) {
1951 LOG_ERROR("%s unable to allocate decode alarm.", __func__);
1955 alarm_set_periodic(btif_media_cb.decode_alarm, BTIF_SINK_MEDIA_TIME_TICK, btif_decode_alarm_cb, NULL);
1958 #if (BTA_AV_SINK_INCLUDED == TRUE)
1960 static void btif_media_task_aa_handle_clear_track (void)
1962 APPL_TRACE_DEBUG("btif_media_task_aa_handle_clear_track");
1965 /*******************************************************************************
1967 ** Function btif_media_task_aa_handle_decoder_reset
1973 *******************************************************************************/
1974 static void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg)
1976 tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf = (tBTIF_MEDIA_SINK_CFG_UPDATE*) p_msg;
1977 tA2D_STATUS a2d_status;
1978 tA2D_SBC_CIE sbc_cie;
1980 UINT32 freq_multiple = 48*20; /* frequency multiple for 20ms of data , initialize with 48K*/
1981 UINT32 num_blocks = 16;
1982 UINT32 num_subbands = 8;
1984 APPL_TRACE_DEBUG("btif_media_task_aa_handle_decoder_reset p_codec_info[%x:%x:%x:%x:%x:%x]",
1985 p_buf->codec_info[1], p_buf->codec_info[2], p_buf->codec_info[3],
1986 p_buf->codec_info[4], p_buf->codec_info[5], p_buf->codec_info[6]);
1988 a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_buf->codec_info, FALSE);
1989 if (a2d_status != A2D_SUCCESS)
1991 APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
1995 btif_media_cb.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq);
1996 btif_media_cb.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode);
1998 btif_media_cb.rx_flush = FALSE;
1999 APPL_TRACE_DEBUG("Reset to sink role");
2000 status = OI_CODEC_SBC_DecoderReset(&context, contextData, sizeof(contextData), 2, 2, FALSE);
2001 if (!OI_SUCCESS(status)) {
2002 APPL_TRACE_ERROR("OI_CODEC_SBC_DecoderReset failed with error code %d\n", status);
2005 UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
2007 switch(sbc_cie.samp_freq)
2009 case A2D_SBC_IE_SAMP_FREQ_16:
2010 APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);
2011 freq_multiple = 16*20;
2013 case A2D_SBC_IE_SAMP_FREQ_32:
2014 APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);
2015 freq_multiple = 32*20;
2017 case A2D_SBC_IE_SAMP_FREQ_44:
2018 APPL_TRACE_DEBUG("\tsamp_freq:%d (44100)", sbc_cie.samp_freq);
2019 freq_multiple = 441*2;
2021 case A2D_SBC_IE_SAMP_FREQ_48:
2022 APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);
2023 freq_multiple = 48*20;
2026 APPL_TRACE_DEBUG(" Unknown Frequency ");
2030 switch(sbc_cie.ch_mode)
2032 case A2D_SBC_IE_CH_MD_MONO:
2033 APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);
2035 case A2D_SBC_IE_CH_MD_DUAL:
2036 APPL_TRACE_DEBUG("\tch_mode:%d (DUAL)", sbc_cie.ch_mode);
2038 case A2D_SBC_IE_CH_MD_STEREO:
2039 APPL_TRACE_DEBUG("\tch_mode:%d (STEREO)", sbc_cie.ch_mode);
2041 case A2D_SBC_IE_CH_MD_JOINT:
2042 APPL_TRACE_DEBUG("\tch_mode:%d (JOINT)", sbc_cie.ch_mode);
2045 APPL_TRACE_DEBUG(" Unknown Mode ");
2049 switch(sbc_cie.block_len)
2051 case A2D_SBC_IE_BLOCKS_4:
2052 APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);
2055 case A2D_SBC_IE_BLOCKS_8:
2056 APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);
2059 case A2D_SBC_IE_BLOCKS_12:
2060 APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);
2063 case A2D_SBC_IE_BLOCKS_16:
2064 APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);
2068 APPL_TRACE_DEBUG(" Unknown BlockLen ");
2072 switch(sbc_cie.num_subbands)
2074 case A2D_SBC_IE_SUBBAND_4:
2075 APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);
2078 case A2D_SBC_IE_SUBBAND_8:
2079 APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);
2083 APPL_TRACE_DEBUG(" Unknown SubBands ");
2087 switch(sbc_cie.alloc_mthd)
2089 case A2D_SBC_IE_ALLOC_MD_S:
2090 APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);
2092 case A2D_SBC_IE_ALLOC_MD_L:
2093 APPL_TRACE_DEBUG("\talloc_mthd:%d (Loudness)", sbc_cie.alloc_mthd);
2096 APPL_TRACE_DEBUG(" Unknown Allocation Method");
2100 APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
2102 btif_media_cb.frames_to_process = ((freq_multiple)/(num_blocks*num_subbands)) + 1;
2103 APPL_TRACE_DEBUG(" Frames to be processed in 20 ms %d",btif_media_cb.frames_to_process);
2107 /*******************************************************************************
2109 ** Function btif_media_task_feeding_state_reset
2111 ** Description Reset the media feeding state
2115 *******************************************************************************/
2116 static void btif_media_task_feeding_state_reset(void)
2118 /* By default, just clear the entire state */
2119 memset(&btif_media_cb.media_feeding_state, 0, sizeof(btif_media_cb.media_feeding_state));
2121 if (btif_media_cb.TxTranscoding == BTIF_MEDIA_TRSCD_PCM_2_SBC)
2123 btif_media_cb.media_feeding_state.pcm.bytes_per_tick =
2124 (btif_media_cb.media_feeding.cfg.pcm.sampling_freq *
2125 btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8 *
2126 btif_media_cb.media_feeding.cfg.pcm.num_channel *
2127 BTIF_MEDIA_TIME_TICK)/1000;
2129 APPL_TRACE_WARNING("pcm bytes per tick %d",
2130 (int)btif_media_cb.media_feeding_state.pcm.bytes_per_tick);
2134 static void btif_media_task_alarm_cb(UNUSED_ATTR void *context) {
2135 thread_post(worker_thread, btif_media_task_aa_handle_timer, NULL);
2138 /*******************************************************************************
2140 ** Function btif_media_task_aa_start_tx
2142 ** Description Start media task encoding
2146 *******************************************************************************/
2147 static void btif_media_task_aa_start_tx(void)
2149 APPL_TRACE_DEBUG("btif_media_task_aa_start_tx is timer %d, feeding mode %d",
2150 btif_media_cb.is_tx_timer, btif_media_cb.feeding_mode);
2152 /* Use a timer to poll the UIPC, get rid of the UIPC call back */
2153 // UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_CBACK, NULL);
2155 btif_media_cb.is_tx_timer = TRUE;
2158 /* Reset the media feeding state */
2159 btif_media_task_feeding_state_reset();
2161 APPL_TRACE_EVENT("starting timer %dms", BTIF_MEDIA_TIME_TICK);
2163 assert(btif_media_cb.media_alarm == NULL);
2165 btif_media_cb.media_alarm = alarm_new();
2166 if (!btif_media_cb.media_alarm) {
2167 LOG_ERROR("%s unable to allocate media alarm.", __func__);
2171 alarm_set_periodic(btif_media_cb.media_alarm, BTIF_MEDIA_TIME_TICK, btif_media_task_alarm_cb, NULL);
2174 /*******************************************************************************
2176 ** Function btif_media_task_aa_stop_tx
2178 ** Description Stop media task encoding
2182 *******************************************************************************/
2183 static void btif_media_task_aa_stop_tx(void)
2185 APPL_TRACE_DEBUG("%s is_tx_timer: %d", __func__, btif_media_cb.is_tx_timer);
2187 const bool send_ack = (btif_media_cb.is_tx_timer != FALSE);
2189 /* Stop the timer first */
2190 alarm_free(btif_media_cb.media_alarm);
2191 btif_media_cb.media_alarm = NULL;
2192 btif_media_cb.is_tx_timer = FALSE;
2194 UIPC_Close(UIPC_CH_ID_AV_AUDIO);
2196 /* Try to send acknowldegment once the media stream is
2197 stopped. This will make sure that the A2DP HAL layer is
2198 un-blocked on wait for acknowledgment for the sent command.
2199 This resolves a corner cases AVDTP SUSPEND collision
2200 when the DUT and the remote device issue SUSPEND simultaneously
2201 and due to the processing of the SUSPEND request from the remote,
2202 the media path is torn down. If the A2DP HAL happens to wait
2203 for ACK for the initiated SUSPEND, it would never receive it casuing
2204 a block/wait. Due to this acknowledgement, the A2DP HAL is guranteed
2205 to get the ACK for any pending command in such cases. */
2208 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
2210 /* audio engine stopped, reset tx suspended flag */
2211 btif_media_cb.tx_flush = 0;
2214 /* Reset the media feeding state */
2215 btif_media_task_feeding_state_reset();
2218 /*******************************************************************************
2220 ** Function btif_get_num_aa_frame
2224 ** Returns The number of media frames in this time slice
2226 *******************************************************************************/
2227 static UINT8 btif_get_num_aa_frame(void)
2231 switch (btif_media_cb.TxTranscoding)
2233 case BTIF_MEDIA_TRSCD_PCM_2_SBC:
2235 UINT32 pcm_bytes_per_frame = btif_media_cb.encoder.s16NumOfSubBands *
2236 btif_media_cb.encoder.s16NumOfBlocks *
2237 btif_media_cb.media_feeding.cfg.pcm.num_channel *
2238 btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
2240 UINT32 us_this_tick = BTIF_MEDIA_TIME_TICK * 1000;
2241 UINT64 now_us = time_now_us();
2242 if (last_frame_us != 0)
2243 us_this_tick = (now_us - last_frame_us);
2244 last_frame_us = now_us;
2246 btif_media_cb.media_feeding_state.pcm.counter +=
2247 btif_media_cb.media_feeding_state.pcm.bytes_per_tick *
2248 us_this_tick / (BTIF_MEDIA_TIME_TICK * 1000);
2250 /* calculate nbr of frames pending for this media tick */
2251 result = btif_media_cb.media_feeding_state.pcm.counter/pcm_bytes_per_frame;
2252 if (result > MAX_PCM_FRAME_NUM_PER_TICK)
2254 APPL_TRACE_WARNING("%s() - Limiting frames to be sent from %d to %d"
2255 , __FUNCTION__, result, MAX_PCM_FRAME_NUM_PER_TICK);
2256 result = MAX_PCM_FRAME_NUM_PER_TICK;
2258 btif_media_cb.media_feeding_state.pcm.counter -= result*pcm_bytes_per_frame;
2260 LOG_VERBOSE("WRITE %d FRAMES", result);
2265 APPL_TRACE_ERROR("ERROR btif_get_num_aa_frame Unsupported transcoding format 0x%x",
2266 btif_media_cb.TxTranscoding);
2271 return (UINT8)result;
2274 /*******************************************************************************
2276 ** Function btif_media_sink_enque_buf
2278 ** Description This function is called by the av_co to fill A2DP Sink Queue
2281 ** Returns size of the queue
2282 *******************************************************************************/
2283 UINT8 btif_media_sink_enque_buf(BT_HDR *p_pkt)
2287 if(btif_media_cb.rx_flush == TRUE) /* Flush enabled, do not enque*/
2288 return GKI_queue_length(&btif_media_cb.RxSbcQ);
2289 if(GKI_queue_length(&btif_media_cb.RxSbcQ) == MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ)
2291 GKI_freebuf(GKI_dequeue(&(btif_media_cb.RxSbcQ)));
2294 BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + ");
2295 /* allocate and Queue this buffer */
2296 if ((p_msg = (tBT_SBC_HDR *) GKI_getbuf(sizeof(tBT_SBC_HDR) +
2297 p_pkt->offset+ p_pkt->len)) != NULL)
2299 memcpy(p_msg, p_pkt, (sizeof(BT_HDR) + p_pkt->offset + p_pkt->len));
2300 p_msg->num_frames_to_be_processed = (*((UINT8*)(p_msg + 1) + p_msg->offset)) & 0x0f;
2301 BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + ", p_msg->num_frames_to_be_processed);
2302 GKI_enqueue(&(btif_media_cb.RxSbcQ), p_msg);
2303 if(GKI_queue_length(&btif_media_cb.RxSbcQ) == MAX_A2DP_DELAYED_START_FRAME_COUNT)
2305 BTIF_TRACE_DEBUG(" Initiate Decoding ");
2306 btif_media_task_aa_handle_start_decoding();
2311 /* let caller deal with a failed allocation */
2312 BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf No Buffer left - ");
2314 return GKI_queue_length(&btif_media_cb.RxSbcQ);
2317 /*******************************************************************************
2319 ** Function btif_media_aa_readbuf
2321 ** Description This function is called by the av_co to get the next buffer to send
2325 *******************************************************************************/
2326 BT_HDR *btif_media_aa_readbuf(void)
2328 return GKI_dequeue(&(btif_media_cb.TxAaQ));
2331 /*******************************************************************************
2333 ** Function btif_media_aa_read_feeding
2339 *******************************************************************************/
2341 BOOLEAN btif_media_aa_read_feeding(tUIPC_CH_ID channel_id)
2344 UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands * \
2345 btif_media_cb.encoder.s16NumOfBlocks;
2347 UINT16 sbc_sampling = 48000;
2349 UINT16 bytes_needed = blocm_x_subband * btif_media_cb.encoder.s16NumOfChannels * \
2350 btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
2351 static UINT16 up_sampled_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS
2352 * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS * 2];
2353 static UINT16 read_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS
2354 * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS];
2355 UINT32 src_size_used;
2356 UINT32 dst_size_used;
2357 BOOLEAN fract_needed;
2359 INT32 fract_threshold;
2360 UINT32 nb_byte_read;
2362 /* Get the SBC sampling rate */
2363 switch (btif_media_cb.encoder.s16SamplingFreq)
2366 sbc_sampling = 48000;
2369 sbc_sampling = 44100;
2372 sbc_sampling = 32000;
2375 sbc_sampling = 16000;
2379 if (sbc_sampling == btif_media_cb.media_feeding.cfg.pcm.sampling_freq) {
2380 read_size = bytes_needed - btif_media_cb.media_feeding_state.pcm.aa_feed_residue;
2381 nb_byte_read = UIPC_Read(channel_id, &event,
2382 ((UINT8 *)btif_media_cb.encoder.as16PcmBuffer) +
2383 btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
2385 if (nb_byte_read == read_size) {
2386 btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
2389 APPL_TRACE_WARNING("### UNDERFLOW :: ONLY READ %d BYTES OUT OF %d ###",
2390 nb_byte_read, read_size);
2391 btif_media_cb.media_feeding_state.pcm.aa_feed_residue += nb_byte_read;
2396 /* Some Feeding PCM frequencies require to split the number of sample */
2398 /* E.g 128/6=21.3333 => read 22 and 21 and 21 => max = 2; threshold = 0*/
2399 fract_needed = FALSE; /* Default */
2400 switch (btif_media_cb.media_feeding.cfg.pcm.sampling_freq)
2404 fract_needed = TRUE;
2405 fract_max = 2; /* 0, 1 and 2 */
2406 fract_threshold = 0; /* Add one for the first */
2409 fract_needed = TRUE;
2410 fract_max = 2; /* 0, 1 and 2 */
2411 fract_threshold = 1; /* Add one for the first two frames*/
2415 /* Compute number of sample to read from source */
2416 src_samples = blocm_x_subband;
2417 src_samples *= btif_media_cb.media_feeding.cfg.pcm.sampling_freq;
2418 src_samples /= sbc_sampling;
2420 /* The previous division may have a remainder not null */
2423 if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter <= fract_threshold)
2425 src_samples++; /* for every read before threshold add one sample */
2428 /* do nothing if counter >= threshold */
2429 btif_media_cb.media_feeding_state.pcm.aa_feed_counter++; /* one more read */
2430 if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter > fract_max)
2432 btif_media_cb.media_feeding_state.pcm.aa_feed_counter = 0;
2436 /* Compute number of bytes to read from source */
2437 read_size = src_samples;
2438 read_size *= btif_media_cb.media_feeding.cfg.pcm.num_channel;
2439 read_size *= (btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8);
2441 /* Read Data from UIPC channel */
2442 nb_byte_read = UIPC_Read(channel_id, &event, (UINT8 *)read_buffer, read_size);
2444 //tput_mon(TRUE, nb_byte_read, FALSE);
2446 if (nb_byte_read < read_size)
2448 APPL_TRACE_WARNING("### UNDERRUN :: ONLY READ %d BYTES OUT OF %d ###",
2449 nb_byte_read, read_size);
2451 if (nb_byte_read == 0)
2454 if(btif_media_cb.feeding_mode == BTIF_AV_FEEDING_ASYNCHRONOUS)
2456 /* Fill the unfilled part of the read buffer with silence (0) */
2457 memset(((UINT8 *)read_buffer) + nb_byte_read, 0, read_size - nb_byte_read);
2458 nb_byte_read = read_size;
2462 /* Initialize PCM up-sampling engine */
2463 bta_av_sbc_init_up_sample(btif_media_cb.media_feeding.cfg.pcm.sampling_freq,
2464 sbc_sampling, btif_media_cb.media_feeding.cfg.pcm.bit_per_sample,
2465 btif_media_cb.media_feeding.cfg.pcm.num_channel);
2467 /* re-sample read buffer */
2468 /* The output PCM buffer will be stereo, 16 bit per sample */
2469 dst_size_used = bta_av_sbc_up_sample((UINT8 *)read_buffer,
2470 (UINT8 *)up_sampled_buffer + btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
2472 sizeof(up_sampled_buffer) - btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
2475 /* update the residue */
2476 btif_media_cb.media_feeding_state.pcm.aa_feed_residue += dst_size_used;
2478 /* only copy the pcm sample when we have up-sampled enough PCM */
2479 if(btif_media_cb.media_feeding_state.pcm.aa_feed_residue >= bytes_needed)
2481 /* Copy the output pcm samples in SBC encoding buffer */
2482 memcpy((UINT8 *)btif_media_cb.encoder.as16PcmBuffer,
2483 (UINT8 *)up_sampled_buffer,
2485 /* update the residue */
2486 btif_media_cb.media_feeding_state.pcm.aa_feed_residue -= bytes_needed;
2488 if (btif_media_cb.media_feeding_state.pcm.aa_feed_residue != 0)
2490 memcpy((UINT8 *)up_sampled_buffer,
2491 (UINT8 *)up_sampled_buffer + bytes_needed,
2492 btif_media_cb.media_feeding_state.pcm.aa_feed_residue);
2500 /*******************************************************************************
2502 ** Function btif_media_aa_prep_sbc_2_send
2508 *******************************************************************************/
2509 static void btif_media_aa_prep_sbc_2_send(UINT8 nb_frame)
2512 UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands *
2513 btif_media_cb.encoder.s16NumOfBlocks;
2517 if (NULL == (p_buf = GKI_getpoolbuf(BTIF_MEDIA_AA_POOL_ID)))
2519 APPL_TRACE_ERROR ("ERROR btif_media_aa_prep_sbc_2_send no buffer TxCnt %d ",
2520 GKI_queue_length(&btif_media_cb.TxAaQ));
2525 p_buf->offset = BTIF_MEDIA_AA_SBC_OFFSET;
2527 p_buf->layer_specific = 0;
2531 /* Write @ of allocated buffer in encoder.pu8Packet */
2532 btif_media_cb.encoder.pu8Packet = (UINT8 *) (p_buf + 1) + p_buf->offset + p_buf->len;
2533 /* Fill allocated buffer with 0 */
2534 memset(btif_media_cb.encoder.as16PcmBuffer, 0, blocm_x_subband
2535 * btif_media_cb.encoder.s16NumOfChannels);
2537 /* Read PCM data and upsample them if needed */
2538 if (btif_media_aa_read_feeding(UIPC_CH_ID_AV_AUDIO))
2540 /* SBC encode and descramble frame */
2541 SBC_Encoder(&(btif_media_cb.encoder));
2542 A2D_SbcChkFrInit(btif_media_cb.encoder.pu8Packet);
2543 A2D_SbcDescramble(btif_media_cb.encoder.pu8Packet, btif_media_cb.encoder.u16PacketLength);
2544 /* Update SBC frame length */
2545 p_buf->len += btif_media_cb.encoder.u16PacketLength;
2547 p_buf->layer_specific++;
2551 APPL_TRACE_WARNING("btif_media_aa_prep_sbc_2_send underflow %d, %d",
2552 nb_frame, btif_media_cb.media_feeding_state.pcm.aa_feed_residue);
2553 btif_media_cb.media_feeding_state.pcm.counter += nb_frame *
2554 btif_media_cb.encoder.s16NumOfSubBands *
2555 btif_media_cb.encoder.s16NumOfBlocks *
2556 btif_media_cb.media_feeding.cfg.pcm.num_channel *
2557 btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
2558 /* no more pcm to read */
2561 /* break read loop if timer was stopped (media task stopped) */
2562 if ( btif_media_cb.is_tx_timer == FALSE )
2569 } while (((p_buf->len + btif_media_cb.encoder.u16PacketLength) < btif_media_cb.TxAaMtuSize)
2570 && (p_buf->layer_specific < 0x0F) && nb_frame);
2574 /* timestamp of the media packet header represent the TS of the first SBC frame
2575 i.e the timestamp before including this frame */
2576 *((UINT32 *) (p_buf + 1)) = btif_media_cb.timestamp;
2578 btif_media_cb.timestamp += p_buf->layer_specific * blocm_x_subband;
2580 if (btif_media_cb.tx_flush)
2582 APPL_TRACE_DEBUG("### tx suspended, discarded frame ###");
2584 if (GKI_queue_length(&btif_media_cb.TxAaQ) > 0)
2585 btif_media_flush_q(&(btif_media_cb.TxAaQ));
2591 /* Enqueue the encoded SBC frame in AA Tx Queue */
2592 GKI_enqueue(&(btif_media_cb.TxAaQ), p_buf);
2602 /*******************************************************************************
2604 ** Function btif_media_aa_prep_2_send
2610 *******************************************************************************/
2612 static void btif_media_aa_prep_2_send(UINT8 nb_frame)
2614 // Check for TX queue overflow
2616 if (nb_frame > MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ)
2617 nb_frame = MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ;
2619 if (GKI_queue_length(&btif_media_cb.TxAaQ) > (MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ - nb_frame))
2621 APPL_TRACE_WARNING("%s() - TX queue buffer count %d/%d", __func__,
2622 GKI_queue_length(&btif_media_cb.TxAaQ), MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ - nb_frame);
2625 while (GKI_queue_length(&btif_media_cb.TxAaQ) > (MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ - nb_frame))
2626 GKI_freebuf(GKI_dequeue(&(btif_media_cb.TxAaQ)));
2630 switch (btif_media_cb.TxTranscoding)
2632 case BTIF_MEDIA_TRSCD_PCM_2_SBC:
2633 btif_media_aa_prep_sbc_2_send(nb_frame);
2637 APPL_TRACE_ERROR("%s unsupported transcoding format 0x%x", __func__, btif_media_cb.TxTranscoding);
2642 /*******************************************************************************
2644 ** Function btif_media_send_aa_frame
2650 *******************************************************************************/
2651 static void btif_media_send_aa_frame(void)
2653 UINT8 nb_frame_2_send;
2655 /* get the number of frame to send */
2656 nb_frame_2_send = btif_get_num_aa_frame();
2658 if (nb_frame_2_send != 0)
2660 /* format and Q buffer to send */
2661 btif_media_aa_prep_2_send(nb_frame_2_send);
2665 LOG_VERBOSE("btif_media_send_aa_frame : send %d frames", nb_frame_2_send);
2666 bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO);
2669 #endif /* BTA_AV_INCLUDED == TRUE */
2671 /*******************************************************************************
2673 ** Function dump_codec_info
2675 ** Description Decode and display codec_info (for debug)
2679 *******************************************************************************/
2680 void dump_codec_info(unsigned char *p_codec)
2682 tA2D_STATUS a2d_status;
2683 tA2D_SBC_CIE sbc_cie;
2685 a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_codec, FALSE);
2686 if (a2d_status != A2D_SUCCESS)
2688 APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
2692 APPL_TRACE_DEBUG("dump_codec_info");
2694 if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_16)
2695 { APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);}
2696 else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_32)
2697 { APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);}
2698 else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_44)
2699 { APPL_TRACE_DEBUG("\tsamp_freq:%d (44.100)", sbc_cie.samp_freq);}
2700 else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_48)
2701 { APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);}
2703 { APPL_TRACE_DEBUG("\tBAD samp_freq:%d", sbc_cie.samp_freq);}
2705 if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_MONO)
2706 { APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);}
2707 else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_DUAL)
2708 { APPL_TRACE_DEBUG("\tch_mode:%d (Dual)", sbc_cie.ch_mode);}
2709 else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_STEREO)
2710 { APPL_TRACE_DEBUG("\tch_mode:%d (Stereo)", sbc_cie.ch_mode);}
2711 else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_JOINT)
2712 { APPL_TRACE_DEBUG("\tch_mode:%d (Joint)", sbc_cie.ch_mode);}
2714 { APPL_TRACE_DEBUG("\tBAD ch_mode:%d", sbc_cie.ch_mode);}
2716 if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_4)
2717 { APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);}
2718 else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_8)
2719 { APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);}
2720 else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_12)
2721 { APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);}
2722 else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_16)
2723 { APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);}
2725 { APPL_TRACE_DEBUG("\tBAD block_len:%d", sbc_cie.block_len);}
2727 if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_4)
2728 { APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);}
2729 else if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_8)
2730 { APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);}
2732 { APPL_TRACE_DEBUG("\tBAD num_subbands:%d", sbc_cie.num_subbands);}
2734 if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_S)
2735 { APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);}
2736 else if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L)
2737 { APPL_TRACE_DEBUG("\talloc_mthd:%d (Loundess)", sbc_cie.alloc_mthd);}
2739 { APPL_TRACE_DEBUG("\tBAD alloc_mthd:%d", sbc_cie.alloc_mthd);}
2741 APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);