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

Commit 65936719 authored by Jakub Pawłowski's avatar Jakub Pawłowski Committed by Gerrit Code Review
Browse files

Merge changes I568fa4d8,I7536e12a

* changes:
  leaudio: Add cancel_watchdog_if_needed()
  leaudio: Extract helper to set ase state
parents b8338171 0a706152
Loading
Loading
Loading
Loading
+51 −28
Original line number Diff line number Diff line
@@ -673,6 +673,12 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
    ClearGroup(group, true);
  }

  void cancel_watchdog_if_needed(void) {
    if (alarm_is_scheduled(watchdog_)) {
      alarm_cancel(watchdog_);
    }
  }

  void ProcessHciNotifCisEstablished(
      LeAudioDeviceGroup* group, LeAudioDevice* leAudioDevice,
      const bluetooth::hci::iso_manager::cis_establish_cmpl_evt* event)
@@ -757,7 +763,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
    if (group->GetState() == AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING &&
        group->IsGroupStreamReady()) {
      /* No more transition for group */
      alarm_cancel(watchdog_);
      cancel_watchdog_if_needed();
      PrepareDataPath(group);
    }
  }
@@ -877,7 +883,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
             AseState::BTA_LE_AUDIO_ASE_STATE_QOS_CONFIGURED) &&
            group->HaveAllCisesDisconnected()) {
          /* No more transition for group */
          alarm_cancel(watchdog_);
          cancel_watchdog_if_needed();

          state_machine_callbacks_->StatusReportCb(
              group->group_id_, GroupStreamStatus::SUSPENDED);
@@ -905,9 +911,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
         * In such an event, there is need to notify upper layer about state
         * from here.
         */
        if (alarm_is_scheduled(watchdog_)) {
          alarm_cancel(watchdog_);
        }
        cancel_watchdog_if_needed();

        if (current_group_state == AseState::BTA_LE_AUDIO_ASE_STATE_IDLE) {
          LOG_INFO(
@@ -997,7 +1001,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
    timeoutMs =
        osi_property_get_int32(kStateTransitionTimeoutMsProp, timeoutMs);

    if (alarm_is_scheduled(watchdog_)) alarm_cancel(watchdog_);
    cancel_watchdog_if_needed();

    alarm_set_on_mloop(
        watchdog_, timeoutMs,
@@ -1478,6 +1482,14 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
    RemoveDataPathByCisHandle(leAudioDevice, ase->cis_conn_hdl);
  }

  void SetAseState(LeAudioDevice* leAudioDevice, struct ase* ase,
                   AseState state) {
    LOG_INFO("%s, ase_id: %d, %s -> %s",
             ADDRESS_TO_LOGGABLE_CSTR(leAudioDevice->address_), ase->id,
             ToString(ase->state).c_str(), ToString(state).c_str());
    ase->state = state;
  }

  void AseStateMachineProcessIdle(
      struct le_audio::client_parser::ascs::ase_rsp_hdr& arh, struct ase* ase,
      LeAudioDeviceGroup* group, LeAudioDevice* leAudioDevice) {
@@ -1493,7 +1505,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
        }
        break;
      case AseState::BTA_LE_AUDIO_ASE_STATE_RELEASING: {
        ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_IDLE;
        SetAseState(leAudioDevice, ase, AseState::BTA_LE_AUDIO_ASE_STATE_IDLE);
        ase->active = false;
        ase->configured_for_context_type =
            le_audio::types::LeAudioContextType::UNINITIALIZED;
@@ -1537,7 +1549,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
          return;
        }

        if (alarm_is_scheduled(watchdog_)) alarm_cancel(watchdog_);
        cancel_watchdog_if_needed();
        ReleaseCisIds(group);
        state_machine_callbacks_->StatusReportCb(group->group_id_,
                                                 GroupStreamStatus::IDLE);
@@ -1687,7 +1699,8 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
        ase->preferred_pres_delay_min = rsp.preferred_pres_delay_min;
        ase->preferred_pres_delay_max = rsp.preferred_pres_delay_max;

        ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_CODEC_CONFIGURED;
        SetAseState(leAudioDevice, ase,
                    AseState::BTA_LE_AUDIO_ASE_STATE_CODEC_CONFIGURED);

        if (group->GetTargetState() == AseState::BTA_LE_AUDIO_ASE_STATE_IDLE) {
          /* This is autonomus change of the remote device */
@@ -1751,7 +1764,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
              group->group_id_, GroupStreamStatus::CONFIGURED_BY_USER);

          /* No more transition for group */
          alarm_cancel(watchdog_);
          cancel_watchdog_if_needed();
          return;
        }

@@ -1838,7 +1851,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
              group->group_id_, GroupStreamStatus::CONFIGURED_BY_USER);

          /* No more transition for group */
          alarm_cancel(watchdog_);
          cancel_watchdog_if_needed();
          return;
        }

@@ -1853,7 +1866,8 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
        break;
      case AseState::BTA_LE_AUDIO_ASE_STATE_RELEASING:
        LeAudioDevice* leAudioDeviceNext;
        ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_CODEC_CONFIGURED;
        SetAseState(leAudioDevice, ase,
                    AseState::BTA_LE_AUDIO_ASE_STATE_CODEC_CONFIGURED);
        ase->active = false;

        if (!leAudioDevice->HaveAllActiveAsesSameState(
@@ -1898,7 +1912,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
            return;
          }

          if (alarm_is_scheduled(watchdog_)) alarm_cancel(watchdog_);
          cancel_watchdog_if_needed();

          state_machine_callbacks_->StatusReportCb(
              group->group_id_, GroupStreamStatus::CONFIGURED_AUTONOMOUS);
@@ -1925,7 +1939,8 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {

    switch (ase->state) {
      case AseState::BTA_LE_AUDIO_ASE_STATE_CODEC_CONFIGURED: {
        ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_QOS_CONFIGURED;
        SetAseState(leAudioDevice, ase,
                    AseState::BTA_LE_AUDIO_ASE_STATE_QOS_CONFIGURED);

        if (!leAudioDevice->HaveAllActiveAsesSameState(
                AseState::BTA_LE_AUDIO_ASE_STATE_QOS_CONFIGURED)) {
@@ -1964,17 +1979,18 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
          return;
        }

        ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_QOS_CONFIGURED;
        SetAseState(leAudioDevice, ase,
                    AseState::BTA_LE_AUDIO_ASE_STATE_QOS_CONFIGURED);

        /* Process the Disable Transition of the rest of group members if no
         * more ASE notifications has to come from this device. */
        if (leAudioDevice->IsReadyToSuspendStream())
          ProcessGroupDisable(group);
        if (leAudioDevice->IsReadyToSuspendStream()) ProcessGroupDisable(group);

        break;

      case AseState::BTA_LE_AUDIO_ASE_STATE_DISABLING: {
        ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_QOS_CONFIGURED;
        SetAseState(leAudioDevice, ase,
                    AseState::BTA_LE_AUDIO_ASE_STATE_QOS_CONFIGURED);

        /* More ASEs notification from this device has to come for this group */
        if (!group->HaveAllActiveDevicesAsesTheSameState(
@@ -1988,7 +2004,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
        if (group->GetTargetState() ==
            AseState::BTA_LE_AUDIO_ASE_STATE_QOS_CONFIGURED) {
          /* No more transition for group */
          alarm_cancel(watchdog_);
          cancel_watchdog_if_needed();

          state_machine_callbacks_->StatusReportCb(
              group->group_id_, GroupStreamStatus::SUSPENDED);
@@ -2020,7 +2036,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
    group->ClearPendingAvailableContextsChange();
    group->ClearPendingConfiguration();

    if (alarm_is_scheduled(watchdog_)) alarm_cancel(watchdog_);
    cancel_watchdog_if_needed();
    ReleaseCisIds(group);
    RemoveCigForGroup(group);

@@ -2304,7 +2320,8 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {

    switch (ase->state) {
      case AseState::BTA_LE_AUDIO_ASE_STATE_QOS_CONFIGURED:
        ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_ENABLING;
        SetAseState(leAudioDevice, ase,
                    AseState::BTA_LE_AUDIO_ASE_STATE_ENABLING);

        if (group->GetState() == AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING) {
          if (ase->data_path_state < AudioStreamDataPathState::CIS_PENDING) {
@@ -2383,7 +2400,8 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
          return;
        }

        ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING;
        SetAseState(leAudioDevice, ase,
                    AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING);

        if (group->GetState() == AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING) {
          /* We are here because of the reconnection of the single device. */
@@ -2399,7 +2417,8 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
      case AseState::BTA_LE_AUDIO_ASE_STATE_ENABLING: {
        std::vector<uint8_t> value;

        ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING;
        SetAseState(leAudioDevice, ase,
                    AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING);

        if (!group->HaveAllActiveDevicesAsesTheSameState(
                AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING)) {
@@ -2424,7 +2443,7 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
        if (group->GetTargetState() ==
            AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING) {
          /* No more transition for group */
          alarm_cancel(watchdog_);
          cancel_watchdog_if_needed();
          PrepareDataPath(group);

          return;
@@ -2488,7 +2507,8 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
        /* TODO: Disable */
        break;
      case AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING:
        ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_DISABLING;
        SetAseState(leAudioDevice, ase,
                    AseState::BTA_LE_AUDIO_ASE_STATE_DISABLING);

        /* Process the Disable Transition of the rest of group members if no
         * more ASE notifications has to come from this device. */
@@ -2547,14 +2567,16 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {
    switch (ase->state) {
      case AseState::BTA_LE_AUDIO_ASE_STATE_CODEC_CONFIGURED:
      case AseState::BTA_LE_AUDIO_ASE_STATE_DISABLING: {
        ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_RELEASING;
        SetAseState(leAudioDevice, ase,
                    AseState::BTA_LE_AUDIO_ASE_STATE_RELEASING);
        break;
      }
      case AseState::BTA_LE_AUDIO_ASE_STATE_QOS_CONFIGURED:
        /* At this point all of the active ASEs within group are released. */
        RemoveCigForGroup(group);

        ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_RELEASING;
        SetAseState(leAudioDevice, ase,
                    AseState::BTA_LE_AUDIO_ASE_STATE_RELEASING);
        if (group->HaveAllActiveDevicesAsesTheSameState(
                AseState::BTA_LE_AUDIO_ASE_STATE_RELEASING))
          group->SetState(AseState::BTA_LE_AUDIO_ASE_STATE_RELEASING);
@@ -2563,7 +2585,8 @@ class LeAudioGroupStateMachineImpl : public LeAudioGroupStateMachine {

      case AseState::BTA_LE_AUDIO_ASE_STATE_ENABLING:
      case AseState::BTA_LE_AUDIO_ASE_STATE_STREAMING: {
        ase->state = AseState::BTA_LE_AUDIO_ASE_STATE_RELEASING;
        SetAseState(leAudioDevice, ase,
                    AseState::BTA_LE_AUDIO_ASE_STATE_RELEASING);

        /* Happens when bi-directional completive ASE releasing state came */
        if (ase->data_path_state == AudioStreamDataPathState::CIS_DISCONNECTING)