15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2009-2012 Broadcom Corporation 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * you may not use this file except in compliance with the License. 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * You may obtain a copy of the License at: 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * See the License for the specific language governing permissions and 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * limitations under the License. 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Name: btif_media_task.c 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description: This is the multimedia module for the BTIF system. It 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** contains task implementations AV, HS and HF profiles 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** audio & video processing 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2949120dc867c7818511b5afec461dfc97d17eef58Marie Janssen#define LOG_TAG "bt_btif_media" 3049120dc867c7818511b5afec461dfc97d17eef58Marie Janssen 31c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati#include <assert.h> 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <fcntl.h> 338bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh#include <limits.h> 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <pthread.h> 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <stdint.h> 36db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <stdio.h> 37db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <string.h> 38db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <sys/stat.h> 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include <sys/time.h> 40db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <sys/types.h> 41db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <unistd.h> 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 43db554581079863974af8e1289646f5deea6fc044Marie Janssen#include <hardware/bluetooth.h> 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "a2d_api.h" 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "a2d_int.h" 47db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "a2d_sbc.h" 48db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "audio_a2dp_hw.h" 49db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bt_target.h" 50db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_api.h" 51db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_av_api.h" 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_av_ci.h" 53db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_av_sbc.h" 54db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_sys.h" 55db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "bta_sys_int.h" 56db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif_av.h" 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_av_co.h" 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_media.h" 59db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif_sm.h" 60db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btif_util.h" 61db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "btu.h" 62258c2538e3b62a8cdb403f2730c45d721e5292b4Pavlin Radoslavov#include "bt_common.h" 638bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh#include "device/include/controller.h" 64db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "l2c_api.h" 65c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati#include "osi/include/alarm.h" 66db554581079863974af8e1289646f5deea6fc044Marie Janssen#include "osi/include/fixed_queue.h" 6723e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati#include "osi/include/log.h" 684e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov#include "osi/include/metrics.h" 691eb1ea0cf2da992a3193506806e571dcbe3ec947Pavlin Radoslavov#include "osi/include/mutex.h" 70c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati#include "osi/include/thread.h" 71c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sbc_encoder.h" 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 766718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE) 77f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#include "oi_codec_sbc.h" 78f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#include "oi_status.h" 79f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 80db554581079863974af8e1289646f5deea6fc044Marie Janssen 816b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 826b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#include "btif_avrcp_audio_track.h" 836b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 846b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 856718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE) 86f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaOI_CODEC_SBC_DECODER_CONTEXT context; 87f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaOI_UINT32 contextData[CODEC_DATA_WORDS(2, SBC_CODEC_FAST_FILTER_BUFFERS)]; 88f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaOI_INT16 pcmData[15*SBC_MAX_SAMPLES_PER_FRAME*SBC_MAX_CHANNELS]; 89f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Constants 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 94f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifndef AUDIO_CHANNEL_OUT_MONO 95f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define AUDIO_CHANNEL_OUT_MONO 0x01 96f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 97f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 98f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#ifndef AUDIO_CHANNEL_OUT_STEREO 99f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define AUDIO_CHANNEL_OUT_STEREO 0x03 100f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* BTIF media cmd event definition : BTIF_MEDIA_TASK_CMD */ 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_START_AA_TX = 1, 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_STOP_AA_TX, 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_AA_RX_RDY, 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_UIPC_RX_RDY, 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_SBC_ENC_INIT, 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_SBC_ENC_UPDATE, 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_SBC_DEC_INIT, 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_VIDEO_DEC_INIT, 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_FLUSH_AA_TX, 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_FLUSH_AA_RX, 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_MEDIA_AUDIO_FEEDING_INIT, 116f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta BTIF_MEDIA_AUDIO_RECEIVING_INIT, 117f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE, 1186b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK, 1196b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTIF_MEDIA_AUDIO_SINK_SET_FOCUS_STATE 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectenum { 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MEDIA_TASK_STATE_OFF = 0, 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MEDIA_TASK_STATE_ON = 1, 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project MEDIA_TASK_STATE_SHUTTING_DOWN = 2 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Macro to multiply the media task tick */ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTIF_MEDIA_NUM_TICK 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_NUM_TICK 1 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 133b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren/* Media task tick in milliseconds, must be set to multiple of 134b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren (1000/TICKS_PER_SEC) (10) */ 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 136b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#define BTIF_MEDIA_TIME_TICK (20 * BTIF_MEDIA_NUM_TICK) 13701c686ce0051433d75605ff9ca4c3b7388ce3b6bZhihai Xu#define A2DP_DATA_READ_POLL_MS (BTIF_MEDIA_TIME_TICK / 2) 138ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov#define BTIF_SINK_MEDIA_TIME_TICK_MS (20 * BTIF_MEDIA_NUM_TICK) 139f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* buffer pool */ 14270ae7de9451e3dc074a048ba98b672a6ba3a4551Pavlin Radoslavov#define BTIF_MEDIA_AA_BUF_SIZE BT_DEFAULT_BUFFER_SIZE 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* offset */ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_CO_CP_SCMS_T == TRUE) 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE + 1) 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_AA_SBC_OFFSET (AVDT_MEDIA_OFFSET + BTA_AV_SBC_HDR_SIZE) 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Define the bitrate step when trying to match bitpool value */ 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#ifndef BTIF_MEDIA_BITRATE_STEP 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_MEDIA_BITRATE_STEP 5 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1565f308397b7fe8a8da3f88b0f8910c3863ed1ec0bSridhar Vashist#ifndef BTIF_A2DP_DEFAULT_BITRATE 1575f308397b7fe8a8da3f88b0f8910c3863ed1ec0bSridhar Vashist/* High quality quality setting @ 44.1 khz */ 1585f308397b7fe8a8da3f88b0f8910c3863ed1ec0bSridhar Vashist#define BTIF_A2DP_DEFAULT_BITRATE 328 1595f308397b7fe8a8da3f88b0f8910c3863ed1ec0bSridhar Vashist#endif 160b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 161b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#ifndef BTIF_A2DP_NON_EDR_MAX_RATE 162b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#define BTIF_A2DP_NON_EDR_MAX_RATE 229 163b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren#endif 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1658bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh#if (BTA_AV_CO_CP_SCMS_T == TRUE) 1668bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh/* A2DP header will contain a CP header of size 1 */ 1678bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh#define A2DP_HDR_SIZE 2 1688bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh#else 1698bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh#define A2DP_HDR_SIZE 1 1708bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh#endif 1718bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh#define MAX_SBC_HQ_FRAME_SIZE_44_1 119 1728bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh#define MAX_SBC_HQ_FRAME_SIZE_48 115 1738bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 1748bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh/* 2DH5 payload size of 679 bytes - (4 bytes L2CAP Header + 12 bytes AVDTP Header) */ 1758bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh#define MAX_2MBPS_AVDTP_MTU 663 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define USEC_PER_SEC 1000000L 1775fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren#define TPUT_STATS_INTERVAL_US (3000*1000) 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 179d881c4b46776fe03a5861a3021bbe739b1f3cc58Andre Eisenbach/** 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * CONGESTION COMPENSATION CTRL :: 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Thus setting controls how many buffers we will hold in media task 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * during temp link congestion. Together with the stack buffer queues 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * it controls much temporary a2dp link congestion we can 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * compensate for. It however also depends on the default run level of sinks 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * jitterbuffers. Depending on type of sink this would vary. 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Ideally the (SRC) max tx buffer capacity should equal the sinks 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * jitterbuffer runlevel including any intermediate buffers on the way 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * towards the sinks codec. 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 19126e80aad86fae4e468a330d64ee02291f3a1980eAndre Eisenbach#ifndef MAX_PCM_FRAME_NUM_PER_TICK 19226e80aad86fae4e468a330d64ee02291f3a1980eAndre Eisenbach#define MAX_PCM_FRAME_NUM_PER_TICK 14 19326e80aad86fae4e468a330d64ee02291f3a1980eAndre Eisenbach#endif 1948bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh#define MAX_PCM_ITER_NUM_PER_TICK 3 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 196d881c4b46776fe03a5861a3021bbe739b1f3cc58Andre Eisenbach/** 197d881c4b46776fe03a5861a3021bbe739b1f3cc58Andre Eisenbach * The typical runlevel of the tx queue size is ~1 buffer 198d881c4b46776fe03a5861a3021bbe739b1f3cc58Andre Eisenbach * but due to link flow control or thread preemption in lower 199d881c4b46776fe03a5861a3021bbe739b1f3cc58Andre Eisenbach * layers we might need to temporarily buffer up data. 200d881c4b46776fe03a5861a3021bbe739b1f3cc58Andre Eisenbach */ 201d881c4b46776fe03a5861a3021bbe739b1f3cc58Andre Eisenbach#define MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ (MAX_PCM_FRAME_NUM_PER_TICK * 2) 202d881c4b46776fe03a5861a3021bbe739b1f3cc58Andre Eisenbach 203f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/* In case of A2DP SINK, we will delay start by 5 AVDTP Packets*/ 204f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define MAX_A2DP_DELAYED_START_FRAME_COUNT 5 205f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define PACKET_PLAYED_PER_TICK_48 8 206f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define PACKET_PLAYED_PER_TICK_44 7 207f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define PACKET_PLAYED_PER_TICK_32 5 208f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#define PACKET_PLAYED_PER_TICK_16 3 209f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 2108bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh/* Readability constants */ 2118bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh#define SBC_FRAME_HEADER_SIZE_BYTES 4 // A2DP Spec v1.3, 12.4, Table 12.12 2128bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh#define SBC_SCALE_FACTOR_BITS 4 // A2DP Spec v1.3, 12.4, Table 12.13 2138bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 214ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavovtypedef struct { 215ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // Counter for total updates 216ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov size_t total_updates; 217ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 218ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // Last update timestamp (in us) 219ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t last_update_us; 220ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 221ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // Counter for overdue scheduling 222ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov size_t overdue_scheduling_count; 223ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 224ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // Accumulated overdue scheduling deviations (in us) 225ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t total_overdue_scheduling_delta_us; 226ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 227ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // Max. overdue scheduling delta time (in us) 228ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t max_overdue_scheduling_delta_us; 229ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 230ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // Counter for premature scheduling 231ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov size_t premature_scheduling_count; 232ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 233ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // Accumulated premature scheduling deviations (in us) 234ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t total_premature_scheduling_delta_us; 235ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 236ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // Max. premature scheduling delta time (in us) 237ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t max_premature_scheduling_delta_us; 2384e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov 2394e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov // Counter for exact scheduling 2404e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov size_t exact_scheduling_count; 2414e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov 2424e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov // Accumulated and counted scheduling time (in us) 2434e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov uint64_t total_scheduling_time_us; 244ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov} scheduling_stats_t; 245ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 246ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavovtypedef struct { 2474e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov uint64_t session_start_us; 2484e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov 249ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov scheduling_stats_t tx_queue_enqueue_stats; 250ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov scheduling_stats_t tx_queue_dequeue_stats; 251ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 252ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov size_t tx_queue_total_frames; 2534a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov size_t tx_queue_max_frames_per_packet; 254ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 255ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t tx_queue_total_queueing_time_us; 256ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t tx_queue_max_queueing_time_us; 257ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 258ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov size_t tx_queue_total_readbuf_calls; 259ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t tx_queue_last_readbuf_us; 260ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 261ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov size_t tx_queue_total_flushed_messages; 262ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t tx_queue_last_flushed_us; 263ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 264ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov size_t tx_queue_total_dropped_messages; 265ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov size_t tx_queue_dropouts; 266ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t tx_queue_last_dropouts_us; 267ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 268ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov size_t media_read_total_underflow_bytes; 269ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov size_t media_read_total_underflow_count; 270ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t media_read_last_underflow_us; 271ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 272ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov size_t media_read_total_underrun_bytes; 273ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov size_t media_read_total_underrun_count; 274ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t media_read_last_underrun_us; 2754a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov 2764a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov size_t media_read_total_expected_frames; 2774a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov size_t media_read_max_expected_frames; 2784a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov size_t media_read_expected_count; 2794a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov 2804a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov size_t media_read_total_limited_frames; 2814a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov size_t media_read_max_limited_frames; 2824a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov size_t media_read_limited_count; 283ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov} btif_media_stats_t; 284ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 285f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptatypedef struct 286f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 287f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT16 num_frames_to_be_processed; 288f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT16 len; 289f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT16 offset; 290f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT16 layer_specific; 291f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} tBT_SBC_HDR; 2925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 aa_frame_counter; 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT32 aa_feed_counter; 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT32 aa_feed_residue; 298b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren UINT32 counter; 299b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren UINT32 bytes_per_tick; /* pcm bytes read each media task tick */ 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE; 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef union 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_MEDIA_FEEDINGS_PCM_STATE pcm; 3055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTIF_AV_MEDIA_FEEDINGS_STATE; 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 3101a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_t *TxAaQ; 3111a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_t *RxSbcQ; 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 TxAaMtuSize; 3135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 timestamp; 3145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 TxTranscoding; 3155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_FEEDING_MODE feeding_mode; 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_MEDIA_FEEDINGS media_feeding; 3175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_MEDIA_FEEDINGS_STATE media_feeding_state; 3185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SBC_ENC_PARAMS encoder; 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 busy_level; 3205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project void* av_sm_hdl; 3215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 a2dp_cmd_pending; /* we can have max one command pending */ 3225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN tx_flush; /* discards any outgoing data when true */ 323f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta BOOLEAN rx_flush; /* discards any incoming data when true */ 3243e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood UINT8 peer_sep; 3253e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood BOOLEAN data_channel_open; 3268bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh UINT8 frames_to_process; 3278bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh UINT8 tx_sbc_frames; 3283e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 3293e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood UINT32 sample_rate; 3303e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood UINT8 channel_count; 3316b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 3326b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_media_audio_focus_state rx_audio_focus_state; 3336b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta void *audio_track; 3346b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 335c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati alarm_t *media_alarm; 336c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati alarm_t *decode_alarm; 337ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_stats_t stats; 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTIF_MEDIA_CB; 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct { 3425fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren long long rx; 3435fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren long long rx_tot; 3445fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren long long tx; 3455fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren long long tx_tot; 3465fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren long long ts_prev_us; 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} t_stat; 3485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 349f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbachstatic UINT64 last_frame_us = 0; 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event); 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event); 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_encoder_update(void); 3546718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE) 355ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptaextern OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT *context, 356ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta const OI_BYTE **frameData, 357ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta unsigned long *frameBytes, 358ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_INT16 *pcmData, 359ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta unsigned long *pcmBytes); 360ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Guptaextern OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT *context, 361ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta unsigned long *decoderData, 362ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta unsigned long decoderDataBytes, 363ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_UINT8 maxChannels, 364ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_UINT8 pcmStride, 365ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta OI_BOOL enhanced); 366f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 3671a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavovstatic void btif_media_flush_q(fixed_queue_t *p_q); 368f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_stop_decoding(void ); 369f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_rx_flush(void); 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3718bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghoshstatic UINT8 calculate_max_frames_per_packet(); 37223e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic const char *dump_media_event(UINT16 event); 37323e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_thread_init(void *context); 37423e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_thread_cleanup(void *context); 37523e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_thread_handle_cmd(fixed_queue_t *queue, void *context); 3765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 377f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/* Handle incoming media packets A2DP SINK streaming*/ 3786718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE) 379f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg); 380f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 3815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 383ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavovstatic void btif_media_send_aa_frame(uint64_t timestamp_us); 3845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_feeding_state_reset(void); 3855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_start_tx(void); 3865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_stop_tx(void); 3875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_init(BT_HDR *p_msg); 3885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_update(BT_HDR *p_msg); 3895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_audio_feeding_init(BT_HDR *p_msg); 3905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_tx_flush(BT_HDR *p_msg); 391ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavovstatic void btif_media_aa_prep_2_send(UINT8 nb_frame, uint64_t timestamp_us); 3926718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE) 393f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg); 394f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_clear_track(void); 3955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 396c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavatistatic void btif_media_task_aa_handle_start_decoding(void); 397f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 398f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaBOOLEAN btif_media_task_clear_track(void); 399753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton 40023e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_task_aa_handle_timer(UNUSED_ATTR void *context); 40123e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context); 4029c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Guptaextern BOOLEAN btif_hf_is_call_idle(); 40323e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati 40423e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic tBTIF_MEDIA_CB btif_media_cb; 40523e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic int media_task_running = MEDIA_TASK_STATE_OFF; 40623e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati 40723e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic fixed_queue_t *btif_media_cmd_msg_queue; 40823e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic thread_t *worker_thread; 409753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton 4105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 4115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Misc helper functions 4125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 4135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 414ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavovstatic void update_scheduling_stats(scheduling_stats_t *stats, 415ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t now_us, uint64_t expected_delta) 416ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov{ 417ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t last_us = stats->last_update_us; 418ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 419ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->total_updates++; 420ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->last_update_us = now_us; 421ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 422ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov if (last_us == 0) 423ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov return; // First update: expected delta doesn't apply 424ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 425ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t deadline_us = last_us + expected_delta; 426ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov if (deadline_us < now_us) { 427ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // Overdue scheduling 428ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t delta_us = now_us - deadline_us; 429ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // Ignore extreme outliers 430ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov if (delta_us < 10 * expected_delta) { 431ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov if (stats->max_overdue_scheduling_delta_us < delta_us) 432ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->max_overdue_scheduling_delta_us = delta_us; 433ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->total_overdue_scheduling_delta_us += delta_us; 434ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->overdue_scheduling_count++; 4354e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov stats->total_scheduling_time_us += now_us - last_us; 436ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov } 437ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov } else if (deadline_us > now_us) { 438ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // Premature scheduling 439ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t delta_us = deadline_us - now_us; 440ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // Ignore extreme outliers 441ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov if (delta_us < 10 * expected_delta) { 442ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov if (stats->max_premature_scheduling_delta_us < delta_us) 443ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->max_premature_scheduling_delta_us = delta_us; 444ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->total_premature_scheduling_delta_us += delta_us; 445ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->premature_scheduling_count++; 4464e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov stats->total_scheduling_time_us += now_us - last_us; 447ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov } 4484e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov } else { 4494e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov // On-time scheduling 4504e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov stats->exact_scheduling_count++; 4514e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov stats->total_scheduling_time_us += now_us - last_us; 452ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov } 453ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov} 454ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 455f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbachstatic UINT64 time_now_us() 4565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 457f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach struct timespec ts_now; 458f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach clock_gettime(CLOCK_BOOTTIME, &ts_now); 45925067c0afc4d3ed95181b91801d3d638d9aa3f8fAndre Eisenbach return ((UINT64)ts_now.tv_sec * USEC_PER_SEC) + ((UINT64)ts_now.tv_nsec / 1000); 460f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach} 4615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4628bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghoshstatic void log_tstamps_us(char *comment, uint64_t now_us) 463f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach{ 4648bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh static uint64_t prev_us = 0; 465f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach APPL_TRACE_DEBUG("[%s] ts %08llu, diff : %08llu, queue sz %d", comment, now_us, now_us - prev_us, 4661a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_length(btif_media_cb.TxAaQ)); 467f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach prev_us = now_us; 4685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 47023e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil NanavatiUNUSED_ATTR static const char *dump_media_event(UINT16 event) 4715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 4728bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh switch (event) 4735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 4745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_START_AA_TX) 4755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_STOP_AA_TX) 4765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_AA_RX_RDY) 4775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_UIPC_RX_RDY) 4785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_INIT) 4795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_SBC_ENC_UPDATE) 4805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_SBC_DEC_INIT) 4815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_VIDEO_DEC_INIT) 4825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_TX) 4835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_FLUSH_AA_RX) 4845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_AUDIO_FEEDING_INIT) 4855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(BTIF_MEDIA_AUDIO_RECEIVING_INIT) 486f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE) 487f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK) 4886b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta CASE_RETURN_STR(BTIF_MEDIA_AUDIO_SINK_SET_FOCUS_STATE) 4895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 4915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "UNKNOWN MEDIA EVENT"; 4925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 4935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 4945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 4965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** A2DP CTRL PATH 4975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 4985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 4995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic const char* dump_a2dp_ctrl_event(UINT8 event) 5005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5018bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh switch (event) 5025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(A2DP_CTRL_CMD_NONE) 5045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(A2DP_CTRL_CMD_CHECK_READY) 5055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(A2DP_CTRL_CMD_START) 5065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(A2DP_CTRL_CMD_STOP) 5075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project CASE_RETURN_STR(A2DP_CTRL_CMD_SUSPEND) 50847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule CASE_RETURN_STR(A2DP_CTRL_CMD_OFFLOAD_START) 50947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 5105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 5115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return "UNKNOWN MSG ID"; 5125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_audiopath_detached(void) 5165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 517e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("## AUDIO PATH DETACHED ##"); 5185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send stop request only if we are actively streaming and haven't received 5205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a stop request. Potentially audioflinger detached abnormally */ 52178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (alarm_is_scheduled(btif_media_cb.media_alarm)) { 5225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* post stop event and wait for audio path to stop */ 5235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0); 5245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void a2dp_cmd_acknowledge(int status) 5285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 ack = status; 5305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 531e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("## a2dp ack : %s, status %d ##", 5325fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren dump_a2dp_ctrl_event(btif_media_cb.a2dp_cmd_pending), status); 5335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* sanity check */ 5355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.a2dp_cmd_pending == A2DP_CTRL_CMD_NONE) 5365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 537e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("warning : no command pending, ignore ack"); 5385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* clear pending */ 5425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.a2dp_cmd_pending = A2DP_CTRL_CMD_NONE; 5435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* acknowledge start request */ 5455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &ack, 1); 5465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 5475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_recv_ctrl_data(void) 5505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 cmd = 0; 5525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int n; 5535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project n = UIPC_Read(UIPC_CH_ID_AV_CTRL, NULL, &cmd, 1); 5545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* detach on ctrl channel means audioflinger process was terminated */ 5565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (n == 0) 5575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 558e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("CTRL CH DETACHED"); 5595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Close(UIPC_CH_ID_AV_CTRL); 5605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we can operate only on datachannel, if af client wants to 5615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do send additional commands the ctrl channel would be reestablished */ 5625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //btif_audiopath_detached(); 5635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 566e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s", dump_a2dp_ctrl_event(cmd)); 5675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.a2dp_cmd_pending = cmd; 5695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5708bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh switch (cmd) 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case A2DP_CTRL_CMD_CHECK_READY: 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (media_task_running == MEDIA_TASK_STATE_SHUTTING_DOWN) 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 576aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov APPL_TRACE_WARNING("%s: A2DP command %s while media task shutting down", 577aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov __func__, dump_a2dp_ctrl_event(cmd)); 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 5805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check whether av is ready to setup a2dp datapath */ 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((btif_av_stream_ready() == TRUE) || (btif_av_stream_started_ready() == TRUE)) 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 589aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov APPL_TRACE_WARNING("%s: A2DP command %s while AV stream is not ready", 590aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov __func__, dump_a2dp_ctrl_event(cmd)); 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case A2DP_CTRL_CMD_START: 5969c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta /* Don't sent START request to stack while we are in call. 5979c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta Some headsets like the Sony MW600, don't allow AVDTP START 5989c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta in call and respond BAD_STATE. */ 5999c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta if (!btif_hf_is_call_idle()) 6009c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta { 6019c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta a2dp_cmd_acknowledge(A2DP_CTRL_ACK_INCALL_FAILURE); 6029c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta break; 6039c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta } 6045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 605d14f97c87685e480ee1a88829497651bccf2b358Ayan Ghosh if (alarm_is_scheduled(btif_media_cb.media_alarm)) 606d14f97c87685e480ee1a88829497651bccf2b358Ayan Ghosh { 607aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov APPL_TRACE_WARNING("%s: A2DP command %s when media alarm already scheduled", 608aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov __func__, dump_a2dp_ctrl_event(cmd)); 609d14f97c87685e480ee1a88829497651bccf2b358Ayan Ghosh a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 610d14f97c87685e480ee1a88829497651bccf2b358Ayan Ghosh break; 611d14f97c87685e480ee1a88829497651bccf2b358Ayan Ghosh } 612d14f97c87685e480ee1a88829497651bccf2b358Ayan Ghosh 6135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_av_stream_ready() == TRUE) 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* setup audio data channel listener */ 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb); 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* post start event and wait for audio path to open */ 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_dispatch_sm_event(BTIF_AV_START_STREAM_REQ_EVT, NULL, 0); 620ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach 621ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach#if (BTA_AV_SINK_INCLUDED == TRUE) 622ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach if (btif_media_cb.peer_sep == AVDT_TSEP_SRC) 623ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 624ae13ec986e188d66eaad3c69bb916ea18c142fefAndre Eisenbach#endif 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (btif_av_stream_started_ready()) 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* already started, setup audio data channel listener 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project and ack back immediately */ 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb); 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 636aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov APPL_TRACE_WARNING("%s: A2DP command %s while AV stream is not ready", 637aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov __func__, dump_a2dp_ctrl_event(cmd)); 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case A2DP_CTRL_CMD_STOP: 64478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (btif_media_cb.peer_sep == AVDT_TSEP_SNK && 64578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov (!alarm_is_scheduled(btif_media_cb.media_alarm))) 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we are already stopped, just ack back */ 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_dispatch_sm_event(BTIF_AV_STOP_STREAM_REQ_EVT, NULL, 0); 6533e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case A2DP_CTRL_CMD_SUSPEND: 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* local suspend */ 6585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_av_stream_started_ready()) 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_dispatch_sm_event(BTIF_AV_SUSPEND_STREAM_REQ_EVT, NULL, 0); 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if we are not in started state, just ack back ok and let 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project audioflinger close the channel. This can happen if we are 6669c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta remotely suspended, clear REMOTE SUSPEND Flag */ 6679c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta btif_av_clear_remote_suspend_flag(); 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6723e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood case A2DP_CTRL_GET_AUDIO_CONFIG: 6733e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood { 6743e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood uint32_t sample_rate = btif_media_cb.sample_rate; 6753e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood uint8_t channel_count = btif_media_cb.channel_count; 6763e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 6773e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 6783e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, (UINT8 *)&sample_rate, 4); 6793e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood UIPC_Send(UIPC_CH_ID_AV_CTRL, 0, &channel_count, 1); 6803e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood break; 6813e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 6823e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 68347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule case A2DP_CTRL_CMD_OFFLOAD_START: 68447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule btif_dispatch_sm_event(BTIF_AV_OFFLOAD_START_REQ_EVT, NULL, 0); 68547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule break; 68647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 688e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("UNSUPPORTED CMD (%d)", cmd); 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 692e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("a2dp-ctrl-cmd : %s DONE", dump_a2dp_ctrl_event(cmd)); 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_ctrl_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event) 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 6975cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(ch_id); 6985cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 699e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("A2DP-CTRL-CHANNEL EVENT %s", dump_uipc_event(event)); 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7018bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh switch (event) 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UIPC_OPEN_EVT: 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* fetch av statemachine handle */ 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.av_sm_hdl = btif_av_get_sm_handle(); 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UIPC_CLOSE_EVT: 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* restart ctrl server unless we are shutting down */ 7105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (media_task_running == MEDIA_TASK_STATE_ON) 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb); 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UIPC_RX_DATA_READY_EVT: 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_recv_ctrl_data(); 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default : 719e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("### A2DP-CTRL-CHANNEL EVENT %d NOT HANDLED ###", event); 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_data_cb(tUIPC_CH_ID ch_id, tUIPC_EVENT event) 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7265cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(ch_id); 7275cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 728e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("BTIF MEDIA (A2DP-DATA) EVENT %s", dump_uipc_event(event)); 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7308bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh switch (event) 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UIPC_OPEN_EVT: 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* read directly from media task from here on (keep callback for 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project connection events */ 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REG_REMOVE_ACTIVE_READSET, NULL); 73701c686ce0051433d75605ff9ca4c3b7388ce3b6bZhihai Xu UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_SET_READ_POLL_TMO, 73801c686ce0051433d75605ff9ca4c3b7388ce3b6bZhihai Xu (void *)A2DP_DATA_READ_POLL_MS); 7395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7403e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_media_cb.peer_sep == AVDT_TSEP_SNK) { 7413e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood /* Start the media task to encode SBC */ 7423e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_media_task_start_aa_req(); 7433e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 7443e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood /* make sure we update any changed sbc encoder params */ 7453e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_a2dp_encoder_update(); 7463e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood } 7473e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_media_cb.data_channel_open = TRUE; 7485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ack back when media task is fully started */ 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case UIPC_CLOSE_EVT: 7535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_audiopath_detached(); 7553e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_media_cb.data_channel_open = FALSE; 7565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default : 759e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("### A2DP-DATA EVENT %d NOT HANDLED ###", event); 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 7665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** BTIF ADAPTATION 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 769b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agrenstatic UINT16 btif_media_task_get_sbc_rate(void) 770b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren{ 7715f308397b7fe8a8da3f88b0f8910c3863ed1ec0bSridhar Vashist UINT16 rate = BTIF_A2DP_DEFAULT_BITRATE; 772b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 773b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren /* restrict bitrate if a2dp link is non-edr */ 774b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren if (!btif_av_is_peer_edr()) 775b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren { 776b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren rate = BTIF_A2DP_NON_EDR_MAX_RATE; 777e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("non-edr a2dp sink detected, restrict rate to %d", rate); 778b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren } 779b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 780b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren return rate; 781b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren} 782b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_encoder_init(void) 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 minmtu; 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_INIT_AUDIO msg; 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_SBC_CIE sbc_config; 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* lookup table for converting channel mode */ 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 codec_mode_tbl[5] = { SBC_JOINT_STEREO, SBC_STEREO, SBC_DUAL, 0, SBC_MONO }; 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* lookup table for converting number of blocks */ 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 codec_block_tbl[5] = { 16, 12, 8, 0, 4 }; 7945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* lookup table to convert freq */ 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 freq_block_tbl[5] = { SBC_sf48000, SBC_sf44100, SBC_sf32000, 0, SBC_sf16000 }; 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 798e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("btif_a2dp_encoder_init"); 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Retrieve the current SBC configuration (default if currently not used) */ 8015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu); 8025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.NumOfSubBands = (sbc_config.num_subbands == A2D_SBC_IE_SUBBAND_4) ? 4 : 8; 8035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.NumOfBlocks = codec_block_tbl[sbc_config.block_len >> 5]; 8045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.AllocationMethod = (sbc_config.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L) ? SBC_LOUDNESS : SBC_SNR; 8055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.ChannelMode = codec_mode_tbl[sbc_config.ch_mode >> 1]; 8065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.SamplingFreq = freq_block_tbl[sbc_config.samp_freq >> 5]; 8075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.MtuSize = minmtu; 8085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 809e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("msg.ChannelMode %x", msg.ChannelMode); 8105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Init the media task to encode SBC properly */ 8125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_enc_init_req(&msg); 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_a2dp_encoder_update(void) 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 minmtu; 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_SBC_CIE sbc_config; 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_UPDATE_AUDIO msg; 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 pref_min; 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 pref_max; 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 823e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("btif_a2dp_encoder_update"); 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Retrieve the current SBC configuration (default if currently not used) */ 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_get_sbc_config(&sbc_config, &minmtu); 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 828e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("btif_a2dp_encoder_update: Common min_bitpool:%d(0x%x) max_bitpool:%d(0x%x)", 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_config.min_bitpool, sbc_config.min_bitpool, 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_config.max_bitpool, sbc_config.max_bitpool); 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sbc_config.min_bitpool > sbc_config.max_bitpool) 8335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 834e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("btif_a2dp_encoder_update: ERROR btif_a2dp_encoder_update min_bitpool > max_bitpool"); 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if remote sink has a preferred bitpool range */ 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_get_remote_bitpool_pref(&pref_min, &pref_max) == TRUE) 8395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* adjust our preferred bitpool with the remote preference if within 8415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project our capable range */ 8425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pref_min < sbc_config.min_bitpool) 8445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pref_min = sbc_config.min_bitpool; 8455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (pref_max > sbc_config.max_bitpool) 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pref_max = sbc_config.max_bitpool; 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.MinBitPool = pref_min; 8505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.MaxBitPool = pref_max; 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((pref_min != sbc_config.min_bitpool) || (pref_max != sbc_config.max_bitpool)) 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 854e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("## adjusted our bitpool range to peer pref [%d:%d] ##", 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pref_min, pref_max); 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.MinBitPool = sbc_config.min_bitpool; 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.MaxBitPool = sbc_config.max_bitpool; 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project msg.MinMtuSize = minmtu; 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Update the media task to encode SBC properly */ 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_enc_update_req(&msg); 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 870e13fbfafe2105d264357ac41133f0ac0e054429cSharvil Nanavatibool btif_a2dp_start_media_task(void) 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (media_task_running != MEDIA_TASK_STATE_OFF) 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 874e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("warning : media task already running"); 875e13fbfafe2105d264357ac41133f0ac0e054429cSharvil Nanavati return false; 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 878753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton APPL_TRACE_EVENT("## A2DP START MEDIA THREAD ##"); 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 880860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton btif_media_cmd_msg_queue = fixed_queue_new(SIZE_MAX); 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* start a2dp media task */ 88323e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati worker_thread = thread_new("media_worker"); 88423e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati if (worker_thread == NULL) 885753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton goto error_exit; 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 88723e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati fixed_queue_register_dequeue(btif_media_cmd_msg_queue, 88823e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati thread_get_reactor(worker_thread), 88923e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati btif_media_thread_handle_cmd, 89023e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati NULL); 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 89223e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati thread_post(worker_thread, btif_media_thread_init, NULL); 893753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton APPL_TRACE_EVENT("## A2DP MEDIA THREAD STARTED ##"); 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 895e13fbfafe2105d264357ac41133f0ac0e054429cSharvil Nanavati return true; 8965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 897753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton error_exit:; 898753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton APPL_TRACE_ERROR("%s unable to start up media thread", __func__); 899e13fbfafe2105d264357ac41133f0ac0e054429cSharvil Nanavati return false; 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_stop_media_task(void) 9035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 904753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton APPL_TRACE_EVENT("## A2DP STOP MEDIA THREAD ##"); 905753173dee0b92efdbdc0eb4d44338cd1a84dbdb2Chris Manton 9061f293a50abf0bd37d149604c674ae5a6dbab7750Nitin Arora // Stop timer 9071f293a50abf0bd37d149604c674ae5a6dbab7750Nitin Arora alarm_free(btif_media_cb.media_alarm); 9081f293a50abf0bd37d149604c674ae5a6dbab7750Nitin Arora btif_media_cb.media_alarm = NULL; 9091f293a50abf0bd37d149604c674ae5a6dbab7750Nitin Arora 9101f293a50abf0bd37d149604c674ae5a6dbab7750Nitin Arora // Exit thread 91123e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati fixed_queue_free(btif_media_cmd_msg_queue, NULL); 9121a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov btif_media_cmd_msg_queue = NULL; 91323e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati thread_post(worker_thread, btif_media_thread_cleanup, NULL); 91423e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati thread_free(worker_thread); 91523e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati worker_thread = NULL; 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_on_init 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_init(void) 9295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 930597ce3bd08533c24cd61be0ef4ad8a237571770fDimitry Ivanov#ifdef USE_AUDIO_TRACK 931547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal btif_media_cb.rx_audio_focus_state = BTIF_MEDIA_FOCUS_NOT_GRANTED; 932968265f3f4408ee5edb08628a1fccb8a995ba87eSanket Agarwal btif_media_cb.audio_track = NULL; 933597ce3bd08533c24cd61be0ef4ad8a237571770fDimitry Ivanov#endif 9345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 9385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_setup_codec 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_setup_codec(void) 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_MEDIA_FEEDINGS media_feeding; 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_STATUS status; 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 952e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("## A2DP SETUP CODEC ##"); 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9541eb1ea0cf2da992a3193506806e571dcbe3ec947Pavlin Radoslavov mutex_global_lock(); 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 956b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren /* for now hardcode 44.1 khz 16 bit stereo PCM format */ 95747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule media_feeding.cfg.pcm.sampling_freq = BTIF_A2DP_SRC_SAMPLING_RATE; 95847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule media_feeding.cfg.pcm.bit_per_sample = BTIF_A2DP_SRC_BIT_DEPTH; 95947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule media_feeding.cfg.pcm.num_channel = BTIF_A2DP_SRC_NUM_CHANNELS; 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project media_feeding.format = BTIF_AV_CODEC_PCM; 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_audio_set_codec(&media_feeding, &status)) 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_INIT_AUDIO_FEEDING mfeed; 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Init the encoding task */ 9675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_encoder_init(); 9685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Build the media task configuration */ 9705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mfeed.feeding = media_feeding; 9715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project mfeed.feeding_mode = BTIF_AV_FEEDING_ASYNCHRONOUS; 9725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Send message to Media task to configure transcoding */ 9735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_audio_feeding_init_req(&mfeed); 9745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9761eb1ea0cf2da992a3193506806e571dcbe3ec947Pavlin Radoslavov mutex_global_unlock(); 9775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_on_idle 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_idle(void) 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 992968265f3f4408ee5edb08628a1fccb8a995ba87eSanket Agarwal APPL_TRACE_EVENT("## ON A2DP IDLE ## peer_sep = %d", btif_media_cb.peer_sep); 9933e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_media_cb.peer_sep == AVDT_TSEP_SNK) 994f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 995f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* Make sure media task is stopped */ 996f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_task_stop_aa_req(); 997f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_init(); 10006718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE) 10013e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_media_cb.peer_sep == AVDT_TSEP_SRC) 1002f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1003f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_cb.rx_flush = TRUE; 1004f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_task_aa_rx_flush_req(); 1005c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati btif_media_task_aa_handle_stop_decoding(); 1006f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_task_clear_track(); 1007e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Stopped BT track"); 1008f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1009f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 10135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_on_open 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 10175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_open(void) 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1024e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("## ON A2DP OPEN ##"); 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* always use callback to notify socket events */ 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb); 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1030f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/******************************************************************************* 1031f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 1032f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function btif_media_task_clear_track 1033f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 1034f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description 1035f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 1036f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns TRUE is success 1037f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 1038f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/ 1039f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaBOOLEAN btif_media_task_clear_track(void) 1040f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 10415fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BT_HDR *p_buf = osi_malloc(sizeof(BT_HDR)); 1042f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1043f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_buf->event = BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK; 1044860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf); 10455fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov 1046f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return TRUE; 1047f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 1048f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1049f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/***************************************************************************** 1050f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 1051f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Function btif_reset_decoder 1052f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 1053f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Description 1054f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 1055f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** Returns 1056f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta** 1057f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta*******************************************************************************/ 1058f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1059f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptavoid btif_reset_decoder(UINT8 *p_av) 1060f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 10615fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf = 10625fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov osi_malloc(sizeof(tBTIF_MEDIA_SINK_CFG_UPDATE)); 10635fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov 1064e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("btif_reset_decoder"); 1065e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("btif_reset_decoder p_codec_info[%x:%x:%x:%x:%x:%x]", 1066f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_av[1], p_av[2], p_av[3], 1067f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_av[4], p_av[5], p_av[6]); 1068f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1069f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta memcpy(p_buf->codec_info,p_av, AVDT_CODEC_SIZE); 1070f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_buf->hdr.event = BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE; 1071f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1072860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf); 1073f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 1074f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_on_started 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1085379743beded881127703334e1dda2cd327ec651dZhihai XuBOOLEAN btif_a2dp_on_started(tBTA_AV_START *p_av, BOOLEAN pending_start) 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1087379743beded881127703334e1dda2cd327ec651dZhihai Xu BOOLEAN ack = FALSE; 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1089e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("## ON A2DP STARTED ##"); 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10915fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren if (p_av == NULL) 10925fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren { 10935fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren /* ack back a local start request */ 10945fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 1095379743beded881127703334e1dda2cd327ec651dZhihai Xu return TRUE; 10965fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren } 10975fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->status == BTA_AV_SUCCESS) 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->suspending == FALSE) 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->initiator) 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1104379743beded881127703334e1dda2cd327ec651dZhihai Xu if (pending_start) { 1105379743beded881127703334e1dda2cd327ec651dZhihai Xu a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 1106379743beded881127703334e1dda2cd327ec651dZhihai Xu ack = TRUE; 1107379743beded881127703334e1dda2cd327ec651dZhihai Xu } 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* we were remotely started, make sure codec 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project is setup before datapath is started */ 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_a2dp_setup_codec(); 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* media task is autostarted upon a2dp audiopath connection */ 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1119379743beded881127703334e1dda2cd327ec651dZhihai Xu else if (pending_start) 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1121aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov APPL_TRACE_WARNING("%s: A2DP start request failed: status = %d", 1122aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov __func__, p_av->status); 11235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 1124379743beded881127703334e1dda2cd327ec651dZhihai Xu ack = TRUE; 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1126379743beded881127703334e1dda2cd327ec651dZhihai Xu return ack; 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11325fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Function btif_a2dp_ack_fail 11335fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** 11345fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Description 11355fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** 11365fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** Returns 11375fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** 11385fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren*******************************************************************************/ 11395fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 11405fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agrenvoid btif_a2dp_ack_fail(void) 11415fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren{ 1142e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("## A2DP_CTRL_ACK_FAILURE ##"); 11435fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 11445fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren} 11455fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 11465fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren/***************************************************************************** 11475fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren** 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_on_stopped 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_stopped(tBTA_AV_SUSPEND *p_av) 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1158e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("## ON A2DP STOPPED ##"); 11593e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_media_cb.peer_sep == AVDT_TSEP_SRC) /* Handling for A2DP SINK cases*/ 1160f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1161f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_cb.rx_flush = TRUE; 1162f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_task_aa_rx_flush_req(); 1163c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati btif_media_task_aa_handle_stop_decoding(); 11646b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifndef USE_AUDIO_TRACK 11653e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood UIPC_Close(UIPC_CH_ID_AV_AUDIO); 11666b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 11673e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_media_cb.data_channel_open = FALSE; 1168f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return; 1169f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* allow using this api for other than suspend */ 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av != NULL) 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->status != BTA_AV_SUCCESS) 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1175e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("AV STOP FAILED (%d)", p_av->status); 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1177aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov if (p_av->initiator) { 1178aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov APPL_TRACE_WARNING("%s: A2DP stop request failed: status = %d", 1179aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov __func__, p_av->status); 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 1181aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov } 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ensure tx frames are immediately suspended */ 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.tx_flush = 1; 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* request to stop media task */ 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_aa_tx_flush_req(); 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_stop_aa_req(); 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* once stream is fully stopped we will ack back */ 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Function btif_a2dp_on_suspended 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Description 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Returns 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*******************************************************************************/ 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_on_suspended(tBTA_AV_SUSPEND *p_av) 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1209e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("## ON A2DP SUSPENDED ##"); 12103e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (btif_media_cb.peer_sep == AVDT_TSEP_SRC) 1211f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1212f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_cb.rx_flush = TRUE; 1213f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_task_aa_rx_flush_req(); 1214c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati btif_media_task_aa_handle_stop_decoding(); 12156b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifndef USE_AUDIO_TRACK 12166b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta UIPC_Close(UIPC_CH_ID_AV_AUDIO); 12176b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 1218f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return; 1219f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check for status failures */ 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_av->status != BTA_AV_SUCCESS) 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1224aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov if (p_av->initiator == TRUE) { 1225aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov APPL_TRACE_WARNING("%s: A2DP suspend request failed: status = %d", 1226aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov __func__, p_av->status); 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2dp_cmd_acknowledge(A2DP_CTRL_ACK_FAILURE); 1228aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov } 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* once stream is fully stopped we will ack back */ 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* ensure tx frames are immediately flushed */ 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.tx_flush = 1; 12355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop timer tick */ 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_stop_aa_req(); 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 124047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 124147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule/***************************************************************************** 124247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** 124347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** Function btif_a2dp_on_offload_started 124447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** 124547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** Description 124647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** 124747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** Returns 124847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule** 124947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule*******************************************************************************/ 125047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsulevoid btif_a2dp_on_offload_started(tBTA_AV_STATUS status) 125147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule{ 125247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule tA2DP_CTRL_ACK ack; 125347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule APPL_TRACE_EVENT("%s status %d", __func__, status); 125447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 125547b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule switch (status) { 125647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule case BTA_AV_SUCCESS: 125747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule ack = A2DP_CTRL_ACK_SUCCESS; 125847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule break; 125947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 126047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule case BTA_AV_FAIL_RESOURCES: 126147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule APPL_TRACE_ERROR("%s FAILED UNSUPPORTED", __func__); 126247b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule ack = A2DP_CTRL_ACK_UNSUPPORTED; 126347b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule break; 126447b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule default: 1265aee67ece726e9b5d0e2e02562fe013ae85c46d63Pavlin Radoslavov APPL_TRACE_ERROR("%s FAILED: status = %d", __func__, status); 126647b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule ack = A2DP_CTRL_ACK_FAILURE; 126747b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule break; 126847b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule } 126947b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule a2dp_cmd_acknowledge(ack); 127047b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule} 127147b4310e6aa9a508b47e6cd4631327c53b464440Abhijit Adsule 1272f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/* when true media task discards any rx frames */ 1273f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptavoid btif_a2dp_set_rx_flush(BOOLEAN enable) 1274f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 1275e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("## DROP RX %d ##", enable); 1276f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_cb.rx_flush = enable; 1277f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 1278f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* when true media task discards any tx frames */ 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid btif_a2dp_set_tx_flush(BOOLEAN enable) 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1282e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("## DROP TX %d ##", enable); 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.tx_flush = enable; 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12866b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 12876b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Guptavoid btif_a2dp_set_audio_focus_state(btif_media_audio_focus_state state) 12886b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta{ 12895fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tBTIF_MEDIA_SINK_FOCUS_UPDATE *p_buf = 12905fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov osi_malloc(sizeof(tBTIF_MEDIA_SINK_FOCUS_UPDATE)); 12915fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov 12925fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov APPL_TRACE_EVENT("%s", __func__); 12936b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 12946b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta p_buf->focus_state = state; 12956b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta p_buf->hdr.event = BTIF_MEDIA_AUDIO_SINK_SET_FOCUS_STATE; 12966b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf); 12976b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta} 129838487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal 129938487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwalvoid btif_a2dp_set_audio_track_gain(float gain) 130038487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal{ 130138487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal APPL_TRACE_DEBUG("%s set gain to %f", __func__, gain); 130238487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal BtifAvrcpSetAudioTrackGain(btif_media_cb.audio_track, gain); 130338487b9f71842a294b9a56843efcfa3a3d672822Sanket Agarwal} 13046b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 13056b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 13066718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE) 130723e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context) 1308f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 1309f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta tBT_SBC_HDR *p_msg; 1310f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta int num_sbc_frames; 1311f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta int num_frames_to_process; 1312f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 13131a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov if (fixed_queue_is_empty(btif_media_cb.RxSbcQ)) 1314f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1315e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" QUE EMPTY "); 1316f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1317f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else 1318f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 13196b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 1320547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal /* Don't Do anything in case of Not granted */ 1321547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal if (btif_media_cb.rx_audio_focus_state == BTIF_MEDIA_FOCUS_NOT_GRANTED) 13226b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta { 1323547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal APPL_TRACE_DEBUG("%s skipping frames since focus is not present.", __func__); 1324547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal return; 13256b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 1326547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal /* play only in BTIF_MEDIA_FOCUS_GRANTED case */ 13276b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 1328f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (btif_media_cb.rx_flush == TRUE) 1329f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 13301a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov btif_media_flush_q(btif_media_cb.RxSbcQ); 1331f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return; 1332f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1333f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1334f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_frames_to_process = btif_media_cb.frames_to_process; 1335e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Process Frames + "); 1336f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1337f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta do 1338f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 13391a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov p_msg = (tBT_SBC_HDR *)fixed_queue_try_peek_first(btif_media_cb.RxSbcQ); 1340f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (p_msg == NULL) 1341f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return; 1342f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_sbc_frames = p_msg->num_frames_to_be_processed; /* num of frames in Que Packets */ 1343e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Frames left in topmost packet %d", num_sbc_frames); 1344e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Remaining frames to process in tick %d", num_frames_to_process); 13451a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov APPL_TRACE_DEBUG(" Num of Packets in Que %d", 13461a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_length(btif_media_cb.RxSbcQ)); 1347f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1348f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if ( num_sbc_frames > num_frames_to_process) /* Que Packet has more frames*/ 1349f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1350f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_msg->num_frames_to_be_processed= num_frames_to_process; 1351f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_task_handle_inc_media(p_msg); 1352f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_msg->num_frames_to_be_processed = num_sbc_frames - num_frames_to_process; 1353f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_frames_to_process = 0; 1354f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 1355f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1356f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta else /* Que packet has less frames */ 1357f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1358f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_task_handle_inc_media(p_msg); 13591a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov p_msg = (tBT_SBC_HDR *)fixed_queue_try_dequeue(btif_media_cb.RxSbcQ); 1360f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if( p_msg == NULL ) 1361f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1362e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Insufficient data in que "); 1363f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 1364f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1365f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_frames_to_process = num_frames_to_process - p_msg->num_frames_to_be_processed; 1366abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_msg); 1367f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1368547b7b52578fddbd9e42ce1cc7e7bba9dded1d7dSanket Agarwal } while(num_frames_to_process > 0); 1369f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 1370e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Process Frames - "); 1371f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1372f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 137323e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati#else 137423e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_task_avk_handle_timer(UNUSED_ATTR void *context) {} 1375f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 1376f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 137723e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_task_aa_handle_timer(UNUSED_ATTR void *context) 13785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1379ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t timestamp_us = time_now_us(); 1380ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov log_tstamps_us("media task tx timer", timestamp_us); 13815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 138378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (alarm_is_scheduled(btif_media_cb.media_alarm)) 1384e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta { 1385ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_send_aa_frame(timestamp_us); 1386e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta } 1387e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta else 1388e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta { 1389e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("ERROR Media task Scheduled after Suspend"); 1390e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta } 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_handle_uipc_rx_rdy(void) 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* process all the UIPC data */ 1398ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_aa_prep_2_send(0xFF, time_now_us()); 13995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* send it */ 1401ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov LOG_VERBOSE(LOG_TAG, "%s calls bta_av_ci_src_data_ready", __func__); 14025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO); 14035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 140623e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_thread_init(UNUSED_ATTR void *context) { 14078bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh // Check to make sure the platform has 8 bits/byte since 14088bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh // we're using that in frame size calculations now. 14098bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh assert(CHAR_BIT == 8); 14108bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 141123e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati memset(&btif_media_cb, 0, sizeof(btif_media_cb)); 14124e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov btif_media_cb.stats.session_start_us = time_now_us(); 14134e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov 141423e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati UIPC_Init(NULL); 14155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 14171a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov btif_media_cb.TxAaQ = fixed_queue_new(SIZE_MAX); 14181a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov btif_media_cb.RxSbcQ = fixed_queue_new(SIZE_MAX); 141923e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb); 1420f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 1421f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 142223e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati raise_priority_a2dp(TASK_HIGH_MEDIA); 142323e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati media_task_running = MEDIA_TASK_STATE_ON; 142423e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati} 1425f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 142623e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_thread_cleanup(UNUSED_ATTR void *context) { 142723e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati /* make sure no channels are restarted while shutting down */ 142823e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati media_task_running = MEDIA_TASK_STATE_SHUTTING_DOWN; 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 143023e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati /* this calls blocks until uipc is fully closed */ 143123e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati UIPC_Close(UIPC_CH_ID_ALL); 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14331a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov#if (BTA_AV_INCLUDED == TRUE) 14341a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_free(btif_media_cb.TxAaQ, NULL); 1435cb090050e3f45905a33f595cee9e12b3e2c66e86Pavlin Radoslavov btif_media_cb.TxAaQ = NULL; 14361a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_free(btif_media_cb.RxSbcQ, NULL); 1437cb090050e3f45905a33f595cee9e12b3e2c66e86Pavlin Radoslavov btif_media_cb.RxSbcQ = NULL; 14381a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov#endif 14391a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov 144023e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati /* Clear media task flag */ 144123e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati media_task_running = MEDIA_TASK_STATE_OFF; 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_send_cmd_evt 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_send_cmd_evt(UINT16 Evt) 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14555fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BT_HDR *p_buf = osi_malloc(sizeof(BT_HDR)); 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->event = Evt; 1458860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf); 14595fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_flush_q 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 14721a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavovstatic void btif_media_flush_q(fixed_queue_t *p_q) 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14741a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov while (! fixed_queue_is_empty(p_q)) 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1476abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(fixed_queue_try_dequeue(p_q)); 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 148023e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavatistatic void btif_media_thread_handle_cmd(fixed_queue_t *queue, UNUSED_ATTR void *context) 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 148223e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati BT_HDR *p_msg = (BT_HDR *)fixed_queue_dequeue(queue); 1483db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_VERBOSE(LOG_TAG, "btif_media_thread_handle_cmd : %d %s", p_msg->event, 14845fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren dump_media_event(p_msg->event)); 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_msg->event) 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_START_AA_TX: 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_aa_start_tx(); 14915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_STOP_AA_TX: 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_aa_stop_tx(); 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_SBC_ENC_INIT: 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_enc_init(p_msg); 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_SBC_ENC_UPDATE: 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_enc_update(p_msg); 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_AUDIO_FEEDING_INIT: 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_audio_feeding_init(p_msg); 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_FLUSH_AA_TX: 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_aa_tx_flush(p_msg); 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_UIPC_RX_RDY: 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_aa_handle_uipc_rx_rdy(); 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 15106b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 15116b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta case BTIF_MEDIA_AUDIO_SINK_SET_FOCUS_STATE: 15126b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta if(!btif_av_is_connected()) 15136b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta break; 15146b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_media_cb.rx_audio_focus_state = ((tBTIF_MEDIA_SINK_FOCUS_UPDATE *)p_msg)->focus_state; 15156b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta APPL_TRACE_DEBUG("Setting focus state to %d ",btif_media_cb.rx_audio_focus_state); 15166b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta break; 15176b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 1518f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case BTIF_MEDIA_AUDIO_SINK_CFG_UPDATE: 15196718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE) 1520f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_task_aa_handle_decoder_reset(p_msg); 1521f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 1522f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 1523f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case BTIF_MEDIA_AUDIO_SINK_CLEAR_TRACK: 15246718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE) 1525f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_task_aa_handle_clear_track(); 1526f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 1527f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 1528f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case BTIF_MEDIA_FLUSH_AA_RX: 1529f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_task_aa_rx_flush(); 1530f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 153323e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati APPL_TRACE_ERROR("ERROR in %s unknown event %d", __func__, p_msg->event); 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1535abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_msg); 1536db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_VERBOSE(LOG_TAG, "%s: %s DONE", __func__, dump_media_event(p_msg->event)); 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15396718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE) 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1542f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function btif_media_task_handle_inc_media 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 1549f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_handle_inc_media(tBT_SBC_HDR*p_msg) 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1551f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT8 *sbc_start_frame = ((UINT8*)(p_msg + 1) + p_msg->offset + 1); 1552f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta int count; 1553f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT32 pcmBytes, availPcmBytes; 1554f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta OI_INT16 *pcmDataPointer = pcmData; /*Will be overwritten on next packet receipt*/ 1555f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta OI_STATUS status; 1556f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta int num_sbc_frames = p_msg->num_frames_to_be_processed; 1557f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta UINT32 sbc_frame_len = p_msg->len - 1; 15586b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta availPcmBytes = sizeof(pcmData); 1559f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 15603e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if ((btif_media_cb.peer_sep == AVDT_TSEP_SNK) || (btif_media_cb.rx_flush)) 1561f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1562e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" State Changed happened in this tick "); 1563f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return; 1564f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 15656b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifndef USE_AUDIO_TRACK 15663e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood // ignore data if no one is listening 15673e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood if (!btif_media_cb.data_channel_open) 15686b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta { 15696b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta APPL_TRACE_ERROR("%s Channel not open, returning", __func__); 15703e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood return; 15716b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 15726b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 15736b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta APPL_TRACE_DEBUG("%s Number of sbc frames %d, frame_len %d", 15746b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta __func__, num_sbc_frames, sbc_frame_len); 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1576f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta for(count = 0; count < num_sbc_frames && sbc_frame_len != 0; count ++) 1577f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 1578f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta pcmBytes = availPcmBytes; 1579ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta status = OI_CODEC_SBC_DecodeFrame(&context, (const OI_BYTE**)&sbc_start_frame, 1580ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta (OI_UINT32 *)&sbc_frame_len, 1581ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta (OI_INT16 *)pcmDataPointer, 1582ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta (OI_UINT32 *)&pcmBytes); 1583f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (!OI_SUCCESS(status)) { 1584e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("Decoding failure: %d\n", status); 1585f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 1586f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 1587f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta availPcmBytes -= pcmBytes; 1588f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta pcmDataPointer += pcmBytes/2; 1589f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_msg->offset += (p_msg->len - 1) - sbc_frame_len; 1590f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_msg->len = sbc_frame_len + 1; 1591f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15936b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 15946b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BtifAvrcpAudioTrackWriteData( 15956b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_media_cb.audio_track, (void*)pcmData, (sizeof(pcmData) - availPcmBytes)); 15966b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#else 15976b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta UIPC_Send(UIPC_CH_ID_AV_AUDIO, 0, (UINT8 *)pcmData, (sizeof(pcmData) - availPcmBytes)); 15986b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 1599f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 1600f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if (BTA_AV_INCLUDED == TRUE) 16035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_enc_init_req 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_enc_init_req(tBTIF_MEDIA_INIT_AUDIO *p_msg) 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16145fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tBTIF_MEDIA_INIT_AUDIO *p_buf = osi_malloc(sizeof(tBTIF_MEDIA_INIT_AUDIO)); 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO)); 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_INIT; 1618860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf); 16195fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_enc_update_req 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_enc_update_req(tBTIF_MEDIA_UPDATE_AUDIO *p_msg) 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16345fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tBTIF_MEDIA_UPDATE_AUDIO *p_buf = 16355fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov osi_malloc(sizeof(tBTIF_MEDIA_UPDATE_AUDIO)); 16365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_UPDATE_AUDIO)); 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->hdr.event = BTIF_MEDIA_SBC_ENC_UPDATE; 1639860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf); 16405fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_audio_feeding_init_req 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_audio_feeding_init_req(tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_msg) 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16555fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_buf = 16565fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov osi_malloc(sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING)); 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_buf, p_msg, sizeof(tBTIF_MEDIA_INIT_AUDIO_FEEDING)); 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->hdr.event = BTIF_MEDIA_AUDIO_FEEDING_INIT; 1660860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf); 16615fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_start_aa_req 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 16745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_start_aa_req(void) 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16765fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BT_HDR *p_buf = osi_malloc(sizeof(BT_HDR)); 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->event = BTIF_MEDIA_START_AA_TX; 1679860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf); 16805fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_stop_aa_req 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_stop_aa_req(void) 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16955fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BT_HDR *p_buf = osi_malloc(sizeof(BT_HDR)); 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->event = BTIF_MEDIA_STOP_AA_TX; 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1699caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov /* 1700caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov * Explicitly check whether the btif_media_cmd_msg_queue is not NULL to 1701caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov * avoid a race condition during shutdown of the Bluetooth stack. 1702caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov * This race condition is triggered when A2DP audio is streaming on 1703caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov * shutdown: 1704caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov * "btif_a2dp_on_stopped() -> btif_media_task_stop_aa_req()" is called 1705caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov * to stop the particular audio stream, and this happens right after 1706caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov * the "cleanup() -> btif_a2dp_stop_media_task()" processing during 1707caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov * the shutdown of the Bluetooth stack. 1708caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov */ 1709caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov if (btif_media_cmd_msg_queue != NULL) 1710caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf); 1711caaa00f5ede96461e11de866ac15f5224442d1ebPavlin Radoslavov 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1714f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/******************************************************************************* 1715f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 1716f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function btif_media_task_aa_rx_flush_req 1717f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 1718f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description 1719f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 1720f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns TRUE is success 1721f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 1722f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/ 1723f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaBOOLEAN btif_media_task_aa_rx_flush_req(void) 1724f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 17251a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov if (fixed_queue_is_empty(btif_media_cb.RxSbcQ)) /* Que is already empty */ 1726f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return TRUE; 1727f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 17285fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BT_HDR *p_buf = osi_malloc(sizeof(BT_HDR)); 1729f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_buf->event = BTIF_MEDIA_FLUSH_AA_RX; 1730860a9af89f8dbf8ef65785d5db960c1fa488d2baChris Manton fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf); 17315fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov 1732f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return TRUE; 1733f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_aa_tx_flush_req 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE is success 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_task_aa_tx_flush_req(void) 17455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1746abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov BT_HDR *p_buf = osi_malloc(sizeof(BT_HDR)); 1747197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->event = BTIF_MEDIA_FLUSH_AA_TX; 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1750197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov /* 1751197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov * Explicitly check whether the btif_media_cmd_msg_queue is not NULL to 1752197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov * avoid a race condition during shutdown of the Bluetooth stack. 1753197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov * This race condition is triggered when A2DP audio is streaming on 1754197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov * shutdown: 1755197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov * "btif_a2dp_on_stopped() -> btif_media_task_aa_tx_flush_req()" is called 1756197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov * to stop the particular audio stream, and this happens right after 1757197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov * the "cleanup() -> btif_a2dp_stop_media_task()" processing during 1758197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov * the shutdown of the Bluetooth stack. 1759197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov */ 1760197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov if (btif_media_cmd_msg_queue != NULL) 1761197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov fixed_queue_enqueue(btif_media_cmd_msg_queue, p_buf); 1762197ee6856b43d8eea137a7f37798ee2a012ce518Pavlin Radoslavov 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1765f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/******************************************************************************* 1766f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 1767f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function btif_media_task_aa_rx_flush 1768f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 1769f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description 1770f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 1771f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns void 1772f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 1773f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/ 1774f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_rx_flush(void) 1775f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 1776f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* Flush all enqueued GKI SBC buffers (encoded) */ 1777e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("btif_media_task_aa_rx_flush"); 1778f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 17791a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov btif_media_flush_q(btif_media_cb.RxSbcQ); 1780f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 1781f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_aa_tx_flush 17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_tx_flush(BT_HDR *p_msg) 17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17945cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_msg); 17955cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Flush all enqueued GKI music buffers (encoded) */ 1797e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("btif_media_task_aa_tx_flush"); 17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1799b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.counter = 0; 1800b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0; 1801b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 1802ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.tx_queue_total_flushed_messages += 1803ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov fixed_queue_length(btif_media_cb.TxAaQ); 1804ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.tx_queue_last_flushed_us = time_now_us(); 18051a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov btif_media_flush_q(btif_media_cb.TxAaQ); 18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Ioctl(UIPC_CH_ID_AV_AUDIO, UIPC_REQ_RX_FLUSH, NULL); 18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_enc_init 18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Initialize encoding task 18155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_init(BT_HDR *p_msg) 18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_INIT_AUDIO *pInitAudio = (tBTIF_MEDIA_INIT_AUDIO *) p_msg; 18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1823e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("btif_media_task_enc_init"); 18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.timestamp = 0; 18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* SBC encoder config (enforced even if not used) */ 18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16ChannelMode = pInitAudio->ChannelMode; 18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16NumOfSubBands = pInitAudio->NumOfSubBands; 18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16NumOfBlocks = pInitAudio->NumOfBlocks; 18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16AllocationMethod = pInitAudio->AllocationMethod; 18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16SamplingFreq = pInitAudio->SamplingFreq; 18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1834b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.encoder.u16BitRate = btif_media_task_get_sbc_rate(); 1835b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Default transcoding is PCM to SBC, modified by feeding configuration */ 18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC; 18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE-BTIF_MEDIA_AA_SBC_OFFSET-sizeof(BT_HDR)) 18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project < pInitAudio->MtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET 18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project - sizeof(BT_HDR)) : pInitAudio->MtuSize; 18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1842e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("btif_media_task_enc_init busy %d, mtu %d, peer mtu %d", 18435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.busy_level, btif_media_cb.TxAaMtuSize, pInitAudio->MtuSize); 1844e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT(" ch mode %d, subnd %d, nb blk %d, alloc %d, rate %d, freq %d", 18455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16ChannelMode, btif_media_cb.encoder.s16NumOfSubBands, 18465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16NumOfBlocks, 18475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate, 18485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16SamplingFreq); 18495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reset entirely the SBC encoder */ 18515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SBC_Encoder_Init(&(btif_media_cb.encoder)); 18528bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 18538bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.tx_sbc_frames = calculate_max_frames_per_packet(); 18548bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 18558bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s bit pool %d", __func__, btif_media_cb.encoder.s16BitPool); 18565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_enc_update 18615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Update encoding task 18635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 18655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 18675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_enc_update(BT_HDR *p_msg) 18695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_UPDATE_AUDIO * pUpdateAudio = (tBTIF_MEDIA_UPDATE_AUDIO *) p_msg; 18715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SBC_ENC_PARAMS *pstrEncParams = &btif_media_cb.encoder; 18725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 s16SamplingFreq; 1873a391bf1d4f4250e27b6f157a1a8d2493c36934dcAndre Eisenbach SINT16 s16BitPool = 0; 18745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16BitRate; 18755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SINT16 s16FrameLen; 18765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 protect = 0; 18775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 187878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov APPL_TRACE_DEBUG("%s : minmtu %d, maxbp %d minbp %d", __func__, 187978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov pUpdateAudio->MinMtuSize, pUpdateAudio->MaxBitPool, 188078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov pUpdateAudio->MinBitPool); 18815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18828bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (!pstrEncParams->s16NumOfSubBands) 18838bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh { 18848bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_WARNING("%s SubBands are set to 0, resetting to max (%d)", 18858bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, SBC_MAX_NUM_OF_SUBBANDS); 18868bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh pstrEncParams->s16NumOfSubBands = SBC_MAX_NUM_OF_SUBBANDS; 18878bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 18888bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 18898bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (!pstrEncParams->s16NumOfBlocks) 18908bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh { 18918bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_WARNING("%s Blocks are set to 0, resetting to max (%d)", 18928bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, SBC_MAX_NUM_OF_BLOCKS); 18938bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh pstrEncParams->s16NumOfBlocks = SBC_MAX_NUM_OF_BLOCKS; 18948bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 18958bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 18968bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (!pstrEncParams->s16NumOfChannels) 18978bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh { 18988bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_WARNING("%s Channels are set to 0, resetting to max (%d)", 18998bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, SBC_MAX_NUM_OF_CHANNELS); 19008bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh pstrEncParams->s16NumOfChannels = SBC_MAX_NUM_OF_CHANNELS; 19018bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 19028bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 190378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_media_cb.TxAaMtuSize = ((BTIF_MEDIA_AA_BUF_SIZE - 190478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov BTIF_MEDIA_AA_SBC_OFFSET - sizeof(BT_HDR)) 19058bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh < pUpdateAudio->MinMtuSize) ? (BTIF_MEDIA_AA_BUF_SIZE - BTIF_MEDIA_AA_SBC_OFFSET 19068bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh - sizeof(BT_HDR)) : pUpdateAudio->MinMtuSize; 19075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 190878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* Set the initial target bit rate */ 190978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov pstrEncParams->u16BitRate = btif_media_task_get_sbc_rate(); 19105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 191178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (pstrEncParams->s16SamplingFreq == SBC_sf16000) 191278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16SamplingFreq = 16000; 191378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov else if (pstrEncParams->s16SamplingFreq == SBC_sf32000) 191478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16SamplingFreq = 32000; 191578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov else if (pstrEncParams->s16SamplingFreq == SBC_sf44100) 191678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16SamplingFreq = 44100; 191778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov else 191878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16SamplingFreq = 48000; 191978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 192078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov do { 192178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (pstrEncParams->s16NumOfBlocks == 0 || 192278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov pstrEncParams->s16NumOfSubBands == 0 || 192378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov pstrEncParams->s16NumOfChannels == 0) { 192478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov APPL_TRACE_ERROR("%s - Avoiding division by zero...", __func__); 192578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov APPL_TRACE_ERROR("%s - block=%d, subBands=%d, channels=%d", 192678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov __func__, 192778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov pstrEncParams->s16NumOfBlocks, 192878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov pstrEncParams->s16NumOfSubBands, 192978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov pstrEncParams->s16NumOfChannels); 193078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov break; 193178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } 1932a391bf1d4f4250e27b6f157a1a8d2493c36934dcAndre Eisenbach 193378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if ((pstrEncParams->s16ChannelMode == SBC_JOINT_STEREO) || 193478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov (pstrEncParams->s16ChannelMode == SBC_STEREO)) { 193578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16BitPool = (SINT16)((pstrEncParams->u16BitRate * 19365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->s16NumOfSubBands * 1000 / s16SamplingFreq) 193778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov - ((32 + (4 * pstrEncParams->s16NumOfSubBands * 19385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->s16NumOfChannels) 193978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov + ((pstrEncParams->s16ChannelMode - 2) * 194078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov pstrEncParams->s16NumOfSubBands)) 194178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov / pstrEncParams->s16NumOfBlocks)); 19425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 194378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16FrameLen = 4 + (4*pstrEncParams->s16NumOfSubBands * 194478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov pstrEncParams->s16NumOfChannels) / 8 194578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov + (((pstrEncParams->s16ChannelMode - 2) * 19465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->s16NumOfSubBands) 194778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov + (pstrEncParams->s16NumOfBlocks * s16BitPool)) / 8; 19485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 194978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16BitRate = (8 * s16FrameLen * s16SamplingFreq) 19505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project / (pstrEncParams->s16NumOfSubBands * 19515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->s16NumOfBlocks * 1000); 19525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (s16BitRate > pstrEncParams->u16BitRate) 195478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16BitPool--; 19555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 195678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (pstrEncParams->s16NumOfSubBands == 8) 195778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16BitPool = (s16BitPool > 255) ? 255 : s16BitPool; 19585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 195978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16BitPool = (s16BitPool > 128) ? 128 : s16BitPool; 196078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } else { 196178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16BitPool = (SINT16)(((pstrEncParams->s16NumOfSubBands * 19625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project pstrEncParams->u16BitRate * 1000) 19635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project / (s16SamplingFreq * pstrEncParams->s16NumOfChannels)) 196478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov - (((32 / pstrEncParams->s16NumOfChannels) + 196578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov (4 * pstrEncParams->s16NumOfSubBands)) 196678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov / pstrEncParams->s16NumOfBlocks)); 19675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 196878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov pstrEncParams->s16BitPool = 196978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov (s16BitPool > (16 * pstrEncParams->s16NumOfSubBands)) ? 197078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov (16 * pstrEncParams->s16NumOfSubBands) : s16BitPool; 197178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } 19725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 197378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (s16BitPool < 0) 197478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16BitPool = 0; 19755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 197678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov APPL_TRACE_EVENT("%s bitpool candidate : %d (%d kbps)", __func__, 19775fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren s16BitPool, pstrEncParams->u16BitRate); 19785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 197978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (s16BitPool > pUpdateAudio->MaxBitPool) { 198078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov APPL_TRACE_DEBUG("%s computed bitpool too large (%d)", __func__, 198178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16BitPool); 198278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* Decrease bitrate */ 198378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_media_cb.encoder.u16BitRate -= BTIF_MEDIA_BITRATE_STEP; 198478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* Record that we have decreased the bitrate */ 198578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov protect |= 1; 198678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } else if (s16BitPool < pUpdateAudio->MinBitPool) { 198778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov APPL_TRACE_WARNING("%s computed bitpool too small (%d)", __func__, 198878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov s16BitPool); 198978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov 199078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* Increase bitrate */ 199178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov UINT16 previous_u16BitRate = btif_media_cb.encoder.u16BitRate; 199278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_media_cb.encoder.u16BitRate += BTIF_MEDIA_BITRATE_STEP; 199378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* Record that we have increased the bitrate */ 199478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov protect |= 2; 199578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* Check over-flow */ 199678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (btif_media_cb.encoder.u16BitRate < previous_u16BitRate) 199778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov protect |= 3; 199878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } else { 199978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov break; 200078bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } 200178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* In case we have already increased and decreased the bitrate, just stop */ 200278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (protect == 3) { 200378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov APPL_TRACE_ERROR("%s could not find bitpool in range", __func__); 200478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov break; 200578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } 200678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov } while (1); 20075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 200878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* Finally update the bitpool in the encoder structure */ 200978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov pstrEncParams->s16BitPool = s16BitPool; 20105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 201178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov APPL_TRACE_DEBUG("%s final bit rate %d, final bit pool %d", __func__, 201278bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_media_cb.encoder.u16BitRate, 201378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_media_cb.encoder.s16BitPool); 20145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 201578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov /* make sure we reinitialize encoder with new settings */ 201678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov SBC_Encoder_Init(&(btif_media_cb.encoder)); 20178bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 20188bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.tx_sbc_frames = calculate_max_frames_per_packet(); 20195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 20225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 20235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_pcm2sbc_init 20245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 20255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Init encoding task for PCM to SBC according to feeding 20265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 20275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 20285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 20295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 20305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_pcm2sbc_init(tBTIF_MEDIA_INIT_AUDIO_FEEDING * p_feeding) 20315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 20325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN reconfig_needed = FALSE; 20335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2034e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("PCM feeding:"); 2035e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("sampling_freq:%d", p_feeding->feeding.cfg.pcm.sampling_freq); 2036e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("num_channel:%d", p_feeding->feeding.cfg.pcm.num_channel); 2037e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bit_per_sample:%d", p_feeding->feeding.cfg.pcm.bit_per_sample); 20385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check the PCM feeding sampling_freq */ 20405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_feeding->feeding.cfg.pcm.sampling_freq) 20415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 8000: 20435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 12000: 20445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 16000: 20455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 24000: 20465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 32000: 20475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 48000: 20485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For these sampling_freq the AV connection must be 48000 */ 20495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf48000) 20505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reconfiguration needed at 48000 */ 2052e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("SBC Reconfiguration needed at 48000"); 20535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16SamplingFreq = SBC_sf48000; 20545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reconfig_needed = TRUE; 20555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 20575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 11025: 20595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 22050: 20605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 44100: 20615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* For these sampling_freq the AV connection must be 44100 */ 20625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.encoder.s16SamplingFreq != SBC_sf44100) 20635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 20645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reconfiguration needed at 44100 */ 2065e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("SBC Reconfiguration needed at 44100"); 20665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16SamplingFreq = SBC_sf44100; 20675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reconfig_needed = TRUE; 20685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 20705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 2071e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Feeding PCM sampling_freq unsupported"); 20725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 20735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Some AV Headsets do not support Mono => always ask for Stereo */ 20765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.encoder.s16ChannelMode == SBC_MONO) 20775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2078e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("SBC Reconfiguration needed in Stereo"); 20795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.s16ChannelMode = SBC_JOINT_STEREO; 20805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project reconfig_needed = TRUE; 20815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 20835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (reconfig_needed != FALSE) 20845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2085e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init :: mtu %d", btif_media_cb.TxAaMtuSize); 2086e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("ch mode %d, nbsubd %d, nb %d, alloc %d, rate %d, freq %d", 20875fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.encoder.s16ChannelMode, 20885fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.encoder.s16NumOfSubBands, btif_media_cb.encoder.s16NumOfBlocks, 20895fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.encoder.s16AllocationMethod, btif_media_cb.encoder.u16BitRate, 20905fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.encoder.s16SamplingFreq); 20915fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 20925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SBC_Encoder_Init(&(btif_media_cb.encoder)); 20935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 20955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2096e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("btif_media_task_pcm2sbc_init no SBC reconfig needed"); 20975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 20985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 20995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 21025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 21035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_audio_feeding_init 21045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 21055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Initialize the audio path according to the feeding format 21065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 21075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 21085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 21095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 21105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_audio_feeding_init(BT_HDR *p_msg) 21115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 21125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_MEDIA_INIT_AUDIO_FEEDING *p_feeding = (tBTIF_MEDIA_INIT_AUDIO_FEEDING *) p_msg; 21135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2114e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("btif_media_task_audio_feeding_init format:%d", p_feeding->feeding.format); 21155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save Media Feeding information */ 21175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.feeding_mode = p_feeding->feeding_mode; 21185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding = p_feeding->feeding; 21195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Handle different feeding formats */ 21215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_feeding->feeding.format) 21225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 21235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_CODEC_PCM: 21245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.TxTranscoding = BTIF_MEDIA_TRSCD_PCM_2_SBC; 21255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_pcm2sbc_init(p_feeding); 21265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 21275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default : 2129e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("unknown feeding format %d", p_feeding->feeding.format); 21305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 21315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 21325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 21335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 21343e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodint btif_a2dp_get_track_frequency(UINT8 frequency) { 2135f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta int freq = 48000; 2136f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta switch (frequency) { 2137f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_SAMP_FREQ_16: 2138f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta freq = 16000; 2139f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2140f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_SAMP_FREQ_32: 2141f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta freq = 32000; 2142f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2143f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_SAMP_FREQ_44: 2144f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta freq = 44100; 2145f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2146f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_SAMP_FREQ_48: 2147f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta freq = 48000; 2148f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2149f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 2150f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return freq; 2151f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 2152f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 21533e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodint btif_a2dp_get_track_channel_count(UINT8 channeltype) { 21543e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood int count = 1; 2155f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta switch (channeltype) { 2156f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_CH_MD_MONO: 21573e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood count = 1; 2158f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2159f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_CH_MD_DUAL: 2160f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_CH_MD_STEREO: 2161f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_CH_MD_JOINT: 21623e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood count = 2; 2163f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2164f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 21653e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood return count; 21663e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood} 21673e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 21686b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 21696b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Guptaint a2dp_get_track_channel_type(UINT8 channeltype) { 21706b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta int count = 1; 21716b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta switch (channeltype) { 21726b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta case A2D_SBC_IE_CH_MD_MONO: 21736b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta count = 1; 21746b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta break; 21756b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta case A2D_SBC_IE_CH_MD_DUAL: 21766b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta case A2D_SBC_IE_CH_MD_STEREO: 21776b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta case A2D_SBC_IE_CH_MD_JOINT: 21786b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta count = 3; 21796b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta break; 21806b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 21816b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta return count; 21826b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta} 21836b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 21846b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta 21853e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwoodvoid btif_a2dp_set_peer_sep(UINT8 sep) { 21863e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_media_cb.peer_sep = sep; 2187f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 2188f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 2189c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavatistatic void btif_decode_alarm_cb(UNUSED_ATTR void *context) { 21906b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta if(worker_thread != NULL) 21916b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta thread_post(worker_thread, btif_media_task_avk_handle_timer, NULL); 2192f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 2193f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 2194c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavatistatic void btif_media_task_aa_handle_stop_decoding(void) { 219571864f490d4dc31857df0b31924cd62a337e9f1aZach Johnson alarm_free(btif_media_cb.decode_alarm); 2196c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati btif_media_cb.decode_alarm = NULL; 21976b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 21986b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BtifAvrcpAudioTrackPause(btif_media_cb.audio_track); 21996b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 2200c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati} 2201c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati 2202c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavatistatic void btif_media_task_aa_handle_start_decoding(void) { 2203c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati if (btif_media_cb.decode_alarm) 2204c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati return; 22056b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 22066b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BtifAvrcpAudioTrackStart(btif_media_cb.audio_track); 22076b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 220878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_media_cb.decode_alarm = alarm_new_periodic("btif.media_decode"); 2209c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati if (!btif_media_cb.decode_alarm) { 2210db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_ERROR(LOG_TAG, "%s unable to allocate decode alarm.", __func__); 2211c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati return; 2212c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati } 2213c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati 2214ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov alarm_set(btif_media_cb.decode_alarm, BTIF_SINK_MEDIA_TIME_TICK_MS, 221578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_decode_alarm_cb, NULL); 2216f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 2217f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 22186718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE) 2219f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 2220f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_clear_track (void) 2221f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 2222e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("btif_media_task_aa_handle_clear_track"); 22236b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 22246b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BtifAvrcpAudioTrackStop(btif_media_cb.audio_track); 22256b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BtifAvrcpAudioTrackDelete(btif_media_cb.audio_track); 2226968265f3f4408ee5edb08628a1fccb8a995ba87eSanket Agarwal btif_media_cb.audio_track = NULL; 22276b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 2228f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 2229f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 2230f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/******************************************************************************* 2231f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 2232f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function btif_media_task_aa_handle_decoder_reset 2233f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 2234f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description 2235f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 2236f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns void 2237f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 2238f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/ 2239f7dd9f5779680da37dc89e5df2b26d436487818cHemant Guptastatic void btif_media_task_aa_handle_decoder_reset(BT_HDR *p_msg) 2240f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 2241f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta tBTIF_MEDIA_SINK_CFG_UPDATE *p_buf = (tBTIF_MEDIA_SINK_CFG_UPDATE*) p_msg; 2242f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta tA2D_STATUS a2d_status; 2243f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta tA2D_SBC_CIE sbc_cie; 2244f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta OI_STATUS status; 2245ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta UINT32 freq_multiple = 48*20; /* frequency multiple for 20ms of data , initialize with 48K*/ 2246ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta UINT32 num_blocks = 16; 2247ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta UINT32 num_subbands = 8; 2248f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 2249e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("btif_media_task_aa_handle_decoder_reset p_codec_info[%x:%x:%x:%x:%x:%x]", 2250f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_buf->codec_info[1], p_buf->codec_info[2], p_buf->codec_info[3], 2251f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta p_buf->codec_info[4], p_buf->codec_info[5], p_buf->codec_info[6]); 2252f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 2253f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_buf->codec_info, FALSE); 2254f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (a2d_status != A2D_SUCCESS) 2255f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 2256e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status); 2257f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta return; 2258f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 22593e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 22603e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_media_cb.sample_rate = btif_a2dp_get_track_frequency(sbc_cie.samp_freq); 22613e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood btif_media_cb.channel_count = btif_a2dp_get_track_channel_count(sbc_cie.ch_mode); 22623e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 2263f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_cb.rx_flush = FALSE; 2264e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("Reset to sink role"); 2265ce24765fe7620c34e8d88ed4f826c8a6917582b2Hemant Gupta status = OI_CODEC_SBC_DecoderReset(&context, contextData, sizeof(contextData), 2, 2, FALSE); 2266f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta if (!OI_SUCCESS(status)) { 2267e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("OI_CODEC_SBC_DecoderReset failed with error code %d\n", status); 2268f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 22693e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood 22706b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#ifdef USE_AUDIO_TRACK 22716b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta APPL_TRACE_DEBUG("%s A2dpSink: sbc Create Track", __func__); 22726b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta btif_media_cb.audio_track = 22736b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BtifAvrcpAudioTrackCreate(btif_a2dp_get_track_frequency(sbc_cie.samp_freq), 22746b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta a2dp_get_track_channel_type(sbc_cie.ch_mode)); 22756b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta if (btif_media_cb.audio_track == NULL) { 22766b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta APPL_TRACE_ERROR("%s A2dpSink: Track creation fails!!!", __func__); 22776b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta return; 22786b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta } 22796b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#else 22803e8a242fcbeebea2857fa964ca48624d8433333eMike Lockwood UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb); 22816b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta#endif 2282f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 22838bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh switch (sbc_cie.samp_freq) 2284f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 2285f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_SAMP_FREQ_16: 2286e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq); 2287f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta freq_multiple = 16*20; 2288f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2289f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_SAMP_FREQ_32: 2290e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq); 2291f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta freq_multiple = 32*20; 2292f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2293f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_SAMP_FREQ_44: 2294e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tsamp_freq:%d (44100)", sbc_cie.samp_freq); 2295f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta freq_multiple = 441*2; 2296f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2297f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_SAMP_FREQ_48: 2298e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq); 2299f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta freq_multiple = 48*20; 2300f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2301f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta default: 2302e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Unknown Frequency "); 2303f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2304f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 2305f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 23068bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh switch (sbc_cie.ch_mode) 2307f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 2308f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_CH_MD_MONO: 2309e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode); 2310f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2311f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_CH_MD_DUAL: 2312e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tch_mode:%d (DUAL)", sbc_cie.ch_mode); 2313f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2314f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_CH_MD_STEREO: 2315e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tch_mode:%d (STEREO)", sbc_cie.ch_mode); 2316f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2317f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_CH_MD_JOINT: 2318e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tch_mode:%d (JOINT)", sbc_cie.ch_mode); 2319f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2320f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta default: 2321e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Unknown Mode "); 2322f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2323f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 2324f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 23258bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh switch (sbc_cie.block_len) 2326f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 2327f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_BLOCKS_4: 2328e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len); 2329f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_blocks = 4; 2330f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2331f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_BLOCKS_8: 2332e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len); 2333f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_blocks = 8; 2334f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2335f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_BLOCKS_12: 2336e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len); 2337f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_blocks = 12; 2338f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2339f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_BLOCKS_16: 2340e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len); 2341f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_blocks = 16; 2342f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2343f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta default: 2344e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Unknown BlockLen "); 2345f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2346f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 2347f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 23488bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh switch (sbc_cie.num_subbands) 2349f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 2350f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_SUBBAND_4: 2351e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands); 2352f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_subbands = 4; 2353f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2354f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_SUBBAND_8: 2355e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands); 2356f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta num_subbands = 8; 2357f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2358f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta default: 2359e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Unknown SubBands "); 2360f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2361f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 2362f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 23638bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh switch (sbc_cie.alloc_mthd) 2364f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 2365f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_ALLOC_MD_S: 2366e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd); 2367f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2368f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta case A2D_SBC_IE_ALLOC_MD_L: 2369e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\talloc_mthd:%d (Loudness)", sbc_cie.alloc_mthd); 2370f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2371f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta default: 2372e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Unknown Allocation Method"); 2373f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta break; 2374f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 2375f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 2376e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool); 2377f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 2378f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta btif_media_cb.frames_to_process = ((freq_multiple)/(num_blocks*num_subbands)) + 1; 2379e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Frames to be processed in 20 ms %d",btif_media_cb.frames_to_process); 2380f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 2381f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta#endif 2382f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 23835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 23845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 23855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_feeding_state_reset 23865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 23875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Reset the media feeding state 23885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 23895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 23905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 23915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 23925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_feeding_state_reset(void) 23935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 23945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* By default, just clear the entire state */ 23955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&btif_media_cb.media_feeding_state, 0, sizeof(btif_media_cb.media_feeding_state)); 2396b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 2397b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren if (btif_media_cb.TxTranscoding == BTIF_MEDIA_TRSCD_PCM_2_SBC) 2398b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren { 2399b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.bytes_per_tick = 2400b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren (btif_media_cb.media_feeding.cfg.pcm.sampling_freq * 2401b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8 * 2402b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.num_channel * 2403b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren BTIF_MEDIA_TIME_TICK)/1000; 2404b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 2405e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("pcm bytes per tick %d", 2406b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren (int)btif_media_cb.media_feeding_state.pcm.bytes_per_tick); 2407b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren } 24085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2409c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati 2410c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavatistatic void btif_media_task_alarm_cb(UNUSED_ATTR void *context) { 241123e561a1f374557d6030b497337a1c96e9bb6aa4Sharvil Nanavati thread_post(worker_thread, btif_media_task_aa_handle_timer, NULL); 2412c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati} 2413c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati 24145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 24165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_aa_start_tx 24175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 24185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Start media task encoding 24195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 24205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 24215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 24225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 24235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_start_tx(void) 24245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 242578bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov APPL_TRACE_DEBUG("%s media_alarm %srunning, feeding mode %d", __func__, 242678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_is_scheduled(btif_media_cb.media_alarm)? "" : "not ", 242778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_media_cb.feeding_mode); 24285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2429f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach last_frame_us = 0; 24305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reset the media feeding state */ 24325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_feeding_state_reset(); 24335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2434c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati APPL_TRACE_EVENT("starting timer %dms", BTIF_MEDIA_TIME_TICK); 2435c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati 243678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_free(btif_media_cb.media_alarm); 243778bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_media_cb.media_alarm = alarm_new_periodic("btif.media_task"); 2438c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati if (!btif_media_cb.media_alarm) { 2439db554581079863974af8e1289646f5deea6fc044Marie Janssen LOG_ERROR(LOG_TAG, "%s unable to allocate media alarm.", __func__); 2440c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati return; 2441c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati } 24425fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 244378bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_set(btif_media_cb.media_alarm, BTIF_MEDIA_TIME_TICK, 244478bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov btif_media_task_alarm_cb, NULL); 24455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 24485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 24495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_task_aa_stop_tx 24505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 24515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Stop media task encoding 24525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 24535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 24545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 24555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 24565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void btif_media_task_aa_stop_tx(void) 24575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 245878bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov APPL_TRACE_DEBUG("%s media_alarm is %srunning", __func__, 245978bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov alarm_is_scheduled(btif_media_cb.media_alarm)? "" : "not "); 24609c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta 246178bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov const bool send_ack = alarm_is_scheduled(btif_media_cb.media_alarm); 24625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Stop the timer first */ 2464c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati alarm_free(btif_media_cb.media_alarm); 2465c0a87fe60f79ddf41595a30e75a77f43c19cd323Sharvil Nanavati btif_media_cb.media_alarm = NULL; 24665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UIPC_Close(UIPC_CH_ID_AV_AUDIO); 24685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24699c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta /* Try to send acknowldegment once the media stream is 24709c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta stopped. This will make sure that the A2DP HAL layer is 24719c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta un-blocked on wait for acknowledgment for the sent command. 24729c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta This resolves a corner cases AVDTP SUSPEND collision 24739c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta when the DUT and the remote device issue SUSPEND simultaneously 24749c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta and due to the processing of the SUSPEND request from the remote, 24759c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta the media path is torn down. If the A2DP HAL happens to wait 24769c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta for ACK for the initiated SUSPEND, it would never receive it casuing 24779c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta a block/wait. Due to this acknowledgement, the A2DP HAL is guranteed 24789c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta to get the ACK for any pending command in such cases. */ 24799c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta 24809c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta if (send_ack) 24819c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta a2dp_cmd_acknowledge(A2DP_CTRL_ACK_SUCCESS); 24829c5d0727dd4cd09e44c032506c28ab4120ad3b88Anubhav Gupta 24835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* audio engine stopped, reset tx suspended flag */ 24845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.tx_flush = 0; 2485f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach last_frame_us = 0; 24865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reset the media feeding state */ 24885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_task_feeding_state_reset(); 24895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 24905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 24918bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghoshstatic UINT32 get_frame_length() 24928bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh{ 24938bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh UINT32 frame_len = 0; 24948bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s channel mode: %d, sub-band: %d, number of block: %d, \ 24958bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh bitpool: %d, sampling frequency: %d, num channels: %d", 24968bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, 24978bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16ChannelMode, 24988bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16NumOfSubBands, 24998bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16NumOfBlocks, 25008bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16BitPool, 25018bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16SamplingFreq, 25028bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16NumOfChannels); 25038bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 25048bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh switch (btif_media_cb.encoder.s16ChannelMode) { 25058bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh case SBC_MONO: 25068bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh /* FALLTHROUGH */ 25078bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh case SBC_DUAL: 25088bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh frame_len = SBC_FRAME_HEADER_SIZE_BYTES + 25098bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh ((UINT32)(SBC_SCALE_FACTOR_BITS * btif_media_cb.encoder.s16NumOfSubBands * 25108bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16NumOfChannels) / CHAR_BIT) + 25118bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh ((UINT32)(btif_media_cb.encoder.s16NumOfBlocks * 25128bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16NumOfChannels * 25138bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16BitPool) / CHAR_BIT); 25148bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh break; 25158bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh case SBC_STEREO: 25168bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh frame_len = SBC_FRAME_HEADER_SIZE_BYTES + 25178bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh ((UINT32)(SBC_SCALE_FACTOR_BITS * btif_media_cb.encoder.s16NumOfSubBands * 25188bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16NumOfChannels) / CHAR_BIT) + 25198bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh ((UINT32)(btif_media_cb.encoder.s16NumOfBlocks * 25208bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16BitPool) / CHAR_BIT); 25218bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh break; 25228bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh case SBC_JOINT_STEREO: 25238bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh frame_len = SBC_FRAME_HEADER_SIZE_BYTES + 25248bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh ((UINT32)(SBC_SCALE_FACTOR_BITS * btif_media_cb.encoder.s16NumOfSubBands * 25258bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16NumOfChannels) / CHAR_BIT) + 25268bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh ((UINT32)(btif_media_cb.encoder.s16NumOfSubBands + 25278bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh (btif_media_cb.encoder.s16NumOfBlocks * 25288bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16BitPool)) / CHAR_BIT); 25298bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh break; 25308bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh default: 25318bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s Invalid channel number: %d", 25328bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, btif_media_cb.encoder.s16ChannelMode); 25338bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh break; 25348bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 25358bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s calculated frame length: %d", __func__, frame_len); 25368bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh return frame_len; 25378bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh} 25388bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 25398bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghoshstatic UINT8 calculate_max_frames_per_packet() 25408bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh{ 25418bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh UINT16 result = 0; 25428bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh UINT16 effective_mtu_size = btif_media_cb.TxAaMtuSize; 25438bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh UINT32 frame_len; 25448bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 25458bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s original AVDTP MTU size: %d", __func__, btif_media_cb.TxAaMtuSize); 25468bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (btif_av_is_peer_edr() && (btif_av_peer_supports_3mbps() == FALSE)) { 25478bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh // This condition would be satisfied only if the remote device is 25488bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh // EDR and supports only 2 Mbps, but the effective AVDTP MTU size 25498bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh // exceeds the 2DH5 packet size. 25508bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s The remote devce is EDR but does not support 3 Mbps", __func__); 25518bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 25528bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (effective_mtu_size > MAX_2MBPS_AVDTP_MTU) { 25538bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_WARNING("%s Restricting AVDTP MTU size to %d", 25548bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, MAX_2MBPS_AVDTP_MTU); 25558bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh effective_mtu_size = MAX_2MBPS_AVDTP_MTU; 25568bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.TxAaMtuSize = effective_mtu_size; 25578bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 25588bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 25598bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 25608bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (!btif_media_cb.encoder.s16NumOfSubBands) { 25618bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_ERROR("%s SubBands are set to 0, resetting to %d", 25628bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, SBC_MAX_NUM_OF_SUBBANDS); 25638bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16NumOfSubBands = SBC_MAX_NUM_OF_SUBBANDS; 25648bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 25658bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (!btif_media_cb.encoder.s16NumOfBlocks) { 25668bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_ERROR("%s Blocks are set to 0, resetting to %d", 25678bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, SBC_MAX_NUM_OF_BLOCKS); 25688bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16NumOfBlocks = SBC_MAX_NUM_OF_BLOCKS; 25698bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 25708bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (!btif_media_cb.encoder.s16NumOfChannels) { 25718bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_ERROR("%s Channels are set to 0, resetting to %d", 25728bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, SBC_MAX_NUM_OF_CHANNELS); 25738bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.encoder.s16NumOfChannels = SBC_MAX_NUM_OF_CHANNELS; 25748bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 25758bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 25768bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh frame_len = get_frame_length(); 25778bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 25788bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s Effective Tx MTU to be considered: %d", 25798bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, effective_mtu_size); 25808bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 25818bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh switch (btif_media_cb.encoder.s16SamplingFreq) { 25828bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh case SBC_sf44100: 25838bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (frame_len == 0) { 25848bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_ERROR("%s Calculating frame length, \ 25858bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh resetting it to default 119", __func__); 25868bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh frame_len = MAX_SBC_HQ_FRAME_SIZE_44_1; 25878bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 25888bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh result = (effective_mtu_size - A2DP_HDR_SIZE) / frame_len; 25898bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s Max number of SBC frames: %d", __func__, result); 25908bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh break; 25918bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 25928bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh case SBC_sf48000: 25938bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (frame_len == 0) { 25948bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_ERROR("%s Calculating frame length, \ 25958bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh resetting it to default 115", __func__); 25968bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh frame_len = MAX_SBC_HQ_FRAME_SIZE_48; 25978bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 25988bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh result = (effective_mtu_size - A2DP_HDR_SIZE) / frame_len; 25998bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s Max number of SBC frames: %d", __func__, result); 26008bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh break; 26018bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 26028bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh default: 26038bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_ERROR("%s Max number of SBC frames: %d", __func__, result); 26048bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh break; 26058bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 26068bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 26078bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh return result; 26088bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh} 26098bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 26105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 26115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 26128bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh ** Function btif_get_num_aa_frame_iteration 26135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 26148bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh ** Description returns number of frames to send and number of iterations 26158bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh ** to be used. num_of_ietrations and num_of_frames parameters 26168bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh ** are used as output param for returning the respective values 26175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 26188bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh ** Returns void 26195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 26205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 26218bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghoshstatic void btif_get_num_aa_frame_iteration(UINT8 *num_of_iterations, UINT8 *num_of_frames) 26225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 26238bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh UINT8 nof = 0; 26248bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh UINT8 noi = 1; 26255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 26265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (btif_media_cb.TxTranscoding) 26275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 26285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_TRSCD_PCM_2_SBC: 2629c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach { 26308bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh UINT32 projected_nof = 0; 2631b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren UINT32 pcm_bytes_per_frame = btif_media_cb.encoder.s16NumOfSubBands * 2632b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.encoder.s16NumOfBlocks * 2633b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.num_channel * 2634b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8; 26358bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s pcm_bytes_per_frame %u", __func__, pcm_bytes_per_frame); 26365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2637f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach UINT32 us_this_tick = BTIF_MEDIA_TIME_TICK * 1000; 2638f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach UINT64 now_us = time_now_us(); 2639f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach if (last_frame_us != 0) 2640f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach us_this_tick = (now_us - last_frame_us); 2641f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach last_frame_us = now_us; 2642f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach 2643b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.counter += 2644f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach btif_media_cb.media_feeding_state.pcm.bytes_per_tick * 2645f13db8a534adf5281ee915c4b73b3141957ed17bAndre Eisenbach us_this_tick / (BTIF_MEDIA_TIME_TICK * 1000); 2646c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach 2647c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach /* calculate nbr of frames pending for this media tick */ 26488bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh projected_nof = btif_media_cb.media_feeding_state.pcm.counter / pcm_bytes_per_frame; 26498bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (projected_nof > btif_media_cb.stats.media_read_max_expected_frames) 26508bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.stats.media_read_max_expected_frames = projected_nof; 26518bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.stats.media_read_total_expected_frames += projected_nof; 26524a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov btif_media_cb.stats.media_read_expected_count++; 26538bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (projected_nof > MAX_PCM_FRAME_NUM_PER_TICK) 2654c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach { 2655c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach APPL_TRACE_WARNING("%s() - Limiting frames to be sent from %d to %d" 26568bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh , __FUNCTION__, projected_nof, MAX_PCM_FRAME_NUM_PER_TICK); 26578bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh size_t delta = projected_nof - MAX_PCM_FRAME_NUM_PER_TICK; 26584a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov btif_media_cb.stats.media_read_limited_count++; 26594a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov btif_media_cb.stats.media_read_total_limited_frames += delta; 26604a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov if (delta > btif_media_cb.stats.media_read_max_limited_frames) 26614a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov btif_media_cb.stats.media_read_max_limited_frames = delta; 26628bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh projected_nof = MAX_PCM_FRAME_NUM_PER_TICK; 26634aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu } 2664f061e74b81863771b174d1717a6165034dbad8e5Mattias Agren 26658bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s frames for available PCM data %u", __func__, projected_nof); 26668bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 26678bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (btif_av_is_peer_edr()) 26688bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh { 26698bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (!btif_media_cb.tx_sbc_frames) 26708bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh { 26718bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_ERROR("%s tx_sbc_frames not updated, update from here", __func__); 26728bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.tx_sbc_frames = calculate_max_frames_per_packet(); 26738bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 26748bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh 26758bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh nof = btif_media_cb.tx_sbc_frames; 26768bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (!nof) { 26778bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_ERROR("%s Number of frames not updated, set calculated values", 26788bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__); 26798bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh nof = projected_nof; 26808bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh noi = 1; 26818bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } else { 26828bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (nof < projected_nof) 26838bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh { 26848bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh noi = projected_nof / nof; // number of iterations would vary 26858bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (noi > MAX_PCM_ITER_NUM_PER_TICK) 26868bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh { 26878bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_ERROR("%s ## Audio Congestion (iterations:%d > max (%d))", 26888bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, noi, MAX_PCM_ITER_NUM_PER_TICK); 26898bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh noi = MAX_PCM_ITER_NUM_PER_TICK; 26908bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.media_feeding_state.pcm.counter 26918bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh = noi * nof * pcm_bytes_per_frame; 26928bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 26938bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh projected_nof = nof; 26948bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } else { 26958bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh noi = 1; // number of iterations is 1 26968bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s reducing frames for available PCM data", __func__); 26978bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh nof = projected_nof; 26988bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 26998bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 27008bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } else { 27018bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh // For BR cases nof will be same as the value retrieved at projected_nof 27028bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s headset BR, number of frames %u", __func__, nof); 27038bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (projected_nof > MAX_PCM_FRAME_NUM_PER_TICK) 27048bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh { 27058bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_ERROR("%s ## Audio Congestion (frames: %d > max (%d))", 27068bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, projected_nof, MAX_PCM_FRAME_NUM_PER_TICK); 27078bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh projected_nof = MAX_PCM_FRAME_NUM_PER_TICK; 27088bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.media_feeding_state.pcm.counter = 27098bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh noi * projected_nof * pcm_bytes_per_frame; 27108bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 27118bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh nof = projected_nof; 27128bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 27138bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_cb.media_feeding_state.pcm.counter -= noi * nof * pcm_bytes_per_frame; 27148bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_DEBUG("%s effective num of frames %u, iterations %u", __func__, nof, noi); 2715b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren } 2716b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren break; 27175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 27198bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh APPL_TRACE_ERROR("%s Unsupported transcoding format 0x%x", 27208bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, btif_media_cb.TxTranscoding); 27218bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh nof = 0; 27228bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh noi = 0; 27235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 27245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 27258bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh *num_of_frames = nof; 27268bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh *num_of_iterations = noi; 27275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2731f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Function btif_media_sink_enque_buf 2732f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 2733f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Description This function is called by the av_co to fill A2DP Sink Queue 2734f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 2735f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 2736f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** Returns size of the queue 2737f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta *******************************************************************************/ 2738f7dd9f5779680da37dc89e5df2b26d436487818cHemant GuptaUINT8 btif_media_sink_enque_buf(BT_HDR *p_pkt) 2739f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta{ 27401a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov if (btif_media_cb.rx_flush == TRUE) /* Flush enabled, do not enque */ 27411a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov return fixed_queue_length(btif_media_cb.RxSbcQ); 27421a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov if (fixed_queue_length(btif_media_cb.RxSbcQ) == MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ) 2743f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta { 27446b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta UINT8 ret = fixed_queue_length(btif_media_cb.RxSbcQ); 2745abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(fixed_queue_try_dequeue(btif_media_cb.RxSbcQ)); 27466b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta return ret; 2747f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 2748f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 27496b84f291c4edce7e4102efd8d4052a63bcb4b9dcAnubhav Gupta BTIF_TRACE_VERBOSE("%s +", __func__); 2750f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta /* allocate and Queue this buffer */ 27515fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov tBT_SBC_HDR *p_msg = 27525fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov (tBT_SBC_HDR *)osi_malloc(sizeof(tBT_SBC_HDR) + p_pkt->offset + 27535fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_pkt->len); 27545fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov memcpy((UINT8 *)(p_msg + 1), (UINT8 *)(p_pkt + 1) + p_pkt->offset, 27555fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_pkt->len); 27565fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_msg->num_frames_to_be_processed = (*((UINT8 *)(p_pkt + 1) + p_pkt->offset))& 0x0f; 27575fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_msg->len = p_pkt->len; 27585fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_msg->offset = 0; 27595fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov p_msg->layer_specific = p_pkt->layer_specific; 27605fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BTIF_TRACE_VERBOSE("%s frames to process %d, len %d ", 27615fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov __func__, p_msg->num_frames_to_be_processed,p_msg->len); 27625fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov fixed_queue_enqueue(btif_media_cb.RxSbcQ, p_msg); 27635fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov if (fixed_queue_length(btif_media_cb.RxSbcQ) == MAX_A2DP_DELAYED_START_FRAME_COUNT) { 27645fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BTIF_TRACE_DEBUG(" Initiate Decoding "); 27655fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov btif_media_task_aa_handle_start_decoding(); 2766f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta } 27675fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov 27681a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov return fixed_queue_length(btif_media_cb.RxSbcQ); 2769f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta} 2770f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 2771f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta/******************************************************************************* 2772f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta ** 27735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_aa_readbuf 27745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 27755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description This function is called by the av_co to get the next buffer to send 27765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 27775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 27785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 27795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 27805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBT_HDR *btif_media_aa_readbuf(void) 27815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2782ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t now_us = time_now_us(); 2783ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov BT_HDR *p_buf = fixed_queue_try_dequeue(btif_media_cb.TxAaQ); 2784ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 2785ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.tx_queue_total_readbuf_calls++; 2786ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.tx_queue_last_readbuf_us = now_us; 2787ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov if (p_buf != NULL) { 2788ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // Update the statistics 2789ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov update_scheduling_stats(&btif_media_cb.stats.tx_queue_dequeue_stats, 2790ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov now_us, BTIF_SINK_MEDIA_TIME_TICK_MS * 1000); 2791ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov } 2792ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 2793ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov return p_buf; 27945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 27955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 27965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 27975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 27985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_aa_read_feeding 27995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 28005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 28015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 28025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 28035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 28045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 28055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN btif_media_aa_read_feeding(tUIPC_CH_ID channel_id) 28075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 28085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 event; 28095fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands * \ 28105fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.encoder.s16NumOfBlocks; 28115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 read_size; 28125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 sbc_sampling = 48000; 28135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 src_samples; 28145fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren UINT16 bytes_needed = blocm_x_subband * btif_media_cb.encoder.s16NumOfChannels * \ 2815b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8; 28165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project static UINT16 up_sampled_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS 28175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS * 2]; 28185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project static UINT16 read_buffer[SBC_MAX_NUM_FRAME * SBC_MAX_NUM_OF_BLOCKS 28195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * SBC_MAX_NUM_OF_CHANNELS * SBC_MAX_NUM_OF_SUBBANDS]; 28205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 src_size_used; 28215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 dst_size_used; 28225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN fract_needed; 28235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT32 fract_max; 28245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project INT32 fract_threshold; 28255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT32 nb_byte_read; 28265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Get the SBC sampling rate */ 28285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (btif_media_cb.encoder.s16SamplingFreq) 28295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SBC_sf48000: 28315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_sampling = 48000; 28325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SBC_sf44100: 28345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_sampling = 44100; 28355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SBC_sf32000: 28375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_sampling = 32000; 28385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case SBC_sf16000: 28405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_sampling = 16000; 28415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2844b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren if (sbc_sampling == btif_media_cb.media_feeding.cfg.pcm.sampling_freq) { 2845b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren read_size = bytes_needed - btif_media_cb.media_feeding_state.pcm.aa_feed_residue; 2846b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren nb_byte_read = UIPC_Read(channel_id, &event, 2847b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren ((UINT8 *)btif_media_cb.encoder.as16PcmBuffer) + 2848b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.aa_feed_residue, 2849b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren read_size); 2850b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren if (nb_byte_read == read_size) { 2851b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.aa_feed_residue = 0; 2852b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren return TRUE; 2853b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren } else { 2854e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("### UNDERFLOW :: ONLY READ %d BYTES OUT OF %d ###", 2855b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren nb_byte_read, read_size); 2856b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.aa_feed_residue += nb_byte_read; 2857ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.media_read_total_underflow_bytes += (read_size - nb_byte_read); 2858ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.media_read_total_underflow_count++; 2859ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.media_read_last_underflow_us = time_now_us(); 2860b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren return FALSE; 2861b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren } 2862b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren } 2863b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren 28645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Some Feeding PCM frequencies require to split the number of sample */ 28655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* to read. */ 28665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* E.g 128/6=21.3333 => read 22 and 21 and 21 => max = 2; threshold = 0*/ 28675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_needed = FALSE; /* Default */ 28685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (btif_media_cb.media_feeding.cfg.pcm.sampling_freq) 28695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 32000: 28715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 8000: 28725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_needed = TRUE; 28735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_max = 2; /* 0, 1 and 2 */ 28745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_threshold = 0; /* Add one for the first */ 28755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 16000: 28775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_needed = TRUE; 28785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_max = 2; /* 0, 1 and 2 */ 28795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fract_threshold = 1; /* Add one for the first two frames*/ 28805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 28815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Compute number of sample to read from source */ 28845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_samples = blocm_x_subband; 28855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_samples *= btif_media_cb.media_feeding.cfg.pcm.sampling_freq; 28865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_samples /= sbc_sampling; 28875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The previous division may have a remainder not null */ 28895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (fract_needed) 28905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter <= fract_threshold) 28925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 28935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_samples++; /* for every read before threshold add one sample */ 28945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 28955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 28965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* do nothing if counter >= threshold */ 28975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding_state.pcm.aa_feed_counter++; /* one more read */ 28985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.media_feeding_state.pcm.aa_feed_counter > fract_max) 28995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding_state.pcm.aa_feed_counter = 0; 29015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Compute number of bytes to read from source */ 29055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project read_size = src_samples; 29065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project read_size *= btif_media_cb.media_feeding.cfg.pcm.num_channel; 29075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project read_size *= (btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8); 29085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Read Data from UIPC channel */ 29105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nb_byte_read = UIPC_Read(channel_id, &event, (UINT8 *)read_buffer, read_size); 29115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project //tput_mon(TRUE, nb_byte_read, FALSE); 29135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (nb_byte_read < read_size) 29155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2916e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("### UNDERRUN :: ONLY READ %d BYTES OUT OF %d ###", 29175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nb_byte_read, read_size); 2918ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.media_read_total_underrun_bytes += (read_size - nb_byte_read); 2919ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.media_read_total_underrun_count++; 2920ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.media_read_last_underrun_us = time_now_us(); 29215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (nb_byte_read == 0) 29235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 29245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(btif_media_cb.feeding_mode == BTIF_AV_FEEDING_ASYNCHRONOUS) 29265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Fill the unfilled part of the read buffer with silence (0) */ 29285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(((UINT8 *)read_buffer) + nb_byte_read, 0, read_size - nb_byte_read); 29295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nb_byte_read = read_size; 29305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Initialize PCM up-sampling engine */ 29345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_sbc_init_up_sample(btif_media_cb.media_feeding.cfg.pcm.sampling_freq, 29355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_sampling, btif_media_cb.media_feeding.cfg.pcm.bit_per_sample, 29365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding.cfg.pcm.num_channel); 29375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* re-sample read buffer */ 29395fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren /* The output PCM buffer will be stereo, 16 bit per sample */ 29405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project dst_size_used = bta_av_sbc_up_sample((UINT8 *)read_buffer, 29415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT8 *)up_sampled_buffer + btif_media_cb.media_feeding_state.pcm.aa_feed_residue, 29425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nb_byte_read, 29435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sizeof(up_sampled_buffer) - btif_media_cb.media_feeding_state.pcm.aa_feed_residue, 29445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &src_size_used); 29455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update the residue */ 29475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding_state.pcm.aa_feed_residue += dst_size_used; 29485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* only copy the pcm sample when we have up-sampled enough PCM */ 29505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if(btif_media_cb.media_feeding_state.pcm.aa_feed_residue >= bytes_needed) 29515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Copy the output pcm samples in SBC encoding buffer */ 29535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((UINT8 *)btif_media_cb.encoder.as16PcmBuffer, 29545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT8 *)up_sampled_buffer, 29555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bytes_needed); 29565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* update the residue */ 29575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding_state.pcm.aa_feed_residue -= bytes_needed; 29585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_cb.media_feeding_state.pcm.aa_feed_residue != 0) 29605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy((UINT8 *)up_sampled_buffer, 29625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (UINT8 *)up_sampled_buffer + bytes_needed, 29635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.media_feeding_state.pcm.aa_feed_residue); 29645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 29665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 29675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 29695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 29705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 29725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 29735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_aa_prep_sbc_2_send 29745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 29755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 29765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 29775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 29785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 29795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 2980ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavovstatic void btif_media_aa_prep_sbc_2_send(UINT8 nb_frame, 2981ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t timestamp_us) 29825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 29834a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov uint8_t remain_nb_frame = nb_frame; 29845fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren UINT16 blocm_x_subband = btif_media_cb.encoder.s16NumOfSubBands * 29855fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.encoder.s16NumOfBlocks; 29865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29875fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov while (nb_frame) { 29885fe6f0cf6b223e3ed6be4912d55b3ed5b41ce0cdPavlin Radoslavov BT_HDR *p_buf = osi_malloc(BTIF_MEDIA_AA_BUF_SIZE); 29895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Init buffer */ 29915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset = BTIF_MEDIA_AA_SBC_OFFSET; 29925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len = 0; 29935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->layer_specific = 0; 29945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 29955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project do 29965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 29975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Write @ of allocated buffer in encoder.pu8Packet */ 29985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project btif_media_cb.encoder.pu8Packet = (UINT8 *) (p_buf + 1) + p_buf->offset + p_buf->len; 29995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Fill allocated buffer with 0 */ 30005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(btif_media_cb.encoder.as16PcmBuffer, 0, blocm_x_subband 30015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * btif_media_cb.encoder.s16NumOfChannels); 30025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Read PCM data and upsample them if needed */ 30045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (btif_media_aa_read_feeding(UIPC_CH_ID_AV_AUDIO)) 30055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 30065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project SBC_Encoder(&(btif_media_cb.encoder)); 3007470aee234664fd75094c16dd2c70313ee28354c1Andre Eisenbach 30085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Update SBC frame length */ 30095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len += btif_media_cb.encoder.u16PacketLength; 30105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nb_frame--; 30115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->layer_specific++; 30125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 30145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3015e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_WARNING("btif_media_aa_prep_sbc_2_send underflow %d, %d", 3016b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren nb_frame, btif_media_cb.media_feeding_state.pcm.aa_feed_residue); 3017b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding_state.pcm.counter += nb_frame * 3018b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.encoder.s16NumOfSubBands * 3019b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.encoder.s16NumOfBlocks * 3020b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.num_channel * 3021b8ceaa484a09be14263d5f10d022a272f9602378Mattias Agren btif_media_cb.media_feeding.cfg.pcm.bit_per_sample / 8; 30225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* no more pcm to read */ 30235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project nb_frame = 0; 30245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* break read loop if timer was stopped (media task stopped) */ 302678bcff79e1b1f0efce436b33bdd6da88745bfc8aPavlin Radoslavov if (! alarm_is_scheduled(btif_media_cb.media_alarm)) 3027e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta { 3028abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 30295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3030e7c4f99f1ca3da0ac46aa7425a37b383177c699fHemant Gupta } 30315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } while (((p_buf->len + btif_media_cb.encoder.u16PacketLength) < btif_media_cb.TxAaMtuSize) 30345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project && (p_buf->layer_specific < 0x0F) && nb_frame); 30355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 303645f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta if(p_buf->len) 303745f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta { 30385fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren /* timestamp of the media packet header represent the TS of the first SBC frame 30395fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren i.e the timestamp before including this frame */ 304045f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta *((UINT32 *) (p_buf + 1)) = btif_media_cb.timestamp; 30415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30425fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren btif_media_cb.timestamp += p_buf->layer_specific * blocm_x_subband; 30435fd74f06caab4324d0ba69df86ad5170c072ec64Mattias Agren 304445f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta if (btif_media_cb.tx_flush) 304545f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta { 3046e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("### tx suspended, discarded frame ###"); 30475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3048ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.tx_queue_total_flushed_messages += 3049ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov fixed_queue_length(btif_media_cb.TxAaQ); 3050ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.tx_queue_last_flushed_us = 3051ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov timestamp_us; 3052ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_flush_q(btif_media_cb.TxAaQ); 305345f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta 3054abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 305545f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta return; 305645f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta } 30575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 305845f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta /* Enqueue the encoded SBC frame in AA Tx Queue */ 3059ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov update_scheduling_stats(&btif_media_cb.stats.tx_queue_enqueue_stats, 3060ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov timestamp_us, 3061ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov BTIF_SINK_MEDIA_TIME_TICK_MS * 1000); 30624a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov uint8_t done_nb_frame = remain_nb_frame - nb_frame; 30634a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov remain_nb_frame = nb_frame; 30644a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov btif_media_cb.stats.tx_queue_total_frames += done_nb_frame; 30654a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov if (done_nb_frame > btif_media_cb.stats.tx_queue_max_frames_per_packet) 30664a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov btif_media_cb.stats.tx_queue_max_frames_per_packet = done_nb_frame; 30671a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_enqueue(btif_media_cb.TxAaQ, p_buf); 306845f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta } 306945f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta else 307045f5f9077c773b9d4533fef13045b5ff77e32e46Ganesh Ganapathi Batta { 3071abd70abb5e42c9431df94fe9d2c4a78a0d8d9af9Pavlin Radoslavov osi_free(p_buf); 30725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 30745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 30755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 30775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 30785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 30795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_aa_prep_2_send 30805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 30815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 30825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 30835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 30845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 30855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 30865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3087ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavovstatic void btif_media_aa_prep_2_send(UINT8 nb_frame, uint64_t timestamp_us) 30885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3089196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach // Check for TX queue overflow 3090196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach 3091196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach if (nb_frame > MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ) 3092196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach nb_frame = MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ; 3093196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach 30941a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov if (fixed_queue_length(btif_media_cb.TxAaQ) > (MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ - nb_frame)) 3095c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach { 3096196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach APPL_TRACE_WARNING("%s() - TX queue buffer count %d/%d", __func__, 30971a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov fixed_queue_length(btif_media_cb.TxAaQ), 30981a3844f933bd63c8a381371dabfb35c6a0249e3ePavlin Radoslavov MAX_OUTPUT_A2DP_FRAME_QUEUE_SZ - nb_frame); 3099ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.tx_queue_dropouts++; 3100ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_cb.stats.tx_queue_last_dropouts_us = timestamp_us; 3101c5916e97384f07ec5a2e061e6af24f70107c74a2Andre Eisenbach 3102d881c4b46776fe03a5861a3021bbe739b1f3cc58Andre Eisenbach while (fixed_queue_length(btif_media_cb.TxAaQ)) { 3103d881c4b46776fe03a5861a3021bbe739b1f3cc58Andre Eisenbach btif_media_cb.stats.tx_queue_total_dropped_messages++; 3104d881c4b46776fe03a5861a3021bbe739b1f3cc58Andre Eisenbach osi_free(fixed_queue_try_dequeue(btif_media_cb.TxAaQ)); 3105d881c4b46776fe03a5861a3021bbe739b1f3cc58Andre Eisenbach } 3106ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov } 3107196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach 3108196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach // Transcode frame 31095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (btif_media_cb.TxTranscoding) 31115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 31125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_MEDIA_TRSCD_PCM_2_SBC: 3113ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_aa_prep_sbc_2_send(nb_frame, timestamp_us); 31145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 31155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 3117196413f5ca088ef97866092f02bb7571d2a44390Andre Eisenbach APPL_TRACE_ERROR("%s unsupported transcoding format 0x%x", __func__, btif_media_cb.TxTranscoding); 31185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 31195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 31215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 31235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 31245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function btif_media_send_aa_frame 31255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 31265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description 31275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 31285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 31295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 31305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 3131ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavovstatic void btif_media_send_aa_frame(uint64_t timestamp_us) 31325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 31338bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh UINT8 nb_frame_2_send = 0; 31348bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh UINT8 nb_iterations = 0; 31355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31368bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_get_num_aa_frame_iteration(&nb_iterations, &nb_frame_2_send); 31375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31388bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh if (nb_frame_2_send != 0) { 31398bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh for (UINT8 counter = 0; counter < nb_iterations; counter++) 31408bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh { 31418bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh /* format and queue buffer to send */ 31428bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh btif_media_aa_prep_2_send(nb_frame_2_send, timestamp_us); 31438bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh } 31444aebca4662c280fdc32e0ad3705cae064bfa068dZhihai Xu } 31455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31468bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh LOG_VERBOSE(LOG_TAG, "%s Sent %d frames per iteration, %d iterations", 31478bbbee165d2c8bb17353b11de1a3e74e089eff73Ayan Ghosh __func__, nb_frame_2_send, nb_iterations); 31485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_ci_src_data_ready(BTA_AV_CHNL_AUDIO); 31495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 31505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif /* BTA_AV_INCLUDED == TRUE */ 31525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 31545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 31555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function dump_codec_info 31565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 31575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Decode and display codec_info (for debug) 31585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 31595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 31605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 31615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 31625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid dump_codec_info(unsigned char *p_codec) 31635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 31645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_STATUS a2d_status; 31655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_SBC_CIE sbc_cie; 31665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project a2d_status = A2D_ParsSbcInfo(&sbc_cie, p_codec, FALSE); 31685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (a2d_status != A2D_SUCCESS) 31695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 3170e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status); 31715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 31725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 31735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3174e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("dump_codec_info"); 31755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_16) 3177e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tsamp_freq:%d (16000)", sbc_cie.samp_freq);} 31785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_32) 3179e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tsamp_freq:%d (32000)", sbc_cie.samp_freq);} 31805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_44) 3181e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tsamp_freq:%d (44.100)", sbc_cie.samp_freq);} 31825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.samp_freq == A2D_SBC_IE_SAMP_FREQ_48) 3183e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tsamp_freq:%d (48000)", sbc_cie.samp_freq);} 31845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3185e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tBAD samp_freq:%d", sbc_cie.samp_freq);} 31865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_MONO) 3188e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tch_mode:%d (Mono)", sbc_cie.ch_mode);} 31895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_DUAL) 3190e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tch_mode:%d (Dual)", sbc_cie.ch_mode);} 31915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_STEREO) 3192e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tch_mode:%d (Stereo)", sbc_cie.ch_mode);} 31935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.ch_mode == A2D_SBC_IE_CH_MD_JOINT) 3194e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tch_mode:%d (Joint)", sbc_cie.ch_mode);} 31955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3196e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tBAD ch_mode:%d", sbc_cie.ch_mode);} 31975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 31985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_4) 3199e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tblock_len:%d (4)", sbc_cie.block_len);} 32005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_8) 3201e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tblock_len:%d (8)", sbc_cie.block_len);} 32025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_12) 3203e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tblock_len:%d (12)", sbc_cie.block_len);} 32045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.block_len == A2D_SBC_IE_BLOCKS_16) 3205e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tblock_len:%d (16)", sbc_cie.block_len);} 32065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3207e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tBAD block_len:%d", sbc_cie.block_len);} 32085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_4) 3210e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tnum_subbands:%d (4)", sbc_cie.num_subbands);} 32115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.num_subbands == A2D_SBC_IE_SUBBAND_8) 3212e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tnum_subbands:%d (8)", sbc_cie.num_subbands);} 32135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3214e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tBAD num_subbands:%d", sbc_cie.num_subbands);} 32155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_S) 3217e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\talloc_mthd:%d (SNR)", sbc_cie.alloc_mthd);} 32185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if (sbc_cie.alloc_mthd == A2D_SBC_IE_ALLOC_MD_L) 3219e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\talloc_mthd:%d (Loundess)", sbc_cie.alloc_mthd);} 32205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 3221e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati { APPL_TRACE_DEBUG("\tBAD alloc_mthd:%d", sbc_cie.alloc_mthd);} 32225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3223e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("\tBit pool Min:%d Max:%d", sbc_cie.min_bitpool, sbc_cie.max_bitpool); 32245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 32255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3226f7dd9f5779680da37dc89e5df2b26d436487818cHemant Gupta 3227ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavovvoid btif_debug_a2dp_dump(int fd) 3228ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov{ 3229ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t now_us = time_now_us(); 3230ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov btif_media_stats_t *stats = &btif_media_cb.stats; 3231ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov scheduling_stats_t *enqueue_stats = &stats->tx_queue_enqueue_stats; 3232ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov scheduling_stats_t *dequeue_stats = &stats->tx_queue_dequeue_stats; 3233ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov size_t ave_size; 3234ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov uint64_t ave_time_us; 3235ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 3236ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov dprintf(fd, "\nA2DP State:\n"); 32378efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " TxQueue:\n"); 3238ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 32398efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Counts (enqueue/dequeue/readbuf) : %zu / %zu / %zu\n", 3240ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov enqueue_stats->total_updates, 3241ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov dequeue_stats->total_updates, 3242ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->tx_queue_total_readbuf_calls); 3243ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 32448efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Last update time ago in ms (enqueue/dequeue/readbuf) : %llu / %llu / %llu\n", 3245ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (enqueue_stats->last_update_us > 0) ? 3246ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)(now_us - enqueue_stats->last_update_us) / 1000 : 0, 3247ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (dequeue_stats->last_update_us > 0) ? 3248ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)(now_us - dequeue_stats->last_update_us) / 1000 : 0, 3249ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (stats->tx_queue_last_readbuf_us > 0)? 3250ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)(now_us - stats->tx_queue_last_readbuf_us) / 1000 : 0); 3251ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 3252ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov ave_size = 0; 32534a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov if (stats->media_read_expected_count != 0) 32544a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov ave_size = stats->media_read_total_expected_frames / stats->media_read_expected_count; 32554a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov dprintf(fd, " Frames expected (total/max/ave) : %zu / %zu / %zu\n", 32564a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov stats->media_read_total_expected_frames, 32574a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov stats->media_read_max_expected_frames, 32584a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov ave_size); 32594a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov 32604a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov ave_size = 0; 32614a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov if (stats->media_read_limited_count != 0) 32624a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov ave_size = stats->media_read_total_limited_frames / stats->media_read_limited_count; 32634a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov dprintf(fd, " Frames limited (total/max/ave) : %zu / %zu / %zu\n", 32644a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov stats->media_read_total_limited_frames, 32654a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov stats->media_read_max_limited_frames, 32664a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov ave_size); 32674a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov 32684a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov dprintf(fd, " Counts (expected/limited) : %zu / %zu\n", 32694a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov stats->media_read_expected_count, 32704a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov stats->media_read_limited_count); 32714a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov 32724a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov ave_size = 0; 3273ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov if (enqueue_stats->total_updates != 0) 3274ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov ave_size = stats->tx_queue_total_frames / enqueue_stats->total_updates; 32758efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Frames per packet (total/max/ave) : %zu / %zu / %zu\n", 3276ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->tx_queue_total_frames, 32774a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov stats->tx_queue_max_frames_per_packet, 3278ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov ave_size); 3279ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 32808efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Counts (flushed/dropped/dropouts) : %zu / %zu / %zu\n", 3281ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->tx_queue_total_flushed_messages, 3282ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->tx_queue_total_dropped_messages, 3283ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->tx_queue_dropouts); 3284ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 32858efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Last update time ago in ms (flushed/dropped) : %llu / %llu\n", 3286ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (stats->tx_queue_last_flushed_us > 0) ? 3287ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)(now_us - stats->tx_queue_last_flushed_us) / 1000 : 0, 3288ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (stats->tx_queue_last_dropouts_us > 0)? 3289ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)(now_us - stats->tx_queue_last_dropouts_us)/ 1000 : 0); 3290ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 32918efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Counts (underflow/underrun) : %zu / %zu\n", 3292ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->media_read_total_underflow_count, 3293ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->media_read_total_underrun_count); 3294ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 32958efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Bytes (underflow/underrun) : %zu / %zu\n", 3296ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->media_read_total_underflow_bytes, 3297ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov stats->media_read_total_underrun_bytes); 3298ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 32998efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Last update time ago in ms (underflow/underrun) : %llu / %llu\n", 3300ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (stats->media_read_last_underflow_us > 0) ? 3301ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)(now_us - stats->media_read_last_underflow_us) / 1000 : 0, 3302ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (stats->media_read_last_underrun_us > 0)? 3303ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)(now_us - stats->media_read_last_underrun_us) / 1000 : 0); 3304ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 3305ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // 3306ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // TxQueue enqueue stats 3307ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // 33088efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Enqueue deviation counts (overdue/premature) : %zu / %zu\n", 3309ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov enqueue_stats->overdue_scheduling_count, 3310ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov enqueue_stats->premature_scheduling_count); 3311ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 3312ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov ave_time_us = 0; 3313ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov if (enqueue_stats->overdue_scheduling_count != 0) { 3314ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov ave_time_us = enqueue_stats->total_overdue_scheduling_delta_us / 3315ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov enqueue_stats->overdue_scheduling_count; 3316ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov } 33178efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Enqueue overdue scheduling time in ms (total/max/ave) : %llu / %llu / %llu\n", 3318ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)enqueue_stats->total_overdue_scheduling_delta_us / 1000, 3319ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)enqueue_stats->max_overdue_scheduling_delta_us / 1000, 3320ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)ave_time_us / 1000); 3321ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 3322ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov ave_time_us = 0; 3323ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov if (enqueue_stats->premature_scheduling_count != 0) { 3324ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov ave_time_us = enqueue_stats->total_premature_scheduling_delta_us / 3325ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov enqueue_stats->premature_scheduling_count; 3326ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov } 33278efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Enqueue premature scheduling time in ms (total/max/ave) : %llu / %llu / %llu\n", 3328ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)enqueue_stats->total_premature_scheduling_delta_us / 1000, 3329ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)enqueue_stats->max_premature_scheduling_delta_us / 1000, 3330ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)ave_time_us / 1000); 3331ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 3332ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 3333ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // 3334ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // TxQueue dequeue stats 3335ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov // 33368efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Dequeue deviation counts (overdue/premature) : %zu / %zu\n", 3337ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov dequeue_stats->overdue_scheduling_count, 3338ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov dequeue_stats->premature_scheduling_count); 3339ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 3340ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov ave_time_us = 0; 3341ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov if (dequeue_stats->overdue_scheduling_count != 0) { 3342ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov ave_time_us = dequeue_stats->total_overdue_scheduling_delta_us / 3343ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov dequeue_stats->overdue_scheduling_count; 3344ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov } 33458efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Dequeue overdue scheduling time in ms (total/max/ave) : %llu / %llu / %llu\n", 3346ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)dequeue_stats->total_overdue_scheduling_delta_us / 1000, 3347ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)dequeue_stats->max_overdue_scheduling_delta_us / 1000, 3348ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)ave_time_us / 1000); 3349ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 3350ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov ave_time_us = 0; 3351ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov if (dequeue_stats->premature_scheduling_count != 0) { 3352ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov ave_time_us = dequeue_stats->total_premature_scheduling_delta_us / 3353ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov dequeue_stats->premature_scheduling_count; 3354ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov } 33558efca14b7f6570659d5e7a73327e2288cc544922Ajay Panicker dprintf(fd, " Dequeue premature scheduling time in ms (total/max/ave) : %llu / %llu / %llu\n", 3356ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)dequeue_stats->total_premature_scheduling_delta_us / 1000, 3357ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)dequeue_stats->max_premature_scheduling_delta_us / 1000, 3358ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov (unsigned long long)ave_time_us / 1000); 3359ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov 3360ffba52aeef45451226991d9443c4442a33a7f231Pavlin Radoslavov} 33614e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov 33624e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavovvoid btif_update_a2dp_metrics(void) 33634e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov{ 33644e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov uint64_t now_us = time_now_us(); 33654e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov btif_media_stats_t *stats = &btif_media_cb.stats; 33664e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov scheduling_stats_t *dequeue_stats = &stats->tx_queue_dequeue_stats; 33674e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov int32_t media_timer_min_ms = 0; 33684e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov int32_t media_timer_max_ms = 0; 33694e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov int32_t media_timer_avg_ms = 0; 33704e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov int32_t buffer_overruns_max_count = 0; 33714e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov int32_t buffer_overruns_total = 0; 33724e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov float buffer_underruns_average = 0.0; 33734e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov int32_t buffer_underruns_count = 0; 33744e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov 33754e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov int64_t session_duration_sec = 33764e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov (now_us - stats->session_start_us) / (1000 * 1000); 33774e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov 33784a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov /* NOTE: Disconnect reason is unused */ 33794e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov const char *disconnect_reason = NULL; 33804e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov uint32_t device_class = BTM_COD_MAJOR_AUDIO; 33814e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov 33824e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov if (dequeue_stats->total_updates > 1) { 33834e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov media_timer_min_ms = BTIF_SINK_MEDIA_TIME_TICK_MS - 33844e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov (dequeue_stats->max_premature_scheduling_delta_us / 1000); 33854e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov media_timer_max_ms = BTIF_SINK_MEDIA_TIME_TICK_MS + 33864e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov (dequeue_stats->max_overdue_scheduling_delta_us / 1000); 33874e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov 33884e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov uint64_t total_scheduling_count = 33894e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov dequeue_stats->overdue_scheduling_count + 33904e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov dequeue_stats->premature_scheduling_count + 33914e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov dequeue_stats->exact_scheduling_count; 33924e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov if (total_scheduling_count > 0) { 33934e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov media_timer_avg_ms = dequeue_stats->total_scheduling_time_us / 33944e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov (1000 * total_scheduling_count); 33954e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov } 33964e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov 33974a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov buffer_overruns_max_count = stats->media_read_max_expected_frames; 33984e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov buffer_overruns_total = stats->tx_queue_total_dropped_messages; 33994e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov buffer_underruns_count = stats->media_read_total_underflow_count + 34004e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov stats->media_read_total_underrun_count; 34014a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov if (buffer_underruns_count > 0) { 34024a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov buffer_underruns_average = 34034a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov (stats->media_read_total_underflow_bytes + stats->media_read_total_underrun_bytes) / buffer_underruns_count; 34044a58ac919bcd03a825a811ac1c799ccd22a857daPavlin Radoslavov } 34054e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov } 34064e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov 34074e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov metrics_a2dp_session(session_duration_sec, disconnect_reason, device_class, 34084e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov media_timer_min_ms, media_timer_max_ms, 34094e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov media_timer_avg_ms, buffer_overruns_max_count, 34104e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov buffer_overruns_total, buffer_underruns_average, 34114e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov buffer_underruns_count); 34124e6b1c82b78aa17c887376c14cf323bed02e1fd4Pavlin Radoslavov} 3413