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

Commit 075f352d authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes I10b13448,I71f099af,I7a86c652,Ic91d2cf5,I94b49fe2 into main

* changes:
  leaudio: Improve rejecting stream from remote device
  leaudio: Do not start stream if context not available but supported
  leaudio: Make sure context and locations are updated correctly
  leaudio: Remove not needed operation and return parameter
  leaudio: Add helper functions to inject context types
parents d3058212 d16628bb
Loading
Loading
Loading
Loading
+45 −62
Original line number Diff line number Diff line
@@ -101,12 +101,6 @@ using le_audio::types::LeAudioContextType;
using le_audio::utils::GetAudioContextsFromSinkMetadata;
using le_audio::utils::GetAudioContextsFromSourceMetadata;

using le_audio::client_parser::ascs::
    kCtpResponseCodeInvalidConfigurationParameterValue;
using le_audio::client_parser::ascs::kCtpResponseCodeSuccess;
using le_audio::client_parser::ascs::kCtpResponseInvalidAseCisMapping;
using le_audio::client_parser::ascs::kCtpResponseNoReason;

/* Enums */
enum class AudioReconfigurationResult {
  RECONFIGURATION_NEEDED = 0x00,
@@ -639,28 +633,6 @@ class LeAudioClientImpl : public LeAudioClient {
    }
  }

  void ControlPointNotificationHandler(
      struct le_audio::client_parser::ascs::ctp_ntf& ntf) {
    for (auto& entry : ntf.entries) {
      switch (entry.response_code) {
        case kCtpResponseCodeInvalidConfigurationParameterValue:
          switch (entry.reason) {
            case kCtpResponseInvalidAseCisMapping:
              CancelStreamingRequest();
              break;
            case kCtpResponseNoReason:
            default:
              break;
          }
          break;
        case kCtpResponseCodeSuccess:
          FALLTHROUGH;
        default:
          break;
      }
    }
  }

  void group_add_node(const int group_id, const RawAddress& address,
                      bool update_group_module = false) {
    LeAudioDevice* leAudioDevice = leAudioDevices_.FindByAddress(address);
@@ -1761,12 +1733,10 @@ class LeAudioClientImpl : public LeAudioClient {
            leAudioDevice->address_,
            leAudioDevice->snk_audio_locations_.to_ulong(),
            leAudioDevice->src_audio_locations_.to_ulong());
      }

      /* Read of source audio locations during initial attribute discovery.
       * Group would be assigned once service search is completed.
       */
        if (group && group->IsReleasingOrIdle()) {
          UpdateLocationsAndContextsAvailability(leAudioDevice->group_id_);
        }
      }
    } else if (hdl == leAudioDevice->src_audio_locations_hdls_.val_hdl) {
      AudioLocations src_audio_locations;

@@ -1791,12 +1761,10 @@ class LeAudioClientImpl : public LeAudioClient {
            leAudioDevice->address_,
            leAudioDevice->snk_audio_locations_.to_ulong(),
            leAudioDevice->src_audio_locations_.to_ulong());
      }

      /* Read of source audio locations during initial attribute discovery.
       * Group would be assigned once service search is completed.
       */
        if (group && group->IsReleasingOrIdle()) {
          UpdateLocationsAndContextsAvailability(leAudioDevice->group_id_);
        }
      }
    } else if (hdl == leAudioDevice->audio_avail_hdls_.val_hdl) {
      BidirectionalPair<AudioContexts> contexts;
      if (!le_audio::client_parser::pacs::ParseAvailableAudioContexts(
@@ -1810,8 +1778,16 @@ class LeAudioClientImpl : public LeAudioClient {
        return;
      }

      /* Check if we should attach to stream this device */
      if (group->IsInTransition() || !group->IsStreaming()) {
      if (group->IsReleasingOrIdle()) {
        /* Group is not streaming. Device does not have to be attach to the
         * stream, and we can update context availability for the group
         */
        UpdateLocationsAndContextsAvailability(group);
        return;
      }

      if (group->IsInTransition()) {
        /* Group is in transition, do not take any actions now.*/
        return;
      }

@@ -1845,11 +1821,7 @@ class LeAudioClientImpl : public LeAudioClient {
            supp_audio_contexts.source.value());
      }
    } else if (hdl == leAudioDevice->ctp_hdls_.val_hdl) {
      auto ntf =
          std::make_unique<struct le_audio::client_parser::ascs::ctp_ntf>();

      if (ParseAseCtpNotification(*ntf, len, value))
        ControlPointNotificationHandler(*ntf);
      groupStateMachine_->ProcessGattCtpNotification(group, value, len);
    } else if (hdl == leAudioDevice->tmap_role_hdl_) {
      le_audio::client_parser::tmap::ParseTmapRole(leAudioDevice->tmap_role_,
                                                   len, value);
@@ -3812,6 +3784,12 @@ class LeAudioClientImpl : public LeAudioClient {
        DirectionalRealignMetadataAudioContexts(group, remote_direction);
    ApplyRemoteMetadataAudioContextPolicy(group, remote_contexts,
                                          remote_direction);

    if (!remote_contexts.sink.any() && !remote_contexts.source.any()) {
      LOG_WARN("Requested context type not available on the remote side");
      return false;
    }

    return GroupStream(active_group_id_, configuration_context_type_,
                       remote_contexts);
  }
@@ -5308,7 +5286,9 @@ class LeAudioClientImpl : public LeAudioClient {
         */
        FALLTHROUGH;
      case GroupStreamStatus::IDLE: {
        if (group && group->IsPendingConfiguration()) {
        if (group) {
          UpdateLocationsAndContextsAvailability(group->group_id_);
          if (group->IsPendingConfiguration()) {
            SuspendedForReconfiguration();
            auto remote_direction =
                kLeAudioContextAllRemoteSource.test(configuration_context_type_)
@@ -5327,9 +5307,12 @@ class LeAudioClientImpl : public LeAudioClient {
                    group->group_id_);
            group->ClearPendingConfiguration();
          }
        }

        stream_setup_end_timestamp_ = 0;
        stream_setup_start_timestamp_ = 0;
        CancelStreamingRequest();

        if (group) {
          NotifyUpperLayerGroupTurnedIdleDuringCall(group->group_id_);
          HandlePendingDeviceRemove(group);
+8 −19
Original line number Diff line number Diff line
@@ -798,11 +798,7 @@ uint16_t LeAudioDeviceGroup::GetRemoteDelay(uint8_t direction) const {
}

bool LeAudioDeviceGroup::UpdateAudioContextAvailability(void) {
  LOG_DEBUG(
      " group id: %d, available contexts sink: %s, available contexts source: "
      "%s",
      group_id_, group_available_contexts_.sink.to_string().c_str(),
      group_available_contexts_.source.to_string().c_str());
  LOG_DEBUG("%d", group_id_);
  auto old_contexts = GetAvailableContexts();
  SetAvailableContexts(GetLatestAvailableContexts());
  return old_contexts != GetAvailableContexts();
@@ -842,7 +838,8 @@ LeAudioDeviceGroup::GetLatestAvailableContexts() const {
  types::BidirectionalPair<types::AudioContexts> contexts;
  for (const auto& device : leAudioDevices_) {
    auto shared_ptr = device.lock();
    if (shared_ptr) {
    if (shared_ptr &&
        shared_ptr->GetConnectionState() == DeviceConnectState::CONNECTED) {
      contexts.sink |=
          shared_ptr->GetAvailableContexts(types::kLeAudioDirectionSink);
      contexts.source |=
@@ -2969,26 +2966,18 @@ void LeAudioDevice::DisconnectAcl(void) {
  }
}

/* Returns XOR of updated sink and source bitset context types */
AudioContexts LeAudioDevice::SetAvailableContexts(
void LeAudioDevice::SetAvailableContexts(
    types::BidirectionalPair<types::AudioContexts> contexts) {
  AudioContexts updated_contexts;

  updated_contexts = contexts.sink ^ avail_contexts_.sink;
  updated_contexts |= contexts.source ^ avail_contexts_.source;

  LOG_DEBUG(
      "\n\t avail_contexts_.sink: %s \n\t avail_contexts_.source: %s  \n\t "
      "contexts.sink: %s \n\t contexts.source: %s \n\t updated_contexts: %s",
      "\n\t previous_contexts_.sink: %s \n\t previous_contexts_.source: %s  "
      "\n\t "
      "new_contexts.sink: %s \n\t new_contexts.source: %s \n\t ",
      avail_contexts_.sink.to_string().c_str(),
      avail_contexts_.source.to_string().c_str(),
      contexts.sink.to_string().c_str(), contexts.source.to_string().c_str(),
      updated_contexts.to_string().c_str());
      contexts.sink.to_string().c_str(), contexts.source.to_string().c_str());

  avail_contexts_.sink = contexts.sink;
  avail_contexts_.source = contexts.source;

  return updated_contexts;
}

bool LeAudioDevice::ActivateConfiguredAses(LeAudioContextType context_type) {
+14 −1
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@
#include "le_audio_log_history.h"
#include "le_audio_types.h"
#include "osi/include/alarm.h"
#include "osi/include/log.h"
#include "osi/include/properties.h"
#include "raw_address.h"

@@ -199,7 +200,7 @@ class LeAudioDevice {
                       types::kLeAudioDirectionSource)) const {
    return avail_contexts_.get(direction);
  }
  types::AudioContexts SetAvailableContexts(
  void SetAvailableContexts(
      types::BidirectionalPair<types::AudioContexts> cont_val);

  void DeactivateAllAses(void);
@@ -466,11 +467,23 @@ class LeAudioDeviceGroup {
  inline void SetAvailableContexts(
      types::BidirectionalPair<types::AudioContexts> new_contexts) {
    group_available_contexts_ = new_contexts;
    LOG_DEBUG(
        " group id: %d, available contexts sink: %s, available contexts "
        "source: "
        "%s",
        group_id_, group_available_contexts_.sink.to_string().c_str(),
        group_available_contexts_.source.to_string().c_str());
  }

  inline types::AudioContexts GetAvailableContexts(
      int direction = (types::kLeAudioDirectionSink |
                       types::kLeAudioDirectionSource)) const {
    LOG_DEBUG(
        " group id: %d, available contexts sink: %s, available contexts "
        "source: "
        "%s",
        group_id_, group_available_contexts_.sink.to_string().c_str(),
        group_available_contexts_.source.to_string().c_str());
    return group_available_contexts_.get(direction);
  }

+538 −44

File changed.

Preview size limit exceeded, changes collapsed.

+4 −0
Original line number Diff line number Diff line
@@ -54,6 +54,10 @@ class MockLeAudioGroupStateMachine : public le_audio::LeAudioGroupStateMachine {
               le_audio::LeAudioDeviceGroup* group),
              (override));

  MOCK_METHOD((void), ProcessGattCtpNotification,
              (le_audio::LeAudioDeviceGroup * group, uint8_t* value,
               uint16_t len),
              (override));
  MOCK_METHOD((void), ProcessHciNotifOnCigCreate,
              (le_audio::LeAudioDeviceGroup * group, uint8_t status,
               uint8_t cig_id, std::vector<uint16_t> conn_handles),
Loading