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