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