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