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

Commit 847dcfad authored by Grzegorz Kołodziejczyk's avatar Grzegorz Kołodziejczyk
Browse files

le_audio: Implement group direction handling

Patch implements handling of group direction member. While device
location is updated, group direction should be also. If some of device
would be added or removed from group, group direction should be also
updated.

Test: atest bluetooth_le_audio_client_test
Sponsor: @jpawlowski
Bug: 229802353
Change-Id: I3439786de6286ad1eaa82254709a3fd725a95dc5
(cherry picked from commit 91322a46c6f691779022281feda24396ebe0935f)
parent db312874
Loading
Loading
Loading
Loading
+22 −4
Original line number Diff line number Diff line
@@ -511,7 +511,11 @@ class LeAudioClientImpl : public LeAudioClient {
      std::optional<AudioContexts> old_group_updated_contexts =
          old_group->UpdateActiveContextsMap(old_group->GetActiveContexts());

      if (old_group_updated_contexts || old_group->ReloadAudioLocations()) {
      bool group_conf_changed = old_group->ReloadAudioLocations();
      group_conf_changed |= old_group->ReloadAudioDirections();
      group_conf_changed |= old_group_updated_contexts.has_value();

      if (group_conf_changed) {
        callbacks_->OnAudioConf(old_group->audio_directions_, old_group_id,
                                old_group->snk_audio_locations_.to_ulong(),
                                old_group->src_audio_locations_.to_ulong(),
@@ -574,7 +578,11 @@ class LeAudioClientImpl : public LeAudioClient {
    std::optional<AudioContexts> updated_contexts =
        group->UpdateActiveContextsMap(group->GetActiveContexts());

    if (updated_contexts || group->ReloadAudioLocations())
    bool group_conf_changed = group->ReloadAudioLocations();
    group_conf_changed |= group->ReloadAudioDirections();
    group_conf_changed |= updated_contexts.has_value();

    if (group_conf_changed)
      callbacks_->OnAudioConf(group->audio_directions_, group->group_id_,
                              group->snk_audio_locations_.to_ulong(),
                              group->src_audio_locations_.to_ulong(),
@@ -1177,7 +1185,12 @@ class LeAudioClientImpl : public LeAudioClient {
      /* Read of source audio locations during initial attribute discovery.
       * Group would be assigned once service search is completed.
       */
      if (group && group->ReloadAudioLocations()) {
      if (!group) return;

      bool group_conf_changed = group->ReloadAudioLocations();
      group_conf_changed |= group->ReloadAudioDirections();

      if (group_conf_changed) {
        callbacks_->OnAudioConf(group->audio_directions_, group->group_id_,
                                group->snk_audio_locations_.to_ulong(),
                                group->src_audio_locations_.to_ulong(),
@@ -1206,7 +1219,12 @@ class LeAudioClientImpl : public LeAudioClient {
      /* Read of source audio locations during initial attribute discovery.
       * Group would be assigned once service search is completed.
       */
      if (group && group->ReloadAudioLocations()) {
      if (!group) return;

      bool group_conf_changed = group->ReloadAudioLocations();
      group_conf_changed |= group->ReloadAudioDirections();

      if (group_conf_changed) {
        callbacks_->OnAudioConf(group->audio_directions_, group->group_id_,
                                group->snk_audio_locations_.to_ulong(),
                                group->src_audio_locations_.to_ulong(),
+16 −0
Original line number Diff line number Diff line
@@ -694,6 +694,22 @@ bool LeAudioDeviceGroup::ReloadAudioLocations(void) {
  return true;
}

bool LeAudioDeviceGroup::ReloadAudioDirections(void) {
  uint8_t updated_audio_directions = 0x00;

  for (const auto& device : leAudioDevices_) {
    if (device.expired()) continue;
    updated_audio_directions |= device.lock().get()->audio_directions_;
  }

  /* Nothing has changed */
  if (updated_audio_directions == audio_directions_) return false;

  audio_directions_ = updated_audio_directions;

  return true;
}

bool LeAudioDeviceGroup::IsInTransition(void) {
  return target_state_ != current_state_;
}
+1 −0
Original line number Diff line number Diff line
@@ -251,6 +251,7 @@ class LeAudioDeviceGroup {
      types::AudioContexts contexts);
  std::optional<types::AudioContexts> UpdateActiveContextsMap(void);
  bool ReloadAudioLocations(void);
  bool ReloadAudioDirections(void);
  const set_configurations::AudioSetConfiguration* GetActiveConfiguration(void);
  types::LeAudioContextType GetCurrentContextType(void);
  bool IsPendingConfiguration(void);