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