Loading android/app/src/com/android/bluetooth/le_audio/LeAudioService.java +11 −11 Original line number Diff line number Diff line Loading @@ -1332,9 +1332,14 @@ public class LeAudioService extends ProfileService { Log.d(TAG, "startBroadcast"); /* For BIG dependent on Audio State, this timer is scheduled in * LeAudioService#createBroadcast */ if (!leaudioBigDependsOnAudioState()) { /* Start timeout to recover from stucked/error start Broadcast operation */ mCreateBroadcastTimeoutEvent = new CreateBroadcastTimeoutEvent(broadcastId); mHandler.postDelayed(mCreateBroadcastTimeoutEvent, CREATE_BROADCAST_TIMEOUT_MS); } mLeAudioBroadcasterNativeInterface.startBroadcast(broadcastId); } Loading Loading @@ -3745,10 +3750,7 @@ public class LeAudioService extends ProfileService { if (!leaudioUseAudioModeListener()) { mQueuedInCallValue = Optional.empty(); } if (!leaudioBigDependsOnAudioState()) { startBroadcast( mBroadcastIdDeactivatedForUnicastTransition.get()); } startBroadcast(mBroadcastIdDeactivatedForUnicastTransition.get()); mBroadcastIdDeactivatedForUnicastTransition = Optional.empty(); } Loading Loading @@ -3810,10 +3812,8 @@ public class LeAudioService extends ProfileService { mBroadcastSessionStats.put(broadcastId, sessionStats); } if (!leaudioBigDependsOnAudioState()) { // Start sending the actual stream startBroadcast(broadcastId); } } else { // TODO: Improve reason reporting or extend the native stack event with reason code Log.e( Loading android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBroadcastServiceTest.java +7 −14 Original line number Diff line number Diff line Loading @@ -266,10 +266,7 @@ public class LeAudioBroadcastServiceTest { create_event.valueBool1 = true; mService.messageFromNative(create_event); if (!Flags.leaudioBigDependsOnAudioState()) { // Verify if broadcast is auto-started on start verify(mLeAudioBroadcasterNativeInterface).startBroadcast(eq(broadcastId)); } // Notify initial paused state LeAudioStackEvent state_event = Loading Loading @@ -1239,11 +1236,11 @@ public class LeAudioBroadcastServiceTest { if (Flags.leaudioBigDependsOnAudioState()) { /* Verify if broadcast triggers transition */ Assert.assertFalse(mService.mBroadcastIdDeactivatedForUnicastTransition.isPresent()); } else { } /* Verify if broadcast is auto-started on start */ verify(mLeAudioBroadcasterNativeInterface, times(2)).startBroadcast(eq(broadcastId)); } } @Test public void testBroadcastResumeUnicastGroupChangeRequestDriven() { Loading @@ -1253,10 +1250,7 @@ public class LeAudioBroadcastServiceTest { prepareHandoverStreamingBroadcast(groupId, broadcastId, code); if (!Flags.leaudioBigDependsOnAudioState()) { /* Verify if broadcast is auto-started on start */ verify(mLeAudioBroadcasterNativeInterface).startBroadcast(eq(broadcastId)); } /* Imitate group change request by Bluetooth Sink HAL resume request */ LeAudioStackEvent create_event = Loading Loading @@ -1318,10 +1312,9 @@ public class LeAudioBroadcastServiceTest { if (Flags.leaudioBigDependsOnAudioState()) { /* Verify if broadcast triggers transition */ Assert.assertFalse(mService.mBroadcastIdDeactivatedForUnicastTransition.isPresent()); } else { /* Verify if broadcast is auto-started on start */ verify(mLeAudioBroadcasterNativeInterface, times(2)).startBroadcast(eq(broadcastId)); } verify(mLeAudioBroadcasterNativeInterface, times(2)).startBroadcast(eq(broadcastId)); } @Test Loading system/bta/le_audio/broadcaster/broadcaster.cc +50 −27 Original line number Diff line number Diff line Loading @@ -106,7 +106,7 @@ std::mutex instance_mutex; * for test purposes. */ class LeAudioBroadcasterImpl : public LeAudioBroadcaster, public BigCallbacks { enum class AudioState { SUSPENDED, ACTIVE }; enum class AudioState { STOPPED, SUSPENDED, ACTIVE }; public: LeAudioBroadcasterImpl(bluetooth::le_audio::LeAudioBroadcasterCallbacks* callbacks_) Loading Loading @@ -717,7 +717,9 @@ public: le_audio_source_hal_client_->Stop(); } } audio_state_ = AudioState::SUSPENDED; /* Block AF requests to resume/suspend stream */ audio_state_ = AudioState::STOPPED; broadcasts_[broadcast_id]->SetMuted(true); broadcasts_[broadcast_id]->ProcessMessage(BroadcastStateMachine::Message::SUSPEND, nullptr); } else { Loading @@ -740,6 +742,10 @@ public: void StartAudioBroadcast(uint32_t broadcast_id) override { log::info("Starting broadcast_id={}", broadcast_id); if (com::android::bluetooth::flags::leaudio_big_depends_on_audio_state()) { /* Enable possibility for AF to drive stream */ audio_state_ = AudioState::SUSPENDED; } else { if (queued_start_broadcast_request_) { log::error("Not processed yet start broadcast request"); return; Loading Loading @@ -774,6 +780,7 @@ public: log::error("No such broadcast_id={}", broadcast_id); } } } void StopAudioBroadcast(uint32_t broadcast_id) override { if (broadcasts_.count(broadcast_id) == 0) { Loading Loading @@ -1307,6 +1314,11 @@ private: log::verbose("Received {} bytes.", data.size()); if (instance->audio_state_ == AudioState::STOPPED) { log::warn("audio stopped, skip audio data ready callback"); return; } if (!broadcast_config_.has_value() || (broadcast_config_->subgroups.size() == 0)) { log::error("Codec was not configured properly"); return; Loading Loading @@ -1349,6 +1361,11 @@ private: return; } if (instance->audio_state_ == AudioState::STOPPED) { log::warn("audio stopped, skip suspend request"); return; } instance->audio_state_ = AudioState::SUSPENDED; if (com::android::bluetooth::flags::leaudio_big_depends_on_audio_state()) { instance->UpdateAudioActiveStateInPublicAnnouncement(); Loading @@ -1362,6 +1379,12 @@ private: return; } if (instance->audio_state_ == AudioState::STOPPED) { log::warn("audio stopped, skip resume request"); instance->le_audio_source_hal_client_->CancelStreamingRequest(); return; } instance->audio_state_ = AudioState::ACTIVE; if (com::android::bluetooth::flags::leaudio_big_depends_on_audio_state()) { if (instance->broadcasts_.empty()) { Loading Loading
android/app/src/com/android/bluetooth/le_audio/LeAudioService.java +11 −11 Original line number Diff line number Diff line Loading @@ -1332,9 +1332,14 @@ public class LeAudioService extends ProfileService { Log.d(TAG, "startBroadcast"); /* For BIG dependent on Audio State, this timer is scheduled in * LeAudioService#createBroadcast */ if (!leaudioBigDependsOnAudioState()) { /* Start timeout to recover from stucked/error start Broadcast operation */ mCreateBroadcastTimeoutEvent = new CreateBroadcastTimeoutEvent(broadcastId); mHandler.postDelayed(mCreateBroadcastTimeoutEvent, CREATE_BROADCAST_TIMEOUT_MS); } mLeAudioBroadcasterNativeInterface.startBroadcast(broadcastId); } Loading Loading @@ -3745,10 +3750,7 @@ public class LeAudioService extends ProfileService { if (!leaudioUseAudioModeListener()) { mQueuedInCallValue = Optional.empty(); } if (!leaudioBigDependsOnAudioState()) { startBroadcast( mBroadcastIdDeactivatedForUnicastTransition.get()); } startBroadcast(mBroadcastIdDeactivatedForUnicastTransition.get()); mBroadcastIdDeactivatedForUnicastTransition = Optional.empty(); } Loading Loading @@ -3810,10 +3812,8 @@ public class LeAudioService extends ProfileService { mBroadcastSessionStats.put(broadcastId, sessionStats); } if (!leaudioBigDependsOnAudioState()) { // Start sending the actual stream startBroadcast(broadcastId); } } else { // TODO: Improve reason reporting or extend the native stack event with reason code Log.e( Loading
android/app/tests/unit/src/com/android/bluetooth/le_audio/LeAudioBroadcastServiceTest.java +7 −14 Original line number Diff line number Diff line Loading @@ -266,10 +266,7 @@ public class LeAudioBroadcastServiceTest { create_event.valueBool1 = true; mService.messageFromNative(create_event); if (!Flags.leaudioBigDependsOnAudioState()) { // Verify if broadcast is auto-started on start verify(mLeAudioBroadcasterNativeInterface).startBroadcast(eq(broadcastId)); } // Notify initial paused state LeAudioStackEvent state_event = Loading Loading @@ -1239,11 +1236,11 @@ public class LeAudioBroadcastServiceTest { if (Flags.leaudioBigDependsOnAudioState()) { /* Verify if broadcast triggers transition */ Assert.assertFalse(mService.mBroadcastIdDeactivatedForUnicastTransition.isPresent()); } else { } /* Verify if broadcast is auto-started on start */ verify(mLeAudioBroadcasterNativeInterface, times(2)).startBroadcast(eq(broadcastId)); } } @Test public void testBroadcastResumeUnicastGroupChangeRequestDriven() { Loading @@ -1253,10 +1250,7 @@ public class LeAudioBroadcastServiceTest { prepareHandoverStreamingBroadcast(groupId, broadcastId, code); if (!Flags.leaudioBigDependsOnAudioState()) { /* Verify if broadcast is auto-started on start */ verify(mLeAudioBroadcasterNativeInterface).startBroadcast(eq(broadcastId)); } /* Imitate group change request by Bluetooth Sink HAL resume request */ LeAudioStackEvent create_event = Loading Loading @@ -1318,10 +1312,9 @@ public class LeAudioBroadcastServiceTest { if (Flags.leaudioBigDependsOnAudioState()) { /* Verify if broadcast triggers transition */ Assert.assertFalse(mService.mBroadcastIdDeactivatedForUnicastTransition.isPresent()); } else { /* Verify if broadcast is auto-started on start */ verify(mLeAudioBroadcasterNativeInterface, times(2)).startBroadcast(eq(broadcastId)); } verify(mLeAudioBroadcasterNativeInterface, times(2)).startBroadcast(eq(broadcastId)); } @Test Loading
system/bta/le_audio/broadcaster/broadcaster.cc +50 −27 Original line number Diff line number Diff line Loading @@ -106,7 +106,7 @@ std::mutex instance_mutex; * for test purposes. */ class LeAudioBroadcasterImpl : public LeAudioBroadcaster, public BigCallbacks { enum class AudioState { SUSPENDED, ACTIVE }; enum class AudioState { STOPPED, SUSPENDED, ACTIVE }; public: LeAudioBroadcasterImpl(bluetooth::le_audio::LeAudioBroadcasterCallbacks* callbacks_) Loading Loading @@ -717,7 +717,9 @@ public: le_audio_source_hal_client_->Stop(); } } audio_state_ = AudioState::SUSPENDED; /* Block AF requests to resume/suspend stream */ audio_state_ = AudioState::STOPPED; broadcasts_[broadcast_id]->SetMuted(true); broadcasts_[broadcast_id]->ProcessMessage(BroadcastStateMachine::Message::SUSPEND, nullptr); } else { Loading @@ -740,6 +742,10 @@ public: void StartAudioBroadcast(uint32_t broadcast_id) override { log::info("Starting broadcast_id={}", broadcast_id); if (com::android::bluetooth::flags::leaudio_big_depends_on_audio_state()) { /* Enable possibility for AF to drive stream */ audio_state_ = AudioState::SUSPENDED; } else { if (queued_start_broadcast_request_) { log::error("Not processed yet start broadcast request"); return; Loading Loading @@ -774,6 +780,7 @@ public: log::error("No such broadcast_id={}", broadcast_id); } } } void StopAudioBroadcast(uint32_t broadcast_id) override { if (broadcasts_.count(broadcast_id) == 0) { Loading Loading @@ -1307,6 +1314,11 @@ private: log::verbose("Received {} bytes.", data.size()); if (instance->audio_state_ == AudioState::STOPPED) { log::warn("audio stopped, skip audio data ready callback"); return; } if (!broadcast_config_.has_value() || (broadcast_config_->subgroups.size() == 0)) { log::error("Codec was not configured properly"); return; Loading Loading @@ -1349,6 +1361,11 @@ private: return; } if (instance->audio_state_ == AudioState::STOPPED) { log::warn("audio stopped, skip suspend request"); return; } instance->audio_state_ = AudioState::SUSPENDED; if (com::android::bluetooth::flags::leaudio_big_depends_on_audio_state()) { instance->UpdateAudioActiveStateInPublicAnnouncement(); Loading @@ -1362,6 +1379,12 @@ private: return; } if (instance->audio_state_ == AudioState::STOPPED) { log::warn("audio stopped, skip resume request"); instance->le_audio_source_hal_client_->CancelStreamingRequest(); return; } instance->audio_state_ = AudioState::ACTIVE; if (com::android::bluetooth::flags::leaudio_big_depends_on_audio_state()) { if (instance->broadcasts_.empty()) { Loading