btif_media_task.c revision 4e3593a9a1c596904a844286fbe704e969e7230e
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
295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <string.h>
305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdio.h>
315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/types.h>
325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/stat.h>
335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <fcntl.h>
345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <unistd.h>
355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <pthread.h>
365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdint.h>
375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/time.h>
385fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren#include <errno.h>
395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_target.h"
415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "gki.h"
425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_api.h"
435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btu.h"
445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h"
455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys_int.h"
465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_av_api.h"
485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "a2d_api.h"
495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "a2d_sbc.h"
505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "a2d_int.h"
515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_av_sbc.h"
525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_av_ci.h"
535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "l2c_api.h"
545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_av_co.h"
565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_media.h"
575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sbc_encoder.h"
605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define LOG_TAG "BTIF-MEDIA"
635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <hardware/bluetooth.h>
655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "audio_a2dp_hw.h"
665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_av.h"
675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_sm.h"
685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_util.h"
69f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifdef BTA_AVK_INCLUDED
70f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#include "oi_codec_sbc.h"
71f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#include "oi_status.h"
72f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
73f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#include "stdio.h"
74f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#include <dlfcn.h>
75f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
76f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta//#define DEBUG_MEDIA_AV_FLOW TRUE
77f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
78f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifdef BTA_AVK_INCLUDED
79f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaOI_CODEC_SBC_DECODER_CONTEXT context;
80f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaOI_UINT32 contextData[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)];
81f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaOI_INT16 pcmData[15*SBC_MAX_SAMPLES_PER_FRAME*SBC_MAX_CHANNELS];
82f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  Constants
865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
88f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifndef AUDIO_CHANNEL_OUT_MONO
89f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define AUDIO_CHANNEL_OUT_MONO 0x01
90f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
91f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
92f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifndef AUDIO_CHANNEL_OUT_STEREO
93f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define AUDIO_CHANNEL_OUT_STEREO 0x03
94f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTIF media task gki event definition */
975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_TASK_CMD TASK_MBOX_0_EVT_MASK
985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_TASK_DATA TASK_MBOX_1_EVT_MASK
995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_TASK_KILL EVENT_MASK(GKI_SHUTDOWN_EVT)
1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_TASK_TIMER_ID TIMER_0
1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AV_TASK_TIMER_ID TIMER_1
104f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define BTIF_MEDIA_AVK_TASK_TIMER_ID TIMER_2
105f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_TASK_TIMER TIMER_0_EVT_MASK
1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AV_TASK_TIMER TIMER_1_EVT_MASK
108f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define BTIF_MEDIA_AVK_TASK_TIMER TIMER_2_EVT_MASK
109f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_TASK_CMD_MBOX        TASK_MBOX_0     /* cmd mailbox  */
1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_TASK_DATA_MBOX       TASK_MBOX_1     /* data mailbox  */
1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11401c686ce0051433d75605ff9ca4c3b7388ce3b6bZhihai Xu
1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTIF media cmd event definition : BTIF_MEDIA_TASK_CMD */
1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum
1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_START_AA_TX = 1,
1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_STOP_AA_TX,
1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_AA_RX_RDY,
1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_UIPC_RX_RDY,
1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_SBC_ENC_INIT,
1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_SBC_ENC_UPDATE,
1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_SBC_DEC_INIT,
1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_VIDEO_DEC_INIT,
1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_FLUSH_AA_TX,
1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_FLUSH_AA_RX,
1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BTIF_MEDIA_AUDIO_FEEDING_INIT,
129f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BTIF_MEDIA_AUDIO_RECEIVING_INIT,
130f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE,
131f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BTIF_MEDIA_AUDIO_SINK_START_DECODING,
132f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BTIF_MEDIA_AUDIO_SINK_STOP_DECODING,
133f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK
1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum {
1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MEDIA_TASK_STATE_OFF = 0,
1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MEDIA_TASK_STATE_ON = 1,
1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    MEDIA_TASK_STATE_SHUTTING_DOWN = 2
1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project};
1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Macro to multiply the media task tick */
1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTIF_MEDIA_NUM_TICK
1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_NUM_TICK      1
1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
147b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren/* Media task tick in milliseconds, must be set to multiple of
148b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren   (1000/TICKS_PER_SEC) (10) */
1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
150b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#define BTIF_MEDIA_TIME_TICK                     (20 * BTIF_MEDIA_NUM_TICK)
15101c686ce0051433d75605ff9ca4c3b7388ce3b6bZhihai Xu#define A2DP_DATA_READ_POLL_MS    (BTIF_MEDIA_TIME_TICK / 2)
152f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define BTIF_SINK_MEDIA_TIME_TICK                (20 * BTIF_MEDIA_NUM_TICK)
153f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* buffer pool */
1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_POOL_ID GKI_POOL_ID_3
1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_BUF_SIZE GKI_BUF3_SIZE
1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* offset */
1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_CO_CP_SCMS_T == TRUE)
1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE + 1)
1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE)
1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Define the bitrate step when trying to match bitpool value */
1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTIF_MEDIA_BITRATE_STEP
1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_BITRATE_STEP 5
1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Middle quality quality setting @ 44.1 khz */
172b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#define DEFAULT_SBC_BITRATE 328
173b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
174b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#ifndef BTIF_A2DP_NON_EDR_MAX_RATE
175b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#define BTIF_A2DP_NON_EDR_MAX_RATE 229
176b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#endif
1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef A2DP_MEDIA_TASK_STACK_SIZE
1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define A2DP_MEDIA_TASK_STACK_SIZE       0x2000         /* In bytes */
1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define A2DP_MEDIA_TASK_TASK_STR        ((INT8 *) "A2DP-MEDIA")
1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT32 a2dp_media_task_stack[(A2DP_MEDIA_TASK_STACK_SIZE + 3) / 4];
1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BT_MEDIA_TASK A2DP_MEDIA_TASK
1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define USEC_PER_SEC 1000000L
1885fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren#define TPUT_STATS_INTERVAL_US (3000*1000)
1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*
1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * CONGESTION COMPENSATION CTRL ::
1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *
1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Thus setting controls how many buffers we will hold in media task
1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * during temp link congestion. Together with the stack buffer queues
1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * it controls much temporary a2dp link congestion we can
1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * compensate for. It however also depends on the default run level of sinks
1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * jitterbuffers. Depending on type of sink this would vary.
1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Ideally the (SRC) max tx buffer capacity should equal the sinks
1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * jitterbuffer runlevel including any intermediate buffers on the way
2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * towards the sinks codec.
2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */
2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* fixme -- define this in pcm time instead of buffer count */
204b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
205b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren/* The typical runlevel of the tx queue size is ~1 buffer
206b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren   but due to link flow control or thread preemption in lower
207b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren   layers we might need to temporarily buffer up data */
208b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
2094aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu/* 18 frames is equivalent to 6.89*18*2.9 ~= 360 ms @ 44.1 khz, 20 ms mediatick */
2104aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu#define MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ 18
2114aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu#define A2DP_PACKET_COUNT_LOW_WATERMARK 5
2124aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu#define MAX_PCM_FRAME_NUM_PER_TICK     40
2134aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu#define RESET_RATE_COUNTER_THRESHOLD_MS    2000
2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//#define BTIF_MEDIA_VERBOSE_ENABLED
216f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/* In case of A2DP SINK, we will delay start by 5 AVDTP Packets*/
217f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define MAX_A2DP_DELAYED_START_FRAME_COUNT 5
218f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define PACKET_PLAYED_PER_TICK_48 8
219f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define PACKET_PLAYED_PER_TICK_44 7
220f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define PACKET_PLAYED_PER_TICK_32 5
221f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define PACKET_PLAYED_PER_TICK_16 3
222f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BTIF_MEDIA_VERBOSE_ENABLED
2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define VERBOSE(fmt, ...) \
2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project      LogMsg( TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \
2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project              TRACE_TYPE_ERROR, fmt, ## __VA_ARGS__)
2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else
2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define VERBOSE(fmt, ...)
2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  Data types
2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
235f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptatypedef struct
236f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
237f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT16 num_frames_to_be_processed;
238f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT16 len;
239f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT16 offset;
240f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT16 layer_specific;
241f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} tBT_SBC_HDR;
2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct
2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 aa_frame_counter;
2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32  aa_feed_counter;
2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32  aa_feed_residue;
248b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    UINT32 counter;
249b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    UINT32 bytes_per_tick;  /* pcm bytes read each media task tick */
2504aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu    UINT32 max_counter_exit;
2514aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu    UINT32 max_counter_enter;
2524aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu    UINT32 overflow_count;
2534aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu    BOOLEAN overflow;
2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE;
2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef union
2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE pcm;
2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTIF_AV_MEDIA_FEEDINGS_STATE;
2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct
2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BUFFER_Q TxAaQ;
266f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BUFFER_Q RxSbcQ;
2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN is_tx_timer;
268f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BOOLEAN is_rx_timer;
2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 TxAaMtuSize;
2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 timestamp;
2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 TxTranscoding;
2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_AV_FEEDING_MODE feeding_mode;
2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_AV_MEDIA_FEEDINGS media_feeding;
2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_AV_MEDIA_FEEDINGS_STATE media_feeding_state;
2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SBC_ENC_PARAMS encoder;
2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 busy_level;
2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    void* av_sm_hdl;
2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 a2dp_cmd_pending; /* we can have max one command pending */
2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN tx_flush; /* discards any outgoing data when true */
280f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BOOLEAN rx_flush; /* discards any incoming data when true */
2813e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    UINT8 peer_sep;
2823e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    BOOLEAN data_channel_open;
283f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT8   frames_to_process;
2843e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
2853e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    UINT32  sample_rate;
2863e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    UINT8   channel_count;
2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTIF_MEDIA_CB;
2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct {
2925fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    long long rx;
2935fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    long long rx_tot;
2945fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    long long tx;
2955fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    long long tx_tot;
2965fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    long long ts_prev_us;
2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} t_stat;
2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  Local data
3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTIF_MEDIA_CB btif_media_cb;
3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int media_task_running = MEDIA_TASK_STATE_OFF;
3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  Local functions
3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event);
3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event);
3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_encoder_update(void);
3145fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agrenconst char* dump_media_event(UINT16 event);
315f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifdef BTA_AVK_INCLUDED
316ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptaextern OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context,
317ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                          const OI_BYTE **frameData,
318ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                          unsigned long *frameBytes,
319ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                          OI_INT16 *pcmData,
320ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                          unsigned long *pcmBytes);
321ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptaextern OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context,
322ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                           unsigned long *decoderData,
323ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                           unsigned long decoderDataBytes,
324ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                           OI_UINT8 maxChannels,
325ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                           OI_UINT8 pcmStride,
326ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                           OI_BOOL enhanced);
327f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
328f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_flush_q(BUFFER_Q *p_q);
329f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_stop_decoding(void );
330f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_rx_flush(void);
331f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic BOOLEAN btif_media_task_stop_decoding_req(void);
3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  Externs
3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_handle_cmd(BT_HDR *p_msg);
338f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_handle_media(BT_HDR*p_msg);
339f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/* Handle incoming media packets A2DP SINK streaming*/
340f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifdef BTA_AVK_INCLUDED
341f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg);
342f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_send_aa_frame(void);
3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_feeding_state_reset(void);
3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_start_tx(void);
3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_stop_tx(void);
3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_init(BT_HDR *p_msg);
3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_update(BT_HDR *p_msg);
3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_audio_feeding_init(BT_HDR *p_msg);
3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_tx_flush(BT_HDR *p_msg);
3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_aa_prep_2_send(UINT8 nb_frame);
354f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifdef BTA_AVK_INCLUDED
355f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg);
356f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_clear_track(void);
3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
358f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_start_decoding(void );
359f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
360f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaBOOLEAN btif_media_task_start_decoding_req(void);
361f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaBOOLEAN btif_media_task_clear_track(void);
3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  Misc helper functions
3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void log_tstamps_us(char *comment)
3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    #define USEC_PER_SEC 1000000L
3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    static struct timespec prev = {0, 0};
3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    struct timespec now, diff;
3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    unsigned int diff_us = 0;
3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    unsigned int now_us = 0;
3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    clock_gettime(CLOCK_MONOTONIC, &now);
3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    now_us = now.tv_sec*USEC_PER_SEC + now.tv_nsec/1000;
3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    diff_us = (now.tv_sec - prev.tv_sec) * USEC_PER_SEC + (now.tv_nsec - prev.tv_nsec)/1000;
3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
378e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("[%s] ts %08d, diff : %08d, queue sz %d", comment, now_us, diff_us,
3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_media_cb.TxAaQ.count);
3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    prev = now;
3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst char* dump_media_event(UINT16 event)
3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(event)
3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_START_AA_TX)
3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_STOP_AA_TX)
3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_AA_RX_RDY)
3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_UIPC_RX_RDY)
3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_INIT)
3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_UPDATE)
3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_SBC_DEC_INIT)
3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_VIDEO_DEC_INIT)
3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_TX)
3975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_RX)
3985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_FEEDING_INIT)
3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_RECEIVING_INIT)
400f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE)
401f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_START_DECODING)
402f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_STOP_DECODING)
403f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK)
4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return "UNKNOWN MEDIA EVENT";
4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  A2DP CTRL PATH
4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char* dump_a2dp_ctrl_event(UINT8 event)
4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(event)
4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(A2DP_CTRL_CMD_NONE)
4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(A2DP_CTRL_CMD_CHECK_READY)
4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(A2DP_CTRL_CMD_START)
4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(A2DP_CTRL_CMD_STOP)
4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        CASE_RETURN_STR(A2DP_CTRL_CMD_SUSPEND)
4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return "UNKNOWN MSG ID";
4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_audiopath_detached(void)
4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
430e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## AUDIO PATH DETACHED ##");
4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /*  send stop request only if we are actively streaming and haven't received
4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        a stop request. Potentially audioflinger detached abnormally */
4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btif_media_cb.is_tx_timer)
4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* post stop event and wait for audio path to stop */
4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0);
4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void a2dp_cmd_acknowledge(int status)
4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 ack = status;
4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
445e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## a2dp ack : %s, status %d ##",
4465fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren          dump_a2dp_ctrl_event(btif_media_cb.a2dp_cmd_pending), status);
4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* sanity check */
4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btif_media_cb.a2dp_cmd_pending == A2DP_CTRL_CMD_NONE)
4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
451e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("warning : no command pending, ignore ack");
4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* clear pending */
4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.a2dp_cmd_pending = A2DP_CTRL_CMD_NONE;
4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* acknowledge start request */
4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &ack, 1);
4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_recv_ctrl_data(void)
4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 cmd = 0;
4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int n;
4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    n = UIPC_Read(UIPC_CH_ID_AV_CTRL, NULL, &cmd, 1);
4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* detach on ctrl channel means audioflinger process was terminated */
4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (n == 0)
4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
472e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_EVENT("CTRL CH DETACHED");
4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        UIPC_Close(UIPC_CH_ID_AV_CTRL);
4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* we can operate only on datachannel, if af client wants to
4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           do send additional commands the ctrl channel would be reestablished */
4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        //btif_audiopath_detached();
4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
480e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s", dump_a2dp_ctrl_event(cmd));
4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.a2dp_cmd_pending = cmd;
4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(cmd)
4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case A2DP_CTRL_CMD_CHECK_READY:
4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (media_task_running == MEDIA_TASK_STATE_SHUTTING_DOWN)
4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                return;
4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* check whether av is ready to setup a2dp datapath */
4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((btif_av_stream_ready() == TRUE) || (btif_av_stream_started_ready() == TRUE))
4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case A2DP_CTRL_CMD_START:
5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btif_av_stream_ready() == TRUE)
5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* setup audio data channel listener */
5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* post start event and wait for audio path to open */
5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_dispatch_sm_event(BTIF_AV_START_STREAM_REQ_EVT, NULL, 0);
5143e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood//FIXME
5153e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (btif_av_stream_started_ready())
5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* already started, setup audio data channel listener
5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   and ack back immediately */
5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case A2DP_CTRL_CMD_STOP:
5333e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            if (btif_media_cb.peer_sep == AVDT_TSEP_SNK && btif_media_cb.is_tx_timer == FALSE)
5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* we are already stopped, just ack back */
5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0);
5413e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case A2DP_CTRL_CMD_SUSPEND:
5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* local suspend */
5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btif_av_stream_started_ready())
5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_dispatch_sm_event(BTIF_AV_SUSPEND_STREAM_REQ_EVT, NULL, 0);
5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* if we are not in started state, just ack back ok and let
5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   audioflinger close the channel. This can happen if we are
5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   remotely suspended */
5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5593e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        case A2DP_CTRL_GET_AUDIO_CONFIG:
5603e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        {
5613e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            uint32_t sample_rate = btif_media_cb.sample_rate;
5623e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            uint8_t channel_count = btif_media_cb.channel_count;
5633e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
5643e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
5653e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, (UINT8 *)&sample_rate, 4);
5663e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &channel_count, 1);
5673e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            break;
5683e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        }
5693e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
571e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("UNSUPPORTED CMD (%d)", cmd);
5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
575e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s DONE", dump_a2dp_ctrl_event(cmd));
5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
5805cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(ch_id);
5815cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
582e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("A2DP-CTRL-CHANNEL EVENT %s", dump_uipc_event(event));
5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(event)
5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case UIPC_OPEN_EVT:
5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* fetch av statemachine handle */
5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.av_sm_hdl = btif_av_get_sm_handle();
5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case UIPC_CLOSE_EVT:
5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* restart ctrl server unless we are shutting down */
5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (media_task_running == MEDIA_TASK_STATE_ON)
5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb);
5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case UIPC_RX_DATA_READY_EVT:
5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_recv_ctrl_data();
5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default :
602e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("### A2DP-CTRL-CHANNEL 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 Projectstatic void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event)
6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6095cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(ch_id);
6105cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
611e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("BTIF MEDIA (A2DP-DATA) EVENT %s", dump_uipc_event(event));
6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch(event)
6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case UIPC_OPEN_EVT:
6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /*  read directly from media task from here on (keep callback for
6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                connection events */
6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_REMOVE_ACTIVE_READSET, NULL);
62001c686ce0051433d75605ff9ca4c3b7388ce3b6bZhihai Xu            UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_SET_READ_POLL_TMO,
62101c686ce0051433d75605ff9ca4c3b7388ce3b6bZhihai Xu                       (void *)A2DP_DATA_READ_POLL_MS);
6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6233e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            if (btif_media_cb.peer_sep == AVDT_TSEP_SNK) {
6243e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood                /* Start the media task to encode SBC */
6253e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood                btif_media_task_start_aa_req();
6263e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
6273e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood                /* make sure we update any changed sbc encoder params */
6283e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood                btif_a2dp_encoder_update();
6293e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            }
6303e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            btif_media_cb.data_channel_open = TRUE;
6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* ack back when media task is fully started */
6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case UIPC_CLOSE_EVT:
6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_audiopath_detached();
6383e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            btif_media_cb.data_channel_open = FALSE;
6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default :
642e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("### A2DP-DATA EVENT %d NOT HANDLED ###", event);
6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **  BTIF ADAPTATION
6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/
6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
652b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agrenstatic UINT16 btif_media_task_get_sbc_rate(void)
653b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren{
654b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    UINT16 rate = DEFAULT_SBC_BITRATE;
655b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
656b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    /* restrict bitrate if a2dp link is non-edr */
657b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    if (!btif_av_is_peer_edr())
658b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    {
659b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        rate = BTIF_A2DP_NON_EDR_MAX_RATE;
660e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("non-edr a2dp sink detected, restrict rate to %d", rate);
661b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    }
662b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
663b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    return rate;
664b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren}
665b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_encoder_init(void)
6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 minmtu;
6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_INIT_AUDIO msg;
6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tA2D_SBC_CIE sbc_config;
6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* lookup table for converting channel mode */
6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 codec_mode_tbl[5] = { SBC_JOINT_STEREO, SBC_STEREO, SBC_DUAL, 0, SBC_MONO };
6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* lookup table for converting number of blocks */
6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 codec_block_tbl[5] = { 16, 12, 8, 0, 4 };
6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* lookup table to convert freq */
6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 freq_block_tbl[5] = { SBC_sf48000, SBC_sf44100, SBC_sf32000, 0, SBC_sf16000 };
6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
681e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_a2dp_encoder_init");
6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Retrieve the current SBC configuration (default if currently not used) */
6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.NumOfSubBands = (sbc_config.num_subbands == A2D_SBC_IE_SUBBAND_4) ? 4 : 8;
6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.NumOfBlocks = codec_block_tbl[sbc_config.block_len >> 5];
6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.AllocationMethod = (sbc_config.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L) ? SBC_LOUDNESS : SBC_SNR;
6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.ChannelMode = codec_mode_tbl[sbc_config.ch_mode >> 1];
6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.SamplingFreq = freq_block_tbl[sbc_config.samp_freq >> 5];
6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.MtuSize = minmtu;
6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
692e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("msg.ChannelMode %x", msg.ChannelMode);
6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Init the media task to encode SBC properly */
6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_enc_init_req(&msg);
6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_encoder_update(void)
6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 minmtu;
7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tA2D_SBC_CIE sbc_config;
7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_UPDATE_AUDIO msg;
7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 pref_min;
7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 pref_max;
7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
706e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_a2dp_encoder_update");
7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Retrieve the current SBC configuration (default if currently not used) */
7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu);
7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
711e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_a2dp_encoder_update: Common min_bitpool:%d(0x%x) max_bitpool:%d(0x%x)",
7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sbc_config.min_bitpool, sbc_config.min_bitpool,
7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sbc_config.max_bitpool, sbc_config.max_bitpool);
7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sbc_config.min_bitpool > sbc_config.max_bitpool)
7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
717e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("btif_a2dp_encoder_update: ERROR btif_a2dp_encoder_update min_bitpool > max_bitpool");
7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check if remote sink has a preferred bitpool range */
7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_av_co_get_remote_bitpool_pref(&pref_min, &pref_max) == TRUE)
7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* adjust our preferred bitpool with the remote preference if within
7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project           our capable range */
7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pref_min < sbc_config.min_bitpool)
7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pref_min = sbc_config.min_bitpool;
7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pref_max > sbc_config.max_bitpool)
7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pref_max = sbc_config.max_bitpool;
7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        msg.MinBitPool = pref_min;
7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        msg.MaxBitPool = pref_max;
7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if ((pref_min != sbc_config.min_bitpool) || (pref_max != sbc_config.max_bitpool))
7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
737e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_EVENT("## adjusted our bitpool range to peer pref [%d:%d] ##",
7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                pref_min, pref_max);
7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        msg.MinBitPool = sbc_config.min_bitpool;
7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        msg.MaxBitPool = sbc_config.max_bitpool;
7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    msg.MinMtuSize = minmtu;
7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Update the media task to encode SBC properly */
7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_enc_update_req(&msg);
7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_start_media_task
7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint btif_a2dp_start_media_task(void)
7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    int retval;
7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (media_task_running != MEDIA_TASK_STATE_OFF)
7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
770e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("warning : media task already running");
7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return GKI_FAILURE;
7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
774e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## A2DP START MEDIA TASK ##");
7755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* start a2dp media task */
7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    retval = GKI_create_task((TASKPTR)btif_media_task, A2DP_MEDIA_TASK,
7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                A2DP_MEDIA_TASK_TASK_STR,
7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (UINT16 *) ((UINT8 *)a2dp_media_task_stack + A2DP_MEDIA_TASK_STACK_SIZE),
7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                sizeof(a2dp_media_task_stack));
7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (retval != GKI_SUCCESS)
7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return retval;
7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* wait for task to come up to sure we are able to send messages to it */
7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (media_task_running == MEDIA_TASK_STATE_OFF)
7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        usleep(10);
7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
789e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## A2DP MEDIA TASK STARTED ##");
7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return retval;
7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_stop_media_task
7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_stop_media_task(void)
8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
806e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## A2DP STOP MEDIA TASK ##");
8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_destroy_task(BT_MEDIA_TASK);
8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_on_init
8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_init(void)
8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //tput_mon(1, 0, 1);
8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_setup_codec
8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_setup_codec(void)
8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_AV_MEDIA_FEEDINGS media_feeding;
8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_STATUS status;
8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
841e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## A2DP SETUP CODEC ##");
8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_disable();
8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
845b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    /* for now hardcode 44.1 khz 16 bit stereo PCM format */
8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    media_feeding.cfg.pcm.sampling_freq = 44100;
8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    media_feeding.cfg.pcm.bit_per_sample = 16;
8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    media_feeding.cfg.pcm.num_channel = 2;
8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    media_feeding.format = BTIF_AV_CODEC_PCM;
8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (bta_av_co_audio_set_codec(&media_feeding, &status))
8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        tBTIF_MEDIA_INIT_AUDIO_FEEDING mfeed;
8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Init the encoding task */
8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_a2dp_encoder_init();
8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Build the media task configuration */
8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        mfeed.feeding = media_feeding;
8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        mfeed.feeding_mode = BTIF_AV_FEEDING_ASYNCHRONOUS;
8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Send message to Media task to configure transcoding */
8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_audio_feeding_init_req(&mfeed);
8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_enable();
8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_on_idle
8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_idle(void)
8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
881e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## ON A2DP IDLE ##");
8823e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    if (btif_media_cb.peer_sep == AVDT_TSEP_SNK)
883f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
884f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        /* Make sure media task is stopped */
885f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_stop_aa_req();
886f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_av_co_init();
889f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifdef BTA_AVK_INCLUDED
8903e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
891f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
892f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_cb.rx_flush = TRUE;
893f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_rx_flush_req();
894f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_stop_decoding_req();
895f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_clear_track();
896e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("Stopped BT track");
897f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
898f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
8995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_on_open
9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
9095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_open(void)
9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
913e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## ON A2DP OPEN ##");
9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* always use callback to notify socket events */
9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
919f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
920f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
921f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_clear_track
922f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
923f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
924f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
925f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          TRUE is success
926f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
927f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
928f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaBOOLEAN btif_media_task_clear_track(void)
929f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
930f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BT_HDR *p_buf;
931f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
932f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
933f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
934f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return FALSE;
935f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
936f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
937f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    p_buf->event = BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK;
938f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
939f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
940f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    return TRUE;
941f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
942f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
943f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
944f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_stop_decoding_req
945f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
946f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
947f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
948f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          TRUE is success
949f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
950f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
951f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaBOOLEAN btif_media_task_stop_decoding_req(void)
952f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
953f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BT_HDR *p_buf;
954f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
955f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (!btif_media_cb.is_rx_timer)
956f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return TRUE;   /*  if timer is not running no need to send message */
957f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
958f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
959f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
960f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return FALSE;
961f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
962f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
963f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    p_buf->event = BTIF_MEDIA_AUDIO_SINK_STOP_DECODING;
964f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
965f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
966f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    return TRUE;
967f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
968f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
969f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
970f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
971f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_start_decoding_req
972f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
973f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
974f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
975f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          TRUE is success
976f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
977f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
978f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaBOOLEAN btif_media_task_start_decoding_req(void)
979f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
980f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BT_HDR *p_buf;
981f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
982f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if(btif_media_cb.is_rx_timer)
983f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return FALSE;   /*  if timer is already running no need to send message */
984f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
985f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
986f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
987f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return FALSE;
988f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
989f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
990f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    p_buf->event = BTIF_MEDIA_AUDIO_SINK_START_DECODING;
991f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
992f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
993f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    return TRUE;
994f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
995f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
996f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*****************************************************************************
997f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta**
998f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Function        btif_reset_decoder
999f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta**
1000f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Description
1001f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta**
1002f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Returns
1003f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta**
1004f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta*******************************************************************************/
1005f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1006f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptavoid btif_reset_decoder(UINT8 *p_av)
1007f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
1008e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("btif_reset_decoder");
1009e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_reset_decoder p_codec_info[%x:%x:%x:%x:%x:%x]",
1010f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            p_av[1], p_av[2], p_av[3],
1011f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            p_av[4], p_av[5], p_av[6]);
1012f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1013f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf;
1014f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_SINK_CFG_UPDATE))))
1015f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1016e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_EVENT("btif_reset_decoder No Buffer ");
1017f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return;
1018f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
1019f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1020f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    memcpy(p_buf->codec_info,p_av, AVDT_CODEC_SIZE);
1021f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    p_buf->hdr.event = BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE;
1022f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1023f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1024f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
1025f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_on_started
10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1036379743beded881127703334e1dda2cd327ec651dZhihai XuBOOLEAN btif_a2dp_on_started(tBTA_AV_START *p_av, BOOLEAN pending_start)
10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_STATUS status;
1039379743beded881127703334e1dda2cd327ec651dZhihai Xu    BOOLEAN ack = FALSE;
10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1041e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## ON A2DP STARTED ##");
10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10435fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    if (p_av == NULL)
10445fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    {
10455fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren        /* ack back a local start request */
10465fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren        a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
1047379743beded881127703334e1dda2cd327ec651dZhihai Xu        return TRUE;
10485fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    }
10495fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_av->status == BTA_AV_SUCCESS)
10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_av->suspending == FALSE)
10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_av->initiator)
10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1056379743beded881127703334e1dda2cd327ec651dZhihai Xu                if (pending_start) {
1057379743beded881127703334e1dda2cd327ec651dZhihai Xu                    a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS);
1058379743beded881127703334e1dda2cd327ec651dZhihai Xu                    ack = TRUE;
1059379743beded881127703334e1dda2cd327ec651dZhihai Xu                }
10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* we were remotely started,  make sure codec
10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   is setup before datapath is started */
10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_a2dp_setup_codec();
10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* media task is autostarted upon a2dp audiopath connection */
10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1071379743beded881127703334e1dda2cd327ec651dZhihai Xu    else if (pending_start)
10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
1074379743beded881127703334e1dda2cd327ec651dZhihai Xu        ack = TRUE;
10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
1076379743beded881127703334e1dda2cd327ec651dZhihai Xu    return ack;
10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
10825fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Function        btif_a2dp_ack_fail
10835fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren**
10845fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Description
10855fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren**
10865fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Returns
10875fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren**
10885fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren*******************************************************************************/
10895fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
10905fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agrenvoid btif_a2dp_ack_fail(void)
10915fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren{
10925fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    tBTIF_STATUS status;
10935fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
1094e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## A2DP_CTRL_ACK_FAILURE ##");
10955fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
10965fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren}
10975fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
10985fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren/*****************************************************************************
10995fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren**
11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_on_stopped
11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av)
11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1110e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## ON A2DP STOPPED ##");
11113e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    if (btif_media_cb.peer_sep == AVDT_TSEP_SRC) /*  Handling for A2DP SINK cases*/
1112f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1113f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_cb.rx_flush = TRUE;
1114f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_rx_flush_req();
1115f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_stop_decoding_req();
11163e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        UIPC_Close(UIPC_CH_ID_AV_AUDIO);
11173e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        btif_media_cb.data_channel_open = FALSE;
1118f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return;
1119f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* allow using this api for other than suspend */
11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_av != NULL)
11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_av->status != BTA_AV_SUCCESS)
11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1125e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_EVENT("AV STOP FAILED (%d)", p_av->status);
11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (p_av->initiator)
11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* ensure tx frames are immediately suspended */
11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.tx_flush = 1;
11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* request to stop media task  */
11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_aa_tx_flush_req();
11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_stop_aa_req();
11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* once stream is fully stopped we will ack back */
11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*****************************************************************************
11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function        btif_a2dp_on_suspended
11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description
11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns
11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project**
11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/
11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av)
11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1156e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## ON A2DP SUSPENDED ##");
11573e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    if (btif_media_cb.peer_sep == AVDT_TSEP_SRC)
1158f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1159f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_cb.rx_flush = TRUE;
1160f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_rx_flush_req();
1161f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_stop_decoding_req();
1162f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return;
1163f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* check for status failures */
11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (p_av->status != BTA_AV_SUCCESS)
11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (p_av->initiator == TRUE)
11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE);
11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* once stream is fully stopped we will ack back */
11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* ensure tx frames are immediately flushed */
11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.tx_flush = 1;
11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* stop timer tick */
11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_stop_aa_req();
11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1181f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/* when true media task discards any rx frames */
1182f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptavoid btif_a2dp_set_rx_flush(BOOLEAN enable)
1183f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
1184e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## DROP RX %d ##", enable);
1185f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    btif_media_cb.rx_flush = enable;
1186f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
1187f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* when true media task discards any tx frames */
11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_set_tx_flush(BOOLEAN enable)
11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1191e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("## DROP TX %d ##", enable);
11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.tx_flush = enable;
11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1195f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifdef BTA_AVK_INCLUDED
1196f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
1197f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1198f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_avk_handle_timer
1199f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1200f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
1201f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1202f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          void
1203f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1204f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
1205f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_avk_handle_timer ( void )
1206f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
1207f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT8 count;
1208f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    tBT_SBC_HDR *p_msg;
1209f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    int num_sbc_frames;
1210f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    int num_frames_to_process;
1211f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1212f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    count = btif_media_cb.RxSbcQ.count;
1213f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (0 == count)
1214f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1215e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("  QUE  EMPTY ");
1216f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
1217f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    else
1218f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1219f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        if (btif_media_cb.rx_flush == TRUE)
1220f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        {
1221f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            btif_media_flush_q(&(btif_media_cb.RxSbcQ));
1222f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            return;
1223f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        }
1224f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1225f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        num_frames_to_process = btif_media_cb.frames_to_process;
1226e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG(" Process Frames + ");
1227f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1228f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        do
1229f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        {
1230f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            p_msg = (tBT_SBC_HDR *)GKI_getfirst(&(btif_media_cb.RxSbcQ));
1231f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            if (p_msg == NULL)
1232f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                return;
1233f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_sbc_frames  = p_msg->num_frames_to_be_processed; /* num of frames in Que Packets */
1234e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Frames left in topmost packet %d", num_sbc_frames);
1235e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Remaining frames to process in tick %d", num_frames_to_process);
1236e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Num of Packets in Que %d", btif_media_cb.RxSbcQ.count);
1237f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1238f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            if ( num_sbc_frames > num_frames_to_process) /*  Que Packet has more frames*/
1239f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            {
1240f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                 p_msg->num_frames_to_be_processed= num_frames_to_process;
1241f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                 btif_media_task_handle_inc_media(p_msg);
1242f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                 p_msg->num_frames_to_be_processed = num_sbc_frames - num_frames_to_process;
1243f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                 num_frames_to_process = 0;
1244f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                 break;
1245f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            }
1246f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            else                                        /*  Que packet has less frames */
1247f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            {
1248f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                btif_media_task_handle_inc_media(p_msg);
1249f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                p_msg = (tBT_SBC_HDR *)GKI_dequeue(&(btif_media_cb.RxSbcQ));
1250f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                if( p_msg == NULL )
1251f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                {
1252e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                     APPL_TRACE_ERROR("Insufficient data in que ");
1253f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                     break;
1254f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                }
1255f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                num_frames_to_process = num_frames_to_process - p_msg->num_frames_to_be_processed;
1256f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                GKI_freebuf(p_msg);
1257f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            }
1258f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        }while(num_frames_to_process > 0);
1259f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1260e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG(" Process Frames - ");
1261f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
1262f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
1263f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
1264f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_aa_handle_timer
12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_handle_timer(void)
12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    static UINT16 Debug = 0;
1279e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_aa_handle_timer: %d", Debug++);
12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    log_tstamps_us("media task tx timer");
12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
1285e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta    if(btif_media_cb.is_tx_timer == TRUE)
1286e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta    {
1287e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta        btif_media_send_aa_frame();
1288e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta    }
1289e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta    else
1290e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta    {
1291e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("ERROR Media task Scheduled after Suspend");
1292e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta    }
12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_aa_handle_timer
13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_handle_uipc_rx_rdy(void)
13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    static UINT16 Debug = 0;
1310e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_aa_handle_uipc_rx_rdy: %d", Debug++);
13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* process all the UIPC data */
13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_aa_prep_2_send(0xFF);
13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send it */
13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    VERBOSE("btif_media_task_aa_handle_uipc_rx_rdy calls bta_av_ci_src_data_ready");
13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO);
13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_init
13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_media_task_init(void)
13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&(btif_media_cb), 0, sizeof(btif_media_cb));
13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UIPC_Init(NULL);
13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb);
13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task
13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      Task for SBC encoder.  This task receives an
13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **                  event when the waveIn interface has a pcm data buffer
13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **                  ready.  On receiving the event, handle all ready pcm
13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **                  data buffers.  If stream is started, run the SBC encoder
13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **                  on each chunk of pcm samples and build an output packet
13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **                  consisting of one or more encoded SBC frames.
13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint btif_media_task(void *p)
13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 event;
13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_msg;
13605cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p);
13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    VERBOSE("================ MEDIA TASK STARTING ================");
13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_init();
13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    media_task_running = MEDIA_TASK_STATE_ON;
13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    raise_priority_a2dp(TASK_HIGH_MEDIA);
13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (1)
13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        event = GKI_wait(0xffff, 0);
13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        VERBOSE("================= MEDIA TASK EVENT %d ===============", event);
13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (event & BTIF_MEDIA_TASK_CMD)
13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Process all messages in the queue */
13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            while ((p_msg = (BT_HDR *) GKI_read_mbox(BTIF_MEDIA_TASK_CMD_MBOX)) != NULL)
13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_media_task_handle_cmd(p_msg);
13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (event & BTIF_MEDIA_TASK_DATA)
13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
1387f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            VERBOSE("================= Received Media Packets %d ===============", event);
13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Process all messages in the queue */
13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            while ((p_msg = (BT_HDR *) GKI_read_mbox(BTIF_MEDIA_TASK_DATA_MBOX)) != NULL)
13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_media_task_handle_media(p_msg);
13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (event & BTIF_MEDIA_AA_TASK_TIMER)
13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* advance audio timer expiration */
13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_task_aa_handle_timer();
13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1401f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        if (event & BTIF_MEDIA_AVK_TASK_TIMER)
1402f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        {
1403f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifdef BTA_AVK_INCLUDED
1404f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            /* advance audio timer expiration for a2dp sink */
1405f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            btif_media_task_avk_handle_timer();
1406f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
1407f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        }
1408f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1409f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        VERBOSE("=============== MEDIA TASK EVENT %d DONE ============", event);
14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* When we get this event we exit the task  - should only happen on GKI_shutdown  */
14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (event & BTIF_MEDIA_TASK_KILL)
14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* make sure no channels are restarted while shutting down */
14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            media_task_running = MEDIA_TASK_STATE_SHUTTING_DOWN;
14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* this calls blocks until uipc is fully closed */
14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            UIPC_Close(UIPC_CH_ID_ALL);
14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Clear media task flag */
14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    media_task_running = MEDIA_TASK_STATE_OFF;
14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1428e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("MEDIA TASK EXITING");
14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return 0;
14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_send_cmd_evt
14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_send_cmd_evt(UINT16 Evt)
14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->event = Evt;
14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_flush_q
14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_flush_q(BUFFER_Q *p_q)
14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14686449e497dfe4d500810c3e7b4d7d056027c33a0eSharvil Nanavati    while (!GKI_queue_is_empty(p_q))
14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        GKI_freebuf(GKI_dequeue(p_q));
14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_handle_cmd
14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_handle_cmd(BT_HDR *p_msg)
14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
14865fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    VERBOSE("btif_media_task_handle_cmd : %d %s", p_msg->event,
14875fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren             dump_media_event(p_msg->event));
14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_msg->event)
14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_START_AA_TX:
14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_aa_start_tx();
14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_STOP_AA_TX:
14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_aa_stop_tx();
14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_SBC_ENC_INIT:
14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_enc_init(p_msg);
15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_SBC_ENC_UPDATE:
15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_enc_update(p_msg);
15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_AUDIO_FEEDING_INIT:
15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_audio_feeding_init(p_msg);
15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_FLUSH_AA_TX:
15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_aa_tx_flush(p_msg);
15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_UIPC_RX_RDY:
15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_task_aa_handle_uipc_rx_rdy();
15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
1513f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    case BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE:
1514f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifdef BTA_AVK_INCLUDED
1515f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_handle_decoder_reset(p_msg);
1516f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
1517f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        break;
1518f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    case BTIF_MEDIA_AUDIO_SINK_START_DECODING:
1519f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_handle_start_decoding();
1520f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        break;
1521f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    case BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK:
1522f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifdef BTA_AVK_INCLUDED
1523f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_handle_clear_track();
1524f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
1525f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        break;
1526f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    case BTIF_MEDIA_AUDIO_SINK_STOP_DECODING:
1527f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_handle_stop_decoding();
1528f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        break;
1529f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta     case BTIF_MEDIA_FLUSH_AA_RX:
1530f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        btif_media_task_aa_rx_flush();
1531f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        break;
15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
1534e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("ERROR in btif_media_task_handle_cmd unknown event %d", p_msg->event);
15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_freebuf(p_msg);
15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    VERBOSE("btif_media_task_handle_cmd : %s DONE", dump_media_event(p_msg->event));
15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1540f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifdef BTA_AVK_INCLUDED
15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
1543f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_handle_inc_media
15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
1550f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg)
15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
1552f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT8 *sbc_start_frame = ((UINT8*)(p_msg + 1) + p_msg->offset + 1);
1553f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    int count;
1554f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT32 pcmBytes, availPcmBytes;
1555f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    OI_INT16 *pcmDataPointer = pcmData; /*Will be overwritten on next packet receipt*/
1556f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    OI_STATUS status;
1557f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    int num_sbc_frames = p_msg->num_frames_to_be_processed;
1558f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    UINT32 sbc_frame_len = p_msg->len - 1;
1559f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    availPcmBytes = 2*sizeof(pcmData);
1560f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
15613e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    if ((btif_media_cb.peer_sep == AVDT_TSEP_SNK) || (btif_media_cb.rx_flush))
1562f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1563e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG(" State Changed happened in this tick ");
1564f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return;
1565f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
15663e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
15673e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    // ignore data if no one is listening
15683e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    if (!btif_media_cb.data_channel_open)
15693e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood        return;
15703e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
1571e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("Number of sbc frames %d, frame_len %d", num_sbc_frames, sbc_frame_len);
15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1573f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    for(count = 0; count < num_sbc_frames && sbc_frame_len != 0; count ++)
1574f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1575f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        pcmBytes = availPcmBytes;
1576ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta        status = OI_CODEC_SBC_DecodeFrame(&context, (const OI_BYTE**)&sbc_start_frame,
1577ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                                        (OI_UINT32 *)&sbc_frame_len,
1578ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                                        (OI_INT16 *)pcmDataPointer,
1579ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta                                                        (OI_UINT32 *)&pcmBytes);
1580f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        if (!OI_SUCCESS(status)) {
1581e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("Decoding failure: %d\n", status);
1582f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
1583f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        }
1584f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        availPcmBytes -= pcmBytes;
1585f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        pcmDataPointer += pcmBytes/2;
1586f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        p_msg->offset += (p_msg->len - 1) - sbc_frame_len;
1587f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        p_msg->len = sbc_frame_len + 1;
1588f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
15903e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    UIPC_Send(UIPC_CH_ID_AV_AUDIO, 0, (UINT8 *)pcmData, (2*sizeof(pcmData) - availPcmBytes));
1591f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
1592f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1594f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
1595f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1596f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_handle_media
1597f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1598f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
1599f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1600f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          void
1601f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1602f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
1603f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_handle_media(BT_HDR*p_msg)
1604f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
1605e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG(" btif_media_task_handle_media ");
1606f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    GKI_freebuf(p_msg);
1607f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE)
16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_enc_init_req
16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_enc_init_req(tBTIF_MEDIA_INIT_AUDIO *p_msg)
16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_INIT_AUDIO *p_buf;
16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_INIT_AUDIO))))
16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO));
16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_INIT;
16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_enc_update_req
16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_enc_update_req(tBTIF_MEDIA_UPDATE_AUDIO *p_msg)
16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_UPDATE_AUDIO *p_buf;
16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_UPDATE_AUDIO))))
16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_UPDATE_AUDIO));
16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_UPDATE;
16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_audio_feeding_init_req
16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_audio_feeding_init_req(tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_msg)
16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_buf;
16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING))))
16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING));
16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->hdr.event = BTIF_MEDIA_AUDIO_FEEDING_INIT;
16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_start_aa_req
16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_start_aa_req(void)
16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
1695e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_EVENT("GKI failed");
16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->event = BTIF_MEDIA_START_AA_TX;
17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_stop_aa_req
17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_stop_aa_req(void)
17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->event = BTIF_MEDIA_STOP_AA_TX;
17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1727f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
1728f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1729f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_aa_rx_flush_req
1730f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1731f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
1732f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1733f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          TRUE is success
1734f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1735f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
1736f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaBOOLEAN btif_media_task_aa_rx_flush_req(void)
1737f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
1738f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    BT_HDR *p_buf;
1739f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1740f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (GKI_queue_is_empty(&(btif_media_cb.RxSbcQ))== TRUE) /*  Que is already empty */
1741f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return TRUE;
1742f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1743f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
1744f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
1745f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return FALSE;
1746f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
1747f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1748f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    p_buf->event = BTIF_MEDIA_FLUSH_AA_RX;
1749f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1750f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
1751f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    return TRUE;
1752f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_aa_tx_flush_req
17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          TRUE is success
17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_aa_tx_flush_req(void)
17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR *p_buf;
17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR))))
17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return FALSE;
17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    p_buf->event = BTIF_MEDIA_FLUSH_AA_TX;
17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf);
17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return TRUE;
17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
1776f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
1777f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1778f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_aa_rx_flush
1779f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1780f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
1781f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1782f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          void
1783f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
1784f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
1785f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_rx_flush(void)
1786f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
1787f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    /* Flush all enqueued GKI SBC  buffers (encoded) */
1788e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_aa_rx_flush");
1789f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
1790f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    btif_media_flush_q(&(btif_media_cb.RxSbcQ));
1791f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
1792f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_aa_tx_flush
17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_tx_flush(BT_HDR *p_msg)
18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18055cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen    UNUSED(p_msg);
18065cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen
18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Flush all enqueued GKI music buffers (encoded) */
1808e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_aa_tx_flush");
18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1810b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    btif_media_cb.media_feeding_state.pcm.counter = 0;
1811b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
1812b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_flush_q(&(btif_media_cb.TxAaQ));
18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REQ_RX_FLUSH, NULL);
18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function       btif_media_task_enc_init
18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description    Initialize encoding task
18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns        void
18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_init(BT_HDR *p_msg)
18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_INIT_AUDIO *pInitAudio = (tBTIF_MEDIA_INIT_AUDIO *) p_msg;
18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1831e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_enc_init");
18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.timestamp = 0;
18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* SBC encoder config (enforced even if not used) */
18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.encoder.s16ChannelMode = pInitAudio->ChannelMode;
18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.encoder.s16NumOfSubBands = pInitAudio->NumOfSubBands;
18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.encoder.s16NumOfBlocks = pInitAudio->NumOfBlocks;
18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.encoder.s16AllocationMethod = pInitAudio->AllocationMethod;
18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.encoder.s16SamplingFreq = pInitAudio->SamplingFreq;
18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1842b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    btif_media_cb.encoder.u16BitRate = btif_media_task_get_sbc_rate();
1843b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Default transcoding is PCM to SBC, modified by feeding configuration */
18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC;
18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE-BTIF_MEDIA_AA_SBC_OFFSET-sizeof(BT_HDR))
18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            < pInitAudio->MtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET
18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            - sizeof(BT_HDR)) : pInitAudio->MtuSize;
18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1850e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("btif_media_task_enc_init busy %d, mtu %d, peer mtu %d",
18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                     btif_media_cb.busy_level, btif_media_cb.TxAaMtuSize, pInitAudio->MtuSize);
1852e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("      ch mode %d, subnd %d, nb blk %d, alloc %d, rate %d, freq %d",
18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.encoder.s16ChannelMode, btif_media_cb.encoder.s16NumOfSubBands,
18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.encoder.s16NumOfBlocks,
18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.encoder.s16SamplingFreq);
18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Reset entirely the SBC encoder */
18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SBC_Encoder_Init(&(btif_media_cb.encoder));
1860e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_enc_init bit pool %d", btif_media_cb.encoder.s16BitPool);
18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function       btif_media_task_enc_update
18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description    Update encoding task
18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns        void
18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_update(BT_HDR *p_msg)
18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_UPDATE_AUDIO * pUpdateAudio = (tBTIF_MEDIA_UPDATE_AUDIO *) p_msg;
18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SBC_ENC_PARAMS *pstrEncParams = &btif_media_cb.encoder;
18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 s16SamplingFreq;
18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SINT16 s16BitPool;
18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SINT16 s16BitRate;
18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    SINT16 s16FrameLen;
18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 protect = 0;
18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1883e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_enc_update : minmtu %d, maxbp %d minbp %d",
18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            pUpdateAudio->MinMtuSize, pUpdateAudio->MaxBitPool, pUpdateAudio->MinBitPool);
18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Only update the bitrate and MTU size while timer is running to make sure it has been initialized */
18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //if (btif_media_cb.is_tx_timer)
18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
18895fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren        btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE -
18905fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                                      BTIF_MEDIA_AA_SBC_OFFSET - sizeof(BT_HDR))
18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                < pUpdateAudio->MinMtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET
18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                - sizeof(BT_HDR)) : pUpdateAudio->MinMtuSize;
18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Set the initial target bit rate */
1895b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        pstrEncParams->u16BitRate = btif_media_task_get_sbc_rate();
18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (pstrEncParams->s16SamplingFreq == SBC_sf16000)
18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            s16SamplingFreq = 16000;
18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (pstrEncParams->s16SamplingFreq == SBC_sf32000)
19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            s16SamplingFreq = 32000;
19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else if (pstrEncParams->s16SamplingFreq == SBC_sf44100)
19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            s16SamplingFreq = 44100;
19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        else
19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            s16SamplingFreq = 48000;
19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        do
19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if ((pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) ||
19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (pstrEncParams->s16ChannelMode == SBC_STEREO) )
19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                s16BitPool = (SINT16)( (pstrEncParams->u16BitRate *
19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->s16NumOfSubBands * 1000 / s16SamplingFreq)
19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    -( (32 + (4 * pstrEncParams->s16NumOfSubBands *
19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->s16NumOfChannels)
19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    + ( (pstrEncParams->s16ChannelMode - 2) *
19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->s16NumOfSubBands )   )
19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    / pstrEncParams->s16NumOfBlocks) );
19185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                s16FrameLen = 4 + (4*pstrEncParams->s16NumOfSubBands*
19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->s16NumOfChannels)/8
19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    + ( ((pstrEncParams->s16ChannelMode - 2) *
19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->s16NumOfSubBands)
19235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    + (pstrEncParams->s16NumOfBlocks * s16BitPool) ) / 8;
19245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                s16BitRate = (8 * s16FrameLen * s16SamplingFreq)
19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    / (pstrEncParams->s16NumOfSubBands *
19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->s16NumOfBlocks * 1000);
19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if (s16BitRate > pstrEncParams->u16BitRate)
19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    s16BitPool--;
19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if(pstrEncParams->s16NumOfSubBands == 8)
19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    s16BitPool = (s16BitPool > 255) ? 255 : s16BitPool;
19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                else
19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    s16BitPool = (s16BitPool > 128) ? 128 : s16BitPool;
19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                s16BitPool = (SINT16)( ((pstrEncParams->s16NumOfSubBands *
19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    pstrEncParams->u16BitRate * 1000)
19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    / (s16SamplingFreq * pstrEncParams->s16NumOfChannels))
19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    -( ( (32 / pstrEncParams->s16NumOfChannels) +
19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (4 * pstrEncParams->s16NumOfSubBands) )
19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    /   pstrEncParams->s16NumOfBlocks ) );
19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                pstrEncParams->s16BitPool = (s16BitPool >
19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    (16 * pstrEncParams->s16NumOfSubBands))
19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    ? (16*pstrEncParams->s16NumOfSubBands) : s16BitPool;
19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (s16BitPool < 0)
19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                s16BitPool = 0;
19545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1956e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_EVENT("bitpool candidate : %d (%d kbps)",
19575fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                         s16BitPool, pstrEncParams->u16BitRate);
19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (s16BitPool > pUpdateAudio->MaxBitPool)
19605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1961e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_DEBUG("btif_media_task_enc_update computed bitpool too large (%d)",
19625fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                                    s16BitPool);
19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Decrease bitrate */
19645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_media_cb.encoder.u16BitRate -= BTIF_MEDIA_BITRATE_STEP;
19655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Record that we have decreased the bitrate */
19665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                protect |= 1;
19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else if (s16BitPool < pUpdateAudio->MinBitPool)
19695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1970e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_WARNING("btif_media_task_enc_update computed bitpool too small (%d)", s16BitPool);
19714e3593a9a1c596904a844286fbe704e969e7230eAndre Eisenbach
19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Increase bitrate */
19734e3593a9a1c596904a844286fbe704e969e7230eAndre Eisenbach                UINT16 previous_u16BitRate = btif_media_cb.encoder.u16BitRate;
19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_media_cb.encoder.u16BitRate += BTIF_MEDIA_BITRATE_STEP;
19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Record that we have increased the bitrate */
19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                protect |= 2;
19774e3593a9a1c596904a844286fbe704e969e7230eAndre Eisenbach                /* Check over-flow */
19784e3593a9a1c596904a844286fbe704e969e7230eAndre Eisenbach                if (btif_media_cb.encoder.u16BitRate < previous_u16BitRate)
19794e3593a9a1c596904a844286fbe704e969e7230eAndre Eisenbach                    protect |= 3;
19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* In case we have already increased and decreased the bitrate, just stop */
19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (protect == 3)
19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
1988e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_ERROR("btif_media_task_enc_update could not find bitpool in range");
19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                break;
19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        } while (1);
19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Finally update the bitpool in the encoder structure */
19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        pstrEncParams->s16BitPool = s16BitPool;
19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
1996e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("btif_media_task_enc_update final bit rate %d, final bit pool %d",
19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_media_cb.encoder.u16BitRate, btif_media_cb.encoder.s16BitPool);
19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* make sure we reinitialize encoder with new settings */
20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        SBC_Encoder_Init(&(btif_media_cb.encoder));
20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_pcm2sbc_init
20075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
20085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      Init encoding task for PCM to SBC according to feeding
20095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
20105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
20115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_pcm2sbc_init(tBTIF_MEDIA_INIT_AUDIO_FEEDING * p_feeding)
20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN reconfig_needed = FALSE;
20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2017e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("PCM feeding:");
2018e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("sampling_freq:%d", p_feeding->feeding.cfg.pcm.sampling_freq);
2019e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("num_channel:%d", p_feeding->feeding.cfg.pcm.num_channel);
2020e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("bit_per_sample:%d", p_feeding->feeding.cfg.pcm.bit_per_sample);
20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Check the PCM feeding sampling_freq */
20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_feeding->feeding.cfg.pcm.sampling_freq)
20245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
20255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case  8000:
20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 12000:
20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 16000:
20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 24000:
20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 32000:
20305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 48000:
20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* For these sampling_freq the AV connection must be 48000 */
20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf48000)
20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Reconfiguration needed at 48000 */
2035e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_DEBUG("SBC Reconfiguration needed at 48000");
20365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_media_cb.encoder.s16SamplingFreq = SBC_sf48000;
20375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                reconfig_needed = TRUE;
20385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
20395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
20405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 11025:
20425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 22050:
20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case 44100:
20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* For these sampling_freq the AV connection must be 44100 */
20455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf44100)
20465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
20475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Reconfiguration needed at 44100 */
2048e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_DEBUG("SBC Reconfiguration needed at 44100");
20495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                btif_media_cb.encoder.s16SamplingFreq = SBC_sf44100;
20505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                reconfig_needed = TRUE;
20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
20525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
2054e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("Feeding PCM sampling_freq unsupported");
20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Some AV Headsets do not support Mono => always ask for Stereo */
20595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (btif_media_cb.encoder.s16ChannelMode == SBC_MONO)
20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2061e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("SBC Reconfiguration needed in Stereo");
20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_cb.encoder.s16ChannelMode = SBC_JOINT_STEREO;
20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        reconfig_needed = TRUE;
20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (reconfig_needed != FALSE)
20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2068e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init :: mtu %d", btif_media_cb.TxAaMtuSize);
2069e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("ch mode %d, nbsubd %d, nb %d, alloc %d, rate %d, freq %d",
20705fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                btif_media_cb.encoder.s16ChannelMode,
20715fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                btif_media_cb.encoder.s16NumOfSubBands, btif_media_cb.encoder.s16NumOfBlocks,
20725fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate,
20735fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                btif_media_cb.encoder.s16SamplingFreq);
20745fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        SBC_Encoder_Init(&(btif_media_cb.encoder));
20765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
20785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2079e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init no SBC reconfig needed");
20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
20815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
20825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
20855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
20865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_audio_feeding_init
20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      Initialize the audio path according to the feeding format
20895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
20905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
20915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
20935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_audio_feeding_init(BT_HDR *p_msg)
20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_feeding = (tBTIF_MEDIA_INIT_AUDIO_FEEDING *) p_msg;
20965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2097e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_audio_feeding_init format:%d", p_feeding->feeding.format);
20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Save Media Feeding information */
21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.feeding_mode = p_feeding->feeding_mode;
21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.media_feeding = p_feeding->feeding;
21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Handle different feeding formats */
21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (p_feeding->feeding.format)
21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTIF_AV_CODEC_PCM:
21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC;
21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_task_pcm2sbc_init(p_feeding);
21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default :
2112e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("unknown feeding format %d", p_feeding->feeding.format);
21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
21173e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodint btif_a2dp_get_track_frequency(UINT8 frequency) {
2118f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    int freq = 48000;
2119f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch (frequency) {
2120f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_16:
2121f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq = 16000;
2122f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2123f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_32:
2124f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq = 32000;
2125f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2126f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_44:
2127f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq = 44100;
2128f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2129f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_48:
2130f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq = 48000;
2131f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2132f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2133f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    return freq;
2134f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
2135f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
21363e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodint btif_a2dp_get_track_channel_count(UINT8 channeltype) {
21373e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    int count = 1;
2138f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch (channeltype) {
2139f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_MONO:
21403e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            count = 1;
2141f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2142f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_DUAL:
2143f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_STEREO:
2144f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_JOINT:
21453e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood            count = 2;
2146f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2147f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
21483e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    return count;
21493e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood}
21503e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
21513e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodvoid btif_a2dp_set_peer_sep(UINT8 sep) {
21523e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    btif_media_cb.peer_sep = sep;
2153f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
2154f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2155f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
2156f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2157f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_aa_handle_stop_decoding
2158f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2159f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
2160f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2161f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          void
2162f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2163f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
2164f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_stop_decoding(void )
2165f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
2166f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    btif_media_cb.is_rx_timer = FALSE;
2167f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    GKI_stop_timer(BTIF_MEDIA_AVK_TASK_TIMER_ID);
2168f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
2169f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2170f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
2171f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2172f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_aa_handle_start_decoding
2173f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2174f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
2175f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2176f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          void
2177f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2178f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
2179f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_start_decoding(void )
2180f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
2181f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if(btif_media_cb.is_rx_timer == TRUE)
2182f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return;
2183f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    btif_media_cb.is_rx_timer = TRUE;
2184f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    GKI_start_timer(BTIF_MEDIA_AVK_TASK_TIMER_ID, GKI_MS_TO_TICKS(BTIF_SINK_MEDIA_TIME_TICK), TRUE);
2185f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
2186f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2187f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifdef BTA_AVK_INCLUDED
2188f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2189f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_clear_track (void)
2190f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
2191e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_aa_handle_clear_track");
2192f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
2193f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2194f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
2195f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2196f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_task_aa_handle_decoder_reset
2197f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2198f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description
2199f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2200f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          void
2201f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2202f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
2203f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg)
2204f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
2205f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf = (tBTIF_MEDIA_SINK_CFG_UPDATE*) p_msg;
2206f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    tA2D_STATUS a2d_status;
2207f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    tA2D_SBC_CIE sbc_cie;
2208f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    OI_STATUS       status;
2209ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    UINT32          freq_multiple = 48*20; /* frequency multiple for 20ms of data , initialize with 48K*/
2210ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    UINT32          num_blocks = 16;
2211ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    UINT32          num_subbands = 8;
2212f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2213e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_aa_handle_decoder_reset p_codec_info[%x:%x:%x:%x:%x:%x]",
2214f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            p_buf->codec_info[1], p_buf->codec_info[2], p_buf->codec_info[3],
2215f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            p_buf->codec_info[4], p_buf->codec_info[5], p_buf->codec_info[6]);
2216f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2217f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_buf->codec_info, FALSE);
2218f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (a2d_status != A2D_SUCCESS)
2219f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2220e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
2221f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return;
2222f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
22233e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
22243e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    btif_media_cb.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq);
22253e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    btif_media_cb.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode);
22263e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
2227f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    btif_media_cb.rx_flush = FALSE;
2228e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("Reset to sink role");
2229ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta    status = OI_CODEC_SBC_DecoderReset(&context, contextData, sizeof(contextData), 2, 2, FALSE);
2230f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if (!OI_SUCCESS(status)) {
2231e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("OI_CODEC_SBC_DecoderReset failed with error code %d\n", status);
2232f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
22333e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood
22343e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood    UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb);
2235f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2236f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch(sbc_cie.samp_freq)
2237f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2238f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_16:
2239e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);
2240f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq_multiple = 16*20;
2241f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2242f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_32:
2243e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);
2244f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq_multiple = 32*20;
2245f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2246f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_44:
2247e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tsamp_freq:%d (44100)", sbc_cie.samp_freq);
2248f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq_multiple = 441*2;
2249f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2250f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SAMP_FREQ_48:
2251e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);
2252f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            freq_multiple = 48*20;
2253f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2254f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        default:
2255e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Unknown Frequency ");
2256f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2257f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2258f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2259f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch(sbc_cie.ch_mode)
2260f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2261f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_MONO:
2262e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);
2263f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2264f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_DUAL:
2265e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tch_mode:%d (DUAL)", sbc_cie.ch_mode);
2266f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2267f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_STEREO:
2268e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tch_mode:%d (STEREO)", sbc_cie.ch_mode);
2269f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2270f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_CH_MD_JOINT:
2271e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tch_mode:%d (JOINT)", sbc_cie.ch_mode);
2272f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2273f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        default:
2274e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Unknown Mode ");
2275f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2276f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2277f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2278f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch(sbc_cie.block_len)
2279f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2280f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_BLOCKS_4:
2281e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);
2282f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_blocks = 4;
2283f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2284f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_BLOCKS_8:
2285e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);
2286f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_blocks = 8;
2287f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2288f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_BLOCKS_12:
2289e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);
2290f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_blocks = 12;
2291f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2292f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_BLOCKS_16:
2293e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);
2294f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_blocks = 16;
2295f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2296f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        default:
2297e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Unknown BlockLen ");
2298f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2299f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2300f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2301f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch(sbc_cie.num_subbands)
2302f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2303f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SUBBAND_4:
2304e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);
2305f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_subbands = 4;
2306f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2307f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_SUBBAND_8:
2308e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);
2309f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            num_subbands = 8;
2310f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2311f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        default:
2312e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Unknown SubBands ");
2313f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2314f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2315f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2316f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    switch(sbc_cie.alloc_mthd)
2317f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2318f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_ALLOC_MD_S:
2319e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);
2320f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2321f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        case A2D_SBC_IE_ALLOC_MD_L:
2322e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG("\talloc_mthd:%d (Loudness)", sbc_cie.alloc_mthd);
2323f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2324f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        default:
2325e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_DEBUG(" Unknown Allocation Method");
2326f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            break;
2327f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2328f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2329e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
2330f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2331f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    btif_media_cb.frames_to_process = ((freq_multiple)/(num_blocks*num_subbands)) + 1;
2332e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG(" Frames to be processed in 20 ms %d",btif_media_cb.frames_to_process);
2333f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
2334f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif
2335f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
23365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
23375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_feeding_state_reset
23395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      Reset the media feeding state
23415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
23435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
23455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_feeding_state_reset(void)
23465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2347e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_WARNING("overflow %d, enter %d, exit %d",
23484aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu        btif_media_cb.media_feeding_state.pcm.overflow_count,
23494aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu        btif_media_cb.media_feeding_state.pcm.max_counter_enter,
23504aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu        btif_media_cb.media_feeding_state.pcm.max_counter_exit);
23514aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu
23525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* By default, just clear the entire state */
23535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    memset(&btif_media_cb.media_feeding_state, 0, sizeof(btif_media_cb.media_feeding_state));
2354b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
2355b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    if (btif_media_cb.TxTranscoding == BTIF_MEDIA_TRSCD_PCM_2_SBC)
2356b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    {
2357b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        btif_media_cb.media_feeding_state.pcm.bytes_per_tick =
2358b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                (btif_media_cb.media_feeding.cfg.pcm.sampling_freq *
2359b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                 btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8 *
2360b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                 btif_media_cb.media_feeding.cfg.pcm.num_channel *
2361b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                 BTIF_MEDIA_TIME_TICK)/1000;
2362b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
2363e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_WARNING("pcm bytes per tick %d",
2364b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                            (int)btif_media_cb.media_feeding_state.pcm.bytes_per_tick);
2365b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    }
23665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
23675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
23685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_aa_start_tx
23705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      Start media task encoding
23725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
23745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
23765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_start_tx(void)
23775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2378e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_aa_start_tx is timer %d, feeding mode %d",
23795fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren             btif_media_cb.is_tx_timer, btif_media_cb.feeding_mode);
23805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Use a timer to poll the UIPC, get rid of the UIPC call back */
23825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    // UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_CBACK, NULL);
23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.is_tx_timer = TRUE;
23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Reset the media feeding state */
23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_feeding_state_reset();
23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2389e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_EVENT("starting timer %d ticks (%d)",
23905fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                  GKI_MS_TO_TICKS(BTIF_MEDIA_TIME_TICK), TICKS_PER_SEC);
23915fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_start_timer(BTIF_MEDIA_AA_TASK_TIMER_ID, GKI_MS_TO_TICKS(BTIF_MEDIA_TIME_TICK), TRUE);
23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
23965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_task_aa_stop_tx
23985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
23995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      Stop media task encoding
24005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
24015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
24025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
24035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
24045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_stop_tx(void)
24055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
2406e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_task_aa_stop_tx is timer: %d", btif_media_cb.is_tx_timer);
24075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Stop the timer first */
24095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    GKI_stop_timer(BTIF_MEDIA_AA_TASK_TIMER_ID);
24105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.is_tx_timer = FALSE;
24115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UIPC_Close(UIPC_CH_ID_AV_AUDIO);
24135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* audio engine stopped, reset tx suspended flag */
24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.tx_flush = 0;
24165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Reset the media feeding state */
24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_task_feeding_state_reset();
24195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
24235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_get_num_aa_frame
24245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
24255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
24265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
24275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          The number of media frames in this time slice
24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
24295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btif_get_num_aa_frame(void)
24315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
24324aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu    UINT32 result=0;
24335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (btif_media_cb.TxTranscoding)
24355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
24365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        case BTIF_MEDIA_TRSCD_PCM_2_SBC:
2437b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren           {
2438b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren            UINT32 pcm_bytes_per_frame = btif_media_cb.encoder.s16NumOfSubBands *
2439b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                             btif_media_cb.encoder.s16NumOfBlocks *
2440b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                             btif_media_cb.media_feeding.cfg.pcm.num_channel *
2441b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                             btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
24425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2443b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren            btif_media_cb.media_feeding_state.pcm.counter +=
2444b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                                btif_media_cb.media_feeding_state.pcm.bytes_per_tick;
24454aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            if ((!btif_media_cb.media_feeding_state.pcm.overflow) ||
24464aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                (btif_media_cb.TxAaQ.count < A2DP_PACKET_COUNT_LOW_WATERMARK)) {
24474aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                if (btif_media_cb.media_feeding_state.pcm.overflow) {
24484aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                    btif_media_cb.media_feeding_state.pcm.overflow = FALSE;
24494aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu
24504aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                    if (btif_media_cb.media_feeding_state.pcm.counter >
24514aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                        btif_media_cb.media_feeding_state.pcm.max_counter_exit) {
24524aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                        btif_media_cb.media_feeding_state.pcm.max_counter_exit =
24534aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                            btif_media_cb.media_feeding_state.pcm.counter;
24544aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                    }
24554aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                }
24564aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                /* calculate nbr of frames pending for this media tick */
24574aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                result = btif_media_cb.media_feeding_state.pcm.counter/pcm_bytes_per_frame;
24584aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                if (result > MAX_PCM_FRAME_NUM_PER_TICK) result = MAX_PCM_FRAME_NUM_PER_TICK;
24594aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                btif_media_cb.media_feeding_state.pcm.counter -= result*pcm_bytes_per_frame;
24604aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            } else {
24614aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                result = 0;
24624aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            }
24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            VERBOSE("WRITE %d FRAMES", result);
2464b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        }
2465b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        break;
24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        default:
2468e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR("ERROR btif_get_num_aa_frame Unsupported transcoding format 0x%x",
24695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    btif_media_cb.TxTranscoding);
24705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            result = 0;
24715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            break;
24725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
24735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
2475e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_get_num_aa_frame returns %d", result);
24765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
24775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24784aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu    return (UINT8)result;
24795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
24805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
24815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
24825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
2483f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function         btif_media_sink_enque_buf
2484f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2485f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description      This function is called by the av_co to fill A2DP Sink Queue
2486f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2487f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
2488f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns          size of the queue
2489f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/
2490f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaUINT8 btif_media_sink_enque_buf(BT_HDR *p_pkt)
2491f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{
2492f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    tBT_SBC_HDR *p_msg;
2493f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2494f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if(btif_media_cb.rx_flush == TRUE) /* Flush enabled, do not enque*/
2495f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        return btif_media_cb.RxSbcQ.count;
2496f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if(btif_media_cb.RxSbcQ.count == MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ)
2497f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2498f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        GKI_freebuf(GKI_dequeue(&(btif_media_cb.RxSbcQ)));
2499f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2500f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2501e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + ");
2502f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    /* allocate and Queue this buffer */
2503f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    if ((p_msg = (tBT_SBC_HDR *) GKI_getbuf(sizeof(tBT_SBC_HDR) +
2504f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta                        p_pkt->offset+ p_pkt->len)) != NULL)
2505f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2506f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        memcpy(p_msg, p_pkt, (sizeof(BT_HDR) + p_pkt->offset + p_pkt->len));
2507f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        p_msg->num_frames_to_be_processed = (*((UINT8*)(p_msg + 1) + p_msg->offset)) & 0x0f;
2508e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf + ", p_msg->num_frames_to_be_processed);
2509f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        GKI_enqueue(&(btif_media_cb.RxSbcQ), p_msg);
2510f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        if(btif_media_cb.RxSbcQ.count == MAX_A2DP_DELAYED_START_FRAME_COUNT)
2511f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        {
2512e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            BTIF_TRACE_DEBUG(" Initiate Decoding ");
2513f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta            btif_media_task_start_decoding_req();
2514f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        }
2515f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2516f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    else
2517f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    {
2518f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta        /* let caller deal with a failed allocation */
2519e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        BTIF_TRACE_VERBOSE("btif_media_sink_enque_buf No Buffer left - ");
2520f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    }
2521f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta    return btif_media_cb.RxSbcQ.count;
2522f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta}
2523f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2524f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/*******************************************************************************
2525f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta **
25265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_aa_readbuf
25275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
25285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      This function is called by the av_co to get the next buffer to send
25295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
25305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
25315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
25325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
25335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *btif_media_aa_readbuf(void)
25345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
25355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return GKI_dequeue(&(btif_media_cb.TxAaQ));
25365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
25375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
25395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
25405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_aa_read_feeding
25415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
25425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
25435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
25445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
25455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
25465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
25475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_aa_read_feeding(tUIPC_CH_ID channel_id)
25495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
25505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 event;
25515fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands * \
25525fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                             btif_media_cb.encoder.s16NumOfBlocks;
25535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 read_size;
25545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT16 sbc_sampling = 48000;
25555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 src_samples;
25565fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    UINT16 bytes_needed = blocm_x_subband * btif_media_cb.encoder.s16NumOfChannels * \
2557b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                          btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
25585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    static UINT16 up_sampled_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS
25595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS * 2];
25605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    static UINT16 read_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS
25615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS];
25625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 src_size_used;
25635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32 dst_size_used;
25645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BOOLEAN fract_needed;
25655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32   fract_max;
25665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    INT32   fract_threshold;
25675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT32  nb_byte_read;
25685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
25695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Get the SBC sampling rate */
25705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (btif_media_cb.encoder.s16SamplingFreq)
25715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
25725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SBC_sf48000:
25735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sbc_sampling = 48000;
25745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
25755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SBC_sf44100:
25765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sbc_sampling = 44100;
25775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
25785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SBC_sf32000:
25795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sbc_sampling = 32000;
25805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
25815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case SBC_sf16000:
25825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        sbc_sampling = 16000;
25835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
25845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
25855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2586b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    if (sbc_sampling == btif_media_cb.media_feeding.cfg.pcm.sampling_freq) {
2587b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        read_size = bytes_needed - btif_media_cb.media_feeding_state.pcm.aa_feed_residue;
2588b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        nb_byte_read = UIPC_Read(channel_id, &event,
2589b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                  ((UINT8 *)btif_media_cb.encoder.as16PcmBuffer) +
2590b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                  btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
2591b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                  read_size);
2592b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        if (nb_byte_read == read_size) {
2593b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren            btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0;
2594b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren            return TRUE;
2595b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        } else {
2596e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_WARNING("### UNDERFLOW :: ONLY READ %d BYTES OUT OF %d ###",
2597b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                nb_byte_read, read_size);
2598b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren            btif_media_cb.media_feeding_state.pcm.aa_feed_residue += nb_byte_read;
2599b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren            return FALSE;
2600b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren        }
2601b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren    }
2602b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren
26035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Some Feeding PCM frequencies require to split the number of sample */
26045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* to read. */
26055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* E.g 128/6=21.3333 => read 22 and 21 and 21 => max = 2; threshold = 0*/
26065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    fract_needed = FALSE;   /* Default */
26075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (btif_media_cb.media_feeding.cfg.pcm.sampling_freq)
26085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 32000:
26105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 8000:
26115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fract_needed = TRUE;
26125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fract_max = 2;          /* 0, 1 and 2 */
26135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fract_threshold = 0;    /* Add one for the first */
26145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
26155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case 16000:
26165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fract_needed = TRUE;
26175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fract_max = 2;          /* 0, 1 and 2 */
26185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        fract_threshold = 1;    /* Add one for the first two frames*/
26195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
26205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Compute number of sample to read from source */
26235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    src_samples = blocm_x_subband;
26245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    src_samples *= btif_media_cb.media_feeding.cfg.pcm.sampling_freq;
26255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    src_samples /= sbc_sampling;
26265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* The previous division may have a remainder not null */
26285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (fract_needed)
26295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter <= fract_threshold)
26315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
26325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            src_samples++; /* for every read before threshold add one sample */
26335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* do nothing if counter >= threshold */
26365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_cb.media_feeding_state.pcm.aa_feed_counter++; /* one more read */
26375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter > fract_max)
26385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
26395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.media_feeding_state.pcm.aa_feed_counter = 0;
26405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Compute number of bytes to read from source */
26445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    read_size = src_samples;
26455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    read_size *= btif_media_cb.media_feeding.cfg.pcm.num_channel;
26465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    read_size *= (btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8);
26475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Read Data from UIPC channel */
26495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    nb_byte_read = UIPC_Read(channel_id, &event, (UINT8 *)read_buffer, read_size);
26505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    //tput_mon(TRUE, nb_byte_read, FALSE);
26525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (nb_byte_read < read_size)
26545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2655e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_WARNING("### UNDERRUN :: ONLY READ %d BYTES OUT OF %d ###",
26565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                nb_byte_read, read_size);
26575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (nb_byte_read == 0)
26595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return FALSE;
26605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if(btif_media_cb.feeding_mode == BTIF_AV_FEEDING_ASYNCHRONOUS)
26625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
26635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Fill the unfilled part of the read buffer with silence (0) */
26645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(((UINT8 *)read_buffer) + nb_byte_read, 0, read_size - nb_byte_read);
26655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            nb_byte_read = read_size;
26665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
26675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
26685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* Initialize PCM up-sampling engine */
26705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_av_sbc_init_up_sample(btif_media_cb.media_feeding.cfg.pcm.sampling_freq,
26715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sbc_sampling, btif_media_cb.media_feeding.cfg.pcm.bit_per_sample,
26725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.media_feeding.cfg.pcm.num_channel);
26735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* re-sample read buffer */
26755fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    /* The output PCM buffer will be stereo, 16 bit per sample */
26765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    dst_size_used = bta_av_sbc_up_sample((UINT8 *)read_buffer,
26775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            (UINT8 *)up_sampled_buffer + btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
26785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            nb_byte_read,
26795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            sizeof(up_sampled_buffer) - btif_media_cb.media_feeding_state.pcm.aa_feed_residue,
26805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            &src_size_used);
26815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
2683e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_aa_read_feeding readsz:%d src_size_used:%d dst_size_used:%d",
26845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            read_size, src_size_used, dst_size_used);
26855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
26865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* update the residue */
26885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    btif_media_cb.media_feeding_state.pcm.aa_feed_residue += dst_size_used;
26895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
26905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* only copy the pcm sample when we have up-sampled enough PCM */
26915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if(btif_media_cb.media_feeding_state.pcm.aa_feed_residue >= bytes_needed)
26925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
26935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Copy the output pcm samples in SBC encoding buffer */
26945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        memcpy((UINT8 *)btif_media_cb.encoder.as16PcmBuffer,
26955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                (UINT8 *)up_sampled_buffer,
26965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                bytes_needed);
26975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* update the residue */
26985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_cb.media_feeding_state.pcm.aa_feed_residue -= bytes_needed;
26995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (btif_media_cb.media_feeding_state.pcm.aa_feed_residue != 0)
27015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memcpy((UINT8 *)up_sampled_buffer,
27035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   (UINT8 *)up_sampled_buffer + bytes_needed,
27045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                   btif_media_cb.media_feeding_state.pcm.aa_feed_residue);
27055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return TRUE;
27075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
27085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
2710e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_aa_read_feeding residue:%d, dst_size_used %d, bytes_needed %d",
27115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.media_feeding_state.pcm.aa_feed_residue, dst_size_used, bytes_needed);
27125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
27135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    return FALSE;
27155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
27165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
27195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_aa_prep_sbc_2_send
27205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
27215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
27225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
27255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
27265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_aa_prep_sbc_2_send(UINT8 nb_frame)
27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    BT_HDR * p_buf;
27295fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren    UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands *
27305fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                             btif_media_cb.encoder.s16NumOfBlocks;
27315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE))
2733e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("btif_media_aa_prep_sbc_2_send nb_frame %d, TxAaQ %d",
27345fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                       nb_frame, btif_media_cb.TxAaQ.count);
27355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif
27365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    while (nb_frame)
27375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
27385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        if (NULL == (p_buf = GKI_getpoolbuf(BTIF_MEDIA_AA_POOL_ID)))
27395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
2740e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati            APPL_TRACE_ERROR ("ERROR btif_media_aa_prep_sbc_2_send no buffer TxCnt %d ",
27415fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren                                btif_media_cb.TxAaQ.count);
27425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            return;
27435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
27445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        /* Init buffer */
27465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->offset = BTIF_MEDIA_AA_SBC_OFFSET;
27475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->len = 0;
27485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        p_buf->layer_specific = 0;
27495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        do
27515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        {
27525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Write @ of allocated buffer in encoder.pu8Packet */
27535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            btif_media_cb.encoder.pu8Packet = (UINT8 *) (p_buf + 1) + p_buf->offset + p_buf->len;
27545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Fill allocated buffer with 0 */
27555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            memset(btif_media_cb.encoder.as16PcmBuffer, 0, blocm_x_subband
27565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    * btif_media_cb.encoder.s16NumOfChannels);
27575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            /* Read PCM data and upsample them if needed */
27595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            if (btif_media_aa_read_feeding(UIPC_CH_ID_AV_AUDIO))
27605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
27615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* SBC encode and descramble frame */
27625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                SBC_Encoder(&(btif_media_cb.encoder));
27635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                A2D_SbcChkFrInit(btif_media_cb.encoder.pu8Packet);
27645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                A2D_SbcDescramble(btif_media_cb.encoder.pu8Packet, btif_media_cb.encoder.u16PacketLength);
27655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* Update SBC frame length */
27665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_buf->len += btif_media_cb.encoder.u16PacketLength;
27675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                nb_frame--;
27685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                p_buf->layer_specific++;
27695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
27705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            else
27715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            {
2772e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_WARNING("btif_media_aa_prep_sbc_2_send underflow %d, %d",
2773b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                    nb_frame, btif_media_cb.media_feeding_state.pcm.aa_feed_residue);
2774b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                btif_media_cb.media_feeding_state.pcm.counter += nb_frame *
2775b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                     btif_media_cb.encoder.s16NumOfSubBands *
2776b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                     btif_media_cb.encoder.s16NumOfBlocks *
2777b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                     btif_media_cb.media_feeding.cfg.pcm.num_channel *
2778b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren                     btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* no more pcm to read */
27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                nb_frame = 0;
27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                /* break read loop if timer was stopped (media task stopped) */
27835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                if ( btif_media_cb.is_tx_timer == FALSE )
2784e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta                {
2785e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta                    GKI_freebuf(p_buf);
27865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                    return;
2787e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta                }
27885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            }
27895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        } while (((p_buf->len + btif_media_cb.encoder.u16PacketLength) < btif_media_cb.TxAaMtuSize)
27915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                && (p_buf->layer_specific < 0x0F) && nb_frame);
27925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
279345f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta        if(p_buf->len)
279445f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta        {
27955fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren            /* timestamp of the media packet header represent the TS of the first SBC frame
27965fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren               i.e the timestamp before including this frame */
279745f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta            *((UINT32 *) (p_buf + 1)) = btif_media_cb.timestamp;
27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
27995fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren            btif_media_cb.timestamp += p_buf->layer_specific * blocm_x_subband;
28005fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren
280145f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta            VERBOSE("TX QUEUE NOW %d", btif_media_cb.TxAaQ.count);
28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
280345f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta            if (btif_media_cb.tx_flush)
280445f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta            {
2805e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_DEBUG("### tx suspended, discarded frame ###");
28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
280745f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta                if (btif_media_cb.TxAaQ.count > 0)
280845f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta                    btif_media_flush_q(&(btif_media_cb.TxAaQ));
280945f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta
281045f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta                GKI_freebuf(p_buf);
281145f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta                return;
281245f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta            }
28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
281445f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta            /* Enqueue the encoded SBC frame in AA Tx Queue */
281545f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta            GKI_enqueue(&(btif_media_cb.TxAaQ), p_buf);
281645f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta        }
281745f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta        else
281845f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta        {
28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project            GKI_freebuf(p_buf);
28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        }
28214aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu
28224aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu        if (btif_media_cb.TxAaQ.count >= MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ) {
28234aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            UINT32 reset_rate_bytes = btif_media_cb.media_feeding_state.pcm.bytes_per_tick *
28244aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                                (RESET_RATE_COUNTER_THRESHOLD_MS / BTIF_MEDIA_TIME_TICK);
28254aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            btif_media_cb.media_feeding_state.pcm.overflow = TRUE;
28264aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            btif_media_cb.media_feeding_state.pcm.counter += nb_frame *
28274aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                     btif_media_cb.encoder.s16NumOfSubBands *
28284aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                     btif_media_cb.encoder.s16NumOfBlocks *
28294aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                     btif_media_cb.media_feeding.cfg.pcm.num_channel *
28304aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                     btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8;
28314aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu
28324aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            btif_media_cb.media_feeding_state.pcm.overflow_count++;
28334aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            if (btif_media_cb.media_feeding_state.pcm.counter >
28344aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                btif_media_cb.media_feeding_state.pcm.max_counter_enter) {
28354aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                btif_media_cb.media_feeding_state.pcm.max_counter_enter =
28364aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                    btif_media_cb.media_feeding_state.pcm.counter;
28374aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            }
28384aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu
28394aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            if (btif_media_cb.media_feeding_state.pcm.counter > reset_rate_bytes) {
28404aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu                btif_media_cb.media_feeding_state.pcm.counter = 0;
2841e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati                APPL_TRACE_WARNING("btif_media_aa_prep_sbc_2_send:reset rate counter");
28424aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            }
28434aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu
28444aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            /* no more pcm to read */
28454aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu            nb_frame = 0;
28464aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu        }
28475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
28535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_aa_prep_2_send
28545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
28555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
28565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
28575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
28585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
28595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
28605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_aa_prep_2_send(UINT8 nb_frame)
28625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    VERBOSE("btif_media_aa_prep_2_send : %d frames (queue %d)", nb_frame,
28645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project                       btif_media_cb.TxAaQ.count);
28655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    switch (btif_media_cb.TxTranscoding)
28675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    case BTIF_MEDIA_TRSCD_PCM_2_SBC:
28695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        btif_media_aa_prep_sbc_2_send(nb_frame);
28705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    default:
2874e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("ERROR btif_media_aa_prep_2_send unsupported transcoding format 0x%x",btif_media_cb.TxTranscoding);
28755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        break;
28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
28805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
28815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         btif_media_send_aa_frame
28825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
28835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description
28845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
28855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
28865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
28885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_send_aa_frame(void)
28895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
28905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    UINT8 nb_frame_2_send;
28915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* get the number of frame to send */
28935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    nb_frame_2_send = btif_get_num_aa_frame();
28945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
28954aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu    if (nb_frame_2_send != 0) {
28964aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu        /* format and Q buffer to send */
28974aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu        btif_media_aa_prep_2_send(nb_frame_2_send);
28984aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu    }
28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    /* send it */
29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    VERBOSE("btif_media_send_aa_frame : send %d frames", nb_frame_2_send);
29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO);
29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
29045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_AV_INCLUDED == TRUE */
29065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/*******************************************************************************
29085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
29095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function         dump_codec_info
29105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
29115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description      Decode and display codec_info (for debug)
29125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
29135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns          void
29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **
29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/
29165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid dump_codec_info(unsigned char *p_codec)
29175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{
29185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tA2D_STATUS a2d_status;
29195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    tA2D_SBC_CIE sbc_cie;
29205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_codec, FALSE);
29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (a2d_status != A2D_SUCCESS)
29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    {
2924e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati        APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status);
29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project        return;
29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    }
29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2928e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("dump_codec_info");
29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_16)
2931e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);}
29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_32)
2933e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);}
29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_44)
2935e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tsamp_freq:%d (44.100)", sbc_cie.samp_freq);}
29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_48)
2937e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);}
29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2939e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tBAD samp_freq:%d", sbc_cie.samp_freq);}
29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_MONO)
2942e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);}
29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_DUAL)
2944e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tch_mode:%d (Dual)", sbc_cie.ch_mode);}
29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_STEREO)
2946e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tch_mode:%d (Stereo)", sbc_cie.ch_mode);}
29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_JOINT)
2948e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tch_mode:%d (Joint)", sbc_cie.ch_mode);}
29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2950e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tBAD ch_mode:%d", sbc_cie.ch_mode);}
29515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_4)
2953e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);}
29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_8)
2955e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);}
29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_12)
2957e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);}
29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_16)
2959e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);}
29605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2961e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tBAD block_len:%d", sbc_cie.block_len);}
29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_4)
2964e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);}
29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_8)
2966e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);}
29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2968e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tBAD num_subbands:%d", sbc_cie.num_subbands);}
29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_S)
2971e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);}
29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else  if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L)
2973e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\talloc_mthd:%d (Loundess)", sbc_cie.alloc_mthd);}
29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project    else
2975e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    {    APPL_TRACE_DEBUG("\tBAD alloc_mthd:%d", sbc_cie.alloc_mthd);}
29765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
2977e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati    APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool);
29785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project
29795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}
2980f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta
2981