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

Commit c67dc445 authored by Himanshu Rawat's avatar Himanshu Rawat Committed by Gerrit Code Review
Browse files

Merge "Update source metadata when latency mode is changed" into main

parents 356980b7 b380003f
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