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

Commit 4bfa2e1e authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes from topic "bluetoothmodule" into main

* changes:
  bluetooth: Add AudioSession/Control methods for AIDL track metadata
  bluetooth: Fix dependency on android.hardware.audio.common
parents 169be347 d5f0d13e
Loading
Loading
Loading
Loading
+2 −2
Original line number Original line Diff line number Diff line
@@ -29,7 +29,7 @@ aidl_interface {
    imports: [
    imports: [
        "android.hardware.common-V2",
        "android.hardware.common-V2",
        "android.hardware.common.fmq-V1",
        "android.hardware.common.fmq-V1",
        "android.hardware.audio.common-V1",
        "android.hardware.audio.common-V2",
    ],
    ],
    backend: {
    backend: {
        cpp: {
        cpp: {
@@ -69,7 +69,7 @@ aidl_interface {
            imports: [
            imports: [
                "android.hardware.common-V2",
                "android.hardware.common-V2",
                "android.hardware.common.fmq-V1",
                "android.hardware.common.fmq-V1",
                "android.hardware.audio.common-V1",
                "android.hardware.audio.common-V2",
            ],
            ],
        },
        },


+1 −1
Original line number Original line Diff line number Diff line
@@ -16,7 +16,7 @@ cc_test {
    tidy_timeout_srcs: ["VtsHalBluetoothAudioTargetTest.cpp"],
    tidy_timeout_srcs: ["VtsHalBluetoothAudioTargetTest.cpp"],
    srcs: ["VtsHalBluetoothAudioTargetTest.cpp"],
    srcs: ["VtsHalBluetoothAudioTargetTest.cpp"],
    static_libs: [
    static_libs: [
        "android.hardware.audio.common-V1-ndk",
        "android.hardware.audio.common-V2-ndk",
        "android.hardware.bluetooth.audio-V3-ndk",
        "android.hardware.bluetooth.audio-V3-ndk",
        "android.hardware.common-V2-ndk",
        "android.hardware.common-V2-ndk",
        "android.hardware.common.fmq-V1-ndk",
        "android.hardware.common.fmq-V1-ndk",
+47 −34
Original line number Original line Diff line number Diff line
@@ -20,6 +20,7 @@
#include <android-base/logging.h>
#include <android-base/logging.h>
#include <android-base/stringprintf.h>
#include <android-base/stringprintf.h>
#include <android/binder_manager.h>
#include <android/binder_manager.h>
#include <hardware/audio.h>


#include "BluetoothAudioSession.h"
#include "BluetoothAudioSession.h"


@@ -538,23 +539,9 @@ bool BluetoothAudioSession::GetPresentationPosition(


void BluetoothAudioSession::UpdateSourceMetadata(
void BluetoothAudioSession::UpdateSourceMetadata(
    const struct source_metadata& source_metadata) {
    const struct source_metadata& source_metadata) {
  std::lock_guard<std::recursive_mutex> guard(mutex_);
  if (!IsSessionReady()) {
    LOG(DEBUG) << __func__ << " - SessionType=" << toString(session_type_)
               << " has NO session";
    return;
  }

  ssize_t track_count = source_metadata.track_count;
  ssize_t track_count = source_metadata.track_count;
  LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_) << ","
  LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_) << ","
            << track_count << " track(s)";
            << track_count << " track(s)";
  if (session_type_ == SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH ||
      session_type_ == SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
      session_type_ == SessionType::A2DP_SOFTWARE_DECODING_DATAPATH ||
      session_type_ == SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
    return;
  }

  SourceMetadata hal_source_metadata;
  SourceMetadata hal_source_metadata;
  hal_source_metadata.tracks.resize(track_count);
  hal_source_metadata.tracks.resize(track_count);
  for (int i = 0; i < track_count; i++) {
  for (int i = 0; i < track_count; i++) {
@@ -571,33 +558,14 @@ void BluetoothAudioSession::UpdateSourceMetadata(
                 << toString(hal_source_metadata.tracks[i].contentType)
                 << toString(hal_source_metadata.tracks[i].contentType)
                 << ", gain=" << hal_source_metadata.tracks[i].gain;
                 << ", gain=" << hal_source_metadata.tracks[i].gain;
  }
  }

  UpdateSourceMetadata(hal_source_metadata);
  auto hal_retval = stack_iface_->updateSourceMetadata(hal_source_metadata);
  if (!hal_retval.isOk()) {
    LOG(WARNING) << __func__ << " - IBluetoothAudioPort SessionType="
                 << toString(session_type_) << " failed";
  }
}
}


void BluetoothAudioSession::UpdateSinkMetadata(
void BluetoothAudioSession::UpdateSinkMetadata(
    const struct sink_metadata& sink_metadata) {
    const struct sink_metadata& sink_metadata) {
  std::lock_guard<std::recursive_mutex> guard(mutex_);
  if (!IsSessionReady()) {
    LOG(DEBUG) << __func__ << " - SessionType=" << toString(session_type_)
               << " has NO session";
    return;
  }

  ssize_t track_count = sink_metadata.track_count;
  ssize_t track_count = sink_metadata.track_count;
  LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_) << ","
  LOG(INFO) << __func__ << " - SessionType=" << toString(session_type_) << ","
            << track_count << " track(s)";
            << track_count << " track(s)";
  if (session_type_ == SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH ||
      session_type_ == SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
      session_type_ == SessionType::A2DP_SOFTWARE_DECODING_DATAPATH ||
      session_type_ == SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
    return;
  }

  SinkMetadata hal_sink_metadata;
  SinkMetadata hal_sink_metadata;
  hal_sink_metadata.tracks.resize(track_count);
  hal_sink_metadata.tracks.resize(track_count);
  for (int i = 0; i < track_count; i++) {
  for (int i = 0; i < track_count; i++) {
@@ -612,12 +580,57 @@ void BluetoothAudioSession::UpdateSinkMetadata(
              << ", dest_device_address="
              << ", dest_device_address="
              << sink_metadata.tracks[i].dest_device_address;
              << sink_metadata.tracks[i].dest_device_address;
  }
  }
  UpdateSinkMetadata(hal_sink_metadata);
}

bool BluetoothAudioSession::UpdateSourceMetadata(
    const SourceMetadata& hal_source_metadata) {
  std::lock_guard<std::recursive_mutex> guard(mutex_);
  if (!IsSessionReady()) {
    LOG(DEBUG) << __func__ << " - SessionType=" << toString(session_type_)
               << " has NO session";
    return false;
  }

  if (session_type_ == SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH ||
      session_type_ == SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
      session_type_ == SessionType::A2DP_SOFTWARE_DECODING_DATAPATH ||
      session_type_ == SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
    return false;
  }

  auto hal_retval = stack_iface_->updateSourceMetadata(hal_source_metadata);
  if (!hal_retval.isOk()) {
    LOG(WARNING) << __func__ << " - IBluetoothAudioPort SessionType="
                 << toString(session_type_) << " failed";
    return false;
  }
  return true;
}

bool BluetoothAudioSession::UpdateSinkMetadata(
    const SinkMetadata& hal_sink_metadata) {
  std::lock_guard<std::recursive_mutex> guard(mutex_);
  if (!IsSessionReady()) {
    LOG(DEBUG) << __func__ << " - SessionType=" << toString(session_type_)
               << " has NO session";
    return false;
  }

  if (session_type_ == SessionType::A2DP_SOFTWARE_ENCODING_DATAPATH ||
      session_type_ == SessionType::A2DP_HARDWARE_OFFLOAD_ENCODING_DATAPATH ||
      session_type_ == SessionType::A2DP_SOFTWARE_DECODING_DATAPATH ||
      session_type_ == SessionType::A2DP_HARDWARE_OFFLOAD_DECODING_DATAPATH) {
    return false;
  }


  auto hal_retval = stack_iface_->updateSinkMetadata(hal_sink_metadata);
  auto hal_retval = stack_iface_->updateSinkMetadata(hal_sink_metadata);
  if (!hal_retval.isOk()) {
  if (!hal_retval.isOk()) {
    LOG(WARNING) << __func__ << " - IBluetoothAudioPort SessionType="
    LOG(WARNING) << __func__ << " - IBluetoothAudioPort SessionType="
                 << toString(session_type_) << " failed";
                 << toString(session_type_) << " failed";
    return false;
  }
  }
  return true;
}
}


std::vector<LatencyMode> BluetoothAudioSession::GetSupportedLatencyModes() {
std::vector<LatencyMode> BluetoothAudioSession::GetSupportedLatencyModes() {
+7 −1
Original line number Original line Diff line number Diff line
@@ -23,12 +23,15 @@
#include <aidl/android/hardware/bluetooth/audio/LatencyMode.h>
#include <aidl/android/hardware/bluetooth/audio/LatencyMode.h>
#include <aidl/android/hardware/bluetooth/audio/SessionType.h>
#include <aidl/android/hardware/bluetooth/audio/SessionType.h>
#include <fmq/AidlMessageQueue.h>
#include <fmq/AidlMessageQueue.h>
#include <hardware/audio.h>


#include <mutex>
#include <mutex>
#include <unordered_map>
#include <unordered_map>
#include <vector>
#include <vector>


// To avoid inclusion of hardware/audio.h
struct sink_metadata;
struct source_metadata;

namespace aidl {
namespace aidl {
namespace android {
namespace android {
namespace hardware {
namespace hardware {
@@ -196,6 +199,9 @@ class BluetoothAudioSession {
  bool GetPresentationPosition(PresentationPosition& presentation_position);
  bool GetPresentationPosition(PresentationPosition& presentation_position);
  void UpdateSourceMetadata(const struct source_metadata& source_metadata);
  void UpdateSourceMetadata(const struct source_metadata& source_metadata);
  void UpdateSinkMetadata(const struct sink_metadata& sink_metadata);
  void UpdateSinkMetadata(const struct sink_metadata& sink_metadata);
  // New versions for AIDL-only clients.
  bool UpdateSourceMetadata(const SourceMetadata& hal_source_metadata);
  bool UpdateSinkMetadata(const SinkMetadata& hal_sink_metadata);


  std::vector<LatencyMode> GetSupportedLatencyModes();
  std::vector<LatencyMode> GetSupportedLatencyModes();
  void SetLatencyMode(const LatencyMode& latency_mode);
  void SetLatencyMode(const LatencyMode& latency_mode);
+20 −0
Original line number Original line Diff line number Diff line
@@ -175,6 +175,26 @@ class BluetoothAudioSessionControl {
    }
    }
  }
  }


  static bool UpdateSourceMetadata(const SessionType& session_type,
                                   const SourceMetadata& source_metadata) {
    std::shared_ptr<BluetoothAudioSession> session_ptr =
        BluetoothAudioSessionInstance::GetSessionInstance(session_type);
    if (session_ptr != nullptr) {
      return session_ptr->UpdateSourceMetadata(source_metadata);
    }
    return false;
  }

  static bool UpdateSinkMetadata(const SessionType& session_type,
                                 const SinkMetadata& sink_metadata) {
    std::shared_ptr<BluetoothAudioSession> session_ptr =
        BluetoothAudioSessionInstance::GetSessionInstance(session_type);
    if (session_ptr != nullptr) {
      return session_ptr->UpdateSinkMetadata(sink_metadata);
    }
    return false;
  }

  static std::vector<LatencyMode> GetSupportedLatencyModes(
  static std::vector<LatencyMode> GetSupportedLatencyModes(
      const SessionType& session_type) {
      const SessionType& session_type) {
    std::shared_ptr<BluetoothAudioSession> session_ptr =
    std::shared_ptr<BluetoothAudioSession> session_ptr =