btif_media_task.c revision 70ae7de9451e3dc074a048ba98b672a6ba3a4551
15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Copyright (C) 2009-2012 Broadcom Corporation
45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the "License");
65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  you may not use this file except in compliance with the License.
75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  You may obtain a copy of the License at:
85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  http://www.apache.org/licenses/LICENSE-2.0
105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  See the License for the specific language governing permissions and
155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *  limitations under the License.
165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************
205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  Name:          btif_media_task.c
225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  Description:   This is the multimedia module for the BTIF system.  It
245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **                 contains task implementations AV, HS and HF profiles
255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **                 audio & video processing
265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/
285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2949120dc867c7818511b5afec461dfc97d17eef58Marie Janssen#define LOG_TAG "bt_btif_media"
3049120dc867c7818511b5afec461dfc97d17eef58Marie Janssen
31c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati#include <assert.h>
32db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <dlfcn.h>
33db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <errno.h>
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <fcntl.h>
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <pthread.h>
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdint.h>
37db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <stdio.h>
38db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <string.h>
39db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <sys/stat.h>
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/time.h>
41db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <sys/types.h>
42db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <unistd.h>
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
44db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <hardware/bluetooth.h>
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "a2d_api.h"
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "a2d_int.h"
48db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "a2d_sbc.h"
49db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "audio_a2dp_hw.h"
50db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bt_target.h"
51db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_api.h"
52db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_av_api.h"
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_av_ci.h"
54db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_av_sbc.h"
55db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_sys.h"
56db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_sys_int.h"
57db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif_av.h"
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_av_co.h"
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_media.h"
60db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif_sm.h"
61db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif_util.h"
62db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btu.h"
63db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "gki.h"
64db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "l2c_api.h"
65c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati#include "osi/include/alarm.h"
66db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "osi/include/fixed_queue.h"
6723e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati#include "osi/include/log.h"
68c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati#include "osi/include/thread.h"
69c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati
705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sbc_encoder.h"
725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
746718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE)
75f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#include "oi_codec_sbc.h"
76f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#include "oi_status.h"
77f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
78db554581079863974af8e1289646f5deea6fc044Marie Janssen
796718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE)
80f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaOI_CODEC_SBC_DECODER_CONTEXT context;
81f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaOI_UINT32 contextData[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)];
82f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaOI_INT16 pcmData[15*SBC_MAX_SAMPLES_PER_FRAME*SBC_MAX_CHANNELS];
83f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  Constants
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
89f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifndef AUDIO_CHANNEL_OUT_MONO
90f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define AUDIO_CHANNEL_OUT_MONO 0x01
91f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
92f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
93f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifndef AUDIO_CHANNEL_OUT_STEREO
94f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define AUDIO_CHANNEL_OUT_STEREO 0x03
95f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTIF media cmd event definition : BTIF_MEDIA_TASK_CMD */
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_START_AA_TX = 1,
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_STOP_AA_TX,
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_AA_RX_RDY,
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_UIPC_RX_RDY,
1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_SBC_ENC_INIT,
1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_SBC_ENC_UPDATE,
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_SBC_DEC_INIT,
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_VIDEO_DEC_INIT,
1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_FLUSH_AA_TX,
1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_FLUSH_AA_RX,
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_AUDIO_FEEDING_INIT,
111f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BTIF_MEDIA_AUDIO_RECEIVING_INIT,
112f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE,
113f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK
1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum {
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MEDIA_TASK_STATE_OFF = 0,
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MEDIA_TASK_STATE_ON = 1,
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MEDIA_TASK_STATE_SHUTTING_DOWN = 2
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Macro to multiply the media task tick */
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTIF_MEDIA_NUM_TICK
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_NUM_TICK      1
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
127b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren/* Media task tick in milliseconds, must be set to multiple of
128b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren   (1000/TICKS_PER_SEC) (10) */
1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
130b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#define BTIF_MEDIA_TIME_TICK                     (20 * BTIF_MEDIA_NUM_TICK)
13101c686ce0051433d75605ff9ca4c3b7388ce3b6bZhihai Xu#define A2DP_DATA_READ_POLL_MS    (BTIF_MEDIA_TIME_TICK / 2)
132f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define BTIF_SINK_MEDIA_TIME_TICK                (20 * BTIF_MEDIA_NUM_TICK)
133f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* buffer pool */
13670ae7de9451e3dc074a048ba98b672a6ba3a4551Pavlin Radoslavov#define BTIF_MEDIA_AA_BUF_SIZE  BT_DEFAULT_BUFFER_SIZE
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* offset */
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_CO_CP_SCMS_T == TRUE)
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE + 1)
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE)
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Define the bitrate step when trying to match bitpool value */
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTIF_MEDIA_BITRATE_STEP
1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_BITRATE_STEP 5
1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Middle quality quality setting @ 44.1 khz */
151b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#define DEFAULT_SBC_BITRATE 328
152b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
153b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#ifndef BTIF_A2DP_NON_EDR_MAX_RATE
154b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#define BTIF_A2DP_NON_EDR_MAX_RATE 229
155b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#endif
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define USEC_PER_SEC 1000000L
1585fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren#define TPUT_STATS_INTERVAL_US (3000*1000)
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * CONGESTION COMPENSATION CTRL ::
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Thus setting controls how many buffers we will hold in media task
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * during temp link congestion. Together with the stack buffer queues
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * it controls much temporary a2dp link congestion we can
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * compensate for. It however also depends on the default run level of sinks
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * jitterbuffers. Depending on type of sink this would vary.
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Ideally the (SRC) max tx buffer capacity should equal the sinks
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * jitterbuffer runlevel including any intermediate buffers on the way
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * towards the sinks codec.
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */
1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* fixme -- define this in pcm time instead of buffer count */
174b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
175b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren/* The typical runlevel of the tx queue size is ~1 buffer
176b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren   but due to link flow control or thread preemption in lower
177b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren   layers we might need to temporarily buffer up data */
178b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
1794aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu/* 18 frames is equivalent to 6.89*18*2.9 ~= 360 ms @ 44.1 khz, 20 ms mediatick */
1804aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu#define MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ 18
18126e80aad86fae4e468a330d64ee02291f3a1980eAndre Eisenbach
18226e80aad86fae4e468a330d64ee02291f3a1980eAndre Eisenbach#ifndef MAX_PCM_FRAME_NUM_PER_TICK
18326e80aad86fae4e468a330d64ee02291f3a1980eAndre Eisenbach#define MAX_PCM_FRAME_NUM_PER_TICK     14
18426e80aad86fae4e468a330d64ee02291f3a1980eAndre Eisenbach#endif
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
186f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/* In case of A2DP SINK, we will delay start by 5 AVDTP Packets*/
187f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define MAX_A2DP_DELAYED_START_FRAME_COUNT 5
188f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define PACKET_PLAYED_PER_TICK_48 8
189f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define PACKET_PLAYED_PER_TICK_44 7
190f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define PACKET_PLAYED_PER_TICK_32 5
191f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define PACKET_PLAYED_PER_TICK_16 3
192f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
193f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptatypedef struct
194f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
195f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT16 num_frames_to_be_processed;
196f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT16 len;
197f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT16 offset;
198f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT16 layer_specific;
199f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} tBT_SBC_HDR;
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 aa_frame_counter;
2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32  aa_feed_counter;
2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32  aa_feed_residue;
206b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    UINT32 counter;
207b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    UINT32 bytes_per_tick;  /* pcm bytes read each media task tick */
2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE;
2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef union
2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE pcm;
2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTIF_AV_MEDIA_FEEDINGS_STATE;
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct
2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BUFFER_Q TxAaQ;
219f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BUFFER_Q RxSbcQ;
2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_tx_timer;
221f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BOOLEAN is_rx_timer;
2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 TxAaMtuSize;
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 timestamp;
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 TxTranscoding;
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_AV_FEEDING_MODE feeding_mode;
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_AV_MEDIA_FEEDINGS media_feeding;
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_AV_MEDIA_FEEDINGS_STATE media_feeding_state;
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SBC_ENC_PARAMS encoder;
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 busy_level;
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    void* av_sm_hdl;
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 a2dp_cmd_pending; /* we can have max one command pending */
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN tx_flush; /* discards any outgoing data when true */
233f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BOOLEAN rx_flush; /* discards any incoming data when true */
2343e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    UINT8 peer_sep;
2353e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    BOOLEAN data_channel_open;
236f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT8   frames_to_process;
2373e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
2383e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    UINT32  sample_rate;
2393e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    UINT8   channel_count;
240c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    alarm_t *media_alarm;
241c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    alarm_t *decode_alarm;
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTIF_MEDIA_CB;
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct {
2475fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    long long rx;
2485fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    long long rx_tot;
2495fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    long long tx;
2505fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    long long tx_tot;
2515fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    long long ts_prev_us;
2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} t_stat;
2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
254f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbachstatic UINT64 last_frame_us = 0;
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event);
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event);
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_encoder_update(void);
2596718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE)
260ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptaextern OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
261ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                          const OI_BYTE **frameData,
262ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                          unsigned long *frameBytes,
263ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                          OI_INT16 *pcmData,
264ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                          unsigned long *pcmBytes);
265ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptaextern OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
266ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                           unsigned long *decoderData,
267ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                           unsigned long decoderDataBytes,
268ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                           OI_UINT8 maxChannels,
269ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                           OI_UINT8 pcmStride,
270ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                           OI_BOOL enhanced);
271f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
272f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_flush_q(BUFFER_Q *p_q);
273f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_stop_decoding(void );
274f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_rx_flush(void);
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27623e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic const char *dump_media_event(UINT16 event);
27723e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_thread_init(void *context);
27823e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_thread_cleanup(void *context);
27923e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_thread_handle_cmd(fixed_queue_t *queue, void *context);
2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
281f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/* Handle incoming media packets A2DP SINK streaming*/
2826718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE)
283f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg);
284f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
2855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_send_aa_frame(void);
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_feeding_state_reset(void);
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_start_tx(void);
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_stop_tx(void);
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_init(BT_HDR *p_msg);
2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_update(BT_HDR *p_msg);
2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_audio_feeding_init(BT_HDR *p_msg);
2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_tx_flush(BT_HDR *p_msg);
2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_aa_prep_2_send(UINT8 nb_frame);
2966718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE)
297f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg);
298f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_clear_track(void);
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
300c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavatistatic void btif_media_task_aa_handle_start_decoding(void);
301f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
302f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaBOOLEAN btif_media_task_clear_track(void);
303753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton
30423e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_task_aa_handle_timer(UNUSED_ATTR void *context);
30523e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context);
3069c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Guptaextern BOOLEAN btif_hf_is_call_idle();
30723e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati
30823e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic tBTIF_MEDIA_CB btif_media_cb;
30923e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic int media_task_running = MEDIA_TASK_STATE_OFF;
31023e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati
31123e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic fixed_queue_t *btif_media_cmd_msg_queue;
31223e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic thread_t *worker_thread;
313753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton
3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  Misc helper functions
3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
318f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbachstatic UINT64 time_now_us()
3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
320f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach    struct timespec ts_now;
321f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach    clock_gettime(CLOCK_BOOTTIME, &ts_now);
32225067c0afc4d3ed95181b91801d3d638d9aa3f8fAndre Eisenbach    return ((UINT64)ts_now.tv_sec * USEC_PER_SEC) + ((UINT64)ts_now.tv_nsec / 1000);
323f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach}
3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
325f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbachstatic void log_tstamps_us(char *comment)
326f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach{
327f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach    static UINT64 prev_us = 0;
328f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach    const UINT64 now_us = time_now_us();
329f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach    APPL_TRACE_DEBUG("[%s] ts %08llu, diff : %08llu, queue sz %d", comment, now_us, now_us - prev_us,
330fe7216ca12f91baae733e7c93063db73121af308Chris Manton                GKI_queue_length(&btif_media_cb.TxAaQ));
331f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach    prev_us = now_us;
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
33423e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil NanavatiUNUSED_ATTR static const char *dump_media_event(UINT16 event)
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(event)
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_START_AA_TX)
3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_STOP_AA_TX)
3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_AA_RX_RDY)
3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_UIPC_RX_RDY)
3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_INIT)
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_UPDATE)
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_SBC_DEC_INIT)
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_VIDEO_DEC_INIT)
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_TX)
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_RX)
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_FEEDING_INIT)
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_RECEIVING_INIT)
350f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE)
351f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK)
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return "UNKNOWN MEDIA EVENT";
3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  A2DP CTRL PATH
3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char* dump_a2dp_ctrl_event(UINT8 event)
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(event)
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(A2DP_CTRL_CMD_NONE)
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(A2DP_CTRL_CMD_CHECK_READY)
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(A2DP_CTRL_CMD_START)
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(A2DP_CTRL_CMD_STOP)
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(A2DP_CTRL_CMD_SUSPEND)
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return "UNKNOWN MSG ID";
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_audiopath_detached(void)
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
378e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## AUDIO PATH DETACHED ##");
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*  send stop request only if we are actively streaming and haven't received
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        a stop request. Potentially audioflinger detached abnormally */
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btif_media_cb.is_tx_timer)
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* post stop event and wait for audio path to stop */
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0);
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void a2dp_cmd_acknowledge(int status)
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 ack = status;
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
393e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## a2dp ack : %s, status %d ##",
3945fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren          dump_a2dp_ctrl_event(btif_media_cb.a2dp_cmd_pending), status);
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btif_media_cb.a2dp_cmd_pending == A2DP_CTRL_CMD_NONE)
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
399e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("warning : no command pending, ignore ack");
4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear pending */
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.a2dp_cmd_pending = A2DP_CTRL_CMD_NONE;
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* acknowledge start request */
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &ack, 1);
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_recv_ctrl_data(void)
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 cmd = 0;
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int n;
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    n = UIPC_Read(UIPC_CH_ID_AV_CTRL, NULL, &cmd, 1);
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* detach on ctrl channel means audioflinger process was terminated */
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (n == 0)
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
420e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_EVENT("CTRL CH DETACHED");
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UIPC_Close(UIPC_CH_ID_AV_CTRL);
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* we can operate only on datachannel, if af client wants to
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           do send additional commands the ctrl channel would be reestablished */
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //btif_audiopath_detached();
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
428e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s", dump_a2dp_ctrl_event(cmd));
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.a2dp_cmd_pending = cmd;
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(cmd)
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case A2DP_CTRL_CMD_CHECK_READY:
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (media_task_running == MEDIA_TASK_STATE_SHUTTING_DOWN)
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check whether av is ready to setup a2dp datapath */
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((btif_av_stream_ready() == TRUE) || (btif_av_stream_started_ready() == TRUE))
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case A2DP_CTRL_CMD_START:
4549c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta            /* Don't sent START request to stack while we are in call.
4559c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta               Some headsets like the Sony MW600, don't allow AVDTP START
4569c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta               in call and respond BAD_STATE. */
4579c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta            if (!btif_hf_is_call_idle())
4589c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta            {
4599c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_INCALL_FAILURE);
4609c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta                break;
4619c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta            }
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btif_av_stream_ready() == TRUE)
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* setup audio data channel listener */
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* post start event and wait for audio path to open */
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_dispatch_sm_event(BTIF_AV_START_STREAM_REQ_EVT, NULL, 0);
470ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach
471ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach#if (BTA_AV_SINK_INCLUDED == TRUE)
472ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach                if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
473ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach                    a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
474ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach#endif
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (btif_av_stream_started_ready())
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* already started, setup audio data channel listener
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   and ack back immediately */
4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case A2DP_CTRL_CMD_STOP:
4923e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            if (btif_media_cb.peer_sep == AVDT_TSEP_SNK && btif_media_cb.is_tx_timer == FALSE)
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* we are already stopped, just ack back */
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0);
5003e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case A2DP_CTRL_CMD_SUSPEND:
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* local suspend */
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btif_av_stream_started_ready())
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_dispatch_sm_event(BTIF_AV_SUSPEND_STREAM_REQ_EVT, NULL, 0);
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if we are not in started state, just ack back ok and let
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   audioflinger close the channel. This can happen if we are
5139c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta                   remotely suspended, clear REMOTE SUSPEND Flag */
5149c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta                btif_av_clear_remote_suspend_flag();
5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5193e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        case A2DP_CTRL_GET_AUDIO_CONFIG:
5203e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        {
5213e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            uint32_t sample_rate = btif_media_cb.sample_rate;
5223e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            uint8_t channel_count = btif_media_cb.channel_count;
5233e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
5243e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
5253e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, (UINT8 *)&sample_rate, 4);
5263e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &channel_count, 1);
5273e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            break;
5283e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        }
5293e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
531e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("UNSUPPORTED CMD (%d)", cmd);
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
535e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s DONE", dump_a2dp_ctrl_event(cmd));
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5405cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(ch_id);
5415cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
542e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("A2DP-CTRL-CHANNEL EVENT %s", dump_uipc_event(event));
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(event)
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case UIPC_OPEN_EVT:
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fetch av statemachine handle */
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.av_sm_hdl = btif_av_get_sm_handle();
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case UIPC_CLOSE_EVT:
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* restart ctrl server unless we are shutting down */
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (media_task_running == MEDIA_TASK_STATE_ON)
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb);
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case UIPC_RX_DATA_READY_EVT:
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_recv_ctrl_data();
5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default :
562e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("### A2DP-CTRL-CHANNEL EVENT %d NOT HANDLED ###", event);
5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5695cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(ch_id);
5705cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
571e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("BTIF MEDIA (A2DP-DATA) EVENT %s", dump_uipc_event(event));
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(event)
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case UIPC_OPEN_EVT:
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*  read directly from media task from here on (keep callback for
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                connection events */
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_REMOVE_ACTIVE_READSET, NULL);
58001c686ce0051433d75605ff9ca4c3b7388ce3b6bZhihai Xu            UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_SET_READ_POLL_TMO,
58101c686ce0051433d75605ff9ca4c3b7388ce3b6bZhihai Xu                       (void *)A2DP_DATA_READ_POLL_MS);
5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5833e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            if (btif_media_cb.peer_sep == AVDT_TSEP_SNK) {
5843e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood                /* Start the media task to encode SBC */
5853e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood                btif_media_task_start_aa_req();
5863e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
5873e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood                /* make sure we update any changed sbc encoder params */
5883e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood                btif_a2dp_encoder_update();
5893e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            }
5903e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            btif_media_cb.data_channel_open = TRUE;
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* ack back when media task is fully started */
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case UIPC_CLOSE_EVT:
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_audiopath_detached();
5983e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            btif_media_cb.data_channel_open = FALSE;
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default :
602e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("### A2DP-DATA EVENT %d NOT HANDLED ###", event);
6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  BTIF ADAPTATION
6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
612b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agrenstatic UINT16 btif_media_task_get_sbc_rate(void)
613b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren{
614b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    UINT16 rate = DEFAULT_SBC_BITRATE;
615b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
616b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    /* restrict bitrate if a2dp link is non-edr */
617b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    if (!btif_av_is_peer_edr())
618b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    {
619b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        rate = BTIF_A2DP_NON_EDR_MAX_RATE;
620e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("non-edr a2dp sink detected, restrict rate to %d", rate);
621b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    }
622b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
623b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    return rate;
624b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren}
625b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_encoder_init(void)
6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 minmtu;
6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_INIT_AUDIO msg;
6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tA2D_SBC_CIE sbc_config;
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* lookup table for converting channel mode */
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 codec_mode_tbl[5] = { SBC_JOINT_STEREO, SBC_STEREO, SBC_DUAL, 0, SBC_MONO };
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* lookup table for converting number of blocks */
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 codec_block_tbl[5] = { 16, 12, 8, 0, 4 };
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* lookup table to convert freq */
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 freq_block_tbl[5] = { SBC_sf48000, SBC_sf44100, SBC_sf32000, 0, SBC_sf16000 };
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
641e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_a2dp_encoder_init");
6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Retrieve the current SBC configuration (default if currently not used) */
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.NumOfSubBands = (sbc_config.num_subbands == A2D_SBC_IE_SUBBAND_4) ? 4 : 8;
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.NumOfBlocks = codec_block_tbl[sbc_config.block_len >> 5];
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.AllocationMethod = (sbc_config.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L) ? SBC_LOUDNESS : SBC_SNR;
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.ChannelMode = codec_mode_tbl[sbc_config.ch_mode >> 1];
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.SamplingFreq = freq_block_tbl[sbc_config.samp_freq >> 5];
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.MtuSize = minmtu;
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
652e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("msg.ChannelMode %x", msg.ChannelMode);
6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Init the media task to encode SBC properly */
6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_enc_init_req(&msg);
6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_encoder_update(void)
6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 minmtu;
6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tA2D_SBC_CIE sbc_config;
6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_UPDATE_AUDIO msg;
6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 pref_min;
6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 pref_max;
6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
666e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_a2dp_encoder_update");
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Retrieve the current SBC configuration (default if currently not used) */
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
671e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_a2dp_encoder_update: Common min_bitpool:%d(0x%x) max_bitpool:%d(0x%x)",
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sbc_config.min_bitpool, sbc_config.min_bitpool,
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sbc_config.max_bitpool, sbc_config.max_bitpool);
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sbc_config.min_bitpool > sbc_config.max_bitpool)
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
677e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("btif_a2dp_encoder_update: ERROR btif_a2dp_encoder_update min_bitpool > max_bitpool");
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check if remote sink has a preferred bitpool range */
6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_av_co_get_remote_bitpool_pref(&pref_min, &pref_max) == TRUE)
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* adjust our preferred bitpool with the remote preference if within
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           our capable range */
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pref_min < sbc_config.min_bitpool)
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pref_min = sbc_config.min_bitpool;
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pref_max > sbc_config.max_bitpool)
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pref_max = sbc_config.max_bitpool;
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        msg.MinBitPool = pref_min;
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        msg.MaxBitPool = pref_max;
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((pref_min != sbc_config.min_bitpool) || (pref_max != sbc_config.max_bitpool))
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
697e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_EVENT("## adjusted our bitpool range to peer pref [%d:%d] ##",
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                pref_min, pref_max);
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        msg.MinBitPool = sbc_config.min_bitpool;
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        msg.MaxBitPool = sbc_config.max_bitpool;
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.MinMtuSize = minmtu;
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Update the media task to encode SBC properly */
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_enc_update_req(&msg);
7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
713e13fbfafe2105d264357ac41133f0ac0e054429cSharvil Nanavatibool btif_a2dp_start_media_task(void)
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (media_task_running != MEDIA_TASK_STATE_OFF)
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
717e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("warning : media task already running");
718e13fbfafe2105d264357ac41133f0ac0e054429cSharvil Nanavati        return false;
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
721753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton    APPL_TRACE_EVENT("## A2DP START MEDIA THREAD ##");
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
723860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton    btif_media_cmd_msg_queue = fixed_queue_new(SIZE_MAX);
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start a2dp media task */
72623e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati    worker_thread = thread_new("media_worker");
72723e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati    if (worker_thread == NULL)
728753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton        goto error_exit;
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
73023e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati    fixed_queue_register_dequeue(btif_media_cmd_msg_queue,
73123e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati        thread_get_reactor(worker_thread),
73223e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati        btif_media_thread_handle_cmd,
73323e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati        NULL);
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
73523e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati    thread_post(worker_thread, btif_media_thread_init, NULL);
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
737753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton    APPL_TRACE_EVENT("## A2DP MEDIA THREAD STARTED ##");
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
739e13fbfafe2105d264357ac41133f0ac0e054429cSharvil Nanavati    return true;
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
741753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton error_exit:;
742753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton    APPL_TRACE_ERROR("%s unable to start up media thread", __func__);
743e13fbfafe2105d264357ac41133f0ac0e054429cSharvil Nanavati    return false;
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_stop_media_task(void)
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
748753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton    APPL_TRACE_EVENT("## A2DP STOP MEDIA THREAD ##");
749753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton
7501f293a50abf0bd37d149604c674ae5a6dbab7750Nitin Arora    // Stop timer
7511f293a50abf0bd37d149604c674ae5a6dbab7750Nitin Arora    alarm_free(btif_media_cb.media_alarm);
7521f293a50abf0bd37d149604c674ae5a6dbab7750Nitin Arora    btif_media_cb.media_alarm = NULL;
7531f293a50abf0bd37d149604c674ae5a6dbab7750Nitin Arora    btif_media_cb.is_tx_timer = FALSE;
7541f293a50abf0bd37d149604c674ae5a6dbab7750Nitin Arora
7551f293a50abf0bd37d149604c674ae5a6dbab7750Nitin Arora    // Exit thread
75623e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati    fixed_queue_free(btif_media_cmd_msg_queue, NULL);
75723e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati    thread_post(worker_thread, btif_media_thread_cleanup, NULL);
75823e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati    thread_free(worker_thread);
759753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton
76023e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati    worker_thread = NULL;
761753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton    btif_media_cmd_msg_queue = NULL;
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_on_init
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_init(void)
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //tput_mon(1, 0, 1);
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_setup_codec
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_setup_codec(void)
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_AV_MEDIA_FEEDINGS media_feeding;
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_STATUS status;
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
795e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## A2DP SETUP CODEC ##");
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_disable();
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
799b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    /* for now hardcode 44.1 khz 16 bit stereo PCM format */
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    media_feeding.cfg.pcm.sampling_freq = 44100;
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    media_feeding.cfg.pcm.bit_per_sample = 16;
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    media_feeding.cfg.pcm.num_channel = 2;
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    media_feeding.format = BTIF_AV_CODEC_PCM;
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_av_co_audio_set_codec(&media_feeding, &status))
8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        tBTIF_MEDIA_INIT_AUDIO_FEEDING mfeed;
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Init the encoding task */
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_a2dp_encoder_init();
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Build the media task configuration */
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        mfeed.feeding = media_feeding;
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        mfeed.feeding_mode = BTIF_AV_FEEDING_ASYNCHRONOUS;
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Send message to Media task to configure transcoding */
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_audio_feeding_init_req(&mfeed);
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_enable();
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_on_idle
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_idle(void)
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
835e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## ON A2DP IDLE ##");
8363e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    if (btif_media_cb.peer_sep == AVDT_TSEP_SNK)
837f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
838f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        /* Make sure media task is stopped */
839f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_stop_aa_req();
840f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_av_co_init();
8436718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE)
8443e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
845f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
846f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_cb.rx_flush = TRUE;
847f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_rx_flush_req();
848c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati        btif_media_task_aa_handle_stop_decoding();
849f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_clear_track();
850e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("Stopped BT track");
851f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
852f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_on_open
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_open(void)
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
867e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## ON A2DP OPEN ##");
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* always use callback to notify socket events */
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
873f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
874f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
875f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_clear_track
876f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
877f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
878f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
879f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          TRUE is success
880f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
881f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
882f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaBOOLEAN btif_media_task_clear_track(void)
883f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
884f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BT_HDR *p_buf;
885f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
886f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
887f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
888f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return FALSE;
889f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
890f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
891f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    p_buf->event = BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK;
892f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
893860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton    fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
894f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    return TRUE;
895f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
896f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
897f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*****************************************************************************
898f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta**
899f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Function        btif_reset_decoder
900f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta**
901f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Description
902f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta**
903f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Returns
904f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta**
905f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta*******************************************************************************/
906f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
907f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptavoid btif_reset_decoder(UINT8 *p_av)
908f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
909e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("btif_reset_decoder");
910e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_reset_decoder p_codec_info[%x:%x:%x:%x:%x:%x]",
911f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            p_av[1], p_av[2], p_av[3],
912f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            p_av[4], p_av[5], p_av[6]);
913f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
914f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf;
915f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_SINK_CFG_UPDATE))))
916f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
917e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_EVENT("btif_reset_decoder No Buffer ");
918f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return;
919f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
920f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
921f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    memcpy(p_buf->codec_info,p_av, AVDT_CODEC_SIZE);
922f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    p_buf->hdr.event = BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE;
923f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
924860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton    fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
925f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
926f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_on_started
9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
937379743beded881127703334e1dda2cd327ec651dZhihai XuBOOLEAN btif_a2dp_on_started(tBTA_AV_START *p_av, BOOLEAN pending_start)
9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
939379743beded881127703334e1dda2cd327ec651dZhihai Xu    BOOLEAN ack = FALSE;
9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
941e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## ON A2DP STARTED ##");
9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9435fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    if (p_av == NULL)
9445fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    {
9455fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren        /* ack back a local start request */
9465fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren        a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
947379743beded881127703334e1dda2cd327ec651dZhihai Xu        return TRUE;
9485fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    }
9495fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_av->status == BTA_AV_SUCCESS)
9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_av->suspending == FALSE)
9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_av->initiator)
9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
956379743beded881127703334e1dda2cd327ec651dZhihai Xu                if (pending_start) {
957379743beded881127703334e1dda2cd327ec651dZhihai Xu                    a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
958379743beded881127703334e1dda2cd327ec651dZhihai Xu                    ack = TRUE;
959379743beded881127703334e1dda2cd327ec651dZhihai Xu                }
9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* we were remotely started,  make sure codec
9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   is setup before datapath is started */
9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_a2dp_setup_codec();
9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* media task is autostarted upon a2dp audiopath connection */
9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
971379743beded881127703334e1dda2cd327ec651dZhihai Xu    else if (pending_start)
9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
974379743beded881127703334e1dda2cd327ec651dZhihai Xu        ack = TRUE;
9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
976379743beded881127703334e1dda2cd327ec651dZhihai Xu    return ack;
9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9825fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Function        btif_a2dp_ack_fail
9835fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren**
9845fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Description
9855fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren**
9865fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Returns
9875fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren**
9885fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren*******************************************************************************/
9895fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
9905fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agrenvoid btif_a2dp_ack_fail(void)
9915fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren{
992e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## A2DP_CTRL_ACK_FAILURE ##");
9935fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
9945fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren}
9955fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
9965fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren/*****************************************************************************
9975fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren**
9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_on_stopped
9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av)
10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1008e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## ON A2DP STOPPED ##");
10093e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    if (btif_media_cb.peer_sep == AVDT_TSEP_SRC) /*  Handling for A2DP SINK cases*/
1010f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1011f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_cb.rx_flush = TRUE;
1012f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_rx_flush_req();
1013c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati        btif_media_task_aa_handle_stop_decoding();
10143e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        UIPC_Close(UIPC_CH_ID_AV_AUDIO);
10153e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        btif_media_cb.data_channel_open = FALSE;
1016f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return;
1017f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* allow using this api for other than suspend */
10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_av != NULL)
10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_av->status != BTA_AV_SUCCESS)
10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1023e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_EVENT("AV STOP FAILED (%d)", p_av->status);
10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_av->initiator)
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* ensure tx frames are immediately suspended */
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.tx_flush = 1;
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* request to stop media task  */
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_aa_tx_flush_req();
10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_stop_aa_req();
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* once stream is fully stopped we will ack back */
10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_on_suspended
10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av)
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1054e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## ON A2DP SUSPENDED ##");
10553e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
1056f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1057f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_cb.rx_flush = TRUE;
1058f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_rx_flush_req();
1059c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati        btif_media_task_aa_handle_stop_decoding();
1060f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return;
1061f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check for status failures */
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_av->status != BTA_AV_SUCCESS)
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_av->initiator == TRUE)
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* once stream is fully stopped we will ack back */
10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* ensure tx frames are immediately flushed */
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.tx_flush = 1;
10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* stop timer tick */
10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_stop_aa_req();
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1079f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/* when true media task discards any rx frames */
1080f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptavoid btif_a2dp_set_rx_flush(BOOLEAN enable)
1081f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
1082e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## DROP RX %d ##", enable);
1083f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    btif_media_cb.rx_flush = enable;
1084f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
1085f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* when true media task discards any tx frames */
10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_set_tx_flush(BOOLEAN enable)
10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1089e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## DROP TX %d ##", enable);
10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.tx_flush = enable;
10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10936718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE)
109423e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context)
1095f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
1096f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT8 count;
1097f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    tBT_SBC_HDR *p_msg;
1098f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    int num_sbc_frames;
1099f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    int num_frames_to_process;
1100f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1101aea27ef29bd0be1d9faa5dcf94588107e9b6a51dRakesh Iyer    count = btif_media_cb.RxSbcQ._count;
1102f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (0 == count)
1103f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1104e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("  QUE  EMPTY ");
1105f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
1106f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    else
1107f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1108f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        if (btif_media_cb.rx_flush == TRUE)
1109f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        {
1110f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            btif_media_flush_q(&(btif_media_cb.RxSbcQ));
1111f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            return;
1112f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        }
1113f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1114f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        num_frames_to_process = btif_media_cb.frames_to_process;
1115e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG(" Process Frames + ");
1116f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1117f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        do
1118f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        {
1119f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            p_msg = (tBT_SBC_HDR *)GKI_getfirst(&(btif_media_cb.RxSbcQ));
1120f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            if (p_msg == NULL)
1121f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                return;
1122f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_sbc_frames  = p_msg->num_frames_to_be_processed; /* num of frames in Que Packets */
1123e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Frames left in topmost packet %d", num_sbc_frames);
1124e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Remaining frames to process in tick %d", num_frames_to_process);
1125aea27ef29bd0be1d9faa5dcf94588107e9b6a51dRakesh Iyer            APPL_TRACE_DEBUG(" Num of Packets in Que %d", btif_media_cb.RxSbcQ._count);
1126f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1127f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            if ( num_sbc_frames > num_frames_to_process) /*  Que Packet has more frames*/
1128f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            {
1129f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                 p_msg->num_frames_to_be_processed= num_frames_to_process;
1130f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                 btif_media_task_handle_inc_media(p_msg);
1131f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                 p_msg->num_frames_to_be_processed = num_sbc_frames - num_frames_to_process;
1132f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                 num_frames_to_process = 0;
1133f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                 break;
1134f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            }
1135f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            else                                        /*  Que packet has less frames */
1136f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            {
1137f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                btif_media_task_handle_inc_media(p_msg);
1138f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                p_msg = (tBT_SBC_HDR *)GKI_dequeue(&(btif_media_cb.RxSbcQ));
1139f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                if( p_msg == NULL )
1140f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                {
1141e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                     APPL_TRACE_ERROR("Insufficient data in que ");
1142f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                     break;
1143f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                }
1144f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                num_frames_to_process = num_frames_to_process - p_msg->num_frames_to_be_processed;
1145f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                GKI_freebuf(p_msg);
1146f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            }
1147f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        }while(num_frames_to_process > 0);
1148f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1149e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG(" Process Frames - ");
1150f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
1151f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
115223e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati#else
115323e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context) {}
1154f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
1155f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
115623e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_task_aa_handle_timer(UNUSED_ATTR void *context)
11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    log_tstamps_us("media task tx timer");
11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
1161e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta    if(btif_media_cb.is_tx_timer == TRUE)
1162e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta    {
1163e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta        btif_media_send_aa_frame();
1164e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta    }
1165e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta    else
1166e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta    {
1167e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("ERROR Media task Scheduled after Suspend");
1168e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta    }
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_handle_uipc_rx_rdy(void)
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* process all the UIPC data */
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_aa_prep_2_send(0xFF);
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send it */
1179db554581079863974af8e1289646f5deea6fc044Marie Janssen    LOG_VERBOSE(LOG_TAG, "btif_media_task_aa_handle_uipc_rx_rdy calls bta_av_ci_src_data_ready");
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO);
11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
118423e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_thread_init(UNUSED_ATTR void *context) {
118523e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati  memset(&btif_media_cb, 0, sizeof(btif_media_cb));
118623e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati  UIPC_Init(NULL);
11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
118923e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati  UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb);
1190f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
1191f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
119223e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati  raise_priority_a2dp(TASK_HIGH_MEDIA);
119323e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati  media_task_running = MEDIA_TASK_STATE_ON;
119423e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati}
1195f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
119623e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_thread_cleanup(UNUSED_ATTR void *context) {
119723e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati  /* make sure no channels are restarted while shutting down */
119823e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati  media_task_running = MEDIA_TASK_STATE_SHUTTING_DOWN;
11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
120023e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati  /* this calls blocks until uipc is fully closed */
120123e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati  UIPC_Close(UIPC_CH_ID_ALL);
12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
120323e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati  /* Clear media task flag */
120423e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati  media_task_running = MEDIA_TASK_STATE_OFF;
12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_send_cmd_evt
12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_send_cmd_evt(UINT16 Evt)
12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->event = Evt;
12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1226860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton    fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_flush_q
12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_flush_q(BUFFER_Q *p_q)
12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12416449e497dfe4d500810c3e7b4d7d056027c33a0eSharvil Nanavati    while (!GKI_queue_is_empty(p_q))
12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(GKI_dequeue(p_q));
12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
124723e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_thread_handle_cmd(fixed_queue_t *queue, UNUSED_ATTR void *context)
12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
124923e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati    BT_HDR *p_msg = (BT_HDR *)fixed_queue_dequeue(queue);
1250db554581079863974af8e1289646f5deea6fc044Marie Janssen    LOG_VERBOSE(LOG_TAG, "btif_media_thread_handle_cmd : %d %s", p_msg->event,
12515fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren             dump_media_event(p_msg->event));
12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_msg->event)
12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_START_AA_TX:
12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_aa_start_tx();
12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_STOP_AA_TX:
12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_aa_stop_tx();
12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_SBC_ENC_INIT:
12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_enc_init(p_msg);
12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_SBC_ENC_UPDATE:
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_enc_update(p_msg);
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_AUDIO_FEEDING_INIT:
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_audio_feeding_init(p_msg);
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_FLUSH_AA_TX:
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_aa_tx_flush(p_msg);
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_UIPC_RX_RDY:
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_aa_handle_uipc_rx_rdy();
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
1277f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    case BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE:
12786718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE)
1279f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_handle_decoder_reset(p_msg);
1280f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
1281f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        break;
1282f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    case BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK:
12836718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE)
1284f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_handle_clear_track();
1285f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
1286f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        break;
1287f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta     case BTIF_MEDIA_FLUSH_AA_RX:
1288f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_rx_flush();
1289f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        break;
12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
129223e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati        APPL_TRACE_ERROR("ERROR in %s unknown event %d", __func__, p_msg->event);
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_freebuf(p_msg);
1295db554581079863974af8e1289646f5deea6fc044Marie Janssen    LOG_VERBOSE(LOG_TAG, "%s: %s DONE", __func__, dump_media_event(p_msg->event));
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12986718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE)
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
1301f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_handle_inc_media
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
1308f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg)
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1310f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT8 *sbc_start_frame = ((UINT8*)(p_msg + 1) + p_msg->offset + 1);
1311f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    int count;
1312f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT32 pcmBytes, availPcmBytes;
1313f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    OI_INT16 *pcmDataPointer = pcmData; /*Will be overwritten on next packet receipt*/
1314f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    OI_STATUS status;
1315f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    int num_sbc_frames = p_msg->num_frames_to_be_processed;
1316f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT32 sbc_frame_len = p_msg->len - 1;
1317f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    availPcmBytes = 2*sizeof(pcmData);
1318f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
13193e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    if ((btif_media_cb.peer_sep == AVDT_TSEP_SNK) || (btif_media_cb.rx_flush))
1320f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1321e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG(" State Changed happened in this tick ");
1322f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return;
1323f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
13243e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
13253e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    // ignore data if no one is listening
13263e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    if (!btif_media_cb.data_channel_open)
13273e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        return;
13283e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
1329e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("Number of sbc frames %d, frame_len %d", num_sbc_frames, sbc_frame_len);
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1331f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    for(count = 0; count < num_sbc_frames && sbc_frame_len != 0; count ++)
1332f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1333f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        pcmBytes = availPcmBytes;
1334ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        status = OI_CODEC_SBC_DecodeFrame(&context, (const OI_BYTE**)&sbc_start_frame,
1335ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                                        (OI_UINT32 *)&sbc_frame_len,
1336ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                                        (OI_INT16 *)pcmDataPointer,
1337ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                                        (OI_UINT32 *)&pcmBytes);
1338f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        if (!OI_SUCCESS(status)) {
1339e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("Decoding failure: %d\n", status);
1340f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
1341f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        }
1342f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        availPcmBytes -= pcmBytes;
1343f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        pcmDataPointer += pcmBytes/2;
1344f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        p_msg->offset += (p_msg->len - 1) - sbc_frame_len;
1345f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        p_msg->len = sbc_frame_len + 1;
1346f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13483e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    UIPC_Send(UIPC_CH_ID_AV_AUDIO, 0, (UINT8 *)pcmData, (2*sizeof(pcmData) - availPcmBytes));
1349f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
1350f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_enc_init_req
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_enc_init_req(tBTIF_MEDIA_INIT_AUDIO *p_msg)
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_INIT_AUDIO *p_buf;
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_INIT_AUDIO))))
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO));
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_INIT;
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1373860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton    fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_enc_update_req
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_enc_update_req(tBTIF_MEDIA_UPDATE_AUDIO *p_msg)
13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_UPDATE_AUDIO *p_buf;
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_UPDATE_AUDIO))))
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_UPDATE_AUDIO));
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_UPDATE;
13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1397860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton    fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_audio_feeding_init_req
14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_audio_feeding_init_req(tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_msg)
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_buf;
14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING))))
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING));
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->hdr.event = BTIF_MEDIA_AUDIO_FEEDING_INIT;
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1421860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton    fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_start_aa_req
14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_start_aa_req(void)
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1439e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_EVENT("GKI failed");
14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->event = BTIF_MEDIA_START_AA_TX;
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1445860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton    fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_stop_aa_req
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_stop_aa_req(void)
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->event = BTIF_MEDIA_STOP_AA_TX;
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1468caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov    /*
1469caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov     * Explicitly check whether the btif_media_cmd_msg_queue is not NULL to
1470caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov     * avoid a race condition during shutdown of the Bluetooth stack.
1471caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov     * This race condition is triggered when A2DP audio is streaming on
1472caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov     * shutdown:
1473caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov     * "btif_a2dp_on_stopped() -> btif_media_task_stop_aa_req()" is called
1474caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov     * to stop the particular audio stream, and this happens right after
1475caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov     * the "cleanup() -> btif_a2dp_stop_media_task()" processing during
1476caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov     * the shutdown of the Bluetooth stack.
1477caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov     */
1478caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov    if (btif_media_cmd_msg_queue != NULL)
1479caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov        fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
1480caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov
14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1483f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
1484f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1485f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_aa_rx_flush_req
1486f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1487f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
1488f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1489f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          TRUE is success
1490f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1491f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
1492f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaBOOLEAN btif_media_task_aa_rx_flush_req(void)
1493f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
1494f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BT_HDR *p_buf;
1495f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1496f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (GKI_queue_is_empty(&(btif_media_cb.RxSbcQ))== TRUE) /*  Que is already empty */
1497f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return TRUE;
1498f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1499f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1500f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1501f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return FALSE;
1502f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
1503f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1504f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    p_buf->event = BTIF_MEDIA_FLUSH_AA_RX;
1505f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1506860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton    fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
1507f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    return TRUE;
1508f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_aa_tx_flush_req
15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_aa_tx_flush_req(void)
15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1521197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov    BT_HDR *p_buf = GKI_getbuf(sizeof(BT_HDR));
1522197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov
1523197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov    if (p_buf == NULL)
15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->event = BTIF_MEDIA_FLUSH_AA_TX;
15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1528197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov    /*
1529197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov     * Explicitly check whether the btif_media_cmd_msg_queue is not NULL to
1530197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov     * avoid a race condition during shutdown of the Bluetooth stack.
1531197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov     * This race condition is triggered when A2DP audio is streaming on
1532197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov     * shutdown:
1533197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov     * "btif_a2dp_on_stopped() -> btif_media_task_aa_tx_flush_req()" is called
1534197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov     * to stop the particular audio stream, and this happens right after
1535197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov     * the "cleanup() -> btif_a2dp_stop_media_task()" processing during
1536197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov     * the shutdown of the Bluetooth stack.
1537197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov     */
1538197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov    if (btif_media_cmd_msg_queue != NULL)
1539197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov        fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf);
1540197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1543f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
1544f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1545f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_aa_rx_flush
1546f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1547f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
1548f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1549f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          void
1550f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1551f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
1552f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_rx_flush(void)
1553f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
1554f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    /* Flush all enqueued GKI SBC  buffers (encoded) */
1555e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_aa_rx_flush");
1556f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1557f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    btif_media_flush_q(&(btif_media_cb.RxSbcQ));
1558f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
1559f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_aa_tx_flush
15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_tx_flush(BT_HDR *p_msg)
15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15725cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_msg);
15735cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Flush all enqueued GKI music buffers (encoded) */
1575e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_aa_tx_flush");
15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1577b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    btif_media_cb.media_feeding_state.pcm.counter = 0;
1578b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
1579b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_flush_q(&(btif_media_cb.TxAaQ));
15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REQ_RX_FLUSH, NULL);
15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function       btif_media_task_enc_init
15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description    Initialize encoding task
15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns        void
15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_init(BT_HDR *p_msg)
15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_INIT_AUDIO *pInitAudio = (tBTIF_MEDIA_INIT_AUDIO *) p_msg;
15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1598e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_enc_init");
15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.timestamp = 0;
16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* SBC encoder config (enforced even if not used) */
16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.encoder.s16ChannelMode = pInitAudio->ChannelMode;
16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.encoder.s16NumOfSubBands = pInitAudio->NumOfSubBands;
16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.encoder.s16NumOfBlocks = pInitAudio->NumOfBlocks;
16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.encoder.s16AllocationMethod = pInitAudio->AllocationMethod;
16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.encoder.s16SamplingFreq = pInitAudio->SamplingFreq;
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1609b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    btif_media_cb.encoder.u16BitRate = btif_media_task_get_sbc_rate();
1610b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Default transcoding is PCM to SBC, modified by feeding configuration */
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC;
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE-BTIF_MEDIA_AA_SBC_OFFSET-sizeof(BT_HDR))
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            < pInitAudio->MtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            - sizeof(BT_HDR)) : pInitAudio->MtuSize;
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1617e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("btif_media_task_enc_init busy %d, mtu %d, peer mtu %d",
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     btif_media_cb.busy_level, btif_media_cb.TxAaMtuSize, pInitAudio->MtuSize);
1619e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("      ch mode %d, subnd %d, nb blk %d, alloc %d, rate %d, freq %d",
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.encoder.s16ChannelMode, btif_media_cb.encoder.s16NumOfSubBands,
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.encoder.s16NumOfBlocks,
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.encoder.s16SamplingFreq);
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Reset entirely the SBC encoder */
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SBC_Encoder_Init(&(btif_media_cb.encoder));
1627e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_enc_init bit pool %d", btif_media_cb.encoder.s16BitPool);
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function       btif_media_task_enc_update
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description    Update encoding task
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns        void
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_update(BT_HDR *p_msg)
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_UPDATE_AUDIO * pUpdateAudio = (tBTIF_MEDIA_UPDATE_AUDIO *) p_msg;
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SBC_ENC_PARAMS *pstrEncParams = &btif_media_cb.encoder;
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 s16SamplingFreq;
1645a391bf1d4f4250e27b6f157a1a8d2493c36934dcAndre Eisenbach    SINT16 s16BitPool = 0;
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SINT16 s16BitRate;
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SINT16 s16FrameLen;
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 protect = 0;
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1650e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_enc_update : minmtu %d, maxbp %d minbp %d",
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pUpdateAudio->MinMtuSize, pUpdateAudio->MaxBitPool, pUpdateAudio->MinBitPool);
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Only update the bitrate and MTU size while timer is running to make sure it has been initialized */
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //if (btif_media_cb.is_tx_timer)
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16565fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren        btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE -
16575fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                                      BTIF_MEDIA_AA_SBC_OFFSET - sizeof(BT_HDR))
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                < pUpdateAudio->MinMtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                - sizeof(BT_HDR)) : pUpdateAudio->MinMtuSize;
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the initial target bit rate */
1662b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        pstrEncParams->u16BitRate = btif_media_task_get_sbc_rate();
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pstrEncParams->s16SamplingFreq == SBC_sf16000)
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            s16SamplingFreq = 16000;
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (pstrEncParams->s16SamplingFreq == SBC_sf32000)
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            s16SamplingFreq = 32000;
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (pstrEncParams->s16SamplingFreq == SBC_sf44100)
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            s16SamplingFreq = 44100;
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            s16SamplingFreq = 48000;
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        do
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1675a391bf1d4f4250e27b6f157a1a8d2493c36934dcAndre Eisenbach            if (pstrEncParams->s16NumOfBlocks == 0 || pstrEncParams->s16NumOfSubBands == 0
1676a391bf1d4f4250e27b6f157a1a8d2493c36934dcAndre Eisenbach                || pstrEncParams->s16NumOfChannels == 0)
1677a391bf1d4f4250e27b6f157a1a8d2493c36934dcAndre Eisenbach            {
1678a391bf1d4f4250e27b6f157a1a8d2493c36934dcAndre Eisenbach                APPL_TRACE_ERROR("btif_media_task_enc_update() - Avoiding division by zero...");
1679a391bf1d4f4250e27b6f157a1a8d2493c36934dcAndre Eisenbach                APPL_TRACE_ERROR("btif_media_task_enc_update() - block=%d, subBands=%d, channels=%d",
1680a391bf1d4f4250e27b6f157a1a8d2493c36934dcAndre Eisenbach                    pstrEncParams->s16NumOfBlocks, pstrEncParams->s16NumOfSubBands,
1681a391bf1d4f4250e27b6f157a1a8d2493c36934dcAndre Eisenbach                    pstrEncParams->s16NumOfChannels);
1682a391bf1d4f4250e27b6f157a1a8d2493c36934dcAndre Eisenbach                break;
1683a391bf1d4f4250e27b6f157a1a8d2493c36934dcAndre Eisenbach            }
1684a391bf1d4f4250e27b6f157a1a8d2493c36934dcAndre Eisenbach
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) ||
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (pstrEncParams->s16ChannelMode == SBC_STEREO) )
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                s16BitPool = (SINT16)( (pstrEncParams->u16BitRate *
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->s16NumOfSubBands * 1000 / s16SamplingFreq)
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    -( (32 + (4 * pstrEncParams->s16NumOfSubBands *
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->s16NumOfChannels)
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    + ( (pstrEncParams->s16ChannelMode - 2) *
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->s16NumOfSubBands )   )
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    / pstrEncParams->s16NumOfBlocks) );
16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                s16FrameLen = 4 + (4*pstrEncParams->s16NumOfSubBands*
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->s16NumOfChannels)/8
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    + ( ((pstrEncParams->s16ChannelMode - 2) *
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->s16NumOfSubBands)
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    + (pstrEncParams->s16NumOfBlocks * s16BitPool) ) / 8;
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                s16BitRate = (8 * s16FrameLen * s16SamplingFreq)
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    / (pstrEncParams->s16NumOfSubBands *
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->s16NumOfBlocks * 1000);
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (s16BitRate > pstrEncParams->u16BitRate)
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    s16BitPool--;
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(pstrEncParams->s16NumOfSubBands == 8)
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    s16BitPool = (s16BitPool > 255) ? 255 : s16BitPool;
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    s16BitPool = (s16BitPool > 128) ? 128 : s16BitPool;
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                s16BitPool = (SINT16)( ((pstrEncParams->s16NumOfSubBands *
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->u16BitRate * 1000)
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    / (s16SamplingFreq * pstrEncParams->s16NumOfChannels))
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    -( ( (32 / pstrEncParams->s16NumOfChannels) +
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (4 * pstrEncParams->s16NumOfSubBands) )
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /   pstrEncParams->s16NumOfBlocks ) );
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                pstrEncParams->s16BitPool = (s16BitPool >
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (16 * pstrEncParams->s16NumOfSubBands))
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    ? (16*pstrEncParams->s16NumOfSubBands) : s16BitPool;
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (s16BitPool < 0)
17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                s16BitPool = 0;
17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1733e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_EVENT("bitpool candidate : %d (%d kbps)",
17345fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                         s16BitPool, pstrEncParams->u16BitRate);
17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (s16BitPool > pUpdateAudio->MaxBitPool)
17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1738e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_DEBUG("btif_media_task_enc_update computed bitpool too large (%d)",
17395fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                                    s16BitPool);
17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Decrease bitrate */
17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_media_cb.encoder.u16BitRate -= BTIF_MEDIA_BITRATE_STEP;
17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Record that we have decreased the bitrate */
17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                protect |= 1;
17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (s16BitPool < pUpdateAudio->MinBitPool)
17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1747e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_WARNING("btif_media_task_enc_update computed bitpool too small (%d)", s16BitPool);
17484e3593a9a1c596904a844286fbe704e969e7230eAndre Eisenbach
17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Increase bitrate */
17504e3593a9a1c596904a844286fbe704e969e7230eAndre Eisenbach                UINT16 previous_u16BitRate = btif_media_cb.encoder.u16BitRate;
17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_media_cb.encoder.u16BitRate += BTIF_MEDIA_BITRATE_STEP;
17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Record that we have increased the bitrate */
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                protect |= 2;
17544e3593a9a1c596904a844286fbe704e969e7230eAndre Eisenbach                /* Check over-flow */
17554e3593a9a1c596904a844286fbe704e969e7230eAndre Eisenbach                if (btif_media_cb.encoder.u16BitRate < previous_u16BitRate)
17564e3593a9a1c596904a844286fbe704e969e7230eAndre Eisenbach                    protect |= 3;
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* In case we have already increased and decreased the bitrate, just stop */
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (protect == 3)
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1765e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_ERROR("btif_media_task_enc_update could not find bitpool in range");
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        } while (1);
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Finally update the bitpool in the encoder structure */
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pstrEncParams->s16BitPool = s16BitPool;
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1773e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("btif_media_task_enc_update final bit rate %d, final bit pool %d",
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_media_cb.encoder.u16BitRate, btif_media_cb.encoder.s16BitPool);
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* make sure we reinitialize encoder with new settings */
17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        SBC_Encoder_Init(&(btif_media_cb.encoder));
17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_pcm2sbc_init
17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      Init encoding task for PCM to SBC according to feeding
17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_pcm2sbc_init(tBTIF_MEDIA_INIT_AUDIO_FEEDING * p_feeding)
17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN reconfig_needed = FALSE;
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1794e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("PCM feeding:");
1795e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("sampling_freq:%d", p_feeding->feeding.cfg.pcm.sampling_freq);
1796e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("num_channel:%d", p_feeding->feeding.cfg.pcm.num_channel);
1797e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bit_per_sample:%d", p_feeding->feeding.cfg.pcm.bit_per_sample);
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check the PCM feeding sampling_freq */
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_feeding->feeding.cfg.pcm.sampling_freq)
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case  8000:
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 12000:
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 16000:
18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 24000:
18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 32000:
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 48000:
18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* For these sampling_freq the AV connection must be 48000 */
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf48000)
18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Reconfiguration needed at 48000 */
1812e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_DEBUG("SBC Reconfiguration needed at 48000");
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_media_cb.encoder.s16SamplingFreq = SBC_sf48000;
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                reconfig_needed = TRUE;
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 11025:
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 22050:
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 44100:
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* For these sampling_freq the AV connection must be 44100 */
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf44100)
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Reconfiguration needed at 44100 */
1825e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_DEBUG("SBC Reconfiguration needed at 44100");
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_media_cb.encoder.s16SamplingFreq = SBC_sf44100;
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                reconfig_needed = TRUE;
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
1831e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("Feeding PCM sampling_freq unsupported");
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Some AV Headsets do not support Mono => always ask for Stereo */
18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btif_media_cb.encoder.s16ChannelMode == SBC_MONO)
18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1838e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("SBC Reconfiguration needed in Stereo");
18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_cb.encoder.s16ChannelMode = SBC_JOINT_STEREO;
18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        reconfig_needed = TRUE;
18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (reconfig_needed != FALSE)
18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1845e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init :: mtu %d", btif_media_cb.TxAaMtuSize);
1846e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("ch mode %d, nbsubd %d, nb %d, alloc %d, rate %d, freq %d",
18475fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                btif_media_cb.encoder.s16ChannelMode,
18485fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                btif_media_cb.encoder.s16NumOfSubBands, btif_media_cb.encoder.s16NumOfBlocks,
18495fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
18505fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                btif_media_cb.encoder.s16SamplingFreq);
18515fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        SBC_Encoder_Init(&(btif_media_cb.encoder));
18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1856e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init no SBC reconfig needed");
18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_audio_feeding_init
18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      Initialize the audio path according to the feeding format
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_audio_feeding_init(BT_HDR *p_msg)
18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_feeding = (tBTIF_MEDIA_INIT_AUDIO_FEEDING *) p_msg;
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1874e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_audio_feeding_init format:%d", p_feeding->feeding.format);
18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save Media Feeding information */
18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.feeding_mode = p_feeding->feeding_mode;
18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.media_feeding = p_feeding->feeding;
18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Handle different feeding formats */
18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_feeding->feeding.format)
18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTIF_AV_CODEC_PCM:
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC;
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_task_pcm2sbc_init(p_feeding);
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default :
1889e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("unknown feeding format %d", p_feeding->feeding.format);
18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18943e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodint btif_a2dp_get_track_frequency(UINT8 frequency) {
1895f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    int freq = 48000;
1896f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch (frequency) {
1897f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_16:
1898f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq = 16000;
1899f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
1900f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_32:
1901f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq = 32000;
1902f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
1903f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_44:
1904f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq = 44100;
1905f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
1906f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_48:
1907f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq = 48000;
1908f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
1909f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
1910f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    return freq;
1911f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
1912f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
19133e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodint btif_a2dp_get_track_channel_count(UINT8 channeltype) {
19143e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    int count = 1;
1915f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch (channeltype) {
1916f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_MONO:
19173e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            count = 1;
1918f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
1919f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_DUAL:
1920f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_STEREO:
1921f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_JOINT:
19223e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            count = 2;
1923f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
1924f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
19253e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    return count;
19263e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood}
19273e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
19283e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodvoid btif_a2dp_set_peer_sep(UINT8 sep) {
19293e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    btif_media_cb.peer_sep = sep;
1930f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
1931f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1932c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavatistatic void btif_decode_alarm_cb(UNUSED_ATTR void *context) {
193323e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati  thread_post(worker_thread, btif_media_task_avk_handle_timer, NULL);
1934f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
1935f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1936c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavatistatic void btif_media_task_aa_handle_stop_decoding(void) {
193771864f490d4dc31857df0b31924cd62a337e9f1aZach Johnson  alarm_free(btif_media_cb.decode_alarm);
1938c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati  btif_media_cb.decode_alarm = NULL;
1939c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati}
1940c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati
1941c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavatistatic void btif_media_task_aa_handle_start_decoding(void) {
1942c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati  if (btif_media_cb.decode_alarm)
1943c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    return;
1944c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati
1945c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati  btif_media_cb.decode_alarm = alarm_new();
1946c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati  if (!btif_media_cb.decode_alarm) {
1947db554581079863974af8e1289646f5deea6fc044Marie Janssen    LOG_ERROR(LOG_TAG, "%s unable to allocate decode alarm.", __func__);
1948c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    return;
1949c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati  }
1950c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati
195171864f490d4dc31857df0b31924cd62a337e9f1aZach Johnson  alarm_set_periodic(btif_media_cb.decode_alarm, BTIF_SINK_MEDIA_TIME_TICK, btif_decode_alarm_cb, NULL);
1952f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
1953f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
19546718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE)
1955f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1956f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_clear_track (void)
1957f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
1958e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_aa_handle_clear_track");
1959f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
1960f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1961f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
1962f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1963f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_aa_handle_decoder_reset
1964f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1965f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
1966f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1967f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          void
1968f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1969f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
1970f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg)
1971f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
1972f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf = (tBTIF_MEDIA_SINK_CFG_UPDATE*) p_msg;
1973f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    tA2D_STATUS a2d_status;
1974f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    tA2D_SBC_CIE sbc_cie;
1975f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    OI_STATUS       status;
1976ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    UINT32          freq_multiple = 48*20; /* frequency multiple for 20ms of data , initialize with 48K*/
1977ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    UINT32          num_blocks = 16;
1978ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    UINT32          num_subbands = 8;
1979f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1980e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_aa_handle_decoder_reset p_codec_info[%x:%x:%x:%x:%x:%x]",
1981f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            p_buf->codec_info[1], p_buf->codec_info[2], p_buf->codec_info[3],
1982f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            p_buf->codec_info[4], p_buf->codec_info[5], p_buf->codec_info[6]);
1983f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1984f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_buf->codec_info, FALSE);
1985f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (a2d_status != A2D_SUCCESS)
1986f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1987e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
1988f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return;
1989f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
19903e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
19913e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    btif_media_cb.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq);
19923e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    btif_media_cb.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode);
19933e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
1994f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    btif_media_cb.rx_flush = FALSE;
1995e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("Reset to sink role");
1996ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    status = OI_CODEC_SBC_DecoderReset(&context, contextData, sizeof(contextData), 2, 2, FALSE);
1997f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (!OI_SUCCESS(status)) {
1998e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("OI_CODEC_SBC_DecoderReset failed with error code %d\n", status);
1999f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
20003e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
20013e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
2002f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2003f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch(sbc_cie.samp_freq)
2004f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2005f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_16:
2006e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);
2007f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq_multiple = 16*20;
2008f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2009f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_32:
2010e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);
2011f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq_multiple = 32*20;
2012f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2013f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_44:
2014e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tsamp_freq:%d (44100)", sbc_cie.samp_freq);
2015f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq_multiple = 441*2;
2016f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2017f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_48:
2018e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);
2019f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq_multiple = 48*20;
2020f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2021f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        default:
2022e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Unknown Frequency ");
2023f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2024f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2025f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2026f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch(sbc_cie.ch_mode)
2027f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2028f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_MONO:
2029e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);
2030f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2031f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_DUAL:
2032e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tch_mode:%d (DUAL)", sbc_cie.ch_mode);
2033f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2034f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_STEREO:
2035e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tch_mode:%d (STEREO)", sbc_cie.ch_mode);
2036f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2037f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_JOINT:
2038e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tch_mode:%d (JOINT)", sbc_cie.ch_mode);
2039f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2040f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        default:
2041e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Unknown Mode ");
2042f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2043f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2044f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2045f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch(sbc_cie.block_len)
2046f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2047f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_BLOCKS_4:
2048e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);
2049f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_blocks = 4;
2050f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2051f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_BLOCKS_8:
2052e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);
2053f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_blocks = 8;
2054f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2055f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_BLOCKS_12:
2056e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);
2057f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_blocks = 12;
2058f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2059f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_BLOCKS_16:
2060e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);
2061f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_blocks = 16;
2062f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2063f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        default:
2064e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Unknown BlockLen ");
2065f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2066f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2067f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2068f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch(sbc_cie.num_subbands)
2069f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2070f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SUBBAND_4:
2071e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);
2072f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_subbands = 4;
2073f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2074f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SUBBAND_8:
2075e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);
2076f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_subbands = 8;
2077f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2078f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        default:
2079e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Unknown SubBands ");
2080f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2081f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2082f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2083f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch(sbc_cie.alloc_mthd)
2084f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2085f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_ALLOC_MD_S:
2086e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);
2087f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2088f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_ALLOC_MD_L:
2089e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\talloc_mthd:%d (Loudness)", sbc_cie.alloc_mthd);
2090f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2091f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        default:
2092e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Unknown Allocation Method");
2093f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2094f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2095f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2096e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
2097f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2098f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    btif_media_cb.frames_to_process = ((freq_multiple)/(num_blocks*num_subbands)) + 1;
2099e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG(" Frames to be processed in 20 ms %d",btif_media_cb.frames_to_process);
2100f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
2101f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
2102f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_feeding_state_reset
21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      Reset the media feeding state
21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_feeding_state_reset(void)
21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* By default, just clear the entire state */
21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&btif_media_cb.media_feeding_state, 0, sizeof(btif_media_cb.media_feeding_state));
2116b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
2117b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    if (btif_media_cb.TxTranscoding == BTIF_MEDIA_TRSCD_PCM_2_SBC)
2118b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    {
2119b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        btif_media_cb.media_feeding_state.pcm.bytes_per_tick =
2120b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                (btif_media_cb.media_feeding.cfg.pcm.sampling_freq *
2121b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                 btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8 *
2122b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                 btif_media_cb.media_feeding.cfg.pcm.num_channel *
2123b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                 BTIF_MEDIA_TIME_TICK)/1000;
2124b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
2125e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_WARNING("pcm bytes per tick %d",
2126b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                            (int)btif_media_cb.media_feeding_state.pcm.bytes_per_tick);
2127b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    }
21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2129c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati
2130c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavatistatic void btif_media_task_alarm_cb(UNUSED_ATTR void *context) {
213123e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati  thread_post(worker_thread, btif_media_task_aa_handle_timer, NULL);
2132c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati}
2133c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati
21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
21365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_aa_start_tx
21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      Start media task encoding
21395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
21405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
21415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
21425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
21435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_start_tx(void)
21445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2145e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_aa_start_tx is timer %d, feeding mode %d",
21465fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren             btif_media_cb.is_tx_timer, btif_media_cb.feeding_mode);
21475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Use a timer to poll the UIPC, get rid of the UIPC call back */
21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    // UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_CBACK, NULL);
21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.is_tx_timer = TRUE;
2152f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach    last_frame_us = 0;
21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Reset the media feeding state */
21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_feeding_state_reset();
21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2157c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    APPL_TRACE_EVENT("starting timer %dms", BTIF_MEDIA_TIME_TICK);
2158c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati
2159c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    assert(btif_media_cb.media_alarm == NULL);
21605fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
2161c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    btif_media_cb.media_alarm = alarm_new();
2162c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    if (!btif_media_cb.media_alarm) {
2163db554581079863974af8e1289646f5deea6fc044Marie Janssen      LOG_ERROR(LOG_TAG, "%s unable to allocate media alarm.", __func__);
2164c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati      return;
2165c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    }
21665fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
216771864f490d4dc31857df0b31924cd62a337e9f1aZach Johnson    alarm_set_periodic(btif_media_cb.media_alarm, BTIF_MEDIA_TIME_TICK, btif_media_task_alarm_cb, NULL);
21685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
21695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
21715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
21725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_aa_stop_tx
21735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
21745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      Stop media task encoding
21755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
21765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
21785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
21795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_stop_tx(void)
21805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
21819c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta    APPL_TRACE_DEBUG("%s is_tx_timer: %d", __func__, btif_media_cb.is_tx_timer);
21829c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta
21839c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta    const bool send_ack = (btif_media_cb.is_tx_timer != FALSE);
21845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Stop the timer first */
2186c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    alarm_free(btif_media_cb.media_alarm);
2187c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati    btif_media_cb.media_alarm = NULL;
21885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.is_tx_timer = FALSE;
21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UIPC_Close(UIPC_CH_ID_AV_AUDIO);
21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21929c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta    /* Try to send acknowldegment once the media stream is
21939c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta       stopped. This will make sure that the A2DP HAL layer is
21949c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta       un-blocked on wait for acknowledgment for the sent command.
21959c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta       This resolves a corner cases AVDTP SUSPEND collision
21969c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta       when the DUT and the remote device issue SUSPEND simultaneously
21979c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta       and due to the processing of the SUSPEND request from the remote,
21989c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta       the media path is torn down. If the A2DP HAL happens to wait
21999c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta       for ACK for the initiated SUSPEND, it would never receive it casuing
22009c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta       a block/wait. Due to this acknowledgement, the A2DP HAL is guranteed
22019c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta       to get the ACK for any pending command in such cases. */
22029c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta
22039c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta    if (send_ack)
22049c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta        a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
22059c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta
22065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* audio engine stopped, reset tx suspended flag */
22075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.tx_flush = 0;
2208f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach    last_frame_us = 0;
22095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Reset the media feeding state */
22115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_feeding_state_reset();
22125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
22135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
22165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_get_num_aa_frame
22175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
22185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
22205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          The number of media frames in this time slice
22215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
22225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
22235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btif_get_num_aa_frame(void)
22245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2225c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach    UINT8 result=0;
22265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (btif_media_cb.TxTranscoding)
22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTIF_MEDIA_TRSCD_PCM_2_SBC:
2230c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach        {
2231b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren            UINT32 pcm_bytes_per_frame = btif_media_cb.encoder.s16NumOfSubBands *
2232b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                             btif_media_cb.encoder.s16NumOfBlocks *
2233b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                             btif_media_cb.media_feeding.cfg.pcm.num_channel *
2234b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                             btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
22355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2236f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach            UINT32 us_this_tick = BTIF_MEDIA_TIME_TICK * 1000;
2237f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach            UINT64 now_us = time_now_us();
2238f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach            if (last_frame_us != 0)
2239f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach                us_this_tick = (now_us - last_frame_us);
2240f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach            last_frame_us = now_us;
2241f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach
2242b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren            btif_media_cb.media_feeding_state.pcm.counter +=
2243f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach                                btif_media_cb.media_feeding_state.pcm.bytes_per_tick *
2244f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach                                us_this_tick / (BTIF_MEDIA_TIME_TICK * 1000);
2245c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach
2246c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach            /* calculate nbr of frames pending for this media tick */
2247c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach            result = btif_media_cb.media_feeding_state.pcm.counter/pcm_bytes_per_frame;
2248c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach            if (result > MAX_PCM_FRAME_NUM_PER_TICK)
2249c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach            {
2250c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach                APPL_TRACE_WARNING("%s() - Limiting frames to be sent from %d to %d"
2251c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach                    , __FUNCTION__, result, MAX_PCM_FRAME_NUM_PER_TICK);
2252c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach                result = MAX_PCM_FRAME_NUM_PER_TICK;
22534aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            }
2254c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach            btif_media_cb.media_feeding_state.pcm.counter -= result*pcm_bytes_per_frame;
2255f061e74b81863771b174d1717a6165034dbad8e5Mattias Agren
2256db554581079863974af8e1289646f5deea6fc044Marie Janssen            LOG_VERBOSE(LOG_TAG, "WRITE %d FRAMES", result);
2257b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        }
2258b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        break;
22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
2261e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("ERROR btif_get_num_aa_frame Unsupported transcoding format 0x%x",
22625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btif_media_cb.TxTranscoding);
22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            result = 0;
22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22674aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu    return (UINT8)result;
22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
22715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
2272f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_sink_enque_buf
2273f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2274f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description      This function is called by the av_co to fill A2DP Sink Queue
2275f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2276f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2277f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          size of the queue
2278f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
2279f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaUINT8 btif_media_sink_enque_buf(BT_HDR *p_pkt)
2280f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
2281f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    tBT_SBC_HDR *p_msg;
2282f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2283f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if(btif_media_cb.rx_flush == TRUE) /* Flush enabled, do not enque*/
2284fe7216ca12f91baae733e7c93063db73121af308Chris Manton        return GKI_queue_length(&btif_media_cb.RxSbcQ);
2285fe7216ca12f91baae733e7c93063db73121af308Chris Manton    if(GKI_queue_length(&btif_media_cb.RxSbcQ) == MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ)
2286f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2287f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        GKI_freebuf(GKI_dequeue(&(btif_media_cb.RxSbcQ)));
2288f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2289f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2290e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + ");
2291f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    /* allocate and Queue this buffer */
2292f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if ((p_msg = (tBT_SBC_HDR *) GKI_getbuf(sizeof(tBT_SBC_HDR) +
2293f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                        p_pkt->offset+ p_pkt->len)) != NULL)
2294f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2295f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        memcpy(p_msg, p_pkt, (sizeof(BT_HDR) + p_pkt->offset + p_pkt->len));
2296f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        p_msg->num_frames_to_be_processed = (*((UINT8*)(p_msg + 1) + p_msg->offset)) & 0x0f;
2297e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + ", p_msg->num_frames_to_be_processed);
2298f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        GKI_enqueue(&(btif_media_cb.RxSbcQ), p_msg);
2299fe7216ca12f91baae733e7c93063db73121af308Chris Manton        if(GKI_queue_length(&btif_media_cb.RxSbcQ) == MAX_A2DP_DELAYED_START_FRAME_COUNT)
2300f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        {
2301e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG(" Initiate Decoding ");
2302c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati            btif_media_task_aa_handle_start_decoding();
2303f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        }
2304f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2305f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    else
2306f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2307f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        /* let caller deal with a failed allocation */
2308e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf No Buffer left - ");
2309f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2310fe7216ca12f91baae733e7c93063db73121af308Chris Manton    return GKI_queue_length(&btif_media_cb.RxSbcQ);
2311f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
2312f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2313f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
2314f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
23155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_aa_readbuf
23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      This function is called by the av_co to get the next buffer to send
23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *btif_media_aa_readbuf(void)
23235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
23245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return GKI_dequeue(&(btif_media_cb.TxAaQ));
23255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
23265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
23285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_aa_read_feeding
23305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
23325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
23345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_aa_read_feeding(tUIPC_CH_ID channel_id)
23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 event;
23405fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands * \
23415fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                             btif_media_cb.encoder.s16NumOfBlocks;
23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 read_size;
23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 sbc_sampling = 48000;
23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 src_samples;
23455fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    UINT16 bytes_needed = blocm_x_subband * btif_media_cb.encoder.s16NumOfChannels * \
2346b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                          btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
23475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    static UINT16 up_sampled_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS
23485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS * 2];
23495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    static UINT16 read_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS
23505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS];
23515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 src_size_used;
23525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 dst_size_used;
23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN fract_needed;
23545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32   fract_max;
23555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32   fract_threshold;
23565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  nb_byte_read;
23575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Get the SBC sampling rate */
23595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (btif_media_cb.encoder.s16SamplingFreq)
23605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SBC_sf48000:
23625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sbc_sampling = 48000;
23635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
23645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SBC_sf44100:
23655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sbc_sampling = 44100;
23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SBC_sf32000:
23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sbc_sampling = 32000;
23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SBC_sf16000:
23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sbc_sampling = 16000;
23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2375b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    if (sbc_sampling == btif_media_cb.media_feeding.cfg.pcm.sampling_freq) {
2376b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        read_size = bytes_needed - btif_media_cb.media_feeding_state.pcm.aa_feed_residue;
2377b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        nb_byte_read = UIPC_Read(channel_id, &event,
2378b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                  ((UINT8 *)btif_media_cb.encoder.as16PcmBuffer) +
2379b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                  btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
2380b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                  read_size);
2381b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        if (nb_byte_read == read_size) {
2382b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren            btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
2383b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren            return TRUE;
2384b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        } else {
2385e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_WARNING("### UNDERFLOW :: ONLY READ %d BYTES OUT OF %d ###",
2386b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                nb_byte_read, read_size);
2387b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren            btif_media_cb.media_feeding_state.pcm.aa_feed_residue += nb_byte_read;
2388b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren            return FALSE;
2389b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        }
2390b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    }
2391b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Some Feeding PCM frequencies require to split the number of sample */
23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* to read. */
23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* E.g 128/6=21.3333 => read 22 and 21 and 21 => max = 2; threshold = 0*/
23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    fract_needed = FALSE;   /* Default */
23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (btif_media_cb.media_feeding.cfg.pcm.sampling_freq)
23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 32000:
23995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 8000:
24005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fract_needed = TRUE;
24015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fract_max = 2;          /* 0, 1 and 2 */
24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fract_threshold = 0;    /* Add one for the first */
24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
24045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 16000:
24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fract_needed = TRUE;
24065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fract_max = 2;          /* 0, 1 and 2 */
24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fract_threshold = 1;    /* Add one for the first two frames*/
24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Compute number of sample to read from source */
24125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    src_samples = blocm_x_subband;
24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    src_samples *= btif_media_cb.media_feeding.cfg.pcm.sampling_freq;
24145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    src_samples /= sbc_sampling;
24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The previous division may have a remainder not null */
24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (fract_needed)
24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter <= fract_threshold)
24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
24215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            src_samples++; /* for every read before threshold add one sample */
24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
24235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* do nothing if counter >= threshold */
24255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_cb.media_feeding_state.pcm.aa_feed_counter++; /* one more read */
24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter > fract_max)
24275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.media_feeding_state.pcm.aa_feed_counter = 0;
24295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Compute number of bytes to read from source */
24335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    read_size = src_samples;
24345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    read_size *= btif_media_cb.media_feeding.cfg.pcm.num_channel;
24355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    read_size *= (btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8);
24365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Read Data from UIPC channel */
24385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    nb_byte_read = UIPC_Read(channel_id, &event, (UINT8 *)read_buffer, read_size);
24395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //tput_mon(TRUE, nb_byte_read, FALSE);
24415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (nb_byte_read < read_size)
24435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2444e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_WARNING("### UNDERRUN :: ONLY READ %d BYTES OUT OF %d ###",
24455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                nb_byte_read, read_size);
24465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (nb_byte_read == 0)
24485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return FALSE;
24495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(btif_media_cb.feeding_mode == BTIF_AV_FEEDING_ASYNCHRONOUS)
24515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Fill the unfilled part of the read buffer with silence (0) */
24535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(((UINT8 *)read_buffer) + nb_byte_read, 0, read_size - nb_byte_read);
24545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            nb_byte_read = read_size;
24555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
24565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Initialize PCM up-sampling engine */
24595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_av_sbc_init_up_sample(btif_media_cb.media_feeding.cfg.pcm.sampling_freq,
24605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sbc_sampling, btif_media_cb.media_feeding.cfg.pcm.bit_per_sample,
24615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.media_feeding.cfg.pcm.num_channel);
24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* re-sample read buffer */
24645fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    /* The output PCM buffer will be stereo, 16 bit per sample */
24655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dst_size_used = bta_av_sbc_up_sample((UINT8 *)read_buffer,
24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (UINT8 *)up_sampled_buffer + btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            nb_byte_read,
24685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sizeof(up_sampled_buffer) - btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            &src_size_used);
24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* update the residue */
24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.media_feeding_state.pcm.aa_feed_residue += dst_size_used;
24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* only copy the pcm sample when we have up-sampled enough PCM */
24755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(btif_media_cb.media_feeding_state.pcm.aa_feed_residue >= bytes_needed)
24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Copy the output pcm samples in SBC encoding buffer */
24785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy((UINT8 *)btif_media_cb.encoder.as16PcmBuffer,
24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (UINT8 *)up_sampled_buffer,
24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bytes_needed);
24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update the residue */
24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_cb.media_feeding_state.pcm.aa_feed_residue -= bytes_needed;
24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btif_media_cb.media_feeding_state.pcm.aa_feed_residue != 0)
24855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy((UINT8 *)up_sampled_buffer,
24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   (UINT8 *)up_sampled_buffer + bytes_needed,
24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   btif_media_cb.media_feeding_state.pcm.aa_feed_residue);
24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
24915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return FALSE;
24945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
24985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_aa_prep_sbc_2_send
24995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
25005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
25015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
25025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
25035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
25045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
25055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_aa_prep_sbc_2_send(UINT8 nb_frame)
25065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
25075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR * p_buf;
25085fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands *
25095fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                             btif_media_cb.encoder.s16NumOfBlocks;
25105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (nb_frame)
25125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25132e3d006b96eafb0651fe7f78d28250faf89405dePavlin Radoslavov        p_buf = GKI_getbuf(BTIF_MEDIA_AA_BUF_SIZE);
25142e3d006b96eafb0651fe7f78d28250faf89405dePavlin Radoslavov        if (p_buf == NULL)
25155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2516e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR ("ERROR btif_media_aa_prep_sbc_2_send no buffer TxCnt %d ",
2517fe7216ca12f91baae733e7c93063db73121af308Chris Manton                                GKI_queue_length(&btif_media_cb.TxAaQ));
25185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
25195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
25205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Init buffer */
25225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset = BTIF_MEDIA_AA_SBC_OFFSET;
25235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len = 0;
25245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->layer_specific = 0;
25255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        do
25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Write @ of allocated buffer in encoder.pu8Packet */
25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.encoder.pu8Packet = (UINT8 *) (p_buf + 1) + p_buf->offset + p_buf->len;
25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Fill allocated buffer with 0 */
25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(btif_media_cb.encoder.as16PcmBuffer, 0, blocm_x_subband
25325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    * btif_media_cb.encoder.s16NumOfChannels);
25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Read PCM data and upsample them if needed */
25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btif_media_aa_read_feeding(UIPC_CH_ID_AV_AUDIO))
25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
25375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SBC encode and descramble frame */
25385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                SBC_Encoder(&(btif_media_cb.encoder));
25395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                A2D_SbcChkFrInit(btif_media_cb.encoder.pu8Packet);
25405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                A2D_SbcDescramble(btif_media_cb.encoder.pu8Packet, btif_media_cb.encoder.u16PacketLength);
25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Update SBC frame length */
25425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_buf->len += btif_media_cb.encoder.u16PacketLength;
25435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                nb_frame--;
25445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_buf->layer_specific++;
25455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
25465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
25475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2548e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_WARNING("btif_media_aa_prep_sbc_2_send underflow %d, %d",
2549b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                    nb_frame, btif_media_cb.media_feeding_state.pcm.aa_feed_residue);
2550b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                btif_media_cb.media_feeding_state.pcm.counter += nb_frame *
2551b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                     btif_media_cb.encoder.s16NumOfSubBands *
2552b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                     btif_media_cb.encoder.s16NumOfBlocks *
2553b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                     btif_media_cb.media_feeding.cfg.pcm.num_channel *
2554b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                     btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
25555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* no more pcm to read */
25565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                nb_frame = 0;
25575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* break read loop if timer was stopped (media task stopped) */
25595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( btif_media_cb.is_tx_timer == FALSE )
2560e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta                {
2561e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta                    GKI_freebuf(p_buf);
25625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return;
2563e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta                }
25645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
25655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        } while (((p_buf->len + btif_media_cb.encoder.u16PacketLength) < btif_media_cb.TxAaMtuSize)
25675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                && (p_buf->layer_specific < 0x0F) && nb_frame);
25685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
256945f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta        if(p_buf->len)
257045f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta        {
25715fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren            /* timestamp of the media packet header represent the TS of the first SBC frame
25725fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren               i.e the timestamp before including this frame */
257345f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta            *((UINT32 *) (p_buf + 1)) = btif_media_cb.timestamp;
25745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25755fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren            btif_media_cb.timestamp += p_buf->layer_specific * blocm_x_subband;
25765fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
257745f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta            if (btif_media_cb.tx_flush)
257845f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta            {
2579e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_DEBUG("### tx suspended, discarded frame ###");
25805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2581fe7216ca12f91baae733e7c93063db73121af308Chris Manton                if (GKI_queue_length(&btif_media_cb.TxAaQ) > 0)
258245f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta                    btif_media_flush_q(&(btif_media_cb.TxAaQ));
258345f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta
258445f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta                GKI_freebuf(p_buf);
258545f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta                return;
258645f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta            }
25875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
258845f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta            /* Enqueue the encoded SBC frame in AA Tx Queue */
258945f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta            GKI_enqueue(&(btif_media_cb.TxAaQ), p_buf);
259045f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta        }
259145f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta        else
259245f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta        {
25935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf(p_buf);
25945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
25955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
26015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_aa_prep_2_send
26025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
26035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
26045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
26055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
26065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
26075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
26085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_aa_prep_2_send(UINT8 nb_frame)
26105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2611196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach    // Check for TX queue overflow
2612196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach
2613196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach    if (nb_frame > MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ)
2614196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach        nb_frame = MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ;
2615196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach
2616196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach    if (GKI_queue_length(&btif_media_cb.TxAaQ) > (MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ - nb_frame))
2617c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach    {
2618196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach        APPL_TRACE_WARNING("%s() - TX queue buffer count %d/%d", __func__,
2619196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach            GKI_queue_length(&btif_media_cb.TxAaQ), MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ - nb_frame);
2620c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach    }
2621c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach
2622196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach    while (GKI_queue_length(&btif_media_cb.TxAaQ) > (MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ - nb_frame))
2623196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach        GKI_freebuf(GKI_dequeue(&(btif_media_cb.TxAaQ)));
2624196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach
2625196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach    // Transcode frame
26265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (btif_media_cb.TxTranscoding)
26285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_TRSCD_PCM_2_SBC:
26305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_aa_prep_sbc_2_send(nb_frame);
26315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
26325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
2634196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach        APPL_TRACE_ERROR("%s unsupported transcoding format 0x%x", __func__, btif_media_cb.TxTranscoding);
26355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
26365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
26385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
26415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_send_aa_frame
26425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
26435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
26445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
26455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
26465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
26475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
26485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_send_aa_frame(void)
26495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 nb_frame_2_send;
26515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* get the number of frame to send */
26535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    nb_frame_2_send = btif_get_num_aa_frame();
26545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2655c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach    if (nb_frame_2_send != 0)
2656c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach    {
26574aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu        /* format and Q buffer to send */
26584aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu        btif_media_aa_prep_2_send(nb_frame_2_send);
26594aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu    }
26605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send it */
2662db554581079863974af8e1289646f5deea6fc044Marie Janssen    LOG_VERBOSE(LOG_TAG, "btif_media_send_aa_frame : send %d frames", nb_frame_2_send);
26635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO);
26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_AV_INCLUDED == TRUE */
26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
26695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
26705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         dump_codec_info
26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      Decode and display codec_info (for debug)
26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
26755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid dump_codec_info(unsigned char *p_codec)
26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tA2D_STATUS a2d_status;
26805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tA2D_SBC_CIE sbc_cie;
26815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_codec, FALSE);
26835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (a2d_status != A2D_SUCCESS)
26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2685e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2689e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("dump_codec_info");
26905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_16)
2692e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);}
26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_32)
2694e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);}
26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_44)
2696e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tsamp_freq:%d (44.100)", sbc_cie.samp_freq);}
26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_48)
2698e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);}
26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2700e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tBAD samp_freq:%d", sbc_cie.samp_freq);}
27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_MONO)
2703e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);}
27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_DUAL)
2705e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tch_mode:%d (Dual)", sbc_cie.ch_mode);}
27065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_STEREO)
2707e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tch_mode:%d (Stereo)", sbc_cie.ch_mode);}
27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_JOINT)
2709e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tch_mode:%d (Joint)", sbc_cie.ch_mode);}
27105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2711e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tBAD ch_mode:%d", sbc_cie.ch_mode);}
27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_4)
2714e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);}
27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_8)
2716e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);}
27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_12)
2718e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);}
27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_16)
2720e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);}
27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2722e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tBAD block_len:%d", sbc_cie.block_len);}
27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_4)
2725e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);}
27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_8)
2727e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);}
27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2729e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tBAD num_subbands:%d", sbc_cie.num_subbands);}
27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_S)
2732e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);}
27335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L)
2734e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\talloc_mthd:%d (Loundess)", sbc_cie.alloc_mthd);}
27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2736e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tBAD alloc_mthd:%d", sbc_cie.alloc_mthd);}
27375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2738e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2741f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2742