15ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov/* 25ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * Copyright (C) 2016 The Android Open Source Project 35ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * 45ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * Licensed under the Apache License, Version 2.0 (the "License"); 55ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * you may not use this file except in compliance with the License. 65ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * You may obtain a copy of the License at 75ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * 85ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * http://www.apache.org/licenses/LICENSE-2.0 95ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * 105ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * Unless required by applicable law or agreed to in writing, software 115ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * distributed under the License is distributed on an "AS IS" BASIS, 125ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * See the License for the specific language governing permissions and 145ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * limitations under the License. 155ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov */ 165ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 175ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// 185ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// A2DP Codecs API 195ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// 205ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 215ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#ifndef A2DP_CODEC_API_H 225ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#define A2DP_CODEC_API_H 235ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 245ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#include <stddef.h> 255ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#include <string.h> 265ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#include <functional> 275ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#include <list> 285ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#include <map> 295ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#include <mutex> 305ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#include <string> 315ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 325ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#include <hardware/bt_av.h> 335ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 345ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#include "a2dp_api.h" 35304ceeb5202060a9c625a55369cbf28d72f5e2d9Pavlin Radoslavov#include "audio_a2dp_hw/include/audio_a2dp_hw.h" 365ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#include "avdt_api.h" 375ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#include "osi/include/time.h" 385ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 395ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov/** 405ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * Structure used to initialize the A2DP encoder with A2DP peer information 415ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov */ 425ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovtypedef struct { 435ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool is_peer_edr; // True if the A2DP peer supports EDR 445ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool peer_supports_3mbps; // True if the A2DP peer supports 3 Mbps EDR 455ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov uint16_t peer_mtu; // MTU of the A2DP peer 465ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov} tA2DP_ENCODER_INIT_PEER_PARAMS; 475ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 485ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovclass A2dpCodecConfig { 495ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov friend class A2dpCodecs; 505ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 515ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov public: 525ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Creates a codec entry. The selected codec is defined by |codec_index|, 535ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns the codec entry on success, otherwise nullptr. 54a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov static A2dpCodecConfig* createCodec( 55a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov btav_a2dp_codec_index_t codec_index, 56a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov btav_a2dp_codec_priority_t codec_priority = 57a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov BTAV_A2DP_CODEC_PRIORITY_DEFAULT); 585ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 595ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov virtual ~A2dpCodecConfig() = 0; 605ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 615ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Gets the pre-defined codec index. 625ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov btav_a2dp_codec_index_t codecIndex() const { return codec_index_; } 635ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 645ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Gets the codec name. 655ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const std::string& name() const { return name_; } 665ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 675ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Gets the current priority of the codec. 685ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov btav_a2dp_codec_priority_t codecPriority() const { return codec_priority_; } 695ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 705ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Copies out the current OTA codec config to |p_codec_info|. 71302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Returns true if the current codec config is valid and copied, 725ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // otherwise false. 735ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool copyOutOtaCodecConfig(uint8_t* p_codec_info); 745ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 755ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Gets the current codec configuration. 765ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns a copy of the current codec configuration. 775ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov btav_a2dp_codec_config_t getCodecConfig(); 785ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 795ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Gets the current codec capability. 805ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // The capability is computed by intersecting the local codec's capability 815ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // and the peer's codec capability. However, if there is an explicit user 825ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // configuration for some of the parameters, the result codec configuration 835ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // and capability is restricted to the user's configuration choice. 845ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns a copy of the current codec capability. 855ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov btav_a2dp_codec_config_t getCodecCapability(); 865ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 87494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // Gets the codec local capability. 88494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // Returns a copy of the codec local capability. 89494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov btav_a2dp_codec_config_t getCodecLocalCapability(); 90494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov 91494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // Gets the codec selectable capability. 92494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // The capability is computed by intersecting the local codec's capability 93494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // and the peer's codec capability. Any explicit user configuration is 94494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // not included in the result. 95494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // Returns a copy of the codec selectable capability. 96494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov btav_a2dp_codec_config_t getCodecSelectableCapability(); 97494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov 985ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Gets the current codec user configuration. 995ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns a copy of the current codec user configuration. 1005ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov btav_a2dp_codec_config_t getCodecUserConfig(); 1015ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 1025ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Gets the current codec audio configuration. 1035ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns a copy of the current codec audio configuration. 1045ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov btav_a2dp_codec_config_t getCodecAudioConfig(); 1055ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 1065ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Gets the number of bits per sample of the current codec configuration, 1075ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // or 0 if not configured. 1085ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov uint8_t getAudioBitsPerSample(); 1095ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 1103b8391cd47dd0ea3e399f99a888f029de8c7d8c8Pavlin Radoslavov // Checks whether the codec uses the RTP Header Marker bit (see RFC 6416). 1113b8391cd47dd0ea3e399f99a888f029de8c7d8c8Pavlin Radoslavov // NOTE: Even if the encoded data uses RTP headers, some codecs do not use 1123b8391cd47dd0ea3e399f99a888f029de8c7d8c8Pavlin Radoslavov // the Marker bit - that bit is expected to be set to 0. 1133b8391cd47dd0ea3e399f99a888f029de8c7d8c8Pavlin Radoslavov // Returns true if the encoded data packets have RTP headers, and 1143b8391cd47dd0ea3e399f99a888f029de8c7d8c8Pavlin Radoslavov // the Marker bit in the header is set according to RFC 6416. 1153b8391cd47dd0ea3e399f99a888f029de8c7d8c8Pavlin Radoslavov virtual bool useRtpHeaderMarkerBit() const = 0; 1163b8391cd47dd0ea3e399f99a888f029de8c7d8c8Pavlin Radoslavov 1175ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Checks whether |codec_config| is empty and contains no configuration. 1185ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns true if |codec_config| is empty, otherwise false. 1195ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov static bool isCodecConfigEmpty(const btav_a2dp_codec_config_t& codec_config); 1205ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 1215ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov protected: 1225ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Sets the current priority of the codec to |codec_priority|. 123494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // If |codec_priority| is BTAV_A2DP_CODEC_PRIORITY_DEFAULT, the priority is 124494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // reset to its default value. 1255ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov void setCodecPriority(btav_a2dp_codec_priority_t codec_priority); 1265ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 1275ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Sets the current priority of the codec to its default value. 1285ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov void setDefaultCodecPriority(); 1295ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 1305ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Sets the A2DP Source-to-Sink codec configuration to be used 1315ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // with a peer Sink device. 1325ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_peer_codec_info| is the peer's A2DP Sink codec information 1335ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // to use. If |is_capability| is true, then |p_peer_codec_info| contains the 1345ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // peer's A2DP Sink codec capability, otherwise it contains the peer's 1355ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // preferred A2DP codec configuration to use. 1365ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // The result codec configuration is stored in |p_result_codec_config|. 1375ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // See |A2dpCodecs.setCodecConfig| for detailed description of 1385ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // the actual mechanism used to compute the configuration. 1395ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns true on success, othewise false. 1405ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov virtual bool setCodecConfig(const uint8_t* p_peer_codec_info, 1415ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool is_capability, 1425ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov uint8_t* p_result_codec_config) = 0; 1435ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 1445ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Sets the user prefered codec configuration. 1455ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |codec_user_config| contains the preferred codec user configuration. 1465ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |codec_audio_config| contains the selected audio feeding configuration. 1475ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_peer_params| contains the A2DP peer information. 1485ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_peer_codec_info| is the peer's A2DP Sink codec information 1495ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // to use. If |is_capability| is true, then |p_peer_codec_info| contains the 1505ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // peer's A2DP Sink codec capability, otherwise it contains the peer's 1515ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // preferred A2DP codec configuration to use. 1525ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is a change in the codec configuration that requires restarting 1535ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // if the audio input stream, flag |p_restart_input| is set to true. 1545ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is a change in the encoder configuration that requires restarting 1555ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // of the A2DP connection, the new codec configuration is stored in 1565ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_result_codec_config|, and flag |p_restart_output| is set to true. 1575ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is any change in the codec configuration, flag |p_config_updated| 1585ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // is set to true. 1595ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns true on success, otherwise false. 1605ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov virtual bool setCodecUserConfig( 1615ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const btav_a2dp_codec_config_t& codec_user_config, 1625ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const btav_a2dp_codec_config_t& codec_audio_config, 1635ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, 1645ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const uint8_t* p_peer_codec_info, bool is_capability, 1655ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov uint8_t* p_result_codec_config, bool* p_restart_input, 1665ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool* p_restart_output, bool* p_config_updated); 1675ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 1685ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Updates the encoder with the user prefered codec configuration. 1695ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_peer_params| contains the A2DP peer information. 1705ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is a change in the encoder configuration that requires restarting 1715ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // the audio input stream, flag |p_restart_input| is set to true. 1725ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is a change in the encoder configuration that requires restarting 1735ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // of the A2DP connection, flag |p_restart_output| is set to true. 1745ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is any change in the codec configuration, flag |p_config_updated| 1755ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // is set to true. 1765ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns true on success, otherwise false. 1775ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov virtual bool updateEncoderUserConfig( 1785ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, 1795ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool* p_restart_input, bool* p_restart_output, 1805ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool* p_config_updated) = 0; 1815ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 1825ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Constructor where |codec_index| is the unique index that identifies the 1835ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // codec. The user-friendly name is |name|. 184a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov // The default codec priority is |codec_priority|. If the value is 185a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov // |BTAV_A2DP_CODEC_PRIORITY_DEFAULT|, the codec priority is computed 186a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov // internally. 187a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov A2dpCodecConfig(btav_a2dp_codec_index_t codec_index, const std::string& name, 188a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov btav_a2dp_codec_priority_t codec_priority); 1895ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 1905ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Initializes the codec entry. 1915ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns true on success, otherwise false. 1925ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov virtual bool init() = 0; 1935ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 1945ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Checks whether the internal state is valid 1955ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov virtual bool isValid() const; 1965ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 197302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Returns the encoder's periodic interval (in milliseconds). 198302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov virtual period_ms_t encoderIntervalMs() const = 0; 199302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov 200302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Checks whether the A2DP Codec Configuration is valid. 201302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Returns true if A2DP Codec Configuration stored in |codec_config| 202302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // is valid, otherwise false. 203302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov static bool codecConfigIsValid(const btav_a2dp_codec_config_t& codec_config); 204302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov 205302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Gets the string representation of A2DP Codec Configuration. 206302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Returns the string representation of A2DP Codec Configuration stored 207302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // in |codec_config|. The format is: 208302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // "Rate=44100|48000 Bits=16|24 Mode=MONO|STEREO" 209302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov static std::string codecConfig2Str( 210302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov const btav_a2dp_codec_config_t& codec_config); 211302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov 212302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Gets the string representation of A2DP Codec Sample Rate. 213302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Returns the string representation of A2DP Codec Sample Rate stored 214302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // in |codec_sample_rate|. If there are multiple values stored in 215302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // |codec_sample_rate|, the return string format is "rate1|rate2|rate3". 216302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov static std::string codecSampleRate2Str( 217302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov btav_a2dp_codec_sample_rate_t codec_sample_rate); 218302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov 219302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Gets the string representation of A2DP Codec Bits Per Sample. 220302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Returns the string representation of A2DP Codec Bits Per Sample stored 221302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // in |codec_bits_per_sample|. If there are multiple values stored in 222302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // |codec_bits_per_sample|, the return string format is "bits1|bits2|bits3". 223302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov static std::string codecBitsPerSample2Str( 224302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov btav_a2dp_codec_bits_per_sample_t codec_bits_per_sample); 225302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov 226302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Gets the string representation of A2DP Codec Channel Mode. 227302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Returns the string representation of A2DP Channel Mode stored 228302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // in |codec_channel_mode|. If there are multiple values stored in 229302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // |codec_channel_mode|, the return string format is "mode1|mode2|mode3". 230302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov static std::string codecChannelMode2Str( 231302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov btav_a2dp_codec_channel_mode_t codec_channel_mode); 232302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov 233302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Dumps codec-related information. 234302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // The information is written in user-friendly form to file descriptor |fd|. 235302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov virtual void debug_codec_dump(int fd); 236302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov 2375ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov std::recursive_mutex codec_mutex_; 2385ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const btav_a2dp_codec_index_t codec_index_; // The unique codec index 2395ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const std::string name_; // The codec name 2405ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov btav_a2dp_codec_priority_t codec_priority_; // Codec priority: must be unique 241a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov btav_a2dp_codec_priority_t default_codec_priority_; 2425ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 2435ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov btav_a2dp_codec_config_t codec_config_; 2445ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov btav_a2dp_codec_config_t codec_capability_; 245494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov btav_a2dp_codec_config_t codec_local_capability_; 246494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov btav_a2dp_codec_config_t codec_selectable_capability_; 2475ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 2485ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // The optional user configuration. The values (if set) are used 2495ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // as a preference when there is a choice. If a particular value 2505ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // is not supported by the local or remote device, it is ignored. 2515ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov btav_a2dp_codec_config_t codec_user_config_; 2525ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 2535ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // The selected audio feeding configuration. 2545ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov btav_a2dp_codec_config_t codec_audio_config_; 2555ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 2565ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov uint8_t ota_codec_config_[AVDT_CODEC_SIZE]; 2575ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov uint8_t ota_codec_peer_capability_[AVDT_CODEC_SIZE]; 2585ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov uint8_t ota_codec_peer_config_[AVDT_CODEC_SIZE]; 2595ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov}; 2605ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 2615ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovclass A2dpCodecs { 2625ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov public: 263a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov // Constructor for class |A2dpCodecs|. 264a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov // |codec_priorities| contains the codec priorities to use. 265a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov A2dpCodecs(const std::vector<btav_a2dp_codec_config_t>& codec_priorities); 2665ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov ~A2dpCodecs(); 2675ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 2685ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Initializes all supported codecs. 2695ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns true if at least one Source codec and one Sink codec were 2705ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // initialized, otherwise false. 2715ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool init(); 2725ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 2735ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Finds the Source codec that corresponds to the A2DP over-the-air 2745ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_codec_info| information. 2755ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns the Source codec if found, otherwise nullptr. 2765ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov A2dpCodecConfig* findSourceCodecConfig(const uint8_t* p_codec_info); 2775ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 2785ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Gets the codec config that is currently selected. 2795ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns the codec config that is currently selected, or nullptr if 2805ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // no codec is selected. 2815ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov A2dpCodecConfig* getCurrentCodecConfig() const { 2825ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov return current_codec_config_; 2835ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov } 2845ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 2855ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Gets the list of Source codecs ordered by priority: higher priority first. 2865ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const std::list<A2dpCodecConfig*> orderedSourceCodecs() const { 2875ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov return ordered_source_codecs_; 2885ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov } 2895ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 2905ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Gets the list of Sink codecs ordered by priority: higher priority first. 2915ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const std::list<A2dpCodecConfig*> orderedSinkCodecs() const { 2925ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov return ordered_sink_codecs_; 2935ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov } 2945ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 2955ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Sets the A2DP Source-to-Sink codec configuration to be used 2965ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // with a peer Sink device. 2975ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_peer_codec_info| is the peer's A2DP Sink codec information 2985ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // to use. If |is_capability| is true, then |p_peer_codec_info| contains the 2995ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // peer's A2DP Sink codec capability, otherwise it contains the peer's 3005ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // preferred A2DP codec configuration to use. 301494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // If the codec can be used and |select_current_codec| is true, then 302494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // this codec is selected as the current one. 3035ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // 3045ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // The codec configuration is built by considering the optional user 3055ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // configuration, the local codec capabilities, the peer's codec 3065ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // capabilities, and the codec's locally-defined default values. 3075ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // For each codec parameter: 3085ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // 3095ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // 1. If it is user-configurable parameter (sample rate, bits per sample, 3105ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // channel mode, and some codec-specific parameters), 3115ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // if the user has an explicit preference, and that preference 3125ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // is supported by both the local and remote device, this is the 3135ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // parameter value that is used. 3145ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // 2. Otherwise, if the explicit internal default value is supported 3155ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // by both the local and remote device, this is the parameter value 3165ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // that is used. 3175ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // 3. Otherwise, the best match is chosen among all values supported by 3185ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // the local and remote device. 3195ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // 3205ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // In addition, the codec's internal state is updated to reflect 3215ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // the capabilities that are advertised to the upstream audio source 3225ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // (Media Framework) to make run-time audio parameter choices: 3235ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // 4. If the user-configurable parameter was selected, this is the 3245ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // only parameter value that is advertised to the Media Framework. 3255ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // 5. Otherwise, all values supported by both the local and remote 3265ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // devices are advertised to the Media Framework. 3275ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // 3285ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // The result codec configuration is stored in |p_result_codec_config|. 3295ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns true on success, othewise false. 3305ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool setCodecConfig(const uint8_t* p_peer_codec_info, bool is_capability, 331494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov uint8_t* p_result_codec_config, 332494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov bool select_current_codec); 3335ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 3345ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Sets the user prefered codec configuration. 3355ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |codec_user_config| contains the preferred codec configuration. 3365ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_peer_params| contains the A2DP peer information. 3375ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_peer_sink_capabilities| is the peer's A2DP Sink codec capabilities 3385ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // to use. 3395ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is a change in the encoder configuration that requires restarting 3405ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // the audio input stream, flag |p_restart_input| is set to true. 3415ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is a change in the encoder configuration that requires restarting 3425ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // of the A2DP connection, flag |p_restart_output| is set to true, and the 3435ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // new codec is stored in |p_result_codec_config|. 3445ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is any change in the codec configuration, flag |p_config_updated| 3455ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // is set to true. 3465ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns true on success, otherwise false. 3475ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool setCodecUserConfig(const btav_a2dp_codec_config_t& codec_user_config, 3485ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, 3495ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const uint8_t* p_peer_sink_capabilities, 3505ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov uint8_t* p_result_codec_config, bool* p_restart_input, 3515ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool* p_restart_output, bool* p_config_updated); 3525ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 3535ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Sets the Audio HAL selected audio feeding parameters. 3545ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Those parameters are applied only to the currently selected codec. 3555ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |codec_audio_config| contains the selected audio feeding configuration. 3565ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_peer_params| contains the A2DP peer information. 3575ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_peer_sink_capabilities| is the peer's A2DP Sink codec capabilities 3585ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // to use. 3595ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is a change in the encoder configuration that requires restarting 3605ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // of the A2DP connection, flag |p_restart_output| is set to true, and the 3615ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // new codec is stored in |p_result_codec_config|. 3625ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is any change in the codec configuration, flag |p_config_updated| 3635ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // is set to true. 3645ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns true on success, otherwise false. 3655ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool setCodecAudioConfig(const btav_a2dp_codec_config_t& codec_audio_config, 3665ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, 3675ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const uint8_t* p_peer_sink_capabilities, 3685ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov uint8_t* p_result_codec_config, 3695ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool* p_restart_output, bool* p_config_updated); 3705ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 3715ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Sets the Over-The-Air preferred codec configuration. 3725ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // The OTA prefered codec configuration is ignored if the current 3735ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // codec configuration contains explicit user configuration, or if the 3745ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // codec configuration for the same codec contains explicit user 3755ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // configuration. 3765ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_ota_codec_config| contains the received OTA A2DP codec configuration 3775ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // from the remote peer. Note: this is not the peer codec capability, 3785ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // but the codec configuration that the peer would like to use. 3795ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_peer_params| contains the A2DP peer information. 3805ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is a change in the encoder configuration that requires restarting 3815ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // the audio input stream, flag |p_restart_input| is set to true. 3825ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is a change in the encoder configuration that requires restarting 3835ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // of the A2DP connection, flag |p_restart_output| is set to true, and the 3845ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // new codec is stored in |p_result_codec_config|. 3855ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // If there is any change in the codec configuration, flag |p_config_updated| 3865ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // is set to true. 3875ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns true on success, otherwise false. 3885ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool setCodecOtaConfig(const uint8_t* p_ota_codec_config, 3895ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, 3905ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov uint8_t* p_result_codec_config, bool* p_restart_input, 3915ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool* p_restart_output, bool* p_config_updated); 3925ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 3935ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Gets the current codec configuration and the capabilities of 3945ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // all configured codecs. 395494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // The current codec configuration is stored in |p_codec_config|. 396494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // Local device's codecs capabilities are stored in 397494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // |p_codecs_local_capabilities|. 398494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // The codecs capabilities that can be used between the local device 399494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov // and the remote device are stored in |p_codecs_selectable_capabilities|. 4005ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Returns true on success, otherwise false. 4015ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov bool getCodecConfigAndCapabilities( 4025ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov btav_a2dp_codec_config_t* p_codec_config, 403494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov std::vector<btav_a2dp_codec_config_t>* p_codecs_local_capabilities, 404494e53e904e8aecc28178fda5856071776b2caf0Pavlin Radoslavov std::vector<btav_a2dp_codec_config_t>* p_codecs_selectable_capabilities); 4055ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 406302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // Dumps codec-related information. 407302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov // The information is written in user-friendly form to file descriptor |fd|. 408302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov void debug_codec_dump(int fd); 409302113d4e44f06e90f90a5903e33ae830edb58a3Pavlin Radoslavov 4105ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov private: 4115ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov struct CompareBtBdaddr 4129e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski : public std::binary_function<RawAddress, RawAddress, bool> { 4139e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski bool operator()(const RawAddress& lhs, const RawAddress& rhs) const { 4145ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov return (memcmp(&lhs, &rhs, sizeof(lhs)) < 0); 4155ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov } 4165ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov }; 4175ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov typedef std::map<btav_a2dp_codec_index_t, A2dpCodecConfig*> IndexedCodecs; 4185ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4195ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov std::recursive_mutex codec_mutex_; 4205ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov A2dpCodecConfig* current_codec_config_; // Currently selected codec 421a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov std::map<btav_a2dp_codec_index_t, btav_a2dp_codec_priority_t> 422a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov codec_priorities_; 423a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov 4245ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov IndexedCodecs indexed_codecs_; // The codecs indexed by codec index 425a6ba5aca4e8c1a200b8cc29fb60d390a7196416aPavlin Radoslavov IndexedCodecs disabled_codecs_; // The disabled codecs 4265ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4275ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // A2DP Source codecs ordered by priority 4285ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov std::list<A2dpCodecConfig*> ordered_source_codecs_; 4295ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4305ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // A2DP Sink codecs ordered by priority 4315ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov std::list<A2dpCodecConfig*> ordered_sink_codecs_; 4325ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4339e030fde05352ec4385d7baf6cc2af89e95e039cJakub Pawlowski std::map<RawAddress, IndexedCodecs*, CompareBtBdaddr> peer_codecs_; 4345ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov}; 4355ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4365ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov/** 4375ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov * Structure used to configure the A2DP feeding. 4385ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov */ 4395ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovtypedef struct { 4405ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov tA2DP_SAMPLE_RATE sample_rate; // 44100, 48000, etc 4415ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov tA2DP_BITS_PER_SAMPLE bits_per_sample; // 8, 16, 24, 32 4425ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov tA2DP_CHANNEL_COUNT channel_count; // 1 for mono or 2 for stereo 4435ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov} tA2DP_FEEDING_PARAMS; 4445ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4455ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Prototype for a callback to read audio data for encoding. 4465ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_buf| is the buffer to store the data. |len| is the number of octets to 4475ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// read. 4485ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns the number of octets read. 4495ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovtypedef uint32_t (*a2dp_source_read_callback_t)(uint8_t* p_buf, uint32_t len); 4505ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4515ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Prototype for a callback to enqueue A2DP Source packets for transmission. 4525ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_buf| is the buffer with the audio data to enqueue. The callback is 4535ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// responsible for freeing |p_buf|. 4545ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |frames_n| is the number of audio frames in |p_buf| - it is used for 4555ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// statistics purpose. 4565ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true if the packet was enqueued, otherwise false. 4575ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovtypedef bool (*a2dp_source_enqueue_callback_t)(BT_HDR* p_buf, size_t frames_n); 4585ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4595ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// 4605ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// A2DP encoder callbacks interface. 4615ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// 4625ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovtypedef struct { 4635ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Initialize the A2DP encoder. 4645ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |p_peer_params| contains the A2DP peer information 4655ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // The current A2DP codec config is in |a2dp_codec_config|. 4665ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |read_callback| is the callback for reading the input audio data. 4675ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |enqueue_callback| is the callback for enqueueing the encoded audio data. 4685ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov void (*encoder_init)(const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, 4695ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov A2dpCodecConfig* a2dp_codec_config, 4705ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov a2dp_source_read_callback_t read_callback, 4715ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov a2dp_source_enqueue_callback_t enqueue_callback); 4725ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4735ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Cleanup the A2DP encoder. 4745ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov void (*encoder_cleanup)(void); 4755ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4765ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Reset the feeding for the A2DP encoder. 4775ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov void (*feeding_reset)(void); 4785ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4795ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Flush the feeding for the A2DP encoder. 4805ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov void (*feeding_flush)(void); 4815ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4825ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Get the A2DP encoder interval (in milliseconds). 4835ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov period_ms_t (*get_encoder_interval_ms)(void); 4845ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4855ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // Prepare and send A2DP encoded frames. 4865ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov // |timestamp_us| is the current timestamp (in microseconds). 4875ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov void (*send_frames)(uint64_t timestamp_us); 4885ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 489dfc02a91a19b2968506140655180b2491ac46a48fen wang // Set transmit queue length for the A2DP encoder. 490dfc02a91a19b2968506140655180b2491ac46a48fen wang void (*set_transmit_queue_length)(size_t transmit_queue_length); 4915ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov} tA2DP_ENCODER_INTERFACE; 4925ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4935ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Gets the A2DP codec type. 4945ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_codec_info| contains information about the codec capabilities. 4955ce0116fbf5b530d5b93f11312096eade1021c1ePavlin RadoslavovtA2DP_CODEC_TYPE A2DP_GetCodecType(const uint8_t* p_codec_info); 4965ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 4975ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Checks whether the codec capabilities contain a valid A2DP Source codec. 4985ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// NOTE: only codecs that are implemented are considered valid. 4995ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true if |p_codec_info| contains information about a valid codec, 5005ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// otherwise false. 5015ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbool A2DP_IsSourceCodecValid(const uint8_t* p_codec_info); 5025ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5035ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Checks whether the codec capabilities contain a valid A2DP Sink codec. 5045ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// NOTE: only codecs that are implemented are considered valid. 5055ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true if |p_codec_info| contains information about a valid codec, 5065ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// otherwise false. 5075ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbool A2DP_IsSinkCodecValid(const uint8_t* p_codec_info); 5085ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5095ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Checks whether the codec capabilities contain a valid peer A2DP Source 5105ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// codec. 5115ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// NOTE: only codecs that are implemented are considered valid. 5125ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true if |p_codec_info| contains information about a valid codec, 5135ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// otherwise false. 5145ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbool A2DP_IsPeerSourceCodecValid(const uint8_t* p_codec_info); 5155ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5165ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Checks whether the codec capabilities contain a valid peer A2DP Sink codec. 5175ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// NOTE: only codecs that are implemented are considered valid. 5185ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true if |p_codec_info| contains information about a valid codec, 5195ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// otherwise false. 5205ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbool A2DP_IsPeerSinkCodecValid(const uint8_t* p_codec_info); 5215ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5225ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Checks whether an A2DP Sink codec is supported. 5235ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_codec_info| contains information about the codec capabilities. 5245ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true if the A2DP Sink codec is supported, otherwise false. 5255ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbool A2DP_IsSinkCodecSupported(const uint8_t* p_codec_info); 5265ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5275ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Checks whether an A2DP Source codec for a peer Source device is supported. 5285ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_codec_info| contains information about the codec capabilities of the 5295ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// peer device. 5305ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true if the A2DP Source codec for a peer Source device is supported, 5315ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// otherwise false. 5325ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbool A2DP_IsPeerSourceCodecSupported(const uint8_t* p_codec_info); 5335ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5345ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Initialize state with the default A2DP codec. 5355ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// The initialized state with the codec capabilities is stored in 5365ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_codec_info|. 5375ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovvoid A2DP_InitDefaultCodec(uint8_t* p_codec_info); 5385ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5395ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Builds A2DP preferred Sink capability from Source capability. 5405ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_src_cap| is the Source capability to use. 5415ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_pref_cfg| is the result Sink capability to store. 5425ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns |A2DP_SUCCESS| on success, otherwise the corresponding A2DP error 5435ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// status code. 5445ce0116fbf5b530d5b93f11312096eade1021c1ePavlin RadoslavovtA2DP_STATUS A2DP_BuildSrc2SinkConfig(const uint8_t* p_src_cap, 5455ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov uint8_t* p_pref_cfg); 5465ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5475ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Checks whether the A2DP data packets should contain RTP header. 5485ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |content_protection_enabled| is true if Content Protection is 5495ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// enabled. |p_codec_info| contains information about the codec capabilities. 5505ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true if the A2DP data packets should contain RTP header, otherwise 5515ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// false. 5525ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbool A2DP_UsesRtpHeader(bool content_protection_enabled, 5535ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const uint8_t* p_codec_info); 5545ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5555ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Gets the |AVDT_MEDIA_TYPE_*| media type from the codec capability 5565ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// in |p_codec_info|. 5575ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovuint8_t A2DP_GetMediaType(const uint8_t* p_codec_info); 5585ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5595ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Gets the A2DP codec name for a given |p_codec_info|. 5605ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovconst char* A2DP_CodecName(const uint8_t* p_codec_info); 5615ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5625ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Checks whether two A2DP codecs |p_codec_info_a| and |p_codec_info_b| have 5635ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// the same type. 5645ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true if the two codecs have the same type, otherwise false. 5655ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// If the codec type is not recognized, the return value is false. 5665ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbool A2DP_CodecTypeEquals(const uint8_t* p_codec_info_a, 5675ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const uint8_t* p_codec_info_b); 5685ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5695ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Checks whether two A2DP codecs p_codec_info_a| and |p_codec_info_b| are 5705ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// exactly the same. 5715ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true if the two codecs are exactly the same, otherwise false. 5725ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// If the codec type is not recognized, the return value is false. 5735ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbool A2DP_CodecEquals(const uint8_t* p_codec_info_a, 5745ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const uint8_t* p_codec_info_b); 5755ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5765ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Gets the track sample rate value for the A2DP codec. 5775ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_codec_info| is a pointer to the codec_info to decode. 5785ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns the track sample rate on success, or -1 if |p_codec_info| 5795ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// contains invalid codec information. 5805ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovint A2DP_GetTrackSampleRate(const uint8_t* p_codec_info); 5815ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5825ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Gets the channel count for the A2DP codec. 5835ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_codec_info| is a pointer to the codec_info to decode. 5845ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns the channel count on success, or -1 if |p_codec_info| 5855ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// contains invalid codec information. 5865ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovint A2DP_GetTrackChannelCount(const uint8_t* p_codec_info); 5875ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5885ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Gets the channel type for the A2DP Sink codec: 5895ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// 1 for mono, or 3 for dual/stereo/joint. 5905ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_codec_info| is a pointer to the codec_info to decode. 5915ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns the channel type on success, or -1 if |p_codec_info| 5925ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// contains invalid codec information. 5935ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovint A2DP_GetSinkTrackChannelType(const uint8_t* p_codec_info); 5945ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 5955ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Computes the number of frames to process in a time window for the A2DP 5965ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Sink codec. |time_interval_ms| is the time interval (in milliseconds). 5975ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_codec_info| is a pointer to the codec_info to decode. 5985ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns the number of frames to process on success, or -1 if |p_codec_info| 5995ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// contains invalid codec information. 6005ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovint A2DP_GetSinkFramesCountToProcess(uint64_t time_interval_ms, 6015ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const uint8_t* p_codec_info); 6025ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 6035ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Gets the A2DP audio data timestamp from an audio packet. 6045ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_codec_info| contains the codec information. 6055ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_data| contains the audio data. 6065ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// The timestamp is stored in |p_timestamp|. 6075ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true on success, otherwise false. 6085ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbool A2DP_GetPacketTimestamp(const uint8_t* p_codec_info, const uint8_t* p_data, 6095ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov uint32_t* p_timestamp); 6105ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 6115ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Builds A2DP codec header for audio data. 6125ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_codec_info| contains the codec information. 6135ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_buf| contains the audio data. 6145ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |frames_per_packet| is the number of frames in this packet. 6155ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true on success, otherwise false. 6165ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbool A2DP_BuildCodecHeader(const uint8_t* p_codec_info, BT_HDR* p_buf, 6175ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov uint16_t frames_per_packet); 6185ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 6195ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Gets the A2DP encoder interface that can be used to encode and prepare 6205ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// A2DP packets for transmission - see |tA2DP_ENCODER_INTERFACE|. 6215ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_codec_info| contains the codec information. 6225ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns the A2DP encoder interface if the |p_codec_info| is valid and 6235ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// supported, otherwise NULL. 6245ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovconst tA2DP_ENCODER_INTERFACE* A2DP_GetEncoderInterface( 6255ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov const uint8_t* p_codec_info); 6265ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 6275ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Adjusts the A2DP codec, based on local support and Bluetooth specification. 6285ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// |p_codec_info| contains the codec information to adjust. 6295ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true if |p_codec_info| is valid and supported, otherwise false. 6305ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbool A2DP_AdjustCodec(uint8_t* p_codec_info); 6315ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 6325ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Gets the A2DP Source codec index for a given |p_codec_info|. 6335ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns the corresponding |btav_a2dp_codec_index_t| on success, 6345ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// otherwise |BTAV_A2DP_CODEC_INDEX_MAX|. 6355ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbtav_a2dp_codec_index_t A2DP_SourceCodecIndex(const uint8_t* p_codec_info); 6365ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 6375ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Gets the A2DP codec name for a given |codec_index|. 6385ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovconst char* A2DP_CodecIndexStr(btav_a2dp_codec_index_t codec_index); 6395ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 6405ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Initializes A2DP codec-specific information into |tAVDT_CFG| configuration 6415ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// entry pointed by |p_cfg|. The selected codec is defined by |codec_index|. 6425ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Returns true on success, otherwise false. 6435ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavovbool A2DP_InitCodecConfig(btav_a2dp_codec_index_t codec_index, 6445ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov tAVDT_CFG* p_cfg); 6455ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 64681c2234305d4c84eb38f0d5a92605e3b42366f84Pavlin Radoslavov// Decodes and displays A2DP codec info when using |LOG_DEBUG|. 64781c2234305d4c84eb38f0d5a92605e3b42366f84Pavlin Radoslavov// |p_codec_info| is a pointer to the codec_info to decode and display. 64881c2234305d4c84eb38f0d5a92605e3b42366f84Pavlin Radoslavov// Returns true if the codec information is valid, otherwise false. 64981c2234305d4c84eb38f0d5a92605e3b42366f84Pavlin Radoslavovbool A2DP_DumpCodecInfo(const uint8_t* p_codec_info); 65081c2234305d4c84eb38f0d5a92605e3b42366f84Pavlin Radoslavov 6515ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov// Add enum-based flag operators to the btav_a2dp_codec_config_t fields 6525ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#ifndef DEFINE_ENUM_FLAG_OPERATORS 6535ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#define DEFINE_ENUM_FLAG_OPERATORS(bitmask) \ 6545ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov extern "C++" { \ 6555ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov inline constexpr bitmask operator&(bitmask X, bitmask Y) { \ 6565ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov return static_cast<bitmask>(static_cast<int>(X) & static_cast<int>(Y)); \ 6575ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov } \ 6585ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov inline constexpr bitmask operator|(bitmask X, bitmask Y) { \ 6595ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov return static_cast<bitmask>(static_cast<int>(X) | static_cast<int>(Y)); \ 6605ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov } \ 6615ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov inline constexpr bitmask operator^(bitmask X, bitmask Y) { \ 6625ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov return static_cast<bitmask>(static_cast<int>(X) ^ static_cast<int>(Y)); \ 6635ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov } \ 6645ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov inline constexpr bitmask operator~(bitmask X) { \ 6655ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov return static_cast<bitmask>(~static_cast<int>(X)); \ 6665ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov } \ 6675ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov inline bitmask& operator&=(bitmask& X, bitmask Y) { \ 6685ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov X = X & Y; \ 6695ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov return X; \ 6705ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov } \ 6715ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov inline bitmask& operator|=(bitmask& X, bitmask Y) { \ 6725ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov X = X | Y; \ 6735ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov return X; \ 6745ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov } \ 6755ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov inline bitmask& operator^=(bitmask& X, bitmask Y) { \ 6765ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov X = X ^ Y; \ 6775ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov return X; \ 6785ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov } \ 6795ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov } 6805ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#endif // DEFINE_ENUM_FLAG_OPERATORS 6815ce0116fbf5b530d5b93f11312096eade1021c1ePavlin RadoslavovDEFINE_ENUM_FLAG_OPERATORS(btav_a2dp_codec_sample_rate_t); 6825ce0116fbf5b530d5b93f11312096eade1021c1ePavlin RadoslavovDEFINE_ENUM_FLAG_OPERATORS(btav_a2dp_codec_bits_per_sample_t); 6835ce0116fbf5b530d5b93f11312096eade1021c1ePavlin RadoslavovDEFINE_ENUM_FLAG_OPERATORS(btav_a2dp_codec_channel_mode_t); 6845ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov 6855ce0116fbf5b530d5b93f11312096eade1021c1ePavlin Radoslavov#endif // A2DP_CODEC_API_H 686