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

Commit 82f0417e authored by Grzegorz Kołodziejczyk's avatar Grzegorz Kołodziejczyk Committed by Łukasz Rymanowski
Browse files

le_audio: Handle multiple audio server tracks

Initial patch for handling multiple server tracks.
In this patch, if there is any track with voice communication purpose,
we add priority on it.

Bug: 150670922
Tag: #feature
Sponsor: jpawlowski@
Test: atest --host bluetooth_le_audio_test bluetooth_le_audio_client_test

Change-Id: I0ee8353b3ae304d5151ed4d2d860ca5f924b8ae7
parent ad741014
Loading
Loading
Loading
Loading
+1 −21
Original line number Diff line number Diff line
@@ -116,33 +116,13 @@ class LeAudioTransport {

  void MetadataChanged(const source_metadata_t& source_metadata) {
    auto track_count = source_metadata.track_count;
    auto tracks = source_metadata.tracks;
    LOG(INFO) << __func__ << ": " << track_count << " track(s) received";

    if (track_count == 0) {
      LOG(WARNING) << ", invalid number of metadata changed tracks";
      return;
    }

    audio_usage_t usage = tracks->usage;
    audio_content_type_t content_type = tracks->content_type;

    /* TODO what stack should do with more than one track ? */
    if (track_count > 1) {
      LOG(WARNING) << __func__ << ", can't handle multiple tracks metadata, "
                   << "count: " << track_count << " track(s) received";
      return;
    }

    while (track_count) {
      VLOG(1) << __func__ << ": usage=" << tracks->usage
              << ", content_type=" << tracks->content_type
              << ", gain=" << tracks->gain;
      --track_count;
      ++tracks;
    }

    stream_cb_.on_metadata_update_(usage, content_type);
    stream_cb_.on_metadata_update_(source_metadata);
  }

  void ResetPresentationPosition() {
+1 −1
Original line number Diff line number Diff line
@@ -43,7 +43,7 @@ constexpr uint8_t kBitsPerSample32 = 32;
struct StreamCallbacks {
  std::function<bool(bool start_media_task)> on_resume_;
  std::function<bool(void)> on_suspend_;
  std::function<bool(audio_usage_t, audio_content_type_t)> on_metadata_update_;
  std::function<bool(const source_metadata_t&)> on_metadata_update_;
};

class LeAudioClientInterface {
+58 −36
Original line number Diff line number Diff line
@@ -2308,14 +2308,35 @@ class LeAudioClientImpl : public LeAudioClient {
    }
  }

  void OnAudioMetadataUpdate(audio_usage_t usage,
                             audio_content_type_t content_type) {
  void OnAudioMetadataUpdate(const source_metadata_t& source_metadata) {
    auto tracks = source_metadata.tracks;
    auto track_count = source_metadata.track_count;

    audio_usage_t usage = tracks->usage;
    audio_content_type_t content_type = tracks->content_type;

    LeAudioContextType new_context = LeAudioContextType::RFU;

    while (track_count) {
      DLOG(INFO) << __func__ << ": usage=" << tracks->usage
                 << ", content_type=" << tracks->content_type
                 << ", gain=" << tracks->gain;

      if (tracks->content_type == AUDIO_CONTENT_TYPE_SPEECH ||
          tracks->usage == AUDIO_USAGE_VOICE_COMMUNICATION) {
        new_context = LeAudioContextType::CONVERSATIONAL;
        break;
      }

      --track_count;
      ++tracks;
    }

    LOG(INFO) << __func__ << ", content_type = "
              << audio_content_type_to_string(content_type)
              << ", usage = " << audio_usage_to_string(usage);

    LeAudioContextType new_context = LeAudioContextType::RFU;

    if (new_context == LeAudioContextType::RFU) {
      switch (content_type) {
        case AUDIO_CONTENT_TYPE_SPEECH:
          new_context = LeAudioContextType::CONVERSATIONAL;
@@ -2355,6 +2376,7 @@ class LeAudioClientImpl : public LeAudioClient {
            break;
        }
      }
    }

    auto group = aseGroups_.FindById(active_group_id_);
    if (!group) {
@@ -2711,10 +2733,10 @@ class LeAudioClientAudioSinkReceiverImpl
    do_resume_promise.set_value();
  }

  void OnAudioMetadataUpdate(std::promise<void> do_metadata_update_promise,
                             audio_usage_t usage,
                             audio_content_type_t content_type) override {
    if (instance) instance->OnAudioMetadataUpdate(usage, content_type);
  void OnAudioMetadataUpdate(
      std::promise<void> do_metadata_update_promise,
      const source_metadata_t& source_metadata) override {
    if (instance) instance->OnAudioMetadataUpdate(source_metadata);
    do_metadata_update_promise.set_value();
  }
};
+3 −4
Original line number Diff line number Diff line
@@ -212,8 +212,8 @@ bool le_audio_source_on_suspend_req() {
  return false;
}

bool le_audio_sink_on_metadata_update_req(audio_usage_t usage,
                                          audio_content_type_t content_type) {
bool le_audio_sink_on_metadata_update_req(
    const source_metadata_t& source_metadata) {
  if (localAudioSinkReceiver == nullptr) {
    LOG(ERROR) << __func__ << ", audio receiver not started";
    return false;
@@ -227,8 +227,7 @@ bool le_audio_sink_on_metadata_update_req(audio_usage_t usage,
      FROM_HERE,
      base::BindOnce(&LeAudioClientAudioSinkReceiver::OnAudioMetadataUpdate,
                     base::Unretained(localAudioSinkReceiver),
                     std::move(do_update_metadata_promise), usage,
                     content_type));
                     std::move(do_update_metadata_promise), source_metadata));

  if (status == BT_STATUS_SUCCESS) {
    do_update_metadata_future.wait();
+2 −2
Original line number Diff line number Diff line
@@ -28,8 +28,8 @@ class LeAudioClientAudioSinkReceiver {
  virtual void OnAudioSuspend(std::promise<void> do_suspend_promise) = 0;
  virtual void OnAudioResume(std::promise<void> do_resume_promise) = 0;
  virtual void OnAudioMetadataUpdate(
      std::promise<void> do_update_metadata_promise, audio_usage_t usage,
      audio_content_type_t content_type) = 0;
      std::promise<void> do_update_metadata_promise,
      const source_metadata_t& source_metadata) = 0;
};
class LeAudioClientAudioSourceReceiver {
 public:
Loading