From b4f8e67e1c1b195f69eace6ba7dbbb4e1569e506 Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Fri, 10 Mar 2023 09:19:35 -0800 Subject: [PATCH] audio: Add offload reconfiguration event to IBluetoothLe Since BT LE can also have offloaded codecs, it might need a reconfiguration event similar to the one that BT A2DP receives. Bug: 272658632 Test: atest VtsHalAudioCoreTargetTest Change-Id: I04fb7c99f0457f87e1f4aaf7e77165317163387b --- .../hardware/audio/core/IBluetoothLe.aidl | 2 ++ .../hardware/audio/core/IBluetoothA2dp.aidl | 6 ++-- .../hardware/audio/core/IBluetoothLe.aidl | 31 +++++++++++++++++++ audio/aidl/default/Bluetooth.cpp | 13 ++++++++ .../default/include/core-impl/Bluetooth.h | 4 +++ .../vts/VtsHalAudioCoreModuleTargetTest.cpp | 17 ++++++++++ 6 files changed, 70 insertions(+), 3 deletions(-) diff --git a/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IBluetoothLe.aidl b/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IBluetoothLe.aidl index f29e1fd282..2068daf431 100644 --- a/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IBluetoothLe.aidl +++ b/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IBluetoothLe.aidl @@ -36,4 +36,6 @@ package android.hardware.audio.core; interface IBluetoothLe { boolean isEnabled(); void setEnabled(boolean enabled); + boolean supportsOffloadReconfiguration(); + void reconfigureOffload(in android.hardware.audio.core.VendorParameter[] parameters); } diff --git a/audio/aidl/android/hardware/audio/core/IBluetoothA2dp.aidl b/audio/aidl/android/hardware/audio/core/IBluetoothA2dp.aidl index c4dd7382cf..a690ca4e08 100644 --- a/audio/aidl/android/hardware/audio/core/IBluetoothA2dp.aidl +++ b/audio/aidl/android/hardware/audio/core/IBluetoothA2dp.aidl @@ -55,7 +55,7 @@ interface IBluetoothA2dp { /** * Indicates whether the module supports reconfiguration of offloaded codecs. * - * Offloaded coded implementations may need to be reconfigured when the + * Offloaded codec implementations may need to be reconfigured when the * active A2DP device changes. This method indicates whether the HAL module * supports the reconfiguration event. The result returned from this method * must not change over time. @@ -67,11 +67,11 @@ interface IBluetoothA2dp { /** * Instructs the HAL module to reconfigure offloaded codec. * - * Offloaded coded implementations may need to be reconfigured when the + * Offloaded codec implementations may need to be reconfigured when the * active A2DP device changes. This method is a notification for the HAL * module to commence reconfiguration. * - * Note that 'EX_UNSUPPORTED_OPERATION' may only be thrown when + * Note that 'EX_UNSUPPORTED_OPERATION' must be thrown if and only if * 'supportsOffloadReconfiguration' returns 'false'. * * @param parameter Optional vendor-specific parameters, can be left empty. diff --git a/audio/aidl/android/hardware/audio/core/IBluetoothLe.aidl b/audio/aidl/android/hardware/audio/core/IBluetoothLe.aidl index 272f8626e2..444ff68262 100644 --- a/audio/aidl/android/hardware/audio/core/IBluetoothLe.aidl +++ b/audio/aidl/android/hardware/audio/core/IBluetoothLe.aidl @@ -16,6 +16,8 @@ package android.hardware.audio.core; +import android.hardware.audio.core.VendorParameter; + /** * An instance of IBluetoothLe manages settings for the LE (Low Energy) * profiles. This interface is optional to implement by the vendor. It needs to @@ -48,4 +50,33 @@ interface IBluetoothLe { * @throws EX_ILLEGAL_STATE If there was an error performing the operation. */ void setEnabled(boolean enabled); + + /** + * Indicates whether the module supports reconfiguration of offloaded codecs. + * + * Offloaded codec implementations may need to be reconfigured when the + * active LE device changes. This method indicates whether the HAL module + * supports the reconfiguration event. The result returned from this method + * must not change over time. + * + * @return Whether reconfiguration offload of offloaded codecs is supported. + */ + boolean supportsOffloadReconfiguration(); + + /** + * Instructs the HAL module to reconfigure offloaded codec. + * + * Offloaded codec implementations may need to be reconfigured when the + * active LE device changes. This method is a notification for the HAL + * module to commence reconfiguration. + * + * Note that 'EX_UNSUPPORTED_OPERATION' must be thrown if and only if + * 'supportsOffloadReconfiguration' returns 'false'. + * + * @param parameter Optional vendor-specific parameters, can be left empty. + * @throws EX_ILLEGAL_STATE If there was an error performing the operation, + * or the operation can not be commenced in the current state. + * @throws EX_UNSUPPORTED_OPERATION If the module does not support codec reconfiguration. + */ + void reconfigureOffload(in VendorParameter[] parameters); } diff --git a/audio/aidl/default/Bluetooth.cpp b/audio/aidl/default/Bluetooth.cpp index 8115e7b393..c32b538ecc 100644 --- a/audio/aidl/default/Bluetooth.cpp +++ b/audio/aidl/default/Bluetooth.cpp @@ -117,4 +117,17 @@ ndk::ScopedAStatus BluetoothLe::setEnabled(bool in_enabled) { return ndk::ScopedAStatus::ok(); } +ndk::ScopedAStatus BluetoothLe::supportsOffloadReconfiguration(bool* _aidl_return) { + *_aidl_return = true; + LOG(DEBUG) << __func__ << ": returning " << *_aidl_return; + return ndk::ScopedAStatus::ok(); +} + +ndk::ScopedAStatus BluetoothLe::reconfigureOffload( + const std::vector<::aidl::android::hardware::audio::core::VendorParameter>& in_parameters + __unused) { + LOG(DEBUG) << __func__ << ": " << ::android::internal::ToString(in_parameters); + return ndk::ScopedAStatus::ok(); +} + } // namespace aidl::android::hardware::audio::core diff --git a/audio/aidl/default/include/core-impl/Bluetooth.h b/audio/aidl/default/include/core-impl/Bluetooth.h index 1cd0355ea7..10e9045042 100644 --- a/audio/aidl/default/include/core-impl/Bluetooth.h +++ b/audio/aidl/default/include/core-impl/Bluetooth.h @@ -56,6 +56,10 @@ class BluetoothLe : public BnBluetoothLe { private: ndk::ScopedAStatus isEnabled(bool* _aidl_return) override; ndk::ScopedAStatus setEnabled(bool in_enabled) override; + ndk::ScopedAStatus supportsOffloadReconfiguration(bool* _aidl_return) override; + ndk::ScopedAStatus reconfigureOffload( + const std::vector<::aidl::android::hardware::audio::core::VendorParameter>& + in_parameters) override; bool mEnabled = false; }; diff --git a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp index 650a543688..387ee8dca5 100644 --- a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp +++ b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp @@ -2148,6 +2148,23 @@ TEST_P(AudioCoreBluetoothLe, Enabled) { << "setEnabled without actual state change must not fail"; } +TEST_P(AudioCoreBluetoothLe, OffloadReconfiguration) { + if (bluetooth == nullptr) { + GTEST_SKIP() << "BluetoothLe is not supported"; + } + bool isSupported; + ASSERT_IS_OK(bluetooth->supportsOffloadReconfiguration(&isSupported)); + bool isSupported2; + ASSERT_IS_OK(bluetooth->supportsOffloadReconfiguration(&isSupported2)); + EXPECT_EQ(isSupported, isSupported2); + if (isSupported) { + static const auto kStatuses = {EX_NONE, EX_ILLEGAL_STATE}; + EXPECT_STATUS(kStatuses, bluetooth->reconfigureOffload({})); + } else { + EXPECT_STATUS(EX_UNSUPPORTED_OPERATION, bluetooth->reconfigureOffload({})); + } +} + class AudioCoreTelephony : public AudioCoreModuleBase, public testing::TestWithParam { public: void SetUp() override {