1 /* 2 * Copyright (C) 2016 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 // 18 // A2DP Codecs API 19 // 20 21 #ifndef A2DP_CODEC_API_H 22 #define A2DP_CODEC_API_H 23 24 #include <stddef.h> 25 #include <string.h> 26 #include <functional> 27 #include <list> 28 #include <map> 29 #include <mutex> 30 #include <string> 31 32 #include <hardware/bt_av.h> 33 34 #include "a2dp_api.h" 35 #include "audio_a2dp_hw/include/audio_a2dp_hw.h" 36 #include "avdt_api.h" 37 #include "osi/include/time.h" 38 39 /** 40 * Structure used to initialize the A2DP encoder with A2DP peer information 41 */ 42 typedef struct { 43 bool is_peer_edr; // True if the A2DP peer supports EDR 44 bool peer_supports_3mbps; // True if the A2DP peer supports 3 Mbps EDR 45 uint16_t peer_mtu; // MTU of the A2DP peer 46 } tA2DP_ENCODER_INIT_PEER_PARAMS; 47 48 class A2dpCodecConfig { 49 friend class A2dpCodecs; 50 51 public: 52 // Creates a codec entry. The selected codec is defined by |codec_index|, 53 // Returns the codec entry on success, otherwise nullptr. 54 static A2dpCodecConfig* createCodec( 55 btav_a2dp_codec_index_t codec_index, 56 btav_a2dp_codec_priority_t codec_priority = 57 BTAV_A2DP_CODEC_PRIORITY_DEFAULT); 58 59 virtual ~A2dpCodecConfig() = 0; 60 61 // Gets the pre-defined codec index. 62 btav_a2dp_codec_index_t codecIndex() const { return codec_index_; } 63 64 // Gets the codec name. 65 const std::string& name() const { return name_; } 66 67 // Gets the current priority of the codec. 68 btav_a2dp_codec_priority_t codecPriority() const { return codec_priority_; } 69 70 // Copies out the current OTA codec config to |p_codec_info|. 71 // Returns true if the current codec config is valid and copied, 72 // otherwise false. 73 bool copyOutOtaCodecConfig(uint8_t* p_codec_info); 74 75 // Gets the current codec configuration. 76 // Returns a copy of the current codec configuration. 77 btav_a2dp_codec_config_t getCodecConfig(); 78 79 // Gets the current codec capability. 80 // The capability is computed by intersecting the local codec's capability 81 // and the peer's codec capability. However, if there is an explicit user 82 // configuration for some of the parameters, the result codec configuration 83 // and capability is restricted to the user's configuration choice. 84 // Returns a copy of the current codec capability. 85 btav_a2dp_codec_config_t getCodecCapability(); 86 87 // Gets the codec local capability. 88 // Returns a copy of the codec local capability. 89 btav_a2dp_codec_config_t getCodecLocalCapability(); 90 91 // Gets the codec selectable capability. 92 // The capability is computed by intersecting the local codec's capability 93 // and the peer's codec capability. Any explicit user configuration is 94 // not included in the result. 95 // Returns a copy of the codec selectable capability. 96 btav_a2dp_codec_config_t getCodecSelectableCapability(); 97 98 // Gets the current codec user configuration. 99 // Returns a copy of the current codec user configuration. 100 btav_a2dp_codec_config_t getCodecUserConfig(); 101 102 // Gets the current codec audio configuration. 103 // Returns a copy of the current codec audio configuration. 104 btav_a2dp_codec_config_t getCodecAudioConfig(); 105 106 // Gets the number of bits per sample of the current codec configuration, 107 // or 0 if not configured. 108 uint8_t getAudioBitsPerSample(); 109 110 // Checks whether the codec uses the RTP Header Marker bit (see RFC 6416). 111 // NOTE: Even if the encoded data uses RTP headers, some codecs do not use 112 // the Marker bit - that bit is expected to be set to 0. 113 // Returns true if the encoded data packets have RTP headers, and 114 // the Marker bit in the header is set according to RFC 6416. 115 virtual bool useRtpHeaderMarkerBit() const = 0; 116 117 // Checks whether |codec_config| is empty and contains no configuration. 118 // Returns true if |codec_config| is empty, otherwise false. 119 static bool isCodecConfigEmpty(const btav_a2dp_codec_config_t& codec_config); 120 121 protected: 122 // Sets the current priority of the codec to |codec_priority|. 123 // If |codec_priority| is BTAV_A2DP_CODEC_PRIORITY_DEFAULT, the priority is 124 // reset to its default value. 125 void setCodecPriority(btav_a2dp_codec_priority_t codec_priority); 126 127 // Sets the current priority of the codec to its default value. 128 void setDefaultCodecPriority(); 129 130 // Sets the A2DP Source-to-Sink codec configuration to be used 131 // with a peer Sink device. 132 // |p_peer_codec_info| is the peer's A2DP Sink codec information 133 // to use. If |is_capability| is true, then |p_peer_codec_info| contains the 134 // peer's A2DP Sink codec capability, otherwise it contains the peer's 135 // preferred A2DP codec configuration to use. 136 // The result codec configuration is stored in |p_result_codec_config|. 137 // See |A2dpCodecs.setCodecConfig| for detailed description of 138 // the actual mechanism used to compute the configuration. 139 // Returns true on success, othewise false. 140 virtual bool setCodecConfig(const uint8_t* p_peer_codec_info, 141 bool is_capability, 142 uint8_t* p_result_codec_config) = 0; 143 144 // Sets the user prefered codec configuration. 145 // |codec_user_config| contains the preferred codec user configuration. 146 // |codec_audio_config| contains the selected audio feeding configuration. 147 // |p_peer_params| contains the A2DP peer information. 148 // |p_peer_codec_info| is the peer's A2DP Sink codec information 149 // to use. If |is_capability| is true, then |p_peer_codec_info| contains the 150 // peer's A2DP Sink codec capability, otherwise it contains the peer's 151 // preferred A2DP codec configuration to use. 152 // If there is a change in the codec configuration that requires restarting 153 // if the audio input stream, flag |p_restart_input| is set to true. 154 // If there is a change in the encoder configuration that requires restarting 155 // of the A2DP connection, the new codec configuration is stored in 156 // |p_result_codec_config|, and flag |p_restart_output| is set to true. 157 // If there is any change in the codec configuration, flag |p_config_updated| 158 // is set to true. 159 // Returns true on success, otherwise false. 160 virtual bool setCodecUserConfig( 161 const btav_a2dp_codec_config_t& codec_user_config, 162 const btav_a2dp_codec_config_t& codec_audio_config, 163 const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, 164 const uint8_t* p_peer_codec_info, bool is_capability, 165 uint8_t* p_result_codec_config, bool* p_restart_input, 166 bool* p_restart_output, bool* p_config_updated); 167 168 // Updates the encoder with the user prefered codec configuration. 169 // |p_peer_params| contains the A2DP peer information. 170 // If there is a change in the encoder configuration that requires restarting 171 // the audio input stream, flag |p_restart_input| is set to true. 172 // If there is a change in the encoder configuration that requires restarting 173 // of the A2DP connection, flag |p_restart_output| is set to true. 174 // If there is any change in the codec configuration, flag |p_config_updated| 175 // is set to true. 176 // Returns true on success, otherwise false. 177 virtual bool updateEncoderUserConfig( 178 const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, 179 bool* p_restart_input, bool* p_restart_output, 180 bool* p_config_updated) = 0; 181 182 // Constructor where |codec_index| is the unique index that identifies the 183 // codec. The user-friendly name is |name|. 184 // The default codec priority is |codec_priority|. If the value is 185 // |BTAV_A2DP_CODEC_PRIORITY_DEFAULT|, the codec priority is computed 186 // internally. 187 A2dpCodecConfig(btav_a2dp_codec_index_t codec_index, const std::string& name, 188 btav_a2dp_codec_priority_t codec_priority); 189 190 // Initializes the codec entry. 191 // Returns true on success, otherwise false. 192 virtual bool init() = 0; 193 194 // Checks whether the internal state is valid 195 virtual bool isValid() const; 196 197 // Returns the encoder's periodic interval (in milliseconds). 198 virtual period_ms_t encoderIntervalMs() const = 0; 199 200 // Checks whether the A2DP Codec Configuration is valid. 201 // Returns true if A2DP Codec Configuration stored in |codec_config| 202 // is valid, otherwise false. 203 static bool codecConfigIsValid(const btav_a2dp_codec_config_t& codec_config); 204 205 // Gets the string representation of A2DP Codec Configuration. 206 // Returns the string representation of A2DP Codec Configuration stored 207 // in |codec_config|. The format is: 208 // "Rate=44100|48000 Bits=16|24 Mode=MONO|STEREO" 209 static std::string codecConfig2Str( 210 const btav_a2dp_codec_config_t& codec_config); 211 212 // Gets the string representation of A2DP Codec Sample Rate. 213 // Returns the string representation of A2DP Codec Sample Rate stored 214 // in |codec_sample_rate|. If there are multiple values stored in 215 // |codec_sample_rate|, the return string format is "rate1|rate2|rate3". 216 static std::string codecSampleRate2Str( 217 btav_a2dp_codec_sample_rate_t codec_sample_rate); 218 219 // Gets the string representation of A2DP Codec Bits Per Sample. 220 // Returns the string representation of A2DP Codec Bits Per Sample stored 221 // in |codec_bits_per_sample|. If there are multiple values stored in 222 // |codec_bits_per_sample|, the return string format is "bits1|bits2|bits3". 223 static std::string codecBitsPerSample2Str( 224 btav_a2dp_codec_bits_per_sample_t codec_bits_per_sample); 225 226 // Gets the string representation of A2DP Codec Channel Mode. 227 // Returns the string representation of A2DP Channel Mode stored 228 // in |codec_channel_mode|. If there are multiple values stored in 229 // |codec_channel_mode|, the return string format is "mode1|mode2|mode3". 230 static std::string codecChannelMode2Str( 231 btav_a2dp_codec_channel_mode_t codec_channel_mode); 232 233 // Dumps codec-related information. 234 // The information is written in user-friendly form to file descriptor |fd|. 235 virtual void debug_codec_dump(int fd); 236 237 std::recursive_mutex codec_mutex_; 238 const btav_a2dp_codec_index_t codec_index_; // The unique codec index 239 const std::string name_; // The codec name 240 btav_a2dp_codec_priority_t codec_priority_; // Codec priority: must be unique 241 btav_a2dp_codec_priority_t default_codec_priority_; 242 243 btav_a2dp_codec_config_t codec_config_; 244 btav_a2dp_codec_config_t codec_capability_; 245 btav_a2dp_codec_config_t codec_local_capability_; 246 btav_a2dp_codec_config_t codec_selectable_capability_; 247 248 // The optional user configuration. The values (if set) are used 249 // as a preference when there is a choice. If a particular value 250 // is not supported by the local or remote device, it is ignored. 251 btav_a2dp_codec_config_t codec_user_config_; 252 253 // The selected audio feeding configuration. 254 btav_a2dp_codec_config_t codec_audio_config_; 255 256 uint8_t ota_codec_config_[AVDT_CODEC_SIZE]; 257 uint8_t ota_codec_peer_capability_[AVDT_CODEC_SIZE]; 258 uint8_t ota_codec_peer_config_[AVDT_CODEC_SIZE]; 259 }; 260 261 class A2dpCodecs { 262 public: 263 // Constructor for class |A2dpCodecs|. 264 // |codec_priorities| contains the codec priorities to use. 265 A2dpCodecs(const std::vector<btav_a2dp_codec_config_t>& codec_priorities); 266 ~A2dpCodecs(); 267 268 // Initializes all supported codecs. 269 // Returns true if at least one Source codec and one Sink codec were 270 // initialized, otherwise false. 271 bool init(); 272 273 // Finds the Source codec that corresponds to the A2DP over-the-air 274 // |p_codec_info| information. 275 // Returns the Source codec if found, otherwise nullptr. 276 A2dpCodecConfig* findSourceCodecConfig(const uint8_t* p_codec_info); 277 278 // Gets the codec config that is currently selected. 279 // Returns the codec config that is currently selected, or nullptr if 280 // no codec is selected. 281 A2dpCodecConfig* getCurrentCodecConfig() const { 282 return current_codec_config_; 283 } 284 285 // Gets the list of Source codecs ordered by priority: higher priority first. 286 const std::list<A2dpCodecConfig*> orderedSourceCodecs() const { 287 return ordered_source_codecs_; 288 } 289 290 // Gets the list of Sink codecs ordered by priority: higher priority first. 291 const std::list<A2dpCodecConfig*> orderedSinkCodecs() const { 292 return ordered_sink_codecs_; 293 } 294 295 // Sets the A2DP Source-to-Sink codec configuration to be used 296 // with a peer Sink device. 297 // |p_peer_codec_info| is the peer's A2DP Sink codec information 298 // to use. If |is_capability| is true, then |p_peer_codec_info| contains the 299 // peer's A2DP Sink codec capability, otherwise it contains the peer's 300 // preferred A2DP codec configuration to use. 301 // If the codec can be used and |select_current_codec| is true, then 302 // this codec is selected as the current one. 303 // 304 // The codec configuration is built by considering the optional user 305 // configuration, the local codec capabilities, the peer's codec 306 // capabilities, and the codec's locally-defined default values. 307 // For each codec parameter: 308 // 309 // 1. If it is user-configurable parameter (sample rate, bits per sample, 310 // channel mode, and some codec-specific parameters), 311 // if the user has an explicit preference, and that preference 312 // is supported by both the local and remote device, this is the 313 // parameter value that is used. 314 // 2. Otherwise, if the explicit internal default value is supported 315 // by both the local and remote device, this is the parameter value 316 // that is used. 317 // 3. Otherwise, the best match is chosen among all values supported by 318 // the local and remote device. 319 // 320 // In addition, the codec's internal state is updated to reflect 321 // the capabilities that are advertised to the upstream audio source 322 // (Media Framework) to make run-time audio parameter choices: 323 // 4. If the user-configurable parameter was selected, this is the 324 // only parameter value that is advertised to the Media Framework. 325 // 5. Otherwise, all values supported by both the local and remote 326 // devices are advertised to the Media Framework. 327 // 328 // The result codec configuration is stored in |p_result_codec_config|. 329 // Returns true on success, othewise false. 330 bool setCodecConfig(const uint8_t* p_peer_codec_info, bool is_capability, 331 uint8_t* p_result_codec_config, 332 bool select_current_codec); 333 334 // Sets the user prefered codec configuration. 335 // |codec_user_config| contains the preferred codec configuration. 336 // |p_peer_params| contains the A2DP peer information. 337 // |p_peer_sink_capabilities| is the peer's A2DP Sink codec capabilities 338 // to use. 339 // If there is a change in the encoder configuration that requires restarting 340 // the audio input stream, flag |p_restart_input| is set to true. 341 // If there is a change in the encoder configuration that requires restarting 342 // of the A2DP connection, flag |p_restart_output| is set to true, and the 343 // new codec is stored in |p_result_codec_config|. 344 // If there is any change in the codec configuration, flag |p_config_updated| 345 // is set to true. 346 // Returns true on success, otherwise false. 347 bool setCodecUserConfig(const btav_a2dp_codec_config_t& codec_user_config, 348 const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, 349 const uint8_t* p_peer_sink_capabilities, 350 uint8_t* p_result_codec_config, bool* p_restart_input, 351 bool* p_restart_output, bool* p_config_updated); 352 353 // Sets the Audio HAL selected audio feeding parameters. 354 // Those parameters are applied only to the currently selected codec. 355 // |codec_audio_config| contains the selected audio feeding configuration. 356 // |p_peer_params| contains the A2DP peer information. 357 // |p_peer_sink_capabilities| is the peer's A2DP Sink codec capabilities 358 // to use. 359 // If there is a change in the encoder configuration that requires restarting 360 // of the A2DP connection, flag |p_restart_output| is set to true, and the 361 // new codec is stored in |p_result_codec_config|. 362 // If there is any change in the codec configuration, flag |p_config_updated| 363 // is set to true. 364 // Returns true on success, otherwise false. 365 bool setCodecAudioConfig(const btav_a2dp_codec_config_t& codec_audio_config, 366 const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, 367 const uint8_t* p_peer_sink_capabilities, 368 uint8_t* p_result_codec_config, 369 bool* p_restart_output, bool* p_config_updated); 370 371 // Sets the Over-The-Air preferred codec configuration. 372 // The OTA prefered codec configuration is ignored if the current 373 // codec configuration contains explicit user configuration, or if the 374 // codec configuration for the same codec contains explicit user 375 // configuration. 376 // |p_ota_codec_config| contains the received OTA A2DP codec configuration 377 // from the remote peer. Note: this is not the peer codec capability, 378 // but the codec configuration that the peer would like to use. 379 // |p_peer_params| contains the A2DP peer information. 380 // If there is a change in the encoder configuration that requires restarting 381 // the audio input stream, flag |p_restart_input| is set to true. 382 // If there is a change in the encoder configuration that requires restarting 383 // of the A2DP connection, flag |p_restart_output| is set to true, and the 384 // new codec is stored in |p_result_codec_config|. 385 // If there is any change in the codec configuration, flag |p_config_updated| 386 // is set to true. 387 // Returns true on success, otherwise false. 388 bool setCodecOtaConfig(const uint8_t* p_ota_codec_config, 389 const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, 390 uint8_t* p_result_codec_config, bool* p_restart_input, 391 bool* p_restart_output, bool* p_config_updated); 392 393 // Gets the current codec configuration and the capabilities of 394 // all configured codecs. 395 // The current codec configuration is stored in |p_codec_config|. 396 // Local device's codecs capabilities are stored in 397 // |p_codecs_local_capabilities|. 398 // The codecs capabilities that can be used between the local device 399 // and the remote device are stored in |p_codecs_selectable_capabilities|. 400 // Returns true on success, otherwise false. 401 bool getCodecConfigAndCapabilities( 402 btav_a2dp_codec_config_t* p_codec_config, 403 std::vector<btav_a2dp_codec_config_t>* p_codecs_local_capabilities, 404 std::vector<btav_a2dp_codec_config_t>* p_codecs_selectable_capabilities); 405 406 // Dumps codec-related information. 407 // The information is written in user-friendly form to file descriptor |fd|. 408 void debug_codec_dump(int fd); 409 410 private: 411 struct CompareBtBdaddr 412 : public std::binary_function<RawAddress, RawAddress, bool> { 413 bool operator()(const RawAddress& lhs, const RawAddress& rhs) const { 414 return (memcmp(&lhs, &rhs, sizeof(lhs)) < 0); 415 } 416 }; 417 typedef std::map<btav_a2dp_codec_index_t, A2dpCodecConfig*> IndexedCodecs; 418 419 std::recursive_mutex codec_mutex_; 420 A2dpCodecConfig* current_codec_config_; // Currently selected codec 421 std::map<btav_a2dp_codec_index_t, btav_a2dp_codec_priority_t> 422 codec_priorities_; 423 424 IndexedCodecs indexed_codecs_; // The codecs indexed by codec index 425 IndexedCodecs disabled_codecs_; // The disabled codecs 426 427 // A2DP Source codecs ordered by priority 428 std::list<A2dpCodecConfig*> ordered_source_codecs_; 429 430 // A2DP Sink codecs ordered by priority 431 std::list<A2dpCodecConfig*> ordered_sink_codecs_; 432 433 std::map<RawAddress, IndexedCodecs*, CompareBtBdaddr> peer_codecs_; 434 }; 435 436 /** 437 * Structure used to configure the A2DP feeding. 438 */ 439 typedef struct { 440 tA2DP_SAMPLE_RATE sample_rate; // 44100, 48000, etc 441 tA2DP_BITS_PER_SAMPLE bits_per_sample; // 8, 16, 24, 32 442 tA2DP_CHANNEL_COUNT channel_count; // 1 for mono or 2 for stereo 443 } tA2DP_FEEDING_PARAMS; 444 445 // Prototype for a callback to read audio data for encoding. 446 // |p_buf| is the buffer to store the data. |len| is the number of octets to 447 // read. 448 // Returns the number of octets read. 449 typedef uint32_t (*a2dp_source_read_callback_t)(uint8_t* p_buf, uint32_t len); 450 451 // Prototype for a callback to enqueue A2DP Source packets for transmission. 452 // |p_buf| is the buffer with the audio data to enqueue. The callback is 453 // responsible for freeing |p_buf|. 454 // |frames_n| is the number of audio frames in |p_buf| - it is used for 455 // statistics purpose. 456 // Returns true if the packet was enqueued, otherwise false. 457 typedef bool (*a2dp_source_enqueue_callback_t)(BT_HDR* p_buf, size_t frames_n); 458 459 // 460 // A2DP encoder callbacks interface. 461 // 462 typedef struct { 463 // Initialize the A2DP encoder. 464 // |p_peer_params| contains the A2DP peer information 465 // The current A2DP codec config is in |a2dp_codec_config|. 466 // |read_callback| is the callback for reading the input audio data. 467 // |enqueue_callback| is the callback for enqueueing the encoded audio data. 468 void (*encoder_init)(const tA2DP_ENCODER_INIT_PEER_PARAMS* p_peer_params, 469 A2dpCodecConfig* a2dp_codec_config, 470 a2dp_source_read_callback_t read_callback, 471 a2dp_source_enqueue_callback_t enqueue_callback); 472 473 // Cleanup the A2DP encoder. 474 void (*encoder_cleanup)(void); 475 476 // Reset the feeding for the A2DP encoder. 477 void (*feeding_reset)(void); 478 479 // Flush the feeding for the A2DP encoder. 480 void (*feeding_flush)(void); 481 482 // Get the A2DP encoder interval (in milliseconds). 483 period_ms_t (*get_encoder_interval_ms)(void); 484 485 // Prepare and send A2DP encoded frames. 486 // |timestamp_us| is the current timestamp (in microseconds). 487 void (*send_frames)(uint64_t timestamp_us); 488 489 // Set transmit queue length for the A2DP encoder. 490 void (*set_transmit_queue_length)(size_t transmit_queue_length); 491 } tA2DP_ENCODER_INTERFACE; 492 493 // Gets the A2DP codec type. 494 // |p_codec_info| contains information about the codec capabilities. 495 tA2DP_CODEC_TYPE A2DP_GetCodecType(const uint8_t* p_codec_info); 496 497 // Checks whether the codec capabilities contain a valid A2DP Source codec. 498 // NOTE: only codecs that are implemented are considered valid. 499 // Returns true if |p_codec_info| contains information about a valid codec, 500 // otherwise false. 501 bool A2DP_IsSourceCodecValid(const uint8_t* p_codec_info); 502 503 // Checks whether the codec capabilities contain a valid A2DP Sink codec. 504 // NOTE: only codecs that are implemented are considered valid. 505 // Returns true if |p_codec_info| contains information about a valid codec, 506 // otherwise false. 507 bool A2DP_IsSinkCodecValid(const uint8_t* p_codec_info); 508 509 // Checks whether the codec capabilities contain a valid peer A2DP Source 510 // codec. 511 // NOTE: only codecs that are implemented are considered valid. 512 // Returns true if |p_codec_info| contains information about a valid codec, 513 // otherwise false. 514 bool A2DP_IsPeerSourceCodecValid(const uint8_t* p_codec_info); 515 516 // Checks whether the codec capabilities contain a valid peer A2DP Sink codec. 517 // NOTE: only codecs that are implemented are considered valid. 518 // Returns true if |p_codec_info| contains information about a valid codec, 519 // otherwise false. 520 bool A2DP_IsPeerSinkCodecValid(const uint8_t* p_codec_info); 521 522 // Checks whether an A2DP Sink codec is supported. 523 // |p_codec_info| contains information about the codec capabilities. 524 // Returns true if the A2DP Sink codec is supported, otherwise false. 525 bool A2DP_IsSinkCodecSupported(const uint8_t* p_codec_info); 526 527 // Checks whether an A2DP Source codec for a peer Source device is supported. 528 // |p_codec_info| contains information about the codec capabilities of the 529 // peer device. 530 // Returns true if the A2DP Source codec for a peer Source device is supported, 531 // otherwise false. 532 bool A2DP_IsPeerSourceCodecSupported(const uint8_t* p_codec_info); 533 534 // Initialize state with the default A2DP codec. 535 // The initialized state with the codec capabilities is stored in 536 // |p_codec_info|. 537 void A2DP_InitDefaultCodec(uint8_t* p_codec_info); 538 539 // Builds A2DP preferred Sink capability from Source capability. 540 // |p_src_cap| is the Source capability to use. 541 // |p_pref_cfg| is the result Sink capability to store. 542 // Returns |A2DP_SUCCESS| on success, otherwise the corresponding A2DP error 543 // status code. 544 tA2DP_STATUS A2DP_BuildSrc2SinkConfig(const uint8_t* p_src_cap, 545 uint8_t* p_pref_cfg); 546 547 // Checks whether the A2DP data packets should contain RTP header. 548 // |content_protection_enabled| is true if Content Protection is 549 // enabled. |p_codec_info| contains information about the codec capabilities. 550 // Returns true if the A2DP data packets should contain RTP header, otherwise 551 // false. 552 bool A2DP_UsesRtpHeader(bool content_protection_enabled, 553 const uint8_t* p_codec_info); 554 555 // Gets the |AVDT_MEDIA_TYPE_*| media type from the codec capability 556 // in |p_codec_info|. 557 uint8_t A2DP_GetMediaType(const uint8_t* p_codec_info); 558 559 // Gets the A2DP codec name for a given |p_codec_info|. 560 const char* A2DP_CodecName(const uint8_t* p_codec_info); 561 562 // Checks whether two A2DP codecs |p_codec_info_a| and |p_codec_info_b| have 563 // the same type. 564 // Returns true if the two codecs have the same type, otherwise false. 565 // If the codec type is not recognized, the return value is false. 566 bool A2DP_CodecTypeEquals(const uint8_t* p_codec_info_a, 567 const uint8_t* p_codec_info_b); 568 569 // Checks whether two A2DP codecs p_codec_info_a| and |p_codec_info_b| are 570 // exactly the same. 571 // Returns true if the two codecs are exactly the same, otherwise false. 572 // If the codec type is not recognized, the return value is false. 573 bool A2DP_CodecEquals(const uint8_t* p_codec_info_a, 574 const uint8_t* p_codec_info_b); 575 576 // Gets the track sample rate value for the A2DP codec. 577 // |p_codec_info| is a pointer to the codec_info to decode. 578 // Returns the track sample rate on success, or -1 if |p_codec_info| 579 // contains invalid codec information. 580 int A2DP_GetTrackSampleRate(const uint8_t* p_codec_info); 581 582 // Gets the channel count for the A2DP codec. 583 // |p_codec_info| is a pointer to the codec_info to decode. 584 // Returns the channel count on success, or -1 if |p_codec_info| 585 // contains invalid codec information. 586 int A2DP_GetTrackChannelCount(const uint8_t* p_codec_info); 587 588 // Gets the channel type for the A2DP Sink codec: 589 // 1 for mono, or 3 for dual/stereo/joint. 590 // |p_codec_info| is a pointer to the codec_info to decode. 591 // Returns the channel type on success, or -1 if |p_codec_info| 592 // contains invalid codec information. 593 int A2DP_GetSinkTrackChannelType(const uint8_t* p_codec_info); 594 595 // Computes the number of frames to process in a time window for the A2DP 596 // Sink codec. |time_interval_ms| is the time interval (in milliseconds). 597 // |p_codec_info| is a pointer to the codec_info to decode. 598 // Returns the number of frames to process on success, or -1 if |p_codec_info| 599 // contains invalid codec information. 600 int A2DP_GetSinkFramesCountToProcess(uint64_t time_interval_ms, 601 const uint8_t* p_codec_info); 602 603 // Gets the A2DP audio data timestamp from an audio packet. 604 // |p_codec_info| contains the codec information. 605 // |p_data| contains the audio data. 606 // The timestamp is stored in |p_timestamp|. 607 // Returns true on success, otherwise false. 608 bool A2DP_GetPacketTimestamp(const uint8_t* p_codec_info, const uint8_t* p_data, 609 uint32_t* p_timestamp); 610 611 // Builds A2DP codec header for audio data. 612 // |p_codec_info| contains the codec information. 613 // |p_buf| contains the audio data. 614 // |frames_per_packet| is the number of frames in this packet. 615 // Returns true on success, otherwise false. 616 bool A2DP_BuildCodecHeader(const uint8_t* p_codec_info, BT_HDR* p_buf, 617 uint16_t frames_per_packet); 618 619 // Gets the A2DP encoder interface that can be used to encode and prepare 620 // A2DP packets for transmission - see |tA2DP_ENCODER_INTERFACE|. 621 // |p_codec_info| contains the codec information. 622 // Returns the A2DP encoder interface if the |p_codec_info| is valid and 623 // supported, otherwise NULL. 624 const tA2DP_ENCODER_INTERFACE* A2DP_GetEncoderInterface( 625 const uint8_t* p_codec_info); 626 627 // Adjusts the A2DP codec, based on local support and Bluetooth specification. 628 // |p_codec_info| contains the codec information to adjust. 629 // Returns true if |p_codec_info| is valid and supported, otherwise false. 630 bool A2DP_AdjustCodec(uint8_t* p_codec_info); 631 632 // Gets the A2DP Source codec index for a given |p_codec_info|. 633 // Returns the corresponding |btav_a2dp_codec_index_t| on success, 634 // otherwise |BTAV_A2DP_CODEC_INDEX_MAX|. 635 btav_a2dp_codec_index_t A2DP_SourceCodecIndex(const uint8_t* p_codec_info); 636 637 // Gets the A2DP codec name for a given |codec_index|. 638 const char* A2DP_CodecIndexStr(btav_a2dp_codec_index_t codec_index); 639 640 // Initializes A2DP codec-specific information into |tAVDT_CFG| configuration 641 // entry pointed by |p_cfg|. The selected codec is defined by |codec_index|. 642 // Returns true on success, otherwise false. 643 bool A2DP_InitCodecConfig(btav_a2dp_codec_index_t codec_index, 644 tAVDT_CFG* p_cfg); 645 646 // Decodes and displays A2DP codec info when using |LOG_DEBUG|. 647 // |p_codec_info| is a pointer to the codec_info to decode and display. 648 // Returns true if the codec information is valid, otherwise false. 649 bool A2DP_DumpCodecInfo(const uint8_t* p_codec_info); 650 651 // Add enum-based flag operators to the btav_a2dp_codec_config_t fields 652 #ifndef DEFINE_ENUM_FLAG_OPERATORS 653 #define DEFINE_ENUM_FLAG_OPERATORS(bitmask) \ 654 extern "C++" { \ 655 inline constexpr bitmask operator&(bitmask X, bitmask Y) { \ 656 return static_cast<bitmask>(static_cast<int>(X) & static_cast<int>(Y)); \ 657 } \ 658 inline constexpr bitmask operator|(bitmask X, bitmask Y) { \ 659 return static_cast<bitmask>(static_cast<int>(X) | static_cast<int>(Y)); \ 660 } \ 661 inline constexpr bitmask operator^(bitmask X, bitmask Y) { \ 662 return static_cast<bitmask>(static_cast<int>(X) ^ static_cast<int>(Y)); \ 663 } \ 664 inline constexpr bitmask operator~(bitmask X) { \ 665 return static_cast<bitmask>(~static_cast<int>(X)); \ 666 } \ 667 inline bitmask& operator&=(bitmask& X, bitmask Y) { \ 668 X = X & Y; \ 669 return X; \ 670 } \ 671 inline bitmask& operator|=(bitmask& X, bitmask Y) { \ 672 X = X | Y; \ 673 return X; \ 674 } \ 675 inline bitmask& operator^=(bitmask& X, bitmask Y) { \ 676 X = X ^ Y; \ 677 return X; \ 678 } \ 679 } 680 #endif // DEFINE_ENUM_FLAG_OPERATORS 681 DEFINE_ENUM_FLAG_OPERATORS(btav_a2dp_codec_sample_rate_t); 682 DEFINE_ENUM_FLAG_OPERATORS(btav_a2dp_codec_bits_per_sample_t); 683 DEFINE_ENUM_FLAG_OPERATORS(btav_a2dp_codec_channel_mode_t); 684 685 #endif // A2DP_CODEC_API_H 686