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