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

Commit 2a87247a authored by Grzegorz Kolodziejczyk (xWF)'s avatar Grzegorz Kolodziejczyk (xWF) Committed by Gerrit Code Review
Browse files

Merge changes I6a041e2a,I8ac7a317 into main

* changes:
  broadcaster: Confirm resume request when already streaming
  broadcaster: Handle not ready to resume broadcast
parents e8818edf 881dc4b8
Loading
Loading
Loading
Loading
+32 −23
Original line number Diff line number Diff line
@@ -992,7 +992,6 @@ private:
  }

  void setBroadcastTimers() {
    if (audio_state_ == AudioState::SUSPENDED) {
    log::info(" Started");
    alarm_set_on_mloop(
            big_terminate_timer_, kBigTerminateTimeoutMs,
@@ -1012,7 +1011,6 @@ private:
            },
            nullptr);
  }
  }

  void cancelBroadcastTimers() {
    log::info("");
@@ -1108,9 +1106,6 @@ private:
                instance->UpdateAudioActiveStateInPublicAnnouncement();
              }
            }
            if (com::android::bluetooth::flags::leaudio_big_depends_on_audio_state()) {
              instance->setBroadcastTimers();
            }
          }
          break;
      };
@@ -1369,9 +1364,23 @@ private:

      instance->audio_state_ = AudioState::ACTIVE;
      if (com::android::bluetooth::flags::leaudio_big_depends_on_audio_state()) {
        if (instance->broadcasts_.empty()) {
          log::warn("No broadcasts are ready to resume (pending: {} broadcasts)",
                    instance->pending_broadcasts_.size());
          instance->le_audio_source_hal_client_->CancelStreamingRequest();
          return;
        }

        instance->cancelBroadcastTimers();
        instance->UpdateAudioActiveStateInPublicAnnouncement();

        /* In case of double call of resume when broadcast are already in streaming states */
        if (IsAnyoneStreaming()) {
          log::debug("broadcasts are already streaming");
          instance->le_audio_source_hal_client_->ConfirmStreamingRequest();
          return;
        }

        for (auto& broadcast_pair : instance->broadcasts_) {
          auto& broadcast = broadcast_pair.second;
          broadcast->ProcessMessage(BroadcastStateMachine::Message::START, nullptr);
+32 −0
Original line number Diff line number Diff line
@@ -1422,6 +1422,38 @@ TEST_F(BroadcasterTest, BigCreationTerminationDependsOnAudioResumeSuspend) {
  ASSERT_TRUE(broadcast_stop_timer_->cb == nullptr);
}

TEST_F(BroadcasterTest, AudioResumeWhileStreaming) {
  com::android::bluetooth::flags::provider_->leaudio_big_depends_on_audio_state(true);

  EXPECT_CALL(*mock_codec_manager_, UpdateActiveBroadcastAudioHalClient(mock_audio_source_, true))
          .Times(1);
  LeAudioSourceAudioHalClient::Callbacks* audio_receiver;
  EXPECT_CALL(*mock_audio_source_, Start)
          .WillOnce(DoAll(SaveArg<1>(&audio_receiver), Return(true)))
          .WillRepeatedly(Return(false));
  auto broadcast_id = InstantiateBroadcast();

  ASSERT_NE(audio_receiver, nullptr);

  // onAudioResume cause state machine go to STREAMING state so BIG creation
  EXPECT_CALL(mock_broadcaster_callbacks_,
              OnBroadcastStateChanged(broadcast_id, BroadcastState::STREAMING))
          .Times(1);
  audio_receiver->OnAudioResume();
  Mock::VerifyAndClearExpectations(mock_audio_source_);

  // 2nd stream resume
  EXPECT_CALL(*mock_audio_source_, ConfirmStreamingRequest()).Times(1);
  audio_receiver->OnAudioResume();
  Mock::VerifyAndClearExpectations(mock_audio_source_);

  // 3rd stream resume
  EXPECT_CALL(*mock_audio_source_, ConfirmStreamingRequest()).Times(1);
  audio_receiver->OnAudioResume();
  Mock::VerifyAndClearExpectations(mock_audio_source_);
  Mock::VerifyAndClearExpectations(mock_codec_manager_);
}

// TODO: Add tests for:
// ToRawPacket(BasicAudioAnnouncementData const& in, std::vector<uint8_t>& data)