15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/****************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright (C) 2004-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 * This is the advanced audio/video call-out function implementation for 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * BTIF. 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ******************************************************************************/ 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "string.h" 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "a2d_api.h" 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "a2d_sbc.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_sys.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_av_api.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_av_co.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_av_ci.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "bta_av_sbc.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_media.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "sbc_encoder.h" 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "btif_av_co.h" 385cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen#include "btif_util.h" 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Constants 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *****************************************************************************/ 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 45e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati#define FUNC_TRACE() APPL_TRACE_DEBUG("%s", __FUNCTION__); 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Macro to retrieve the number of elements in a statically allocated array */ 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_CO_NUM_ELEMENTS(__a) (sizeof(__a)/sizeof((__a)[0])) 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* MIN and MAX macros */ 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_CO_MIN(X,Y) ((X) < (Y) ? (X) : (Y)) 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_CO_MAX(X,Y) ((X) > (Y) ? (X) : (Y)) 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Macro to convert audio handle to index and vice versa */ 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_CO_AUDIO_HNDL_TO_INDX(hndl) (((hndl) & (~BTA_AV_CHNL_MSK)) - 1) 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_CO_AUDIO_INDX_TO_HNDL(indx) (((indx) + 1) | BTA_AV_CHNL_AUDIO) 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Offsets to access codec information in SBC codec */ 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_CO_SBC_FREQ_CHAN_OFF 3 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_CO_SBC_BLOCK_BAND_OFF 4 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_CO_SBC_MIN_BITPOOL_OFF 5 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_CO_SBC_MAX_BITPOOL_OFF 6 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTA_AV_CO_SBC_MAX_BITPOOL 53 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* SCMS-T protect info */ 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst UINT8 bta_av_co_cp_scmst[BTA_AV_CP_INFO_LEN] = "\x02\x02\x00"; 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 70cc35559160745c60b42ae182002a59337d844d09Hemant Gupta/* SBC SRC codec capabilities */ 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tA2D_SBC_CIE bta_av_co_sbc_caps = 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (A2D_SBC_IE_SAMP_FREQ_44), /* samp_freq */ 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (A2D_SBC_IE_CH_MD_MONO | A2D_SBC_IE_CH_MD_STEREO | A2D_SBC_IE_CH_MD_JOINT | A2D_SBC_IE_CH_MD_DUAL), /* ch_mode */ 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (A2D_SBC_IE_BLOCKS_16 | A2D_SBC_IE_BLOCKS_12 | A2D_SBC_IE_BLOCKS_8 | A2D_SBC_IE_BLOCKS_4), /* block_len */ 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (A2D_SBC_IE_SUBBAND_4 | A2D_SBC_IE_SUBBAND_8), /* num_subbands */ 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (A2D_SBC_IE_ALLOC_MD_L | A2D_SBC_IE_ALLOC_MD_S), /* alloc_mthd */ 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_CO_SBC_MAX_BITPOOL, /* max_bitpool */ 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project A2D_SBC_IE_MIN_BITPOOL /* min_bitpool */ 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 82cc35559160745c60b42ae182002a59337d844d09Hemant Gupta/* SBC SINK codec capabilities */ 83cc35559160745c60b42ae182002a59337d844d09Hemant Guptaconst tA2D_SBC_CIE bta_av_co_sbc_sink_caps = 84cc35559160745c60b42ae182002a59337d844d09Hemant Gupta{ 85cc35559160745c60b42ae182002a59337d844d09Hemant Gupta (A2D_SBC_IE_SAMP_FREQ_48 | A2D_SBC_IE_SAMP_FREQ_44), /* samp_freq */ 86cc35559160745c60b42ae182002a59337d844d09Hemant Gupta (A2D_SBC_IE_CH_MD_MONO | A2D_SBC_IE_CH_MD_STEREO | A2D_SBC_IE_CH_MD_JOINT | A2D_SBC_IE_CH_MD_DUAL), /* ch_mode */ 87cc35559160745c60b42ae182002a59337d844d09Hemant Gupta (A2D_SBC_IE_BLOCKS_16 | A2D_SBC_IE_BLOCKS_12 | A2D_SBC_IE_BLOCKS_8 | A2D_SBC_IE_BLOCKS_4), /* block_len */ 88cc35559160745c60b42ae182002a59337d844d09Hemant Gupta (A2D_SBC_IE_SUBBAND_4 | A2D_SBC_IE_SUBBAND_8), /* num_subbands */ 89cc35559160745c60b42ae182002a59337d844d09Hemant Gupta (A2D_SBC_IE_ALLOC_MD_L | A2D_SBC_IE_ALLOC_MD_S), /* alloc_mthd */ 90cc35559160745c60b42ae182002a59337d844d09Hemant Gupta A2D_SBC_IE_MAX_BITPOOL, /* max_bitpool */ 91cc35559160745c60b42ae182002a59337d844d09Hemant Gupta A2D_SBC_IE_MIN_BITPOOL /* min_bitpool */ 92cc35559160745c60b42ae182002a59337d844d09Hemant Gupta}; 93cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if !defined(BTIF_AV_SBC_DEFAULT_SAMP_FREQ) 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define BTIF_AV_SBC_DEFAULT_SAMP_FREQ A2D_SBC_IE_SAMP_FREQ_44 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Default SBC codec configuration */ 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectconst tA2D_SBC_CIE btif_av_sbc_default_config = 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTIF_AV_SBC_DEFAULT_SAMP_FREQ, /* samp_freq */ 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project A2D_SBC_IE_CH_MD_JOINT, /* ch_mode */ 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project A2D_SBC_IE_BLOCKS_16, /* block_len */ 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project A2D_SBC_IE_SUBBAND_8, /* num_subbands */ 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project A2D_SBC_IE_ALLOC_MD_L, /* alloc_mthd */ 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_CO_SBC_MAX_BITPOOL, /* max_bitpool */ 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project A2D_SBC_IE_MIN_BITPOOL /* min_bitpool */ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project}; 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/***************************************************************************** 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project** Local data 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project*****************************************************************************/ 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 sep_info_idx; /* local SEP index (in BTA tables) */ 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 seid; /* peer SEP index (in peer tables) */ 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 codec_type; /* peer SEP codec type */ 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 codec_caps[AVDT_CODEC_SIZE]; /* peer SEP codec capabilities */ 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_protect; /* peer SEP number of CP elements */ 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 protect_info[BTA_AV_CP_INFO_LEN]; /* peer SEP content protection info */ 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTA_AV_CO_SINK; 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BD_ADDR addr; /* address of audio/video peer */ 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_SINK snks[BTIF_SV_AV_AA_SEP_INDEX]; /* array of supported sinks */ 128cc35559160745c60b42ae182002a59337d844d09Hemant Gupta tBTA_AV_CO_SINK srcs[BTIF_SV_AV_AA_SEP_INDEX]; /* array of supported srcs */ 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_snks; /* total number of sinks at peer */ 130cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT8 num_srcs; /* total number of srcs at peer */ 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_seps; /* total number of seids at peer */ 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_rx_snks; /* number of received sinks */ 133cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT8 num_rx_srcs; /* number of received srcs */ 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_sup_snks; /* number of supported sinks in the snks array */ 135cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT8 num_sup_srcs; /* number of supported srcs in the srcs array */ 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_SINK *p_snk; /* currently selected sink */ 137cc35559160745c60b42ae182002a59337d844d09Hemant Gupta tBTA_AV_CO_SINK *p_src; /* currently selected src */ 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 codec_cfg[AVDT_CODEC_SIZE]; /* current codec configuration */ 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN cp_active; /* current CP configuration */ 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN acp; /* acceptor */ 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN recfg_needed; /* reconfiguration is needed */ 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN opened; /* opened */ 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 mtu; /* maximum transmit unit size */ 144cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT16 uuid_to_connect; /* uuid of peer device */ 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTA_AV_CO_PEER; 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN active; 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 flag; 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTA_AV_CO_CP; 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projecttypedef struct 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Connected peer information */ 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_PEER peers[BTA_AV_NUM_STRS]; 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Current codec configuration - access to this variable must be protected */ 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_CODEC_INFO codec_cfg; 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_CODEC_INFO codec_cfg_setconfig; /* remote peer setconfig preference */ 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_CP cp; 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} tBTA_AV_CO_CB; 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/* Control block instance */ 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_AV_CO_CB bta_av_co_cb; 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_co_audio_codec_build_config(const UINT8 *p_codec_caps, UINT8 *p_codec_cfg); 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_co_audio_peer_reset_config(tBTA_AV_CO_PEER *p_peer); 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_co_cp_is_scmst(const UINT8 *p_protectinfo); 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_co_audio_sink_has_scmst(const tBTA_AV_CO_SINK *p_sink); 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_co_audio_peer_supports_codec(tBTA_AV_CO_PEER *p_peer, UINT8 *p_snk_index); 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_co_audio_media_supports_config(UINT8 codec_type, const UINT8 *p_codec_cfg); 173cc35559160745c60b42ae182002a59337d844d09Hemant Guptastatic BOOLEAN bta_av_co_audio_sink_supports_config(UINT8 codec_type, const UINT8 *p_codec_cfg); 174cc35559160745c60b42ae182002a59337d844d09Hemant Guptastatic BOOLEAN bta_av_co_audio_peer_src_supports_codec(tBTA_AV_CO_PEER *p_peer, UINT8 *p_src_index); 1755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_cp_is_active 1815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Get the current configuration of content protection 1835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if the current streaming has CP, FALSE otherwise 1855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 1875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_av_co_cp_is_active(void) 1885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 1905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return bta_av_co_cb.cp.active; 1915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 1945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_cp_get_flag 1965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Get content protection flag 1985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** BTA_AV_CP_SCMS_COPY_NEVER 1995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** BTA_AV_CP_SCMS_COPY_ONCE 2005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** BTA_AV_CP_SCMS_COPY_FREE 2015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns The current flag value 2035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 2055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectUINT8 bta_av_co_cp_get_flag(void) 2065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 2085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return bta_av_co_cb.cp.flag; 2095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_cp_set_flag 2145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Set content protection flag 2165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** BTA_AV_CP_SCMS_COPY_NEVER 2175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** BTA_AV_CP_SCMS_COPY_ONCE 2185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** BTA_AV_CP_SCMS_COPY_FREE 2195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if setting the SCMS flag is supported else FALSE 2215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 2235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_av_co_cp_set_flag(UINT8 cp_flag) 2245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 2265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE) 2285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 2295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (cp_flag != BTA_AV_CP_SCMS_COPY_FREE) 2305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 2325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 2345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_cb.cp.flag = cp_flag; 2355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 2365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_get_peer 2415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description find the peer entry for a given handle 2435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns the control block 2455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 2475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic tBTA_AV_CO_PEER *bta_av_co_get_peer(tBTA_AV_HNDL hndl) 2485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 index; 2505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 2515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index = BTA_AV_CO_AUDIO_HNDL_TO_INDX(hndl); 2535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Sanity check */ 2555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (index >= BTA_AV_CO_NUM_ELEMENTS(bta_av_co_cb.peers)) 2565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 257e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_get_peer peer index out of bounds:%d", index); 2585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return NULL; 2595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 2605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return &bta_av_co_cb.peers[index]; 2625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 2635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 2655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_init 2675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description This callout function is executed by AV when it is 2695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** started by calling BTA_AvRegister(). This function can be 2705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** used by the phone to initialize audio paths or for other 2715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** initialization purposes. 2725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns Stream codec and content protection capabilities info. 2755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 2765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 2775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_av_co_audio_init(UINT8 *p_codec_type, UINT8 *p_codec_info, UINT8 *p_num_protect, 2785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p_protect_info, UINT8 index) 2795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 2805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 2815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 282e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_init: %d", index); 2835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 284d81bd014fe76408692ac2f57cf6c1423ae2a2751Anubhav Gupta /* By default - no content protection info */ 285d81bd014fe76408692ac2f57cf6c1423ae2a2751Anubhav Gupta *p_num_protect = 0; 286d81bd014fe76408692ac2f57cf6c1423ae2a2751Anubhav Gupta *p_protect_info = 0; 287d81bd014fe76408692ac2f57cf6c1423ae2a2751Anubhav Gupta 288d81bd014fe76408692ac2f57cf6c1423ae2a2751Anubhav Gupta /* reset remote preference through setconfig */ 289d81bd014fe76408692ac2f57cf6c1423ae2a2751Anubhav Gupta bta_av_co_cb.codec_cfg_setconfig.id = BTIF_AV_CODEC_NONE; 290d81bd014fe76408692ac2f57cf6c1423ae2a2751Anubhav Gupta 291d81bd014fe76408692ac2f57cf6c1423ae2a2751Anubhav Gupta switch (index) 292d81bd014fe76408692ac2f57cf6c1423ae2a2751Anubhav Gupta { 293d81bd014fe76408692ac2f57cf6c1423ae2a2751Anubhav Gupta case BTIF_SV_AV_AA_SBC_INDEX: 2945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE) 2955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 2965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p = p_protect_info; 2975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 2985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Content protection info - support SCMS-T */ 2995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_num_protect = 1; 3005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p++ = BTA_AV_CP_LOSC; 3015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16_TO_STREAM(p, BTA_AV_CP_SCMS_T_ID); 3025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 305cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* Set up for SBC codec for SRC*/ 3065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_codec_type = BTA_AV_CODEC_SBC; 3075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* This should not fail because we are using constants for parameters */ 3095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project A2D_BldSbcInfo(AVDT_MEDIA_AUDIO, (tA2D_SBC_CIE *) &bta_av_co_sbc_caps, p_codec_info); 3105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Codec is valid */ 3125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 3136718c6d9fcfe373a679a529aca003d32062f81dclungtsai_lin#if (BTA_AV_SINK_INCLUDED == TRUE) 314cc35559160745c60b42ae182002a59337d844d09Hemant Gupta case BTIF_SV_AV_AA_SBC_SINK_INDEX: 315cc35559160745c60b42ae182002a59337d844d09Hemant Gupta *p_codec_type = BTA_AV_CODEC_SBC; 3165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 317cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* This should not fail because we are using constants for parameters */ 318cc35559160745c60b42ae182002a59337d844d09Hemant Gupta A2D_BldSbcInfo(AVDT_MEDIA_AUDIO, (tA2D_SBC_CIE *) &bta_av_co_sbc_sink_caps, p_codec_info); 3195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 320cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* Codec is valid */ 321cc35559160745c60b42ae182002a59337d844d09Hemant Gupta return TRUE; 322cc35559160745c60b42ae182002a59337d844d09Hemant Gupta#endif 3235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 3245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Not valid */ 3255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 3265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_disc_res 3325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description This callout function is executed by AV to report the 3345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** number of stream end points (SEP) were found during the 3355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** AVDT stream discovery process. 3365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void. 3395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 3405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 34124933b5b1a06274c47133debac5251a97128a267June R. Tate-Gansvoid bta_av_co_audio_disc_res(tBTA_AV_HNDL hndl, UINT8 num_seps, UINT8 num_snk, 342cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT8 num_src, BD_ADDR addr, UINT16 uuid_local) 3435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 3445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_PEER *p_peer; 3455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 3475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 348e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_disc_res h:x%x num_seps:%d num_snk:%d num_src:%d", 349cc35559160745c60b42ae182002a59337d844d09Hemant Gupta hndl, num_seps, num_snk, num_src); 3505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find the peer info */ 3525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer = bta_av_co_get_peer(hndl); 3535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer == NULL) 3545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 355e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_disc_res could not find peer entry"); 3565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 3575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Sanity check : this should never happen */ 3605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer->opened) 3615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 362e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_disc_res peer already opened"); 3635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 3645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Copy the discovery results */ 3665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bdcpy(p_peer->addr, addr); 3675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->num_snks = num_snk; 368cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_peer->num_srcs = num_src; 3695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->num_seps = num_seps; 3705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->num_rx_snks = 0; 371cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_peer->num_rx_srcs = 0; 3725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->num_sup_snks = 0; 373cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (uuid_local == UUID_SERVCLASS_AUDIO_SINK) 374cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_peer->uuid_to_connect = UUID_SERVCLASS_AUDIO_SOURCE; 375cc35559160745c60b42ae182002a59337d844d09Hemant Gupta else if (uuid_local == UUID_SERVCLASS_AUDIO_SOURCE) 376cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_peer->uuid_to_connect = UUID_SERVCLASS_AUDIO_SINK; 3775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 3785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 3795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 3805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 381cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** Function bta_av_build_src_cfg 382cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 383cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** Description This function will build preferred config from src capabilities 384cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 385cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 386cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** Returns Pass or Fail for current getconfig. 387cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 388cc35559160745c60b42ae182002a59337d844d09Hemant Gupta *******************************************************************************/ 389cc35559160745c60b42ae182002a59337d844d09Hemant Guptavoid bta_av_build_src_cfg (UINT8 *p_pref_cfg, UINT8 *p_src_cap) 390cc35559160745c60b42ae182002a59337d844d09Hemant Gupta{ 391cc35559160745c60b42ae182002a59337d844d09Hemant Gupta tA2D_SBC_CIE src_cap; 392cc35559160745c60b42ae182002a59337d844d09Hemant Gupta tA2D_SBC_CIE pref_cap; 393cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT8 status = 0; 394cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 395cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* initialize it to default SBC configuration */ 396cc35559160745c60b42ae182002a59337d844d09Hemant Gupta A2D_BldSbcInfo(AVDT_MEDIA_AUDIO, (tA2D_SBC_CIE *) &btif_av_sbc_default_config, p_pref_cfg); 397cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* now try to build a preferred one */ 398cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* parse configuration */ 399cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if ((status = A2D_ParsSbcInfo(&src_cap, p_src_cap, TRUE)) != 0) 400cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 401e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Cant parse src cap ret = %d", status); 402cc35559160745c60b42ae182002a59337d844d09Hemant Gupta return ; 403cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 404cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 405cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (src_cap.samp_freq & A2D_SBC_IE_SAMP_FREQ_48) 406cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.samp_freq = A2D_SBC_IE_SAMP_FREQ_48; 407cc35559160745c60b42ae182002a59337d844d09Hemant Gupta else if (src_cap.samp_freq & A2D_SBC_IE_SAMP_FREQ_44) 408cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.samp_freq = A2D_SBC_IE_SAMP_FREQ_44; 409cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 410cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_JOINT) 411cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.ch_mode = A2D_SBC_IE_CH_MD_JOINT; 412cc35559160745c60b42ae182002a59337d844d09Hemant Gupta else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_STEREO) 413cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.ch_mode = A2D_SBC_IE_CH_MD_STEREO; 414cc35559160745c60b42ae182002a59337d844d09Hemant Gupta else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_DUAL) 415cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.ch_mode = A2D_SBC_IE_CH_MD_DUAL; 416cc35559160745c60b42ae182002a59337d844d09Hemant Gupta else if (src_cap.ch_mode & A2D_SBC_IE_CH_MD_MONO) 417cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.ch_mode = A2D_SBC_IE_CH_MD_MONO; 418cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 419cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (src_cap.block_len & A2D_SBC_IE_BLOCKS_16) 420cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.block_len = A2D_SBC_IE_BLOCKS_16; 421cc35559160745c60b42ae182002a59337d844d09Hemant Gupta else if (src_cap.block_len & A2D_SBC_IE_BLOCKS_12) 422cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.block_len = A2D_SBC_IE_BLOCKS_12; 423cc35559160745c60b42ae182002a59337d844d09Hemant Gupta else if (src_cap.block_len & A2D_SBC_IE_BLOCKS_8) 424cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.block_len = A2D_SBC_IE_BLOCKS_8; 425cc35559160745c60b42ae182002a59337d844d09Hemant Gupta else if (src_cap.block_len & A2D_SBC_IE_BLOCKS_4) 426cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.block_len = A2D_SBC_IE_BLOCKS_4; 427cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 428cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (src_cap.num_subbands & A2D_SBC_IE_SUBBAND_8) 429cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.num_subbands = A2D_SBC_IE_SUBBAND_8; 430cc35559160745c60b42ae182002a59337d844d09Hemant Gupta else if(src_cap.num_subbands & A2D_SBC_IE_SUBBAND_4) 431cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.num_subbands = A2D_SBC_IE_SUBBAND_4; 432cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 433cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (src_cap.alloc_mthd & A2D_SBC_IE_ALLOC_MD_L) 434cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.alloc_mthd = A2D_SBC_IE_ALLOC_MD_L; 435cc35559160745c60b42ae182002a59337d844d09Hemant Gupta else if(src_cap.alloc_mthd & A2D_SBC_IE_ALLOC_MD_S) 436cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.alloc_mthd = A2D_SBC_IE_ALLOC_MD_S; 437cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 438cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.max_bitpool = src_cap.max_bitpool; 439cc35559160745c60b42ae182002a59337d844d09Hemant Gupta pref_cap.min_bitpool = src_cap.min_bitpool; 440cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 441cc35559160745c60b42ae182002a59337d844d09Hemant Gupta A2D_BldSbcInfo(AVDT_MEDIA_AUDIO, (tA2D_SBC_CIE *) &pref_cap, p_pref_cfg); 442cc35559160745c60b42ae182002a59337d844d09Hemant Gupta} 443cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 444cc35559160745c60b42ae182002a59337d844d09Hemant Gupta/******************************************************************************* 445cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 446cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** Function bta_av_audio_sink_getconfig 447cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 448cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** Description This callout function is executed by AV to retrieve the 449cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** desired codec and content protection configuration for the 450cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** A2DP Sink audio stream in Initiator. 451cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 452cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 453cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** Returns Pass or Fail for current getconfig. 454cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 455cc35559160745c60b42ae182002a59337d844d09Hemant Gupta *******************************************************************************/ 456cc35559160745c60b42ae182002a59337d844d09Hemant GuptaUINT8 bta_av_audio_sink_getconfig(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type, 457cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT8 *p_codec_info, UINT8 *p_sep_info_idx, UINT8 seid, UINT8 *p_num_protect, 458cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT8 *p_protect_info) 459cc35559160745c60b42ae182002a59337d844d09Hemant Gupta{ 460cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 461cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT8 result = A2D_FAIL; 462cc35559160745c60b42ae182002a59337d844d09Hemant Gupta BOOLEAN supported; 463cc35559160745c60b42ae182002a59337d844d09Hemant Gupta tBTA_AV_CO_PEER *p_peer; 464cc35559160745c60b42ae182002a59337d844d09Hemant Gupta tBTA_AV_CO_SINK *p_src; 465cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT8 pref_cfg[AVDT_CODEC_SIZE]; 466cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT8 index; 467cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 468cc35559160745c60b42ae182002a59337d844d09Hemant Gupta FUNC_TRACE(); 469cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 470e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig handle:0x%x codec_type:%d seid:%d", 471cc35559160745c60b42ae182002a59337d844d09Hemant Gupta hndl, codec_type, seid); 472e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("num_protect:0x%02x protect_info:0x%02x%02x%02x", 473cc35559160745c60b42ae182002a59337d844d09Hemant Gupta *p_num_protect, p_protect_info[0], p_protect_info[1], p_protect_info[2]); 474cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 475cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* Retrieve the peer info */ 476cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_peer = bta_av_co_get_peer(hndl); 477cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (p_peer == NULL) 478cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 479e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_audio_sink_getconfig could not find peer entry"); 480cc35559160745c60b42ae182002a59337d844d09Hemant Gupta return A2D_FAIL; 481cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 482cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 483e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig peer(o=%d,n_snks=%d,n_rx_snks=%d,n_sup_snks=%d)", 484cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_peer->opened, p_peer->num_srcs, p_peer->num_rx_srcs, p_peer->num_sup_srcs); 485cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 486cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_peer->num_rx_srcs++; 487cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 488cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* Check if this is a supported configuration */ 489cc35559160745c60b42ae182002a59337d844d09Hemant Gupta supported = FALSE; 490cc35559160745c60b42ae182002a59337d844d09Hemant Gupta switch (codec_type) 491cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 492cc35559160745c60b42ae182002a59337d844d09Hemant Gupta case BTA_AV_CODEC_SBC: 493cc35559160745c60b42ae182002a59337d844d09Hemant Gupta supported = TRUE; 494cc35559160745c60b42ae182002a59337d844d09Hemant Gupta break; 495cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 496cc35559160745c60b42ae182002a59337d844d09Hemant Gupta default: 497cc35559160745c60b42ae182002a59337d844d09Hemant Gupta break; 498cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 499cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 500cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (supported) 501cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 502cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* If there is room for a new one */ 503cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (p_peer->num_sup_srcs < BTA_AV_CO_NUM_ELEMENTS(p_peer->srcs)) 504cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 505cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_src = &p_peer->srcs[p_peer->num_sup_srcs++]; 506cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 507e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig saved caps[%x:%x:%x:%x:%x:%x]", 508cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_codec_info[1], p_codec_info[2], p_codec_info[3], 509cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_codec_info[4], p_codec_info[5], p_codec_info[6]); 510cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 511cc35559160745c60b42ae182002a59337d844d09Hemant Gupta memcpy(p_src->codec_caps, p_codec_info, AVDT_CODEC_SIZE); 512cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_src->codec_type = codec_type; 513cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_src->sep_info_idx = *p_sep_info_idx; 514cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_src->seid = seid; 515cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_src->num_protect = *p_num_protect; 516cc35559160745c60b42ae182002a59337d844d09Hemant Gupta memcpy(p_src->protect_info, p_protect_info, BTA_AV_CP_INFO_LEN); 517cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 518cc35559160745c60b42ae182002a59337d844d09Hemant Gupta else 519cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 520e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_audio_sink_getconfig no more room for SRC info"); 521cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 522cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 523cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 524cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* If last SNK get capabilities or all supported codec caps retrieved */ 525cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if ((p_peer->num_rx_srcs == p_peer->num_srcs) || 526cc35559160745c60b42ae182002a59337d844d09Hemant Gupta (p_peer->num_sup_srcs == BTA_AV_CO_NUM_ELEMENTS(p_peer->srcs))) 527cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 528e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig last SRC reached"); 529cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 530cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* Protect access to bta_av_co_cb.codec_cfg */ 531cc35559160745c60b42ae182002a59337d844d09Hemant Gupta GKI_disable(); 532cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 533cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* Find a src that matches the codec config */ 534cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (bta_av_co_audio_peer_src_supports_codec(p_peer, &index)) 535cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 536e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Codec Supported "); 537cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_src = &p_peer->srcs[index]; 538cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 539cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* Build the codec configuration for this sink */ 540cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 541cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* Save the new configuration */ 542cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_peer->p_src = p_src; 543cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* get preferred config from src_caps */ 544cc35559160745c60b42ae182002a59337d844d09Hemant Gupta bta_av_build_src_cfg(pref_cfg, p_src->codec_caps); 545cc35559160745c60b42ae182002a59337d844d09Hemant Gupta memcpy(p_peer->codec_cfg, pref_cfg, AVDT_CODEC_SIZE); 546cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 547e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_audio_sink_getconfig p_codec_info[%x:%x:%x:%x:%x:%x]", 548cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_peer->codec_cfg[1], p_peer->codec_cfg[2], p_peer->codec_cfg[3], 549cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_peer->codec_cfg[4], p_peer->codec_cfg[5], p_peer->codec_cfg[6]); 550cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* By default, no content protection */ 551cc35559160745c60b42ae182002a59337d844d09Hemant Gupta *p_num_protect = 0; 552cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 553cc35559160745c60b42ae182002a59337d844d09Hemant Gupta#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE) 554cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_peer->cp_active = FALSE; 555cc35559160745c60b42ae182002a59337d844d09Hemant Gupta bta_av_co_cb.cp.active = FALSE; 556cc35559160745c60b42ae182002a59337d844d09Hemant Gupta#endif 557cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 558cc35559160745c60b42ae182002a59337d844d09Hemant Gupta *p_sep_info_idx = p_src->sep_info_idx; 559cc35559160745c60b42ae182002a59337d844d09Hemant Gupta memcpy(p_codec_info, p_peer->codec_cfg, AVDT_CODEC_SIZE); 560cc35559160745c60b42ae182002a59337d844d09Hemant Gupta result = A2D_SUCCESS; 561cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 562cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 563cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* Protect access to bta_av_co_cb.codec_cfg */ 564cc35559160745c60b42ae182002a59337d844d09Hemant Gupta GKI_enable(); 565cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 566cc35559160745c60b42ae182002a59337d844d09Hemant Gupta return result; 567cc35559160745c60b42ae182002a59337d844d09Hemant Gupta} 568cc35559160745c60b42ae182002a59337d844d09Hemant Gupta/******************************************************************************* 569cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 5705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_getconfig 5715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 5725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description This callout function is executed by AV to retrieve the 5735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** desired codec and content protection configuration for the 5745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** audio stream. 5755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 5765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 5775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns Stream codec and content protection configuration info. 5785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 5795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 58024933b5b1a06274c47133debac5251a97128a267June R. Tate-GansUINT8 bta_av_co_audio_getconfig(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type, 58124933b5b1a06274c47133debac5251a97128a267June R. Tate-Gans UINT8 *p_codec_info, UINT8 *p_sep_info_idx, UINT8 seid, UINT8 *p_num_protect, 58224933b5b1a06274c47133debac5251a97128a267June R. Tate-Gans UINT8 *p_protect_info) 5835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 5855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 result = A2D_FAIL; 5865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN supported; 5875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_PEER *p_peer; 5885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_SINK *p_sink; 5895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 codec_cfg[AVDT_CODEC_SIZE]; 5905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 index; 5915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 5935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 5945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Retrieve the peer info */ 5955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer = bta_av_co_get_peer(hndl); 5965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer == NULL) 5975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 598e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_getconfig could not find peer entry"); 5995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return A2D_FAIL; 6005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 602cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (p_peer->uuid_to_connect == UUID_SERVCLASS_AUDIO_SOURCE) 603cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 604cc35559160745c60b42ae182002a59337d844d09Hemant Gupta result = bta_av_audio_sink_getconfig(hndl, codec_type, p_codec_info, p_sep_info_idx, 605cc35559160745c60b42ae182002a59337d844d09Hemant Gupta seid, p_num_protect, p_protect_info); 606cc35559160745c60b42ae182002a59337d844d09Hemant Gupta return result; 607cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 608e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_getconfig handle:0x%x codec_type:%d seid:%d", 609cc35559160745c60b42ae182002a59337d844d09Hemant Gupta hndl, codec_type, seid); 610e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("num_protect:0x%02x protect_info:0x%02x%02x%02x", 611cc35559160745c60b42ae182002a59337d844d09Hemant Gupta *p_num_protect, p_protect_info[0], p_protect_info[1], p_protect_info[2]); 612cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 613e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_getconfig peer(o=%d,n_snks=%d,n_rx_snks=%d,n_sup_snks=%d)", 6145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->opened, p_peer->num_snks, p_peer->num_rx_snks, p_peer->num_sup_snks); 6155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->num_rx_snks++; 6175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if this is a supported configuration */ 6195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project supported = FALSE; 6205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (codec_type) 6215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_CODEC_SBC: 6235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project supported = TRUE; 6245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 6275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 6285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (supported) 6315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If there is room for a new one */ 6335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer->num_sup_snks < BTA_AV_CO_NUM_ELEMENTS(p_peer->snks)) 6345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sink = &p_peer->snks[p_peer->num_sup_snks++]; 6365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 637e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_getconfig saved caps[%x:%x:%x:%x:%x:%x]", 6385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_info[1], p_codec_info[2], p_codec_info[3], 6395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_info[4], p_codec_info[5], p_codec_info[6]); 6405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_sink->codec_caps, p_codec_info, AVDT_CODEC_SIZE); 6425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sink->codec_type = codec_type; 6435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sink->sep_info_idx = *p_sep_info_idx; 6445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sink->seid = seid; 6455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sink->num_protect = *p_num_protect; 6465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_sink->protect_info, p_protect_info, BTA_AV_CP_INFO_LEN); 6475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 650e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_getconfig no more room for SNK info"); 6515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If last SNK get capabilities or all supported codec capa retrieved */ 6555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_peer->num_rx_snks == p_peer->num_snks) || 6565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_peer->num_sup_snks == BTA_AV_CO_NUM_ELEMENTS(p_peer->snks))) 6575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 658e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_getconfig last sink reached"); 6595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Protect access to bta_av_co_cb.codec_cfg */ 6615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_disable(); 6625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find a sink that matches the codec config */ 6645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_audio_peer_supports_codec(p_peer, &index)) 6655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* stop fetching caps once we retrieved a supported codec */ 6675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer->acp) 6685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_sep_info_idx = p_peer->num_seps; 670e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("no need to fetch more SEPs"); 6715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sink = &p_peer->snks[index]; 6745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Build the codec configuration for this sink */ 6765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_audio_codec_build_config(p_sink->codec_caps, codec_cfg)) 6775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 678e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_getconfig reconfig p_codec_info[%x:%x:%x:%x:%x:%x]", 6795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_cfg[1], codec_cfg[2], codec_cfg[3], 6805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_cfg[4], codec_cfg[5], codec_cfg[6]); 6815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save the new configuration */ 6835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->p_snk = p_sink; 6845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_peer->codec_cfg, codec_cfg, AVDT_CODEC_SIZE); 6855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* By default, no content protection */ 6875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_num_protect = 0; 6885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 6895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE) 6905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if this sink supports SCMS */ 6915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_audio_sink_has_scmst(p_sink)) 6925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 6935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->cp_active = TRUE; 6945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_cb.cp.active = TRUE; 6955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_num_protect = BTA_AV_CP_INFO_LEN; 6965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_protect_info, bta_av_co_cp_scmst, BTA_AV_CP_INFO_LEN); 6975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 6985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 6995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->cp_active = FALSE; 7015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_cb.cp.active = FALSE; 7025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If acceptor -> reconfig otherwise reply for configuration */ 7065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer->acp) 7075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer->recfg_needed) 7095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 710e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_getconfig call BTA_AvReconfig(x%x)", hndl); 7115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvReconfig(hndl, TRUE, p_sink->sep_info_idx, p_peer->codec_cfg, *p_num_protect, (UINT8 *)bta_av_co_cp_scmst); 7125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 7155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_sep_info_idx = p_sink->sep_info_idx; 7175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_codec_info, p_peer->codec_cfg, AVDT_CODEC_SIZE); 7185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = A2D_SUCCESS; 7205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Protect access to bta_av_co_cb.codec_cfg */ 7235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enable(); 7245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 7265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 7275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 7295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 7305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_setconfig 7315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 7325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description This callout function is executed by AV to set the codec and 7335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** content protection configuration of the audio stream. 7345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 7355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 7365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 7375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 7385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 73924933b5b1a06274c47133debac5251a97128a267June R. Tate-Gansvoid bta_av_co_audio_setconfig(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type, 740cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT8 *p_codec_info, UINT8 seid, BD_ADDR addr, UINT8 num_protect, UINT8 *p_protect_info, 741cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT8 t_local_sep, UINT8 avdt_handle) 7425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 7435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_PEER *p_peer; 7445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 status = A2D_SUCCESS; 7455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 category = A2D_SUCCESS; 7465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN recfg_needed = FALSE; 747cc35559160745c60b42ae182002a59337d844d09Hemant Gupta BOOLEAN codec_cfg_supported = FALSE; 7485cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(seid); 7495cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(addr); 7505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 7525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 753e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_setconfig p_codec_info[%x:%x:%x:%x:%x:%x]", 7545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_info[1], p_codec_info[2], p_codec_info[3], 7555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_info[4], p_codec_info[5], p_codec_info[6]); 756e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("num_protect:0x%02x protect_info:0x%02x%02x%02x", 7575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_protect, p_protect_info[0], p_protect_info[1], p_protect_info[2]); 7585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Retrieve the peer info */ 7605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer = bta_av_co_get_peer(hndl); 7615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer == NULL) 7625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 763e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_setconfig could not find peer entry"); 7645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Call call-in rejecting the configuration */ 766cc35559160745c60b42ae182002a59337d844d09Hemant Gupta bta_av_ci_setconfig(hndl, A2D_BUSY, AVDT_ASC_CODEC, 0, NULL, FALSE, avdt_handle); 7675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 7685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 769e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_setconfig peer(o=%d,n_snks=%d,n_rx_snks=%d,n_sup_snks=%d)", 770cc35559160745c60b42ae182002a59337d844d09Hemant Gupta p_peer->opened, p_peer->num_snks, p_peer->num_rx_snks, p_peer->num_sup_snks); 7715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Sanity check: should not be opened at this point */ 7735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer->opened) 7745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 775e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_setconfig peer already in use"); 7765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 7785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE) 7795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (num_protect != 0) 7805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 7815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* If CP is supported */ 7825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((num_protect != 1) || 7835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (bta_av_co_cp_is_scmst(p_protect_info) == FALSE)) 7845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 785e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_setconfig wrong CP configuration"); 7865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = A2D_BAD_CP_TYPE; 7875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project category = AVDT_ASC_PROTECT; 7885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 7915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Do not support content protection for the time being */ 7925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (num_protect != 0) 7935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 794e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_setconfig wrong CP configuration"); 7955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = A2D_BAD_CP_TYPE; 7965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project category = AVDT_ASC_PROTECT; 7975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 7985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 7995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status == A2D_SUCCESS) 8005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 801cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if(AVDT_TSEP_SNK == t_local_sep) 802cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 803cc35559160745c60b42ae182002a59337d844d09Hemant Gupta codec_cfg_supported = bta_av_co_audio_sink_supports_config(codec_type, p_codec_info); 804e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Peer is A2DP SRC "); 805cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 806cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if(AVDT_TSEP_SRC == t_local_sep) 807cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 808cc35559160745c60b42ae182002a59337d844d09Hemant Gupta codec_cfg_supported = bta_av_co_audio_media_supports_config(codec_type, p_codec_info); 809e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG(" Peer is A2DP SINK "); 810cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 8115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if codec configuration is supported */ 812cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (codec_cfg_supported) 8135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 814cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 8155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Protect access to bta_av_co_cb.codec_cfg */ 8165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_disable(); 8175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if the configuration matches the current codec config */ 8195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (bta_av_co_cb.codec_cfg.id) 8205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_CODEC_SBC: 8225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((codec_type != BTA_AV_CODEC_SBC) || memcmp(p_codec_info, bta_av_co_cb.codec_cfg.info, 5)) 8235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project recfg_needed = TRUE; 8255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else if ((num_protect == 1) && (!bta_av_co_cb.cp.active)) 8275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project recfg_needed = TRUE; 8295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* if remote side requests a restricted notify sinks preferred bitpool range as all other params are 8325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project already checked for validify */ 833e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("remote peer setconfig bitpool range [%d:%d]", 8345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_info[BTA_AV_CO_SBC_MIN_BITPOOL_OFF], 8355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_info[BTA_AV_CO_SBC_MAX_BITPOOL_OFF] ); 8365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_cb.codec_cfg_setconfig.id = BTIF_AV_CODEC_SBC; 8385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(bta_av_co_cb.codec_cfg_setconfig.info, p_codec_info, AVDT_CODEC_SIZE); 839cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if(AVDT_TSEP_SNK == t_local_sep) 840cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 841cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* If Peer is SRC, and our cfg subset matches with what is requested by peer, then 842cc35559160745c60b42ae182002a59337d844d09Hemant Gupta just accept what peer wants */ 843cc35559160745c60b42ae182002a59337d844d09Hemant Gupta memcpy(bta_av_co_cb.codec_cfg.info, p_codec_info, AVDT_CODEC_SIZE); 844cc35559160745c60b42ae182002a59337d844d09Hemant Gupta recfg_needed = FALSE; 845cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 8465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 850e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_setconfig unsupported cid %d", bta_av_co_cb.codec_cfg.id); 8515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project recfg_needed = TRUE; 8525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 8535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Protect access to bta_av_co_cb.codec_cfg */ 8555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enable(); 8565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project category = AVDT_ASC_CODEC; 8605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project status = A2D_WRONG_CODEC; 8615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (status != A2D_SUCCESS) 8655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 866e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_setconfig reject s=%d c=%d", status, category); 8675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Call call-in rejecting the configuration */ 869cc35559160745c60b42ae182002a59337d844d09Hemant Gupta bta_av_ci_setconfig(hndl, status, category, 0, NULL, FALSE, avdt_handle); 8705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 8725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 8735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark that this is an acceptor peer */ 8745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->acp = TRUE; 8755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->recfg_needed = recfg_needed; 8765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 877e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_setconfig accept reconf=%d", recfg_needed); 8785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Call call-in accepting the configuration */ 880cc35559160745c60b42ae182002a59337d844d09Hemant Gupta bta_av_ci_setconfig(hndl, A2D_SUCCESS, A2D_SUCCESS, 0, NULL, recfg_needed, avdt_handle); 8815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 8825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 8835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 8845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 8855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 8865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_open 8875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 8885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description This function is called by AV when the audio stream connection 8895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** is opened. 8905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 8915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 8925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 8935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 8945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 89524933b5b1a06274c47133debac5251a97128a267June R. Tate-Gansvoid bta_av_co_audio_open(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type, UINT8 *p_codec_info, 89624933b5b1a06274c47133debac5251a97128a267June R. Tate-Gans UINT16 mtu) 8975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 8985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_PEER *p_peer; 8995cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_codec_info); 9005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 9025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 903e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_open mtu:%d codec_type:%d", mtu, codec_type); 9045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Retrieve the peer info */ 9065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer = bta_av_co_get_peer(hndl); 9075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer == NULL) 9085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 909e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_setconfig could not find peer entry"); 9105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->opened = TRUE; 9145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->mtu = mtu; 9155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_close 9215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description This function is called by AV when the audio stream connection 9235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** is closed. 9245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 9275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 92924933b5b1a06274c47133debac5251a97128a267June R. Tate-Gansvoid bta_av_co_audio_close(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type, UINT16 mtu) 9305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_PEER *p_peer; 9335cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(codec_type); 9345cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(mtu); 9355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 9375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 938e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_close"); 9395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Retrieve the peer info */ 9415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer = bta_av_co_get_peer(hndl); 9425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer) 9435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 9445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Mark the peer closed and clean the peer info */ 9455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_peer, 0, sizeof(*p_peer)); 9465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 9485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 949e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_close could not find peer entry"); 9505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 9515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reset remote preference through setconfig */ 9535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_cb.codec_cfg_setconfig.id = BTIF_AV_CODEC_NONE; 9545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_start 9595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description This function is called by AV when the audio streaming data 9615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** transfer is started. 9625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 9655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 96724933b5b1a06274c47133debac5251a97128a267June R. Tate-Gansvoid bta_av_co_audio_start(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type, 96824933b5b1a06274c47133debac5251a97128a267June R. Tate-Gans UINT8 *p_codec_info, BOOLEAN *p_no_rtp_hdr) 9695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9705cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(hndl); 9715cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(codec_type); 9725cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_codec_info); 9735cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_no_rtp_hdr); 9745cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 9755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 9765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 977e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_start"); 9785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 9805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 9815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 9825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_stop 9845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description This function is called by AV when the audio streaming data 9865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** transfer is stopped. 9875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 9905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 9915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 99224933b5b1a06274c47133debac5251a97128a267June R. Tate-Gansextern void bta_av_co_audio_stop(tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type) 9935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 9945cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(hndl); 9955cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(codec_type); 9965cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 9975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 9985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 999e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_stop"); 10005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_src_data_path 10055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description This function is called to manage data transfer from 10075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** the audio codec to AVDTP. 10085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns Pointer to the GKI buffer to send, NULL if no buffer to send 10105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 101224933b5b1a06274c47133debac5251a97128a267June R. Tate-Gansvoid * bta_av_co_audio_src_data_path(tBTA_AV_CODEC codec_type, UINT32 *p_len, 101324933b5b1a06274c47133debac5251a97128a267June R. Tate-Gans UINT32 *p_timestamp) 10145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BT_HDR *p_buf; 10165cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen UNUSED(p_len); 10175cd8bff2dd0337cb52bf48f312e3d2d55a8882fbMike J. Chen 10185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 10195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf = btif_media_aa_readbuf(); 10215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_buf != NULL) 10225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (codec_type) 10245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_CODEC_SBC: 10265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* In media packet SBC, the following information is available: 10275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * p_buf->layer_specific : number of SBC frames in the packet 10285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * p_buf->word[0] : timestamp 10295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project */ 10305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Retrieve the timestamp information from the media packet */ 10315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_timestamp = *((UINT32 *) (p_buf + 1)); 10325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Set up packet header */ 10345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_sbc_bld_hdr(p_buf, p_buf->layer_specific); 10355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1039e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_src_data_path Unsupported codec type (%d)", codec_type); 10405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 10415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE) 10435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 *p; 10455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_cp_is_active()) 10465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 10475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->len++; 10485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_buf->offset--; 10495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = (UINT8 *)(p_buf + 1) + p_buf->offset; 10505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p = bta_av_co_cp_get_flag(); 10515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 10545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 10555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return p_buf; 10565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_drop 10615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description An Audio packet is dropped. . 10635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** It's very likely that the connected headset with this handle 10645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** is moved far away. The implementation may want to reduce 10655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** the encoder bit rate setting to reduce the packet size. 10665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 10685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 10705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_co_audio_drop(tBTA_AV_HNDL hndl) 10715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 10735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1074e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_drop dropped: x%x", hndl); 10755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_delay 10805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description This function is called by AV when the audio stream connection 10825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** needs to send the initial delay report to the connected SRC. 10835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 10865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 10885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_co_audio_delay(tBTA_AV_HNDL hndl, UINT16 delay) 10895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 10905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 10915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1092e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_delay handle: x%x, delay:0x%x", hndl, delay); 10935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 10945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 10975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 10985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 10995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_codec_build_config 11005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Build the codec configuration 11025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if the codec was built successfully, FALSE otherwise 11045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 11065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_co_audio_codec_build_config(const UINT8 *p_codec_caps, UINT8 *p_codec_cfg) 11075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 11095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(p_codec_cfg, 0, AVDT_CODEC_SIZE); 11115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (bta_av_co_cb.codec_cfg.id) 11135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_CODEC_SBC: 11155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* only copy the relevant portions for this codec to avoid issues when 11165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project comparing codec configs covering larger codec sets than SBC (7 bytes) */ 11175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_codec_cfg, bta_av_co_cb.codec_cfg.info, BTA_AV_CO_SBC_MAX_BITPOOL_OFF+1); 11185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Update the bit pool boundaries with the codec capabilities */ 11205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_cfg[BTA_AV_CO_SBC_MIN_BITPOOL_OFF] = p_codec_caps[BTA_AV_CO_SBC_MIN_BITPOOL_OFF]; 11215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_cfg[BTA_AV_CO_SBC_MAX_BITPOOL_OFF] = p_codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF]; 11225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1123e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_co_audio_codec_build_config : bitpool min %d, max %d", 11245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_cfg[BTA_AV_CO_SBC_MIN_BITPOOL_OFF], 11255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF]); 11265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1128e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_codec_build_config: unsupported codec id %d", bta_av_co_cb.codec_cfg.id); 11295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 11305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 11335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_codec_cfg_matches_caps 11385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Check if a codec config matches a codec capabilities 11405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if it codec config is supported, FALSE otherwise 11425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 11445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_co_audio_codec_cfg_matches_caps(UINT8 codec_id, const UINT8 *p_codec_caps, const UINT8 *p_codec_cfg) 11455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 11475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch(codec_id) 11495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 11505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_CODEC_SBC: 11515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1152e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_co_audio_codec_cfg_matches_caps : min %d/%d max %d/%d", 11535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_caps[BTA_AV_CO_SBC_MIN_BITPOOL_OFF], 11545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_cfg[BTA_AV_CO_SBC_MIN_BITPOOL_OFF], 11555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF], 11565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_cfg[BTA_AV_CO_SBC_MAX_BITPOOL_OFF]); 11575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Must match all items exactly except bitpool boundaries which can be adjusted */ 11595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!((p_codec_caps[BTA_AV_CO_SBC_FREQ_CHAN_OFF] & p_codec_cfg[BTA_AV_CO_SBC_FREQ_CHAN_OFF]) && 11605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_codec_caps[BTA_AV_CO_SBC_BLOCK_BAND_OFF] & p_codec_cfg[BTA_AV_CO_SBC_BLOCK_BAND_OFF]))) 11615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1162e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("FALSE %x %x %x %x", 11635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_caps[BTA_AV_CO_SBC_FREQ_CHAN_OFF], 11645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_cfg[BTA_AV_CO_SBC_FREQ_CHAN_OFF], 11655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_caps[BTA_AV_CO_SBC_BLOCK_BAND_OFF], 11665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_codec_cfg[BTA_AV_CO_SBC_BLOCK_BAND_OFF]); 11675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 11685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 11695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1173e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_codec_cfg_matches_caps: unsupported codec id %d", codec_id); 11745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 11755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 11765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1177e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("TRUE"); 11785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 11805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_codec_match 11855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Check if a codec capabilities supports the codec config 11875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if the connection supports this codec, FALSE otherwise 11895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 11905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 11915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_co_audio_codec_match(const UINT8 *p_codec_caps) 11925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 11935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 11945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return bta_av_co_audio_codec_cfg_matches_caps(bta_av_co_cb.codec_cfg.id, p_codec_caps, bta_av_co_cb.codec_cfg.info); 11965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 11975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 11985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 11995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_peer_reset_config 12015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Reset the peer codec configuration 12035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns Nothing 12055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 12075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void bta_av_co_audio_peer_reset_config(tBTA_AV_CO_PEER *p_peer) 12085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 12105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Indicate that there is no currently selected sink */ 12125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->p_snk = NULL; 12135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_cp_is_scmst 12185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Check if a content protection service is SCMS-T 12205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if this CP is SCMS-T, FALSE otherwise 12225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 12245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_co_cp_is_scmst(const UINT8 *p_protectinfo) 12255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT16 cp_id; 12275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 12285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (*p_protectinfo >= BTA_AV_CP_LOSC) 12305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_protectinfo++; 12325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project STREAM_TO_UINT16(cp_id, p_protectinfo); 12335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (cp_id == BTA_AV_CP_SCMS_T_ID) 12345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1235e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_cp_is_scmst: SCMS-T found"); 12365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 12375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 12415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_sink_has_scmst 12465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Check if a sink supports SCMS-T 12485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if the sink supports this CP, FALSE otherwise 12505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 12525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_co_audio_sink_has_scmst(const tBTA_AV_CO_SINK *p_sink) 12535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 index; 12555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const UINT8 *p; 12565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 12575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if sink supports SCMS-T */ 12595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index = p_sink->num_protect; 12605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p = &p_sink->protect_info[0]; 12615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project while (index) 12635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_cp_is_scmst(p)) 12655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 12675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Move to the next SC */ 12695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p += *p + 1; 12705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Decrement the SC counter */ 12715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project index--; 12725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1273e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_sink_has_scmst: SCMS-T not found"); 12745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 12755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 12765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 12785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_sink_supports_cp 12805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Check if a sink supports the current content protection 12825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if the sink supports this CP, FALSE otherwise 12845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 12855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 12865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_co_audio_sink_supports_cp(const tBTA_AV_CO_SINK *p_sink) 12875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 12885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 12895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 12905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if content protection is enabled for this stream */ 12915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_cp_get_flag() != BTA_AV_CP_SCMS_COPY_FREE) 12925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 12935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return bta_av_co_audio_sink_has_scmst(p_sink); 12945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 12955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 12965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1297e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_sink_supports_cp: not required"); 12985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 12995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 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 bta_av_co_audio_peer_supports_codec 13055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Check if a connection supports the codec config 13075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if the connection supports this codec, FALSE otherwise 13095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 13115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_co_audio_peer_supports_codec(tBTA_AV_CO_PEER *p_peer, UINT8 *p_snk_index) 13125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 13135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project int index; 13145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 codec_type; 13155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 13165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Configure the codec type to look for */ 13185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project codec_type = bta_av_co_cb.codec_cfg.id; 13195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (index = 0; index < p_peer->num_sup_snks; index++) 13225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer->snks[index].codec_type == codec_type) 13245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (bta_av_co_cb.codec_cfg.id) 13265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 13275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_CODEC_SBC: 13285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_snk_index) *p_snk_index = index; 13295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return bta_av_co_audio_codec_match(p_peer->snks[index].codec_caps); 13305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 13335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1334e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_peer_supports_codec: unsupported codec id %d", bta_av_co_cb.codec_cfg.id); 13355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 13365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 13375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 13385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 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/******************************************************************************* 13445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 1345cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** Function bta_av_co_audio_peer_src_supports_codec 1346cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 1347cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** Description Check if a peer acting as src supports codec config 1348cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 1349cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** Returns TRUE if the connection supports this codec, FALSE otherwise 1350cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 1351cc35559160745c60b42ae182002a59337d844d09Hemant Gupta *******************************************************************************/ 1352cc35559160745c60b42ae182002a59337d844d09Hemant Guptastatic BOOLEAN bta_av_co_audio_peer_src_supports_codec(tBTA_AV_CO_PEER *p_peer, UINT8 *p_src_index) 1353cc35559160745c60b42ae182002a59337d844d09Hemant Gupta{ 1354cc35559160745c60b42ae182002a59337d844d09Hemant Gupta int index; 1355cc35559160745c60b42ae182002a59337d844d09Hemant Gupta UINT8 codec_type; 1356cc35559160745c60b42ae182002a59337d844d09Hemant Gupta FUNC_TRACE(); 1357cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 1358cc35559160745c60b42ae182002a59337d844d09Hemant Gupta /* Configure the codec type to look for */ 1359cc35559160745c60b42ae182002a59337d844d09Hemant Gupta codec_type = bta_av_co_cb.codec_cfg.id; 1360cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 1361cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 1362cc35559160745c60b42ae182002a59337d844d09Hemant Gupta for (index = 0; index < p_peer->num_sup_srcs; index++) 1363cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 1364cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (p_peer->srcs[index].codec_type == codec_type) 1365cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 1366cc35559160745c60b42ae182002a59337d844d09Hemant Gupta switch (bta_av_co_cb.codec_cfg.id) 1367cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 1368cc35559160745c60b42ae182002a59337d844d09Hemant Gupta case BTIF_AV_CODEC_SBC: 1369cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (p_src_index) *p_src_index = index; 1370cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (0 == bta_av_sbc_cfg_matches_cap((UINT8 *)p_peer->srcs[index].codec_caps, 1371cc35559160745c60b42ae182002a59337d844d09Hemant Gupta (tA2D_SBC_CIE *)&bta_av_co_sbc_sink_caps)) 1372cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 1373cc35559160745c60b42ae182002a59337d844d09Hemant Gupta return TRUE; 1374cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 1375cc35559160745c60b42ae182002a59337d844d09Hemant Gupta break; 1376cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 1377cc35559160745c60b42ae182002a59337d844d09Hemant Gupta default: 1378e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("peer_src_supports_codec: unsupported codec id %d", 1379cc35559160745c60b42ae182002a59337d844d09Hemant Gupta bta_av_co_cb.codec_cfg.id); 1380cc35559160745c60b42ae182002a59337d844d09Hemant Gupta return FALSE; 1381cc35559160745c60b42ae182002a59337d844d09Hemant Gupta break; 1382cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 1383cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 1384cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 1385cc35559160745c60b42ae182002a59337d844d09Hemant Gupta return FALSE; 1386cc35559160745c60b42ae182002a59337d844d09Hemant Gupta} 1387cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 1388cc35559160745c60b42ae182002a59337d844d09Hemant Gupta/******************************************************************************* 1389cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 1390cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** Function bta_av_co_audio_sink_supports_config 13915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Check if the media source supports a given configuration 13935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if the media source supports this config, FALSE otherwise 13955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 13965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 1397cc35559160745c60b42ae182002a59337d844d09Hemant Guptastatic BOOLEAN bta_av_co_audio_sink_supports_config(UINT8 codec_type, const UINT8 *p_codec_cfg) 1398cc35559160745c60b42ae182002a59337d844d09Hemant Gupta{ 1399cc35559160745c60b42ae182002a59337d844d09Hemant Gupta FUNC_TRACE(); 1400cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 1401cc35559160745c60b42ae182002a59337d844d09Hemant Gupta switch (codec_type) 1402cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 1403cc35559160745c60b42ae182002a59337d844d09Hemant Gupta case BTA_AV_CODEC_SBC: 1404cc35559160745c60b42ae182002a59337d844d09Hemant Gupta if (bta_av_sbc_cfg_in_cap((UINT8 *)p_codec_cfg, (tA2D_SBC_CIE *)&bta_av_co_sbc_sink_caps)) 1405cc35559160745c60b42ae182002a59337d844d09Hemant Gupta { 1406cc35559160745c60b42ae182002a59337d844d09Hemant Gupta return FALSE; 1407cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 1408cc35559160745c60b42ae182002a59337d844d09Hemant Gupta break; 1409cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 1410cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 1411cc35559160745c60b42ae182002a59337d844d09Hemant Gupta default: 1412e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_media_supports_config unsupported codec type %d", codec_type); 1413cc35559160745c60b42ae182002a59337d844d09Hemant Gupta return FALSE; 1414cc35559160745c60b42ae182002a59337d844d09Hemant Gupta break; 1415cc35559160745c60b42ae182002a59337d844d09Hemant Gupta } 1416cc35559160745c60b42ae182002a59337d844d09Hemant Gupta return TRUE; 1417cc35559160745c60b42ae182002a59337d844d09Hemant Gupta} 1418cc35559160745c60b42ae182002a59337d844d09Hemant Gupta 1419cc35559160745c60b42ae182002a59337d844d09Hemant Gupta/******************************************************************************* 1420cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 1421cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** Function bta_av_co_audio_media_supports_config 1422cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 1423cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** Description Check if the media sink supports a given configuration 1424cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 1425cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** Returns TRUE if the media source supports this config, FALSE otherwise 1426cc35559160745c60b42ae182002a59337d844d09Hemant Gupta ** 1427cc35559160745c60b42ae182002a59337d844d09Hemant Gupta *******************************************************************************/ 14285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic BOOLEAN bta_av_co_audio_media_supports_config(UINT8 codec_type, const UINT8 *p_codec_cfg) 14295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 14315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (codec_type) 14335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTA_AV_CODEC_SBC: 14355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_sbc_cfg_in_cap((UINT8 *)p_codec_cfg, (tA2D_SBC_CIE *)&bta_av_co_sbc_caps)) 14365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 14385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1443e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_media_supports_config unsupported codec type %d", codec_type); 14445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 14455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 14465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 14485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 14495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 14515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_codec_supported 14535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Check if all opened connections are compatible with a codec 14555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** configuration and content protection 14565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if all opened devices support this codec, FALSE otherwise 14585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 14595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 14605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_av_co_audio_codec_supported(tBTIF_STATUS *p_status) 14615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 14625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 index; 14635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 snk_index; 14645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_PEER *p_peer; 14655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_SINK *p_sink; 14665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 codec_cfg[AVDT_CODEC_SIZE]; 14675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 num_protect = 0; 14685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE) 14695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN cp_active; 14705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 14715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 14735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1474e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_codec_supported"); 14755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check AV feeding is supported */ 14775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_status = BTIF_ERROR_SRV_AV_FEEDING_NOT_SUPPORTED; 14785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (index = 0; index < BTA_AV_CO_NUM_ELEMENTS(bta_av_co_cb.peers); index++) 14805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer = &bta_av_co_cb.peers[index]; 14825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer->opened) 14835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_audio_peer_supports_codec(p_peer, &snk_index)) 14855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 14865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sink = &p_peer->snks[snk_index]; 14875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check that this sink is compatible with the CP */ 14895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!bta_av_co_audio_sink_supports_cp(p_sink)) 14905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1491e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_codec_supported sink %d of peer %d doesn't support cp", 14925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project snk_index, index); 14935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_status = BTIF_ERROR_SRV_AV_CP_NOT_SUPPORTED; 14945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 14955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 14965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 14975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Build the codec configuration for this sink */ 14985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_audio_codec_build_config(p_sink->codec_caps, codec_cfg)) 14995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE) 15015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if this sink supports SCMS */ 15025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project cp_active = bta_av_co_audio_sink_has_scmst(p_sink); 15035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check if this is a new configuration (new sink or new config) */ 15055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_sink != p_peer->p_snk) || 15065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (memcmp(codec_cfg, p_peer->codec_cfg, AVDT_CODEC_SIZE)) 15075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE) 15085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project || (p_peer->cp_active != cp_active) 15095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 15105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ) 15115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Save the new configuration */ 15135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->p_snk = p_sink; 15145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memcpy(p_peer->codec_cfg, codec_cfg, AVDT_CODEC_SIZE); 15155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE) 15165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->cp_active = cp_active; 15175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer->cp_active) 15185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_cb.cp.active = TRUE; 15205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project num_protect = BTA_AV_CP_INFO_LEN; 15215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_cb.cp.active = FALSE; 15255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 1527e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_codec_supported call BTA_AvReconfig(x%x)", BTA_AV_CO_AUDIO_INDX_TO_HNDL(index)); 15285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AvReconfig(BTA_AV_CO_AUDIO_INDX_TO_HNDL(index), TRUE, p_sink->sep_info_idx, 15295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer->codec_cfg, num_protect, (UINT8 *)bta_av_co_cp_scmst); 15305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project else 15345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1535e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_codec_supported index %d doesn't support codec", index); 15365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 15375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_status = BTIF_SUCCESS; 15425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 15435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 15475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_codec_reset 15485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 15495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Reset the current codec configuration 15505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 15515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns void 15525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 15535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 15545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_co_audio_codec_reset(void) 15555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_disable(); 15575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 15585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reset the current configuration to SBC */ 15605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_cb.codec_cfg.id = BTIF_AV_CODEC_SBC; 15615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (A2D_BldSbcInfo(A2D_MEDIA_TYPE_AUDIO, (tA2D_SBC_CIE *)&btif_av_sbc_default_config, bta_av_co_cb.codec_cfg.info) != A2D_SUCCESS) 15635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1564e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_codec_reset A2D_BldSbcInfo failed"); 15655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 15665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enable(); 15685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 15695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 15715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 15725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_set_codec 15735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 15745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Set the current codec configuration from the feeding type. 15755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** This function is starting to modify the configuration, it 15765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** should be protected. 15775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 15785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if successful, FALSE otherwise 15795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 15805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 15815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_av_co_audio_set_codec(const tBTIF_AV_MEDIA_FEEDINGS *p_feeding, tBTIF_STATUS *p_status) 15825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 15835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tA2D_SBC_CIE sbc_config; 15845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTIF_AV_CODEC_INFO new_cfg; 15855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 15875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check AV feeding is supported */ 15895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_status = BTIF_ERROR_SRV_AV_FEEDING_NOT_SUPPORTED; 15905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1591e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_DEBUG("bta_av_co_audio_set_codec cid=%d", p_feeding->format); 15925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Supported codecs */ 15945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_feeding->format) 15955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 15965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case BTIF_AV_CODEC_PCM: 15975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project new_cfg.id = BTIF_AV_CODEC_SBC; 15985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 15995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_config = btif_av_sbc_default_config; 16005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_feeding->cfg.pcm.num_channel != 1) && 16015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_feeding->cfg.pcm.num_channel != 2)) 16025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1603e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_set_codec PCM channel number unsupported"); 16045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 16055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if ((p_feeding->cfg.pcm.bit_per_sample != 8) && 16075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project (p_feeding->cfg.pcm.bit_per_sample != 16)) 16085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1609e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_set_codec PCM sample size unsupported"); 16105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 16115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project switch (p_feeding->cfg.pcm.sampling_freq) 16135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 8000: 16155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 12000: 16165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 16000: 16175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 24000: 16185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 32000: 16195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 48000: 16205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_config.samp_freq = A2D_SBC_IE_SAMP_FREQ_48; 16215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 11025: 16245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 22050: 16255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project case 44100: 16265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project sbc_config.samp_freq = A2D_SBC_IE_SAMP_FREQ_44; 16275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1629e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_set_codec PCM sampling frequency unsupported"); 16305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 16315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Build the codec config */ 16345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (A2D_BldSbcInfo(A2D_MEDIA_TYPE_AUDIO, &sbc_config, new_cfg.info) != A2D_SUCCESS) 16355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1636e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_set_codec A2D_BldSbcInfo failed"); 16375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 16385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project default: 1643e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_set_codec Feeding format unsupported"); 16445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 16455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 16465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The new config was correctly built */ 16495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_cb.codec_cfg = new_cfg; 16505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Check all devices support it */ 16535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_status = BTIF_SUCCESS; 16545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return bta_av_co_audio_codec_supported(p_status); 16555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 16565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 16585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_get_sbc_config 16605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Retrieves the SBC codec configuration. If the codec in use 16625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** is not SBC, return the default SBC codec configuration. 16635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if codec is SBC, FALSE otherwise 16655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 16665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 16675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_av_co_audio_get_sbc_config(tA2D_SBC_CIE *p_sbc_config, UINT16 *p_minmtu) 16685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 16695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BOOLEAN result = FALSE; 16705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 index, jndex; 16715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_PEER *p_peer; 16725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_SINK *p_sink; 16735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1674e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_co_cb.codec_cfg.id : codec 0x%x", bta_av_co_cb.codec_cfg.id); 16755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Minimum MTU is by default very large */ 16775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_minmtu = 0xFFFF; 16785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 16795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_disable(); 16805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_cb.codec_cfg.id == BTIF_AV_CODEC_SBC) 16815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (A2D_ParsSbcInfo(p_sbc_config, bta_av_co_cb.codec_cfg.info, FALSE) == A2D_SUCCESS) 16835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (index = 0; index < BTA_AV_CO_NUM_ELEMENTS(bta_av_co_cb.peers); index++) 16855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer = &bta_av_co_cb.peers[index]; 16875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer->opened) 16885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer->mtu < *p_minmtu) 16905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_minmtu = p_peer->mtu; 16925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 16935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (jndex = 0; jndex < p_peer->num_sup_snks; jndex++) 16945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sink = &p_peer->snks[jndex]; 16965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sink->codec_type == A2D_MEDIA_CT_SBC) 16975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 16985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Update the bitpool boundaries of the current config */ 16995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sbc_config->min_bitpool = 17005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_CO_MAX(p_sink->codec_caps[BTA_AV_CO_SBC_MIN_BITPOOL_OFF], 17015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sbc_config->min_bitpool); 17025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sbc_config->max_bitpool = 17035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project BTA_AV_CO_MIN(p_sink->codec_caps[BTA_AV_CO_SBC_MAX_BITPOOL_OFF], 17045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sbc_config->max_bitpool); 1705e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_EVENT("bta_av_co_audio_get_sbc_config : sink bitpool min %d, max %d", 17065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sbc_config->min_bitpool, p_sbc_config->max_bitpool); 17075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project break; 17085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project result = TRUE; 17135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!result) 17175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 17185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Not SBC, still return the default values */ 17195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *p_sbc_config = btif_av_sbc_default_config; 17205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GKI_enable(); 17225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return result; 17245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_audio_discard_config 17295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Discard the codec configuration of a connection 17315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns Nothing 17335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 17355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_co_audio_discard_config(tBTA_AV_HNDL hndl) 17365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_PEER *p_peer; 17385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 17405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find the peer info */ 17425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer = bta_av_co_get_peer(hndl); 17435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer == NULL) 17445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1745e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_audio_discard_config could not find peer entry"); 17465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return; 17475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 17485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reset the peer codec configuration */ 17505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_peer_reset_config(p_peer); 17515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_init 17565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Initialization 17585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns Nothing 17605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 17625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid bta_av_co_init(void) 17635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 17655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reset the control block */ 17675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project memset(&bta_av_co_cb, 0, sizeof(bta_av_co_cb)); 17685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_cb.codec_cfg_setconfig.id = BTIF_AV_CODEC_NONE; 17705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#if defined(BTA_AV_CO_CP_SCMS_T) && (BTA_AV_CO_CP_SCMS_T == TRUE) 17725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_cp_set_flag(BTA_AV_CP_SCMS_COPY_NEVER); 17735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#else 17745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_cp_set_flag(BTA_AV_CP_SCMS_COPY_FREE); 17755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#endif 17765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Reset the current config */ 17785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bta_av_co_audio_codec_reset(); 17795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 17805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 17835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_peer_cp_supported 17855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Checks if the peer supports CP 17875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if the peer supports CP 17895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 17905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 17915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_av_co_peer_cp_supported(tBTA_AV_HNDL hndl) 17925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 17935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_PEER *p_peer; 17945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project tBTA_AV_CO_SINK *p_sink; 17955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project UINT8 index; 17965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project FUNC_TRACE(); 17985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 17995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Find the peer info */ 18005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_peer = bta_av_co_get_peer(hndl); 18015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_peer == NULL) 18025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 1803e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_peer_cp_supported could not find peer entry"); 18045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 18055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project for (index = 0; index < p_peer->num_sup_snks; index++) 18085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project p_sink = &p_peer->snks[index]; 18105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (p_sink->codec_type == A2D_MEDIA_CT_SBC) 18115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 18125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return bta_av_co_audio_sink_has_scmst(p_sink); 18135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 18145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1815e8c3d75b75493911ebf0f99c83676359657178f7Sharvil Nanavati APPL_TRACE_ERROR("bta_av_co_peer_cp_supported did not find SBC sink"); 18165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 18175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 18185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/******************************************************************************* 18215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Function bta_av_co_get_remote_bitpool_pref 18235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Description Check if remote side did a setconfig within the limits 18255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** of our exported bitpool range. If set we will set the 18265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** remote preference. 18275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** Returns TRUE if config set, FALSE otherwize 18295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project ** 18305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *******************************************************************************/ 18315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectBOOLEAN bta_av_co_get_remote_bitpool_pref(UINT8 *min, UINT8 *max) 18335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 18345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* check if remote peer did a set config */ 18355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (bta_av_co_cb.codec_cfg_setconfig.id == BTIF_AV_CODEC_NONE) 18365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return FALSE; 18375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *min = bta_av_co_cb.codec_cfg_setconfig.info[BTA_AV_CO_SBC_MIN_BITPOOL_OFF]; 18395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project *max = bta_av_co_cb.codec_cfg_setconfig.info[BTA_AV_CO_SBC_MAX_BITPOOL_OFF]; 18405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 18415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return TRUE; 18425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1843