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