blob: 09c298005aa1657b335cab82506f08755f0a4bfd [file] [log] [blame]
The Android Open Source Project5738f832012-12-12 16:00:35 -08001/******************************************************************************
2 *
3 * Copyright (C) 2009-2012 Broadcom Corporation
Sunny Kapdicda9e722013-01-22 13:21:26 -08004 * Copyright (c) 2013, Linux Foundation. All rights reserved.
The Android Open Source Project5738f832012-12-12 16:00:35 -08005 *
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at:
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 *
18 ******************************************************************************/
19
20/******************************************************************************
21 **
22 ** Name: btif_media_task.c
23 **
24 ** Description: This is the multimedia module for the BTIF system. It
25 ** contains task implementations AV, HS and HF profiles
26 ** audio & video processing
27 **
28 ******************************************************************************/
29
rakesh reddy03b63652014-08-14 11:58:45 +053030
rakesh reddy03b63652014-08-14 11:58:45 +053031#define ATRACE_TAG ATRACE_TAG_ALWAYS
rakesh reddy03b63652014-08-14 11:58:45 +053032
The Android Open Source Project5738f832012-12-12 16:00:35 -080033#include <string.h>
34#include <stdio.h>
35#include <sys/types.h>
36#include <sys/stat.h>
37#include <fcntl.h>
38#include <unistd.h>
39#include <pthread.h>
40#include <stdint.h>
41#include <sys/time.h>
Mattias Agren5fd74f02013-04-05 19:04:35 +020042#include <errno.h>
The Android Open Source Project5738f832012-12-12 16:00:35 -080043
44#include "bt_target.h"
45#include "gki.h"
46#include "bta_api.h"
47#include "btu.h"
48#include "bta_sys.h"
49#include "bta_sys_int.h"
50
51#include "bta_av_api.h"
52#include "a2d_api.h"
53#include "a2d_sbc.h"
54#include "a2d_int.h"
55#include "bta_av_sbc.h"
56#include "bta_av_ci.h"
57#include "l2c_api.h"
58
The Android Open Source Project5738f832012-12-12 16:00:35 -080059#include "btif_av_co.h"
60#include "btif_media.h"
61
The Android Open Source Project5738f832012-12-12 16:00:35 -080062#if (BTA_AV_INCLUDED == TRUE)
63#include "sbc_encoder.h"
64#endif
65
66#define LOG_TAG "BTIF-MEDIA"
67
68#include <hardware/bluetooth.h>
69#include "audio_a2dp_hw.h"
70#include "btif_av.h"
71#include "btif_sm.h"
72#include "btif_util.h"
lungtsai_lin6718c6d2014-07-02 20:39:02 +080073#if (BTA_AV_SINK_INCLUDED == TRUE)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +053074#include "oi_codec_sbc.h"
75#include "oi_status.h"
76#endif
AnubhavGuptaed0a8b12014-08-13 14:26:14 +053077
78#ifdef AVK_BACKPORT
79#include "bluetoothTrack.h"
80#endif
81
Hemant Guptaf7dd9f52013-10-24 15:37:17 +053082#include "stdio.h"
83#include <dlfcn.h>
Hemant Guptaf7dd9f52013-10-24 15:37:17 +053084
85//#define DEBUG_MEDIA_AV_FLOW TRUE
86
lungtsai_lin6718c6d2014-07-02 20:39:02 +080087#if (BTA_AV_SINK_INCLUDED == TRUE)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +053088OI_CODEC_SBC_DECODER_CONTEXT context;
89OI_UINT32 contextData[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)];
90OI_INT16 pcmData[15*SBC_MAX_SAMPLES_PER_FRAME*SBC_MAX_CHANNELS];
Hemant Guptaf7dd9f52013-10-24 15:37:17 +053091#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -080092
rakesh reddy03b63652014-08-14 11:58:45 +053093#include <cutils/trace.h>
Bhakthavatsala Raghavendra1903bf62014-09-11 15:38:16 -070094#include <cutils/properties.h>
The Android Open Source Project5738f832012-12-12 16:00:35 -080095/*****************************************************************************
96 ** Constants
97 *****************************************************************************/
98
Hemant Guptaf7dd9f52013-10-24 15:37:17 +053099#ifndef AUDIO_CHANNEL_OUT_MONO
100#define AUDIO_CHANNEL_OUT_MONO 0x01
101#endif
102
103#ifndef AUDIO_CHANNEL_OUT_STEREO
104#define AUDIO_CHANNEL_OUT_STEREO 0x03
105#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800106
107/* BTIF media task gki event definition */
108#define BTIF_MEDIA_TASK_CMD TASK_MBOX_0_EVT_MASK
109#define BTIF_MEDIA_TASK_DATA TASK_MBOX_1_EVT_MASK
110
111#define BTIF_MEDIA_TASK_KILL EVENT_MASK(GKI_SHUTDOWN_EVT)
112
113#define BTIF_MEDIA_AA_TASK_TIMER_ID TIMER_0
114#define BTIF_MEDIA_AV_TASK_TIMER_ID TIMER_1
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530115#define BTIF_MEDIA_AVK_TASK_TIMER_ID TIMER_2
116
The Android Open Source Project5738f832012-12-12 16:00:35 -0800117#define BTIF_MEDIA_AA_TASK_TIMER TIMER_0_EVT_MASK
118#define BTIF_MEDIA_AV_TASK_TIMER TIMER_1_EVT_MASK
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530119#define BTIF_MEDIA_AVK_TASK_TIMER TIMER_2_EVT_MASK
120
The Android Open Source Project5738f832012-12-12 16:00:35 -0800121
122#define BTIF_MEDIA_TASK_CMD_MBOX TASK_MBOX_0 /* cmd mailbox */
123#define BTIF_MEDIA_TASK_DATA_MBOX TASK_MBOX_1 /* data mailbox */
124
Zhihai Xu01c686c2013-09-15 19:59:37 -0700125
The Android Open Source Project5738f832012-12-12 16:00:35 -0800126/* BTIF media cmd event definition : BTIF_MEDIA_TASK_CMD */
127enum
128{
129 BTIF_MEDIA_START_AA_TX = 1,
130 BTIF_MEDIA_STOP_AA_TX,
131 BTIF_MEDIA_AA_RX_RDY,
132 BTIF_MEDIA_UIPC_RX_RDY,
133 BTIF_MEDIA_SBC_ENC_INIT,
134 BTIF_MEDIA_SBC_ENC_UPDATE,
135 BTIF_MEDIA_SBC_DEC_INIT,
136 BTIF_MEDIA_VIDEO_DEC_INIT,
137 BTIF_MEDIA_FLUSH_AA_TX,
138 BTIF_MEDIA_FLUSH_AA_RX,
139 BTIF_MEDIA_AUDIO_FEEDING_INIT,
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530140 BTIF_MEDIA_AUDIO_RECEIVING_INIT,
141 BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE,
142 BTIF_MEDIA_AUDIO_SINK_START_DECODING,
143 BTIF_MEDIA_AUDIO_SINK_STOP_DECODING,
144 BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK
The Android Open Source Project5738f832012-12-12 16:00:35 -0800145};
146
147enum {
148 MEDIA_TASK_STATE_OFF = 0,
149 MEDIA_TASK_STATE_ON = 1,
150 MEDIA_TASK_STATE_SHUTTING_DOWN = 2
151};
152
153/* Macro to multiply the media task tick */
154#ifndef BTIF_MEDIA_NUM_TICK
155#define BTIF_MEDIA_NUM_TICK 1
156#endif
157
Mattias Agrenb8ceaa42013-04-05 17:27:27 +0200158/* Media task tick in milliseconds, must be set to multiple of
159 (1000/TICKS_PER_SEC) (10) */
160
The Android Open Source Project5738f832012-12-12 16:00:35 -0800161#define BTIF_MEDIA_TIME_TICK (20 * BTIF_MEDIA_NUM_TICK)
Zhihai Xu01c686c2013-09-15 19:59:37 -0700162#define A2DP_DATA_READ_POLL_MS (BTIF_MEDIA_TIME_TICK / 2)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530163#define BTIF_SINK_MEDIA_TIME_TICK (20 * BTIF_MEDIA_NUM_TICK)
164
The Android Open Source Project5738f832012-12-12 16:00:35 -0800165
The Android Open Source Project5738f832012-12-12 16:00:35 -0800166/* buffer pool */
167#define BTIF_MEDIA_AA_POOL_ID GKI_POOL_ID_3
168#define BTIF_MEDIA_AA_BUF_SIZE GKI_BUF3_SIZE
169
170/* offset */
171#if (BTA_AV_CO_CP_SCMS_T == TRUE)
172#define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE + 1)
173#else
174#define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE)
175#endif
176
177/* Define the bitrate step when trying to match bitpool value */
178#ifndef BTIF_MEDIA_BITRATE_STEP
179#define BTIF_MEDIA_BITRATE_STEP 5
180#endif
181
182/* Middle quality quality setting @ 44.1 khz */
Mattias Agrenb8ceaa42013-04-05 17:27:27 +0200183#define DEFAULT_SBC_BITRATE 328
184
185#ifndef BTIF_A2DP_NON_EDR_MAX_RATE
186#define BTIF_A2DP_NON_EDR_MAX_RATE 229
187#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800188
189#ifndef A2DP_MEDIA_TASK_STACK_SIZE
190#define A2DP_MEDIA_TASK_STACK_SIZE 0x2000 /* In bytes */
191#endif
192
rakesh reddy49366a22014-12-22 18:51:24 +0530193#if (BTA_AV_CO_CP_SCMS_T == TRUE)
194/* A2DP header will contain a CP header of size 1 */
195#define A2DP_HDR_SIZE 2
196#else
Ayan Ghoshec40bdb2013-11-11 19:25:16 +0530197#define A2DP_HDR_SIZE 1
rakesh reddy49366a22014-12-22 18:51:24 +0530198#endif
Ayan Ghoshec40bdb2013-11-11 19:25:16 +0530199#define MAX_SBC_HQ_FRAME_SIZE_44_1 119
200#define MAX_SBC_HQ_FRAME_SIZE_48 115
rakesh reddy49366a22014-12-22 18:51:24 +0530201
202/* 2DH5 payload size (679 bytes) - (4 bytes L2CAP Header + 12 bytes AVDTP Header) */
203#define MAX_2MBPS_AVDTP_MTU 663
Ayan Ghoshec40bdb2013-11-11 19:25:16 +0530204
The Android Open Source Project5738f832012-12-12 16:00:35 -0800205#define A2DP_MEDIA_TASK_TASK_STR ((INT8 *) "A2DP-MEDIA")
206static UINT32 a2dp_media_task_stack[(A2DP_MEDIA_TASK_STACK_SIZE + 3) / 4];
207
208#define BT_MEDIA_TASK A2DP_MEDIA_TASK
209
210#define USEC_PER_SEC 1000000L
Mattias Agren5fd74f02013-04-05 19:04:35 +0200211#define TPUT_STATS_INTERVAL_US (3000*1000)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800212
213/*
214 * CONGESTION COMPENSATION CTRL ::
215 *
216 * Thus setting controls how many buffers we will hold in media task
217 * during temp link congestion. Together with the stack buffer queues
218 * it controls much temporary a2dp link congestion we can
219 * compensate for. It however also depends on the default run level of sinks
220 * jitterbuffers. Depending on type of sink this would vary.
221 * Ideally the (SRC) max tx buffer capacity should equal the sinks
222 * jitterbuffer runlevel including any intermediate buffers on the way
223 * towards the sinks codec.
224 */
225
226/* fixme -- define this in pcm time instead of buffer count */
Mattias Agrenb8ceaa42013-04-05 17:27:27 +0200227
228/* The typical runlevel of the tx queue size is ~1 buffer
229 but due to link flow control or thread preemption in lower
230 layers we might need to temporarily buffer up data */
231
Christopher R. Palmere288e3b2015-05-27 14:06:13 -0400232/* 18 frames is equivalent to 6.89*18*2.9 ~= 360 ms @ 44.1 khz, 20 ms mediatick */
233#define MAX_SINK_A2DP_FRAME_QUEUE_SZ 18
234
235/* Allow up to 360ms of buffered A2DP data */
236#define MAX_OUTPUT_A2DP_QUEUE_MS 360
Sridhar Gujje876c69b2015-02-20 15:55:44 +0530237
238#ifndef MAX_PCM_FRAME_NUM_PER_TICK
Christopher R. Palmer88221c92015-06-02 06:29:47 -0400239#ifdef SAMPLE_RATE_48K
240/* If a frame is 512 bytes and a tick is 3840 bytes (48K) then allow up to
241 * two full ticks to be sent per tick which is 9680 / 512 = 18
242 */
243#define MAX_PCM_FRAME_NUM_PER_TICK 18
244#else
Sridhar Gujje876c69b2015-02-20 15:55:44 +0530245#define MAX_PCM_FRAME_NUM_PER_TICK 14
246#endif
Christopher R. Palmer88221c92015-06-02 06:29:47 -0400247#endif
Sridhar Gujje876c69b2015-02-20 15:55:44 +0530248
Sungjun Parkdf0d8a12014-12-05 16:38:53 -0800249#define MAX_PCM_ITER_NUM_PER_TICK 2
The Android Open Source Project5738f832012-12-12 16:00:35 -0800250
Sungjun Park79d93ec2015-01-16 11:09:48 -0800251//#define BTIF_MEDIA_VERBOSE_ENABLED
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530252/* In case of A2DP SINK, we will delay start by 5 AVDTP Packets*/
AnubhavGuptaed0a8b12014-08-13 14:26:14 +0530253#define MAX_A2DP_DELAYED_START_FRAME_COUNT 1
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530254#define PACKET_PLAYED_PER_TICK_48 8
255#define PACKET_PLAYED_PER_TICK_44 7
256#define PACKET_PLAYED_PER_TICK_32 5
257#define PACKET_PLAYED_PER_TICK_16 3
258
The Android Open Source Project5738f832012-12-12 16:00:35 -0800259
260#ifdef BTIF_MEDIA_VERBOSE_ENABLED
261#define VERBOSE(fmt, ...) \
262 LogMsg( TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
263 TRACE_TYPE_ERROR, fmt, ## __VA_ARGS__)
264#else
265#define VERBOSE(fmt, ...)
266#endif
267
268/*****************************************************************************
269 ** Data types
270 *****************************************************************************/
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530271typedef struct
272{
273 UINT16 num_frames_to_be_processed;
274 UINT16 len;
275 UINT16 offset;
276 UINT16 layer_specific;
277} tBT_SBC_HDR;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800278
279typedef struct
280{
281 UINT32 aa_frame_counter;
282 INT32 aa_feed_counter;
283 INT32 aa_feed_residue;
Mattias Agrenb8ceaa42013-04-05 17:27:27 +0200284 UINT32 counter;
285 UINT32 bytes_per_tick; /* pcm bytes read each media task tick */
The Android Open Source Project5738f832012-12-12 16:00:35 -0800286} tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE;
287
288
289typedef union
290{
291 tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE pcm;
292} tBTIF_AV_MEDIA_FEEDINGS_STATE;
293
294typedef struct
295{
296#if (BTA_AV_INCLUDED == TRUE)
297 BUFFER_Q TxAaQ;
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530298 BUFFER_Q RxSbcQ;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800299 BOOLEAN is_tx_timer;
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530300 BOOLEAN is_rx_timer;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800301 UINT16 TxAaMtuSize;
302 UINT32 timestamp;
303 UINT8 TxTranscoding;
304 tBTIF_AV_FEEDING_MODE feeding_mode;
305 tBTIF_AV_MEDIA_FEEDINGS media_feeding;
306 tBTIF_AV_MEDIA_FEEDINGS_STATE media_feeding_state;
307 SBC_ENC_PARAMS encoder;
308 UINT8 busy_level;
309 void* av_sm_hdl;
310 UINT8 a2dp_cmd_pending; /* we can have max one command pending */
311 BOOLEAN tx_flush; /* discards any outgoing data when true */
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530312 BOOLEAN rx_flush; /* discards any incoming data when true */
Mike Lockwood3e8a2422014-05-23 12:42:24 -0700313 UINT8 peer_sep;
314 BOOLEAN data_channel_open;
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530315 UINT8 frames_to_process;
Mike Lockwood3e8a2422014-05-23 12:42:24 -0700316
317 UINT32 sample_rate;
318 UINT8 channel_count;
AnubhavGuptaed0a8b12014-08-13 14:26:14 +0530319#ifdef AVK_BACKPORT
320 btif_media_AudioFocus_state rx_audio_focus_gained;
321#endif
Ayan Ghoshec40bdb2013-11-11 19:25:16 +0530322 UINT8 TxNumSBCFrames;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800323#endif
324
325} tBTIF_MEDIA_CB;
326
327typedef struct {
Mattias Agren5fd74f02013-04-05 19:04:35 +0200328 long long rx;
329 long long rx_tot;
330 long long tx;
331 long long tx_tot;
332 long long ts_prev_us;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800333} t_stat;
334
335/*****************************************************************************
336 ** Local data
337 *****************************************************************************/
338
339static tBTIF_MEDIA_CB btif_media_cb;
340static int media_task_running = MEDIA_TASK_STATE_OFF;
Andre Eisenbachf13db8a2014-07-11 16:57:24 -0700341static UINT64 last_frame_us = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800342
343
344/*****************************************************************************
345 ** Local functions
346 *****************************************************************************/
347
348static void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event);
349static void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event);
350static void btif_a2dp_encoder_update(void);
Mattias Agren5fd74f02013-04-05 19:04:35 +0200351const char* dump_media_event(UINT16 event);
lungtsai_lin6718c6d2014-07-02 20:39:02 +0800352#if (BTA_AV_SINK_INCLUDED == TRUE)
Hemant Guptace247652014-03-20 20:47:04 +0530353extern OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
354 const OI_BYTE **frameData,
355 unsigned long *frameBytes,
356 OI_INT16 *pcmData,
357 unsigned long *pcmBytes);
358extern OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
359 unsigned long *decoderData,
360 unsigned long decoderDataBytes,
361 OI_UINT8 maxChannels,
362 OI_UINT8 pcmStride,
363 OI_BOOL enhanced);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530364#endif
365static void btif_media_flush_q(BUFFER_Q *p_q);
366static void btif_media_task_aa_handle_stop_decoding(void );
367static void btif_media_task_aa_rx_flush(void);
368static BOOLEAN btif_media_task_stop_decoding_req(void);
Ayan Ghoshec40bdb2013-11-11 19:25:16 +0530369static UINT8 check_for_max_number_of_frames_per_packet();
370
The Android Open Source Project5738f832012-12-12 16:00:35 -0800371
372/*****************************************************************************
373 ** Externs
374 *****************************************************************************/
375
376static void btif_media_task_handle_cmd(BT_HDR *p_msg);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530377static void btif_media_task_handle_media(BT_HDR*p_msg);
378/* Handle incoming media packets A2DP SINK streaming*/
lungtsai_lin6718c6d2014-07-02 20:39:02 +0800379#if (BTA_AV_SINK_INCLUDED == TRUE)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530380static void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg);
381#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800382
383#if (BTA_AV_INCLUDED == TRUE)
384static void btif_media_send_aa_frame(void);
385static void btif_media_task_feeding_state_reset(void);
386static void btif_media_task_aa_start_tx(void);
387static void btif_media_task_aa_stop_tx(void);
388static void btif_media_task_enc_init(BT_HDR *p_msg);
389static void btif_media_task_enc_update(BT_HDR *p_msg);
390static void btif_media_task_audio_feeding_init(BT_HDR *p_msg);
391static void btif_media_task_aa_tx_flush(BT_HDR *p_msg);
392static void btif_media_aa_prep_2_send(UINT8 nb_frame);
lungtsai_lin6718c6d2014-07-02 20:39:02 +0800393#if (BTA_AV_SINK_INCLUDED == TRUE)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530394static void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg);
395static void btif_media_task_aa_handle_clear_track(void);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800396#endif
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530397static void btif_media_task_aa_handle_start_decoding(void );
398#endif
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530399BOOLEAN btif_media_task_start_decoding_req(void);
400BOOLEAN btif_media_task_clear_track(void);
Rohit Singha9fb00a2013-07-27 14:46:29 +0530401extern BOOLEAN btif_hf_is_call_idle();
402
Bhakthavatsala Raghavendraa86504f2014-11-24 22:35:55 -0800403static int bt_systrace_log_enabled=0;
Rohit Singha9fb00a2013-07-27 14:46:29 +0530404
The Android Open Source Project5738f832012-12-12 16:00:35 -0800405/*****************************************************************************
406 ** Misc helper functions
407 *****************************************************************************/
Bhakthavatsala Raghavendra1903bf62014-09-11 15:38:16 -0700408int med_task_perf_systrace_enabled() {
409 char value[PROPERTY_VALUE_MAX] = {'\0'};
410 property_get("bt_audio_systrace_log", value, "false");
Bhakthavatsala Raghavendraa86504f2014-11-24 22:35:55 -0800411 bt_systrace_log_enabled = (strcmp(value, "true") == 0);
412 return bt_systrace_log_enabled;
Bhakthavatsala Raghavendra1903bf62014-09-11 15:38:16 -0700413}
The Android Open Source Project5738f832012-12-12 16:00:35 -0800414
The Android Open Source Project5738f832012-12-12 16:00:35 -0800415static void log_tstamps_us(char *comment)
416{
rakesh reddy03b63652014-08-14 11:58:45 +0530417 #define USEC_PER_MSEC 1000L
Andre Eisenbachf13db8a2014-07-11 16:57:24 -0700418 static UINT64 prev_us = 0;
Christopher R. Palmer15e2aa22015-02-23 11:34:42 -0500419 const UINT64 now_us = GKI_now_us();
rakesh reddy03b63652014-08-14 11:58:45 +0530420 static UINT64 diff_us = 0;
421
422 diff_us = now_us - prev_us;
423 if ((diff_us / USEC_PER_MSEC) > (BTIF_MEDIA_TIME_TICK + 10))
424 {
425 APPL_TRACE_ERROR("[%s] ts %08llu, diff : %08llu, queue sz %d", comment, now_us, diff_us,
The Android Open Source Project5738f832012-12-12 16:00:35 -0800426 btif_media_cb.TxAaQ.count);
rakesh reddy03b63652014-08-14 11:58:45 +0530427 }
428 else
429 {
430 APPL_TRACE_DEBUG("[%s] ts %08llu, diff : %08llu, queue sz %d", comment, now_us, diff_us,
431 btif_media_cb.TxAaQ.count);
432 }
Andre Eisenbachf13db8a2014-07-11 16:57:24 -0700433 prev_us = now_us;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800434}
435
436const char* dump_media_event(UINT16 event)
437{
438 switch(event)
439 {
440 CASE_RETURN_STR(BTIF_MEDIA_START_AA_TX)
441 CASE_RETURN_STR(BTIF_MEDIA_STOP_AA_TX)
442 CASE_RETURN_STR(BTIF_MEDIA_AA_RX_RDY)
443 CASE_RETURN_STR(BTIF_MEDIA_UIPC_RX_RDY)
444 CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_INIT)
445 CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_UPDATE)
446 CASE_RETURN_STR(BTIF_MEDIA_SBC_DEC_INIT)
447 CASE_RETURN_STR(BTIF_MEDIA_VIDEO_DEC_INIT)
448 CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_TX)
449 CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_RX)
450 CASE_RETURN_STR(BTIF_MEDIA_AUDIO_FEEDING_INIT)
451 CASE_RETURN_STR(BTIF_MEDIA_AUDIO_RECEIVING_INIT)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530452 CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE)
453 CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_START_DECODING)
454 CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_STOP_DECODING)
455 CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800456
457 default:
458 return "UNKNOWN MEDIA EVENT";
459 }
460}
461
Christopher R. Palmere288e3b2015-05-27 14:06:13 -0400462static inline UINT32 compute_pcm_bytes_per_frame(void)
463{
464 return btif_media_cb.encoder.s16NumOfSubBands *
465 btif_media_cb.encoder.s16NumOfBlocks *
466 btif_media_cb.media_feeding.cfg.pcm.num_channel *
467 btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
468}
469
The Android Open Source Project5738f832012-12-12 16:00:35 -0800470/*****************************************************************************
471 ** A2DP CTRL PATH
472 *****************************************************************************/
473
474static const char* dump_a2dp_ctrl_event(UINT8 event)
475{
476 switch(event)
477 {
478 CASE_RETURN_STR(A2DP_CTRL_CMD_NONE)
479 CASE_RETURN_STR(A2DP_CTRL_CMD_CHECK_READY)
480 CASE_RETURN_STR(A2DP_CTRL_CMD_START)
481 CASE_RETURN_STR(A2DP_CTRL_CMD_STOP)
482 CASE_RETURN_STR(A2DP_CTRL_CMD_SUSPEND)
483 default:
484 return "UNKNOWN MSG ID";
485 }
486}
487
488static void btif_audiopath_detached(void)
489{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700490 APPL_TRACE_EVENT("## AUDIO PATH DETACHED ##");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800491
492 /* send stop request only if we are actively streaming and haven't received
493 a stop request. Potentially audioflinger detached abnormally */
494 if (btif_media_cb.is_tx_timer)
495 {
496 /* post stop event and wait for audio path to stop */
497 btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0);
498 }
499}
500
501static void a2dp_cmd_acknowledge(int status)
502{
503 UINT8 ack = status;
504
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700505 APPL_TRACE_EVENT("## a2dp ack : %s, status %d ##",
Mattias Agren5fd74f02013-04-05 19:04:35 +0200506 dump_a2dp_ctrl_event(btif_media_cb.a2dp_cmd_pending), status);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800507
508 /* sanity check */
509 if (btif_media_cb.a2dp_cmd_pending == A2DP_CTRL_CMD_NONE)
510 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700511 APPL_TRACE_ERROR("warning : no command pending, ignore ack");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800512 return;
513 }
514
515 /* clear pending */
516 btif_media_cb.a2dp_cmd_pending = A2DP_CTRL_CMD_NONE;
517
518 /* acknowledge start request */
519 UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &ack, 1);
520}
521
522
523static void btif_recv_ctrl_data(void)
524{
525 UINT8 cmd = 0;
526 int n;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800527 n = UIPC_Read(UIPC_CH_ID_AV_CTRL, NULL, &cmd, 1);
528
529 /* detach on ctrl channel means audioflinger process was terminated */
530 if (n == 0)
531 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700532 APPL_TRACE_EVENT("CTRL CH DETACHED");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800533 UIPC_Close(UIPC_CH_ID_AV_CTRL);
534 /* we can operate only on datachannel, if af client wants to
535 do send additional commands the ctrl channel would be reestablished */
536 //btif_audiopath_detached();
537 return;
538 }
539
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700540 APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s", dump_a2dp_ctrl_event(cmd));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800541
542 btif_media_cb.a2dp_cmd_pending = cmd;
543
544 switch(cmd)
545 {
546 case A2DP_CTRL_CMD_CHECK_READY:
547
548 if (media_task_running == MEDIA_TASK_STATE_SHUTTING_DOWN)
549 {
550 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
551 return;
552 }
553
554 /* check whether av is ready to setup a2dp datapath */
555 if ((btif_av_stream_ready() == TRUE) || (btif_av_stream_started_ready() == TRUE))
556 {
557 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
558 }
559 else
560 {
561 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
562 }
563 break;
564
Rohit Singha9fb00a2013-07-27 14:46:29 +0530565 case A2DP_CTRL_CMD_CHECK_STREAM_STARTED:
566
567 if((btif_av_stream_started_ready() == TRUE))
568 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
569 else
570 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
571 break;
572
The Android Open Source Project5738f832012-12-12 16:00:35 -0800573 case A2DP_CTRL_CMD_START:
Rohit Singha9fb00a2013-07-27 14:46:29 +0530574 /* Dont sent START request to stack while we are in call.
575 Some headsets like Sony MW600, dont allow AVDTP START
576 in call and respond BAD_STATE */
577 if (!btif_hf_is_call_idle())
578 {
579 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_INCALL_FAILURE);
580 break;
581 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800582
583 if (btif_av_stream_ready() == TRUE)
584 {
585 /* setup audio data channel listener */
586 UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
587
588 /* post start event and wait for audio path to open */
589 btif_dispatch_sm_event(BTIF_AV_START_STREAM_REQ_EVT, NULL, 0);
Andre Eisenbachae13ec92014-09-03 12:48:44 -0700590
591#if (BTA_AV_SINK_INCLUDED == TRUE)
592 if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
593 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
594#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -0800595 }
596 else if (btif_av_stream_started_ready())
597 {
598 /* already started, setup audio data channel listener
599 and ack back immediately */
600 UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
601
602 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
603 }
604 else
605 {
606 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
607 break;
608 }
609 break;
610
611 case A2DP_CTRL_CMD_STOP:
Mike Lockwood3e8a2422014-05-23 12:42:24 -0700612 if (btif_media_cb.peer_sep == AVDT_TSEP_SNK && btif_media_cb.is_tx_timer == FALSE)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800613 {
614 /* we are already stopped, just ack back */
615 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
616 break;
617 }
618
619 btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0);
Mike Lockwood3e8a2422014-05-23 12:42:24 -0700620 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800621 break;
622
623 case A2DP_CTRL_CMD_SUSPEND:
624 /* local suspend */
625 if (btif_av_stream_started_ready())
626 {
627 btif_dispatch_sm_event(BTIF_AV_SUSPEND_STREAM_REQ_EVT, NULL, 0);
628 }
629 else
630 {
631 /* if we are not in started state, just ack back ok and let
632 audioflinger close the channel. This can happen if we are
Rohit Singha9fb00a2013-07-27 14:46:29 +0530633 remotely suspended , clear REMOTE SUSPEND Flag */
634 btif_av_clear_remote_suspend_flag();
The Android Open Source Project5738f832012-12-12 16:00:35 -0800635 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
636 }
637 break;
638
Mike Lockwood3e8a2422014-05-23 12:42:24 -0700639 case A2DP_CTRL_GET_AUDIO_CONFIG:
640 {
641 uint32_t sample_rate = btif_media_cb.sample_rate;
642 uint8_t channel_count = btif_media_cb.channel_count;
643
644 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
645 UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, (UINT8 *)&sample_rate, 4);
646 UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &channel_count, 1);
647 break;
648 }
649
The Android Open Source Project5738f832012-12-12 16:00:35 -0800650 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700651 APPL_TRACE_ERROR("UNSUPPORTED CMD (%d)", cmd);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800652 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
653 break;
654 }
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700655 APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s DONE", dump_a2dp_ctrl_event(cmd));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800656}
657
658static void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
659{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800660 UNUSED(ch_id);
661
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700662 APPL_TRACE_DEBUG("A2DP-CTRL-CHANNEL EVENT %s", dump_uipc_event(event));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800663
664 switch(event)
665 {
666 case UIPC_OPEN_EVT:
667 /* fetch av statemachine handle */
668 btif_media_cb.av_sm_hdl = btif_av_get_sm_handle();
669 break;
670
671 case UIPC_CLOSE_EVT:
672 /* restart ctrl server unless we are shutting down */
673 if (media_task_running == MEDIA_TASK_STATE_ON)
674 UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb);
675 break;
676
677 case UIPC_RX_DATA_READY_EVT:
678 btif_recv_ctrl_data();
679 break;
680
681 default :
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700682 APPL_TRACE_ERROR("### A2DP-CTRL-CHANNEL EVENT %d NOT HANDLED ###", event);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800683 break;
684 }
685}
686
687static void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
688{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -0800689 UNUSED(ch_id);
690
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700691 APPL_TRACE_DEBUG("BTIF MEDIA (A2DP-DATA) EVENT %s", dump_uipc_event(event));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800692
693 switch(event)
694 {
695 case UIPC_OPEN_EVT:
696
697 /* read directly from media task from here on (keep callback for
698 connection events */
699 UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_REMOVE_ACTIVE_READSET, NULL);
Zhihai Xu01c686c2013-09-15 19:59:37 -0700700 UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_SET_READ_POLL_TMO,
701 (void *)A2DP_DATA_READ_POLL_MS);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800702
Mike Lockwood3e8a2422014-05-23 12:42:24 -0700703 if (btif_media_cb.peer_sep == AVDT_TSEP_SNK) {
Mike Lockwood3e8a2422014-05-23 12:42:24 -0700704 /* make sure we update any changed sbc encoder params */
Ayan Ghosh02094232014-08-06 16:04:42 +0530705 /*post a message to btif_av to serialize encode update and encode init*/
706 btif_dispatch_sm_event(BTIF_AV_UPDATE_ENCODER_REQ_EVT, NULL, 0);
Mike Lockwood3e8a2422014-05-23 12:42:24 -0700707 }
708 btif_media_cb.data_channel_open = TRUE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800709
710 /* ack back when media task is fully started */
711 break;
712
713 case UIPC_CLOSE_EVT:
714 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
715 btif_audiopath_detached();
Mike Lockwood3e8a2422014-05-23 12:42:24 -0700716 btif_media_cb.data_channel_open = FALSE;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800717 break;
718
719 default :
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700720 APPL_TRACE_ERROR("### A2DP-DATA EVENT %d NOT HANDLED ###", event);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800721 break;
722 }
723}
724
725
726/*****************************************************************************
727 ** BTIF ADAPTATION
728 *****************************************************************************/
729
Mattias Agrenb8ceaa42013-04-05 17:27:27 +0200730static UINT16 btif_media_task_get_sbc_rate(void)
731{
732 UINT16 rate = DEFAULT_SBC_BITRATE;
733
734 /* restrict bitrate if a2dp link is non-edr */
735 if (!btif_av_is_peer_edr())
736 {
737 rate = BTIF_A2DP_NON_EDR_MAX_RATE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700738 APPL_TRACE_DEBUG("non-edr a2dp sink detected, restrict rate to %d", rate);
Mattias Agrenb8ceaa42013-04-05 17:27:27 +0200739 }
740
741 return rate;
742}
743
The Android Open Source Project5738f832012-12-12 16:00:35 -0800744static void btif_a2dp_encoder_init(void)
745{
746 UINT16 minmtu;
747 tBTIF_MEDIA_INIT_AUDIO msg;
748 tA2D_SBC_CIE sbc_config;
749
750 /* lookup table for converting channel mode */
751 UINT16 codec_mode_tbl[5] = { SBC_JOINT_STEREO, SBC_STEREO, SBC_DUAL, 0, SBC_MONO };
752
753 /* lookup table for converting number of blocks */
754 UINT16 codec_block_tbl[5] = { 16, 12, 8, 0, 4 };
755
756 /* lookup table to convert freq */
757 UINT16 freq_block_tbl[5] = { SBC_sf48000, SBC_sf44100, SBC_sf32000, 0, SBC_sf16000 };
758
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700759 APPL_TRACE_DEBUG("btif_a2dp_encoder_init");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800760
761 /* Retrieve the current SBC configuration (default if currently not used) */
762 bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
763 msg.NumOfSubBands = (sbc_config.num_subbands == A2D_SBC_IE_SUBBAND_4) ? 4 : 8;
764 msg.NumOfBlocks = codec_block_tbl[sbc_config.block_len >> 5];
765 msg.AllocationMethod = (sbc_config.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L) ? SBC_LOUDNESS : SBC_SNR;
766 msg.ChannelMode = codec_mode_tbl[sbc_config.ch_mode >> 1];
767 msg.SamplingFreq = freq_block_tbl[sbc_config.samp_freq >> 5];
768 msg.MtuSize = minmtu;
769
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700770 APPL_TRACE_EVENT("msg.ChannelMode %x", msg.ChannelMode);
The Android Open Source Project5738f832012-12-12 16:00:35 -0800771
772 /* Init the media task to encode SBC properly */
773 btif_media_task_enc_init_req(&msg);
774}
775
776static void btif_a2dp_encoder_update(void)
777{
778 UINT16 minmtu;
779 tA2D_SBC_CIE sbc_config;
780 tBTIF_MEDIA_UPDATE_AUDIO msg;
781 UINT8 pref_min;
782 UINT8 pref_max;
783
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700784 APPL_TRACE_DEBUG("btif_a2dp_encoder_update");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800785
786 /* Retrieve the current SBC configuration (default if currently not used) */
787 bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
788
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700789 APPL_TRACE_DEBUG("btif_a2dp_encoder_update: Common min_bitpool:%d(0x%x) max_bitpool:%d(0x%x)",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800790 sbc_config.min_bitpool, sbc_config.min_bitpool,
791 sbc_config.max_bitpool, sbc_config.max_bitpool);
792
793 if (sbc_config.min_bitpool > sbc_config.max_bitpool)
794 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700795 APPL_TRACE_ERROR("btif_a2dp_encoder_update: ERROR btif_a2dp_encoder_update min_bitpool > max_bitpool");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800796 }
797
798 /* check if remote sink has a preferred bitpool range */
799 if (bta_av_co_get_remote_bitpool_pref(&pref_min, &pref_max) == TRUE)
800 {
801 /* adjust our preferred bitpool with the remote preference if within
802 our capable range */
803
804 if (pref_min < sbc_config.min_bitpool)
805 pref_min = sbc_config.min_bitpool;
806
807 if (pref_max > sbc_config.max_bitpool)
808 pref_max = sbc_config.max_bitpool;
809
810 msg.MinBitPool = pref_min;
811 msg.MaxBitPool = pref_max;
812
813 if ((pref_min != sbc_config.min_bitpool) || (pref_max != sbc_config.max_bitpool))
814 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700815 APPL_TRACE_EVENT("## adjusted our bitpool range to peer pref [%d:%d] ##",
The Android Open Source Project5738f832012-12-12 16:00:35 -0800816 pref_min, pref_max);
817 }
818 }
819 else
820 {
821 msg.MinBitPool = sbc_config.min_bitpool;
822 msg.MaxBitPool = sbc_config.max_bitpool;
823 }
824
825 msg.MinMtuSize = minmtu;
826
827 /* Update the media task to encode SBC properly */
828 btif_media_task_enc_update_req(&msg);
829}
830
831
832/*****************************************************************************
833**
834** Function btif_a2dp_start_media_task
835**
836** Description
837**
838** Returns
839**
840*******************************************************************************/
841
842int btif_a2dp_start_media_task(void)
843{
844 int retval;
845
846 if (media_task_running != MEDIA_TASK_STATE_OFF)
847 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700848 APPL_TRACE_ERROR("warning : media task already running");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800849 return GKI_FAILURE;
850 }
851
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700852 APPL_TRACE_EVENT("## A2DP START MEDIA TASK ##");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800853
854 /* start a2dp media task */
855 retval = GKI_create_task((TASKPTR)btif_media_task, A2DP_MEDIA_TASK,
856 A2DP_MEDIA_TASK_TASK_STR,
857 (UINT16 *) ((UINT8 *)a2dp_media_task_stack + A2DP_MEDIA_TASK_STACK_SIZE),
858 sizeof(a2dp_media_task_stack));
859
860 if (retval != GKI_SUCCESS)
861 return retval;
862
863 /* wait for task to come up to sure we are able to send messages to it */
864 while (media_task_running == MEDIA_TASK_STATE_OFF)
Sharvil Nanavati405b5c92016-06-17 14:15:46 -0700865 TEMP_FAILURE_RETRY(usleep(10));
The Android Open Source Project5738f832012-12-12 16:00:35 -0800866
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700867 APPL_TRACE_EVENT("## A2DP MEDIA TASK STARTED ##");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800868
869 return retval;
870}
871
872/*****************************************************************************
873**
874** Function btif_a2dp_stop_media_task
875**
876** Description
877**
878** Returns
879**
880*******************************************************************************/
881
882void btif_a2dp_stop_media_task(void)
883{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700884 APPL_TRACE_EVENT("## A2DP STOP MEDIA TASK ##");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800885 GKI_destroy_task(BT_MEDIA_TASK);
886}
887
888/*****************************************************************************
889**
890** Function btif_a2dp_on_init
891**
892** Description
893**
894** Returns
895**
896*******************************************************************************/
897
898void btif_a2dp_on_init(void)
899{
900 //tput_mon(1, 0, 1);
901}
902
903
904/*****************************************************************************
905**
906** Function btif_a2dp_setup_codec
907**
Ayan Ghosh5ca89872013-06-27 11:15:15 +0530908** Description does codec setup
The Android Open Source Project5738f832012-12-12 16:00:35 -0800909**
Ayan Ghosh5ca89872013-06-27 11:15:15 +0530910** Returns tBTIF_STATUS
The Android Open Source Project5738f832012-12-12 16:00:35 -0800911**
912*******************************************************************************/
913
Ayan Ghosh5ca89872013-06-27 11:15:15 +0530914tBTIF_STATUS btif_a2dp_setup_codec(void)
The Android Open Source Project5738f832012-12-12 16:00:35 -0800915{
916 tBTIF_AV_MEDIA_FEEDINGS media_feeding;
917 tBTIF_STATUS status;
918
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700919 APPL_TRACE_EVENT("## A2DP SETUP CODEC ##");
The Android Open Source Project5738f832012-12-12 16:00:35 -0800920
921 GKI_disable();
922
Ethan Chendec61cd2015-02-13 18:26:44 -0800923 /* for now hardcode 44/48 khz 16 bit stereo */
924#ifdef SAMPLE_RATE_48K
925 media_feeding.cfg.pcm.sampling_freq = 48000;
926#else
927 media_feeding.cfg.pcm.sampling_freq = 44100;
928#endif
929 media_feeding.cfg.pcm.bit_per_sample = 16;
930 media_feeding.cfg.pcm.num_channel = 2;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800931 media_feeding.format = BTIF_AV_CODEC_PCM;
932
933 if (bta_av_co_audio_set_codec(&media_feeding, &status))
934 {
935 tBTIF_MEDIA_INIT_AUDIO_FEEDING mfeed;
936
937 /* Init the encoding task */
938 btif_a2dp_encoder_init();
939
940 /* Build the media task configuration */
941 mfeed.feeding = media_feeding;
942 mfeed.feeding_mode = BTIF_AV_FEEDING_ASYNCHRONOUS;
943 /* Send message to Media task to configure transcoding */
944 btif_media_task_audio_feeding_init_req(&mfeed);
945 }
Ayan Ghosh5ca89872013-06-27 11:15:15 +0530946 else
947 {
948 status = BTIF_ERROR_SRV_AV_FEEDING_NOT_SUPPORTED;
949 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800950 GKI_enable();
Ayan Ghosh5ca89872013-06-27 11:15:15 +0530951 return status;
The Android Open Source Project5738f832012-12-12 16:00:35 -0800952}
953
954
955/*****************************************************************************
956**
Ayan Ghosh02094232014-08-06 16:04:42 +0530957** Function btif_a2dp_update_codec
958**
959** Description
960**
961** Returns
962**
963*******************************************************************************/
964
965void btif_a2dp_update_codec(void)
966{
967 APPL_TRACE_EVENT("## A2DP UPDATE CODEC ##");
968
969 GKI_disable();
Ayan Ghosh24eac6f2014-08-25 17:31:02 +0530970 /* Start the media task to encode SBC */
971 btif_media_task_start_aa_req();
Ayan Ghosh02094232014-08-06 16:04:42 +0530972 btif_a2dp_encoder_update();
973 GKI_enable();
974}
975
976
977/*****************************************************************************
978**
The Android Open Source Project5738f832012-12-12 16:00:35 -0800979** Function btif_a2dp_on_idle
980**
981** Description
982**
983** Returns
984**
985*******************************************************************************/
986
987void btif_a2dp_on_idle(void)
988{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -0700989 APPL_TRACE_EVENT("## ON A2DP IDLE ##");
Mike Lockwood3e8a2422014-05-23 12:42:24 -0700990 if (btif_media_cb.peer_sep == AVDT_TSEP_SNK)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530991 {
992 /* Make sure media task is stopped */
993 btif_media_task_stop_aa_req();
994 }
The Android Open Source Project5738f832012-12-12 16:00:35 -0800995
996 bta_av_co_init();
lungtsai_lin6718c6d2014-07-02 20:39:02 +0800997#if (BTA_AV_SINK_INCLUDED == TRUE)
Mike Lockwood3e8a2422014-05-23 12:42:24 -0700998 if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +0530999 {
1000 btif_media_cb.rx_flush = TRUE;
1001 btif_media_task_aa_rx_flush_req();
1002 btif_media_task_stop_decoding_req();
1003 btif_media_task_clear_track();
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001004 APPL_TRACE_DEBUG("Stopped BT track");
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05301005#ifdef AVK_BACKPORT
1006 btif_media_cb.rx_audio_focus_gained = BTIF_MEDIA_AUDIOFOCUS_LOSS;
1007#endif
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301008 }
1009#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08001010}
1011
1012/*****************************************************************************
1013**
1014** Function btif_a2dp_on_open
1015**
1016** Description
1017**
1018** Returns
1019**
1020*******************************************************************************/
1021
1022void btif_a2dp_on_open(void)
1023{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001024 APPL_TRACE_EVENT("## ON A2DP OPEN ##");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001025
1026 /* always use callback to notify socket events */
1027 UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
1028}
1029
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301030/*******************************************************************************
1031 **
1032 ** Function btif_media_task_clear_track
1033 **
1034 ** Description
1035 **
1036 ** Returns TRUE is success
1037 **
1038 *******************************************************************************/
1039BOOLEAN btif_media_task_clear_track(void)
1040{
1041 BT_HDR *p_buf;
1042
1043 if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1044 {
1045 return FALSE;
1046 }
1047
1048 p_buf->event = BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK;
1049
1050 GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1051 return TRUE;
1052}
1053/*******************************************************************************
1054 **
1055 ** Function btif_media_task_stop_decoding_req
1056 **
1057 ** Description
1058 **
1059 ** Returns TRUE is success
1060 **
1061 *******************************************************************************/
1062BOOLEAN btif_media_task_stop_decoding_req(void)
1063{
1064 BT_HDR *p_buf;
1065
1066 if (!btif_media_cb.is_rx_timer)
1067 return TRUE; /* if timer is not running no need to send message */
1068
1069 if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1070 {
1071 return FALSE;
1072 }
1073
1074 p_buf->event = BTIF_MEDIA_AUDIO_SINK_STOP_DECODING;
1075
1076 GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1077 return TRUE;
1078}
1079
1080/*******************************************************************************
1081 **
1082 ** Function btif_media_task_start_decoding_req
1083 **
1084 ** Description
1085 **
1086 ** Returns TRUE is success
1087 **
1088 *******************************************************************************/
1089BOOLEAN btif_media_task_start_decoding_req(void)
1090{
1091 BT_HDR *p_buf;
1092
1093 if(btif_media_cb.is_rx_timer)
1094 return FALSE; /* if timer is already running no need to send message */
1095
1096 if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1097 {
1098 return FALSE;
1099 }
1100
1101 p_buf->event = BTIF_MEDIA_AUDIO_SINK_START_DECODING;
1102
1103 GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1104 return TRUE;
1105}
1106
1107/*****************************************************************************
1108**
1109** Function btif_reset_decoder
1110**
1111** Description
1112**
1113** Returns
1114**
1115*******************************************************************************/
1116
1117void btif_reset_decoder(UINT8 *p_av)
1118{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001119 APPL_TRACE_EVENT("btif_reset_decoder");
1120 APPL_TRACE_DEBUG("btif_reset_decoder p_codec_info[%x:%x:%x:%x:%x:%x]",
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301121 p_av[1], p_av[2], p_av[3],
1122 p_av[4], p_av[5], p_av[6]);
1123
1124 tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf;
1125 if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_SINK_CFG_UPDATE))))
1126 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001127 APPL_TRACE_EVENT("btif_reset_decoder No Buffer ");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301128 return;
1129 }
1130
1131 memcpy(p_buf->codec_info,p_av, AVDT_CODEC_SIZE);
1132 p_buf->hdr.event = BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE;
1133
1134 GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1135}
1136
The Android Open Source Project5738f832012-12-12 16:00:35 -08001137/*****************************************************************************
1138**
1139** Function btif_a2dp_on_started
1140**
1141** Description
1142**
1143** Returns
1144**
1145*******************************************************************************/
1146
Zhihai Xu379743b2013-09-29 13:42:13 -07001147BOOLEAN btif_a2dp_on_started(tBTA_AV_START *p_av, BOOLEAN pending_start)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001148{
The Android Open Source Project5738f832012-12-12 16:00:35 -08001149 tBTIF_STATUS status;
Zhihai Xu379743b2013-09-29 13:42:13 -07001150 BOOLEAN ack = FALSE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001151
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001152 APPL_TRACE_EVENT("## ON A2DP STARTED ##");
Bhakthavatsala Raghavendraa86504f2014-11-24 22:35:55 -08001153 med_task_perf_systrace_enabled();
The Android Open Source Project5738f832012-12-12 16:00:35 -08001154
Mattias Agren5fd74f02013-04-05 19:04:35 +02001155 if (p_av == NULL)
1156 {
1157 /* ack back a local start request */
1158 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
Zhihai Xu379743b2013-09-29 13:42:13 -07001159 return TRUE;
Mattias Agren5fd74f02013-04-05 19:04:35 +02001160 }
1161
The Android Open Source Project5738f832012-12-12 16:00:35 -08001162 if (p_av->status == BTA_AV_SUCCESS)
1163 {
1164 if (p_av->suspending == FALSE)
1165 {
1166 if (p_av->initiator)
1167 {
Zhihai Xu379743b2013-09-29 13:42:13 -07001168 if (pending_start) {
1169 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
1170 ack = TRUE;
1171 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001172 }
1173 else
1174 {
1175 /* we were remotely started, make sure codec
1176 is setup before datapath is started */
1177 btif_a2dp_setup_codec();
1178 }
1179
1180 /* media task is autostarted upon a2dp audiopath connection */
1181 }
1182 }
Zhihai Xu379743b2013-09-29 13:42:13 -07001183 else if (pending_start)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001184 {
1185 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
Zhihai Xu379743b2013-09-29 13:42:13 -07001186 ack = TRUE;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001187 }
Zhihai Xu379743b2013-09-29 13:42:13 -07001188 return ack;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001189}
1190
1191
1192/*****************************************************************************
1193**
Mattias Agren5fd74f02013-04-05 19:04:35 +02001194** Function btif_a2dp_ack_fail
1195**
1196** Description
1197**
1198** Returns
1199**
1200*******************************************************************************/
1201
1202void btif_a2dp_ack_fail(void)
1203{
1204 tBTIF_STATUS status;
1205
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001206 APPL_TRACE_EVENT("## A2DP_CTRL_ACK_FAILURE ##");
Mattias Agren5fd74f02013-04-05 19:04:35 +02001207 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
1208}
1209
1210/*****************************************************************************
1211**
The Android Open Source Project5738f832012-12-12 16:00:35 -08001212** Function btif_a2dp_on_stopped
1213**
1214** Description
1215**
1216** Returns
1217**
1218*******************************************************************************/
1219
1220void btif_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av)
1221{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001222 APPL_TRACE_EVENT("## ON A2DP STOPPED ##");
Mike Lockwood3e8a2422014-05-23 12:42:24 -07001223 if (btif_media_cb.peer_sep == AVDT_TSEP_SRC) /* Handling for A2DP SINK cases*/
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301224 {
1225 btif_media_cb.rx_flush = TRUE;
1226 btif_media_task_aa_rx_flush_req();
1227 btif_media_task_stop_decoding_req();
Mike Lockwood3e8a2422014-05-23 12:42:24 -07001228 UIPC_Close(UIPC_CH_ID_AV_AUDIO);
1229 btif_media_cb.data_channel_open = FALSE;
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301230 return;
1231 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001232 /* allow using this api for other than suspend */
1233 if (p_av != NULL)
1234 {
1235 if (p_av->status != BTA_AV_SUCCESS)
1236 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001237 APPL_TRACE_EVENT("AV STOP FAILED (%d)", p_av->status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001238
1239 if (p_av->initiator)
1240 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
1241 return;
1242 }
1243 }
1244
1245 /* ensure tx frames are immediately suspended */
1246 btif_media_cb.tx_flush = 1;
1247
1248 /* request to stop media task */
1249 btif_media_task_aa_tx_flush_req();
1250 btif_media_task_stop_aa_req();
1251
1252 /* once stream is fully stopped we will ack back */
1253}
1254
1255
1256/*****************************************************************************
1257**
1258** Function btif_a2dp_on_suspended
1259**
1260** Description
1261**
1262** Returns
1263**
1264*******************************************************************************/
1265
1266void btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av)
1267{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001268 APPL_TRACE_EVENT("## ON A2DP SUSPENDED ##");
Mike Lockwood3e8a2422014-05-23 12:42:24 -07001269 if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301270 {
1271 btif_media_cb.rx_flush = TRUE;
1272 btif_media_task_aa_rx_flush_req();
1273 btif_media_task_stop_decoding_req();
1274 return;
1275 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001276
1277 /* check for status failures */
1278 if (p_av->status != BTA_AV_SUCCESS)
1279 {
1280 if (p_av->initiator == TRUE)
1281 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
1282 }
1283
1284 /* once stream is fully stopped we will ack back */
1285
1286 /* ensure tx frames are immediately flushed */
1287 btif_media_cb.tx_flush = 1;
1288
1289 /* stop timer tick */
1290 btif_media_task_stop_aa_req();
1291}
1292
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301293/* when true media task discards any rx frames */
1294void btif_a2dp_set_rx_flush(BOOLEAN enable)
1295{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001296 APPL_TRACE_EVENT("## DROP RX %d ##", enable);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301297 btif_media_cb.rx_flush = enable;
1298}
1299
The Android Open Source Project5738f832012-12-12 16:00:35 -08001300/* when true media task discards any tx frames */
1301void btif_a2dp_set_tx_flush(BOOLEAN enable)
1302{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001303 APPL_TRACE_EVENT("## DROP TX %d ##", enable);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001304 btif_media_cb.tx_flush = enable;
1305}
1306
lungtsai_lin6718c6d2014-07-02 20:39:02 +08001307#if (BTA_AV_SINK_INCLUDED == TRUE)
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05301308#ifdef AVK_BACKPORT
1309void btif_a2dp_set_audio_focus_state(btif_media_AudioFocus_state state)
1310{
1311 btif_media_cb.rx_audio_focus_gained = state;
1312 if (btif_media_cb.rx_audio_focus_gained == BTIF_MEDIA_AUDIOFOCUS_LOSS)
1313 {
1314 btif_a2dp_set_rx_flush(TRUE);
1315 }
1316 if (btif_media_cb.rx_audio_focus_gained == BTIF_MEDIA_AUDIOFOCUS_GAIN)
1317 {
1318 btif_a2dp_set_rx_flush(FALSE);
1319 }
1320}
1321#endif
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301322/*******************************************************************************
1323 **
1324 ** Function btif_media_task_avk_handle_timer
1325 **
1326 ** Description
1327 **
1328 ** Returns void
1329 **
1330 *******************************************************************************/
1331static void btif_media_task_avk_handle_timer ( void )
1332{
1333 UINT8 count;
1334 tBT_SBC_HDR *p_msg;
1335 int num_sbc_frames;
1336 int num_frames_to_process;
1337
1338 count = btif_media_cb.RxSbcQ.count;
1339 if (0 == count)
1340 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001341 APPL_TRACE_DEBUG(" QUE EMPTY ");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301342 }
1343 else
1344 {
1345 if (btif_media_cb.rx_flush == TRUE)
1346 {
1347 btif_media_flush_q(&(btif_media_cb.RxSbcQ));
1348 return;
1349 }
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301350
pramod kotreshappab08a5142014-11-04 15:55:32 -08001351 if (btif_media_cb.RxSbcQ.count > 3)
1352 num_frames_to_process = 2 * btif_media_cb.frames_to_process;
1353 else
1354 num_frames_to_process = btif_media_cb.frames_to_process;
1355
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001356 APPL_TRACE_DEBUG(" Process Frames + ");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301357
1358 do
1359 {
1360 p_msg = (tBT_SBC_HDR *)GKI_getfirst(&(btif_media_cb.RxSbcQ));
1361 if (p_msg == NULL)
1362 return;
1363 num_sbc_frames = p_msg->num_frames_to_be_processed; /* num of frames in Que Packets */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001364 APPL_TRACE_DEBUG(" Frames left in topmost packet %d", num_sbc_frames);
1365 APPL_TRACE_DEBUG(" Remaining frames to process in tick %d", num_frames_to_process);
1366 APPL_TRACE_DEBUG(" Num of Packets in Que %d", btif_media_cb.RxSbcQ.count);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301367
1368 if ( num_sbc_frames > num_frames_to_process) /* Que Packet has more frames*/
1369 {
1370 p_msg->num_frames_to_be_processed= num_frames_to_process;
1371 btif_media_task_handle_inc_media(p_msg);
1372 p_msg->num_frames_to_be_processed = num_sbc_frames - num_frames_to_process;
1373 num_frames_to_process = 0;
1374 break;
1375 }
1376 else /* Que packet has less frames */
1377 {
1378 btif_media_task_handle_inc_media(p_msg);
1379 p_msg = (tBT_SBC_HDR *)GKI_dequeue(&(btif_media_cb.RxSbcQ));
1380 if( p_msg == NULL )
1381 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001382 APPL_TRACE_ERROR("Insufficient data in que ");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301383 break;
1384 }
1385 num_frames_to_process = num_frames_to_process - p_msg->num_frames_to_be_processed;
1386 GKI_freebuf(p_msg);
1387 }
1388 }while(num_frames_to_process > 0);
1389
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001390 APPL_TRACE_DEBUG(" Process Frames - ");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301391 }
1392}
1393#endif
1394
The Android Open Source Project5738f832012-12-12 16:00:35 -08001395/*******************************************************************************
1396 **
1397 ** Function btif_media_task_aa_handle_timer
1398 **
1399 ** Description
1400 **
1401 ** Returns void
1402 **
1403 *******************************************************************************/
1404
1405static void btif_media_task_aa_handle_timer(void)
1406{
1407#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
1408 static UINT16 Debug = 0;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001409 APPL_TRACE_DEBUG("btif_media_task_aa_handle_timer: %d", Debug++);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001410#endif
1411
1412 log_tstamps_us("media task tx timer");
1413
1414#if (BTA_AV_INCLUDED == TRUE)
Hemant Guptae7c4f992013-09-05 19:42:50 +05301415 if(btif_media_cb.is_tx_timer == TRUE)
1416 {
1417 btif_media_send_aa_frame();
1418 }
1419 else
1420 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001421 APPL_TRACE_ERROR("ERROR Media task Scheduled after Suspend");
Hemant Guptae7c4f992013-09-05 19:42:50 +05301422 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08001423#endif
1424}
1425
1426#if (BTA_AV_INCLUDED == TRUE)
1427/*******************************************************************************
1428 **
1429 ** Function btif_media_task_aa_handle_timer
1430 **
1431 ** Description
1432 **
1433 ** Returns void
1434 **
1435 *******************************************************************************/
1436static void btif_media_task_aa_handle_uipc_rx_rdy(void)
1437{
1438#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
1439 static UINT16 Debug = 0;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001440 APPL_TRACE_DEBUG("btif_media_task_aa_handle_uipc_rx_rdy: %d", Debug++);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001441#endif
1442
1443 /* process all the UIPC data */
1444 btif_media_aa_prep_2_send(0xFF);
1445
1446 /* send it */
1447 VERBOSE("btif_media_task_aa_handle_uipc_rx_rdy calls bta_av_ci_src_data_ready");
1448 bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO);
1449}
1450#endif
1451
1452/*******************************************************************************
1453 **
1454 ** Function btif_media_task_init
1455 **
1456 ** Description
1457 **
1458 ** Returns void
1459 **
1460 *******************************************************************************/
1461
1462void btif_media_task_init(void)
1463{
1464 memset(&(btif_media_cb), 0, sizeof(btif_media_cb));
1465
1466 UIPC_Init(NULL);
1467
1468#if (BTA_AV_INCLUDED == TRUE)
1469 UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb);
1470#endif
The Android Open Source Project5738f832012-12-12 16:00:35 -08001471}
1472/*******************************************************************************
1473 **
1474 ** Function btif_media_task
1475 **
1476 ** Description Task for SBC encoder. This task receives an
1477 ** event when the waveIn interface has a pcm data buffer
1478 ** ready. On receiving the event, handle all ready pcm
1479 ** data buffers. If stream is started, run the SBC encoder
1480 ** on each chunk of pcm samples and build an output packet
1481 ** consisting of one or more encoded SBC frames.
1482 **
1483 ** Returns void
1484 **
1485 *******************************************************************************/
1486int btif_media_task(void *p)
1487{
1488 UINT16 event;
1489 BT_HDR *p_msg;
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001490 UNUSED(p);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001491
1492 VERBOSE("================ MEDIA TASK STARTING ================");
1493
1494 btif_media_task_init();
1495
1496 media_task_running = MEDIA_TASK_STATE_ON;
1497
1498 raise_priority_a2dp(TASK_HIGH_MEDIA);
1499
1500 while (1)
1501 {
1502 event = GKI_wait(0xffff, 0);
1503
1504 VERBOSE("================= MEDIA TASK EVENT %d ===============", event);
1505
1506 if (event & BTIF_MEDIA_TASK_CMD)
1507 {
1508 /* Process all messages in the queue */
1509 while ((p_msg = (BT_HDR *) GKI_read_mbox(BTIF_MEDIA_TASK_CMD_MBOX)) != NULL)
1510 {
1511 btif_media_task_handle_cmd(p_msg);
1512 }
1513 }
1514
1515 if (event & BTIF_MEDIA_TASK_DATA)
1516 {
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301517 VERBOSE("================= Received Media Packets %d ===============", event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001518 /* Process all messages in the queue */
1519 while ((p_msg = (BT_HDR *) GKI_read_mbox(BTIF_MEDIA_TASK_DATA_MBOX)) != NULL)
1520 {
1521 btif_media_task_handle_media(p_msg);
1522 }
1523 }
1524
1525 if (event & BTIF_MEDIA_AA_TASK_TIMER)
1526 {
1527 /* advance audio timer expiration */
1528 btif_media_task_aa_handle_timer();
1529 }
1530
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301531 if (event & BTIF_MEDIA_AVK_TASK_TIMER)
1532 {
lungtsai_lin6718c6d2014-07-02 20:39:02 +08001533#if (BTA_AV_SINK_INCLUDED == TRUE)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301534 /* advance audio timer expiration for a2dp sink */
1535 btif_media_task_avk_handle_timer();
1536#endif
1537 }
1538
1539
The Android Open Source Project5738f832012-12-12 16:00:35 -08001540
1541 VERBOSE("=============== MEDIA TASK EVENT %d DONE ============", event);
1542
1543 /* When we get this event we exit the task - should only happen on GKI_shutdown */
1544 if (event & BTIF_MEDIA_TASK_KILL)
1545 {
1546 /* make sure no channels are restarted while shutting down */
1547 media_task_running = MEDIA_TASK_STATE_SHUTTING_DOWN;
1548
1549 /* this calls blocks until uipc is fully closed */
1550 UIPC_Close(UIPC_CH_ID_ALL);
1551 break;
1552 }
1553 }
1554
1555 /* Clear media task flag */
1556 media_task_running = MEDIA_TASK_STATE_OFF;
1557
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001558 APPL_TRACE_DEBUG("MEDIA TASK EXITING");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001559
1560 return 0;
1561}
1562
1563
1564/*******************************************************************************
1565 **
1566 ** Function btif_media_task_send_cmd_evt
1567 **
1568 ** Description
1569 **
1570 ** Returns TRUE is success
1571 **
1572 *******************************************************************************/
1573BOOLEAN btif_media_task_send_cmd_evt(UINT16 Evt)
1574{
1575 BT_HDR *p_buf;
1576 if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1577 {
1578 return FALSE;
1579 }
1580
1581 p_buf->event = Evt;
1582
1583 GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1584 return TRUE;
1585}
1586
1587/*******************************************************************************
1588 **
1589 ** Function btif_media_flush_q
1590 **
1591 ** Description
1592 **
1593 ** Returns void
1594 **
1595 *******************************************************************************/
1596static void btif_media_flush_q(BUFFER_Q *p_q)
1597{
Sharvil Nanavati6449e492014-06-06 01:26:23 -07001598 while (!GKI_queue_is_empty(p_q))
The Android Open Source Project5738f832012-12-12 16:00:35 -08001599 {
1600 GKI_freebuf(GKI_dequeue(p_q));
1601 }
1602}
1603
1604
1605/*******************************************************************************
1606 **
1607 ** Function btif_media_task_handle_cmd
1608 **
1609 ** Description
1610 **
1611 ** Returns void
1612 **
1613 *******************************************************************************/
1614static void btif_media_task_handle_cmd(BT_HDR *p_msg)
1615{
Mattias Agren5fd74f02013-04-05 19:04:35 +02001616 VERBOSE("btif_media_task_handle_cmd : %d %s", p_msg->event,
1617 dump_media_event(p_msg->event));
The Android Open Source Project5738f832012-12-12 16:00:35 -08001618
1619 switch (p_msg->event)
1620 {
1621#if (BTA_AV_INCLUDED == TRUE)
1622 case BTIF_MEDIA_START_AA_TX:
1623 btif_media_task_aa_start_tx();
1624 break;
1625 case BTIF_MEDIA_STOP_AA_TX:
1626 btif_media_task_aa_stop_tx();
1627 break;
1628 case BTIF_MEDIA_SBC_ENC_INIT:
1629 btif_media_task_enc_init(p_msg);
1630 break;
1631 case BTIF_MEDIA_SBC_ENC_UPDATE:
1632 btif_media_task_enc_update(p_msg);
1633 break;
1634 case BTIF_MEDIA_AUDIO_FEEDING_INIT:
1635 btif_media_task_audio_feeding_init(p_msg);
1636 break;
1637 case BTIF_MEDIA_FLUSH_AA_TX:
1638 btif_media_task_aa_tx_flush(p_msg);
1639 break;
1640 case BTIF_MEDIA_UIPC_RX_RDY:
1641 btif_media_task_aa_handle_uipc_rx_rdy();
1642 break;
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301643 case BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE:
lungtsai_lin6718c6d2014-07-02 20:39:02 +08001644#if (BTA_AV_SINK_INCLUDED == TRUE)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301645 btif_media_task_aa_handle_decoder_reset(p_msg);
1646#endif
1647 break;
1648 case BTIF_MEDIA_AUDIO_SINK_START_DECODING:
1649 btif_media_task_aa_handle_start_decoding();
1650 break;
1651 case BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK:
lungtsai_lin6718c6d2014-07-02 20:39:02 +08001652#if (BTA_AV_SINK_INCLUDED == TRUE)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301653 btif_media_task_aa_handle_clear_track();
1654#endif
1655 break;
1656 case BTIF_MEDIA_AUDIO_SINK_STOP_DECODING:
1657 btif_media_task_aa_handle_stop_decoding();
1658 break;
1659 case BTIF_MEDIA_FLUSH_AA_RX:
1660 btif_media_task_aa_rx_flush();
1661 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08001662#endif
1663 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001664 APPL_TRACE_ERROR("ERROR in btif_media_task_handle_cmd unknown event %d", p_msg->event);
The Android Open Source Project5738f832012-12-12 16:00:35 -08001665 }
1666 GKI_freebuf(p_msg);
1667 VERBOSE("btif_media_task_handle_cmd : %s DONE", dump_media_event(p_msg->event));
1668}
1669
lungtsai_lin6718c6d2014-07-02 20:39:02 +08001670#if (BTA_AV_SINK_INCLUDED == TRUE)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301671/*******************************************************************************
1672 **
1673 ** Function btif_media_task_handle_inc_media
1674 **
1675 ** Description
1676 **
1677 ** Returns void
1678 **
1679 *******************************************************************************/
1680static void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg)
1681{
1682 UINT8 *sbc_start_frame = ((UINT8*)(p_msg + 1) + p_msg->offset + 1);
1683 int count;
1684 UINT32 pcmBytes, availPcmBytes;
1685 OI_INT16 *pcmDataPointer = pcmData; /*Will be overwritten on next packet receipt*/
1686 OI_STATUS status;
1687 int num_sbc_frames = p_msg->num_frames_to_be_processed;
1688 UINT32 sbc_frame_len = p_msg->len - 1;
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05301689#ifdef AVK_BACKPORT
1690 int retwriteAudioTrack = 0;
1691#endif
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301692 availPcmBytes = 2*sizeof(pcmData);
1693
Mike Lockwood3e8a2422014-05-23 12:42:24 -07001694 if ((btif_media_cb.peer_sep == AVDT_TSEP_SNK) || (btif_media_cb.rx_flush))
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301695 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001696 APPL_TRACE_DEBUG(" State Changed happened in this tick ");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301697 return;
1698 }
Mike Lockwood3e8a2422014-05-23 12:42:24 -07001699
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05301700#ifndef AVK_BACKPORT
Mike Lockwood3e8a2422014-05-23 12:42:24 -07001701 // ignore data if no one is listening
1702 if (!btif_media_cb.data_channel_open)
1703 return;
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05301704#endif
Mike Lockwood3e8a2422014-05-23 12:42:24 -07001705
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001706 APPL_TRACE_DEBUG("Number of sbc frames %d, frame_len %d", num_sbc_frames, sbc_frame_len);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301707
1708 for(count = 0; count < num_sbc_frames && sbc_frame_len != 0; count ++)
1709 {
1710 pcmBytes = availPcmBytes;
Hemant Guptace247652014-03-20 20:47:04 +05301711 status = OI_CODEC_SBC_DecodeFrame(&context, (const OI_BYTE**)&sbc_start_frame,
1712 (OI_UINT32 *)&sbc_frame_len,
1713 (OI_INT16 *)pcmDataPointer,
1714 (OI_UINT32 *)&pcmBytes);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301715 if (!OI_SUCCESS(status)) {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001716 APPL_TRACE_ERROR("Decoding failure: %d\n", status);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301717 break;
1718 }
1719 availPcmBytes -= pcmBytes;
1720 pcmDataPointer += pcmBytes/2;
1721 p_msg->offset += (p_msg->len - 1) - sbc_frame_len;
1722 p_msg->len = sbc_frame_len + 1;
1723 }
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05301724#ifdef AVK_BACKPORT
1725 retwriteAudioTrack = btWriteData((void*)pcmData, (2*sizeof(pcmData) - availPcmBytes));
rakesh reddy03b63652014-08-14 11:58:45 +05301726 APPL_TRACE_LATENCY_AUDIO("Written to audio, seq number %d", p_msg->layer_specific);
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05301727#else
Mike Lockwood3e8a2422014-05-23 12:42:24 -07001728 UIPC_Send(UIPC_CH_ID_AV_AUDIO, 0, (UINT8 *)pcmData, (2*sizeof(pcmData) - availPcmBytes));
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05301729#endif
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301730}
1731#endif
1732
The Android Open Source Project5738f832012-12-12 16:00:35 -08001733/*******************************************************************************
1734 **
1735 ** Function btif_media_task_handle_media
1736 **
1737 ** Description
1738 **
1739 ** Returns void
1740 **
1741 *******************************************************************************/
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301742static void btif_media_task_handle_media(BT_HDR*p_msg)
The Android Open Source Project5738f832012-12-12 16:00:35 -08001743{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001744 APPL_TRACE_DEBUG(" btif_media_task_handle_media ");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001745 GKI_freebuf(p_msg);
1746}
The Android Open Source Project5738f832012-12-12 16:00:35 -08001747#if (BTA_AV_INCLUDED == TRUE)
1748/*******************************************************************************
1749 **
1750 ** Function btif_media_task_enc_init_req
1751 **
1752 ** Description
1753 **
1754 ** Returns TRUE is success
1755 **
1756 *******************************************************************************/
1757BOOLEAN btif_media_task_enc_init_req(tBTIF_MEDIA_INIT_AUDIO *p_msg)
1758{
1759 tBTIF_MEDIA_INIT_AUDIO *p_buf;
1760 if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_INIT_AUDIO))))
1761 {
1762 return FALSE;
1763 }
1764
1765 memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO));
1766 p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_INIT;
1767
1768 GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1769 return TRUE;
1770}
1771
1772/*******************************************************************************
1773 **
1774 ** Function btif_media_task_enc_update_req
1775 **
1776 ** Description
1777 **
1778 ** Returns TRUE is success
1779 **
1780 *******************************************************************************/
1781BOOLEAN btif_media_task_enc_update_req(tBTIF_MEDIA_UPDATE_AUDIO *p_msg)
1782{
1783 tBTIF_MEDIA_UPDATE_AUDIO *p_buf;
1784 if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_UPDATE_AUDIO))))
1785 {
1786 return FALSE;
1787 }
1788
1789 memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_UPDATE_AUDIO));
1790 p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_UPDATE;
1791
1792 GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1793 return TRUE;
1794}
1795
1796/*******************************************************************************
1797 **
1798 ** Function btif_media_task_audio_feeding_init_req
1799 **
1800 ** Description
1801 **
1802 ** Returns TRUE is success
1803 **
1804 *******************************************************************************/
1805BOOLEAN btif_media_task_audio_feeding_init_req(tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_msg)
1806{
1807 tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_buf;
1808 if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING))))
1809 {
1810 return FALSE;
1811 }
1812
1813 memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING));
1814 p_buf->hdr.event = BTIF_MEDIA_AUDIO_FEEDING_INIT;
1815
1816 GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1817 return TRUE;
1818}
1819
1820/*******************************************************************************
1821 **
1822 ** Function btif_media_task_start_aa_req
1823 **
1824 ** Description
1825 **
1826 ** Returns TRUE is success
1827 **
1828 *******************************************************************************/
1829BOOLEAN btif_media_task_start_aa_req(void)
1830{
1831 BT_HDR *p_buf;
1832 if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1833 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001834 APPL_TRACE_EVENT("GKI failed");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001835 return FALSE;
1836 }
1837
1838 p_buf->event = BTIF_MEDIA_START_AA_TX;
1839
1840 GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1841 return TRUE;
1842}
1843
1844/*******************************************************************************
1845 **
1846 ** Function btif_media_task_stop_aa_req
1847 **
1848 ** Description
1849 **
1850 ** Returns TRUE is success
1851 **
1852 *******************************************************************************/
1853BOOLEAN btif_media_task_stop_aa_req(void)
1854{
1855 BT_HDR *p_buf;
1856 if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1857 {
1858 return FALSE;
1859 }
1860
1861 p_buf->event = BTIF_MEDIA_STOP_AA_TX;
1862
1863 GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1864 return TRUE;
1865}
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301866/*******************************************************************************
1867 **
1868 ** Function btif_media_task_aa_rx_flush_req
1869 **
1870 ** Description
1871 **
1872 ** Returns TRUE is success
1873 **
1874 *******************************************************************************/
1875BOOLEAN btif_media_task_aa_rx_flush_req(void)
1876{
1877 BT_HDR *p_buf;
1878
1879 if (GKI_queue_is_empty(&(btif_media_cb.RxSbcQ))== TRUE) /* Que is already empty */
1880 return TRUE;
1881
1882 if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1883 {
1884 return FALSE;
1885 }
1886
1887 p_buf->event = BTIF_MEDIA_FLUSH_AA_RX;
1888
1889 GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1890 return TRUE;
1891}
The Android Open Source Project5738f832012-12-12 16:00:35 -08001892
1893/*******************************************************************************
1894 **
1895 ** Function btif_media_task_aa_tx_flush_req
1896 **
1897 ** Description
1898 **
1899 ** Returns TRUE is success
1900 **
1901 *******************************************************************************/
1902BOOLEAN btif_media_task_aa_tx_flush_req(void)
1903{
1904 BT_HDR *p_buf;
1905 if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1906 {
1907 return FALSE;
1908 }
1909
1910 p_buf->event = BTIF_MEDIA_FLUSH_AA_TX;
1911
1912 GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1913 return TRUE;
1914}
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301915/*******************************************************************************
1916 **
1917 ** Function btif_media_task_aa_rx_flush
1918 **
1919 ** Description
1920 **
1921 ** Returns void
1922 **
1923 *******************************************************************************/
1924static void btif_media_task_aa_rx_flush(void)
1925{
1926 /* Flush all enqueued GKI SBC buffers (encoded) */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001927 APPL_TRACE_DEBUG("btif_media_task_aa_rx_flush");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05301928
1929 btif_media_flush_q(&(btif_media_cb.RxSbcQ));
1930}
1931
The Android Open Source Project5738f832012-12-12 16:00:35 -08001932
1933/*******************************************************************************
1934 **
1935 ** Function btif_media_task_aa_tx_flush
1936 **
1937 ** Description
1938 **
1939 ** Returns void
1940 **
1941 *******************************************************************************/
1942static void btif_media_task_aa_tx_flush(BT_HDR *p_msg)
1943{
Mike J. Chen5cd8bff2014-01-31 18:16:59 -08001944 UNUSED(p_msg);
1945
The Android Open Source Project5738f832012-12-12 16:00:35 -08001946 /* Flush all enqueued GKI music buffers (encoded) */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001947 APPL_TRACE_DEBUG("btif_media_task_aa_tx_flush");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001948
Mattias Agrenb8ceaa42013-04-05 17:27:27 +02001949 btif_media_cb.media_feeding_state.pcm.counter = 0;
1950 btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
1951
The Android Open Source Project5738f832012-12-12 16:00:35 -08001952 btif_media_flush_q(&(btif_media_cb.TxAaQ));
1953
1954 UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REQ_RX_FLUSH, NULL);
1955}
1956
1957/*******************************************************************************
1958 **
1959 ** Function btif_media_task_enc_init
1960 **
1961 ** Description Initialize encoding task
1962 **
1963 ** Returns void
1964 **
1965 *******************************************************************************/
1966static void btif_media_task_enc_init(BT_HDR *p_msg)
1967{
1968 tBTIF_MEDIA_INIT_AUDIO *pInitAudio = (tBTIF_MEDIA_INIT_AUDIO *) p_msg;
1969
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001970 APPL_TRACE_DEBUG("btif_media_task_enc_init");
The Android Open Source Project5738f832012-12-12 16:00:35 -08001971
1972 btif_media_cb.timestamp = 0;
1973
1974 /* SBC encoder config (enforced even if not used) */
1975 btif_media_cb.encoder.s16ChannelMode = pInitAudio->ChannelMode;
1976 btif_media_cb.encoder.s16NumOfSubBands = pInitAudio->NumOfSubBands;
1977 btif_media_cb.encoder.s16NumOfBlocks = pInitAudio->NumOfBlocks;
1978 btif_media_cb.encoder.s16AllocationMethod = pInitAudio->AllocationMethod;
1979 btif_media_cb.encoder.s16SamplingFreq = pInitAudio->SamplingFreq;
1980
Mattias Agrenb8ceaa42013-04-05 17:27:27 +02001981 btif_media_cb.encoder.u16BitRate = btif_media_task_get_sbc_rate();
1982
The Android Open Source Project5738f832012-12-12 16:00:35 -08001983 /* Default transcoding is PCM to SBC, modified by feeding configuration */
1984 btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC;
1985 btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE-BTIF_MEDIA_AA_SBC_OFFSET-sizeof(BT_HDR))
1986 < pInitAudio->MtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET
1987 - sizeof(BT_HDR)) : pInitAudio->MtuSize;
1988
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001989 APPL_TRACE_EVENT("btif_media_task_enc_init busy %d, mtu %d, peer mtu %d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001990 btif_media_cb.busy_level, btif_media_cb.TxAaMtuSize, pInitAudio->MtuSize);
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07001991 APPL_TRACE_EVENT(" ch mode %d, subnd %d, nb blk %d, alloc %d, rate %d, freq %d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08001992 btif_media_cb.encoder.s16ChannelMode, btif_media_cb.encoder.s16NumOfSubBands,
1993 btif_media_cb.encoder.s16NumOfBlocks,
1994 btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
1995 btif_media_cb.encoder.s16SamplingFreq);
1996
1997 /* Reset entirely the SBC encoder */
1998 SBC_Encoder_Init(&(btif_media_cb.encoder));
Ayan Ghoshec40bdb2013-11-11 19:25:16 +05301999
2000 btif_media_cb.TxNumSBCFrames = check_for_max_number_of_frames_per_packet();
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002001 APPL_TRACE_DEBUG("btif_media_task_enc_init bit pool %d", btif_media_cb.encoder.s16BitPool);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002002}
2003
2004/*******************************************************************************
2005 **
2006 ** Function btif_media_task_enc_update
2007 **
2008 ** Description Update encoding task
2009 **
2010 ** Returns void
2011 **
2012 *******************************************************************************/
2013
2014static void btif_media_task_enc_update(BT_HDR *p_msg)
2015{
2016 tBTIF_MEDIA_UPDATE_AUDIO * pUpdateAudio = (tBTIF_MEDIA_UPDATE_AUDIO *) p_msg;
2017 SBC_ENC_PARAMS *pstrEncParams = &btif_media_cb.encoder;
2018 UINT16 s16SamplingFreq;
Andre Eisenbacha391bf12014-08-08 20:22:31 -07002019 SINT16 s16BitPool = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002020 SINT16 s16BitRate;
2021 SINT16 s16FrameLen;
2022 UINT8 protect = 0;
2023
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002024 APPL_TRACE_DEBUG("btif_media_task_enc_update : minmtu %d, maxbp %d minbp %d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002025 pUpdateAudio->MinMtuSize, pUpdateAudio->MaxBitPool, pUpdateAudio->MinBitPool);
2026
Ayan Ghoshec40bdb2013-11-11 19:25:16 +05302027 if (!pstrEncParams->s16NumOfSubBands)
2028 {
2029 APPL_TRACE_ERROR("Error: SubBands are set to 0, resetting to Max");
2030 pstrEncParams->s16NumOfSubBands = SBC_MAX_NUM_OF_SUBBANDS;
2031 }
2032 if (!pstrEncParams->s16NumOfBlocks)
2033 {
2034 APPL_TRACE_ERROR("Error: Blocks are set to 0, resetting to Max");
2035 pstrEncParams->s16NumOfBlocks = SBC_MAX_NUM_OF_BLOCKS;
2036 }
2037 if (!pstrEncParams->s16NumOfChannels)
2038 {
2039 APPL_TRACE_ERROR("Error: Channels are set to 0, resetting to Max");
2040 pstrEncParams->s16NumOfChannels = SBC_MAX_NUM_OF_CHANNELS;
2041 }
2042
The Android Open Source Project5738f832012-12-12 16:00:35 -08002043 /* Only update the bitrate and MTU size while timer is running to make sure it has been initialized */
2044 //if (btif_media_cb.is_tx_timer)
2045 {
Mattias Agren5fd74f02013-04-05 19:04:35 +02002046 btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE -
2047 BTIF_MEDIA_AA_SBC_OFFSET - sizeof(BT_HDR))
The Android Open Source Project5738f832012-12-12 16:00:35 -08002048 < pUpdateAudio->MinMtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET
2049 - sizeof(BT_HDR)) : pUpdateAudio->MinMtuSize;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002050 /* Set the initial target bit rate */
Mattias Agrenb8ceaa42013-04-05 17:27:27 +02002051 pstrEncParams->u16BitRate = btif_media_task_get_sbc_rate();
The Android Open Source Project5738f832012-12-12 16:00:35 -08002052
2053 if (pstrEncParams->s16SamplingFreq == SBC_sf16000)
2054 s16SamplingFreq = 16000;
2055 else if (pstrEncParams->s16SamplingFreq == SBC_sf32000)
2056 s16SamplingFreq = 32000;
2057 else if (pstrEncParams->s16SamplingFreq == SBC_sf44100)
2058 s16SamplingFreq = 44100;
2059 else
2060 s16SamplingFreq = 48000;
2061
2062 do
2063 {
Andre Eisenbacha391bf12014-08-08 20:22:31 -07002064 if (pstrEncParams->s16NumOfBlocks == 0 || pstrEncParams->s16NumOfSubBands == 0
2065 || pstrEncParams->s16NumOfChannels == 0)
2066 {
2067 APPL_TRACE_ERROR("btif_media_task_enc_update() - Avoiding division by zero...");
2068 APPL_TRACE_ERROR("btif_media_task_enc_update() - block=%d, subBands=%d, channels=%d",
2069 pstrEncParams->s16NumOfBlocks, pstrEncParams->s16NumOfSubBands,
2070 pstrEncParams->s16NumOfChannels);
2071 break;
2072 }
2073
The Android Open Source Project5738f832012-12-12 16:00:35 -08002074 if ((pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) ||
2075 (pstrEncParams->s16ChannelMode == SBC_STEREO) )
2076 {
2077 s16BitPool = (SINT16)( (pstrEncParams->u16BitRate *
2078 pstrEncParams->s16NumOfSubBands * 1000 / s16SamplingFreq)
2079 -( (32 + (4 * pstrEncParams->s16NumOfSubBands *
2080 pstrEncParams->s16NumOfChannels)
2081 + ( (pstrEncParams->s16ChannelMode - 2) *
2082 pstrEncParams->s16NumOfSubBands ) )
2083 / pstrEncParams->s16NumOfBlocks) );
2084
2085 s16FrameLen = 4 + (4*pstrEncParams->s16NumOfSubBands*
2086 pstrEncParams->s16NumOfChannels)/8
2087 + ( ((pstrEncParams->s16ChannelMode - 2) *
2088 pstrEncParams->s16NumOfSubBands)
2089 + (pstrEncParams->s16NumOfBlocks * s16BitPool) ) / 8;
2090
2091 s16BitRate = (8 * s16FrameLen * s16SamplingFreq)
2092 / (pstrEncParams->s16NumOfSubBands *
2093 pstrEncParams->s16NumOfBlocks * 1000);
2094
2095 if (s16BitRate > pstrEncParams->u16BitRate)
2096 s16BitPool--;
2097
2098 if(pstrEncParams->s16NumOfSubBands == 8)
2099 s16BitPool = (s16BitPool > 255) ? 255 : s16BitPool;
2100 else
2101 s16BitPool = (s16BitPool > 128) ? 128 : s16BitPool;
2102 }
2103 else
2104 {
2105 s16BitPool = (SINT16)( ((pstrEncParams->s16NumOfSubBands *
2106 pstrEncParams->u16BitRate * 1000)
2107 / (s16SamplingFreq * pstrEncParams->s16NumOfChannels))
2108 -( ( (32 / pstrEncParams->s16NumOfChannels) +
2109 (4 * pstrEncParams->s16NumOfSubBands) )
2110 / pstrEncParams->s16NumOfBlocks ) );
2111
2112 pstrEncParams->s16BitPool = (s16BitPool >
2113 (16 * pstrEncParams->s16NumOfSubBands))
2114 ? (16*pstrEncParams->s16NumOfSubBands) : s16BitPool;
2115 }
2116
2117 if (s16BitPool < 0)
2118 {
2119 s16BitPool = 0;
2120 }
2121
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002122 APPL_TRACE_EVENT("bitpool candidate : %d (%d kbps)",
Mattias Agren5fd74f02013-04-05 19:04:35 +02002123 s16BitPool, pstrEncParams->u16BitRate);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002124
2125 if (s16BitPool > pUpdateAudio->MaxBitPool)
2126 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002127 APPL_TRACE_DEBUG("btif_media_task_enc_update computed bitpool too large (%d)",
Mattias Agren5fd74f02013-04-05 19:04:35 +02002128 s16BitPool);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002129 /* Decrease bitrate */
2130 btif_media_cb.encoder.u16BitRate -= BTIF_MEDIA_BITRATE_STEP;
2131 /* Record that we have decreased the bitrate */
2132 protect |= 1;
2133 }
2134 else if (s16BitPool < pUpdateAudio->MinBitPool)
2135 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002136 APPL_TRACE_WARNING("btif_media_task_enc_update computed bitpool too small (%d)", s16BitPool);
Andre Eisenbach4e3593a2014-07-08 12:33:38 -07002137
The Android Open Source Project5738f832012-12-12 16:00:35 -08002138 /* Increase bitrate */
Andre Eisenbach4e3593a2014-07-08 12:33:38 -07002139 UINT16 previous_u16BitRate = btif_media_cb.encoder.u16BitRate;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002140 btif_media_cb.encoder.u16BitRate += BTIF_MEDIA_BITRATE_STEP;
2141 /* Record that we have increased the bitrate */
2142 protect |= 2;
Andre Eisenbach4e3593a2014-07-08 12:33:38 -07002143 /* Check over-flow */
2144 if (btif_media_cb.encoder.u16BitRate < previous_u16BitRate)
2145 protect |= 3;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002146 }
2147 else
2148 {
2149 break;
2150 }
2151 /* In case we have already increased and decreased the bitrate, just stop */
2152 if (protect == 3)
2153 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002154 APPL_TRACE_ERROR("btif_media_task_enc_update could not find bitpool in range");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002155 break;
2156 }
2157 } while (1);
2158
2159 /* Finally update the bitpool in the encoder structure */
2160 pstrEncParams->s16BitPool = s16BitPool;
2161
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002162 APPL_TRACE_DEBUG("btif_media_task_enc_update final bit rate %d, final bit pool %d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002163 btif_media_cb.encoder.u16BitRate, btif_media_cb.encoder.s16BitPool);
2164
2165 /* make sure we reinitialize encoder with new settings */
2166 SBC_Encoder_Init(&(btif_media_cb.encoder));
Ayan Ghoshec40bdb2013-11-11 19:25:16 +05302167 btif_media_cb.TxNumSBCFrames = check_for_max_number_of_frames_per_packet();
The Android Open Source Project5738f832012-12-12 16:00:35 -08002168 }
2169}
2170
2171/*******************************************************************************
2172 **
2173 ** Function btif_media_task_pcm2sbc_init
2174 **
2175 ** Description Init encoding task for PCM to SBC according to feeding
2176 **
2177 ** Returns void
2178 **
2179 *******************************************************************************/
2180static void btif_media_task_pcm2sbc_init(tBTIF_MEDIA_INIT_AUDIO_FEEDING * p_feeding)
2181{
2182 BOOLEAN reconfig_needed = FALSE;
2183
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002184 APPL_TRACE_DEBUG("PCM feeding:");
2185 APPL_TRACE_DEBUG("sampling_freq:%d", p_feeding->feeding.cfg.pcm.sampling_freq);
2186 APPL_TRACE_DEBUG("num_channel:%d", p_feeding->feeding.cfg.pcm.num_channel);
2187 APPL_TRACE_DEBUG("bit_per_sample:%d", p_feeding->feeding.cfg.pcm.bit_per_sample);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002188
The Android Open Source Project5738f832012-12-12 16:00:35 -08002189 /* Check the PCM feeding sampling_freq */
2190 switch (p_feeding->feeding.cfg.pcm.sampling_freq)
2191 {
2192 case 8000:
2193 case 12000:
2194 case 16000:
2195 case 24000:
2196 case 32000:
2197 case 48000:
2198 /* For these sampling_freq the AV connection must be 48000 */
2199 if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf48000)
2200 {
2201 /* Reconfiguration needed at 48000 */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002202 APPL_TRACE_DEBUG("SBC Reconfiguration needed at 48000");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002203 btif_media_cb.encoder.s16SamplingFreq = SBC_sf48000;
2204 reconfig_needed = TRUE;
2205 }
2206 break;
2207
2208 case 11025:
2209 case 22050:
2210 case 44100:
2211 /* For these sampling_freq the AV connection must be 44100 */
2212 if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf44100)
2213 {
2214 /* Reconfiguration needed at 44100 */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002215 APPL_TRACE_DEBUG("SBC Reconfiguration needed at 44100");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002216 btif_media_cb.encoder.s16SamplingFreq = SBC_sf44100;
2217 reconfig_needed = TRUE;
2218 }
2219 break;
2220 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002221 APPL_TRACE_DEBUG("Feeding PCM sampling_freq unsupported");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002222 break;
2223 }
2224
2225 /* Some AV Headsets do not support Mono => always ask for Stereo */
2226 if (btif_media_cb.encoder.s16ChannelMode == SBC_MONO)
2227 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002228 APPL_TRACE_DEBUG("SBC Reconfiguration needed in Stereo");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002229 btif_media_cb.encoder.s16ChannelMode = SBC_JOINT_STEREO;
2230 reconfig_needed = TRUE;
2231 }
2232
2233 if (reconfig_needed != FALSE)
2234 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002235 APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init :: mtu %d", btif_media_cb.TxAaMtuSize);
2236 APPL_TRACE_DEBUG("ch mode %d, nbsubd %d, nb %d, alloc %d, rate %d, freq %d",
Mattias Agren5fd74f02013-04-05 19:04:35 +02002237 btif_media_cb.encoder.s16ChannelMode,
2238 btif_media_cb.encoder.s16NumOfSubBands, btif_media_cb.encoder.s16NumOfBlocks,
2239 btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
2240 btif_media_cb.encoder.s16SamplingFreq);
2241
The Android Open Source Project5738f832012-12-12 16:00:35 -08002242 SBC_Encoder_Init(&(btif_media_cb.encoder));
2243 }
2244 else
2245 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002246 APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init no SBC reconfig needed");
The Android Open Source Project5738f832012-12-12 16:00:35 -08002247 }
2248}
2249
2250
2251/*******************************************************************************
2252 **
2253 ** Function btif_media_task_audio_feeding_init
2254 **
2255 ** Description Initialize the audio path according to the feeding format
2256 **
2257 ** Returns void
2258 **
2259 *******************************************************************************/
2260static void btif_media_task_audio_feeding_init(BT_HDR *p_msg)
2261{
2262 tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_feeding = (tBTIF_MEDIA_INIT_AUDIO_FEEDING *) p_msg;
2263
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002264 APPL_TRACE_DEBUG("btif_media_task_audio_feeding_init format:%d", p_feeding->feeding.format);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002265
2266 /* Save Media Feeding information */
2267 btif_media_cb.feeding_mode = p_feeding->feeding_mode;
2268 btif_media_cb.media_feeding = p_feeding->feeding;
2269
2270 /* Handle different feeding formats */
2271 switch (p_feeding->feeding.format)
2272 {
2273 case BTIF_AV_CODEC_PCM:
2274 btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC;
2275 btif_media_task_pcm2sbc_init(p_feeding);
2276 break;
2277
2278 default :
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002279 APPL_TRACE_ERROR("unknown feeding format %d", p_feeding->feeding.format);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002280 break;
2281 }
2282}
2283
Mike Lockwood3e8a2422014-05-23 12:42:24 -07002284int btif_a2dp_get_track_frequency(UINT8 frequency) {
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302285 int freq = 48000;
2286 switch (frequency) {
2287 case A2D_SBC_IE_SAMP_FREQ_16:
2288 freq = 16000;
2289 break;
2290 case A2D_SBC_IE_SAMP_FREQ_32:
2291 freq = 32000;
2292 break;
2293 case A2D_SBC_IE_SAMP_FREQ_44:
2294 freq = 44100;
2295 break;
2296 case A2D_SBC_IE_SAMP_FREQ_48:
2297 freq = 48000;
2298 break;
2299 }
2300 return freq;
2301}
2302
Mike Lockwood3e8a2422014-05-23 12:42:24 -07002303int btif_a2dp_get_track_channel_count(UINT8 channeltype) {
2304 int count = 1;
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302305 switch (channeltype) {
2306 case A2D_SBC_IE_CH_MD_MONO:
Mike Lockwood3e8a2422014-05-23 12:42:24 -07002307 count = 1;
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302308 break;
2309 case A2D_SBC_IE_CH_MD_DUAL:
2310 case A2D_SBC_IE_CH_MD_STEREO:
2311 case A2D_SBC_IE_CH_MD_JOINT:
Mike Lockwood3e8a2422014-05-23 12:42:24 -07002312 count = 2;
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302313 break;
2314 }
Mike Lockwood3e8a2422014-05-23 12:42:24 -07002315 return count;
2316}
2317
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05302318#ifdef AVK_BACKPORT
2319int a2dp_get_track_channel_type(UINT8 channeltype) {
2320 int count = 1;
2321 switch (channeltype) {
2322 case A2D_SBC_IE_CH_MD_MONO:
2323 count = 1;
2324 break;
2325 case A2D_SBC_IE_CH_MD_DUAL:
2326 case A2D_SBC_IE_CH_MD_STEREO:
2327 case A2D_SBC_IE_CH_MD_JOINT:
2328 count = 3;
2329 break;
2330 }
2331 return count;
2332}
2333#endif
2334
Mike Lockwood3e8a2422014-05-23 12:42:24 -07002335void btif_a2dp_set_peer_sep(UINT8 sep) {
2336 btif_media_cb.peer_sep = sep;
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302337}
2338
2339/*******************************************************************************
2340 **
2341 ** Function btif_media_task_aa_handle_stop_decoding
2342 **
2343 ** Description
2344 **
2345 ** Returns void
2346 **
2347 *******************************************************************************/
2348static void btif_media_task_aa_handle_stop_decoding(void )
2349{
2350 btif_media_cb.is_rx_timer = FALSE;
2351 GKI_stop_timer(BTIF_MEDIA_AVK_TASK_TIMER_ID);
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05302352#ifdef AVK_BACKPORT
2353 btPauseTrack();
2354#endif
2355
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302356}
2357
2358/*******************************************************************************
2359 **
2360 ** Function btif_media_task_aa_handle_start_decoding
2361 **
2362 ** Description
2363 **
2364 ** Returns void
2365 **
2366 *******************************************************************************/
2367static void btif_media_task_aa_handle_start_decoding(void )
2368{
2369 if(btif_media_cb.is_rx_timer == TRUE)
2370 return;
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05302371#ifdef AVK_BACKPORT
2372 btStartTrack();
2373#endif
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302374 btif_media_cb.is_rx_timer = TRUE;
2375 GKI_start_timer(BTIF_MEDIA_AVK_TASK_TIMER_ID, GKI_MS_TO_TICKS(BTIF_SINK_MEDIA_TIME_TICK), TRUE);
2376}
2377
lungtsai_lin6718c6d2014-07-02 20:39:02 +08002378#if (BTA_AV_SINK_INCLUDED == TRUE)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302379
2380static void btif_media_task_aa_handle_clear_track (void)
2381{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002382 APPL_TRACE_DEBUG("btif_media_task_aa_handle_clear_track");
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05302383#ifdef AVK_BACKPORT
2384 btStopTrack();
2385 btDeleteTrack();
2386#endif
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302387}
2388
2389/*******************************************************************************
2390 **
2391 ** Function btif_media_task_aa_handle_decoder_reset
2392 **
2393 ** Description
2394 **
2395 ** Returns void
2396 **
2397 *******************************************************************************/
2398static void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg)
2399{
2400 tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf = (tBTIF_MEDIA_SINK_CFG_UPDATE*) p_msg;
2401 tA2D_STATUS a2d_status;
2402 tA2D_SBC_CIE sbc_cie;
2403 OI_STATUS status;
Hemant Guptace247652014-03-20 20:47:04 +05302404 UINT32 freq_multiple = 48*20; /* frequency multiple for 20ms of data , initialize with 48K*/
2405 UINT32 num_blocks = 16;
2406 UINT32 num_subbands = 8;
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302407
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002408 APPL_TRACE_DEBUG("btif_media_task_aa_handle_decoder_reset p_codec_info[%x:%x:%x:%x:%x:%x]",
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302409 p_buf->codec_info[1], p_buf->codec_info[2], p_buf->codec_info[3],
2410 p_buf->codec_info[4], p_buf->codec_info[5], p_buf->codec_info[6]);
2411
2412 a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_buf->codec_info, FALSE);
2413 if (a2d_status != A2D_SUCCESS)
2414 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002415 APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302416 return;
2417 }
Mike Lockwood3e8a2422014-05-23 12:42:24 -07002418
2419 btif_media_cb.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq);
2420 btif_media_cb.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode);
2421
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05302422#ifndef AVK_BACKPORT
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302423 btif_media_cb.rx_flush = FALSE;
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05302424#endif
2425
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002426 APPL_TRACE_DEBUG("Reset to sink role");
Hemant Guptace247652014-03-20 20:47:04 +05302427 status = OI_CODEC_SBC_DecoderReset(&context, contextData, sizeof(contextData), 2, 2, FALSE);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302428 if (!OI_SUCCESS(status)) {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002429 APPL_TRACE_ERROR("OI_CODEC_SBC_DecoderReset failed with error code %d\n", status);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302430 }
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05302431#ifdef AVK_BACKPORT
2432 APPL_TRACE_DEBUG("A2dpSink: Crate Track");
2433 if (btCreateTrack(btif_a2dp_get_track_frequency(sbc_cie.samp_freq), a2dp_get_track_channel_type(sbc_cie.ch_mode)) == -1) {
2434 APPL_TRACE_ERROR("A2dpSink: Track creation fails!!!");
2435 return;
2436 }
2437#else
Mike Lockwood3e8a2422014-05-23 12:42:24 -07002438 UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
AnubhavGuptaed0a8b12014-08-13 14:26:14 +05302439#endif
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302440
2441 switch(sbc_cie.samp_freq)
2442 {
2443 case A2D_SBC_IE_SAMP_FREQ_16:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002444 APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302445 freq_multiple = 16*20;
2446 break;
2447 case A2D_SBC_IE_SAMP_FREQ_32:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002448 APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302449 freq_multiple = 32*20;
2450 break;
2451 case A2D_SBC_IE_SAMP_FREQ_44:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002452 APPL_TRACE_DEBUG("\tsamp_freq:%d (44100)", sbc_cie.samp_freq);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302453 freq_multiple = 441*2;
2454 break;
2455 case A2D_SBC_IE_SAMP_FREQ_48:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002456 APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302457 freq_multiple = 48*20;
2458 break;
2459 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002460 APPL_TRACE_DEBUG(" Unknown Frequency ");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302461 break;
2462 }
2463
2464 switch(sbc_cie.ch_mode)
2465 {
2466 case A2D_SBC_IE_CH_MD_MONO:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002467 APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302468 break;
2469 case A2D_SBC_IE_CH_MD_DUAL:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002470 APPL_TRACE_DEBUG("\tch_mode:%d (DUAL)", sbc_cie.ch_mode);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302471 break;
2472 case A2D_SBC_IE_CH_MD_STEREO:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002473 APPL_TRACE_DEBUG("\tch_mode:%d (STEREO)", sbc_cie.ch_mode);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302474 break;
2475 case A2D_SBC_IE_CH_MD_JOINT:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002476 APPL_TRACE_DEBUG("\tch_mode:%d (JOINT)", sbc_cie.ch_mode);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302477 break;
2478 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002479 APPL_TRACE_DEBUG(" Unknown Mode ");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302480 break;
2481 }
2482
2483 switch(sbc_cie.block_len)
2484 {
2485 case A2D_SBC_IE_BLOCKS_4:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002486 APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302487 num_blocks = 4;
2488 break;
2489 case A2D_SBC_IE_BLOCKS_8:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002490 APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302491 num_blocks = 8;
2492 break;
2493 case A2D_SBC_IE_BLOCKS_12:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002494 APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302495 num_blocks = 12;
2496 break;
2497 case A2D_SBC_IE_BLOCKS_16:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002498 APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302499 num_blocks = 16;
2500 break;
2501 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002502 APPL_TRACE_DEBUG(" Unknown BlockLen ");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302503 break;
2504 }
2505
2506 switch(sbc_cie.num_subbands)
2507 {
2508 case A2D_SBC_IE_SUBBAND_4:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002509 APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302510 num_subbands = 4;
2511 break;
2512 case A2D_SBC_IE_SUBBAND_8:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002513 APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302514 num_subbands = 8;
2515 break;
2516 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002517 APPL_TRACE_DEBUG(" Unknown SubBands ");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302518 break;
2519 }
2520
2521 switch(sbc_cie.alloc_mthd)
2522 {
2523 case A2D_SBC_IE_ALLOC_MD_S:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002524 APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302525 break;
2526 case A2D_SBC_IE_ALLOC_MD_L:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002527 APPL_TRACE_DEBUG("\talloc_mthd:%d (Loudness)", sbc_cie.alloc_mthd);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302528 break;
2529 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002530 APPL_TRACE_DEBUG(" Unknown Allocation Method");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302531 break;
2532 }
2533
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002534 APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302535
2536 btif_media_cb.frames_to_process = ((freq_multiple)/(num_blocks*num_subbands)) + 1;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002537 APPL_TRACE_DEBUG(" Frames to be processed in 20 ms %d",btif_media_cb.frames_to_process);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302538}
2539#endif
2540
The Android Open Source Project5738f832012-12-12 16:00:35 -08002541/*******************************************************************************
2542 **
The Android Open Source Project5738f832012-12-12 16:00:35 -08002543 ** Function btif_media_task_feeding_state_reset
2544 **
2545 ** Description Reset the media feeding state
2546 **
2547 ** Returns void
2548 **
2549 *******************************************************************************/
2550static void btif_media_task_feeding_state_reset(void)
2551{
2552 /* By default, just clear the entire state */
2553 memset(&btif_media_cb.media_feeding_state, 0, sizeof(btif_media_cb.media_feeding_state));
Mattias Agrenb8ceaa42013-04-05 17:27:27 +02002554
2555 if (btif_media_cb.TxTranscoding == BTIF_MEDIA_TRSCD_PCM_2_SBC)
2556 {
2557 btif_media_cb.media_feeding_state.pcm.bytes_per_tick =
2558 (btif_media_cb.media_feeding.cfg.pcm.sampling_freq *
2559 btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8 *
2560 btif_media_cb.media_feeding.cfg.pcm.num_channel *
2561 BTIF_MEDIA_TIME_TICK)/1000;
2562
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002563 APPL_TRACE_WARNING("pcm bytes per tick %d",
Mattias Agrenb8ceaa42013-04-05 17:27:27 +02002564 (int)btif_media_cb.media_feeding_state.pcm.bytes_per_tick);
2565 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002566}
2567/*******************************************************************************
2568 **
2569 ** Function btif_media_task_aa_start_tx
2570 **
2571 ** Description Start media task encoding
2572 **
2573 ** Returns void
2574 **
2575 *******************************************************************************/
2576static void btif_media_task_aa_start_tx(void)
2577{
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002578 APPL_TRACE_DEBUG("btif_media_task_aa_start_tx is timer %d, feeding mode %d",
Mattias Agren5fd74f02013-04-05 19:04:35 +02002579 btif_media_cb.is_tx_timer, btif_media_cb.feeding_mode);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002580
2581 /* Use a timer to poll the UIPC, get rid of the UIPC call back */
2582 // UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_CBACK, NULL);
2583
2584 btif_media_cb.is_tx_timer = TRUE;
Andre Eisenbachf13db8a2014-07-11 16:57:24 -07002585 last_frame_us = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002586
2587 /* Reset the media feeding state */
2588 btif_media_task_feeding_state_reset();
2589
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002590 APPL_TRACE_EVENT("starting timer %d ticks (%d)",
Mattias Agren5fd74f02013-04-05 19:04:35 +02002591 GKI_MS_TO_TICKS(BTIF_MEDIA_TIME_TICK), TICKS_PER_SEC);
2592
The Android Open Source Project5738f832012-12-12 16:00:35 -08002593 GKI_start_timer(BTIF_MEDIA_AA_TASK_TIMER_ID, GKI_MS_TO_TICKS(BTIF_MEDIA_TIME_TICK), TRUE);
2594}
2595
2596/*******************************************************************************
2597 **
2598 ** Function btif_media_task_aa_stop_tx
2599 **
2600 ** Description Stop media task encoding
2601 **
2602 ** Returns void
2603 **
2604 *******************************************************************************/
2605static void btif_media_task_aa_stop_tx(void)
2606{
Rohit Singha9fb00a2013-07-27 14:46:29 +05302607 BOOLEAN is_data_path = FALSE;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002608 APPL_TRACE_DEBUG("btif_media_task_aa_stop_tx is timer: %d", btif_media_cb.is_tx_timer);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002609
2610 /* Stop the timer first */
2611 GKI_stop_timer(BTIF_MEDIA_AA_TASK_TIMER_ID);
Rohit Singha9fb00a2013-07-27 14:46:29 +05302612 if (btif_media_cb.is_tx_timer)
2613 {
2614 btif_media_cb.is_tx_timer = FALSE;
2615 is_data_path = TRUE ;
2616 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08002617 UIPC_Close(UIPC_CH_ID_AV_AUDIO);
Rohit Singha9fb00a2013-07-27 14:46:29 +05302618 /* Try to send acknowldegment once the media stream is
2619 stopped. This will make sure that the A2dp HAL layer is
2620 unblocked on wait for acknowledgment for the sent command.
2621 This resolves corner cases of AVDTP SUSPEND collision
2622 when DUT and Remote device issues SUSPEND simultaneously
2623 and due to processing of the SUSPEND request of remote,
2624 the media path is teared down. If A2dp HAL happens to wait
2625 for ACK for initiated SUSPEND, would never receive it casuing
2626 a block/wait. Due to this acknowledgement, A2dp HAL is guranteed
2627 to get ACK for any pending command in such cases. */
2628
2629 if (!is_data_path)
2630 a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002631
2632 /* audio engine stopped, reset tx suspended flag */
2633 btif_media_cb.tx_flush = 0;
Andre Eisenbachf13db8a2014-07-11 16:57:24 -07002634 last_frame_us = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002635
2636 /* Reset the media feeding state */
2637 btif_media_task_feeding_state_reset();
2638}
2639
Ayan Ghoshec40bdb2013-11-11 19:25:16 +05302640static UINT32 get_frame_length()
2641{
2642 UINT32 frame_len = 0;
2643 APPL_TRACE_DEBUG("channel mode: %d, sub-band: %d, number of block: %d, \
rakesh reddy49366a22014-12-22 18:51:24 +05302644 bitpool: %d, sampling frequency: %d, num channels: %d",
Ayan Ghoshec40bdb2013-11-11 19:25:16 +05302645 btif_media_cb.encoder.s16ChannelMode,
2646 btif_media_cb.encoder.s16NumOfSubBands,
2647 btif_media_cb.encoder.s16NumOfBlocks,
2648 btif_media_cb.encoder.s16BitPool,
rakesh reddy49366a22014-12-22 18:51:24 +05302649 btif_media_cb.encoder.s16SamplingFreq,
2650 btif_media_cb.encoder.s16NumOfChannels);
Ayan Ghoshec40bdb2013-11-11 19:25:16 +05302651
rakesh reddy49366a22014-12-22 18:51:24 +05302652 switch(btif_media_cb.encoder.s16ChannelMode)
Ayan Ghoshec40bdb2013-11-11 19:25:16 +05302653 {
2654 case SBC_MONO:
2655 case SBC_DUAL:
2656 frame_len = 4 + ((UINT32)(4 * btif_media_cb.encoder.s16NumOfSubBands *
2657 btif_media_cb.encoder.s16NumOfChannels) / 8) +
2658 ((UINT32)(btif_media_cb.encoder.s16NumOfBlocks *
2659 btif_media_cb.encoder.s16NumOfChannels *
2660 btif_media_cb.encoder.s16BitPool) / 8);
2661 break;
2662 case SBC_STEREO:
2663 frame_len = 4 + ((UINT32)(4 * btif_media_cb.encoder.s16NumOfSubBands *
2664 btif_media_cb.encoder.s16NumOfChannels) / 8) +
2665 ((UINT32)(btif_media_cb.encoder.s16NumOfBlocks *
2666 btif_media_cb.encoder.s16BitPool) / 8);
2667 break;
2668 case SBC_JOINT_STEREO:
2669 frame_len = 4 + ((UINT32)(4 * btif_media_cb.encoder.s16NumOfSubBands *
2670 btif_media_cb.encoder.s16NumOfChannels) / 8) +
2671 ((UINT32)(btif_media_cb.encoder.s16NumOfSubBands +
2672 (btif_media_cb.encoder.s16NumOfBlocks *
2673 btif_media_cb.encoder.s16BitPool)) / 8);
2674 break;
2675 default:
2676 APPL_TRACE_DEBUG("Invalid channel number");
2677 }
rakesh reddy49366a22014-12-22 18:51:24 +05302678 APPL_TRACE_DEBUG("calculated frame length: %d", frame_len);
Ayan Ghoshec40bdb2013-11-11 19:25:16 +05302679 return frame_len;
2680}
2681
2682static UINT8 check_for_max_number_of_frames_per_packet()
2683{
2684 UINT16 result = 0;
2685 UINT16 effective_mtu_size = btif_media_cb.TxAaMtuSize;
2686 UINT32 frame_len;
2687
2688 APPL_TRACE_DEBUG("original AVDTP MTU size: %d", btif_media_cb.TxAaMtuSize);
2689 if (btif_av_is_peer_edr() && (btif_av_peer_supports_3mbps() == FALSE)) {
2690 // This condition would be satisfied only if remote is EDR and supports only 2mbps
2691 // but effective AVDTP MTU size exceeds 2dh5 packet size
2692 APPL_TRACE_DEBUG("Headset is edr but does not support 3mbps");
2693 if (effective_mtu_size > MAX_2MBPS_AVDTP_MTU)
2694 {
2695 APPL_TRACE_DEBUG("restricting AVDTP MTU size to 675");
2696 effective_mtu_size = MAX_2MBPS_AVDTP_MTU;
2697 btif_media_cb.TxAaMtuSize = effective_mtu_size;
2698 }
2699 }
2700
2701 if (!btif_media_cb.encoder.s16NumOfSubBands)
2702 {
2703 APPL_TRACE_ERROR("Error: SubBands are set to 0, resetting to Max");
2704 btif_media_cb.encoder.s16NumOfSubBands = SBC_MAX_NUM_OF_SUBBANDS;
2705 }
2706 if (!btif_media_cb.encoder.s16NumOfBlocks)
2707 {
2708 APPL_TRACE_ERROR("Error: Blocks are set to 0, resetting to Max");
2709 btif_media_cb.encoder.s16NumOfBlocks = SBC_MAX_NUM_OF_BLOCKS;
2710 }
2711 if (!btif_media_cb.encoder.s16NumOfChannels)
2712 {
2713 APPL_TRACE_ERROR("Error: Channels are set to 0, resetting to Max");
2714 btif_media_cb.encoder.s16NumOfChannels = SBC_MAX_NUM_OF_CHANNELS;
2715 }
2716 frame_len = get_frame_length();
2717
2718 APPL_TRACE_DEBUG("effective Tx MTU to be considered: %d",
2719 effective_mtu_size);
2720 switch(btif_media_cb.encoder.s16SamplingFreq)
2721 {
2722 case SBC_sf44100:
2723 if(!frame_len)
2724 {
2725 APPL_TRACE_ERROR("Error: Calculating frame length, \
2726 resetting it to default");
2727 frame_len = MAX_SBC_HQ_FRAME_SIZE_44_1;
2728 }
2729 result = (effective_mtu_size - A2DP_HDR_SIZE) / frame_len;
2730 APPL_TRACE_DEBUG("max number of sbc frames: %d", result);
2731 break;
2732
2733 case SBC_sf48000:
2734 if(!frame_len)
2735 {
2736 APPL_TRACE_ERROR("Error: Calculating frame length, \
2737 resetting it to default");
2738 frame_len = MAX_SBC_HQ_FRAME_SIZE_48;
2739 }
2740 result = (effective_mtu_size - A2DP_HDR_SIZE) / frame_len;
2741 APPL_TRACE_DEBUG("max number of sbc frames: %d", result);
2742 break;
2743
2744 default:
2745 APPL_TRACE_ERROR("Error: max number of sbc frames: %d", result);
2746
2747 }
2748 return result;
2749}
2750
Christopher R. Palmerdc493ad2015-06-02 05:24:41 -04002751static inline UINT64 now_us_rounded_to_nearest_tick(void)
2752{
2753 UINT32 tick_us = BTIF_MEDIA_TIME_TICK * 1000;
2754 return (GKI_now_us() + tick_us/2) / tick_us * tick_us;
2755}
2756
The Android Open Source Project5738f832012-12-12 16:00:35 -08002757/*******************************************************************************
2758 **
2759 ** Function btif_get_num_aa_frame
2760 **
Christopher R. Palmer44e08de2015-02-14 14:14:18 -05002761 ** Description
The Android Open Source Project5738f832012-12-12 16:00:35 -08002762 **
Christopher R. Palmerdc493ad2015-06-02 05:24:41 -04002763 ** Returns The number of media frames in this time slice. When a
2764 ** partial time slice has occurred, we round to the nearest
2765 ** total number of time slices. This avoids all rounding errors
2766 ** that could occur in computing the amount of data that should
2767 ** be sent.
The Android Open Source Project5738f832012-12-12 16:00:35 -08002768 **
2769 *******************************************************************************/
Christopher R. Palmer44e08de2015-02-14 14:14:18 -05002770static UINT8 btif_get_num_aa_frame(void)
The Android Open Source Project5738f832012-12-12 16:00:35 -08002771{
Sridhar Gujje876c69b2015-02-20 15:55:44 +05302772 UINT8 result=0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002773
2774 switch (btif_media_cb.TxTranscoding)
2775 {
2776 case BTIF_MEDIA_TRSCD_PCM_2_SBC:
Ayan Ghoshec40bdb2013-11-11 19:25:16 +05302777 {
Christopher R. Palmere288e3b2015-05-27 14:06:13 -04002778 UINT32 pcm_bytes_per_frame = compute_pcm_bytes_per_frame();
Andre Eisenbachf13db8a2014-07-11 16:57:24 -07002779 UINT32 us_this_tick = BTIF_MEDIA_TIME_TICK * 1000;
Christopher R. Palmerdc493ad2015-06-02 05:24:41 -04002780 UINT64 now_us = now_us_rounded_to_nearest_tick();
Andre Eisenbachf13db8a2014-07-11 16:57:24 -07002781 if (last_frame_us != 0)
2782 us_this_tick = (now_us - last_frame_us);
2783 last_frame_us = now_us;
2784
Mattias Agrenb8ceaa42013-04-05 17:27:27 +02002785 btif_media_cb.media_feeding_state.pcm.counter +=
Andre Eisenbachf13db8a2014-07-11 16:57:24 -07002786 btif_media_cb.media_feeding_state.pcm.bytes_per_tick *
2787 us_this_tick / (BTIF_MEDIA_TIME_TICK * 1000);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002788
Sridhar Gujje876c69b2015-02-20 15:55:44 +05302789 /* calculate nbr of frames pending for this media tick */
2790 result = btif_media_cb.media_feeding_state.pcm.counter/pcm_bytes_per_frame;
Christopher R. Palmer44e08de2015-02-14 14:14:18 -05002791 if (result > MAX_PCM_FRAME_NUM_PER_TICK)
Sridhar Gujje876c69b2015-02-20 15:55:44 +05302792 {
Christopher R. Palmer44e08de2015-02-14 14:14:18 -05002793 APPL_TRACE_WARNING("%s() - Limiting frames to be sent from %d to %d"
2794 , __FUNCTION__, result, MAX_PCM_FRAME_NUM_PER_TICK);
2795 result = MAX_PCM_FRAME_NUM_PER_TICK;
Sridhar Gujje876c69b2015-02-20 15:55:44 +05302796 }
Christopher R. Palmer44e08de2015-02-14 14:14:18 -05002797 btif_media_cb.media_feeding_state.pcm.counter -= result*pcm_bytes_per_frame;
Mattias Agrenf061e742014-10-09 01:16:12 +02002798
The Android Open Source Project5738f832012-12-12 16:00:35 -08002799 VERBOSE("WRITE %d FRAMES", result);
Mattias Agrenb8ceaa42013-04-05 17:27:27 +02002800 }
2801 break;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002802
2803 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002804 APPL_TRACE_ERROR("ERROR btif_get_num_aa_frame Unsupported transcoding format 0x%x",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002805 btif_media_cb.TxTranscoding);
Christopher R. Palmer44e08de2015-02-14 14:14:18 -05002806 result = 0;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002807 break;
2808 }
2809
2810#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002811 APPL_TRACE_DEBUG("btif_get_num_aa_frame returns %d", result);
The Android Open Source Project5738f832012-12-12 16:00:35 -08002812#endif
2813
Christopher R. Palmer44e08de2015-02-14 14:14:18 -05002814 return (UINT8)result;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002815}
2816
2817/*******************************************************************************
2818 **
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302819 ** Function btif_media_sink_enque_buf
2820 **
2821 ** Description This function is called by the av_co to fill A2DP Sink Queue
2822 **
2823 **
2824 ** Returns size of the queue
2825 *******************************************************************************/
2826UINT8 btif_media_sink_enque_buf(BT_HDR *p_pkt)
2827{
2828 tBT_SBC_HDR *p_msg;
2829
2830 if(btif_media_cb.rx_flush == TRUE) /* Flush enabled, do not enque*/
2831 return btif_media_cb.RxSbcQ.count;
Christopher R. Palmere288e3b2015-05-27 14:06:13 -04002832 if(btif_media_cb.RxSbcQ.count == MAX_SINK_A2DP_FRAME_QUEUE_SZ)
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302833 {
2834 GKI_freebuf(GKI_dequeue(&(btif_media_cb.RxSbcQ)));
2835 }
2836
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002837 BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + ");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302838 /* allocate and Queue this buffer */
2839 if ((p_msg = (tBT_SBC_HDR *) GKI_getbuf(sizeof(tBT_SBC_HDR) +
2840 p_pkt->offset+ p_pkt->len)) != NULL)
2841 {
2842 memcpy(p_msg, p_pkt, (sizeof(BT_HDR) + p_pkt->offset + p_pkt->len));
2843 p_msg->num_frames_to_be_processed = (*((UINT8*)(p_msg + 1) + p_msg->offset)) & 0x0f;
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002844 BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + ", p_msg->num_frames_to_be_processed);
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302845 GKI_enqueue(&(btif_media_cb.RxSbcQ), p_msg);
2846 if(btif_media_cb.RxSbcQ.count == MAX_A2DP_DELAYED_START_FRAME_COUNT)
2847 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002848 BTIF_TRACE_DEBUG(" Initiate Decoding ");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302849 btif_media_task_start_decoding_req();
2850 }
2851 }
2852 else
2853 {
2854 /* let caller deal with a failed allocation */
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002855 BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf No Buffer left - ");
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05302856 }
2857 return btif_media_cb.RxSbcQ.count;
2858}
2859
2860/*******************************************************************************
2861 **
The Android Open Source Project5738f832012-12-12 16:00:35 -08002862 ** Function btif_media_aa_readbuf
2863 **
2864 ** Description This function is called by the av_co to get the next buffer to send
2865 **
2866 **
2867 ** Returns void
2868 *******************************************************************************/
2869BT_HDR *btif_media_aa_readbuf(void)
2870{
2871 return GKI_dequeue(&(btif_media_cb.TxAaQ));
2872}
2873
2874/*******************************************************************************
2875 **
2876 ** Function btif_media_aa_read_feeding
2877 **
2878 ** Description
2879 **
2880 ** Returns void
2881 **
2882 *******************************************************************************/
2883
2884BOOLEAN btif_media_aa_read_feeding(tUIPC_CH_ID channel_id)
2885{
2886 UINT16 event;
Mattias Agren5fd74f02013-04-05 19:04:35 +02002887 UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands * \
2888 btif_media_cb.encoder.s16NumOfBlocks;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002889 UINT32 read_size;
2890 UINT16 sbc_sampling = 48000;
2891 UINT32 src_samples;
Mattias Agren5fd74f02013-04-05 19:04:35 +02002892 UINT16 bytes_needed = blocm_x_subband * btif_media_cb.encoder.s16NumOfChannels * \
Mattias Agrenb8ceaa42013-04-05 17:27:27 +02002893 btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
The Android Open Source Project5738f832012-12-12 16:00:35 -08002894 static UINT16 up_sampled_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS
2895 * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS * 2];
2896 static UINT16 read_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS
2897 * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS];
2898 UINT32 src_size_used;
2899 UINT32 dst_size_used;
2900 BOOLEAN fract_needed;
2901 INT32 fract_max;
2902 INT32 fract_threshold;
2903 UINT32 nb_byte_read;
2904
2905 /* Get the SBC sampling rate */
2906 switch (btif_media_cb.encoder.s16SamplingFreq)
2907 {
2908 case SBC_sf48000:
2909 sbc_sampling = 48000;
2910 break;
2911 case SBC_sf44100:
2912 sbc_sampling = 44100;
2913 break;
2914 case SBC_sf32000:
2915 sbc_sampling = 32000;
2916 break;
2917 case SBC_sf16000:
2918 sbc_sampling = 16000;
2919 break;
2920 }
2921
Mattias Agrenb8ceaa42013-04-05 17:27:27 +02002922 if (sbc_sampling == btif_media_cb.media_feeding.cfg.pcm.sampling_freq) {
2923 read_size = bytes_needed - btif_media_cb.media_feeding_state.pcm.aa_feed_residue;
2924 nb_byte_read = UIPC_Read(channel_id, &event,
2925 ((UINT8 *)btif_media_cb.encoder.as16PcmBuffer) +
2926 btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
2927 read_size);
2928 if (nb_byte_read == read_size) {
2929 btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
2930 return TRUE;
2931 } else {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002932 APPL_TRACE_WARNING("### UNDERFLOW :: ONLY READ %d BYTES OUT OF %d ###",
Mattias Agrenb8ceaa42013-04-05 17:27:27 +02002933 nb_byte_read, read_size);
2934 btif_media_cb.media_feeding_state.pcm.aa_feed_residue += nb_byte_read;
2935 return FALSE;
2936 }
2937 }
2938
The Android Open Source Project5738f832012-12-12 16:00:35 -08002939 /* Some Feeding PCM frequencies require to split the number of sample */
2940 /* to read. */
2941 /* E.g 128/6=21.3333 => read 22 and 21 and 21 => max = 2; threshold = 0*/
2942 fract_needed = FALSE; /* Default */
2943 switch (btif_media_cb.media_feeding.cfg.pcm.sampling_freq)
2944 {
2945 case 32000:
2946 case 8000:
2947 fract_needed = TRUE;
2948 fract_max = 2; /* 0, 1 and 2 */
2949 fract_threshold = 0; /* Add one for the first */
2950 break;
2951 case 16000:
2952 fract_needed = TRUE;
2953 fract_max = 2; /* 0, 1 and 2 */
2954 fract_threshold = 1; /* Add one for the first two frames*/
2955 break;
2956 }
2957
2958 /* Compute number of sample to read from source */
2959 src_samples = blocm_x_subband;
2960 src_samples *= btif_media_cb.media_feeding.cfg.pcm.sampling_freq;
2961 src_samples /= sbc_sampling;
2962
2963 /* The previous division may have a remainder not null */
2964 if (fract_needed)
2965 {
2966 if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter <= fract_threshold)
2967 {
2968 src_samples++; /* for every read before threshold add one sample */
2969 }
2970
2971 /* do nothing if counter >= threshold */
2972 btif_media_cb.media_feeding_state.pcm.aa_feed_counter++; /* one more read */
2973 if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter > fract_max)
2974 {
2975 btif_media_cb.media_feeding_state.pcm.aa_feed_counter = 0;
2976 }
2977 }
2978
2979 /* Compute number of bytes to read from source */
2980 read_size = src_samples;
2981 read_size *= btif_media_cb.media_feeding.cfg.pcm.num_channel;
2982 read_size *= (btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8);
2983
2984 /* Read Data from UIPC channel */
2985 nb_byte_read = UIPC_Read(channel_id, &event, (UINT8 *)read_buffer, read_size);
2986
2987 //tput_mon(TRUE, nb_byte_read, FALSE);
2988
2989 if (nb_byte_read < read_size)
2990 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07002991 APPL_TRACE_WARNING("### UNDERRUN :: ONLY READ %d BYTES OUT OF %d ###",
The Android Open Source Project5738f832012-12-12 16:00:35 -08002992 nb_byte_read, read_size);
2993
Bhakthavatsala Raghavendraa86504f2014-11-24 22:35:55 -08002994 if (bt_systrace_log_enabled)
rakesh reddy03b63652014-08-14 11:58:45 +05302995 {
Bhakthavatsala Raghavendra1903bf62014-09-11 15:38:16 -07002996 char trace_buf[512];
2997 snprintf(trace_buf, 32, "A2DP UNDERRUN read %d ", nb_byte_read);
rakesh reddy03b63652014-08-14 11:58:45 +05302998 ATRACE_BEGIN(trace_buf);
2999 }
3000
Bhakthavatsala Raghavendraa86504f2014-11-24 22:35:55 -08003001 if (bt_systrace_log_enabled)
rakesh reddy03b63652014-08-14 11:58:45 +05303002 {
3003 ATRACE_END();
3004 }
rakesh reddy03b63652014-08-14 11:58:45 +05303005
The Android Open Source Project5738f832012-12-12 16:00:35 -08003006 if (nb_byte_read == 0)
3007 return FALSE;
3008
3009 if(btif_media_cb.feeding_mode == BTIF_AV_FEEDING_ASYNCHRONOUS)
3010 {
3011 /* Fill the unfilled part of the read buffer with silence (0) */
3012 memset(((UINT8 *)read_buffer) + nb_byte_read, 0, read_size - nb_byte_read);
3013 nb_byte_read = read_size;
3014 }
3015 }
3016
3017 /* Initialize PCM up-sampling engine */
3018 bta_av_sbc_init_up_sample(btif_media_cb.media_feeding.cfg.pcm.sampling_freq,
3019 sbc_sampling, btif_media_cb.media_feeding.cfg.pcm.bit_per_sample,
3020 btif_media_cb.media_feeding.cfg.pcm.num_channel);
3021
3022 /* re-sample read buffer */
Mattias Agren5fd74f02013-04-05 19:04:35 +02003023 /* The output PCM buffer will be stereo, 16 bit per sample */
The Android Open Source Project5738f832012-12-12 16:00:35 -08003024 dst_size_used = bta_av_sbc_up_sample((UINT8 *)read_buffer,
3025 (UINT8 *)up_sampled_buffer + btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
3026 nb_byte_read,
3027 sizeof(up_sampled_buffer) - btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
3028 &src_size_used);
3029
3030#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003031 APPL_TRACE_DEBUG("btif_media_aa_read_feeding readsz:%d src_size_used:%d dst_size_used:%d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003032 read_size, src_size_used, dst_size_used);
3033#endif
3034
3035 /* update the residue */
3036 btif_media_cb.media_feeding_state.pcm.aa_feed_residue += dst_size_used;
3037
3038 /* only copy the pcm sample when we have up-sampled enough PCM */
3039 if(btif_media_cb.media_feeding_state.pcm.aa_feed_residue >= bytes_needed)
3040 {
3041 /* Copy the output pcm samples in SBC encoding buffer */
3042 memcpy((UINT8 *)btif_media_cb.encoder.as16PcmBuffer,
3043 (UINT8 *)up_sampled_buffer,
3044 bytes_needed);
3045 /* update the residue */
3046 btif_media_cb.media_feeding_state.pcm.aa_feed_residue -= bytes_needed;
3047
3048 if (btif_media_cb.media_feeding_state.pcm.aa_feed_residue != 0)
3049 {
3050 memcpy((UINT8 *)up_sampled_buffer,
3051 (UINT8 *)up_sampled_buffer + bytes_needed,
3052 btif_media_cb.media_feeding_state.pcm.aa_feed_residue);
3053 }
3054 return TRUE;
3055 }
3056
3057#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003058 APPL_TRACE_DEBUG("btif_media_aa_read_feeding residue:%d, dst_size_used %d, bytes_needed %d",
The Android Open Source Project5738f832012-12-12 16:00:35 -08003059 btif_media_cb.media_feeding_state.pcm.aa_feed_residue, dst_size_used, bytes_needed);
3060#endif
3061
3062 return FALSE;
3063}
3064
3065/*******************************************************************************
3066 **
3067 ** Function btif_media_aa_prep_sbc_2_send
3068 **
3069 ** Description
3070 **
3071 ** Returns void
3072 **
3073 *******************************************************************************/
3074static void btif_media_aa_prep_sbc_2_send(UINT8 nb_frame)
3075{
3076 BT_HDR * p_buf;
Mattias Agren5fd74f02013-04-05 19:04:35 +02003077 UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands *
3078 btif_media_cb.encoder.s16NumOfBlocks;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003079
3080#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003081 APPL_TRACE_DEBUG("btif_media_aa_prep_sbc_2_send nb_frame %d, TxAaQ %d",
Mattias Agren5fd74f02013-04-05 19:04:35 +02003082 nb_frame, btif_media_cb.TxAaQ.count);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003083#endif
3084 while (nb_frame)
3085 {
3086 if (NULL == (p_buf = GKI_getpoolbuf(BTIF_MEDIA_AA_POOL_ID)))
3087 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003088 APPL_TRACE_ERROR ("ERROR btif_media_aa_prep_sbc_2_send no buffer TxCnt %d ",
Mattias Agren5fd74f02013-04-05 19:04:35 +02003089 btif_media_cb.TxAaQ.count);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003090 return;
3091 }
3092
3093 /* Init buffer */
3094 p_buf->offset = BTIF_MEDIA_AA_SBC_OFFSET;
3095 p_buf->len = 0;
3096 p_buf->layer_specific = 0;
3097
3098 do
3099 {
3100 /* Write @ of allocated buffer in encoder.pu8Packet */
3101 btif_media_cb.encoder.pu8Packet = (UINT8 *) (p_buf + 1) + p_buf->offset + p_buf->len;
3102 /* Fill allocated buffer with 0 */
The Android Open Source Project5738f832012-12-12 16:00:35 -08003103 memset(btif_media_cb.encoder.as16PcmBuffer, 0, blocm_x_subband
3104 * btif_media_cb.encoder.s16NumOfChannels);
3105
3106 /* Read PCM data and upsample them if needed */
3107 if (btif_media_aa_read_feeding(UIPC_CH_ID_AV_AUDIO))
3108 {
3109 /* SBC encode and descramble frame */
3110 SBC_Encoder(&(btif_media_cb.encoder));
3111 A2D_SbcChkFrInit(btif_media_cb.encoder.pu8Packet);
3112 A2D_SbcDescramble(btif_media_cb.encoder.pu8Packet, btif_media_cb.encoder.u16PacketLength);
3113 /* Update SBC frame length */
3114 p_buf->len += btif_media_cb.encoder.u16PacketLength;
3115 nb_frame--;
3116 p_buf->layer_specific++;
3117 }
3118 else
3119 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003120 APPL_TRACE_WARNING("btif_media_aa_prep_sbc_2_send underflow %d, %d",
Mattias Agrenb8ceaa42013-04-05 17:27:27 +02003121 nb_frame, btif_media_cb.media_feeding_state.pcm.aa_feed_residue);
3122 btif_media_cb.media_feeding_state.pcm.counter += nb_frame *
3123 btif_media_cb.encoder.s16NumOfSubBands *
3124 btif_media_cb.encoder.s16NumOfBlocks *
3125 btif_media_cb.media_feeding.cfg.pcm.num_channel *
3126 btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003127 /* no more pcm to read */
3128 nb_frame = 0;
3129
3130 /* break read loop if timer was stopped (media task stopped) */
3131 if ( btif_media_cb.is_tx_timer == FALSE )
Hemant Guptae7c4f992013-09-05 19:42:50 +05303132 {
3133 GKI_freebuf(p_buf);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003134 return;
Hemant Guptae7c4f992013-09-05 19:42:50 +05303135 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003136 }
3137
3138 } while (((p_buf->len + btif_media_cb.encoder.u16PacketLength) < btif_media_cb.TxAaMtuSize)
3139 && (p_buf->layer_specific < 0x0F) && nb_frame);
3140
Ganesh Ganapathi Batta45f5f902013-02-08 11:02:57 -08003141 if(p_buf->len)
The Android Open Source Project5738f832012-12-12 16:00:35 -08003142 {
Mattias Agren5fd74f02013-04-05 19:04:35 +02003143 /* timestamp of the media packet header represent the TS of the first SBC frame
3144 i.e the timestamp before including this frame */
Ganesh Ganapathi Batta45f5f902013-02-08 11:02:57 -08003145 *((UINT32 *) (p_buf + 1)) = btif_media_cb.timestamp;
The Android Open Source Project5738f832012-12-12 16:00:35 -08003146
Mattias Agren5fd74f02013-04-05 19:04:35 +02003147 btif_media_cb.timestamp += p_buf->layer_specific * blocm_x_subband;
3148
Ganesh Ganapathi Batta45f5f902013-02-08 11:02:57 -08003149 VERBOSE("TX QUEUE NOW %d", btif_media_cb.TxAaQ.count);
3150
3151 if (btif_media_cb.tx_flush)
3152 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003153 APPL_TRACE_DEBUG("### tx suspended, discarded frame ###");
Ganesh Ganapathi Batta45f5f902013-02-08 11:02:57 -08003154
3155 if (btif_media_cb.TxAaQ.count > 0)
3156 btif_media_flush_q(&(btif_media_cb.TxAaQ));
3157
3158 GKI_freebuf(p_buf);
3159 return;
3160 }
3161
3162 /* Enqueue the encoded SBC frame in AA Tx Queue */
3163 GKI_enqueue(&(btif_media_cb.TxAaQ), p_buf);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003164 }
Ganesh Ganapathi Batta45f5f902013-02-08 11:02:57 -08003165 else
3166 {
3167 GKI_freebuf(p_buf);
3168 }
The Android Open Source Project5738f832012-12-12 16:00:35 -08003169 }
3170}
3171
3172
3173/*******************************************************************************
3174 **
3175 ** Function btif_media_aa_prep_2_send
3176 **
3177 ** Description
3178 **
3179 ** Returns void
3180 **
3181 *******************************************************************************/
3182
3183static void btif_media_aa_prep_2_send(UINT8 nb_frame)
3184{
Christopher R. Palmere288e3b2015-05-27 14:06:13 -04003185 UINT32 pcm_bytes_per_frame = compute_pcm_bytes_per_frame();
3186 UINT32 max_pcm_bytes;
3187 UINT32 max_frames;
3188
3189 max_pcm_bytes = btif_media_cb.media_feeding_state.pcm.bytes_per_tick *
3190 MAX_OUTPUT_A2DP_QUEUE_MS /
3191 BTIF_MEDIA_TIME_TICK;
3192 max_frames = max_pcm_bytes / pcm_bytes_per_frame;
3193
Sridhar Gujje876c69b2015-02-20 15:55:44 +05303194 VERBOSE("%s() - frames=%d (queue=%d)", __FUNCTION__, nb_frame,
3195 btif_media_cb.TxAaQ.count)
Andre Eisenbachc5916e92014-11-07 15:46:04 -08003196
Christopher R. Palmere288e3b2015-05-27 14:06:13 -04003197 while (btif_media_cb.TxAaQ.count > (max_frames-nb_frame))
Andre Eisenbachc5916e92014-11-07 15:46:04 -08003198 {
Christopher R. Palmere288e3b2015-05-27 14:06:13 -04003199 APPL_TRACE_WARNING("%s() - TX queue buffer count %d max_frames %d nb_frame %d",
3200 __FUNCTION__, btif_media_cb.TxAaQ.count, max_frames, nb_frame);
Andre Eisenbachc5916e92014-11-07 15:46:04 -08003201 GKI_freebuf(GKI_dequeue(&(btif_media_cb.TxAaQ)));
3202 }
3203
The Android Open Source Project5738f832012-12-12 16:00:35 -08003204 switch (btif_media_cb.TxTranscoding)
3205 {
3206 case BTIF_MEDIA_TRSCD_PCM_2_SBC:
3207 btif_media_aa_prep_sbc_2_send(nb_frame);
3208 break;
3209
3210
3211 default:
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003212 APPL_TRACE_ERROR("ERROR btif_media_aa_prep_2_send unsupported transcoding format 0x%x",btif_media_cb.TxTranscoding);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003213 break;
3214 }
3215}
3216
3217/*******************************************************************************
3218 **
3219 ** Function btif_media_send_aa_frame
3220 **
3221 ** Description
3222 **
3223 ** Returns void
3224 **
3225 *******************************************************************************/
3226static void btif_media_send_aa_frame(void)
3227{
3228 UINT8 nb_frame_2_send;
3229
3230 /* get the number of frame to send */
Christopher R. Palmer44e08de2015-02-14 14:14:18 -05003231 nb_frame_2_send = btif_get_num_aa_frame();
The Android Open Source Project5738f832012-12-12 16:00:35 -08003232
Christopher R. Palmer44e08de2015-02-14 14:14:18 -05003233 if (nb_frame_2_send != 0)
Ayan Ghoshec40bdb2013-11-11 19:25:16 +05303234 {
Christopher R. Palmer44e08de2015-02-14 14:14:18 -05003235 btif_media_aa_prep_2_send(nb_frame_2_send);
Zhihai Xu4aebca42013-09-19 11:30:44 -07003236 }
rakesh reddy03b63652014-08-14 11:58:45 +05303237
Bhakthavatsala Raghavendraa86504f2014-11-24 22:35:55 -08003238 if (bt_systrace_log_enabled)
rakesh reddy03b63652014-08-14 11:58:45 +05303239 {
Bhakthavatsala Raghavendra1903bf62014-09-11 15:38:16 -07003240 char trace_buf[1024];
3241 snprintf(trace_buf, 32, "btif_media_send_aa_frame:");
rakesh reddy03b63652014-08-14 11:58:45 +05303242 ATRACE_BEGIN(trace_buf);
3243 }
rakesh reddy03b63652014-08-14 11:58:45 +05303244
The Android Open Source Project5738f832012-12-12 16:00:35 -08003245 /* send it */
rakesh reddy03b63652014-08-14 11:58:45 +05303246
Bhakthavatsala Raghavendraa86504f2014-11-24 22:35:55 -08003247 if (bt_systrace_log_enabled)
rakesh reddy03b63652014-08-14 11:58:45 +05303248 {
3249 ATRACE_END();
3250 }
rakesh reddy03b63652014-08-14 11:58:45 +05303251
The Android Open Source Project5738f832012-12-12 16:00:35 -08003252 VERBOSE("btif_media_send_aa_frame : send %d frames", nb_frame_2_send);
3253 bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO);
3254}
3255
The Android Open Source Project5738f832012-12-12 16:00:35 -08003256#endif /* BTA_AV_INCLUDED == TRUE */
3257
3258/*******************************************************************************
3259 **
3260 ** Function dump_codec_info
3261 **
3262 ** Description Decode and display codec_info (for debug)
3263 **
3264 ** Returns void
3265 **
3266 *******************************************************************************/
3267void dump_codec_info(unsigned char *p_codec)
3268{
3269 tA2D_STATUS a2d_status;
3270 tA2D_SBC_CIE sbc_cie;
3271
3272 a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_codec, FALSE);
3273 if (a2d_status != A2D_SUCCESS)
3274 {
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003275 APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003276 return;
3277 }
3278
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003279 APPL_TRACE_DEBUG("dump_codec_info");
The Android Open Source Project5738f832012-12-12 16:00:35 -08003280
3281 if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_16)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003282 { APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003283 else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_32)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003284 { APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003285 else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_44)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003286 { APPL_TRACE_DEBUG("\tsamp_freq:%d (44.100)", sbc_cie.samp_freq);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003287 else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_48)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003288 { APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003289 else
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003290 { APPL_TRACE_DEBUG("\tBAD samp_freq:%d", sbc_cie.samp_freq);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003291
3292 if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_MONO)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003293 { APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003294 else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_DUAL)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003295 { APPL_TRACE_DEBUG("\tch_mode:%d (Dual)", sbc_cie.ch_mode);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003296 else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_STEREO)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003297 { APPL_TRACE_DEBUG("\tch_mode:%d (Stereo)", sbc_cie.ch_mode);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003298 else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_JOINT)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003299 { APPL_TRACE_DEBUG("\tch_mode:%d (Joint)", sbc_cie.ch_mode);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003300 else
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003301 { APPL_TRACE_DEBUG("\tBAD ch_mode:%d", sbc_cie.ch_mode);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003302
3303 if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_4)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003304 { APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003305 else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_8)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003306 { APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003307 else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_12)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003308 { APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003309 else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_16)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003310 { APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003311 else
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003312 { APPL_TRACE_DEBUG("\tBAD block_len:%d", sbc_cie.block_len);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003313
3314 if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_4)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003315 { APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003316 else if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_8)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003317 { APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003318 else
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003319 { APPL_TRACE_DEBUG("\tBAD num_subbands:%d", sbc_cie.num_subbands);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003320
3321 if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_S)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003322 { APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003323 else if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L)
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003324 { APPL_TRACE_DEBUG("\talloc_mthd:%d (Loundess)", sbc_cie.alloc_mthd);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003325 else
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003326 { APPL_TRACE_DEBUG("\tBAD alloc_mthd:%d", sbc_cie.alloc_mthd);}
The Android Open Source Project5738f832012-12-12 16:00:35 -08003327
Sharvil Nanavatie8c3d752014-05-04 10:12:26 -07003328 APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
The Android Open Source Project5738f832012-12-12 16:00:35 -08003329
3330}
Hemant Guptaf7dd9f52013-10-24 15:37:17 +05303331