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

Commit 881dc4b8 authored by Grzegorz Kołodziejczyk's avatar Grzegorz Kołodziejczyk Committed by Grzegorz Kolodziejczyk (xWF)
Browse files

broadcaster: Confirm resume request when already streaming

Ensure resume callback sends confirmation when a broadcast is in
streaming state during resume.

Bug: 378564463
Bug: 347204335
Flag: com.android.bluetooth.flags.leaudio_big_depends_on_audio_state
Test: atest bluetooth_test_broadcaster
Change-Id: I6a041e2af7bcaabc8709c0fd742695448111355a
parent 2d68547c
Loading
Loading
Loading
Loading
+25 −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;
      };
@@ -1379,6 +1374,13 @@ private:
        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)