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

Commit c26ed98d authored by Łukasz Rymanowski's avatar Łukasz Rymanowski
Browse files

leaudio: Improve stream reconfiguration

If during stream releasing (e.g. for reconfiguration), the Audio HAL
calls onAudioResume, BT stack will return pending instead of cancel
and let Audio HAL to wait for the release to be completed (or
reconfiguration completed).
After that BT stack will Cancel previous request and wait for
another resume to start stream if still needed.

Bug: 150670922
Test: atest --host bluetooth_le_audio_test bluetooth_le_audio_client_test
Sponsor: @jpawlowski

Change-Id: Ib467a29c70370a6e17c5774b1b6da57f496b95ab
parent be1abc55
Loading
Loading
Loading
Loading
+44 −37
Original line number Original line Diff line number Diff line
@@ -2735,7 +2735,7 @@ class LeAudioClientImpl : public LeAudioClient {
          case AudioState::READY_TO_START:
          case AudioState::READY_TO_START:
          case AudioState::STARTED:
          case AudioState::STARTED:
            audio_sender_state_ = AudioState::READY_TO_START;
            audio_sender_state_ = AudioState::READY_TO_START;
            /* If signalling part is completed trigger start reveivin audio
            /* If signalling part is completed trigger start receiving audio
             * here, otherwise it'll be called on group streaming state callback
             * here, otherwise it'll be called on group streaming state callback
             */
             */
            if (group->GetState() ==
            if (group->GetState() ==
@@ -2744,30 +2744,33 @@ class LeAudioClientImpl : public LeAudioClient {
            }
            }
            break;
            break;
          case AudioState::RELEASING:
          case AudioState::RELEASING:
          case AudioState::READY_TO_RELEASE:
            /* Group is reconfiguring, reassing state and wait for
            /* If group is reconfiguring, reassing state and wait for
             * the stream to be configured
             * the stream to be established
             */
             */
            if (group->IsPendingConfiguration()) {
            audio_sender_state_ = audio_receiver_state_;
            audio_sender_state_ = audio_receiver_state_;
              return;
            break;
            }
          case AudioState::READY_TO_RELEASE:
            FALLTHROUGH;
            LOG_WARN(
          default:
                " called in wrong state. \n audio_receiver_state: %s \n"
            LeAudioClientAudioSource::CancelStreamingRequest();
                "audio_sender_state: %s \n",
                ToString(audio_receiver_state_).c_str(),
                ToString(audio_sender_state_).c_str());
            CancelStreamingRequest();
            break;
            break;
        }
        }

        break;
        break;
      case AudioState::READY_TO_START:
      case AudioState::READY_TO_START:
        LOG(WARNING) << __func__
        LOG_WARN(
                     << " called in wrong state. \n audio_receiver_state: "
            " called in wrong state. \n audio_receiver_state: %s \n"
                     << audio_receiver_state_ << "\n"
            "audio_sender_state: %s \n",
                     << " audio_sender_state: " << audio_sender_state_ << "\n";
            ToString(audio_receiver_state_).c_str(),
            ToString(audio_sender_state_).c_str());
        CancelStreamingRequest();
        break;
        break;
      case AudioState::READY_TO_RELEASE:
      case AudioState::READY_TO_RELEASE:
        switch (audio_receiver_state_) {
        switch (audio_receiver_state_) {
          case AudioState::STARTED:
          case AudioState::STARTED:
          case AudioState::READY_TO_START:
          case AudioState::IDLE:
          case AudioState::IDLE:
          case AudioState::READY_TO_RELEASE:
          case AudioState::READY_TO_RELEASE:
            /* Stream is up just restore it */
            /* Stream is up just restore it */
@@ -2777,13 +2780,13 @@ class LeAudioClientImpl : public LeAudioClient {
            LeAudioClientAudioSource::ConfirmStreamingRequest();
            LeAudioClientAudioSource::ConfirmStreamingRequest();
            break;
            break;
          case AudioState::RELEASING:
          case AudioState::RELEASING:
          default:
            /* Keep wainting. After release is done, Audio Hal will be notified
            LeAudioClientAudioSource::CancelStreamingRequest();
             */
            break;
        }
        }
        break;
        break;
      case AudioState::RELEASING:
      case AudioState::RELEASING:
        /* Keep wainting */
        /* Keep wainting. After release is done, Audio Hal will be notified */
        LeAudioClientAudioSource::CancelStreamingRequest();
        break;
        break;
    }
    }
  }
  }
@@ -2878,30 +2881,34 @@ class LeAudioClientImpl : public LeAudioClient {
            }
            }
            break;
            break;
          case AudioState::RELEASING:
          case AudioState::RELEASING:
          case AudioState::READY_TO_RELEASE:
            /* Group is reconfiguring, reassing state and wait for
            /* If group is reconfiguring, reassing state and wait for
             * the stream to be configured
             * the stream to be established
             */
             */
            if (group->IsPendingConfiguration()) {
            audio_receiver_state_ = audio_sender_state_;
            audio_receiver_state_ = audio_sender_state_;
              return;
            break;
            }
          case AudioState::READY_TO_RELEASE:
            FALLTHROUGH;
            LOG_WARN(
          default:
                " called in wrong state. \n audio_receiver_state: %s \n"
            LeAudioClientAudioSink::CancelStreamingRequest();
                "audio_sender_state: %s \n",
                ToString(audio_receiver_state_).c_str(),
                ToString(audio_sender_state_).c_str());
            CancelStreamingRequest();
            break;
            break;
        }
        }
        break;
        break;
      case AudioState::READY_TO_START:
      case AudioState::READY_TO_START:
        LOG(WARNING) << __func__
        LOG_WARN(
                     << " called in wrong state. \n audio_receiver_state: "
            " called in wrong state. \n audio_receiver_state: %s \n"
                     << audio_receiver_state_ << "\n"
            "audio_sender_state: %s \n",
                     << " audio_sender_state: " << audio_sender_state_ << "\n";
            ToString(audio_receiver_state_).c_str(),
            ToString(audio_sender_state_).c_str());
        CancelStreamingRequest();
        break;
        break;
      case AudioState::READY_TO_RELEASE:
      case AudioState::READY_TO_RELEASE:
        switch (audio_sender_state_) {
        switch (audio_sender_state_) {
          case AudioState::STARTED:
          case AudioState::STARTED:
          case AudioState::IDLE:
          case AudioState::IDLE:
          case AudioState::READY_TO_START:
          case AudioState::READY_TO_RELEASE:
          case AudioState::READY_TO_RELEASE:
            /* Stream is up just restore it */
            /* Stream is up just restore it */
            audio_receiver_state_ = AudioState::STARTED;
            audio_receiver_state_ = AudioState::STARTED;
@@ -2910,13 +2917,13 @@ class LeAudioClientImpl : public LeAudioClient {
            LeAudioClientAudioSink::ConfirmStreamingRequest();
            LeAudioClientAudioSink::ConfirmStreamingRequest();
            break;
            break;
          case AudioState::RELEASING:
          case AudioState::RELEASING:
          default:
            /* Wait until releasing is completed */
            LeAudioClientAudioSink::CancelStreamingRequest();
            break;
        }
        }


        break;
        break;
      case AudioState::RELEASING:
      case AudioState::RELEASING:
        LeAudioClientAudioSink::CancelStreamingRequest();
        /* Wait until releasing is completed */
        break;
        break;
    }
    }
  }
  }