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

Commit 3740ee39 authored by Pavlin Radoslavov's avatar Pavlin Radoslavov
Browse files

Use the effective peer MTU when preparing the codec configuration

Added new method A2dpCodecConfig::getEffectiveMtu() and use it
to obtain the effective MTU per peer per codec.
The effective peer MTU could be smaller than the one reported
by the peer (e.g., for interoperability reasons).

Bug: 77913350
Test: Manual
Change-Id: Idd5230681ac5856fd18dd33ac48723c6ea609e16
parent f56395dd
Loading
Loading
Loading
Loading
+18 −8
Original line number Diff line number Diff line
@@ -114,13 +114,10 @@ static void btif_a2dp_get_codec_configuration(
    CodecConfiguration* p_codec_info) {
  LOG_INFO(LOG_TAG, "%s", __func__);
  tBT_A2DP_OFFLOAD a2dp_offload;
  tA2DP_ENCODER_INIT_PEER_PARAMS peer_param;
  A2dpCodecConfig* CodecConfig = bta_av_get_a2dp_current_codec();
  CodecConfig->getCodecSpecificConfig(&a2dp_offload);
  A2dpCodecConfig* a2dpCodecConfig = bta_av_get_a2dp_current_codec();
  a2dpCodecConfig->getCodecSpecificConfig(&a2dp_offload);
  btav_a2dp_codec_config_t codec_config;
  codec_config = CodecConfig->getCodecConfig();
  RawAddress peer_addr = btif_av_source_active_peer();
  bta_av_co_get_peer_params(peer_addr, &peer_param);
  codec_config = a2dpCodecConfig->getCodecConfig();
  switch (codec_config.codec_type) {
    case BTAV_A2DP_CODEC_INDEX_SOURCE_SBC:
      p_codec_info->codecType =
@@ -161,7 +158,20 @@ static void btif_a2dp_get_codec_configuration(
      APPL_TRACE_ERROR("%s: Unknown Codec type :%d ", __func__,
                       codec_config.codec_type);
  }

  // Obtain the MTU
  RawAddress peer_addr = btif_av_source_active_peer();
  tA2DP_ENCODER_INIT_PEER_PARAMS peer_param;
  bta_av_co_get_peer_params(peer_addr, &peer_param);
  int effectiveMtu = a2dpCodecConfig->getEffectiveMtu();
  if (effectiveMtu > 0 && effectiveMtu < peer_param.peer_mtu) {
    p_codec_info->peerMtu = effectiveMtu;
  } else {
    p_codec_info->peerMtu = peer_param.peer_mtu;
  }
  LOG_INFO(LOG_TAG, "%s: peer MTU: %d effective MTU: %d result MTU: %d",
           __func__, peer_param.peer_mtu, effectiveMtu, p_codec_info->peerMtu);

  p_codec_info->sampleRate =
      (::android::hardware::bluetooth::a2dp::V1_0::SampleRate)
          codec_config.sample_rate;
@@ -171,7 +181,7 @@ static void btif_a2dp_get_codec_configuration(
  p_codec_info->channelMode =
      (::android::hardware::bluetooth::a2dp::V1_0::ChannelMode)
          codec_config.channel_mode;
  p_codec_info->encodedAudioBitrate = CodecConfig->getTrackBitRate();
  p_codec_info->encodedAudioBitrate = a2dpCodecConfig->getTrackBitRate();
}

static void btif_a2dp_audio_interface_init() {
+5 −0
Original line number Diff line number Diff line
@@ -1420,6 +1420,11 @@ period_ms_t A2dpCodecConfigAacSink::encoderIntervalMs() const {
  return 0;
}

int A2dpCodecConfigAacSink::getEffectiveMtu() const {
  // TODO: This method applies only to Source codecs
  return 0;
}

bool A2dpCodecConfigAacSink::useRtpHeaderMarkerBit() const {
  // TODO: This method applies only to Source codecs
  return false;
+4 −0
Original line number Diff line number Diff line
@@ -698,6 +698,10 @@ period_ms_t A2dpCodecConfigAacSource::encoderIntervalMs() const {
  return a2dp_aac_get_encoder_interval_ms();
}

int A2dpCodecConfigAacSource::getEffectiveMtu() const {
  return a2dp_aac_encoder_cb.TxAaMtuSize;
}

void A2dpCodecConfigAacSource::debug_codec_dump(int fd) {
  a2dp_aac_encoder_stats_t* stats = &a2dp_aac_encoder_cb.stats;

+2 −1
Original line number Diff line number Diff line
@@ -145,7 +145,7 @@ A2dpCodecConfig* A2dpCodecConfig::createCodec(
  return codec_config;
}

int A2dpCodecConfig::getTrackBitRate() {
int A2dpCodecConfig::getTrackBitRate() const {
  uint8_t p_codec_info[AVDT_CODEC_SIZE];
  memcpy(p_codec_info, ota_codec_config_, sizeof(ota_codec_config_));
  tA2DP_CODEC_TYPE codec_type = A2DP_GetCodecType(p_codec_info);
@@ -499,6 +499,7 @@ void A2dpCodecConfig::debug_codec_dump(int fd) {
  dprintf(fd, "\nA2DP %s State:\n", name().c_str());
  dprintf(fd, "  Priority: %d\n", codecPriority());
  dprintf(fd, "  Encoder interval (ms): %" PRIu64 "\n", encoderIntervalMs());
  dprintf(fd, "  Effective MTU: %d\n", getEffectiveMtu());

  result = codecConfig2Str(getCodecConfig());
  dprintf(fd, "  Config: %s\n", result.c_str());
+5 −0
Original line number Diff line number Diff line
@@ -1559,3 +1559,8 @@ period_ms_t A2dpCodecConfigSbcSink::encoderIntervalMs() const {
  // TODO: This method applies only to Source codecs
  return 0;
}

int A2dpCodecConfigSbcSink::getEffectiveMtu() const {
  // TODO: This method applies only to Source codecs
  return 0;
}
Loading