Home | History | Annotate | Download | only in a2dp
      1 /*
      2  * Copyright 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  *
     19  *  Utility functions to help build and parse the aptX Codec Information
     20  *  Element and Media Payload.
     21  *
     22  ******************************************************************************/
     23 
     24 #define LOG_TAG "a2dp_vendor_aptx"
     25 
     26 #include "bt_target.h"
     27 
     28 #include "a2dp_vendor_aptx.h"
     29 
     30 #include <string.h>
     31 
     32 #include <base/logging.h>
     33 #include "a2dp_vendor.h"
     34 #include "a2dp_vendor_aptx_encoder.h"
     35 #include "bt_utils.h"
     36 #include "btif_av_co.h"
     37 #include "osi/include/log.h"
     38 #include "osi/include/osi.h"
     39 
     40 // data type for the aptX Codec Information Element */
     41 typedef struct {
     42   uint32_t vendorId;
     43   uint16_t codecId;    /* Codec ID for aptX */
     44   uint8_t sampleRate;  /* Sampling Frequency */
     45   uint8_t channelMode; /* STEREO/DUAL/MONO */
     46   uint8_t future1;
     47   uint8_t future2;
     48   btav_a2dp_codec_bits_per_sample_t bits_per_sample;
     49 } tA2DP_APTX_CIE;
     50 
     51 /* aptX Source codec capabilities */
     52 static const tA2DP_APTX_CIE a2dp_aptx_source_caps = {
     53     A2DP_APTX_VENDOR_ID,                                       /* vendorId */
     54     A2DP_APTX_CODEC_ID_BLUETOOTH,                              /* codecId */
     55     (A2DP_APTX_SAMPLERATE_44100 | A2DP_APTX_SAMPLERATE_48000), /* sampleRate */
     56     A2DP_APTX_CHANNELS_STEREO,                                 /* channelMode */
     57     A2DP_APTX_FUTURE_1,                                        /* future1 */
     58     A2DP_APTX_FUTURE_2,                                        /* future2 */
     59     BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16 /* bits_per_sample */
     60 };
     61 
     62 /* Default aptX codec configuration */
     63 static const tA2DP_APTX_CIE a2dp_aptx_default_config = {
     64     A2DP_APTX_VENDOR_ID,               /* vendorId */
     65     A2DP_APTX_CODEC_ID_BLUETOOTH,      /* codecId */
     66     A2DP_APTX_SAMPLERATE_48000,        /* sampleRate */
     67     A2DP_APTX_CHANNELS_STEREO,         /* channelMode */
     68     A2DP_APTX_FUTURE_1,                /* future1 */
     69     A2DP_APTX_FUTURE_2,                /* future2 */
     70     BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16 /* bits_per_sample */
     71 };
     72 
     73 static const tA2DP_ENCODER_INTERFACE a2dp_encoder_interface_aptx = {
     74     a2dp_vendor_aptx_encoder_init,
     75     a2dp_vendor_aptx_encoder_cleanup,
     76     a2dp_vendor_aptx_feeding_reset,
     77     a2dp_vendor_aptx_feeding_flush,
     78     a2dp_vendor_aptx_get_encoder_interval_ms,
     79     a2dp_vendor_aptx_send_frames,
     80     nullptr  // set_transmit_queue_length
     81 };
     82 
     83 UNUSED_ATTR static tA2DP_STATUS A2DP_CodecInfoMatchesCapabilityAptx(
     84     const tA2DP_APTX_CIE* p_cap, const uint8_t* p_codec_info,
     85     bool is_peer_codec_info);
     86 
     87 // Builds the aptX Media Codec Capabilities byte sequence beginning from the
     88 // LOSC octet. |media_type| is the media type |AVDT_MEDIA_TYPE_*|.
     89 // |p_ie| is a pointer to the aptX Codec Information Element information.
     90 // The result is stored in |p_result|. Returns A2DP_SUCCESS on success,
     91 // otherwise the corresponding A2DP error status code.
     92 static tA2DP_STATUS A2DP_BuildInfoAptx(uint8_t media_type,
     93                                        const tA2DP_APTX_CIE* p_ie,
     94                                        uint8_t* p_result) {
     95   if (p_ie == NULL || p_result == NULL) {
     96     return A2DP_INVALID_PARAMS;
     97   }
     98 
     99   *p_result++ = A2DP_APTX_CODEC_LEN;
    100   *p_result++ = (media_type << 4);
    101   *p_result++ = A2DP_MEDIA_CT_NON_A2DP;
    102   *p_result++ = (uint8_t)(p_ie->vendorId & 0x000000FF);
    103   *p_result++ = (uint8_t)((p_ie->vendorId & 0x0000FF00) >> 8);
    104   *p_result++ = (uint8_t)((p_ie->vendorId & 0x00FF0000) >> 16);
    105   *p_result++ = (uint8_t)((p_ie->vendorId & 0xFF000000) >> 24);
    106   *p_result++ = (uint8_t)(p_ie->codecId & 0x00FF);
    107   *p_result++ = (uint8_t)((p_ie->codecId & 0xFF00) >> 8);
    108   *p_result++ = p_ie->sampleRate | p_ie->channelMode;
    109 
    110   return A2DP_SUCCESS;
    111 }
    112 
    113 // Parses the aptX Media Codec Capabilities byte sequence beginning from the
    114 // LOSC octet. The result is stored in |p_ie|. The byte sequence to parse is
    115 // |p_codec_info|. If |is_capability| is true, the byte sequence is
    116 // codec capabilities, otherwise is codec configuration.
    117 // Returns A2DP_SUCCESS on success, otherwise the corresponding A2DP error
    118 // status code.
    119 static tA2DP_STATUS A2DP_ParseInfoAptx(tA2DP_APTX_CIE* p_ie,
    120                                        const uint8_t* p_codec_info,
    121                                        bool is_capability) {
    122   uint8_t losc;
    123   uint8_t media_type;
    124   tA2DP_CODEC_TYPE codec_type;
    125 
    126   if (p_ie == NULL || p_codec_info == NULL) return A2DP_INVALID_PARAMS;
    127 
    128   // Check the codec capability length
    129   losc = *p_codec_info++;
    130   if (losc != A2DP_APTX_CODEC_LEN) return A2DP_WRONG_CODEC;
    131 
    132   media_type = (*p_codec_info++) >> 4;
    133   codec_type = *p_codec_info++;
    134   /* Check the Media Type and Media Codec Type */
    135   if (media_type != AVDT_MEDIA_TYPE_AUDIO ||
    136       codec_type != A2DP_MEDIA_CT_NON_A2DP) {
    137     return A2DP_WRONG_CODEC;
    138   }
    139 
    140   // Check the Vendor ID and Codec ID */
    141   p_ie->vendorId = (*p_codec_info & 0x000000FF) |
    142                    (*(p_codec_info + 1) << 8 & 0x0000FF00) |
    143                    (*(p_codec_info + 2) << 16 & 0x00FF0000) |
    144                    (*(p_codec_info + 3) << 24 & 0xFF000000);
    145   p_codec_info += 4;
    146   p_ie->codecId =
    147       (*p_codec_info & 0x00FF) | (*(p_codec_info + 1) << 8 & 0xFF00);
    148   p_codec_info += 2;
    149   if (p_ie->vendorId != A2DP_APTX_VENDOR_ID ||
    150       p_ie->codecId != A2DP_APTX_CODEC_ID_BLUETOOTH) {
    151     return A2DP_WRONG_CODEC;
    152   }
    153 
    154   p_ie->channelMode = *p_codec_info & 0x0F;
    155   p_ie->sampleRate = *p_codec_info & 0xF0;
    156   p_codec_info++;
    157 
    158   if (is_capability) return A2DP_SUCCESS;
    159 
    160   if (A2DP_BitsSet(p_ie->sampleRate) != A2DP_SET_ONE_BIT)
    161     return A2DP_BAD_SAMP_FREQ;
    162   if (A2DP_BitsSet(p_ie->channelMode) != A2DP_SET_ONE_BIT)
    163     return A2DP_BAD_CH_MODE;
    164 
    165   return A2DP_SUCCESS;
    166 }
    167 
    168 bool A2DP_IsVendorSourceCodecValidAptx(const uint8_t* p_codec_info) {
    169   tA2DP_APTX_CIE cfg_cie;
    170 
    171   /* Use a liberal check when parsing the codec info */
    172   return (A2DP_ParseInfoAptx(&cfg_cie, p_codec_info, false) == A2DP_SUCCESS) ||
    173          (A2DP_ParseInfoAptx(&cfg_cie, p_codec_info, true) == A2DP_SUCCESS);
    174 }
    175 
    176 bool A2DP_IsVendorPeerSinkCodecValidAptx(const uint8_t* p_codec_info) {
    177   tA2DP_APTX_CIE cfg_cie;
    178 
    179   /* Use a liberal check when parsing the codec info */
    180   return (A2DP_ParseInfoAptx(&cfg_cie, p_codec_info, false) == A2DP_SUCCESS) ||
    181          (A2DP_ParseInfoAptx(&cfg_cie, p_codec_info, true) == A2DP_SUCCESS);
    182 }
    183 
    184 // Checks whether A2DP aptX codec configuration matches with a device's codec
    185 // capabilities. |p_cap| is the aptX codec configuration. |p_codec_info| is
    186 // the device's codec capabilities.
    187 // If |is_capability| is true, the byte sequence is codec capabilities,
    188 // otherwise is codec configuration.
    189 // |p_codec_info| contains the codec capabilities for a peer device that
    190 // is acting as an A2DP source.
    191 // Returns A2DP_SUCCESS if the codec configuration matches with capabilities,
    192 // otherwise the corresponding A2DP error status code.
    193 static tA2DP_STATUS A2DP_CodecInfoMatchesCapabilityAptx(
    194     const tA2DP_APTX_CIE* p_cap, const uint8_t* p_codec_info,
    195     bool is_capability) {
    196   tA2DP_STATUS status;
    197   tA2DP_APTX_CIE cfg_cie;
    198 
    199   /* parse configuration */
    200   status = A2DP_ParseInfoAptx(&cfg_cie, p_codec_info, is_capability);
    201   if (status != A2DP_SUCCESS) {
    202     LOG_ERROR(LOG_TAG, "%s: parsing failed %d", __func__, status);
    203     return status;
    204   }
    205 
    206   /* verify that each parameter is in range */
    207 
    208   LOG_VERBOSE(LOG_TAG, "%s: FREQ peer: 0x%x, capability 0x%x", __func__,
    209               cfg_cie.sampleRate, p_cap->sampleRate);
    210   LOG_VERBOSE(LOG_TAG, "%s: CH_MODE peer: 0x%x, capability 0x%x", __func__,
    211               cfg_cie.channelMode, p_cap->channelMode);
    212 
    213   /* sampling frequency */
    214   if ((cfg_cie.sampleRate & p_cap->sampleRate) == 0) return A2DP_NS_SAMP_FREQ;
    215 
    216   /* channel mode */
    217   if ((cfg_cie.channelMode & p_cap->channelMode) == 0) return A2DP_NS_CH_MODE;
    218 
    219   return A2DP_SUCCESS;
    220 }
    221 
    222 bool A2DP_VendorUsesRtpHeaderAptx(UNUSED_ATTR bool content_protection_enabled,
    223                                   UNUSED_ATTR const uint8_t* p_codec_info) {
    224 #if (BTA_AV_CO_CP_SCMS_T == TRUE)
    225   return true;
    226 #else
    227   // no RTP header for aptX classic and no Copy Protection byte
    228   return false;
    229 #endif
    230 }
    231 
    232 const char* A2DP_VendorCodecNameAptx(UNUSED_ATTR const uint8_t* p_codec_info) {
    233   return "aptX";
    234 }
    235 
    236 bool A2DP_VendorCodecTypeEqualsAptx(const uint8_t* p_codec_info_a,
    237                                     const uint8_t* p_codec_info_b) {
    238   tA2DP_APTX_CIE aptx_cie_a;
    239   tA2DP_APTX_CIE aptx_cie_b;
    240 
    241   // Check whether the codec info contains valid data
    242   tA2DP_STATUS a2dp_status =
    243       A2DP_ParseInfoAptx(&aptx_cie_a, p_codec_info_a, true);
    244   if (a2dp_status != A2DP_SUCCESS) {
    245     LOG_ERROR(LOG_TAG, "%s: cannot decode codec information: %d", __func__,
    246               a2dp_status);
    247     return false;
    248   }
    249   a2dp_status = A2DP_ParseInfoAptx(&aptx_cie_b, p_codec_info_b, true);
    250   if (a2dp_status != A2DP_SUCCESS) {
    251     LOG_ERROR(LOG_TAG, "%s: cannot decode codec information: %d", __func__,
    252               a2dp_status);
    253     return false;
    254   }
    255 
    256   return true;
    257 }
    258 
    259 bool A2DP_VendorCodecEqualsAptx(const uint8_t* p_codec_info_a,
    260                                 const uint8_t* p_codec_info_b) {
    261   tA2DP_APTX_CIE aptx_cie_a;
    262   tA2DP_APTX_CIE aptx_cie_b;
    263 
    264   // Check whether the codec info contains valid data
    265   tA2DP_STATUS a2dp_status =
    266       A2DP_ParseInfoAptx(&aptx_cie_a, p_codec_info_a, true);
    267   if (a2dp_status != A2DP_SUCCESS) {
    268     LOG_ERROR(LOG_TAG, "%s: cannot decode codec information: %d", __func__,
    269               a2dp_status);
    270     return false;
    271   }
    272   a2dp_status = A2DP_ParseInfoAptx(&aptx_cie_b, p_codec_info_b, true);
    273   if (a2dp_status != A2DP_SUCCESS) {
    274     LOG_ERROR(LOG_TAG, "%s: cannot decode codec information: %d", __func__,
    275               a2dp_status);
    276     return false;
    277   }
    278 
    279   return (aptx_cie_a.sampleRate == aptx_cie_b.sampleRate) &&
    280          (aptx_cie_a.channelMode == aptx_cie_b.channelMode);
    281 }
    282 
    283 int A2DP_VendorGetBitRateAptx(const uint8_t* p_codec_info) {
    284   A2dpCodecConfig* CodecConfig = bta_av_get_a2dp_current_codec();
    285   tA2DP_BITS_PER_SAMPLE bits_per_sample = CodecConfig->getAudioBitsPerSample();
    286   uint16_t samplerate = A2DP_GetTrackSampleRate(p_codec_info);
    287   return (samplerate * bits_per_sample * 2) / 4;
    288 }
    289 
    290 int A2DP_VendorGetTrackSampleRateAptx(const uint8_t* p_codec_info) {
    291   tA2DP_APTX_CIE aptx_cie;
    292 
    293   // Check whether the codec info contains valid data
    294   tA2DP_STATUS a2dp_status = A2DP_ParseInfoAptx(&aptx_cie, p_codec_info, false);
    295   if (a2dp_status != A2DP_SUCCESS) {
    296     LOG_ERROR(LOG_TAG, "%s: cannot decode codec information: %d", __func__,
    297               a2dp_status);
    298     return -1;
    299   }
    300 
    301   if (aptx_cie.sampleRate == A2DP_APTX_SAMPLERATE_44100) return 44100;
    302   if (aptx_cie.sampleRate == A2DP_APTX_SAMPLERATE_48000) return 48000;
    303 
    304   return -1;
    305 }
    306 
    307 int A2DP_VendorGetTrackChannelCountAptx(const uint8_t* p_codec_info) {
    308   tA2DP_APTX_CIE aptx_cie;
    309 
    310   // Check whether the codec info contains valid data
    311   tA2DP_STATUS a2dp_status = A2DP_ParseInfoAptx(&aptx_cie, p_codec_info, false);
    312   if (a2dp_status != A2DP_SUCCESS) {
    313     LOG_ERROR(LOG_TAG, "%s: cannot decode codec information: %d", __func__,
    314               a2dp_status);
    315     return -1;
    316   }
    317 
    318   switch (aptx_cie.channelMode) {
    319     case A2DP_APTX_CHANNELS_MONO:
    320       return 1;
    321     case A2DP_APTX_CHANNELS_STEREO:
    322       return 2;
    323   }
    324 
    325   return -1;
    326 }
    327 
    328 bool A2DP_VendorGetPacketTimestampAptx(UNUSED_ATTR const uint8_t* p_codec_info,
    329                                        const uint8_t* p_data,
    330                                        uint32_t* p_timestamp) {
    331   // TODO: Is this function really codec-specific?
    332   *p_timestamp = *(const uint32_t*)p_data;
    333   return true;
    334 }
    335 
    336 bool A2DP_VendorBuildCodecHeaderAptx(UNUSED_ATTR const uint8_t* p_codec_info,
    337                                      UNUSED_ATTR BT_HDR* p_buf,
    338                                      UNUSED_ATTR uint16_t frames_per_packet) {
    339   // Nothing to do
    340   return true;
    341 }
    342 
    343 std::string A2DP_VendorCodecInfoStringAptx(const uint8_t* p_codec_info) {
    344   std::stringstream res;
    345   std::string field;
    346   tA2DP_STATUS a2dp_status;
    347   tA2DP_APTX_CIE aptx_cie;
    348 
    349   a2dp_status = A2DP_ParseInfoAptx(&aptx_cie, p_codec_info, true);
    350   if (a2dp_status != A2DP_SUCCESS) {
    351     res << "A2DP_ParseInfoAptx fail: " << loghex(a2dp_status);
    352     return res.str();
    353   }
    354 
    355   res << "\tname: aptX\n";
    356 
    357   // Sample frequency
    358   field.clear();
    359   AppendField(&field, (aptx_cie.sampleRate == 0), "NONE");
    360   AppendField(&field, (aptx_cie.sampleRate & A2DP_APTX_SAMPLERATE_44100),
    361               "44100");
    362   AppendField(&field, (aptx_cie.sampleRate & A2DP_APTX_SAMPLERATE_48000),
    363               "48000");
    364   res << "\tsamp_freq: " << field << " (" << loghex(aptx_cie.sampleRate)
    365       << ")\n";
    366 
    367   // Channel mode
    368   field.clear();
    369   AppendField(&field, (aptx_cie.channelMode == 0), "NONE");
    370   AppendField(&field, (aptx_cie.channelMode & A2DP_APTX_CHANNELS_MONO), "Mono");
    371   AppendField(&field, (aptx_cie.channelMode & A2DP_APTX_CHANNELS_STEREO),
    372               "Stereo");
    373   res << "\tch_mode: " << field << " (" << loghex(aptx_cie.channelMode)
    374       << ")\n";
    375 
    376   return res.str();
    377 }
    378 
    379 const tA2DP_ENCODER_INTERFACE* A2DP_VendorGetEncoderInterfaceAptx(
    380     const uint8_t* p_codec_info) {
    381   if (!A2DP_IsVendorSourceCodecValidAptx(p_codec_info)) return NULL;
    382 
    383   return &a2dp_encoder_interface_aptx;
    384 }
    385 
    386 bool A2DP_VendorAdjustCodecAptx(uint8_t* p_codec_info) {
    387   tA2DP_APTX_CIE cfg_cie;
    388 
    389   // Nothing to do: just verify the codec info is valid
    390   if (A2DP_ParseInfoAptx(&cfg_cie, p_codec_info, true) != A2DP_SUCCESS)
    391     return false;
    392 
    393   return true;
    394 }
    395 
    396 btav_a2dp_codec_index_t A2DP_VendorSourceCodecIndexAptx(
    397     UNUSED_ATTR const uint8_t* p_codec_info) {
    398   return BTAV_A2DP_CODEC_INDEX_SOURCE_APTX;
    399 }
    400 
    401 const char* A2DP_VendorCodecIndexStrAptx(void) { return "aptX"; }
    402 
    403 bool A2DP_VendorInitCodecConfigAptx(AvdtpSepConfig* p_cfg) {
    404   if (A2DP_BuildInfoAptx(AVDT_MEDIA_TYPE_AUDIO, &a2dp_aptx_source_caps,
    405                          p_cfg->codec_info) != A2DP_SUCCESS) {
    406     return false;
    407   }
    408 
    409 #if (BTA_AV_CO_CP_SCMS_T == TRUE)
    410   /* Content protection info - support SCMS-T */
    411   uint8_t* p = p_cfg->protect_info;
    412   *p++ = AVDT_CP_LOSC;
    413   UINT16_TO_STREAM(p, AVDT_CP_SCMS_T_ID);
    414   p_cfg->num_protect = 1;
    415 #endif
    416 
    417   return true;
    418 }
    419 
    420 A2dpCodecConfigAptx::A2dpCodecConfigAptx(
    421     btav_a2dp_codec_priority_t codec_priority)
    422     : A2dpCodecConfig(BTAV_A2DP_CODEC_INDEX_SOURCE_APTX, "aptX",
    423                       codec_priority) {
    424   // Compute the local capability
    425   if (a2dp_aptx_source_caps.sampleRate & A2DP_APTX_SAMPLERATE_44100) {
    426     codec_local_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_44100;
    427   }
    428   if (a2dp_aptx_source_caps.sampleRate & A2DP_APTX_SAMPLERATE_48000) {
    429     codec_local_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_48000;
    430   }
    431   codec_local_capability_.bits_per_sample =
    432       a2dp_aptx_source_caps.bits_per_sample;
    433   if (a2dp_aptx_source_caps.channelMode & A2DP_APTX_CHANNELS_MONO) {
    434     codec_local_capability_.channel_mode |= BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
    435   }
    436   if (a2dp_aptx_source_caps.channelMode & A2DP_APTX_CHANNELS_STEREO) {
    437     codec_local_capability_.channel_mode |= BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
    438   }
    439 }
    440 
    441 A2dpCodecConfigAptx::~A2dpCodecConfigAptx() {}
    442 
    443 bool A2dpCodecConfigAptx::init() {
    444   if (!isValid()) return false;
    445 
    446   // Load the encoder
    447   if (!A2DP_VendorLoadEncoderAptx()) {
    448     LOG_ERROR(LOG_TAG, "%s: cannot load the encoder", __func__);
    449     return false;
    450   }
    451 
    452   return true;
    453 }
    454 
    455 bool A2dpCodecConfigAptx::useRtpHeaderMarkerBit() const { return false; }
    456 
    457 //
    458 // Selects the best sample rate from |sampleRate|.
    459 // The result is stored in |p_result| and p_codec_config|.
    460 // Returns true if a selection was made, otherwise false.
    461 //
    462 static bool select_best_sample_rate(uint8_t sampleRate,
    463                                     tA2DP_APTX_CIE* p_result,
    464                                     btav_a2dp_codec_config_t* p_codec_config) {
    465   if (sampleRate & A2DP_APTX_SAMPLERATE_48000) {
    466     p_result->sampleRate = A2DP_APTX_SAMPLERATE_48000;
    467     p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_48000;
    468     return true;
    469   }
    470   if (sampleRate & A2DP_APTX_SAMPLERATE_44100) {
    471     p_result->sampleRate = A2DP_APTX_SAMPLERATE_44100;
    472     p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_44100;
    473     return true;
    474   }
    475   return false;
    476 }
    477 
    478 //
    479 // Selects the audio sample rate from |p_codec_audio_config|.
    480 // |sampleRate| contains the capability.
    481 // The result is stored in |p_result| and |p_codec_config|.
    482 // Returns true if a selection was made, otherwise false.
    483 //
    484 static bool select_audio_sample_rate(
    485     const btav_a2dp_codec_config_t* p_codec_audio_config, uint8_t sampleRate,
    486     tA2DP_APTX_CIE* p_result, btav_a2dp_codec_config_t* p_codec_config) {
    487   switch (p_codec_audio_config->sample_rate) {
    488     case BTAV_A2DP_CODEC_SAMPLE_RATE_44100:
    489       if (sampleRate & A2DP_APTX_SAMPLERATE_44100) {
    490         p_result->sampleRate = A2DP_APTX_SAMPLERATE_44100;
    491         p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_44100;
    492         return true;
    493       }
    494       break;
    495     case BTAV_A2DP_CODEC_SAMPLE_RATE_48000:
    496       if (sampleRate & A2DP_APTX_SAMPLERATE_48000) {
    497         p_result->sampleRate = A2DP_APTX_SAMPLERATE_48000;
    498         p_codec_config->sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_48000;
    499         return true;
    500       }
    501       break;
    502     case BTAV_A2DP_CODEC_SAMPLE_RATE_88200:
    503     case BTAV_A2DP_CODEC_SAMPLE_RATE_96000:
    504     case BTAV_A2DP_CODEC_SAMPLE_RATE_176400:
    505     case BTAV_A2DP_CODEC_SAMPLE_RATE_192000:
    506     case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
    507     case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
    508     case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
    509       break;
    510   }
    511   return false;
    512 }
    513 
    514 //
    515 // Selects the best bits per sample.
    516 // The result is stored in |p_codec_config|.
    517 // Returns true if a selection was made, otherwise false.
    518 //
    519 static bool select_best_bits_per_sample(
    520     btav_a2dp_codec_config_t* p_codec_config) {
    521   p_codec_config->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16;
    522   return true;
    523 }
    524 
    525 //
    526 // Selects the audio bits per sample from |p_codec_audio_config|.
    527 // The result is stored in |p_codec_config|.
    528 // Returns true if a selection was made, otherwise false.
    529 //
    530 static bool select_audio_bits_per_sample(
    531     const btav_a2dp_codec_config_t* p_codec_audio_config,
    532     btav_a2dp_codec_config_t* p_codec_config) {
    533   switch (p_codec_audio_config->bits_per_sample) {
    534     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16:
    535       p_codec_config->bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16;
    536       return true;
    537     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24:
    538     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32:
    539     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE:
    540       break;
    541   }
    542   return false;
    543 }
    544 
    545 //
    546 // Selects the best channel mode from |channelMode|.
    547 // The result is stored in |p_result| and |p_codec_config|.
    548 // Returns true if a selection was made, otherwise false.
    549 //
    550 static bool select_best_channel_mode(uint8_t channelMode,
    551                                      tA2DP_APTX_CIE* p_result,
    552                                      btav_a2dp_codec_config_t* p_codec_config) {
    553   if (channelMode & A2DP_APTX_CHANNELS_STEREO) {
    554     p_result->channelMode = A2DP_APTX_CHANNELS_STEREO;
    555     p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
    556     return true;
    557   }
    558   if (channelMode & A2DP_APTX_CHANNELS_MONO) {
    559     p_result->channelMode = A2DP_APTX_CHANNELS_MONO;
    560     p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
    561     return true;
    562   }
    563   return false;
    564 }
    565 
    566 //
    567 // Selects the audio channel mode from |p_codec_audio_config|.
    568 // |channelMode| contains the capability.
    569 // The result is stored in |p_result| and |p_codec_config|.
    570 // Returns true if a selection was made, otherwise false.
    571 //
    572 static bool select_audio_channel_mode(
    573     const btav_a2dp_codec_config_t* p_codec_audio_config, uint8_t channelMode,
    574     tA2DP_APTX_CIE* p_result, btav_a2dp_codec_config_t* p_codec_config) {
    575   switch (p_codec_audio_config->channel_mode) {
    576     case BTAV_A2DP_CODEC_CHANNEL_MODE_MONO:
    577       if (channelMode & A2DP_APTX_CHANNELS_MONO) {
    578         p_result->channelMode = A2DP_APTX_CHANNELS_MONO;
    579         p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
    580         return true;
    581       }
    582       break;
    583     case BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO:
    584       if (channelMode & A2DP_APTX_CHANNELS_STEREO) {
    585         p_result->channelMode = A2DP_APTX_CHANNELS_STEREO;
    586         p_codec_config->channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
    587         return true;
    588       }
    589       break;
    590     case BTAV_A2DP_CODEC_CHANNEL_MODE_NONE:
    591       break;
    592   }
    593 
    594   return false;
    595 }
    596 
    597 bool A2dpCodecConfigAptx::setCodecConfig(const uint8_t* p_peer_codec_info,
    598                                          bool is_capability,
    599                                          uint8_t* p_result_codec_config) {
    600   std::lock_guard<std::recursive_mutex> lock(codec_mutex_);
    601   tA2DP_APTX_CIE peer_info_cie;
    602   tA2DP_APTX_CIE result_config_cie;
    603   uint8_t sampleRate;
    604   uint8_t channelMode;
    605 
    606   // Save the internal state
    607   btav_a2dp_codec_config_t saved_codec_config = codec_config_;
    608   btav_a2dp_codec_config_t saved_codec_capability = codec_capability_;
    609   btav_a2dp_codec_config_t saved_codec_selectable_capability =
    610       codec_selectable_capability_;
    611   btav_a2dp_codec_config_t saved_codec_user_config = codec_user_config_;
    612   btav_a2dp_codec_config_t saved_codec_audio_config = codec_audio_config_;
    613   uint8_t saved_ota_codec_config[AVDT_CODEC_SIZE];
    614   uint8_t saved_ota_codec_peer_capability[AVDT_CODEC_SIZE];
    615   uint8_t saved_ota_codec_peer_config[AVDT_CODEC_SIZE];
    616   memcpy(saved_ota_codec_config, ota_codec_config_, sizeof(ota_codec_config_));
    617   memcpy(saved_ota_codec_peer_capability, ota_codec_peer_capability_,
    618          sizeof(ota_codec_peer_capability_));
    619   memcpy(saved_ota_codec_peer_config, ota_codec_peer_config_,
    620          sizeof(ota_codec_peer_config_));
    621 
    622   tA2DP_STATUS status =
    623       A2DP_ParseInfoAptx(&peer_info_cie, p_peer_codec_info, is_capability);
    624   if (status != A2DP_SUCCESS) {
    625     LOG_ERROR(LOG_TAG, "%s: can't parse peer's capabilities: error = %d",
    626               __func__, status);
    627     goto fail;
    628   }
    629 
    630   //
    631   // Build the preferred configuration
    632   //
    633   memset(&result_config_cie, 0, sizeof(result_config_cie));
    634   result_config_cie.vendorId = a2dp_aptx_source_caps.vendorId;
    635   result_config_cie.codecId = a2dp_aptx_source_caps.codecId;
    636 
    637   //
    638   // Select the sample frequency
    639   //
    640   sampleRate = a2dp_aptx_source_caps.sampleRate & peer_info_cie.sampleRate;
    641   codec_config_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
    642   switch (codec_user_config_.sample_rate) {
    643     case BTAV_A2DP_CODEC_SAMPLE_RATE_44100:
    644       if (sampleRate & A2DP_APTX_SAMPLERATE_44100) {
    645         result_config_cie.sampleRate = A2DP_APTX_SAMPLERATE_44100;
    646         codec_capability_.sample_rate = codec_user_config_.sample_rate;
    647         codec_config_.sample_rate = codec_user_config_.sample_rate;
    648       }
    649       break;
    650     case BTAV_A2DP_CODEC_SAMPLE_RATE_48000:
    651       if (sampleRate & A2DP_APTX_SAMPLERATE_48000) {
    652         result_config_cie.sampleRate = A2DP_APTX_SAMPLERATE_48000;
    653         codec_capability_.sample_rate = codec_user_config_.sample_rate;
    654         codec_config_.sample_rate = codec_user_config_.sample_rate;
    655       }
    656       break;
    657     case BTAV_A2DP_CODEC_SAMPLE_RATE_88200:
    658     case BTAV_A2DP_CODEC_SAMPLE_RATE_96000:
    659     case BTAV_A2DP_CODEC_SAMPLE_RATE_176400:
    660     case BTAV_A2DP_CODEC_SAMPLE_RATE_192000:
    661     case BTAV_A2DP_CODEC_SAMPLE_RATE_16000:
    662     case BTAV_A2DP_CODEC_SAMPLE_RATE_24000:
    663     case BTAV_A2DP_CODEC_SAMPLE_RATE_NONE:
    664       codec_capability_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
    665       codec_config_.sample_rate = BTAV_A2DP_CODEC_SAMPLE_RATE_NONE;
    666       break;
    667   }
    668 
    669   // Select the sample frequency if there is no user preference
    670   do {
    671     // Compute the selectable capability
    672     if (sampleRate & A2DP_APTX_SAMPLERATE_44100) {
    673       codec_selectable_capability_.sample_rate |=
    674           BTAV_A2DP_CODEC_SAMPLE_RATE_44100;
    675     }
    676     if (sampleRate & A2DP_APTX_SAMPLERATE_48000) {
    677       codec_selectable_capability_.sample_rate |=
    678           BTAV_A2DP_CODEC_SAMPLE_RATE_48000;
    679     }
    680 
    681     if (codec_config_.sample_rate != BTAV_A2DP_CODEC_SAMPLE_RATE_NONE) break;
    682 
    683     // Compute the common capability
    684     if (sampleRate & A2DP_APTX_SAMPLERATE_44100)
    685       codec_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_44100;
    686     if (sampleRate & A2DP_APTX_SAMPLERATE_48000)
    687       codec_capability_.sample_rate |= BTAV_A2DP_CODEC_SAMPLE_RATE_48000;
    688 
    689     // No user preference - try the codec audio config
    690     if (select_audio_sample_rate(&codec_audio_config_, sampleRate,
    691                                  &result_config_cie, &codec_config_)) {
    692       break;
    693     }
    694 
    695     // No user preference - try the default config
    696     if (select_best_sample_rate(
    697             a2dp_aptx_default_config.sampleRate & peer_info_cie.sampleRate,
    698             &result_config_cie, &codec_config_)) {
    699       break;
    700     }
    701 
    702     // No user preference - use the best match
    703     if (select_best_sample_rate(sampleRate, &result_config_cie,
    704                                 &codec_config_)) {
    705       break;
    706     }
    707   } while (false);
    708   if (codec_config_.sample_rate == BTAV_A2DP_CODEC_SAMPLE_RATE_NONE) {
    709     LOG_ERROR(LOG_TAG,
    710               "%s: cannot match sample frequency: local caps = 0x%x "
    711               "peer info = 0x%x",
    712               __func__, a2dp_aptx_source_caps.sampleRate,
    713               peer_info_cie.sampleRate);
    714     goto fail;
    715   }
    716 
    717   //
    718   // Select the bits per sample
    719   //
    720   // NOTE: this information is NOT included in the aptX A2DP codec
    721   // description that is sent OTA.
    722   codec_config_.bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE;
    723   switch (codec_user_config_.bits_per_sample) {
    724     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16:
    725       codec_capability_.bits_per_sample = codec_user_config_.bits_per_sample;
    726       codec_config_.bits_per_sample = codec_user_config_.bits_per_sample;
    727       break;
    728     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_24:
    729     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_32:
    730     case BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE:
    731       codec_capability_.bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE;
    732       codec_config_.bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE;
    733       break;
    734   }
    735 
    736   // Select the bits per sample if there is no user preference
    737   do {
    738     // Compute the selectable capability
    739     codec_selectable_capability_.bits_per_sample =
    740         a2dp_aptx_source_caps.bits_per_sample;
    741 
    742     if (codec_config_.bits_per_sample != BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE)
    743       break;
    744 
    745     // Compute the common capability
    746     codec_capability_.bits_per_sample = BTAV_A2DP_CODEC_BITS_PER_SAMPLE_16;
    747 
    748     // No user preference - try the codec audio config
    749     if (select_audio_bits_per_sample(&codec_audio_config_, &codec_config_)) {
    750       break;
    751     }
    752 
    753     // No user preference - try the default config
    754     if (select_best_bits_per_sample(&codec_config_)) {
    755       break;
    756     }
    757 
    758     // No user preference - use the best match
    759     // NOTE: no-op - kept here for consistency
    760     if (select_best_bits_per_sample(&codec_config_)) {
    761       break;
    762     }
    763   } while (false);
    764   if (codec_config_.bits_per_sample == BTAV_A2DP_CODEC_BITS_PER_SAMPLE_NONE) {
    765     LOG_ERROR(LOG_TAG,
    766               "%s: cannot match bits per sample: user preference = 0x%x",
    767               __func__, codec_user_config_.bits_per_sample);
    768     goto fail;
    769   }
    770 
    771   //
    772   // Select the channel mode
    773   //
    774   channelMode = a2dp_aptx_source_caps.channelMode & peer_info_cie.channelMode;
    775   codec_config_.channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_NONE;
    776   switch (codec_user_config_.channel_mode) {
    777     case BTAV_A2DP_CODEC_CHANNEL_MODE_MONO:
    778       if (channelMode & A2DP_APTX_CHANNELS_MONO) {
    779         result_config_cie.channelMode = A2DP_APTX_CHANNELS_MONO;
    780         codec_capability_.channel_mode = codec_user_config_.channel_mode;
    781         codec_config_.channel_mode = codec_user_config_.channel_mode;
    782       }
    783       break;
    784     case BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO:
    785       if (channelMode & A2DP_APTX_CHANNELS_STEREO) {
    786         result_config_cie.channelMode = A2DP_APTX_CHANNELS_STEREO;
    787         codec_capability_.channel_mode = codec_user_config_.channel_mode;
    788         codec_config_.channel_mode = codec_user_config_.channel_mode;
    789       }
    790       break;
    791     case BTAV_A2DP_CODEC_CHANNEL_MODE_NONE:
    792       codec_capability_.channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_NONE;
    793       codec_config_.channel_mode = BTAV_A2DP_CODEC_CHANNEL_MODE_NONE;
    794       break;
    795   }
    796 
    797   // Select the channel mode if there is no user preference
    798   do {
    799     // Compute the selectable capability
    800     if (channelMode & A2DP_APTX_CHANNELS_MONO) {
    801       codec_selectable_capability_.channel_mode |=
    802           BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
    803     }
    804     if (channelMode & A2DP_APTX_CHANNELS_STEREO) {
    805       codec_selectable_capability_.channel_mode |=
    806           BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
    807     }
    808 
    809     if (codec_config_.channel_mode != BTAV_A2DP_CODEC_CHANNEL_MODE_NONE) break;
    810 
    811     // Compute the common capability
    812     if (channelMode & A2DP_APTX_CHANNELS_MONO)
    813       codec_capability_.channel_mode |= BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
    814     if (channelMode & A2DP_APTX_CHANNELS_STEREO)
    815       codec_capability_.channel_mode |= BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
    816 
    817     // No user preference - try the codec audio config
    818     if (select_audio_channel_mode(&codec_audio_config_, channelMode,
    819                                   &result_config_cie, &codec_config_)) {
    820       break;
    821     }
    822 
    823     // No user preference - try the default config
    824     if (select_best_channel_mode(
    825             a2dp_aptx_default_config.channelMode & peer_info_cie.channelMode,
    826             &result_config_cie, &codec_config_)) {
    827       break;
    828     }
    829 
    830     // No user preference - use the best match
    831     if (select_best_channel_mode(channelMode, &result_config_cie,
    832                                  &codec_config_)) {
    833       break;
    834     }
    835   } while (false);
    836   if (codec_config_.channel_mode == BTAV_A2DP_CODEC_CHANNEL_MODE_NONE) {
    837     LOG_ERROR(LOG_TAG,
    838               "%s: cannot match channel mode: local caps = 0x%x "
    839               "peer info = 0x%x",
    840               __func__, a2dp_aptx_source_caps.channelMode,
    841               peer_info_cie.channelMode);
    842     goto fail;
    843   }
    844 
    845   //
    846   // Set the rest of the fields as bit-wise AND operation
    847   //
    848   result_config_cie.future1 =
    849       a2dp_aptx_source_caps.future1 & peer_info_cie.future1;
    850   result_config_cie.future2 =
    851       a2dp_aptx_source_caps.future2 & peer_info_cie.future2;
    852 
    853   if (A2DP_BuildInfoAptx(AVDT_MEDIA_TYPE_AUDIO, &result_config_cie,
    854                          p_result_codec_config) != A2DP_SUCCESS) {
    855     goto fail;
    856   }
    857 
    858   //
    859   // Copy the codec-specific fields if they are not zero
    860   //
    861   if (codec_user_config_.codec_specific_1 != 0)
    862     codec_config_.codec_specific_1 = codec_user_config_.codec_specific_1;
    863   if (codec_user_config_.codec_specific_2 != 0)
    864     codec_config_.codec_specific_2 = codec_user_config_.codec_specific_2;
    865   if (codec_user_config_.codec_specific_3 != 0)
    866     codec_config_.codec_specific_3 = codec_user_config_.codec_specific_3;
    867   if (codec_user_config_.codec_specific_4 != 0)
    868     codec_config_.codec_specific_4 = codec_user_config_.codec_specific_4;
    869 
    870   // Create a local copy of the peer codec capability/config, and the
    871   // result codec config.
    872   if (is_capability) {
    873     status = A2DP_BuildInfoAptx(AVDT_MEDIA_TYPE_AUDIO, &peer_info_cie,
    874                                 ota_codec_peer_capability_);
    875   } else {
    876     status = A2DP_BuildInfoAptx(AVDT_MEDIA_TYPE_AUDIO, &peer_info_cie,
    877                                 ota_codec_peer_config_);
    878   }
    879   CHECK(status == A2DP_SUCCESS);
    880   status = A2DP_BuildInfoAptx(AVDT_MEDIA_TYPE_AUDIO, &result_config_cie,
    881                               ota_codec_config_);
    882   CHECK(status == A2DP_SUCCESS);
    883 
    884   return true;
    885 
    886 fail:
    887   // Restore the internal state
    888   codec_config_ = saved_codec_config;
    889   codec_capability_ = saved_codec_capability;
    890   codec_selectable_capability_ = saved_codec_selectable_capability;
    891   codec_user_config_ = saved_codec_user_config;
    892   codec_audio_config_ = saved_codec_audio_config;
    893   memcpy(ota_codec_config_, saved_ota_codec_config, sizeof(ota_codec_config_));
    894   memcpy(ota_codec_peer_capability_, saved_ota_codec_peer_capability,
    895          sizeof(ota_codec_peer_capability_));
    896   memcpy(ota_codec_peer_config_, saved_ota_codec_peer_config,
    897          sizeof(ota_codec_peer_config_));
    898   return false;
    899 }
    900 
    901 bool A2dpCodecConfigAptx::setPeerCodecCapabilities(
    902     const uint8_t* p_peer_codec_capabilities) {
    903   std::lock_guard<std::recursive_mutex> lock(codec_mutex_);
    904   tA2DP_APTX_CIE peer_info_cie;
    905   uint8_t sampleRate;
    906   uint8_t channelMode;
    907 
    908   // Save the internal state
    909   btav_a2dp_codec_config_t saved_codec_selectable_capability =
    910       codec_selectable_capability_;
    911   uint8_t saved_ota_codec_peer_capability[AVDT_CODEC_SIZE];
    912   memcpy(saved_ota_codec_peer_capability, ota_codec_peer_capability_,
    913          sizeof(ota_codec_peer_capability_));
    914 
    915   tA2DP_STATUS status =
    916       A2DP_ParseInfoAptx(&peer_info_cie, p_peer_codec_capabilities, true);
    917   if (status != A2DP_SUCCESS) {
    918     LOG_ERROR(LOG_TAG, "%s: can't parse peer's capabilities: error = %d",
    919               __func__, status);
    920     goto fail;
    921   }
    922 
    923   // Compute the selectable capability - sample rate
    924   sampleRate = a2dp_aptx_source_caps.sampleRate & peer_info_cie.sampleRate;
    925   if (sampleRate & A2DP_APTX_SAMPLERATE_44100) {
    926     codec_selectable_capability_.sample_rate |=
    927         BTAV_A2DP_CODEC_SAMPLE_RATE_44100;
    928   }
    929   if (sampleRate & A2DP_APTX_SAMPLERATE_48000) {
    930     codec_selectable_capability_.sample_rate |=
    931         BTAV_A2DP_CODEC_SAMPLE_RATE_48000;
    932   }
    933 
    934   // Compute the selectable capability - bits per sample
    935   codec_selectable_capability_.bits_per_sample =
    936       a2dp_aptx_source_caps.bits_per_sample;
    937 
    938   // Compute the selectable capability - channel mode
    939   channelMode = a2dp_aptx_source_caps.channelMode & peer_info_cie.channelMode;
    940   if (channelMode & A2DP_APTX_CHANNELS_MONO) {
    941     codec_selectable_capability_.channel_mode |=
    942         BTAV_A2DP_CODEC_CHANNEL_MODE_MONO;
    943   }
    944   if (channelMode & A2DP_APTX_CHANNELS_STEREO) {
    945     codec_selectable_capability_.channel_mode |=
    946         BTAV_A2DP_CODEC_CHANNEL_MODE_STEREO;
    947   }
    948 
    949   status = A2DP_BuildInfoAptx(AVDT_MEDIA_TYPE_AUDIO, &peer_info_cie,
    950                               ota_codec_peer_capability_);
    951   CHECK(status == A2DP_SUCCESS);
    952   return true;
    953 
    954 fail:
    955   // Restore the internal state
    956   codec_selectable_capability_ = saved_codec_selectable_capability;
    957   memcpy(ota_codec_peer_capability_, saved_ota_codec_peer_capability,
    958          sizeof(ota_codec_peer_capability_));
    959   return false;
    960 }
    961