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

Commit 7569b1e5 authored by Alice Kuo's avatar Alice Kuo
Browse files

Add broadcast offload audio config update to hal

1. Control the broadcast offload audio config in codec_manager
2. Gather the stream handle from BIG event
3. Bring the braodcast offload audio config as broadcast offload
   session start

Bug: 210987580
Test: verify broadcast offload stream with broadcast sink
Change-Id: I4b1210a68aedcc14b0df6094ec446b5d2652931f
Merged-In: I4b1210a68aedcc14b0df6094ec446b5d2652931f
(cherry picked from commit 954fe539)
parent fff0707f
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -168,6 +168,31 @@ void LeAudioTransport::LeAudioSetSelectedHalPcmConfig(uint32_t sample_rate_hz,
  pcm_config_.dataIntervalUs = data_interval;
}

void LeAudioTransport::LeAudioSetBroadcastConfig(
    const ::le_audio::broadcast_offload_config& offload_config) {
  broadcast_config_.streamMap.resize(0);
  for (auto& [handle, location] : offload_config.stream_map) {
    Lc3Configuration lc3_config{
        .pcmBitDepth = static_cast<int8_t>(offload_config.bits_per_sample),
        .samplingFrequencyHz =
            static_cast<int32_t>(offload_config.sampling_rate),
        .frameDurationUs = static_cast<int32_t>(offload_config.frame_duration),
        .octetsPerFrame = static_cast<int32_t>(offload_config.octets_per_frame),
        .blocksPerSdu = static_cast<int8_t>(offload_config.blocks_per_sdu),
    };
    broadcast_config_.streamMap.push_back({
        .streamHandle = handle,
        .audioChannelAllocation = static_cast<int32_t>(location),
        .leAudioCodecConfig = std::move(lc3_config),
    });
  }
}

const LeAudioBroadcastConfiguration&
LeAudioTransport::LeAudioGetBroadcastConfig() {
  return broadcast_config_;
}

bool LeAudioTransport::IsPendingStartStream(void) {
  return is_pending_start_request_;
}
@@ -259,6 +284,16 @@ void LeAudioSinkTransport::LeAudioSetSelectedHalPcmConfig(
                                             channels_count, data_interval);
}

void LeAudioSinkTransport::LeAudioSetBroadcastConfig(
    const ::le_audio::broadcast_offload_config& offload_config) {
  transport_->LeAudioSetBroadcastConfig(offload_config);
}

const LeAudioBroadcastConfiguration&
LeAudioSinkTransport::LeAudioGetBroadcastConfig() {
  return transport_->LeAudioGetBroadcastConfig();
}

bool LeAudioSinkTransport::IsPendingStartStream(void) {
  return transport_->IsPendingStartStream();
}
+11 −0
Original line number Diff line number Diff line
@@ -96,6 +96,11 @@ class LeAudioTransport {
                                      uint8_t channels_count,
                                      uint32_t data_interval);

  void LeAudioSetBroadcastConfig(
      const ::le_audio::broadcast_offload_config& offload_config);

  const LeAudioBroadcastConfiguration& LeAudioGetBroadcastConfig();

  bool IsPendingStartStream(void);
  void ClearPendingStartStream(void);

@@ -106,6 +111,7 @@ class LeAudioTransport {
  uint64_t total_bytes_processed_;
  timespec data_position_;
  PcmConfiguration pcm_config_;
  LeAudioBroadcastConfiguration broadcast_config_;
  bool is_pending_start_request_;
};

@@ -143,6 +149,11 @@ class LeAudioSinkTransport
                                      uint8_t channels_count,
                                      uint32_t data_interval);

  void LeAudioSetBroadcastConfig(
      const ::le_audio::broadcast_offload_config& offload_config);

  const LeAudioBroadcastConfiguration& LeAudioGetBroadcastConfig();

  bool IsPendingStartStream(void);
  void ClearPendingStartStream(void);

+19 −7
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ using AudioConfiguration_2_1 =
    ::android::hardware::bluetooth::audio::V2_1::AudioConfiguration;
using AudioConfigurationAIDL =
    ::aidl::android::hardware::bluetooth::audio::AudioConfiguration;
using ::aidl::android::hardware::bluetooth::audio::LeAudioCodecConfiguration;

using ::le_audio::CodecManager;
using ::le_audio::set_configurations::AudioSetConfiguration;
@@ -170,9 +171,9 @@ void LeAudioClientInterface::Sink::StartSession() {
    AudioConfigurationAIDL audio_config;
    if (is_aidl_offload_encoding_session(is_broadcaster_)) {
      if (is_broadcaster_) {
        aidl::le_audio::LeAudioBroadcastConfiguration le_audio_config = {};
        audio_config.set<AudioConfigurationAIDL::leAudioBroadcastConfig>(
            le_audio_config);
            get_aidl_transport_instance(is_broadcaster_)
                ->LeAudioGetBroadcastConfig());
      } else {
        aidl::le_audio::LeAudioConfiguration le_audio_config = {};
        audio_config.set<AudioConfigurationAIDL::leAudioConfig>(
@@ -257,12 +258,8 @@ void LeAudioClientInterface::Sink::UpdateAudioConfigToHal(
      BluetoothAudioHalTransport::HIDL) {
    return;
  }
  if (!is_aidl_offload_encoding_session(is_broadcaster_)) {
    return;
  }

  if (is_broadcaster_) {
    LOG(WARNING) << __func__ << ", broadcasting not supported";
  if (is_broadcaster_ || !is_aidl_offload_encoding_session(is_broadcaster_)) {
    return;
  }

@@ -271,6 +268,21 @@ void LeAudioClientInterface::Sink::UpdateAudioConfigToHal(
          aidl::le_audio::offload_config_to_hal_audio_config(offload_config));
}

void LeAudioClientInterface::Sink::UpdateBroadcastAudioConfigToHal(
    const ::le_audio::broadcast_offload_config& offload_config) {
  if (HalVersionManager::GetHalTransport() ==
      BluetoothAudioHalTransport::HIDL) {
    return;
  }

  if (!is_broadcaster_ || !is_aidl_offload_encoding_session(is_broadcaster_)) {
    return;
  }

  get_aidl_transport_instance(is_broadcaster_)
      ->LeAudioSetBroadcastConfig(offload_config);
}

void LeAudioClientInterface::Sink::SuspendedForReconfiguration() {
  if (HalVersionManager::GetHalTransport() ==
      BluetoothAudioHalTransport::HIDL) {
+2 −0
Original line number Diff line number Diff line
@@ -92,6 +92,8 @@ class LeAudioClientInterface {
    void CancelStreamingRequest() override;
    void UpdateAudioConfigToHal(
        const ::le_audio::offload_config& config) override;
    void UpdateBroadcastAudioConfigToHal(
        const ::le_audio::broadcast_offload_config& config);
    void SuspendedForReconfiguration() override;
    // Read the stream of bytes sinked to us by the upper layers
    size_t Read(uint8_t* p_buf, uint32_t len);
+6 −0
Original line number Diff line number Diff line
@@ -17,6 +17,7 @@

#include "audio_hal_interface/hal_version_manager.h"
#include "audio_hal_interface/le_audio_software.h"
#include "bta/le_audio/codec_manager.h"

namespace bluetooth {
namespace audio {
@@ -44,6 +45,11 @@ LeAudioClientInterface::Sink* LeAudioClientInterface::GetSink(
  return nullptr;
}

void LeAudioClientInterface::Sink::UpdateBroadcastAudioConfigToHal(
    ::le_audio::broadcast_offload_config const& config) {
  return;
}

size_t LeAudioClientInterface::Sink::Read(uint8_t* p_buf, uint32_t len) {
  return 0;
}
Loading