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

Commit b380003f authored by Himanshu Rawat's avatar Himanshu Rawat
Browse files

Update source metadata when latency mode is changed

Keep a cache of source metadata. Use this cache to update source
metadata when latency mode is changed.

Test: mmm packages/modules/Bluetooth
Test: Manual | LE audio streaming with device supporting DSA
Bug: 324953838
Bug: 309665975
Change-Id: If0e5ddb90b09269a8977498b5275a05454fa0fe5
parent e6fe5161
Loading
Loading
Loading
Loading
+38 −2
Original line number Diff line number Diff line
@@ -67,7 +67,15 @@ LeAudioTransport::LeAudioTransport(void (*flush)(void),
      data_position_({}),
      pcm_config_(std::move(pcm_config)),
      start_request_state_(StartRequestState::IDLE),
      dsa_mode_(DsaMode::DISABLED){};
      dsa_mode_(DsaMode::DISABLED),
      cached_source_metadata_({}){};

LeAudioTransport::~LeAudioTransport() {
  if (cached_source_metadata_.tracks != nullptr) {
    free(cached_source_metadata_.tracks);
    cached_source_metadata_.tracks = nullptr;
  }
}

BluetoothAudioCtrlAck LeAudioTransport::StartRequest(bool is_low_latency) {
  // Check if operation is pending already
@@ -166,6 +174,9 @@ void LeAudioTransport::SetLatencyMode(LatencyMode latency_mode) {
  LOG_DEBUG("Latency mode: %s",
            ::aidl::android::hardware::bluetooth::audio::toString(latency_mode)
                .c_str());

  DsaMode prev_dsa_mode = dsa_mode_;

  switch (latency_mode) {
    case LatencyMode::FREE:
      dsa_mode_ = DsaMode::DISABLED;
@@ -181,7 +192,16 @@ void LeAudioTransport::SetLatencyMode(LatencyMode latency_mode) {
      break;
    default:
      LOG(WARNING) << ", invalid latency mode: " << (int)latency_mode;
      break;
      return;
  }

  if (IS_FLAG_ENABLED(leaudio_dynamic_spatial_audio)) {
    if (dsa_mode_ != prev_dsa_mode &&
        cached_source_metadata_.tracks != nullptr &&
        cached_source_metadata_.tracks != 0) {
      LOG(INFO) << ", latency mode changed, update source metadata";
      stream_cb_.on_metadata_update_(cached_source_metadata_, dsa_mode_);
    }
  }
}

@@ -211,6 +231,22 @@ void LeAudioTransport::SourceMetadataChanged(
    return;
  }

  if (IS_FLAG_ENABLED(leaudio_dynamic_spatial_audio)) {
    if (cached_source_metadata_.tracks != nullptr) {
      free(cached_source_metadata_.tracks);
      cached_source_metadata_.tracks = nullptr;
    }

    LOG(INFO) << ", caching source metadata";

    playback_track_metadata_v7* tracks;
    tracks = (playback_track_metadata_v7*)malloc(sizeof(*tracks) * track_count);
    memcpy(tracks, source_metadata.tracks, sizeof(*tracks) * track_count);

    cached_source_metadata_.track_count = track_count;
    cached_source_metadata_.tracks = tracks;
  }

  stream_cb_.on_metadata_update_(source_metadata, dsa_mode_);
}

+2 −0
Original line number Diff line number Diff line
@@ -69,6 +69,7 @@ class LeAudioTransport {
 public:
  LeAudioTransport(void (*flush)(void), StreamCallbacks stream_cb,
                   PcmConfiguration pcm_config);
  ~LeAudioTransport();

  BluetoothAudioCtrlAck StartRequest(bool is_low_latency);
  BluetoothAudioCtrlAck StartRequestV2(bool is_low_latency);
@@ -122,6 +123,7 @@ class LeAudioTransport {
  mutable std::mutex start_request_state_mutex_;
  std::atomic<StartRequestState> start_request_state_;
  DsaMode dsa_mode_;
  source_metadata_v7_t cached_source_metadata_;
};

// Sink transport implementation for Le Audio