Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ab408fbe authored by Yuyang Huang's avatar Yuyang Huang
Browse files

fix mix-use of tBTA_AG_PEER_CODEC between BTM_SCO_CODEC_XXX and UUID_CODEC_XXX

Previously, tBTA_AG_PEER_CODEC is a uint type that used for both BTM_SCO_CODEC_XXX (in bit mask format) and UUID_CODEC_XXX (in index format).
Because 1 and 2 in bitmask and indexed value are the same, there are mixed use between BTM_SCO_CODEC and UUID_CODEC
Now separate the UUID_CODEC_XXX index format out to a different type to avoid mis-use.

Bug: 323409386
Bug: 315234036
Flag: Exempt, no value change
Test: atest bta_net_test
Change-Id: Ia73d4bcaf891ecd03496269e3c9793ed33c09892
parent fe41274b
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -64,8 +64,8 @@ tBTA_AG_SCB* get_hfp_active_device_callback() {
  return cb;
}

std::unordered_map<int, ::hfp::sco_config> HfpTransport::GetHfpScoConfig(
    SessionType sessionType) {
std::unordered_map<tBTA_AG_UUID_CODEC, ::hfp::sco_config>
HfpTransport::GetHfpScoConfig(SessionType sessionType) {
  auto providerInfo =
      ::bluetooth::audio::aidl::ProviderInfo::GetProviderInfo(sessionType);
  return providerInfo->GetHfpScoConfig();
+2 −2
Original line number Diff line number Diff line
@@ -72,8 +72,8 @@ class HfpTransport {

  void LogBytesProcessed(size_t bytes_read);

  static std::unordered_map<int, ::hfp::sco_config> GetHfpScoConfig(
      SessionType sessionType);
  static std::unordered_map<tBTA_AG_UUID_CODEC, ::hfp::sco_config>
  GetHfpScoConfig(SessionType sessionType);

 private:
  tHFP_CTRL_CMD hfp_pending_cmd_;
+7 −4
Original line number Diff line number Diff line
@@ -58,20 +58,23 @@ ProviderInfo::ProviderInfo(SessionType sessionType,
    : codecInfos(std::move(codecs)) {
  for (auto codecInfo : codecInfos) {
    if (codecInfo.id == CodecId::Core::CVSD) {
      hfpScoConfigMap[UUID_CODEC_CVSD] = recordHfpCodecInfo(codecInfo);
      hfpScoConfigMap[tBTA_AG_UUID_CODEC::UUID_CODEC_CVSD] =
          recordHfpCodecInfo(codecInfo);
    } else if (codecInfo.id == CodecId::Core::MSBC) {
      hfpScoConfigMap[UUID_CODEC_MSBC] = recordHfpCodecInfo(codecInfo);
      hfpScoConfigMap[tBTA_AG_UUID_CODEC::UUID_CODEC_MSBC] =
          recordHfpCodecInfo(codecInfo);
    } else if (codecInfo.id == CodecId::Core::LC3) {
      if (sessionType == SessionType::HFP_HARDWARE_OFFLOAD_DATAPATH ||
          sessionType == SessionType::HFP_SOFTWARE_ENCODING_DATAPATH ||
          sessionType == SessionType::HFP_SOFTWARE_DECODING_DATAPATH) {
        hfpScoConfigMap[UUID_CODEC_LC3] = recordHfpCodecInfo(codecInfo);
        hfpScoConfigMap[tBTA_AG_UUID_CODEC::UUID_CODEC_LC3] =
            recordHfpCodecInfo(codecInfo);
      }
    }
  }
}

const std::unordered_map<int, ::hfp::sco_config>&
const std::unordered_map<tBTA_AG_UUID_CODEC, ::hfp::sco_config>&
ProviderInfo::GetHfpScoConfig() {
  return hfpScoConfigMap;
}
+4 −2
Original line number Diff line number Diff line
@@ -36,11 +36,13 @@ class ProviderInfo {

  ~ProviderInfo() = default;

  const std::unordered_map<int, ::hfp::sco_config>& GetHfpScoConfig();
  const std::unordered_map<tBTA_AG_UUID_CODEC, ::hfp::sco_config>&
  GetHfpScoConfig();

 private:
  const std::vector<CodecInfo> codecInfos;
  std::unordered_map<int /* HFP CODEC in UUID_CODEC_XXX */, ::hfp::sco_config>
  std::unordered_map<tBTA_AG_UUID_CODEC /* HFP CODEC in UUID_CODEC_XXX */,
                     ::hfp::sco_config>
      hfpScoConfigMap;
};
}  // namespace bluetooth::audio::aidl
+15 −9
Original line number Diff line number Diff line
@@ -77,19 +77,25 @@ HfpConfiguration get_default_hfp_configuration() {
  return hfp_config;
}

CodecId get_codec_id_by_peer_codec(tBTA_AG_PEER_CODEC sco_codec) {
  if (sco_codec & BTM_SCO_CODEC_LC3) return CodecId::Core::LC3;
  if (sco_codec & BTM_SCO_CODEC_MSBC) return CodecId::Core::MSBC;
  if (sco_codec & BTM_SCO_CODEC_CVSD) return CodecId::Core::CVSD;
  // Unknown vendor codec otherwise
  CodecId codec_id = CodecId::Vendor();
  return codec_id;
CodecId sco_codec_to_hal_codec(tBTA_AG_UUID_CODEC sco_codec) {
  switch (sco_codec) {
    case tBTA_AG_UUID_CODEC::UUID_CODEC_LC3:
      return CodecId::Core::LC3;
    case tBTA_AG_UUID_CODEC::UUID_CODEC_MSBC:
      return CodecId::Core::MSBC;
    case tBTA_AG_UUID_CODEC::UUID_CODEC_CVSD:
      return CodecId::Core::CVSD;
    default:
      log::warn("Unknown sco_codec {}, defaulting to vendor codec",
                bta_ag_uuid_codec_text(sco_codec));
      return CodecId::Vendor();
  }
}

AudioConfiguration offload_config_to_hal_audio_config(
    const ::hfp::offload_config& offload_config) {
  HfpConfiguration hfp_config{
      .codecId = get_codec_id_by_peer_codec(offload_config.sco_codec),
      .codecId = sco_codec_to_hal_codec(offload_config.sco_codec),
      .connectionHandle = offload_config.connection_handle,
      .nrec = offload_config.is_nrec,
      .controllerCodec = offload_config.is_controller_codec,
@@ -504,7 +510,7 @@ void HfpClientInterface::Offload::CancelStreamingRequest() {
  }
}

std::unordered_map<int, ::hfp::sco_config>
std::unordered_map<tBTA_AG_UUID_CODEC, ::hfp::sco_config>
HfpClientInterface::Offload::GetHfpScoConfig() {
  return aidl::hfp::HfpTransport::GetHfpScoConfig(
      aidl::SessionType::HFP_HARDWARE_OFFLOAD_DATAPATH);
Loading