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