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" 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bt_utils.h" 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Constants 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//#define DEBUG_MEDIA_AV_FLOW TRUE 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTIF media task gki event definition */ 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_TASK_CMD TASK_MBOX_0_EVT_MASK 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_TASK_DATA TASK_MBOX_1_EVT_MASK 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_TASK_KILL EVENT_MASK(GKI_SHUTDOWN_EVT) 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_TASK_TIMER_ID TIMER_0 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AV_TASK_TIMER_ID TIMER_1 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_TASK_TIMER TIMER_0_EVT_MASK 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AV_TASK_TIMER TIMER_1_EVT_MASK 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_TASK_CMD_MBOX TASK_MBOX_0 /* cmd mailbox */ 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_TASK_DATA_MBOX TASK_MBOX_1 /* data mailbox */ 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTIF media cmd event definition : BTIF_MEDIA_TASK_CMD */ 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_START_AA_TX = 1, 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_STOP_AA_TX, 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_AA_RX_RDY, 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_UIPC_RX_RDY, 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_SBC_ENC_INIT, 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_SBC_ENC_UPDATE, 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_SBC_DEC_INIT, 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_VIDEO_DEC_INIT, 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_FLUSH_AA_TX, 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_FLUSH_AA_RX, 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_AUDIO_FEEDING_INIT, 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_AUDIO_RECEIVING_INIT 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum { 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MEDIA_TASK_STATE_OFF = 0, 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MEDIA_TASK_STATE_ON = 1, 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MEDIA_TASK_STATE_SHUTTING_DOWN = 2 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Macro to multiply the media task tick */ 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTIF_MEDIA_NUM_TICK 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_NUM_TICK 1 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 119b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren/* Media task tick in milliseconds, must be set to multiple of 120b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren (1000/TICKS_PER_SEC) (10) */ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 122b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#define BTIF_MEDIA_TIME_TICK (20 * BTIF_MEDIA_NUM_TICK) 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* buffer pool */ 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_POOL_ID GKI_POOL_ID_3 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_BUF_SIZE GKI_BUF3_SIZE 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* offset */ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_CO_CP_SCMS_T == TRUE) 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE + 1) 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE) 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Define the bitrate step when trying to match bitpool value */ 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTIF_MEDIA_BITRATE_STEP 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_BITRATE_STEP 5 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Middle quality quality setting @ 44.1 khz */ 141b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#define DEFAULT_SBC_BITRATE 328 142b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 143b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#ifndef BTIF_A2DP_NON_EDR_MAX_RATE 144b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#define BTIF_A2DP_NON_EDR_MAX_RATE 229 145b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#endif 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef A2DP_MEDIA_TASK_STACK_SIZE 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define A2DP_MEDIA_TASK_STACK_SIZE 0x2000 /* In bytes */ 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define A2DP_MEDIA_TASK_TASK_STR ((INT8 *) "A2DP-MEDIA") 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT32 a2dp_media_task_stack[(A2DP_MEDIA_TASK_STACK_SIZE + 3) / 4]; 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BT_MEDIA_TASK A2DP_MEDIA_TASK 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define USEC_PER_SEC 1000000L 1575fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren#define TPUT_STATS_INTERVAL_US (3000*1000) 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * CONGESTION COMPENSATION CTRL :: 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Thus setting controls how many buffers we will hold in media task 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * during temp link congestion. Together with the stack buffer queues 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * it controls much temporary a2dp link congestion we can 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * compensate for. It however also depends on the default run level of sinks 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * jitterbuffers. Depending on type of sink this would vary. 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Ideally the (SRC) max tx buffer capacity should equal the sinks 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * jitterbuffer runlevel including any intermediate buffers on the way 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * towards the sinks codec. 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* fixme -- define this in pcm time instead of buffer count */ 173b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 174b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren/* The typical runlevel of the tx queue size is ~1 buffer 175b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren but due to link flow control or thread preemption in lower 176b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren layers we might need to temporarily buffer up data */ 177b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 178b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren/* 24 frames is equivalent to 6.89*24*2.9 ~= 480 ms @ 44.1 khz, 20 ms mediatick */ 179b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#define MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ 24 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project//#define BTIF_MEDIA_VERBOSE_ENABLED 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifdef BTIF_MEDIA_VERBOSE_ENABLED 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define VERBOSE(fmt, ...) \ 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project LogMsg( TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \ 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project TRACE_TYPE_ERROR, fmt, ## __VA_ARGS__) 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define VERBOSE(fmt, ...) 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Data types 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 aa_frame_counter; 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT32 aa_feed_counter; 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT32 aa_feed_residue; 200b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren UINT32 counter; 201b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren UINT32 bytes_per_tick; /* pcm bytes read each media task tick */ 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE; 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef union 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE pcm; 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTIF_AV_MEDIA_FEEDINGS_STATE; 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BUFFER_Q TxAaQ; 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN is_tx_timer; 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 TxAaMtuSize; 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 timestamp; 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 TxTranscoding; 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_FEEDING_MODE feeding_mode; 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_MEDIA_FEEDINGS media_feeding; 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_MEDIA_FEEDINGS_STATE media_feeding_state; 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SBC_ENC_PARAMS encoder; 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 busy_level; 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void* av_sm_hdl; 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 a2dp_cmd_pending; /* we can have max one command pending */ 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN tx_flush; /* discards any outgoing data when true */ 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTIF_MEDIA_CB; 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct { 2315fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren long long rx; 2325fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren long long rx_tot; 2335fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren long long tx; 2345fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren long long tx_tot; 2355fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren long long ts_prev_us; 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} t_stat; 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Local data 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTIF_MEDIA_CB btif_media_cb; 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int media_task_running = MEDIA_TASK_STATE_OFF; 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Local functions 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event); 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event); 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_encoder_update(void); 2535fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agrenconst char* dump_media_event(UINT16 event); 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Externs 2575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_handle_cmd(BT_HDR *p_msg); 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_handle_media(BT_HDR *p_msg); 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_send_aa_frame(void); 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_feeding_state_reset(void); 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_start_tx(void); 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_stop_tx(void); 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_init(BT_HDR *p_msg); 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_update(BT_HDR *p_msg); 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_audio_feeding_init(BT_HDR *p_msg); 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_tx_flush(BT_HDR *p_msg); 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_aa_prep_2_send(UINT8 nb_frame); 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Misc helper functions 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void tput_mon(int is_rx, int len, int reset) 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* only monitor one connection at a time for now */ 2825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project static t_stat cur_stat; 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct timespec now; 2845fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren unsigned long long prev_us; 2855fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren unsigned long long now_us; 2865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reset == TRUE) 2885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&cur_stat, 0, sizeof(t_stat)); 2905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 2915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (is_rx) 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cur_stat.rx+=len; 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cur_stat.rx_tot+=len; 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cur_stat.tx+=len; 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cur_stat.tx_tot+=len; 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project clock_gettime(CLOCK_MONOTONIC, &now); 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project now_us = now.tv_sec*USEC_PER_SEC + now.tv_nsec/1000; 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((now_us - cur_stat.ts_prev_us) < TPUT_STATS_INTERVAL_US) 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3105fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren APPL_TRACE_WARNING4("tput rx:%d, tx:%d (bytes/s) (tot : rx %d, tx %d bytes)", 3115fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren (cur_stat.rx*1000000)/((now_us - cur_stat.ts_prev_us)), 3125fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren (cur_stat.tx*1000000)/((now_us - cur_stat.ts_prev_us)), 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cur_stat.rx_tot, cur_stat.tx_tot); 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stats dumped. now reset stats for next interval */ 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cur_stat.rx = 0; 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cur_stat.tx = 0; 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cur_stat.ts_prev_us = now_us; 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void log_tstamps_us(char *comment) 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project #define USEC_PER_SEC 1000000L 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project static struct timespec prev = {0, 0}; 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct timespec now, diff; 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned int diff_us = 0; 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project unsigned int now_us = 0; 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project clock_gettime(CLOCK_MONOTONIC, &now); 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project now_us = now.tv_sec*USEC_PER_SEC + now.tv_nsec/1000; 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project diff_us = (now.tv_sec - prev.tv_sec) * USEC_PER_SEC + (now.tv_nsec - prev.tv_nsec)/1000; 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG4("[%s] ts %08d, diff : %08d, queue sz %d", comment, now_us, diff_us, 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.TxAaQ.count); 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project prev = now; 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst char* dump_media_event(UINT16 event) 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(event) 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_START_AA_TX) 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_STOP_AA_TX) 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_AA_RX_RDY) 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_UIPC_RX_RDY) 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_INIT) 3495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_UPDATE) 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_SBC_DEC_INIT) 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_VIDEO_DEC_INIT) 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_TX) 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_RX) 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_AUDIO_FEEDING_INIT) 3555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_AUDIO_RECEIVING_INIT) 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "UNKNOWN MEDIA EVENT"; 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** A2DP CTRL PATH 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char* dump_a2dp_ctrl_event(UINT8 event) 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(event) 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(A2DP_CTRL_CMD_NONE) 3715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(A2DP_CTRL_CMD_CHECK_READY) 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(A2DP_CTRL_CMD_START) 3735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(A2DP_CTRL_CMD_STOP) 3745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(A2DP_CTRL_CMD_SUSPEND) 3755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "UNKNOWN MSG ID"; 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_audiopath_detached(void) 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT0("## AUDIO PATH DETACHED ##"); 3835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send stop request only if we are actively streaming and haven't received 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a stop request. Potentially audioflinger detached abnormally */ 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.is_tx_timer) 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* post stop event and wait for audio path to stop */ 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0); 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void a2dp_cmd_acknowledge(int status) 3945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ack = status; 3965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3975fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren APPL_TRACE_EVENT2("## a2dp ack : %s, status %d ##", 3985fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren dump_a2dp_ctrl_event(btif_media_cb.a2dp_cmd_pending), status); 3995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sanity check */ 4015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.a2dp_cmd_pending == A2DP_CTRL_CMD_NONE) 4025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR0("warning : no command pending, ignore ack"); 4045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear pending */ 4085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.a2dp_cmd_pending = A2DP_CTRL_CMD_NONE; 4095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* acknowledge start request */ 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &ack, 1); 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_recv_ctrl_data(void) 4165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cmd = 0; 4185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int n; 4195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project n = UIPC_Read(UIPC_CH_ID_AV_CTRL, NULL, &cmd, 1); 4215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* detach on ctrl channel means audioflinger process was terminated */ 4235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (n == 0) 4245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT0("CTRL CH DETACHED"); 4265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Close(UIPC_CH_ID_AV_CTRL); 4275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we can operate only on datachannel, if af client wants to 4285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do send additional commands the ctrl channel would be reestablished */ 4295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //btif_audiopath_detached(); 4305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("a2dp-ctrl-cmd : %s", dump_a2dp_ctrl_event(cmd)); 4345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.a2dp_cmd_pending = cmd; 4365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(cmd) 4385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case A2DP_CTRL_CMD_CHECK_READY: 4405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (media_task_running == MEDIA_TASK_STATE_SHUTTING_DOWN) 4425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 4445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 4455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check whether av is ready to setup a2dp datapath */ 4485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btif_av_stream_ready() == TRUE) || (btif_av_stream_started_ready() == TRUE)) 4495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 4515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 4555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case A2DP_CTRL_CMD_START: 4595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_av_stream_ready() == TRUE) 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* setup audio data channel listener */ 4635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb); 4645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* post start event and wait for audio path to open */ 4665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_dispatch_sm_event(BTIF_AV_START_STREAM_REQ_EVT, NULL, 0); 4675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btif_av_stream_started_ready()) 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* already started, setup audio data channel listener 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project and ack back immediately */ 4725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb); 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case A2DP_CTRL_CMD_STOP: 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.is_tx_timer == FALSE) 4865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are already stopped, just ack back */ 4885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0); 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case A2DP_CTRL_CMD_SUSPEND: 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* local suspend */ 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_av_stream_started_ready()) 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_dispatch_sm_event(BTIF_AV_SUSPEND_STREAM_REQ_EVT, NULL, 0); 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we are not in started state, just ack back ok and let 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project audioflinger close the channel. This can happen if we are 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project remotely suspended */ 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR1("UNSUPPORTED CMD (%d)", cmd); 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("a2dp-ctrl-cmd : %s DONE", dump_a2dp_ctrl_event(cmd)); 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event) 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("A2DP-CTRL-CHANNEL EVENT %s", dump_uipc_event(event)); 5215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(event) 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UIPC_OPEN_EVT: 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fetch av statemachine handle */ 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.av_sm_hdl = btif_av_get_sm_handle(); 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UIPC_CLOSE_EVT: 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* restart ctrl server unless we are shutting down */ 5315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (media_task_running == MEDIA_TASK_STATE_ON) 5325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb); 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UIPC_RX_DATA_READY_EVT: 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_recv_ctrl_data(); 5375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default : 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR1("### A2DP-CTRL-CHANNEL EVENT %d NOT HANDLED ###", event); 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event) 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("BTIF MEDIA (A2DP-DATA) EVENT %s", dump_uipc_event(event)); 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(event) 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UIPC_OPEN_EVT: 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* read directly from media task from here on (keep callback for 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project connection events */ 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_REMOVE_ACTIVE_READSET, NULL); 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Start the media task to encode SBC */ 5585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_start_aa_req(); 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* make sure we update any changed sbc encoder params */ 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_encoder_update(); 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ack back when media task is fully started */ 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UIPC_CLOSE_EVT: 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_audiopath_detached(); 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default : 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR1("### A2DP-DATA EVENT %d NOT HANDLED ###", event); 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** BTIF ADAPTATION 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 582b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agrenstatic UINT16 btif_media_task_get_sbc_rate(void) 583b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren{ 584b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren UINT16 rate = DEFAULT_SBC_BITRATE; 585b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 586b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren /* restrict bitrate if a2dp link is non-edr */ 587b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren if (!btif_av_is_peer_edr()) 588b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren { 589b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren rate = BTIF_A2DP_NON_EDR_MAX_RATE; 590b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren APPL_TRACE_DEBUG1("non-edr a2dp sink detected, restrict rate to %d", rate); 591b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren } 592b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 593b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren return rate; 594b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren} 595b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_encoder_init(void) 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 minmtu; 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_INIT_AUDIO msg; 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_SBC_CIE sbc_config; 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* lookup table for converting channel mode */ 6035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 codec_mode_tbl[5] = { SBC_JOINT_STEREO, SBC_STEREO, SBC_DUAL, 0, SBC_MONO }; 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* lookup table for converting number of blocks */ 6065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 codec_block_tbl[5] = { 16, 12, 8, 0, 4 }; 6075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* lookup table to convert freq */ 6095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 freq_block_tbl[5] = { SBC_sf48000, SBC_sf44100, SBC_sf32000, 0, SBC_sf16000 }; 6105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("btif_a2dp_encoder_init"); 6125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Retrieve the current SBC configuration (default if currently not used) */ 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu); 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.NumOfSubBands = (sbc_config.num_subbands == A2D_SBC_IE_SUBBAND_4) ? 4 : 8; 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.NumOfBlocks = codec_block_tbl[sbc_config.block_len >> 5]; 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.AllocationMethod = (sbc_config.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L) ? SBC_LOUDNESS : SBC_SNR; 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.ChannelMode = codec_mode_tbl[sbc_config.ch_mode >> 1]; 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.SamplingFreq = freq_block_tbl[sbc_config.samp_freq >> 5]; 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.MtuSize = minmtu; 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT1("msg.ChannelMode %x", msg.ChannelMode); 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Init the media task to encode SBC properly */ 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_enc_init_req(&msg); 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_encoder_update(void) 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 minmtu; 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_SBC_CIE sbc_config; 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_UPDATE_AUDIO msg; 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 pref_min; 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 pref_max; 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("btif_a2dp_encoder_update"); 6375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Retrieve the current SBC configuration (default if currently not used) */ 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu); 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG4("btif_a2dp_encoder_update: Common min_bitpool:%d(0x%x) max_bitpool:%d(0x%x)", 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_config.min_bitpool, sbc_config.min_bitpool, 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_config.max_bitpool, sbc_config.max_bitpool); 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sbc_config.min_bitpool > sbc_config.max_bitpool) 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR0("btif_a2dp_encoder_update: ERROR btif_a2dp_encoder_update min_bitpool > max_bitpool"); 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if remote sink has a preferred bitpool range */ 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_get_remote_bitpool_pref(&pref_min, &pref_max) == TRUE) 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* adjust our preferred bitpool with the remote preference if within 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project our capable range */ 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pref_min < sbc_config.min_bitpool) 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pref_min = sbc_config.min_bitpool; 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pref_max > sbc_config.max_bitpool) 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pref_max = sbc_config.max_bitpool; 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.MinBitPool = pref_min; 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.MaxBitPool = pref_max; 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((pref_min != sbc_config.min_bitpool) || (pref_max != sbc_config.max_bitpool)) 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT2("## adjusted our bitpool range to peer pref [%d:%d] ##", 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pref_min, pref_max); 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.MinBitPool = sbc_config.min_bitpool; 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.MaxBitPool = sbc_config.max_bitpool; 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.MinMtuSize = minmtu; 6785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Update the media task to encode SBC properly */ 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_enc_update_req(&msg); 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_start_media_task 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint btif_a2dp_start_media_task(void) 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int retval; 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (media_task_running != MEDIA_TASK_STATE_OFF) 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR0("warning : media task already running"); 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GKI_FAILURE; 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT0("## A2DP START MEDIA TASK ##"); 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start a2dp media task */ 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project retval = GKI_create_task((TASKPTR)btif_media_task, A2DP_MEDIA_TASK, 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project A2DP_MEDIA_TASK_TASK_STR, 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT16 *) ((UINT8 *)a2dp_media_task_stack + A2DP_MEDIA_TASK_STACK_SIZE), 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sizeof(a2dp_media_task_stack)); 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (retval != GKI_SUCCESS) 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return retval; 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* wait for task to come up to sure we are able to send messages to it */ 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (media_task_running == MEDIA_TASK_STATE_OFF) 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project usleep(10); 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT0("## A2DP MEDIA TASK STARTED ##"); 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return retval; 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_stop_media_task 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_stop_media_task(void) 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT0("## A2DP STOP MEDIA TASK ##"); 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_destroy_task(BT_MEDIA_TASK); 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 7415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_on_init 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 7475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_init(void) 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //tput_mon(1, 0, 1); 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_setup_codec 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_setup_codec(void) 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_MEDIA_FEEDINGS media_feeding; 7695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_STATUS status; 7705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT0("## A2DP SETUP CODEC ##"); 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_disable(); 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 775b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren /* for now hardcode 44.1 khz 16 bit stereo PCM format */ 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project media_feeding.cfg.pcm.sampling_freq = 44100; 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project media_feeding.cfg.pcm.bit_per_sample = 16; 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project media_feeding.cfg.pcm.num_channel = 2; 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project media_feeding.format = BTIF_AV_CODEC_PCM; 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_audio_set_codec(&media_feeding, &status)) 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_INIT_AUDIO_FEEDING mfeed; 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Init the encoding task */ 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_encoder_init(); 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Build the media task configuration */ 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mfeed.feeding = media_feeding; 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mfeed.feeding_mode = BTIF_AV_FEEDING_ASYNCHRONOUS; 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send message to Media task to configure transcoding */ 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_audio_feeding_init_req(&mfeed); 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enable(); 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_on_idle 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_idle(void) 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT0("## ON A2DP IDLE ##"); 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Make sure media task is stopped */ 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_stop_aa_req(); 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_init(); 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_on_open 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_open(void) 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT0("## ON A2DP OPEN ##"); 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* always use callback to notify socket events */ 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb); 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_on_started 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 847379743beded881127703334e1dda2cd327ec651dZhihai XuBOOLEAN btif_a2dp_on_started(tBTA_AV_START *p_av, BOOLEAN pending_start) 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_STATUS status; 850379743beded881127703334e1dda2cd327ec651dZhihai Xu BOOLEAN ack = FALSE; 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT0("## ON A2DP STARTED ##"); 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8545fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren if (p_av == NULL) 8555fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren { 8565fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren /* ack back a local start request */ 8575fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 858379743beded881127703334e1dda2cd327ec651dZhihai Xu return TRUE; 8595fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren } 8605fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->status == BTA_AV_SUCCESS) 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->suspending == FALSE) 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->initiator) 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 867379743beded881127703334e1dda2cd327ec651dZhihai Xu if (pending_start) { 868379743beded881127703334e1dda2cd327ec651dZhihai Xu a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 869379743beded881127703334e1dda2cd327ec651dZhihai Xu ack = TRUE; 870379743beded881127703334e1dda2cd327ec651dZhihai Xu } 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we were remotely started, make sure codec 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is setup before datapath is started */ 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_setup_codec(); 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* media task is autostarted upon a2dp audiopath connection */ 8805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 882379743beded881127703334e1dda2cd327ec651dZhihai Xu else if (pending_start) 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 885379743beded881127703334e1dda2cd327ec651dZhihai Xu ack = TRUE; 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 887379743beded881127703334e1dda2cd327ec651dZhihai Xu return ack; 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 8935fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Function btif_a2dp_ack_fail 8945fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** 8955fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Description 8965fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** 8975fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Returns 8985fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** 8995fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren*******************************************************************************/ 9005fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 9015fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agrenvoid btif_a2dp_ack_fail(void) 9025fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren{ 9035fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren tBTIF_STATUS status; 9045fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 9055fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren APPL_TRACE_EVENT0("## A2DP_CTRL_ACK_FAILURE ##"); 9065fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 9075fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren} 9085fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 9095fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren/***************************************************************************** 9105fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_on_stopped 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av) 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT0("## ON A2DP STOPPED ##"); 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allow using this api for other than suspend */ 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av != NULL) 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->status != BTA_AV_SUCCESS) 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT1("AV STOP FAILED (%d)", p_av->status); 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->initiator) 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 9335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ensure tx frames are immediately suspended */ 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.tx_flush = 1; 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* request to stop media task */ 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_aa_tx_flush_req(); 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_stop_aa_req(); 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* once stream is fully stopped we will ack back */ 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_on_suspended 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av) 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT0("## ON A2DP SUSPENDED ##"); 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check for status failures */ 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->status != BTA_AV_SUCCESS) 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->initiator == TRUE) 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* once stream is fully stopped we will ack back */ 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ensure tx frames are immediately flushed */ 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.tx_flush = 1; 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop timer tick */ 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_stop_aa_req(); 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* when true media task discards any tx frames */ 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_set_tx_flush(BOOLEAN enable) 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT1("## DROP TX %d ##", enable); 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.tx_flush = enable; 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_calc_pcmtime 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description Calculates the pcmtime equivalent of a datapacket 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns microseconds 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic int btif_calc_pcmtime(UINT32 bytes_processed) 9955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int pcm_time_us = 0; 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_MEDIA_FEED_CFG *p_cfg; 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_cfg = &btif_media_cb.media_feeding.cfg; 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* calculate corresponding pcm time based on data processed */ 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(btif_media_cb.media_feeding.format) 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_CODEC_PCM: 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pcm_time_us = (bytes_processed*1000000)/ 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_cfg->pcm.num_channel*p_cfg->pcm.sampling_freq*p_cfg->pcm.bit_per_sample/8); 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default : 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR1("mediafeeding format invalid : %d", btif_media_cb.media_feeding.format); 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return pcm_time_us; 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_aa_handle_timer 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_handle_timer(void) 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE)) 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project static UINT16 Debug = 0; 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("btif_media_task_aa_handle_timer: %d", Debug++); 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project log_tstamps_us("media task tx timer"); 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_send_aa_frame(); 10395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_aa_handle_timer 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_handle_uipc_rx_rdy(void) 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE)) 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project static UINT16 Debug = 0; 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("btif_media_task_aa_handle_uipc_rx_rdy: %d", Debug++); 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* process all the UIPC data */ 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_aa_prep_2_send(0xFF); 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send it */ 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project VERBOSE("btif_media_task_aa_handle_uipc_rx_rdy calls bta_av_ci_src_data_ready"); 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO); 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_init 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_media_task_init(void) 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&(btif_media_cb), 0, sizeof(btif_media_cb)); 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Init(NULL); 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb); 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Task for SBC encoder. This task receives an 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** event when the waveIn interface has a pcm data buffer 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** ready. On receiving the event, handle all ready pcm 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** data buffers. If stream is started, run the SBC encoder 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** on each chunk of pcm samples and build an output packet 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** consisting of one or more encoded SBC frames. 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectint btif_media_task(void *p) 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 event; 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_msg; 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project VERBOSE("================ MEDIA TASK STARTING ================"); 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_init(); 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project media_task_running = MEDIA_TASK_STATE_ON; 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project raise_priority_a2dp(TASK_HIGH_MEDIA); 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (1) 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project event = GKI_wait(0xffff, 0); 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project VERBOSE("================= MEDIA TASK EVENT %d ===============", event); 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event & BTIF_MEDIA_TASK_CMD) 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Process all messages in the queue */ 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ((p_msg = (BT_HDR *) GKI_read_mbox(BTIF_MEDIA_TASK_CMD_MBOX)) != NULL) 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_handle_cmd(p_msg); 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event & BTIF_MEDIA_TASK_DATA) 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Process all messages in the queue */ 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while ((p_msg = (BT_HDR *) GKI_read_mbox(BTIF_MEDIA_TASK_DATA_MBOX)) != NULL) 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_handle_media(p_msg); 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event & BTIF_MEDIA_AA_TASK_TIMER) 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* advance audio timer expiration */ 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_aa_handle_timer(); 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project VERBOSE("=============== MEDIA TASK EVENT %d DONE ============", event); 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* When we get this event we exit the task - should only happen on GKI_shutdown */ 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (event & BTIF_MEDIA_TASK_KILL) 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* make sure no channels are restarted while shutting down */ 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project media_task_running = MEDIA_TASK_STATE_SHUTTING_DOWN; 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* this calls blocks until uipc is fully closed */ 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Close(UIPC_CH_ID_ALL); 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Clear media task flag */ 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project media_task_running = MEDIA_TASK_STATE_OFF; 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("MEDIA TASK EXITING"); 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return 0; 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_send_cmd_evt 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_send_cmd_evt(UINT16 Evt) 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR)))) 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->event = Evt; 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_flush_q 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_flush_q(BUFFER_Q *p_q) 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (GKI_IS_QUEUE_EMPTY(p_q) == FALSE) 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(GKI_dequeue(p_q)); 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_handle_cmd 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_handle_cmd(BT_HDR *p_msg) 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12235fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren VERBOSE("btif_media_task_handle_cmd : %d %s", p_msg->event, 12245fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren dump_media_event(p_msg->event)); 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_msg->event) 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_START_AA_TX: 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_aa_start_tx(); 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_STOP_AA_TX: 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_aa_stop_tx(); 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_SBC_ENC_INIT: 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_enc_init(p_msg); 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_SBC_ENC_UPDATE: 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_enc_update(p_msg); 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_AUDIO_FEEDING_INIT: 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_audio_feeding_init(p_msg); 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_FLUSH_AA_TX: 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_aa_tx_flush(p_msg); 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_UIPC_RX_RDY: 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_aa_handle_uipc_rx_rdy(); 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR1("ERROR in btif_media_task_handle_cmd unknown event %d", p_msg->event); 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_msg); 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project VERBOSE("btif_media_task_handle_cmd : %s DONE", dump_media_event(p_msg->event)); 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_handle_media 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_handle_media(BT_HDR *p_msg) 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR0("ERROR btif_media_task_handle_media: not in use"); 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_msg); 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_enc_init_req 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_enc_init_req(tBTIF_MEDIA_INIT_AUDIO *p_msg) 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_INIT_AUDIO *p_buf; 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_INIT_AUDIO)))) 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO)); 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_INIT; 12975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 13005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_enc_update_req 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_enc_update_req(tBTIF_MEDIA_UPDATE_AUDIO *p_msg) 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_UPDATE_AUDIO *p_buf; 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_UPDATE_AUDIO)))) 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_UPDATE_AUDIO)); 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_UPDATE; 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_audio_feeding_init_req 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_audio_feeding_init_req(tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_msg) 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_buf; 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING)))) 13395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 13415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING)); 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->hdr.event = BTIF_MEDIA_AUDIO_FEEDING_INIT; 13455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 13475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 13485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_start_aa_req 13535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 13555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 13575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 13595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_start_aa_req(void) 13605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 13625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR)))) 13635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT0("GKI failed"); 13655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 13665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->event = BTIF_MEDIA_START_AA_TX; 13695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 13715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 13725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_stop_aa_req 13775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 13795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 13835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_stop_aa_req(void) 13845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 13865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR)))) 13875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 13895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->event = BTIF_MEDIA_STOP_AA_TX; 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 13985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_aa_tx_flush_req 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 14065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_aa_tx_flush_req(void) 14075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 14095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR)))) 14105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 14125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->event = BTIF_MEDIA_FLUSH_AA_TX; 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 14175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 14185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_aa_tx_flush 14235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 14255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 14275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_tx_flush(BT_HDR *p_msg) 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Flush all enqueued GKI music buffers (encoded) */ 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("btif_media_task_aa_tx_flush"); 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1434b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.counter = 0; 1435b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0; 1436b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_flush_q(&(btif_media_cb.TxAaQ)); 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REQ_RX_FLUSH, NULL); 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_enc_init 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Initialize encoding task 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_init(BT_HDR *p_msg) 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_INIT_AUDIO *pInitAudio = (tBTIF_MEDIA_INIT_AUDIO *) p_msg; 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("btif_media_task_enc_init"); 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.timestamp = 0; 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SBC encoder config (enforced even if not used) */ 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16ChannelMode = pInitAudio->ChannelMode; 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16NumOfSubBands = pInitAudio->NumOfSubBands; 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16NumOfBlocks = pInitAudio->NumOfBlocks; 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16AllocationMethod = pInitAudio->AllocationMethod; 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16SamplingFreq = pInitAudio->SamplingFreq; 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1466b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.encoder.u16BitRate = btif_media_task_get_sbc_rate(); 1467b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Default transcoding is PCM to SBC, modified by feeding configuration */ 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC; 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE-BTIF_MEDIA_AA_SBC_OFFSET-sizeof(BT_HDR)) 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project < pInitAudio->MtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project - sizeof(BT_HDR)) : pInitAudio->MtuSize; 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT3("btif_media_task_enc_init busy %d, mtu %d, peer mtu %d", 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.busy_level, btif_media_cb.TxAaMtuSize, pInitAudio->MtuSize); 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_EVENT6(" ch mode %d, subnd %d, nb blk %d, alloc %d, rate %d, freq %d", 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16ChannelMode, btif_media_cb.encoder.s16NumOfSubBands, 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16NumOfBlocks, 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate, 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16SamplingFreq); 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reset entirely the SBC encoder */ 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SBC_Encoder_Init(&(btif_media_cb.encoder)); 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("btif_media_task_enc_init bit pool %d", btif_media_cb.encoder.s16BitPool); 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_enc_update 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Update encoding task 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_update(BT_HDR *p_msg) 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_UPDATE_AUDIO * pUpdateAudio = (tBTIF_MEDIA_UPDATE_AUDIO *) p_msg; 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SBC_ENC_PARAMS *pstrEncParams = &btif_media_cb.encoder; 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 s16SamplingFreq; 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16BitPool; 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16BitRate; 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16FrameLen; 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 protect = 0; 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG3("btif_media_task_enc_update : minmtu %d, maxbp %d minbp %d", 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pUpdateAudio->MinMtuSize, pUpdateAudio->MaxBitPool, pUpdateAudio->MinBitPool); 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Only update the bitrate and MTU size while timer is running to make sure it has been initialized */ 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //if (btif_media_cb.is_tx_timer) 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15135fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE - 15145fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren BTIF_MEDIA_AA_SBC_OFFSET - sizeof(BT_HDR)) 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project < pUpdateAudio->MinMtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project - sizeof(BT_HDR)) : pUpdateAudio->MinMtuSize; 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set the initial target bit rate */ 1519b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren pstrEncParams->u16BitRate = btif_media_task_get_sbc_rate(); 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pstrEncParams->s16SamplingFreq == SBC_sf16000) 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s16SamplingFreq = 16000; 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (pstrEncParams->s16SamplingFreq == SBC_sf32000) 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s16SamplingFreq = 32000; 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (pstrEncParams->s16SamplingFreq == SBC_sf44100) 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s16SamplingFreq = 44100; 15275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s16SamplingFreq = 48000; 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) || 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (pstrEncParams->s16ChannelMode == SBC_STEREO) ) 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s16BitPool = (SINT16)( (pstrEncParams->u16BitRate * 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->s16NumOfSubBands * 1000 / s16SamplingFreq) 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project -( (32 + (4 * pstrEncParams->s16NumOfSubBands * 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->s16NumOfChannels) 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project + ( (pstrEncParams->s16ChannelMode - 2) * 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->s16NumOfSubBands ) ) 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project / pstrEncParams->s16NumOfBlocks) ); 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s16FrameLen = 4 + (4*pstrEncParams->s16NumOfSubBands* 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->s16NumOfChannels)/8 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project + ( ((pstrEncParams->s16ChannelMode - 2) * 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->s16NumOfSubBands) 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project + (pstrEncParams->s16NumOfBlocks * s16BitPool) ) / 8; 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s16BitRate = (8 * s16FrameLen * s16SamplingFreq) 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project / (pstrEncParams->s16NumOfSubBands * 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->s16NumOfBlocks * 1000); 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (s16BitRate > pstrEncParams->u16BitRate) 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s16BitPool--; 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(pstrEncParams->s16NumOfSubBands == 8) 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s16BitPool = (s16BitPool > 255) ? 255 : s16BitPool; 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s16BitPool = (s16BitPool > 128) ? 128 : s16BitPool; 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s16BitPool = (SINT16)( ((pstrEncParams->s16NumOfSubBands * 15645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->u16BitRate * 1000) 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project / (s16SamplingFreq * pstrEncParams->s16NumOfChannels)) 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project -( ( (32 / pstrEncParams->s16NumOfChannels) + 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (4 * pstrEncParams->s16NumOfSubBands) ) 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project / pstrEncParams->s16NumOfBlocks ) ); 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->s16BitPool = (s16BitPool > 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (16 * pstrEncParams->s16NumOfSubBands)) 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ? (16*pstrEncParams->s16NumOfSubBands) : s16BitPool; 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (s16BitPool < 0) 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project s16BitPool = 0; 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15805fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren APPL_TRACE_EVENT2("bitpool candidate : %d (%d kbps)", 15815fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren s16BitPool, pstrEncParams->u16BitRate); 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (s16BitPool > pUpdateAudio->MaxBitPool) 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15855fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren APPL_TRACE_DEBUG1("btif_media_task_enc_update computed bitpool too large (%d)", 15865fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren s16BitPool); 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Decrease bitrate */ 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.u16BitRate -= BTIF_MEDIA_BITRATE_STEP; 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Record that we have decreased the bitrate */ 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect |= 1; 15915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (s16BitPool < pUpdateAudio->MinBitPool) 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING1("btif_media_task_enc_update computed bitpool too small (%d)", s16BitPool); 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Increase bitrate */ 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.u16BitRate += BTIF_MEDIA_BITRATE_STEP; 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Record that we have increased the bitrate */ 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project protect |= 2; 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In case we have already increased and decreased the bitrate, just stop */ 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (protect == 3) 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR0("btif_media_task_enc_update could not find bitpool in range"); 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (1); 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Finally update the bitpool in the encoder structure */ 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->s16BitPool = s16BitPool; 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("btif_media_task_enc_update final bit rate %d, final bit pool %d", 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.u16BitRate, btif_media_cb.encoder.s16BitPool); 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* make sure we reinitialize encoder with new settings */ 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SBC_Encoder_Init(&(btif_media_cb.encoder)); 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_pcm2sbc_init 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Init encoding task for PCM to SBC according to feeding 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_pcm2sbc_init(tBTIF_MEDIA_INIT_AUDIO_FEEDING * p_feeding) 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN reconfig_needed = FALSE; 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("PCM feeding:"); 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("sampling_freq:%d", p_feeding->feeding.cfg.pcm.sampling_freq); 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("num_channel:%d", p_feeding->feeding.cfg.pcm.num_channel); 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("bit_per_sample:%d", p_feeding->feeding.cfg.pcm.bit_per_sample); 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check the PCM feeding sampling_freq */ 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_feeding->feeding.cfg.pcm.sampling_freq) 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 8000: 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 12000: 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 16000: 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 24000: 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 32000: 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 48000: 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For these sampling_freq the AV connection must be 48000 */ 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf48000) 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reconfiguration needed at 48000 */ 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("SBC Reconfiguration needed at 48000"); 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16SamplingFreq = SBC_sf48000; 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reconfig_needed = TRUE; 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 11025: 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 22050: 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 44100: 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For these sampling_freq the AV connection must be 44100 */ 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf44100) 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reconfiguration needed at 44100 */ 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("SBC Reconfiguration needed at 44100"); 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16SamplingFreq = SBC_sf44100; 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reconfig_needed = TRUE; 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("Feeding PCM sampling_freq unsupported"); 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Some AV Headsets do not support Mono => always ask for Stereo */ 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.encoder.s16ChannelMode == SBC_MONO) 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("SBC Reconfiguration needed in Stereo"); 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16ChannelMode = SBC_JOINT_STEREO; 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reconfig_needed = TRUE; 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reconfig_needed != FALSE) 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16875fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren APPL_TRACE_DEBUG1("btif_media_task_pcm2sbc_init :: mtu %d", btif_media_cb.TxAaMtuSize); 16885fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren APPL_TRACE_DEBUG6("ch mode %d, nbsubd %d, nb %d, alloc %d, rate %d, freq %d", 16895fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.encoder.s16ChannelMode, 16905fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.encoder.s16NumOfSubBands, btif_media_cb.encoder.s16NumOfBlocks, 16915fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate, 16925fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.encoder.s16SamplingFreq); 16935fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SBC_Encoder_Init(&(btif_media_cb.encoder)); 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("btif_media_task_pcm2sbc_init no SBC reconfig needed"); 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_audio_feeding_init 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Initialize the audio path according to the feeding format 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_audio_feeding_init(BT_HDR *p_msg) 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_feeding = (tBTIF_MEDIA_INIT_AUDIO_FEEDING *) p_msg; 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("btif_media_task_audio_feeding_init format:%d", p_feeding->feeding.format); 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save Media Feeding information */ 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.feeding_mode = p_feeding->feeding_mode; 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding = p_feeding->feeding; 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Handle different feeding formats */ 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_feeding->feeding.format) 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_CODEC_PCM: 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC; 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_pcm2sbc_init(p_feeding); 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default : 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR1("unknown feeding format %d", p_feeding->feeding.format); 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_uipc_cback 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description UIPC call back function for synchronous mode only 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_uipc_cback(BT_HDR *p_msg) 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Sanity check */ 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (NULL == p_msg) 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Just handle RX_EVT */ 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_msg->event != UIPC_RX_DATA_EVT) 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_msg->event = BTIF_MEDIA_UIPC_RX_RDY; 17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_msg); 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_feeding_state_reset 17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Reset the media feeding state 17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_feeding_state_reset(void) 17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* By default, just clear the entire state */ 17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&btif_media_cb.media_feeding_state, 0, sizeof(btif_media_cb.media_feeding_state)); 1777b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 1778b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren if (btif_media_cb.TxTranscoding == BTIF_MEDIA_TRSCD_PCM_2_SBC) 1779b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren { 1780b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.bytes_per_tick = 1781b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren (btif_media_cb.media_feeding.cfg.pcm.sampling_freq * 1782b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8 * 1783b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.num_channel * 1784b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren BTIF_MEDIA_TIME_TICK)/1000; 1785b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 1786b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren APPL_TRACE_WARNING1("pcm bytes per tick %d", 1787b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren (int)btif_media_cb.media_feeding_state.pcm.bytes_per_tick); 1788b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren } 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_aa_start_tx 17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Start media task encoding 17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_start_tx(void) 18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("btif_media_task_aa_start_tx is timer %d, feeding mode %d", 18025fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.is_tx_timer, btif_media_cb.feeding_mode); 18035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Use a timer to poll the UIPC, get rid of the UIPC call back */ 18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project // UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_CBACK, NULL); 18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.is_tx_timer = TRUE; 18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reset the media feeding state */ 18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_feeding_state_reset(); 18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18125fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren APPL_TRACE_EVENT2("starting timer %d ticks (%d)", 18135fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren GKI_MS_TO_TICKS(BTIF_MEDIA_TIME_TICK), TICKS_PER_SEC); 18145fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_start_timer(BTIF_MEDIA_AA_TASK_TIMER_ID, GKI_MS_TO_TICKS(BTIF_MEDIA_TIME_TICK), TRUE); 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_aa_stop_tx 18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Stop media task encoding 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_aa_stop_tx(void) 18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("btif_media_task_aa_stop_tx is timer: %d", btif_media_cb.is_tx_timer); 18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Stop the timer first */ 18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_stop_timer(BTIF_MEDIA_AA_TASK_TIMER_ID); 18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.is_tx_timer = FALSE; 18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Close(UIPC_CH_ID_AV_AUDIO); 18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* audio engine stopped, reset tx suspended flag */ 18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.tx_flush = 0; 18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reset the media feeding state */ 18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_feeding_state_reset(); 18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_get_num_aa_frame 18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns The number of media frames in this time slice 18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 18535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic UINT8 btif_get_num_aa_frame(void) 18545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 result=0; 18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (btif_media_cb.TxTranscoding) 18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_TRSCD_PCM_2_SBC: 1860b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren { 1861b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren UINT32 pcm_bytes_per_frame = btif_media_cb.encoder.s16NumOfSubBands * 1862b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.encoder.s16NumOfBlocks * 1863b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.num_channel * 1864b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8; 18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1866b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.counter += 1867b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.bytes_per_tick; 18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1869b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren /* calculate nbr of frames pending for this media tick */ 1870b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren result = btif_media_cb.media_feeding_state.pcm.counter/pcm_bytes_per_frame; 1871b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.counter -= result*pcm_bytes_per_frame; 18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project VERBOSE("WRITE %d FRAMES", result); 1874b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren } 1875b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren break; 18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 18785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR1("ERROR btif_get_num_aa_frame Unsupported transcoding format 0x%x", 18795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.TxTranscoding); 18805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = 0; 18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 18825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE)) 18855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG1("btif_get_num_aa_frame returns %d", result); 18865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 18875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 18895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_aa_readbuf 18945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description This function is called by the av_co to get the next buffer to send 18965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 18995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 19005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *btif_media_aa_readbuf(void) 19015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return GKI_dequeue(&(btif_media_cb.TxAaQ)); 19035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 19045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 19065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_aa_read_feeding 19085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 19095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 19115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 19125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 19135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 19145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_aa_read_feeding(tUIPC_CH_ID channel_id) 19165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 19175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 event; 19185fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands * \ 19195fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.encoder.s16NumOfBlocks; 19205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 read_size; 19215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sbc_sampling = 48000; 19225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 src_samples; 19235fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren UINT16 bytes_needed = blocm_x_subband * btif_media_cb.encoder.s16NumOfChannels * \ 1924b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8; 19255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project static UINT16 up_sampled_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS 19265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS * 2]; 19275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project static UINT16 read_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS 19285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS]; 19295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 src_size_used; 19305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 dst_size_used; 19315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN fract_needed; 19325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT32 fract_max; 19335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT32 fract_threshold; 19345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 nb_byte_read; 19355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Get the SBC sampling rate */ 19375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (btif_media_cb.encoder.s16SamplingFreq) 19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SBC_sf48000: 19405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_sampling = 48000; 19415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SBC_sf44100: 19435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_sampling = 44100; 19445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 19455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SBC_sf32000: 19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_sampling = 32000; 19475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SBC_sf16000: 19495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_sampling = 16000; 19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1953b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren if (sbc_sampling == btif_media_cb.media_feeding.cfg.pcm.sampling_freq) { 1954b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren read_size = bytes_needed - btif_media_cb.media_feeding_state.pcm.aa_feed_residue; 1955b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren nb_byte_read = UIPC_Read(channel_id, &event, 1956b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren ((UINT8 *)btif_media_cb.encoder.as16PcmBuffer) + 1957b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.aa_feed_residue, 1958b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren read_size); 1959b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren if (nb_byte_read == read_size) { 1960b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0; 1961b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren return TRUE; 1962b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren } else { 1963b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren APPL_TRACE_WARNING2("### UNDERFLOW :: ONLY READ %d BYTES OUT OF %d ###", 1964b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren nb_byte_read, read_size); 1965b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.aa_feed_residue += nb_byte_read; 1966b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren return FALSE; 1967b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren } 1968b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren } 1969b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 19705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Some Feeding PCM frequencies require to split the number of sample */ 19715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* to read. */ 19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* E.g 128/6=21.3333 => read 22 and 21 and 21 => max = 2; threshold = 0*/ 19735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_needed = FALSE; /* Default */ 19745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (btif_media_cb.media_feeding.cfg.pcm.sampling_freq) 19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 32000: 19775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 8000: 19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_needed = TRUE; 19795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_max = 2; /* 0, 1 and 2 */ 19805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_threshold = 0; /* Add one for the first */ 19815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 19825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 16000: 19835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_needed = TRUE; 19845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_max = 2; /* 0, 1 and 2 */ 19855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_threshold = 1; /* Add one for the first two frames*/ 19865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 19875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 19885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Compute number of sample to read from source */ 19905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_samples = blocm_x_subband; 19915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_samples *= btif_media_cb.media_feeding.cfg.pcm.sampling_freq; 19925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_samples /= sbc_sampling; 19935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 19945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The previous division may have a remainder not null */ 19955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (fract_needed) 19965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter <= fract_threshold) 19985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 19995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_samples++; /* for every read before threshold add one sample */ 20005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do nothing if counter >= threshold */ 20035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding_state.pcm.aa_feed_counter++; /* one more read */ 20045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter > fract_max) 20055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding_state.pcm.aa_feed_counter = 0; 20075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Compute number of bytes to read from source */ 20115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project read_size = src_samples; 20125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project read_size *= btif_media_cb.media_feeding.cfg.pcm.num_channel; 20135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project read_size *= (btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8); 20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Read Data from UIPC channel */ 20165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nb_byte_read = UIPC_Read(channel_id, &event, (UINT8 *)read_buffer, read_size); 20175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //tput_mon(TRUE, nb_byte_read, FALSE); 20195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (nb_byte_read < read_size) 20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_WARNING2("### UNDERRUN :: ONLY READ %d BYTES OUT OF %d ###", 20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nb_byte_read, read_size); 20245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (nb_byte_read == 0) 20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(btif_media_cb.feeding_mode == BTIF_AV_FEEDING_ASYNCHRONOUS) 20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Fill the unfilled part of the read buffer with silence (0) */ 20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(((UINT8 *)read_buffer) + nb_byte_read, 0, read_size - nb_byte_read); 20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nb_byte_read = read_size; 20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Initialize PCM up-sampling engine */ 20375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_sbc_init_up_sample(btif_media_cb.media_feeding.cfg.pcm.sampling_freq, 20385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_sampling, btif_media_cb.media_feeding.cfg.pcm.bit_per_sample, 20395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding.cfg.pcm.num_channel); 20405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* re-sample read buffer */ 20425fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren /* The output PCM buffer will be stereo, 16 bit per sample */ 20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dst_size_used = bta_av_sbc_up_sample((UINT8 *)read_buffer, 20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT8 *)up_sampled_buffer + btif_media_cb.media_feeding_state.pcm.aa_feed_residue, 20455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nb_byte_read, 20465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sizeof(up_sampled_buffer) - btif_media_cb.media_feeding_state.pcm.aa_feed_residue, 20475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &src_size_used); 20485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE)) 20505fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren APPL_TRACE_DEBUG3("btif_media_aa_read_feeding readsz:%d src_size_used:%d dst_size_used:%d", 20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project read_size, src_size_used, dst_size_used); 20525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update the residue */ 20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding_state.pcm.aa_feed_residue += dst_size_used; 20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* only copy the pcm sample when we have up-sampled enough PCM */ 20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(btif_media_cb.media_feeding_state.pcm.aa_feed_residue >= bytes_needed) 20595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Copy the output pcm samples in SBC encoding buffer */ 20615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((UINT8 *)btif_media_cb.encoder.as16PcmBuffer, 20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT8 *)up_sampled_buffer, 20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bytes_needed); 20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update the residue */ 20655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding_state.pcm.aa_feed_residue -= bytes_needed; 20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.media_feeding_state.pcm.aa_feed_residue != 0) 20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((UINT8 *)up_sampled_buffer, 20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT8 *)up_sampled_buffer + bytes_needed, 20715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding_state.pcm.aa_feed_residue); 20725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE)) 20775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG3("btif_media_aa_read_feeding residue:%d, dst_size_used %d, bytes_needed %d", 20785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding_state.pcm.aa_feed_residue, dst_size_used, bytes_needed); 20795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 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_aa_prep_sbc_2_send 20875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 20885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 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_aa_prep_sbc_2_send(UINT8 nb_frame) 20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR * p_buf; 20965fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands * 20975fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.encoder.s16NumOfBlocks; 20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE)) 21005fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren APPL_TRACE_DEBUG2("btif_media_aa_prep_sbc_2_send nb_frame %d, TxAaQ %d", 21015fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren nb_frame, btif_media_cb.TxAaQ.count); 21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (nb_frame) 21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (NULL == (p_buf = GKI_getpoolbuf(BTIF_MEDIA_AA_POOL_ID))) 21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21075fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren APPL_TRACE_ERROR1 ("ERROR btif_media_aa_prep_sbc_2_send no buffer TxCnt %d ", 21085fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.TxAaQ.count); 21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Init buffer */ 21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = BTIF_MEDIA_AA_SBC_OFFSET; 21145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 0; 21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->layer_specific = 0; 21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do 21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Write @ of allocated buffer in encoder.pu8Packet */ 21205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.pu8Packet = (UINT8 *) (p_buf + 1) + p_buf->offset + p_buf->len; 21215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Fill allocated buffer with 0 */ 21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(btif_media_cb.encoder.as16PcmBuffer, 0, blocm_x_subband 21235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * btif_media_cb.encoder.s16NumOfChannels); 21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Read PCM data and upsample them if needed */ 21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_aa_read_feeding(UIPC_CH_ID_AV_AUDIO)) 21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SBC encode and descramble frame */ 21295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SBC_Encoder(&(btif_media_cb.encoder)); 21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project A2D_SbcChkFrInit(btif_media_cb.encoder.pu8Packet); 21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project A2D_SbcDescramble(btif_media_cb.encoder.pu8Packet, btif_media_cb.encoder.u16PacketLength); 21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Update SBC frame length */ 21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += btif_media_cb.encoder.u16PacketLength; 21345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nb_frame--; 21355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->layer_specific++; 21365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 21385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2139b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren APPL_TRACE_WARNING2("btif_media_aa_prep_sbc_2_send underflow %d, %d", 2140b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren nb_frame, btif_media_cb.media_feeding_state.pcm.aa_feed_residue); 2141b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.counter += nb_frame * 2142b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.encoder.s16NumOfSubBands * 2143b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.encoder.s16NumOfBlocks * 2144b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.num_channel * 2145b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8; 21465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no more pcm to read */ 21475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nb_frame = 0; 21485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* break read loop if timer was stopped (media task stopped) */ 21505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ( btif_media_cb.is_tx_timer == FALSE ) 21515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 21525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (((p_buf->len + btif_media_cb.encoder.u16PacketLength) < btif_media_cb.TxAaMtuSize) 21555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_buf->layer_specific < 0x0F) && nb_frame); 21565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 215745f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta if(p_buf->len) 215845f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta { 21595fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren /* timestamp of the media packet header represent the TS of the first SBC frame 21605fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren i.e the timestamp before including this frame */ 216145f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta *((UINT32 *) (p_buf + 1)) = btif_media_cb.timestamp; 21625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21635fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.timestamp += p_buf->layer_specific * blocm_x_subband; 21645fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 216545f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta VERBOSE("TX QUEUE NOW %d", btif_media_cb.TxAaQ.count); 21665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 216745f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta if (btif_media_cb.tx_flush) 216845f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta { 216945f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta APPL_TRACE_DEBUG0("### tx suspended, discarded frame ###"); 21705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 217145f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta if (btif_media_cb.TxAaQ.count > 0) 217245f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta btif_media_flush_q(&(btif_media_cb.TxAaQ)); 217345f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta 217445f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta GKI_freebuf(p_buf); 217545f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta return; 217645f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta } 21775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 217845f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta /* Enqueue the encoded SBC frame in AA Tx Queue */ 217945f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta GKI_enqueue(&(btif_media_cb.TxAaQ), p_buf); 218045f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta } 218145f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta else 218245f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta { 21835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(p_buf); 21845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 21875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 21905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 21915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_aa_prep_2_send 21925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 21935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 21945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 21955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 21965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 21975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 21985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_aa_prep_2_send(UINT8 nb_frame) 22005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 22015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project VERBOSE("btif_media_aa_prep_2_send : %d frames (queue %d)", nb_frame, 22025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.TxAaQ.count); 22035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2204b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren while (btif_media_cb.TxAaQ.count >= MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ) 22055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2206b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren APPL_TRACE_WARNING1("btif_media_aa_prep_2_send congestion buf count %d", 2207b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.TxAaQ.count); 22085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_freebuf(GKI_dequeue(&(btif_media_cb.TxAaQ))); 22095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (btif_media_cb.TxTranscoding) 22125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_TRSCD_PCM_2_SBC: 22145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_aa_prep_sbc_2_send(nb_frame); 22155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 22165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 22195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR1("ERROR btif_media_aa_prep_2_send unsupported transcoding format 0x%x",btif_media_cb.TxTranscoding); 22205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 22215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 22255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 22265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_send_aa_frame 22275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 22285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 22295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 22305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 22315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 22325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 22335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_send_aa_frame(void) 22345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 22355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 nb_frame_2_send; 22365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get the number of frame to send */ 22385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nb_frame_2_send = btif_get_num_aa_frame(); 22395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* format and Q buffer to send */ 22415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_aa_prep_2_send(nb_frame_2_send); 22425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send it */ 22445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project VERBOSE("btif_media_send_aa_frame : send %d frames", nb_frame_2_send); 22455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO); 22465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 22475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_AV_INCLUDED == TRUE */ 22495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 22515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 22525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function dump_codec_info 22535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 22545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Decode and display codec_info (for debug) 22555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 22565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 22575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 22585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 22595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid dump_codec_info(unsigned char *p_codec) 22605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 22615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_STATUS a2d_status; 22625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_SBC_CIE sbc_cie; 22635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_codec, FALSE); 22655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (a2d_status != A2D_SUCCESS) 22665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 22675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_ERROR1("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status); 22685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 22695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 22705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG0("dump_codec_info"); 22725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_16) 22745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);} 22755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_32) 22765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);} 22775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_44) 22785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tsamp_freq:%d (44.100)", sbc_cie.samp_freq);} 22795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_48) 22805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);} 22815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tBAD samp_freq:%d", sbc_cie.samp_freq);} 22835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_MONO) 22855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tch_mode:%d (Mono)", sbc_cie.ch_mode);} 22865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_DUAL) 22875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tch_mode:%d (Dual)", sbc_cie.ch_mode);} 22885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_STEREO) 22895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tch_mode:%d (Stereo)", sbc_cie.ch_mode);} 22905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_JOINT) 22915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tch_mode:%d (Joint)", sbc_cie.ch_mode);} 22925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 22935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tBAD ch_mode:%d", sbc_cie.ch_mode);} 22945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 22955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_4) 22965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tblock_len:%d (4)", sbc_cie.block_len);} 22975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_8) 22985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tblock_len:%d (8)", sbc_cie.block_len);} 22995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_12) 23005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tblock_len:%d (12)", sbc_cie.block_len);} 23015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_16) 23025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tblock_len:%d (16)", sbc_cie.block_len);} 23035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tBAD block_len:%d", sbc_cie.block_len);} 23055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_4) 23075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tnum_subbands:%d (4)", sbc_cie.num_subbands);} 23085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_8) 23095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tnum_subbands:%d (8)", sbc_cie.num_subbands);} 23105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tBAD num_subbands:%d", sbc_cie.num_subbands);} 23125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_S) 23145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);} 23155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L) 23165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\talloc_mthd:%d (Loundess)", sbc_cie.alloc_mthd);} 23175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 23185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { APPL_TRACE_DEBUG1("\tBAD alloc_mthd:%d", sbc_cie.alloc_mthd);} 23195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project APPL_TRACE_DEBUG2("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool); 23215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 23225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2323