195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/****************************************************************************** 295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy * 395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy * Copyright (C) 2009-2012 Broadcom Corporation 495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy * 56ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Licensed under the Apache License, Version 2.0 (the "License"); 66ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * you may not use this file except in compliance with the License. 76ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * You may obtain a copy of the License at: 895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy * 96ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * http://www.apache.org/licenses/LICENSE-2.0 1095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy * 116ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * Unless required by applicable law or agreed to in writing, software 126ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * distributed under the License is distributed on an "AS IS" BASIS, 136ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 146ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * See the License for the specific language governing permissions and 156ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach * limitations under the License. 1695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy * 176ef101187774e30ddba6b46bbedef549a42196adAndre Eisenbach ******************************************************************************/ 1895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 1995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/****************************************************************************** 2095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 2195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Name: btif_media_task.c 2295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 2395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description: This is the multimedia module for the BTIF system. It 2495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** contains task implementations AV, HS and HF profiles 2595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** audio & video processing 2695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 2795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ******************************************************************************/ 2895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 2995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include <string.h> 3095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include <stdio.h> 3195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include <sys/types.h> 3295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include <sys/stat.h> 3395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include <fcntl.h> 3495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include <unistd.h> 3595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include <pthread.h> 3695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include <stdint.h> 3795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include <sys/time.h> 3895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 3995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "bt_target.h" 4095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "gki.h" 4195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "bta_api.h" 4295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "btu.h" 4395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "bta_sys.h" 4495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "bta_sys_int.h" 4595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 4695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "bta_av_api.h" 4795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "a2d_api.h" 4895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "a2d_sbc.h" 4995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "a2d_int.h" 5095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "bta_av_sbc.h" 5195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "bta_av_ci.h" 5295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "l2c_api.h" 5395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 5495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 55254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#include "btif_av_co.h" 5695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "btif_media.h" 5795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 5895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 5995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (BTA_AV_INCLUDED == TRUE) 6095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#include "sbc_encoder.h" 6195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 6295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 63254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#define LOG_TAG "BTIF-MEDIA" 6495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 65254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#include <hardware/bluetooth.h> 66254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#include "audio_a2dp_hw.h" 67254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#include "btif_av.h" 68254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#include "btif_sm.h" 69254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#include "btif_util.h" 70520b756328dcf4a54cf25f5d16177aa17fdbce31Matthew Xie#include "bt_utils.h" 7195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 7295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/***************************************************************************** 7395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Constants 7495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *****************************************************************************/ 7595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 7695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy//#define DEBUG_MEDIA_AV_FLOW TRUE 7795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 7895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/* BTIF media task gki event definition */ 7995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_MEDIA_TASK_CMD TASK_MBOX_0_EVT_MASK 8095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_MEDIA_TASK_DATA TASK_MBOX_1_EVT_MASK 8195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 82557040bc55438df4c1e41c906c9d075a6b2c1e92Kausik Sinnaswamy#define BTIF_MEDIA_TASK_KILL EVENT_MASK(GKI_SHUTDOWN_EVT) 8395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 8495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_MEDIA_AA_TASK_TIMER_ID TIMER_0 8595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_MEDIA_AV_TASK_TIMER_ID TIMER_1 8695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_MEDIA_AA_TASK_TIMER TIMER_0_EVT_MASK 8795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_MEDIA_AV_TASK_TIMER TIMER_1_EVT_MASK 8895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 8995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_MEDIA_TASK_CMD_MBOX TASK_MBOX_0 /* cmd mailbox */ 9095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_MEDIA_TASK_DATA_MBOX TASK_MBOX_1 /* data mailbox */ 9195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 9295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/* BTIF media cmd event definition : BTIF_MEDIA_TASK_CMD */ 9395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamyenum 9495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 9595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BTIF_MEDIA_START_AA_TX = 1, 9695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BTIF_MEDIA_STOP_AA_TX, 9795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BTIF_MEDIA_AA_RX_RDY, 9895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BTIF_MEDIA_UIPC_RX_RDY, 9995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BTIF_MEDIA_SBC_ENC_INIT, 10095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BTIF_MEDIA_SBC_ENC_UPDATE, 10195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BTIF_MEDIA_SBC_DEC_INIT, 10295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BTIF_MEDIA_VIDEO_DEC_INIT, 10395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BTIF_MEDIA_FLUSH_AA_TX, 10495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BTIF_MEDIA_FLUSH_AA_RX, 10595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BTIF_MEDIA_AUDIO_FEEDING_INIT, 10695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BTIF_MEDIA_AUDIO_RECEIVING_INIT 10795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy}; 10895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 1090872cc31abb3990b0892898f45bf2c87da627e4cMattias Agrenenum { 1100872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren MEDIA_TASK_STATE_OFF = 0, 1110872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren MEDIA_TASK_STATE_ON = 1, 1120872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren MEDIA_TASK_STATE_SHUTTING_DOWN = 2 1130872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren}; 11495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 11595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/* Macro to multiply the media task tick */ 11695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#ifndef BTIF_MEDIA_NUM_TICK 11795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_MEDIA_NUM_TICK 1 11895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 11995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 12095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/* Media task tick in milliseconds */ 121e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren#define BTIF_MEDIA_TIME_TICK (20 * BTIF_MEDIA_NUM_TICK) 12295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 123b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie/* Number of frames per media task tick. 124b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie Configure value rounded up to closest integer and 125b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie adjust any deltas in btif_get_num_aa_frame */ 126b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie 127b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie/* 7.5 frames/tick @ 20 ms tick (every 2nd frame send one less) */ 128b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie#define BTIF_MEDIA_FR_PER_TICKS_48 (8 * BTIF_MEDIA_NUM_TICK) 129b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie 130b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie/* 6.89 frames/tick @ 20 ms tick (7 out of 64 frames send one less */ 131e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren#define BTIF_MEDIA_FR_PER_TICKS_44_1 (7 * BTIF_MEDIA_NUM_TICK) 132b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie 133e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren/* 5.0 frames/tick @ 20 ms tick */ 134e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren#define BTIF_MEDIA_FR_PER_TICKS_32 (5 * BTIF_MEDIA_NUM_TICK) 135b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie 136b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie/* 2.5 frames/tick @ 20 ms tick (every 2nd frame send one less) */ 137e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren#define BTIF_MEDIA_FR_PER_TICKS_16 (3 * BTIF_MEDIA_NUM_TICK) 13895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 13995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 14095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/* buffer pool */ 14195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_MEDIA_AA_POOL_ID GKI_POOL_ID_3 14295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_MEDIA_AA_BUF_SIZE GKI_BUF3_SIZE 14395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 14495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/* offset */ 14595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (BTA_AV_CO_CP_SCMS_T == TRUE) 14695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE + 1) 14795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#else 14895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE) 14995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 15095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 15195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/* Define the bitrate step when trying to match bitpool value */ 15295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#ifndef BTIF_MEDIA_BITRATE_STEP 1532f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren#define BTIF_MEDIA_BITRATE_STEP 5 15495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 15595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 156e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren/* Middle quality quality setting @ 44.1 khz */ 157e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren#define DEFAULT_SBC_BITRATE 229 15895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 159254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#ifndef A2DP_MEDIA_TASK_STACK_SIZE 160254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#define A2DP_MEDIA_TASK_STACK_SIZE 0x2000 /* In bytes */ 161254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#endif 162254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 163254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#define A2DP_MEDIA_TASK_TASK_STR ((INT8 *) "A2DP-MEDIA") 164254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenstatic UINT32 a2dp_media_task_stack[(A2DP_MEDIA_TASK_STACK_SIZE + 3) / 4]; 165254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 166254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#define BT_MEDIA_TASK A2DP_MEDIA_TASK 167254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 168254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#define USEC_PER_SEC 1000000L 169254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren#define TPUT_STATS_INTERVAL_US (1000*1000) 170254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 171254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/* 172254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren * CONGESTION COMPENSATION CTRL :: 173254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren * 174254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren * Thus setting controls how many buffers we will hold in media task 175254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren * during temp link congestion. Together with the stack buffer queues 176254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren * it controls much temporary a2dp link congestion we can 177254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren * compensate for. It however also depends on the default run level of sinks 178254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren * jitterbuffers. Depending on type of sink this would vary. 179254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren * Ideally the (SRC) max tx buffer capacity should equal the sinks 180254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren * jitterbuffer runlevel including any intermediate buffers on the way 181254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren * towards the sinks codec. 182254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren */ 183254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 184254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/* fixme -- define this in pcm time instead of buffer count */ 185254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/* fixme -- tune optimal value. For now set a large buffer capacity */ 1867a291d46e4d535e4c17bd7c6e2b637fa26d24ff3Matthew Xie#define MAX_OUTPUT_BUFFER_QUEUE_SZ 24 187254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 1882f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren//#define BTIF_MEDIA_VERBOSE_ENABLED 189ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani 190ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani#ifdef BTIF_MEDIA_VERBOSE_ENABLED 191ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani#define VERBOSE(fmt, ...) \ 192ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani LogMsg( TRACE_CTRL_GENERAL | TRACE_LAYER_NONE | TRACE_ORG_APPL | \ 193ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani TRACE_TYPE_ERROR, fmt, ## __VA_ARGS__) 194ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani#else 195ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani#define VERBOSE(fmt, ...) 196ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani#endif 197ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani 19895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/***************************************************************************** 19995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Data types 20095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *****************************************************************************/ 20195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 20295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamytypedef struct 20395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 20495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT32 aa_frame_counter; 20595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy INT32 aa_feed_counter; 20695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy INT32 aa_feed_residue; 20795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE; 20895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 20995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 21095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamytypedef union 21195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 21295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE pcm; 21395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} tBTIF_AV_MEDIA_FEEDINGS_STATE; 21495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 21595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamytypedef struct 21695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 21795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (BTA_AV_INCLUDED == TRUE) 21895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BUFFER_Q TxAaQ; 21995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BOOLEAN is_tx_timer; 22095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT16 TxAaMtuSize; 22195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT32 timestamp; 22295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT8 TxTranscoding; 22395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_AV_FEEDING_MODE feeding_mode; 22495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_AV_MEDIA_FEEDINGS media_feeding; 22595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_AV_MEDIA_FEEDINGS_STATE media_feeding_state; 22695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy SBC_ENC_PARAMS encoder; 22795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT8 busy_level; 228254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren void* av_sm_hdl; 229254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren UINT8 a2dp_cmd_pending; /* we can have max one command pending */ 230254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren BOOLEAN tx_flush; /* discards any outgoing data when true */ 231b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie BOOLEAN scaling_disabled; 23295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 23395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 23495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} tBTIF_MEDIA_CB; 23595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 236254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrentypedef struct { 237254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren int rx; 238254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren int rx_tot; 239254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren int tx; 240254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren int tx_tot; 241254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren int ts_prev_us; 242254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren} t_stat; 243254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 24495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/***************************************************************************** 24595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Local data 24695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *****************************************************************************/ 24795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 24895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic tBTIF_MEDIA_CB btif_media_cb; 2490872cc31abb3990b0892898f45bf2c87da627e4cMattias Agrenstatic int media_task_running = MEDIA_TASK_STATE_OFF; 250254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 25195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 25295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/***************************************************************************** 25395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Local functions 25495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *****************************************************************************/ 25595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 256254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenstatic void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event); 257254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenstatic void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event); 258254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenstatic void btif_a2dp_encoder_update(void); 259254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 260254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/***************************************************************************** 261254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren ** Externs 262254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren *****************************************************************************/ 263254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 26495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_handle_cmd(BT_HDR *p_msg); 26595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_handle_media(BT_HDR *p_msg); 26695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 26795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (BTA_AV_INCLUDED == TRUE) 26895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_send_aa_frame(void); 26995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_feeding_state_reset(void); 27095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_aa_start_tx(void); 27195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_aa_stop_tx(void); 27295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_enc_init(BT_HDR *p_msg); 27395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_enc_update(BT_HDR *p_msg); 27495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_audio_feeding_init(BT_HDR *p_msg); 27595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_aa_tx_flush(BT_HDR *p_msg); 27695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_aa_prep_2_send(UINT8 nb_frame); 27795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 27895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 27995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 28095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/***************************************************************************** 281254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren ** Misc helper functions 28295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *****************************************************************************/ 28395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 28495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void tput_mon(int is_rx, int len, int reset) 28595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 28695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* only monitor one connection at a time for now */ 28795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy static t_stat cur_stat; 28895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy struct timespec now; 28995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy unsigned int prev_us; 29095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy unsigned int now_us; 29195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 29295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (reset == TRUE) 29395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 29495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy memset(&cur_stat, 0, sizeof(t_stat)); 29595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return; 29695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 297254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 29895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (is_rx) 29995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 30095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy cur_stat.rx+=len; 30195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy cur_stat.rx_tot+=len; 30295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 30395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else 30495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 30595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy cur_stat.tx+=len; 306254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren cur_stat.tx_tot+=len; 30795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 30895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy clock_gettime(CLOCK_MONOTONIC, &now); 309254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 31095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy now_us = now.tv_sec*USEC_PER_SEC + now.tv_nsec/1000; 31195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 312254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren //APPL_TRACE_DEBUG1("%d us", now_us - cur_stat.ts_prev_us); 31395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 31495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if ((now_us - cur_stat.ts_prev_us) < TPUT_STATS_INTERVAL_US) 31595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return; 31695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 31795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_WARNING4("tput rx:%d, tx:%d (kB/s) (tot : rx %d, tx %d bytes)", 31895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy (cur_stat.rx)/((now_us - cur_stat.ts_prev_us)/1000), 31995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy (cur_stat.tx)/((now_us - cur_stat.ts_prev_us)/1000), 32095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy cur_stat.rx_tot, cur_stat.tx_tot); 32195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 32295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* stats dumped. now reset stats for next interval */ 32395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy cur_stat.rx = 0; 32495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy cur_stat.tx = 0; 32595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy cur_stat.ts_prev_us = now_us; 32695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 32795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 32895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 329254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenstatic void log_tstamps_us(char *comment) 33095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 33195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy #define USEC_PER_SEC 1000000L 33295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy static struct timespec prev = {0, 0}; 33395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy struct timespec now, diff; 33495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy unsigned int diff_us = 0; 33595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy unsigned int now_us = 0; 33695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 33795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy clock_gettime(CLOCK_MONOTONIC, &now); 33895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy now_us = now.tv_sec*USEC_PER_SEC + now.tv_nsec/1000; 33995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy diff_us = (now.tv_sec - prev.tv_sec) * USEC_PER_SEC + (now.tv_nsec - prev.tv_nsec)/1000; 34095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 341254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_DEBUG4("[%s] ts %08d, diff : %08d, queue sz %d", comment, now_us, diff_us, 342254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_media_cb.TxAaQ.count); 343254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 344254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren prev = now; 34595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 34695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 34795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamyconst char* dump_media_event(UINT16 event) 34895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 34995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy switch(event) 35095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 35195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy CASE_RETURN_STR(BTIF_MEDIA_START_AA_TX) 35295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy CASE_RETURN_STR(BTIF_MEDIA_STOP_AA_TX) 35395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy CASE_RETURN_STR(BTIF_MEDIA_AA_RX_RDY) 35495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy CASE_RETURN_STR(BTIF_MEDIA_UIPC_RX_RDY) 35595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_INIT) 35695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_UPDATE) 35795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy CASE_RETURN_STR(BTIF_MEDIA_SBC_DEC_INIT) 35895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy CASE_RETURN_STR(BTIF_MEDIA_VIDEO_DEC_INIT) 35995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_TX) 36095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_RX) 36195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy CASE_RETURN_STR(BTIF_MEDIA_AUDIO_FEEDING_INIT) 36295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy CASE_RETURN_STR(BTIF_MEDIA_AUDIO_RECEIVING_INIT) 36395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 36495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy default: 36595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return "UNKNOWN MEDIA EVENT"; 36695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 36795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 36895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 369254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/***************************************************************************** 370254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren ** A2DP CTRL PATH 371254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren *****************************************************************************/ 372254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 373254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenstatic const char* dump_a2dp_ctrl_event(UINT8 event) 374254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren{ 375254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren switch(event) 376254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 377254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren CASE_RETURN_STR(A2DP_CTRL_CMD_NONE) 378254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren CASE_RETURN_STR(A2DP_CTRL_CMD_CHECK_READY) 379254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren CASE_RETURN_STR(A2DP_CTRL_CMD_START) 380254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren CASE_RETURN_STR(A2DP_CTRL_CMD_STOP) 381254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren CASE_RETURN_STR(A2DP_CTRL_CMD_SUSPEND) 382254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren default: 383254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren return "UNKNOWN MSG ID"; 384254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 385254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren} 386254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 387254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenstatic void btif_audiopath_detached(void) 388254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren{ 389254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_EVENT0("## AUDIO PATH DETACHED ##"); 390254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 391254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* send stop request only if we are actively streaming and haven't received 392254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren a stop request. Potentially audioflinger detached abnormally */ 393254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (btif_media_cb.is_tx_timer) 394254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 395254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* post stop event and wait for audio path to stop */ 396254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0); 397254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 398254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren} 399254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 400254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenstatic void a2dp_cmd_acknowledge(int status) 401254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren{ 402254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren UINT8 ack = status; 403254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 404254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_EVENT2("## a2dp ack : %s, status %d ##", dump_a2dp_ctrl_event(btif_media_cb.a2dp_cmd_pending), status); 405254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 406254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* sanity check */ 407254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (btif_media_cb.a2dp_cmd_pending == A2DP_CTRL_CMD_NONE) 408254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 409254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_ERROR0("warning : no command pending, ignore ack"); 410254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren return; 411254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 412254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 413254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* clear pending */ 414254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_media_cb.a2dp_cmd_pending = A2DP_CTRL_CMD_NONE; 415254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 416254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* acknowledge start request */ 417254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &ack, 1); 418254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren} 419254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 420254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 421254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenstatic void btif_recv_ctrl_data(void) 422254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren{ 423254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren UINT8 cmd = 0; 424254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren int n; 425254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 426254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren n = UIPC_Read(UIPC_CH_ID_AV_CTRL, NULL, &cmd, 1); 427254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 428254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* detach on ctrl channel means audioflinger process was terminated */ 429254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (n == 0) 430254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 431254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_EVENT0("CTRL CH DETACHED"); 432254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren UIPC_Close(UIPC_CH_ID_AV_CTRL); 433254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* we can operate only on datachannel, if af client wants to 434254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren do send additional commands the ctrl channel would be reestablished */ 435254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren //btif_audiopath_detached(); 436254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren return; 437254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 438254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 439af7cc1ec86fc440de57a146a2bfa81e567a1303bMattias Agren APPL_TRACE_DEBUG1("a2dp-ctrl-cmd : %s", dump_a2dp_ctrl_event(cmd)); 440254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 441254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_media_cb.a2dp_cmd_pending = cmd; 442254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 443254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren switch(cmd) 444254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 445254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren case A2DP_CTRL_CMD_CHECK_READY: 446254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 4470872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren if (media_task_running == MEDIA_TASK_STATE_SHUTTING_DOWN) 4480872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren { 4490872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 4500872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren return; 4510872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren } 4520872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren 453af7cc1ec86fc440de57a146a2bfa81e567a1303bMattias Agren /* check whether av is ready to setup a2dp datapath */ 454f476c7d052409d27d60cbe8d17c9ed14c663518eMattias Agren if ((btif_av_stream_ready() == TRUE) || (btif_av_stream_started_ready() == TRUE)) 455254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 456254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 457254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 458254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren else 459254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 460254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 461254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 462254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 463254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 464254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren case A2DP_CTRL_CMD_START: 465254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 466254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (btif_av_stream_ready() == TRUE) 467254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 468254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* setup audio data channel listener */ 469254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb); 470254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 471254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* post start event and wait for audio path to open */ 472254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_dispatch_sm_event(BTIF_AV_START_STREAM_REQ_EVT, NULL, 0); 473254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 474f476c7d052409d27d60cbe8d17c9ed14c663518eMattias Agren else if (btif_av_stream_started_ready()) 475254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 476af7cc1ec86fc440de57a146a2bfa81e567a1303bMattias Agren /* already started, setup audio data channel listener 477af7cc1ec86fc440de57a146a2bfa81e567a1303bMattias Agren and ack back immediately */ 478254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb); 479254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 480254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 481254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 482254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren else 483254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 484254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 485254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 486254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 487254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 488254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 489254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren case A2DP_CTRL_CMD_STOP: 490254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 491254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (btif_media_cb.is_tx_timer == FALSE) 492254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 493254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* we are already stopped, just ack back */ 494254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 495254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 496254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 497254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 498254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0); 499254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 500254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 501254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren case A2DP_CTRL_CMD_SUSPEND: 502254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* local suspend */ 503f476c7d052409d27d60cbe8d17c9ed14c663518eMattias Agren if (btif_av_stream_started_ready()) 504f476c7d052409d27d60cbe8d17c9ed14c663518eMattias Agren { 505f476c7d052409d27d60cbe8d17c9ed14c663518eMattias Agren btif_dispatch_sm_event(BTIF_AV_SUSPEND_STREAM_REQ_EVT, NULL, 0); 506f476c7d052409d27d60cbe8d17c9ed14c663518eMattias Agren } 507f476c7d052409d27d60cbe8d17c9ed14c663518eMattias Agren else 508f476c7d052409d27d60cbe8d17c9ed14c663518eMattias Agren { 509f476c7d052409d27d60cbe8d17c9ed14c663518eMattias Agren /* if we are not in started state, just ack back ok and let 510f476c7d052409d27d60cbe8d17c9ed14c663518eMattias Agren audioflinger close the channel. This can happen if we are 511f476c7d052409d27d60cbe8d17c9ed14c663518eMattias Agren remotely suspended */ 512f476c7d052409d27d60cbe8d17c9ed14c663518eMattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 513f476c7d052409d27d60cbe8d17c9ed14c663518eMattias Agren } 514254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 515254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 516254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren default: 517254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_ERROR1("UNSUPPORTED CMD (%d)", cmd); 518254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 519254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 520254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 521af7cc1ec86fc440de57a146a2bfa81e567a1303bMattias Agren APPL_TRACE_DEBUG1("a2dp-ctrl-cmd : %s DONE", dump_a2dp_ctrl_event(cmd)); 522254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren} 523254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 524254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenstatic void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event) 525254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren{ 526254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_DEBUG1("A2DP-CTRL-CHANNEL EVENT %s", dump_uipc_event(event)); 527254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 528254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren switch(event) 529254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 530254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren case UIPC_OPEN_EVT: 531254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* fetch av statemachine handle */ 532254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_media_cb.av_sm_hdl = btif_av_get_sm_handle(); 533254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 534254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 535254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren case UIPC_CLOSE_EVT: 5360872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren /* restart ctrl server unless we are shutting down */ 537557040bc55438df4c1e41c906c9d075a6b2c1e92Kausik Sinnaswamy if (media_task_running == MEDIA_TASK_STATE_ON) 5380872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb); 539254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 540254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 541254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren case UIPC_RX_DATA_READY_EVT: 542254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_recv_ctrl_data(); 543254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 544254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 545254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren default : 546254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_ERROR1("### A2DP-CTRL-CHANNEL EVENT %d NOT HANDLED ###", event); 547254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 548254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 549254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren} 550254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 551254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenstatic void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event) 552254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren{ 553254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_DEBUG1("BTIF MEDIA (A2DP-DATA) EVENT %s", dump_uipc_event(event)); 554254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 555254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren switch(event) 556254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 557254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren case UIPC_OPEN_EVT: 558254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 559254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* read directly from media task from here on (keep callback for 560254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren connection events */ 561254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_REMOVE_ACTIVE_READSET, NULL); 562254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 563254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* Start the media task to encode SBC */ 564254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_media_task_start_aa_req(); 565254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 5660872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren /* make sure we update any changed sbc encoder params */ 5670872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren btif_a2dp_encoder_update(); 5680872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren 569254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* ack back when media task is fully started */ 570254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 571254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 572254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren case UIPC_CLOSE_EVT: 573254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 574254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_audiopath_detached(); 575254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 576254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 577254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren default : 578254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_ERROR1("### A2DP-DATA EVENT %d NOT HANDLED ###", event); 579254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren break; 580254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 581254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren} 582254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 583254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 584254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/***************************************************************************** 585254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren ** BTIF ADAPTATION 586254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren *****************************************************************************/ 587254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 588254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenstatic void btif_a2dp_encoder_init(void) 58995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 59095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT16 minmtu; 59195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_MEDIA_INIT_AUDIO msg; 59295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tA2D_SBC_CIE sbc_config; 59395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 59495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* lookup table for converting channel mode */ 59595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT16 codec_mode_tbl[5] = { SBC_JOINT_STEREO, SBC_STEREO, SBC_DUAL, 0, SBC_MONO }; 59695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 59795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* lookup table for converting number of blocks */ 59895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT16 codec_block_tbl[5] = { 16, 12, 8, 0, 4 }; 59995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 60095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* lookup table to convert freq */ 60195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT16 freq_block_tbl[5] = { SBC_sf48000, SBC_sf44100, SBC_sf32000, 0, SBC_sf16000 }; 60295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 603254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_DEBUG0("btif_a2dp_encoder_init"); 60495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 60595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Retrieve the current SBC configuration (default if currently not used) */ 60695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu); 60795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy msg.NumOfSubBands = (sbc_config.num_subbands == A2D_SBC_IE_SUBBAND_4) ? 4 : 8; 60895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy msg.NumOfBlocks = codec_block_tbl[sbc_config.block_len >> 5]; 60995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy msg.AllocationMethod = (sbc_config.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L) ? SBC_LOUDNESS : SBC_SNR; 61095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy msg.ChannelMode = codec_mode_tbl[sbc_config.ch_mode >> 1]; 61195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy msg.SamplingFreq = freq_block_tbl[sbc_config.samp_freq >> 5]; 61295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy msg.MtuSize = minmtu; 61395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 6142f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren APPL_TRACE_EVENT1("msg.ChannelMode %x", msg.ChannelMode); 6152f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 61695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Init the media task to encode SBC properly */ 61795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_enc_init_req(&msg); 61895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 61995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 620254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenstatic void btif_a2dp_encoder_update(void) 62195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 62295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT16 minmtu; 62395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tA2D_SBC_CIE sbc_config; 62495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_MEDIA_UPDATE_AUDIO msg; 6252f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren UINT8 pref_min; 6262f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren UINT8 pref_max; 62795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 628254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_DEBUG0("btif_a2dp_encoder_update"); 62995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 63095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Retrieve the current SBC configuration (default if currently not used) */ 63195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu); 63295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 633254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_DEBUG4("btif_a2dp_encoder_update: Common min_bitpool:%d(0x%x) max_bitpool:%d(0x%x)", 63495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy sbc_config.min_bitpool, sbc_config.min_bitpool, 63595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy sbc_config.max_bitpool, sbc_config.max_bitpool); 63695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 63795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (sbc_config.min_bitpool > sbc_config.max_bitpool) 63895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 639254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_ERROR0("btif_a2dp_encoder_update: ERROR btif_a2dp_encoder_update min_bitpool > max_bitpool"); 64095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 64195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 6422f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren /* check if remote sink has a preferred bitpool range */ 6432f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren if (bta_av_co_get_remote_bitpool_pref(&pref_min, &pref_max) == TRUE) 6442f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren { 6452f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren /* adjust our preferred bitpool with the remote preference if within 6462f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren our capable range */ 6472f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 6482f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren if (pref_min < sbc_config.min_bitpool) 6492f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren pref_min = sbc_config.min_bitpool; 6502f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 6512f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren if (pref_max > sbc_config.max_bitpool) 6522f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren pref_max = sbc_config.max_bitpool; 6532f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 6542f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren msg.MinBitPool = pref_min; 6552f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren msg.MaxBitPool = pref_max; 6562f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 6572f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren if ((pref_min != sbc_config.min_bitpool) || (pref_max != sbc_config.max_bitpool)) 6582f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren { 6592f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren APPL_TRACE_EVENT2("## adjusted our bitpool range to peer pref [%d:%d] ##", 6602f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren pref_min, pref_max); 6612f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren } 6622f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren } 6632f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren else 6642f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren { 6652f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren msg.MinBitPool = sbc_config.min_bitpool; 6662f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren msg.MaxBitPool = sbc_config.max_bitpool; 6672f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren } 6682f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 66995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy msg.MinMtuSize = minmtu; 6702f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 67195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Update the media task to encode SBC properly */ 67295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_enc_update_req(&msg); 67395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 67495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 67595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 676254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/***************************************************************************** 677254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 678254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Function btif_a2dp_start_media_task 679254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 680254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Description 681254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 682254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns 683254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 684254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren*******************************************************************************/ 68595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 68695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamyint btif_a2dp_start_media_task(void) 68795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 6882fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren int retval; 6892fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren 6900872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren if (media_task_running != MEDIA_TASK_STATE_OFF) 69195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 692254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_ERROR0("warning : media task already running"); 69395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return GKI_FAILURE; 69495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 69595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 696254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_EVENT0("## A2DP START MEDIA TASK ##"); 697254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 69895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* start a2dp media task */ 6992fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren retval = GKI_create_task((TASKPTR)btif_media_task, A2DP_MEDIA_TASK, 70095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy A2DP_MEDIA_TASK_TASK_STR, 70195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy (UINT16 *) ((UINT8 *)a2dp_media_task_stack + A2DP_MEDIA_TASK_STACK_SIZE), 702254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren sizeof(a2dp_media_task_stack)); 7032fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren 7042fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren if (retval != GKI_SUCCESS) 7052fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren return retval; 7062fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren 7072fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren /* wait for task to come up to sure we are able to send messages to it */ 7080872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren while (media_task_running == MEDIA_TASK_STATE_OFF) 7092fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren usleep(10); 7102fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren 7112fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren APPL_TRACE_EVENT0("## A2DP MEDIA TASK STARTED ##"); 7122fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren 7132fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren return retval; 71495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 71595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 716254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/***************************************************************************** 717254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 718254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Function btif_a2dp_stop_media_task 719254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 720254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Description 721254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 722254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns 723254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 724254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren*******************************************************************************/ 725254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 72695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamyvoid btif_a2dp_stop_media_task(void) 72795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 728254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_EVENT0("## A2DP STOP MEDIA TASK ##"); 729557040bc55438df4c1e41c906c9d075a6b2c1e92Kausik Sinnaswamy GKI_destroy_task(BT_MEDIA_TASK); 73095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 73195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 732254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/***************************************************************************** 733254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 734254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Function btif_a2dp_on_init 735254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 736254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Description 737254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 738254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns 739254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 740254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren*******************************************************************************/ 741254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 742254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenvoid btif_a2dp_on_init(void) 74395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 74495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy //tput_mon(1, 0, 1); 74595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 74695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 7472f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 7482f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren/***************************************************************************** 7492f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren** 7502f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren** Function btif_a2dp_setup_codec 7512f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren** 7522f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren** Description 7532f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren** 7542f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren** Returns 7552f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren** 7562f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren*******************************************************************************/ 7572f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 7582f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agrenvoid btif_a2dp_setup_codec(void) 7592f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren{ 7602f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren tBTIF_AV_MEDIA_FEEDINGS media_feeding; 7612f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren tBTIF_STATUS status; 7622f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 7632f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren APPL_TRACE_EVENT0("## A2DP SETUP CODEC ##"); 7642f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 7652f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren GKI_disable(); 7662f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 7672f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren /* for now hardcode 44.1 khz 16 bit stereo */ 7682f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren media_feeding.cfg.pcm.sampling_freq = 44100; 7692f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren media_feeding.cfg.pcm.bit_per_sample = 16; 7702f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren media_feeding.cfg.pcm.num_channel = 2; 7712f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren media_feeding.format = BTIF_AV_CODEC_PCM; 7722f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 7732f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren if (bta_av_co_audio_set_codec(&media_feeding, &status)) 7742f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren { 7752f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren tBTIF_MEDIA_INIT_AUDIO_FEEDING mfeed; 7762f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 7772f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren /* Init the encoding task */ 7782f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren btif_a2dp_encoder_init(); 7792f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 7802f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren /* Build the media task configuration */ 7812f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren mfeed.feeding = media_feeding; 7822f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren mfeed.feeding_mode = BTIF_AV_FEEDING_ASYNCHRONOUS; 7832f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren /* Send message to Media task to configure transcoding */ 7842f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren btif_media_task_audio_feeding_init_req(&mfeed); 7852f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren } 7862f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 7872f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren GKI_enable(); 7882f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren} 7892f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 7902f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 791254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/***************************************************************************** 792254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 793254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Function btif_a2dp_on_idle 794254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 795254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Description 796254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 797254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns 798254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 799254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren*******************************************************************************/ 800254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 801254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenvoid btif_a2dp_on_idle(void) 80295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 803254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_EVENT0("## ON A2DP IDLE ##"); 80495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 80595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Make sure media task is stopped */ 80695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_stop_aa_req(); 80795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 80895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy bta_av_co_init(); 80995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 81095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 811254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/***************************************************************************** 812254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 813254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Function btif_a2dp_on_open 814254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 815254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Description 816254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 817254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns 818254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 819254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren*******************************************************************************/ 820254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 821254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenvoid btif_a2dp_on_open(void) 822254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren{ 823254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_EVENT0("## ON A2DP OPEN ##"); 824254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 825254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* always use callback to notify socket events */ 826254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb); 827254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren} 828254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 829254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/***************************************************************************** 830254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 831ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani** Function btif_a2dp_on_started 832254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 833254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Description 834254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 835254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns 836254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 837254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren*******************************************************************************/ 838254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 839ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryanivoid btif_a2dp_on_started(tBTA_AV_START *p_av) 84095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 84195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_AV_MEDIA_FEEDINGS media_feeding; 84295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_STATUS status; 84395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 844ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani APPL_TRACE_EVENT0("## ON A2DP STARTED ##"); 84595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 846254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (p_av->status == BTA_AV_SUCCESS) 847254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 848254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (p_av->suspending == FALSE) 849254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 850254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (p_av->initiator) 851254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 852254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 853254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 854254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren else 855254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 8562f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren /* we were remotely started, make sure codec 8572f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren is setup before datapath is started */ 8582f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren btif_a2dp_setup_codec(); 859254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 860254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 861254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* media task is autostarted upon a2dp audiopath connection */ 862254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 863254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 864254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren else 865254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 866254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 867254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 868254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren} 869254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 870254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 871254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/***************************************************************************** 872254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 873254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Function btif_a2dp_on_stopped 874254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 875254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Description 876254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 877254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns 878254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 879254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren*******************************************************************************/ 880254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 881254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenvoid btif_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av) 88295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 883254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_EVENT0("## ON A2DP STOPPED ##"); 884254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 885254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* allow using this api for other than suspend */ 886254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (p_av != NULL) 887254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 888254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (p_av->status != BTA_AV_SUCCESS) 889254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 890254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_EVENT1("AV STOP FAILED (%d)", p_av->status); 891254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 892254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (p_av->initiator) 893254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 894254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren return; 895254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 896254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 897254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 898254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* ensure tx frames are immediately suspended */ 899254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_media_cb.tx_flush = 1; 90095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 901254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* request to stop media task */ 902254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_media_task_aa_tx_flush_req(); 903254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_media_task_stop_aa_req(); 904254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 905254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* once stream is fully stopped we will ack back */ 906254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren} 907254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 908254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 909254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/***************************************************************************** 910254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 911254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Function btif_a2dp_on_suspended 912254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 913254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Description 914254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 915254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** Returns 916254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren** 917254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren*******************************************************************************/ 918254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 919254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenvoid btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av) 920254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren{ 921254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_EVENT0("## ON A2DP SUSPENDED ##"); 922254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 923254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* check for status failures */ 924254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (p_av->status != BTA_AV_SUCCESS) 925254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 926254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (p_av->initiator == TRUE) 927254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 928254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 929254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 930254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* once stream is fully stopped we will ack back */ 931254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 932254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* ensure tx frames are immediately flushed */ 933254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_media_cb.tx_flush = 1; 934254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 935254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* stop timer tick */ 936254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_media_task_stop_aa_req(); 937254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren} 938254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 939254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren/* when true media task discards any tx frames */ 940254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agrenvoid btif_a2dp_set_tx_flush(BOOLEAN enable) 941254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren{ 942254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_EVENT1("## DROP TX %d ##", enable); 943254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_media_cb.tx_flush = enable; 94495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 94595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 946ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani/***************************************************************************** 947ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani** 948ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani** Function btif_calc_pcmtime 949ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani** 950ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani** Description Calculates the pcmtime equivalent of a datapacket 951ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani** 952ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani** Returns microseconds 953ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani** 954ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani*******************************************************************************/ 955ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani 956ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryanistatic int btif_calc_pcmtime(UINT32 bytes_processed) 957ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani{ 958ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani int pcm_time_us = 0; 959ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani tBTIF_AV_MEDIA_FEED_CFG *p_cfg; 960ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani 961ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani p_cfg = &btif_media_cb.media_feeding.cfg; 962ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani 963ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani /* calculate corresponding pcm time based on data processed */ 964ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani switch(btif_media_cb.media_feeding.format) 965ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani { 966ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani case BTIF_AV_CODEC_PCM: 967ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani pcm_time_us = (bytes_processed*1000000)/ 968ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani (p_cfg->pcm.num_channel*p_cfg->pcm.sampling_freq*p_cfg->pcm.bit_per_sample/8); 969ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani break; 970ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani 971ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani default : 972ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani APPL_TRACE_ERROR1("mediafeeding format invalid : %d", btif_media_cb.media_feeding.format); 973ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani break; 974ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani } 975ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani 976ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani return pcm_time_us; 977ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani} 978ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani 979ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani 98095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 98195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 98295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_aa_handle_timer 98395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 98495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 98595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 98695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 98795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 98895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 98995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 99095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_aa_handle_timer(void) 99195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 99295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE)) 99395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy static UINT16 Debug = 0; 99495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG1("btif_media_task_aa_handle_timer: %d", Debug++); 99595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 99695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 997254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren log_tstamps_us("media task tx timer"); 99895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 99995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (BTA_AV_INCLUDED == TRUE) 100095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_send_aa_frame(); 100195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 100295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 100395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 100495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (BTA_AV_INCLUDED == TRUE) 100595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 100695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 100795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_aa_handle_timer 100895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 100995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 101095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 101195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 101295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 101395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 101495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_aa_handle_uipc_rx_rdy(void) 101595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 101695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE)) 101795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy static UINT16 Debug = 0; 101895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG1("btif_media_task_aa_handle_uipc_rx_rdy: %d", Debug++); 101995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 102095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 102195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* process all the UIPC data */ 102295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_aa_prep_2_send(0xFF); 102395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 102495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* send it */ 1025ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani VERBOSE("btif_media_task_aa_handle_uipc_rx_rdy calls bta_av_ci_src_data_ready"); 102695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO); 102795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 102895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 102995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 103095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 103195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 103295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_init 103395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 103495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 103595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 103695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 103795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 103895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 1039254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 104095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamyvoid btif_media_task_init(void) 104195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 104295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy memset(&(btif_media_cb), 0, sizeof(btif_media_cb)); 104395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 1044254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren UIPC_Init(NULL); 1045254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 104695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (BTA_AV_INCLUDED == TRUE) 1047254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb); 104895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 1049ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani 1050ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani 105195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 105295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 105395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 105495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task 105595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 105695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description Task for SBC encoder. This task receives an 105795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** event when the waveIn interface has a pcm data buffer 105895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** ready. On receiving the event, handle all ready pcm 105995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** data buffers. If stream is started, run the SBC encoder 106095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** on each chunk of pcm samples and build an output packet 106195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** consisting of one or more encoded SBC frames. 106295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 106395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 106495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 106595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 106695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamyint btif_media_task(void *p) 106795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 106895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT16 event; 106995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BT_HDR *p_msg; 107095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 1071ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani VERBOSE("================ MEDIA TASK STARTING ================"); 107295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 107395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_init(); 107495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 10750872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren media_task_running = MEDIA_TASK_STATE_ON; 10762fe476a7b55eea667c854bb40e48648e8a0d5f1dMattias Agren 1077520b756328dcf4a54cf25f5d16177aa17fdbce31Matthew Xie raise_priority_a2dp(TASK_HIGH_MEDIA); 1078520b756328dcf4a54cf25f5d16177aa17fdbce31Matthew Xie 107995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy while (1) 108095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 108195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy event = GKI_wait(0xffff, 0); 108295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 1083ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani VERBOSE("================= MEDIA TASK EVENT %d ===============", event); 1084254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 108595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (event & BTIF_MEDIA_TASK_CMD) 108695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 108795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Process all messages in the queue */ 108895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy while ((p_msg = (BT_HDR *) GKI_read_mbox(BTIF_MEDIA_TASK_CMD_MBOX)) != NULL) 108995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 109095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_handle_cmd(p_msg); 109195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 109295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 109395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 109495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (event & BTIF_MEDIA_TASK_DATA) 109595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 109695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Process all messages in the queue */ 109795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy while ((p_msg = (BT_HDR *) GKI_read_mbox(BTIF_MEDIA_TASK_DATA_MBOX)) != NULL) 109895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 109995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_handle_media(p_msg); 110095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 110195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 110295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 110395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (event & BTIF_MEDIA_AA_TASK_TIMER) 110495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 110595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* advance audio timer expiration */ 110695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_aa_handle_timer(); 110795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 110895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 110995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 1110ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani VERBOSE("=============== MEDIA TASK EVENT %d DONE ============", event); 1111254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 111295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* When we get this event we exit the task - should only happen on GKI_shutdown */ 111395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (event & BTIF_MEDIA_TASK_KILL) 1114254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 11150872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren /* make sure no channels are restarted while shutting down */ 11160872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren media_task_running = MEDIA_TASK_STATE_SHUTTING_DOWN; 11170872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren 1118e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren /* this calls blocks until uipc is fully closed */ 1119254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren UIPC_Close(UIPC_CH_ID_ALL); 112095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 1121254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 112295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 112395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 11247eac5bc41ced174c18783dc2da0c934be0b3a1b7Kausik Sinnaswamy /* Clear media task flag */ 11250872cc31abb3990b0892898f45bf2c87da627e4cMattias Agren media_task_running = MEDIA_TASK_STATE_OFF; 11267eac5bc41ced174c18783dc2da0c934be0b3a1b7Kausik Sinnaswamy 1127254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_DEBUG0("MEDIA TASK EXITING"); 112895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 112995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return 0; 113095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 113195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 113295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 113395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 113495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 113595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_send_cmd_evt 113695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 113795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 113895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 113995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns TRUE is success 114095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 114195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 114295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik SinnaswamyBOOLEAN btif_media_task_send_cmd_evt(UINT16 Evt) 114395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 114495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BT_HDR *p_buf; 114595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR)))) 114695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 114795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return FALSE; 114895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 114995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 115095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy p_buf->event = Evt; 115195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 115295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 115395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return TRUE; 115495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 115595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 115695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 115795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 115895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_flush_q 115995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 116095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 116195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 116295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 116395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 116495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 116595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_flush_q(BUFFER_Q *p_q) 116695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 116795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy while (GKI_IS_QUEUE_EMPTY(p_q) == FALSE) 116895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 116995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_freebuf(GKI_dequeue(p_q)); 117095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 117195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 117295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 117395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 117495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 117595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 117695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_handle_cmd 117795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 117895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 117995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 118095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 118195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 118295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 118395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_handle_cmd(BT_HDR *p_msg) 118495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 1185ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani VERBOSE("btif_media_task_handle_cmd : %d %s", p_msg->event, dump_media_event(p_msg->event)); 118695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 118795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy switch (p_msg->event) 118895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 118995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (BTA_AV_INCLUDED == TRUE) 119095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case BTIF_MEDIA_START_AA_TX: 119195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_aa_start_tx(); 119295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 119395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case BTIF_MEDIA_STOP_AA_TX: 119495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_aa_stop_tx(); 119595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 119695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case BTIF_MEDIA_SBC_ENC_INIT: 119795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_enc_init(p_msg); 119895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 119995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case BTIF_MEDIA_SBC_ENC_UPDATE: 120095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_enc_update(p_msg); 120195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 120295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case BTIF_MEDIA_AUDIO_FEEDING_INIT: 120395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_audio_feeding_init(p_msg); 120495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 120595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case BTIF_MEDIA_FLUSH_AA_TX: 120695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_aa_tx_flush(p_msg); 120795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 120895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case BTIF_MEDIA_UIPC_RX_RDY: 120995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_aa_handle_uipc_rx_rdy(); 121095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 121195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 121295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy default: 121395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_ERROR1("ERROR in btif_media_task_handle_cmd unknown event %d", p_msg->event); 121495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 121595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_freebuf(p_msg); 1216ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani VERBOSE("btif_media_task_handle_cmd : %s DONE", dump_media_event(p_msg->event)); 121795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 121895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 121995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 122095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 122195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_handle_media 122295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 122395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 122495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 122595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 122695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 122795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 122895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_handle_media(BT_HDR *p_msg) 122995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 1230254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_ERROR0("ERROR btif_media_task_handle_media: not in use"); 123195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 123295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_freebuf(p_msg); 123395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 123495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 123595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 123695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 123795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 123895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (BTA_AV_INCLUDED == TRUE) 123995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 124095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 124195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_enc_init_req 124295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 124395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 124495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 124595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns TRUE is success 124695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 124795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 124895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik SinnaswamyBOOLEAN btif_media_task_enc_init_req(tBTIF_MEDIA_INIT_AUDIO *p_msg) 124995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 125095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_MEDIA_INIT_AUDIO *p_buf; 125195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_INIT_AUDIO)))) 125295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 125395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return FALSE; 125495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 125595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 125695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO)); 125795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_INIT; 125895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 125995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 126095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return TRUE; 126195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 126295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 126395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 126495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 126595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_enc_update_req 126695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 126795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 126895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 126995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns TRUE is success 127095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 127195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 127295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik SinnaswamyBOOLEAN btif_media_task_enc_update_req(tBTIF_MEDIA_UPDATE_AUDIO *p_msg) 127395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 127495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_MEDIA_UPDATE_AUDIO *p_buf; 127595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_UPDATE_AUDIO)))) 127695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 127795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return FALSE; 127895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 127995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 128095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_UPDATE_AUDIO)); 128195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_UPDATE; 128295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 128395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 128495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return TRUE; 128595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 128695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 128795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 128895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 128995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_audio_feeding_init_req 129095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 129195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 129295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 129395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns TRUE is success 129495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 129595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 129695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik SinnaswamyBOOLEAN btif_media_task_audio_feeding_init_req(tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_msg) 129795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 129895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_buf; 129995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (NULL == (p_buf = GKI_getbuf(sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING)))) 130095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 130195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return FALSE; 130295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 130395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 130495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING)); 130595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy p_buf->hdr.event = BTIF_MEDIA_AUDIO_FEEDING_INIT; 130695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 130795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 130895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return TRUE; 130995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 131095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 131195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 131295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 131395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_start_aa_req 131495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 131595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 131695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 131795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns TRUE is success 131895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 131995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 132095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik SinnaswamyBOOLEAN btif_media_task_start_aa_req(void) 132195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 132295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BT_HDR *p_buf; 132395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR)))) 132495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 132595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_EVENT0("GKI failed"); 132695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return FALSE; 132795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 132895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 132995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy p_buf->event = BTIF_MEDIA_START_AA_TX; 133095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 133195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 133295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return TRUE; 133395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 133495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 133595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 133695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 133795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_stop_aa_req 133895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 133995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 134095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 134195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns TRUE is success 134295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 134395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 134495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik SinnaswamyBOOLEAN btif_media_task_stop_aa_req(void) 134595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 134695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BT_HDR *p_buf; 134795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR)))) 134895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 134995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return FALSE; 135095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 135195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 135295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy p_buf->event = BTIF_MEDIA_STOP_AA_TX; 135395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 135495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 135595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return TRUE; 135695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 135795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 135895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 135995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 136095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_aa_tx_flush_req 136195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 136295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 136395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 136495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns TRUE is success 136595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 136695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 136795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik SinnaswamyBOOLEAN btif_media_task_aa_tx_flush_req(void) 136895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 136995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BT_HDR *p_buf; 137095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (NULL == (p_buf = GKI_getbuf(sizeof(BT_HDR)))) 137195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 137295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return FALSE; 137395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 137495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 137595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy p_buf->event = BTIF_MEDIA_FLUSH_AA_TX; 137695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 137795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_buf); 137895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return TRUE; 137995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 138095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 138195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 138295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 138395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_aa_tx_flush 138495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 138595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 138695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 138795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 138895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 138995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 139095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_aa_tx_flush(BT_HDR *p_msg) 139195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 139295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Flush all enqueued GKI music buffers (encoded) */ 139395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG0("btif_media_task_aa_tx_flush"); 139495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 139595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_flush_q(&(btif_media_cb.TxAaQ)); 139695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 139795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REQ_RX_FLUSH, NULL); 139895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 139995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 140095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 140195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 140295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_enc_init 140395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 140495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description Initialize encoding task 140595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 140695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 140795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 140895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 140995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_enc_init(BT_HDR *p_msg) 141095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 141195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_MEDIA_INIT_AUDIO *pInitAudio = (tBTIF_MEDIA_INIT_AUDIO *) p_msg; 141295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 141395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG0("btif_media_task_enc_init"); 141495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 141595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.timestamp = 0; 141695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 141795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* SBC encoder config (enforced even if not used) */ 141895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.s16ChannelMode = pInitAudio->ChannelMode; 141995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.s16NumOfSubBands = pInitAudio->NumOfSubBands; 142095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.s16NumOfBlocks = pInitAudio->NumOfBlocks; 142195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.s16AllocationMethod = pInitAudio->AllocationMethod; 142295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.s16SamplingFreq = pInitAudio->SamplingFreq; 142395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 142495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.u16BitRate = DEFAULT_SBC_BITRATE; 142595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Default transcoding is PCM to SBC, modified by feeding configuration */ 142695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC; 1427e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE-BTIF_MEDIA_AA_SBC_OFFSET-sizeof(BT_HDR)) 142895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy < pInitAudio->MtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET 142995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy - sizeof(BT_HDR)) : pInitAudio->MtuSize; 143095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 1431e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren APPL_TRACE_EVENT3("btif_media_task_enc_init busy %d, mtu %d, peer mtu %d", 1432e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren btif_media_cb.busy_level, btif_media_cb.TxAaMtuSize, pInitAudio->MtuSize); 1433e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren APPL_TRACE_EVENT6(" ch mode %d, subnd %d, nb blk %d, alloc %d, rate %d, freq %d", 1434e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren btif_media_cb.encoder.s16ChannelMode, btif_media_cb.encoder.s16NumOfSubBands, 1435e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren btif_media_cb.encoder.s16NumOfBlocks, 1436e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate, 1437e48becfe4f4160edf0201bb21c0e20eeaf0ff5f1Mattias Agren btif_media_cb.encoder.s16SamplingFreq); 143895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 143995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Reset entirely the SBC encoder */ 144095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy SBC_Encoder_Init(&(btif_media_cb.encoder)); 144195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG1("btif_media_task_enc_init bit pool %d", btif_media_cb.encoder.s16BitPool); 144295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 144395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 144495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 144595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 144695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_enc_update 144795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 144895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description Update encoding task 144995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 145095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 145195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 145295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 145395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 145495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_enc_update(BT_HDR *p_msg) 145595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 145695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_MEDIA_UPDATE_AUDIO * pUpdateAudio = (tBTIF_MEDIA_UPDATE_AUDIO *) p_msg; 145795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy SBC_ENC_PARAMS *pstrEncParams = &btif_media_cb.encoder; 145895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT16 s16SamplingFreq; 145995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy SINT16 s16BitPool; 146095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy SINT16 s16BitRate; 146195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy SINT16 s16FrameLen; 146295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT8 protect = 0; 146395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 14642f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren APPL_TRACE_DEBUG3("btif_media_task_enc_update : minmtu %d, maxbp %d minbp %d", 146595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy pUpdateAudio->MinMtuSize, pUpdateAudio->MaxBitPool, pUpdateAudio->MinBitPool); 146695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 146795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Only update the bitrate and MTU size while timer is running to make sure it has been initialized */ 14682f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren //if (btif_media_cb.is_tx_timer) 146995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 147095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET - sizeof(BT_HDR)) 147195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy < pUpdateAudio->MinMtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET 147295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy - sizeof(BT_HDR)) : pUpdateAudio->MinMtuSize; 147395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 147495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Set the initial target bit rate */ 147595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy pstrEncParams->u16BitRate = DEFAULT_SBC_BITRATE; 14762f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 147795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (pstrEncParams->s16SamplingFreq == SBC_sf16000) 147895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy s16SamplingFreq = 16000; 147995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (pstrEncParams->s16SamplingFreq == SBC_sf32000) 148095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy s16SamplingFreq = 32000; 148195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (pstrEncParams->s16SamplingFreq == SBC_sf44100) 148295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy s16SamplingFreq = 44100; 148395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else 148495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy s16SamplingFreq = 48000; 148595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 148695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy do 148795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 148895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if ((pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) || 148995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy (pstrEncParams->s16ChannelMode == SBC_STEREO) ) 149095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 149195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy s16BitPool = (SINT16)( (pstrEncParams->u16BitRate * 149295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy pstrEncParams->s16NumOfSubBands * 1000 / s16SamplingFreq) 149395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy -( (32 + (4 * pstrEncParams->s16NumOfSubBands * 149495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy pstrEncParams->s16NumOfChannels) 149595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy + ( (pstrEncParams->s16ChannelMode - 2) * 149695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy pstrEncParams->s16NumOfSubBands ) ) 149795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy / pstrEncParams->s16NumOfBlocks) ); 149895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 149995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy s16FrameLen = 4 + (4*pstrEncParams->s16NumOfSubBands* 150095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy pstrEncParams->s16NumOfChannels)/8 150195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy + ( ((pstrEncParams->s16ChannelMode - 2) * 150295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy pstrEncParams->s16NumOfSubBands) 150395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy + (pstrEncParams->s16NumOfBlocks * s16BitPool) ) / 8; 150495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 150595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy s16BitRate = (8 * s16FrameLen * s16SamplingFreq) 150695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy / (pstrEncParams->s16NumOfSubBands * 150795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy pstrEncParams->s16NumOfBlocks * 1000); 150895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 150995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (s16BitRate > pstrEncParams->u16BitRate) 151095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy s16BitPool--; 151195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 151295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if(pstrEncParams->s16NumOfSubBands == 8) 151395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy s16BitPool = (s16BitPool > 255) ? 255 : s16BitPool; 151495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else 151595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy s16BitPool = (s16BitPool > 128) ? 128 : s16BitPool; 151695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 151795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else 151895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 151995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy s16BitPool = (SINT16)( ((pstrEncParams->s16NumOfSubBands * 152095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy pstrEncParams->u16BitRate * 1000) 152195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy / (s16SamplingFreq * pstrEncParams->s16NumOfChannels)) 152295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy -( ( (32 / pstrEncParams->s16NumOfChannels) + 152395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy (4 * pstrEncParams->s16NumOfSubBands) ) 152495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy / pstrEncParams->s16NumOfBlocks ) ); 152595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 152695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy pstrEncParams->s16BitPool = (s16BitPool > 152795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy (16 * pstrEncParams->s16NumOfSubBands)) 152895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ? (16*pstrEncParams->s16NumOfSubBands) : s16BitPool; 152995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 153095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 153195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (s16BitPool < 0) 153295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 153395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy s16BitPool = 0; 153495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 153595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 15362f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren APPL_TRACE_EVENT2("bitpool candidate : %d (%d kbps)", s16BitPool, pstrEncParams->u16BitRate); 15372f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 153895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (s16BitPool > pUpdateAudio->MaxBitPool) 153995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 154095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_WARNING1("btif_media_task_enc_update computed bitpool too large (%d)", s16BitPool); 154195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Decrease bitrate */ 154295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.u16BitRate -= BTIF_MEDIA_BITRATE_STEP; 154395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Record that we have decreased the bitrate */ 154495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy protect |= 1; 154595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 154695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (s16BitPool < pUpdateAudio->MinBitPool) 154795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 154895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_WARNING1("btif_media_task_enc_update computed bitpool too small (%d)", s16BitPool); 154995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Increase bitrate */ 155095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.u16BitRate += BTIF_MEDIA_BITRATE_STEP; 155195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Record that we have increased the bitrate */ 155295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy protect |= 2; 155395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 155495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else 155595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 155695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 155795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 155895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* In case we have already increased and decreased the bitrate, just stop */ 155995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (protect == 3) 156095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 156195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_ERROR0("btif_media_task_enc_update could not find bitpool in range"); 156295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 156395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 156495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } while (1); 156595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 156695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Finally update the bitpool in the encoder structure */ 156795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy pstrEncParams->s16BitPool = s16BitPool; 156895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 156995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG2("btif_media_task_enc_update final bit rate %d, final bit pool %d", 157095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.u16BitRate, btif_media_cb.encoder.s16BitPool); 15712f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren 15722f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren /* make sure we reinitialize encoder with new settings */ 15732f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren SBC_Encoder_Init(&(btif_media_cb.encoder)); 157495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 157595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 157695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 157795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 157895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 157995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_pcm2sbc_init 158095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 158195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description Init encoding task for PCM to SBC according to feeding 158295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 158395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 158495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 158595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 158695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_pcm2sbc_init(tBTIF_MEDIA_INIT_AUDIO_FEEDING * p_feeding) 158795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 158895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BOOLEAN reconfig_needed = FALSE; 158995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 159095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG0("PCM feeding:"); 159195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG1("sampling_freq:%d", p_feeding->feeding.cfg.pcm.sampling_freq); 159295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG1("num_channel:%d", p_feeding->feeding.cfg.pcm.num_channel); 159395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG1("bit_per_sample:%d", p_feeding->feeding.cfg.pcm.bit_per_sample); 159495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 159595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 159695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Check the PCM feeding sampling_freq */ 159795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy switch (p_feeding->feeding.cfg.pcm.sampling_freq) 159895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 159995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case 8000: 160095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case 12000: 160195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case 16000: 160295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case 24000: 160395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case 32000: 160495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case 48000: 160595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* For these sampling_freq the AV connection must be 48000 */ 160695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf48000) 160795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 160895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Reconfiguration needed at 48000 */ 160995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG0("SBC Reconfiguration needed at 48000"); 161095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.s16SamplingFreq = SBC_sf48000; 161195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy reconfig_needed = TRUE; 161295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 161395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 161495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 161595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case 11025: 161695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case 22050: 161795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case 44100: 161895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* For these sampling_freq the AV connection must be 44100 */ 161995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf44100) 162095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 162195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Reconfiguration needed at 44100 */ 162295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG0("SBC Reconfiguration needed at 44100"); 162395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.s16SamplingFreq = SBC_sf44100; 162495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy reconfig_needed = TRUE; 162595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 162695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 162795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy default: 162895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG0("Feeding PCM sampling_freq unsupported"); 162995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 163095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 163195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 163295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Some AV Headsets do not support Mono => always ask for Stereo */ 16332f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren if (btif_media_cb.encoder.s16ChannelMode == SBC_MONO) 163495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 163595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG0("SBC Reconfiguration needed in Stereo"); 16362f9c0a7966a08936e8ae7a03ab8fbf1de3b22e0eMattias Agren btif_media_cb.encoder.s16ChannelMode = SBC_JOINT_STEREO; 163795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy reconfig_needed = TRUE; 163895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 163995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 164095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (reconfig_needed != FALSE) 164195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 164295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG0("btif_media_task_pcm2sbc_init calls SBC_Encoder_Init"); 164395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG1("btif_media_task_pcm2sbc_init mtu %d", btif_media_cb.TxAaMtuSize); 164495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG6("btif_media_task_pcm2sbc_init ch mode %d, nbsubd %d, nb blk %d, alloc method %d, bit rate %d, Smp freq %d", 164595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.s16ChannelMode, btif_media_cb.encoder.s16NumOfSubBands, btif_media_cb.encoder.s16NumOfBlocks, 164695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate, btif_media_cb.encoder.s16SamplingFreq); 164795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy SBC_Encoder_Init(&(btif_media_cb.encoder)); 164895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 164995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else 165095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 165195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG0("btif_media_task_pcm2sbc_init no SBC reconfig needed"); 165295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 165395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 165495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 165595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 165695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 165795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 165895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_audio_feeding_init 165995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 166095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description Initialize the audio path according to the feeding format 166195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 166295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 166395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 166495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 166595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_audio_feeding_init(BT_HDR *p_msg) 166695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 166795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_feeding = (tBTIF_MEDIA_INIT_AUDIO_FEEDING *) p_msg; 166895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 166995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG1("btif_media_task_audio_feeding_init format:%d", p_feeding->feeding.format); 167095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 167195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Save Media Feeding information */ 167295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.feeding_mode = p_feeding->feeding_mode; 167395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.media_feeding = p_feeding->feeding; 167495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 167595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Handle different feeding formats */ 167695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy switch (p_feeding->feeding.format) 167795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 167895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case BTIF_AV_CODEC_PCM: 167995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC; 168095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_pcm2sbc_init(p_feeding); 168195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 1682254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 168395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy default : 168495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_ERROR1("unknown feeding format %d", p_feeding->feeding.format); 168595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 168695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 168795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 168895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 168995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 169095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 169195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_uipc_cback 169295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 169395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description UIPC call back function for synchronous mode only 169495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 169595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 169695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 169795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 169895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_uipc_cback(BT_HDR *p_msg) 169995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 170095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Sanity check */ 170195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (NULL == p_msg) 170295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 170395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return; 170495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 170595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 170695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Just handle RX_EVT */ 170795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (p_msg->event != UIPC_RX_DATA_EVT) 170895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 170995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return; 171095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 171195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 171295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy p_msg->event = BTIF_MEDIA_UIPC_RX_RDY; 171395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 171495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_send_msg(BT_MEDIA_TASK, BTIF_MEDIA_TASK_CMD_MBOX, p_msg); 171595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 171695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 171795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 171895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 171995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_feeding_state_reset 172095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 172195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description Reset the media feeding state 172295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 172395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 172495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 172595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 172695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_feeding_state_reset(void) 172795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 172895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* By default, just clear the entire state */ 172995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy memset(&btif_media_cb.media_feeding_state, 0, sizeof(btif_media_cb.media_feeding_state)); 173095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 173195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 173295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 173395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_aa_start_tx 173495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 173595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description Start media task encoding 173695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 173795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 173895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 173995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 174095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_aa_start_tx(void) 174195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 174295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG2("btif_media_task_aa_start_tx is timer %d, feeding mode %d", 174395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.is_tx_timer, btif_media_cb.feeding_mode); 174495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 174595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 174695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Use a timer to poll the UIPC, get rid of the UIPC call back */ 1747254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren // UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_CBACK, NULL); 174895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 174995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.is_tx_timer = TRUE; 175095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 175195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Reset the media feeding state */ 175295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_feeding_state_reset(); 175395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 175495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_EVENT2("starting timer %d ticks (%d)", GKI_MS_TO_TICKS(BTIF_MEDIA_TIME_TICK), TICKS_PER_SEC); 175595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_start_timer(BTIF_MEDIA_AA_TASK_TIMER_ID, GKI_MS_TO_TICKS(BTIF_MEDIA_TIME_TICK), TRUE); 175695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 175795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 175895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 175995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 176095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_task_aa_stop_tx 176195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 176295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description Stop media task encoding 176395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 176495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 176595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 176695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 176795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_task_aa_stop_tx(void) 176895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 176995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG1("btif_media_task_aa_stop_tx is timer: %d", btif_media_cb.is_tx_timer); 1770254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 177195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Stop the timer first */ 177295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_stop_timer(BTIF_MEDIA_AA_TASK_TIMER_ID); 177395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.is_tx_timer = FALSE; 177495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 177595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UIPC_Close(UIPC_CH_ID_AV_AUDIO); 177695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 1777254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* audio engine stopped, reset tx suspended flag */ 1778254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_media_cb.tx_flush = 0; 1779254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 178095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Reset the media feeding state */ 178195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_task_feeding_state_reset(); 178295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 178395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 178495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 178595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 178695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_get_num_aa_frame 178795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 178895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 178995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 179095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns The number of media frames in this time slice 179195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 179295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 1793b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie 1794b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie 179595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic UINT8 btif_get_num_aa_frame(void) 179695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 179795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT8 result=0; 179895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 179995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy switch (btif_media_cb.TxTranscoding) 180095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 180195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case BTIF_MEDIA_TRSCD_PCM_2_SBC: 180295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy switch (btif_media_cb.encoder.s16SamplingFreq) 180395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 180495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case SBC_sf16000: 1805b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie if (!btif_media_cb.scaling_disabled && 1806b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie (btif_media_cb.media_feeding_state.pcm.aa_frame_counter++ % 2) == 0) 1807b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie { 1808b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie result = BTIF_MEDIA_FR_PER_TICKS_16-1; 1809b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie } 1810b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie else 1811b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie { 1812b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie result = BTIF_MEDIA_FR_PER_TICKS_16; 1813b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie } 181495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 1815b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie 181695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case SBC_sf32000: 181795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy result = BTIF_MEDIA_FR_PER_TICKS_32; 181895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 1819b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie 182095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case SBC_sf48000: 1821b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie if (!btif_media_cb.scaling_disabled && 1822b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie (btif_media_cb.media_feeding_state.pcm.aa_frame_counter++ % 2) == 0) 1823b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie { 1824b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie result = BTIF_MEDIA_FR_PER_TICKS_48-1; 1825b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie } 1826b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie else 1827b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie { 1828b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie result = BTIF_MEDIA_FR_PER_TICKS_48; 1829b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie } 183095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 1831b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie 183295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case SBC_sf44100: 1833b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie if (!btif_media_cb.scaling_disabled && 1834b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie (btif_media_cb.media_feeding_state.pcm.aa_frame_counter++ % 64) < 7) 1835b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie { 1836b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie result = BTIF_MEDIA_FR_PER_TICKS_44_1-1; 1837b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie } 1838b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie else 1839b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie { 1840b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie result = BTIF_MEDIA_FR_PER_TICKS_44_1; 1841b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie } 184295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 184395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 1844ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani 1845ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani VERBOSE("WRITE %d FRAMES", result); 184695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 184795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 184895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy default: 184995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_ERROR1("ERROR btif_get_num_aa_frame Unsupported transcoding format 0x%x", 185095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.TxTranscoding); 185195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy result = 0; 185295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 185395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 185495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 185595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE)) 185695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG1("btif_get_num_aa_frame returns %d", result); 185795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 185895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 185995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return result; 186095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 186195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 186295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 186395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 186495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_aa_readbuf 186595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 186695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description This function is called by the av_co to get the next buffer to send 186795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 186895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 186995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 187095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 187195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik SinnaswamyBT_HDR *btif_media_aa_readbuf(void) 187295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 187395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return GKI_dequeue(&(btif_media_cb.TxAaQ)); 187495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 187595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 187695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 187795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 187895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_aa_read_feeding 187995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 188095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 188195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 188295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 188395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 188495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 188529fa3a0e28eccd9511f530dd3e4e4a9123a33604Mattias Agren 188695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik SinnaswamyBOOLEAN btif_media_aa_read_feeding(tUIPC_CH_ID channel_id) 188795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 188895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT16 event; 188995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* coverity[SIGN_EXTENSION] False-positive: Parameter are always in range avoiding sign extension*/ 189095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands * btif_media_cb.encoder.s16NumOfBlocks; 189195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT32 read_size; 189295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT16 sbc_sampling = 48000; 189395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT32 src_samples; 189495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT16 bytes_needed = blocm_x_subband * btif_media_cb.encoder.s16NumOfChannels * sizeof(SINT16); 189595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy static UINT16 up_sampled_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS 189695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS * 2]; 189795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy static UINT16 read_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS 189895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS]; 189995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT32 src_size_used; 190095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT32 dst_size_used; 190195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BOOLEAN fract_needed; 190295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy INT32 fract_max; 190395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy INT32 fract_threshold; 190495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT32 nb_byte_read; 190595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 190695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Get the SBC sampling rate */ 190795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy switch (btif_media_cb.encoder.s16SamplingFreq) 190895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 190995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case SBC_sf48000: 191095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy sbc_sampling = 48000; 191195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 191295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case SBC_sf44100: 191395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy sbc_sampling = 44100; 191495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 191595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case SBC_sf32000: 191695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy sbc_sampling = 32000; 191795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 191895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case SBC_sf16000: 191995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy sbc_sampling = 16000; 192095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 192195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 192295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 192395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Some Feeding PCM frequencies require to split the number of sample */ 192495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* to read. */ 192595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* E.g 128/6=21.3333 => read 22 and 21 and 21 => max = 2; threshold = 0*/ 192695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy fract_needed = FALSE; /* Default */ 192795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy switch (btif_media_cb.media_feeding.cfg.pcm.sampling_freq) 192895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 192995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case 32000: 193095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case 8000: 193195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy fract_needed = TRUE; 193295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy fract_max = 2; /* 0, 1 and 2 */ 193395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy fract_threshold = 0; /* Add one for the first */ 193495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 193595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case 16000: 193695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy fract_needed = TRUE; 193795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy fract_max = 2; /* 0, 1 and 2 */ 193895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy fract_threshold = 1; /* Add one for the first two frames*/ 193995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 194095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 194195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 194295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Compute number of sample to read from source */ 194395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy src_samples = blocm_x_subband; 194495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy src_samples *= btif_media_cb.media_feeding.cfg.pcm.sampling_freq; 194595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy src_samples /= sbc_sampling; 194695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 194795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* The previous division may have a remainder not null */ 194895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (fract_needed) 194995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 195095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter <= fract_threshold) 195195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 195295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy src_samples++; /* for every read before threshold add one sample */ 195395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 195495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 195595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* do nothing if counter >= threshold */ 195695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.media_feeding_state.pcm.aa_feed_counter++; /* one more read */ 195795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter > fract_max) 195895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 195995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.media_feeding_state.pcm.aa_feed_counter = 0; 196095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 196195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 196295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 196395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Compute number of bytes to read from source */ 196495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy read_size = src_samples; 196595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy read_size *= btif_media_cb.media_feeding.cfg.pcm.num_channel; 196695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy read_size *= (btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8); 196795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 196895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Read Data from UIPC channel */ 196995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy nb_byte_read = UIPC_Read(channel_id, &event, (UINT8 *)read_buffer, read_size); 197095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 197195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy //tput_mon(TRUE, nb_byte_read, FALSE); 197295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 197395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (nb_byte_read < read_size) 197495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 1975254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_WARNING2("### UNDERRUN :: ONLY READ %d BYTES OUT OF %d ###", 197695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy nb_byte_read, read_size); 197795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 1978254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (nb_byte_read == 0) 1979254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren return FALSE; 1980254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 198195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if(btif_media_cb.feeding_mode == BTIF_AV_FEEDING_ASYNCHRONOUS) 198295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 198395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Fill the unfilled part of the read buffer with silence (0) */ 198495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy memset(((UINT8 *)read_buffer) + nb_byte_read, 0, read_size - nb_byte_read); 198595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy nb_byte_read = read_size; 198695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 198795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 198895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 198995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Initialize PCM up-sampling engine */ 199095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy bta_av_sbc_init_up_sample(btif_media_cb.media_feeding.cfg.pcm.sampling_freq, 199195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy sbc_sampling, btif_media_cb.media_feeding.cfg.pcm.bit_per_sample, 199295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.media_feeding.cfg.pcm.num_channel); 199395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 199495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* re-sample read buffer */ 199595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* The output PCM buffer will be stereo, 16 bit per sec */ 199695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy dst_size_used = bta_av_sbc_up_sample((UINT8 *)read_buffer, 199795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy (UINT8 *)up_sampled_buffer + btif_media_cb.media_feeding_state.pcm.aa_feed_residue, 199895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy nb_byte_read, 199995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy sizeof(up_sampled_buffer) - btif_media_cb.media_feeding_state.pcm.aa_feed_residue, 200095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy &src_size_used); 2001254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 200295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE)) 200395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG3("btif_media_aa_read_feeding read_size:%d src_size_used:%d dst_size_used:%d", 200495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy read_size, src_size_used, dst_size_used); 200595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 200695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 200795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* update the residue */ 200895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.media_feeding_state.pcm.aa_feed_residue += dst_size_used; 200995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 201095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* only copy the pcm sample when we have up-sampled enough PCM */ 201195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if(btif_media_cb.media_feeding_state.pcm.aa_feed_residue >= bytes_needed) 201295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 201395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Copy the output pcm samples in SBC encoding buffer */ 201495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy memcpy((UINT8 *)btif_media_cb.encoder.as16PcmBuffer, 201595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy (UINT8 *)up_sampled_buffer, 201695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy bytes_needed); 201795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* update the residue */ 201895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.media_feeding_state.pcm.aa_feed_residue -= bytes_needed; 201995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 202095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (btif_media_cb.media_feeding_state.pcm.aa_feed_residue != 0) 202195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 202295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy memcpy((UINT8 *)up_sampled_buffer, 202395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy (UINT8 *)up_sampled_buffer + bytes_needed, 202495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.media_feeding_state.pcm.aa_feed_residue); 202595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 202695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return TRUE; 202795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 202895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 202995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE)) 203095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG3("btif_media_aa_read_feeding residue:%d, dst_size_used %d, bytes_needed %d", 203195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.media_feeding_state.pcm.aa_feed_residue, dst_size_used, bytes_needed); 203295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 203395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 203495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return FALSE; 203595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 203695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 203795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 203895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 203995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_aa_prep_sbc_2_send 204095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 204195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 204295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 204395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 204495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 204595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 204695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_aa_prep_sbc_2_send(UINT8 nb_frame) 204795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 204895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy BT_HDR * p_buf; 204995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands * btif_media_cb.encoder.s16NumOfBlocks; 205095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 205195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#if (defined(DEBUG_MEDIA_AV_FLOW) && (DEBUG_MEDIA_AV_FLOW == TRUE)) 205295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG2("btif_media_aa_prep_sbc_2_send nb_frame %d, TxAaQ %d", nb_frame, btif_media_cb.TxAaQ.count); 205395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif 205495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy while (nb_frame) 205595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 205695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (NULL == (p_buf = GKI_getpoolbuf(BTIF_MEDIA_AA_POOL_ID))) 205795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 205895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_ERROR1 ("ERROR btif_media_aa_prep_sbc_2_send no buffer TxCnt %d ", btif_media_cb.TxAaQ.count); 205995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return; 206095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 206195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 206295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Init buffer */ 206395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy p_buf->offset = BTIF_MEDIA_AA_SBC_OFFSET; 206495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy p_buf->len = 0; 206595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy p_buf->layer_specific = 0; 206695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 206795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy do 206895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 206995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Write @ of allocated buffer in encoder.pu8Packet */ 207095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.encoder.pu8Packet = (UINT8 *) (p_buf + 1) + p_buf->offset + p_buf->len; 207195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Fill allocated buffer with 0 */ 207295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* coverity[SIGN_EXTENSION] False-positive: Parameter are always in range avoiding sign extension*/ 207395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy memset(btif_media_cb.encoder.as16PcmBuffer, 0, blocm_x_subband 207495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy * btif_media_cb.encoder.s16NumOfChannels); 2075254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 207695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Read PCM data and upsample them if needed */ 207795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (btif_media_aa_read_feeding(UIPC_CH_ID_AV_AUDIO)) 207895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 207995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* SBC encode and descramble frame */ 208095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy SBC_Encoder(&(btif_media_cb.encoder)); 208195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy A2D_SbcChkFrInit(btif_media_cb.encoder.pu8Packet); 208295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy A2D_SbcDescramble(btif_media_cb.encoder.pu8Packet, btif_media_cb.encoder.u16PacketLength); 208395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Update SBC frame length */ 208495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy p_buf->len += btif_media_cb.encoder.u16PacketLength; 208595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy nb_frame--; 208695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy p_buf->layer_specific++; 208795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 208895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else 208995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 209095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* no more pcm to read */ 209195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy nb_frame = 0; 2092254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 2093254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren /* break read loop if timer was stopped (media task stopped) */ 2094254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if ( btif_media_cb.is_tx_timer == FALSE ) 2095254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren return; 209695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 209795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 209895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } while (((p_buf->len + btif_media_cb.encoder.u16PacketLength) < btif_media_cb.TxAaMtuSize) 209995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy && (p_buf->layer_specific < 0x0F) && nb_frame); 210095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 210195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* coverity[SIGN_EXTENSION] False-positive: Parameter are always in range avoiding sign extension*/ 210295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_cb.timestamp += p_buf->layer_specific * blocm_x_subband; 210395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 210495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* store the time stamp in the buffer to send */ 210595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *((UINT32 *) (p_buf + 1)) = btif_media_cb.timestamp; 210695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 2107ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani VERBOSE("TX QUEUE NOW %d", btif_media_cb.TxAaQ.count); 2108254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 2109254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (btif_media_cb.tx_flush) 2110254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren { 2111254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren APPL_TRACE_DEBUG0("### tx suspended, discarded frame ###"); 2112254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 2113254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren if (btif_media_cb.TxAaQ.count > 0) 2114254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren btif_media_flush_q(&(btif_media_cb.TxAaQ)); 2115254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 2116254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren GKI_freebuf(p_buf); 2117254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren return; 2118254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren } 2119254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 212095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Enqueue the encoded SBC frame in AA Tx Queue */ 212195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_enqueue(&(btif_media_cb.TxAaQ), p_buf); 212295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 212395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 212495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 212595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 212695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 212795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 212895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_aa_prep_2_send 212995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 213095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 213195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 213295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 213395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 213495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 2135254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 213695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_aa_prep_2_send(UINT8 nb_frame) 213795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 2138ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani VERBOSE("btif_media_aa_prep_2_send : %d frames (queue %d)", nb_frame, 2139ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani btif_media_cb.TxAaQ.count); 2140254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren 214195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* Remove all the buffers not sent until there are only 4 in the queue */ 2142254588bfe6c3e70625b0f725b908598f30f476c8Mattias Agren while (btif_media_cb.TxAaQ.count >= MAX_OUTPUT_BUFFER_QUEUE_SZ) 214395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 214495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_WARNING1("btif_media_aa_prep_2_send congestion buf count %d",btif_media_cb.TxAaQ.count); 214595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy GKI_freebuf(GKI_dequeue(&(btif_media_cb.TxAaQ))); 214695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 214795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 214895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy switch (btif_media_cb.TxTranscoding) 214995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 215095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy case BTIF_MEDIA_TRSCD_PCM_2_SBC: 215195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_aa_prep_sbc_2_send(nb_frame); 215295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 215395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 215495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 215595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy default: 215695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_ERROR1("ERROR btif_media_aa_prep_2_send unsupported transcoding format 0x%x",btif_media_cb.TxTranscoding); 215795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy break; 215895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 215995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 216095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 216195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 216295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 216395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function btif_media_send_aa_frame 216495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 216595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description 216695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 216795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 216895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 216995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 217095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamystatic void btif_media_send_aa_frame(void) 217195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 217295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy UINT8 nb_frame_2_send; 217395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 217495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* get the number of frame to send */ 217595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy nb_frame_2_send = btif_get_num_aa_frame(); 217695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 217795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* format and Q buffer to send */ 217895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy btif_media_aa_prep_2_send(nb_frame_2_send); 217995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 218095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy /* send it */ 2181ac6d66d9bd6bcd4aafb80d50368167e1b9069a41Harish Paryani VERBOSE("btif_media_send_aa_frame : send %d frames", nb_frame_2_send); 218295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO); 218395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 218495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 2185b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie/******************************************************************************* 2186b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie ** 2187b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie ** Function btif_media_check_iop_exceptions 2188b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie ** 2189b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie ** Description Perform any device specific iop changes 2190b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie ** 2191b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie ** Returns void 2192b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie ** 2193b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie *******************************************************************************/ 2194b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie 219502f8bc6eeb93809da4a7dee62fd092095a11d885Matthew Xievoid btif_media_check_iop_exceptions(UINT8 *peer_bda) 2196b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie{ 2197b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie /* disable rate scaling for pcm carkit */ 2198b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie if ((peer_bda[0] == 0x00) && 2199b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie (peer_bda[1] == 0x0E) && 2200b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie (peer_bda[2] == 0x9F)) 2201b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie { 2202b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie BTIF_TRACE_WARNING0("detected pcm carkit, disable rate scaling"); 2203b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie btif_media_cb.scaling_disabled = TRUE; 2204b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie } 2205b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie else 2206b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie { 2207b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie btif_media_cb.scaling_disabled = FALSE; 2208b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie } 2209b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie} 2210b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie 2211b930299a8ad32a8227b00e0d9016b62682b577f3Matthew Xie 221295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy#endif /* BTA_AV_INCLUDED == TRUE */ 221395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 221495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy/******************************************************************************* 221595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 221695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Function dump_codec_info 221795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 221895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Description Decode and display codec_info (for debug) 221995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 222095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** Returns void 222195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy ** 222295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy *******************************************************************************/ 222395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamyvoid dump_codec_info(unsigned char *p_codec) 222495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy{ 222595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tA2D_STATUS a2d_status; 222695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy tA2D_SBC_CIE sbc_cie; 222795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 222895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_codec, FALSE); 222995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (a2d_status != A2D_SUCCESS) 223095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { 223195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_ERROR1("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status); 223295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy return; 223395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy } 223495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 223595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG0("dump_codec_info"); 223695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 223795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_16) 223895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);} 223995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_32) 224095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);} 224195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_44) 224295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tsamp_freq:%d (44.100)", sbc_cie.samp_freq);} 224395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_48) 224495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);} 224595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else 224695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tBAD samp_freq:%d", sbc_cie.samp_freq);} 224795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 224895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_MONO) 224995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tch_mode:%d (Mono)", sbc_cie.ch_mode);} 225095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_DUAL) 225195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tch_mode:%d (Dual)", sbc_cie.ch_mode);} 225295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_STEREO) 225395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tch_mode:%d (Stereo)", sbc_cie.ch_mode);} 225495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_JOINT) 225595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tch_mode:%d (Joint)", sbc_cie.ch_mode);} 225695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else 225795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tBAD ch_mode:%d", sbc_cie.ch_mode);} 225895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 225995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_4) 226095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tblock_len:%d (4)", sbc_cie.block_len);} 226195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_8) 226295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tblock_len:%d (8)", sbc_cie.block_len);} 226395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_12) 226495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tblock_len:%d (12)", sbc_cie.block_len);} 226595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_16) 226695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tblock_len:%d (16)", sbc_cie.block_len);} 226795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else 226895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tBAD block_len:%d", sbc_cie.block_len);} 226995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 227095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_4) 227195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tnum_subbands:%d (4)", sbc_cie.num_subbands);} 227295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_8) 227395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tnum_subbands:%d (8)", sbc_cie.num_subbands);} 227495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else 227595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tBAD num_subbands:%d", sbc_cie.num_subbands);} 227695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 227795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_S) 227895fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);} 227995fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L) 228095fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\talloc_mthd:%d (Loundess)", sbc_cie.alloc_mthd);} 228195fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy else 228295fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy { APPL_TRACE_DEBUG1("\tBAD alloc_mthd:%d", sbc_cie.alloc_mthd);} 228395fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 228495fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy APPL_TRACE_DEBUG2("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool); 228595fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 228695fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy} 228795fa11b3b2f19a382c7e3a744a6afb452fad86dfKausik Sinnaswamy 2288