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

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

Merge changes from topic "bt-le-audio-dsa" into main

* changes:
  Route headtracking data to non-audio consumer
  Set datapath for the headtracking data
parents 60b449fc d736f196
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -32,6 +32,9 @@ class LeAudioHalVerifier {
  static bool SupportsStreamActiveApi();
};

typedef bool(LeAudioIsoDataCallback)(const RawAddress& address,
                                     uint16_t cis_conn_hdl, uint8_t* data,
                                     uint16_t size, uint32_t timestamp);
/* Interface class */
class LeAudioClient {
 public:
@@ -75,6 +78,9 @@ class LeAudioClient {
  virtual bool isOutputPreferenceLeAudio(const RawAddress& address) = 0;
  virtual bool isDuplexPreferenceLeAudio(const RawAddress& address) = 0;
  virtual std::vector<RawAddress> GetGroupDevices(const int group_id) = 0;

  static bool RegisterIsoDataConsumer(LeAudioIsoDataCallback callback);

  static void AddFromStorage(const RawAddress& addr, bool autoconnect,
                             int sink_audio_location, int source_audio_location,
                             int sink_supported_context_types,
+50 −1
Original line number Diff line number Diff line
@@ -180,6 +180,7 @@ LeAudioSinkAudioHalClient::Callbacks* audioSourceReceiver;
CigCallbacks* stateMachineHciCallbacks;
LeAudioGroupStateMachine::Callbacks* stateMachineCallbacks;
DeviceGroupsCallbacks* device_group_callbacks;
LeAudioIsoDataCallback* iso_data_callback;

/*
 * Coordinatet Set Identification Profile (CSIP) based on CSIP 1.0
@@ -3436,6 +3437,10 @@ class LeAudioClientImpl : public LeAudioClient {
      return;
    }

    if (DsaDataConsume(group, cis_conn_hdl, data, size, timestamp)) {
      return;
    }

    uint16_t left_cis_handle = 0;
    uint16_t right_cis_handle = 0;
    for (auto [cis_handle, audio_location] :
@@ -4636,7 +4641,7 @@ class LeAudioClientImpl : public LeAudioClient {
        ToString(audio_receiver_state_).c_str(),
        ToString(audio_sender_state_).c_str(), static_cast<int>(dsa_mode));

    group->dsa_mode_ = dsa_mode;
    group->dsa_.mode = dsa_mode;

    /* Set the remote sink metadata context from the playback tracks metadata */
    local_metadata_context_types_.source =
@@ -5798,6 +5803,41 @@ class LeAudioClientImpl : public LeAudioClient {

    le_audio::MetricsCollector::Get()->OnStreamEnded(active_group_id_);
  }

  bool DsaDataConsume(LeAudioDeviceGroup* group, uint16_t cis_conn_hdl,
                      uint8_t* data, uint16_t size, uint32_t timestamp) {
    if (!IS_FLAG_ENABLED(leaudio_dynamic_spatial_audio)) {
      return false;
    }

    if (iso_data_callback == nullptr || !group->dsa_.active ||
        group->dsa_.mode != DsaMode::ISO_SW) {
      return false;
    }

    // Find LE Audio device
    LeAudioDevice* leAudioDevice = group->GetFirstDevice();
    while (leAudioDevice != nullptr) {
      if (leAudioDevice->GetDsaCisHandle() == cis_conn_hdl &&
          leAudioDevice->GetDsaDataPathState() == DataPathState::CONFIGURED) {
        break;
      }
      leAudioDevice = group->GetNextDevice(leAudioDevice);
    }
    if (leAudioDevice == nullptr) {
      LOG_WARN("No LE Audio device found for CIS handle: %d", cis_conn_hdl);
      return false;
    }

    bool consumed = iso_data_callback(leAudioDevice->address_, cis_conn_hdl,
                                      data, size, timestamp);
    if (consumed) {
      return true;
    } else {
      LOG_VERBOSE("ISO data consumer not ready to accept data");
      return false;
    }
  }
};

static void le_audio_health_status_callback(const RawAddress& addr,
@@ -6151,3 +6191,12 @@ void LeAudioClient::Cleanup(void) {
  IsoManager::GetInstance()->Stop();
  le_audio::MetricsCollector::Get()->Flush();
}

bool LeAudioClient::RegisterIsoDataConsumer(LeAudioIsoDataCallback callback) {
  if (!IS_FLAG_ENABLED(leaudio_dynamic_spatial_audio)) {
    return false;
  }

  iso_data_callback = callback;
  return true;
}
+6 −2
Original line number Diff line number Diff line
@@ -84,7 +84,11 @@ class LeAudioDeviceGroup {
  /* Whether LE Audio is preferred for OUTPUT_ONLY and DUPLEX cases */
  bool is_output_preference_le_audio;
  bool is_duplex_preference_le_audio;
  DsaMode dsa_mode_;

  struct {
    DsaMode mode;
    bool active;
  } dsa_;
  bool asymmetric_phy_for_unidirectional_cis_supported;

  explicit LeAudioDeviceGroup(const int group_id)
@@ -93,7 +97,7 @@ class LeAudioDeviceGroup {
        stream_conf({}),
        notify_streaming_when_cises_are_ready_(false),
        audio_directions_(0),
        dsa_mode_(DsaMode::DISABLED),
        dsa_({DsaMode::DISABLED, false}),
        is_enabled_(true),
        transport_latency_mtos_us_(0),
        transport_latency_stom_us_(0),
+18 −3
Original line number Diff line number Diff line
@@ -356,7 +356,7 @@ void LeAudioDevice::RegisterPACs(
    pac_db->clear();
  }

  dsa_modes_ = {DsaMode::DISABLED};
  dsa_.modes = {DsaMode::DISABLED};

  /* TODO wrap this logging part with debug flag */
  for (const struct types::acs_ac_record& pac : *pac_recs) {
@@ -375,7 +375,7 @@ void LeAudioDevice::RegisterPACs(
      if (pac.codec_id == types::kLeAudioCodecHeadtracking) {
        LOG(INFO) << __func__ << ": Headtracking supported";
        /* Todo: Set DSA modes according to the codec configuration */
        dsa_modes_ = {
        dsa_.modes = {
            DsaMode::DISABLED,
            DsaMode::ISO_SW,
            DsaMode::ISO_HW,
@@ -1024,7 +1024,22 @@ void LeAudioDevice::UpdateDeviceAllowlistFlag(void) {
    }
  }
}
DsaModes LeAudioDevice::GetDsaModes(void) { return dsa_modes_; }

DsaModes LeAudioDevice::GetDsaModes(void) { return dsa_.modes; }

types::DataPathState LeAudioDevice::GetDsaDataPathState(void) {
  return dsa_.state;
}

void LeAudioDevice::SetDsaDataPathState(types::DataPathState state) {
  dsa_.state = state;
}

uint16_t LeAudioDevice::GetDsaCisHandle(void) { return dsa_.cis_handle; }

void LeAudioDevice::SetDsaCisHandle(uint16_t cis_handle) {
  dsa_.cis_handle = cis_handle;
}

/* LeAudioDevices Class methods implementation */
void LeAudioDevices::Add(const RawAddress& address, DeviceConnectState state,
+13 −2
Original line number Diff line number Diff line
@@ -141,7 +141,9 @@ class LeAudioDevice {
        model_name_(""),
        allowlist_flag_(false),
        link_quality_timer(nullptr),
        dsa_modes_({DsaMode::DISABLED}) {}
        dsa_({{DsaMode::DISABLED},
              types::DataPathState::IDLE,
              GATT_INVALID_CONN_ID}) {}
  ~LeAudioDevice(void);

  void SetConnectionState(DeviceConnectState state);
@@ -250,11 +252,20 @@ class LeAudioDevice {
  void GetDeviceModelName(void);
  void UpdateDeviceAllowlistFlag(void);
  DsaModes GetDsaModes(void);
  types::DataPathState GetDsaDataPathState(void);
  void SetDsaDataPathState(types::DataPathState state);
  uint16_t GetDsaCisHandle(void);
  void SetDsaCisHandle(uint16_t cis_handle);

 private:
  types::BidirectionalPair<types::AudioContexts> avail_contexts_;
  types::BidirectionalPair<types::AudioContexts> supp_contexts_;
  DsaModes dsa_modes_;
  struct {
    DsaModes modes;
    types::DataPathState state;
    uint16_t cis_handle;
  } dsa_;

  static constexpr char kLeAudioDeviceAllowListProp[] =
      "persist.bluetooth.leaudio.allow_list";

Loading