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

Commit 57d4c9dd authored by Jack He's avatar Jack He Committed by Automerger Merge Worker
Browse files

Merge "le_audio: Add support for Broadcaster session for Bluetoot stack" into tm-dev am: 7f1e2a1a

parents fb0f32c7 7f1e2a1a
Loading
Loading
Loading
Loading
+7 −0
Original line number Original line Diff line number Diff line
@@ -182,6 +182,13 @@ bool BluetoothAudioPortAidl::init_session_type(audio_devices_t device) {
                   << StringPrintf("%#x", device) << ")";
                   << StringPrintf("%#x", device) << ")";
      session_type_ = SessionType::LE_AUDIO_SOFTWARE_DECODING_DATAPATH;
      session_type_ = SessionType::LE_AUDIO_SOFTWARE_DECODING_DATAPATH;
      break;
      break;
    case AUDIO_DEVICE_OUT_BLE_BROADCAST:
      LOG(VERBOSE) << __func__
                   << ": device=AUDIO_DEVICE_OUT_BLE_BROADCAST (MEDIA) ("
                   << StringPrintf("%#x", device) << ")";
      session_type_ =
          SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH;
      break;
    default:
    default:
      LOG(ERROR) << __func__
      LOG(ERROR) << __func__
                 << ": unknown device=" << StringPrintf("%#x", device);
                 << ": unknown device=" << StringPrintf("%#x", device);
+6 −2
Original line number Original line Diff line number Diff line
@@ -190,7 +190,9 @@ bool BluetoothAudioClientInterface::UpdateAudioConfig(
       transport_->GetSessionType() ==
       transport_->GetSessionType() ==
           SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH ||
           SessionType::LE_AUDIO_SOFTWARE_ENCODING_DATAPATH ||
       transport_->GetSessionType() ==
       transport_->GetSessionType() ==
           SessionType::LE_AUDIO_SOFTWARE_DECODING_DATAPATH);
           SessionType::LE_AUDIO_SOFTWARE_DECODING_DATAPATH ||
       transport_->GetSessionType() ==
           SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH);
  bool is_a2dp_offload_session =
  bool is_a2dp_offload_session =
      (transport_->GetSessionType() ==
      (transport_->GetSessionType() ==
       SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH);
       SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH);
@@ -198,7 +200,9 @@ bool BluetoothAudioClientInterface::UpdateAudioConfig(
      (transport_->GetSessionType() ==
      (transport_->GetSessionType() ==
           SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
           SessionType::LE_AUDIO_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
       transport_->GetSessionType() ==
       transport_->GetSessionType() ==
           SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH);
           SessionType::LE_AUDIO_HARDWARE_OFFLOAD_DECODING_DATAPATH ||
       transport_->GetSessionType() ==
           SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH);
  auto audio_config_tag = audio_config.getTag();
  auto audio_config_tag = audio_config.getTag();
  bool is_software_audio_config =
  bool is_software_audio_config =
      (is_software_session &&
      (is_software_session &&
+24 −13
Original line number Original line Diff line number Diff line
@@ -54,14 +54,6 @@ static ChannelMode le_audio_channel_mode2audio_hal(uint8_t channels_count) {
  return ChannelMode::UNKNOWN;
  return ChannelMode::UNKNOWN;
}
}


bool is_source_hal_enabled() {
  return LeAudioSourceTransport::interface != nullptr;
}

bool is_sink_hal_enabled() {
  return LeAudioSinkTransport::interface != nullptr;
}

LeAudioTransport::LeAudioTransport(void (*flush)(void),
LeAudioTransport::LeAudioTransport(void (*flush)(void),
                                   StreamCallbacks stream_cb,
                                   StreamCallbacks stream_cb,
                                   PcmConfiguration pcm_config)
                                   PcmConfiguration pcm_config)
@@ -183,17 +175,36 @@ void LeAudioTransport::ClearPendingStartStream(void) {
  is_pending_start_request_ = false;
  is_pending_start_request_ = false;
}
}


void flush_sink() {
inline void flush_unicast_sink() {
  if (!is_sink_hal_enabled()) return;
  if (LeAudioSinkTransport::interface_unicast_ == nullptr) return;

  LeAudioSinkTransport::interface_unicast_->FlushAudioData();
}

inline void flush_broadcast_sink() {
  if (LeAudioSinkTransport::interface_broadcast_ == nullptr) return;


  LeAudioSinkTransport::interface->FlushAudioData();
  LeAudioSinkTransport::interface_broadcast_->FlushAudioData();
}

inline bool is_broadcaster_session(SessionType session_type) {
  if (session_type ==
          SessionType::LE_AUDIO_BROADCAST_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
      session_type ==
          SessionType::LE_AUDIO_BROADCAST_SOFTWARE_ENCODING_DATAPATH) {
    return true;
  }

  return false;
}
}


LeAudioSinkTransport::LeAudioSinkTransport(SessionType session_type,
LeAudioSinkTransport::LeAudioSinkTransport(SessionType session_type,
                                           StreamCallbacks stream_cb)
                                           StreamCallbacks stream_cb)
    : IBluetoothSinkTransportInstance(session_type, (AudioConfiguration){}) {
    : IBluetoothSinkTransportInstance(session_type, (AudioConfiguration){}) {
  transport_ = new LeAudioTransport(flush_sink, std::move(stream_cb),
  transport_ = new LeAudioTransport(
                                    {16000, ChannelMode::STEREO, 16, 0});
      is_broadcaster_session(session_type) ? flush_broadcast_sink
                                           : flush_unicast_sink,
      std::move(stream_cb), {16000, ChannelMode::STEREO, 16, 0});
};
};


LeAudioSinkTransport::~LeAudioSinkTransport() { delete transport_; }
LeAudioSinkTransport::~LeAudioSinkTransport() { delete transport_; }
+8 −2
Original line number Original line Diff line number Diff line
@@ -26,6 +26,8 @@ namespace audio {
namespace aidl {
namespace aidl {
namespace le_audio {
namespace le_audio {


using ::aidl::android::hardware::bluetooth::audio::
    LeAudioBroadcastConfiguration;
using ::aidl::android::hardware::bluetooth::audio::LeAudioConfiguration;
using ::aidl::android::hardware::bluetooth::audio::LeAudioConfiguration;
using ::aidl::android::hardware::bluetooth::audio::PcmConfiguration;
using ::aidl::android::hardware::bluetooth::audio::PcmConfiguration;
using ::aidl::android::hardware::bluetooth::audio::SessionType;
using ::aidl::android::hardware::bluetooth::audio::SessionType;
@@ -144,8 +146,12 @@ class LeAudioSinkTransport
  bool IsPendingStartStream(void);
  bool IsPendingStartStream(void);
  void ClearPendingStartStream(void);
  void ClearPendingStartStream(void);


  static inline LeAudioSinkTransport* instance = nullptr;
  static inline LeAudioSinkTransport* instance_unicast_ = nullptr;
  static inline BluetoothAudioSinkClientInterface* interface = nullptr;
  static inline LeAudioSinkTransport* instance_broadcast_ = nullptr;

  static inline BluetoothAudioSinkClientInterface* interface_unicast_ = nullptr;
  static inline BluetoothAudioSinkClientInterface* interface_broadcast_ =
      nullptr;


 private:
 private:
  LeAudioTransport* transport_;
  LeAudioTransport* transport_;
+2 −2
Original line number Original line Diff line number Diff line
@@ -80,9 +80,9 @@ extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
    interface->ReleaseSource(source);
    interface->ReleaseSource(source);
  }
  }


  if (!interface->IsSinkAcquired()) {
  if (!interface->IsUnicastSinkAcquired()) {
    LeAudioClientInterface::Sink* sink =
    LeAudioClientInterface::Sink* sink =
        interface->GetSink(streamCb, &messageLoopThread);
        interface->GetSink(streamCb, &messageLoopThread, false);
    if (sink != nullptr) {
    if (sink != nullptr) {
      sink->StartSession();
      sink->StartSession();
      uint16_t delay = fdp.ConsumeIntegral<uint16_t>();
      uint16_t delay = fdp.ConsumeIntegral<uint16_t>();
Loading