diff --git a/bluetooth/audio/aidl/default/BluetoothAudioProvider.cpp b/bluetooth/audio/aidl/default/BluetoothAudioProvider.cpp index 54e82d10fc..8090d265a6 100644 --- a/bluetooth/audio/aidl/default/BluetoothAudioProvider.cpp +++ b/bluetooth/audio/aidl/default/BluetoothAudioProvider.cpp @@ -131,6 +131,8 @@ ndk::ScopedAStatus BluetoothAudioProvider::setLowLatencyModeAllowed( return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); } LOG(INFO) << __func__ << " - allowed " << allowed; + BluetoothAudioSessionReport::ReportLowLatencyModeAllowedChanged( + session_type_, allowed); return ndk::ScopedAStatus::ok(); } diff --git a/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.cpp b/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.cpp index dd29011625..967b6f3825 100644 --- a/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.cpp +++ b/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.cpp @@ -416,6 +416,22 @@ void BluetoothAudioSession::ReportControlStatus(bool start_resp, } } +void BluetoothAudioSession::ReportLowLatencyModeAllowedChanged(bool allowed) { + std::lock_guard guard(mutex_); + if (observers_.empty()) { + LOG(WARNING) << __func__ << " - SessionType=" << toString(session_type_) + << " has NO port state observer"; + return; + } + for (auto& observer : observers_) { + uint16_t cookie = observer.first; + std::shared_ptr callback = observer.second; + LOG(INFO) << __func__ << " - allowed=" + << allowed ? " allowed" : " disallowed"; + callback->low_latency_mode_allowed_cb_(cookie, allowed); + } +} + bool BluetoothAudioSession::GetPresentationPosition( PresentationPosition& presentation_position) { std::lock_guard guard(mutex_); diff --git a/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.h b/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.h index 5adc0e2f89..7725331781 100644 --- a/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.h +++ b/bluetooth/audio/utils/aidl_session/BluetoothAudioSession.h @@ -92,6 +92,15 @@ struct PortStatusCallbacks { * @param: cookie - indicates which bluetooth_audio output should handle ***/ std::function audio_configuration_changed_cb_; + /*** + * low_latency_mode_allowed_cb_ - when the Bluetooth stack low latency mode + * allowed or disallowed, the BluetoothAudioProvider will invoke + * this callback to report to the bluetooth_audio module. + * @param: cookie - indicates which bluetooth_audio output should handle + * @param: allowed - indicates if low latency mode is allowed + ***/ + std::function + low_latency_mode_allowed_cb_; }; class BluetoothAudioSession { @@ -155,6 +164,13 @@ class BluetoothAudioSession { ***/ void ReportAudioConfigChanged(const AudioConfiguration& audio_config); + /*** + * The report function is used to report that the Bluetooth stack has notified + * the low latency mode allowed changed, and will invoke + * low_latency_mode_allowed_changed_cb to notify registered bluetooth_audio + * outputs + ***/ + void ReportLowLatencyModeAllowedChanged(bool allowed); /*** * Those control functions are for the bluetooth_audio module to start, * suspend, stop stream, to check position, and to update metadata. diff --git a/bluetooth/audio/utils/aidl_session/BluetoothAudioSessionReport.h b/bluetooth/audio/utils/aidl_session/BluetoothAudioSessionReport.h index 18569c3827..03776b5ee8 100644 --- a/bluetooth/audio/utils/aidl_session/BluetoothAudioSessionReport.h +++ b/bluetooth/audio/utils/aidl_session/BluetoothAudioSessionReport.h @@ -78,6 +78,18 @@ class BluetoothAudioSessionReport { session_ptr->ReportAudioConfigChanged(audio_config); } } + /*** + * The API reports the Bluetooth stack has replied the changed of the low + * latency audio allowed, and will inform registered bluetooth_audio outputs + ***/ + static void ReportLowLatencyModeAllowedChanged( + const SessionType& session_type, bool allowed) { + std::shared_ptr session_ptr = + BluetoothAudioSessionInstance::GetSessionInstance(session_type); + if (session_ptr != nullptr) { + session_ptr->ReportLowLatencyModeAllowedChanged(allowed); + } + } }; } // namespace audio