Loading system/bta/le_audio/client.cc +26 −16 Original line number Diff line number Diff line Loading @@ -291,6 +291,7 @@ public: sink_monitor_mode_(false), sink_monitor_notified_status_(std::nullopt), source_monitor_mode_(false), source_monitor_notified_status_(std::nullopt), le_audio_source_hal_client_(nullptr), le_audio_sink_hal_client_(nullptr), close_vbc_timeout_(alarm_new("LeAudioCloseVbcTimeout")), Loading Loading @@ -1037,8 +1038,7 @@ public: * when there would be request to stream unicast. */ if (!sink_monitor_mode_ && source_monitor_mode_ && !group_is_streaming) { callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING_REQUESTED); notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_REQUESTED); } bool result = groupStateMachine_->StartStream(group, configuration_context_type, Loading Loading @@ -1279,18 +1279,15 @@ public: LeAudioDeviceGroup* group = aseGroups_.FindById(active_group_id_); if (!group) { callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING_SUSPENDED); notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_SUSPENDED); return; } if (group->IsStreaming()) { callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING); notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING); } else { callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING_SUSPENDED); notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_SUSPENDED); } } else { log::error("invalid direction: 0x{:02x} monitor mode set", direction); Loading Loading @@ -1426,6 +1423,7 @@ public: return; } sink_monitor_notified_status_ = std::nullopt; source_monitor_notified_status_ = std::nullopt; log::info("Group id: {}", active_group_id_); StopSuspendTimeout(); Loading Loading @@ -1576,8 +1574,9 @@ public: */ } /* Reset sink listener notified status */ /* Reset sink and source listener notified status */ sink_monitor_notified_status_ = std::nullopt; source_monitor_notified_status_ = std::nullopt; if (com::android::bluetooth::flags::leaudio_codec_config_callback_order_fix()) { SendAudioGroupSelectableCodecConfigChanged(group); SendAudioGroupCurrentCodecConfigChanged(group); Loading Loading @@ -4038,6 +4037,10 @@ public: << static_cast<int>(sink_monitor_notified_status_.value()) << "\n"; } stream << " Source monitor mode: " << (source_monitor_mode_ ? "true" : "false") << "\n"; if (source_monitor_notified_status_) { dprintf(fd, " Local source notified state: %d\n", static_cast<int>(source_monitor_notified_status_.value())); } auto codec_loc = CodecManager::GetInstance()->GetCodecLocation(); if (codec_loc == bluetooth::le_audio::types::CodecLocation::HOST) { Loading Loading @@ -4149,9 +4152,7 @@ public: if (com::android::bluetooth::flags::leaudio_no_context_validate_streaming_request() && source_monitor_mode_) { callbacks_->OnUnicastMonitorModeStatus( bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING_REQUESTED_NO_CONTEXT_VALIDATE); notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_REQUESTED_NO_CONTEXT_VALIDATE); return false; } Loading Loading @@ -4486,6 +4487,15 @@ public: } } void notifyAudioLocalSource(UnicastMonitorModeStatus status) { if (source_monitor_notified_status_ != status) { log::info("Source stream monitoring status changed to: {}", static_cast<int>(status)); source_monitor_notified_status_ = status; callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource, status); } } void OnLocalAudioSinkResume() { log::info("active group_id: {} IN: audio_receiver_state_: {}, audio_sender_state_: {}", active_group_id_, ToString(audio_receiver_state_), ToString(audio_sender_state_)); Loading Loading @@ -5793,9 +5803,7 @@ public: } if (source_monitor_mode_) { callbacks_->OnUnicastMonitorModeStatus( bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING_SUSPENDED); notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_SUSPENDED); } } } Loading Loading @@ -5881,10 +5889,12 @@ private: bool in_voip_call_; /* Listen for streaming status on Sink stream */ bool sink_monitor_mode_; /* Status which has been notified to Service */ /* Sink stream status which has been notified to Service */ std::optional<UnicastMonitorModeStatus> sink_monitor_notified_status_; /* Listen for streaming status on Source stream */ bool source_monitor_mode_; /* Source stream status which has been notified to Service */ std::optional<UnicastMonitorModeStatus> source_monitor_notified_status_; /* Reconnection mode */ tBTM_BLE_CONN_TYPE reconnection_mode_; Loading system/bta/le_audio/le_audio_client_test.cc +21 −0 Original line number Diff line number Diff line Loading @@ -12289,6 +12289,27 @@ TEST_F(UnicastTestHandoverMode, SetSourceMonitorModeWhileUnicastIsInactive) { Mock::VerifyAndClearExpectations(&mock_audio_hal_client_callbacks_); } TEST_F(UnicastTestHandoverMode, SetTwiceSourceMonitorModeWhileUnicastIsInactive) { /* Enabling monitor mode for source while group is not active should result in * sending STREAMING_SUSPENDED notification. */ EXPECT_CALL(mock_audio_hal_client_callbacks_, OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING_SUSPENDED)) .Times(1); // Imitate activation of monitor mode do_in_main_thread(base::BindOnce( &LeAudioClient::SetUnicastMonitorMode, base::Unretained(LeAudioClient::Get()), bluetooth::le_audio::types::kLeAudioDirectionSource, true /* enable */)); // Imitate second activation of monitor mode - should not be notified do_in_main_thread(base::BindOnce( &LeAudioClient::SetUnicastMonitorMode, base::Unretained(LeAudioClient::Get()), bluetooth::le_audio::types::kLeAudioDirectionSource, true /* enable */)); SyncOnMainLoop(); Mock::VerifyAndClearExpectations(&mock_audio_hal_client_callbacks_); } TEST_F(UnicastTestHandoverMode, SetSourceMonitorModeWhileUnicastIsNotStreaming) { int group_id = 2; Loading
system/bta/le_audio/client.cc +26 −16 Original line number Diff line number Diff line Loading @@ -291,6 +291,7 @@ public: sink_monitor_mode_(false), sink_monitor_notified_status_(std::nullopt), source_monitor_mode_(false), source_monitor_notified_status_(std::nullopt), le_audio_source_hal_client_(nullptr), le_audio_sink_hal_client_(nullptr), close_vbc_timeout_(alarm_new("LeAudioCloseVbcTimeout")), Loading Loading @@ -1037,8 +1038,7 @@ public: * when there would be request to stream unicast. */ if (!sink_monitor_mode_ && source_monitor_mode_ && !group_is_streaming) { callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING_REQUESTED); notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_REQUESTED); } bool result = groupStateMachine_->StartStream(group, configuration_context_type, Loading Loading @@ -1279,18 +1279,15 @@ public: LeAudioDeviceGroup* group = aseGroups_.FindById(active_group_id_); if (!group) { callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING_SUSPENDED); notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_SUSPENDED); return; } if (group->IsStreaming()) { callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING); notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING); } else { callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING_SUSPENDED); notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_SUSPENDED); } } else { log::error("invalid direction: 0x{:02x} monitor mode set", direction); Loading Loading @@ -1426,6 +1423,7 @@ public: return; } sink_monitor_notified_status_ = std::nullopt; source_monitor_notified_status_ = std::nullopt; log::info("Group id: {}", active_group_id_); StopSuspendTimeout(); Loading Loading @@ -1576,8 +1574,9 @@ public: */ } /* Reset sink listener notified status */ /* Reset sink and source listener notified status */ sink_monitor_notified_status_ = std::nullopt; source_monitor_notified_status_ = std::nullopt; if (com::android::bluetooth::flags::leaudio_codec_config_callback_order_fix()) { SendAudioGroupSelectableCodecConfigChanged(group); SendAudioGroupCurrentCodecConfigChanged(group); Loading Loading @@ -4038,6 +4037,10 @@ public: << static_cast<int>(sink_monitor_notified_status_.value()) << "\n"; } stream << " Source monitor mode: " << (source_monitor_mode_ ? "true" : "false") << "\n"; if (source_monitor_notified_status_) { dprintf(fd, " Local source notified state: %d\n", static_cast<int>(source_monitor_notified_status_.value())); } auto codec_loc = CodecManager::GetInstance()->GetCodecLocation(); if (codec_loc == bluetooth::le_audio::types::CodecLocation::HOST) { Loading Loading @@ -4149,9 +4152,7 @@ public: if (com::android::bluetooth::flags::leaudio_no_context_validate_streaming_request() && source_monitor_mode_) { callbacks_->OnUnicastMonitorModeStatus( bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING_REQUESTED_NO_CONTEXT_VALIDATE); notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_REQUESTED_NO_CONTEXT_VALIDATE); return false; } Loading Loading @@ -4486,6 +4487,15 @@ public: } } void notifyAudioLocalSource(UnicastMonitorModeStatus status) { if (source_monitor_notified_status_ != status) { log::info("Source stream monitoring status changed to: {}", static_cast<int>(status)); source_monitor_notified_status_ = status; callbacks_->OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource, status); } } void OnLocalAudioSinkResume() { log::info("active group_id: {} IN: audio_receiver_state_: {}, audio_sender_state_: {}", active_group_id_, ToString(audio_receiver_state_), ToString(audio_sender_state_)); Loading Loading @@ -5793,9 +5803,7 @@ public: } if (source_monitor_mode_) { callbacks_->OnUnicastMonitorModeStatus( bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING_SUSPENDED); notifyAudioLocalSource(UnicastMonitorModeStatus::STREAMING_SUSPENDED); } } } Loading Loading @@ -5881,10 +5889,12 @@ private: bool in_voip_call_; /* Listen for streaming status on Sink stream */ bool sink_monitor_mode_; /* Status which has been notified to Service */ /* Sink stream status which has been notified to Service */ std::optional<UnicastMonitorModeStatus> sink_monitor_notified_status_; /* Listen for streaming status on Source stream */ bool source_monitor_mode_; /* Source stream status which has been notified to Service */ std::optional<UnicastMonitorModeStatus> source_monitor_notified_status_; /* Reconnection mode */ tBTM_BLE_CONN_TYPE reconnection_mode_; Loading
system/bta/le_audio/le_audio_client_test.cc +21 −0 Original line number Diff line number Diff line Loading @@ -12289,6 +12289,27 @@ TEST_F(UnicastTestHandoverMode, SetSourceMonitorModeWhileUnicastIsInactive) { Mock::VerifyAndClearExpectations(&mock_audio_hal_client_callbacks_); } TEST_F(UnicastTestHandoverMode, SetTwiceSourceMonitorModeWhileUnicastIsInactive) { /* Enabling monitor mode for source while group is not active should result in * sending STREAMING_SUSPENDED notification. */ EXPECT_CALL(mock_audio_hal_client_callbacks_, OnUnicastMonitorModeStatus(bluetooth::le_audio::types::kLeAudioDirectionSource, UnicastMonitorModeStatus::STREAMING_SUSPENDED)) .Times(1); // Imitate activation of monitor mode do_in_main_thread(base::BindOnce( &LeAudioClient::SetUnicastMonitorMode, base::Unretained(LeAudioClient::Get()), bluetooth::le_audio::types::kLeAudioDirectionSource, true /* enable */)); // Imitate second activation of monitor mode - should not be notified do_in_main_thread(base::BindOnce( &LeAudioClient::SetUnicastMonitorMode, base::Unretained(LeAudioClient::Get()), bluetooth::le_audio::types::kLeAudioDirectionSource, true /* enable */)); SyncOnMainLoop(); Mock::VerifyAndClearExpectations(&mock_audio_hal_client_callbacks_); } TEST_F(UnicastTestHandoverMode, SetSourceMonitorModeWhileUnicastIsNotStreaming) { int group_id = 2;