From 32fe782db4699c720e0af31c8101aa5f952d5289 Mon Sep 17 00:00:00 2001 From: Mikhail Naganov Date: Fri, 12 Feb 2021 15:44:21 -0800 Subject: [PATCH] Fix HidlUtils::deviceAddressToHalImpl for HAL V4--6 Ensure that the busAddress field is used as a fallback for types of devices that may not necessary have it, e.g. for built-in microphones. Add a subset of presubmit tests for HidlUtils of V6 similar to the tests for V7. Bug: 180143301 Test: atest android.hardware.audio.common@6.0-util_tests Change-Id: I61fca8bd4342fdf496d1ca5bf2d01399fd3d34c7 --- audio/common/all-versions/default/Android.bp | 28 ++++- audio/common/all-versions/default/HidlUtils.h | 4 + .../common/all-versions/default/TEST_MAPPING | 3 + .../default/tests/hidlutils6_tests.cpp | 108 ++++++++++++++++++ .../default/tests/hidlutils_tests.cpp | 5 + 5 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 audio/common/all-versions/default/tests/hidlutils6_tests.cpp diff --git a/audio/common/all-versions/default/Android.bp b/audio/common/all-versions/default/Android.bp index 45f0b8f297..29a3d6f46e 100644 --- a/audio/common/all-versions/default/Android.bp +++ b/audio/common/all-versions/default/Android.bp @@ -114,7 +114,7 @@ cc_library_shared { ], } -cc_library_shared { +cc_library { name: "android.hardware.audio.common@6.0-util", defaults: ["android.hardware.audio.common-util_default"], srcs: [":android.hardware.audio.common-util@2-6"], @@ -149,6 +149,32 @@ cc_library { ], } +// Note: this isn't a VTS test, but rather a unit test +// to verify correctness of conversion utilities. +cc_test { + name: "android.hardware.audio.common@6.0-util_tests", + defaults: ["android.hardware.audio.common-util_default"], + + srcs: ["tests/hidlutils6_tests.cpp"], + + // Use static linking to allow running in presubmit on + // targets that don't have HAL V6. + static_libs: [ + "android.hardware.audio.common@6.0", + "android.hardware.audio.common@6.0-util", + ], + + cflags: [ + "-Werror", + "-Wall", + "-DMAJOR_VERSION=6", + "-DMINOR_VERSION=0", + "-include common/all-versions/VersionMacro.h", + ], + + test_suites: ["device-tests"], +} + // Note: this isn't a VTS test, but rather a unit test // to verify correctness of conversion utilities. cc_test { diff --git a/audio/common/all-versions/default/HidlUtils.h b/audio/common/all-versions/default/HidlUtils.h index 22b7152f99..dd4ca4d8ca 100644 --- a/audio/common/all-versions/default/HidlUtils.h +++ b/audio/common/all-versions/default/HidlUtils.h @@ -210,6 +210,9 @@ status_t HidlUtils::deviceAddressToHalImpl(const DA& device, audio_devices_t* ha *halDeviceType == AUDIO_DEVICE_IN_REMOTE_SUBMIX) { snprintf(halDeviceAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN, "%s", device.rSubmixAddress.c_str()); + } else { + // Fall back to bus address for other device types, e.g. for microphones. + snprintf(halDeviceAddress, AUDIO_DEVICE_MAX_ADDRESS_LEN, "%s", device.busAddress.c_str()); } return NO_ERROR; } @@ -249,6 +252,7 @@ status_t HidlUtils::deviceAddressFromHalImpl(audio_devices_t halDeviceType, device->rSubmixAddress = halDeviceAddress; return OK; } + // Fall back to bus address for other device types, e.g. for microphones. device->busAddress = halDeviceAddress; return NO_ERROR; } diff --git a/audio/common/all-versions/default/TEST_MAPPING b/audio/common/all-versions/default/TEST_MAPPING index 4316ccf4f5..c96511393f 100644 --- a/audio/common/all-versions/default/TEST_MAPPING +++ b/audio/common/all-versions/default/TEST_MAPPING @@ -1,5 +1,8 @@ { "presubmit": [ + { + "name": "android.hardware.audio.common@6.0-util_tests" + }, { "name": "android.hardware.audio.common@7.0-util_tests" } diff --git a/audio/common/all-versions/default/tests/hidlutils6_tests.cpp b/audio/common/all-versions/default/tests/hidlutils6_tests.cpp new file mode 100644 index 0000000000..3a24e752bc --- /dev/null +++ b/audio/common/all-versions/default/tests/hidlutils6_tests.cpp @@ -0,0 +1,108 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include + +#define LOG_TAG "HidlUtils_Test" +#include + +#include +#include + +using namespace android; +using namespace ::android::hardware::audio::common::CPP_VERSION; +using ::android::hardware::audio::common::CPP_VERSION::implementation::HidlUtils; + +// Not generated automatically because DeviceAddress contains +// an union. +// +// operator== must be defined in the same namespace as the data type. +namespace android::hardware::audio::common::CPP_VERSION { + +inline bool operator==(const DeviceAddress& lhs, const DeviceAddress& rhs) { + if (lhs.device != rhs.device) return false; + audio_devices_t halDeviceType = static_cast(lhs.device); + if (audio_is_a2dp_out_device(halDeviceType) || audio_is_a2dp_in_device(halDeviceType)) { + return lhs.address.mac == rhs.address.mac; + } else if (halDeviceType == AUDIO_DEVICE_OUT_IP || halDeviceType == AUDIO_DEVICE_IN_IP) { + return lhs.address.ipv4 == rhs.address.ipv4; + } else if (audio_is_usb_out_device(halDeviceType) || audio_is_usb_in_device(halDeviceType)) { + return lhs.address.alsa == rhs.address.alsa; + } else if (halDeviceType == AUDIO_DEVICE_OUT_REMOTE_SUBMIX || + halDeviceType == AUDIO_DEVICE_IN_REMOTE_SUBMIX) { + return lhs.rSubmixAddress == rhs.rSubmixAddress; + } + // busAddress field can be used for types other than bus, e.g. for microphones. + return lhs.busAddress == rhs.busAddress; +} + +} // namespace android::hardware::audio::common::CPP_VERSION + +static void ConvertDeviceAddress(const DeviceAddress& device) { + audio_devices_t halDeviceType; + char halDeviceAddress[AUDIO_DEVICE_MAX_ADDRESS_LEN] = {}; + EXPECT_EQ(NO_ERROR, HidlUtils::deviceAddressToHal(device, &halDeviceType, halDeviceAddress)); + DeviceAddress deviceBack; + EXPECT_EQ(NO_ERROR, + HidlUtils::deviceAddressFromHal(halDeviceType, halDeviceAddress, &deviceBack)); + EXPECT_EQ(device, deviceBack); +} + +TEST(HidlUtils6, ConvertUniqueDeviceAddress) { + DeviceAddress speaker; + speaker.device = AudioDevice::OUT_SPEAKER; + ConvertDeviceAddress(speaker); + + DeviceAddress micWithAddress; + micWithAddress.device = AudioDevice::IN_BUILTIN_MIC; + micWithAddress.busAddress = "bottom"; + ConvertDeviceAddress(micWithAddress); +} + +TEST(HidlUtils6, ConvertA2dpDeviceAddress) { + DeviceAddress a2dpSpeaker; + a2dpSpeaker.device = AudioDevice::OUT_BLUETOOTH_A2DP_SPEAKER; + a2dpSpeaker.address.mac = std::array{1, 2, 3, 4, 5, 6}; + ConvertDeviceAddress(a2dpSpeaker); +} + +TEST(HidlUtils6, ConvertIpv4DeviceAddress) { + DeviceAddress ipv4; + ipv4.device = AudioDevice::OUT_IP; + ipv4.address.ipv4 = std::array{1, 2, 3, 4}; + ConvertDeviceAddress(ipv4); +} + +TEST(HidlUtils6, ConvertUsbDeviceAddress) { + DeviceAddress usbHeadset; + usbHeadset.device = AudioDevice::OUT_USB_HEADSET; + usbHeadset.address.alsa = {1, 2}; + ConvertDeviceAddress(usbHeadset); +} + +TEST(HidlUtils6, ConvertBusDeviceAddress) { + DeviceAddress bus; + bus.device = AudioDevice::OUT_BUS; + bus.busAddress = "bus_device"; + ConvertDeviceAddress(bus); +} + +TEST(HidlUtils6, ConvertRSubmixDeviceAddress) { + DeviceAddress rSubmix; + rSubmix.device = AudioDevice::OUT_REMOTE_SUBMIX; + rSubmix.rSubmixAddress = AUDIO_REMOTE_SUBMIX_DEVICE_ADDRESS; + ConvertDeviceAddress(rSubmix); +} diff --git a/audio/common/all-versions/default/tests/hidlutils_tests.cpp b/audio/common/all-versions/default/tests/hidlutils_tests.cpp index 40fc5c81c6..8a13bcded6 100644 --- a/audio/common/all-versions/default/tests/hidlutils_tests.cpp +++ b/audio/common/all-versions/default/tests/hidlutils_tests.cpp @@ -476,6 +476,11 @@ TEST(HidlUtils, ConvertUniqueDeviceAddress) { DeviceAddress speaker; speaker.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_OUT_SPEAKER); ConvertDeviceAddress(speaker); + + DeviceAddress micWithAddress; + micWithAddress.deviceType = toString(xsd::AudioDevice::AUDIO_DEVICE_IN_BUILTIN_MIC); + micWithAddress.address.id("bottom"); + ConvertDeviceAddress(micWithAddress); } TEST(HidlUtils, ConvertA2dpDeviceAddress) {