diff --git a/audio/7.1/config/api/current.txt b/audio/7.1/config/api/current.txt index 2963904fea..75fc5c0447 100644 --- a/audio/7.1/config/api/current.txt +++ b/audio/7.1/config/api/current.txt @@ -86,6 +86,7 @@ package android.audio.policy.configuration.V7_1 { enum_constant public static final android.audio.policy.configuration.V7_1.AudioContentType AUDIO_CONTENT_TYPE_MUSIC; enum_constant public static final android.audio.policy.configuration.V7_1.AudioContentType AUDIO_CONTENT_TYPE_SONIFICATION; enum_constant public static final android.audio.policy.configuration.V7_1.AudioContentType AUDIO_CONTENT_TYPE_SPEECH; + enum_constant public static final android.audio.policy.configuration.V7_1.AudioContentType AUDIO_CONTENT_TYPE_ULTRASOUND; enum_constant public static final android.audio.policy.configuration.V7_1.AudioContentType AUDIO_CONTENT_TYPE_UNKNOWN; } @@ -273,6 +274,7 @@ package android.audio.policy.configuration.V7_1 { enum_constant public static final android.audio.policy.configuration.V7_1.AudioInOutFlag AUDIO_INPUT_FLAG_MMAP_NOIRQ; enum_constant public static final android.audio.policy.configuration.V7_1.AudioInOutFlag AUDIO_INPUT_FLAG_RAW; enum_constant public static final android.audio.policy.configuration.V7_1.AudioInOutFlag AUDIO_INPUT_FLAG_SYNC; + enum_constant public static final android.audio.policy.configuration.V7_1.AudioInOutFlag AUDIO_INPUT_FLAG_ULTRASOUND; enum_constant public static final android.audio.policy.configuration.V7_1.AudioInOutFlag AUDIO_INPUT_FLAG_VOIP_TX; enum_constant public static final android.audio.policy.configuration.V7_1.AudioInOutFlag AUDIO_OUTPUT_FLAG_COMPRESS_OFFLOAD; enum_constant public static final android.audio.policy.configuration.V7_1.AudioInOutFlag AUDIO_OUTPUT_FLAG_DEEP_BUFFER; @@ -290,6 +292,7 @@ package android.audio.policy.configuration.V7_1 { enum_constant public static final android.audio.policy.configuration.V7_1.AudioInOutFlag AUDIO_OUTPUT_FLAG_SPATIALIZER; enum_constant public static final android.audio.policy.configuration.V7_1.AudioInOutFlag AUDIO_OUTPUT_FLAG_SYNC; enum_constant public static final android.audio.policy.configuration.V7_1.AudioInOutFlag AUDIO_OUTPUT_FLAG_TTS; + enum_constant public static final android.audio.policy.configuration.V7_1.AudioInOutFlag AUDIO_OUTPUT_FLAG_ULTRASOUND; enum_constant public static final android.audio.policy.configuration.V7_1.AudioInOutFlag AUDIO_OUTPUT_FLAG_VOIP_RX; } @@ -314,6 +317,7 @@ package android.audio.policy.configuration.V7_1 { enum_constant public static final android.audio.policy.configuration.V7_1.AudioSource AUDIO_SOURCE_HOTWORD; enum_constant public static final android.audio.policy.configuration.V7_1.AudioSource AUDIO_SOURCE_MIC; enum_constant public static final android.audio.policy.configuration.V7_1.AudioSource AUDIO_SOURCE_REMOTE_SUBMIX; + enum_constant public static final android.audio.policy.configuration.V7_1.AudioSource AUDIO_SOURCE_ULTRASOUND; enum_constant public static final android.audio.policy.configuration.V7_1.AudioSource AUDIO_SOURCE_UNPROCESSED; enum_constant public static final android.audio.policy.configuration.V7_1.AudioSource AUDIO_SOURCE_VOICE_CALL; enum_constant public static final android.audio.policy.configuration.V7_1.AudioSource AUDIO_SOURCE_VOICE_COMMUNICATION; @@ -355,6 +359,7 @@ package android.audio.policy.configuration.V7_1 { enum_constant public static final android.audio.policy.configuration.V7_1.AudioUsage AUDIO_USAGE_GAME; enum_constant public static final android.audio.policy.configuration.V7_1.AudioUsage AUDIO_USAGE_MEDIA; enum_constant public static final android.audio.policy.configuration.V7_1.AudioUsage AUDIO_USAGE_NOTIFICATION; + enum_constant public static final android.audio.policy.configuration.V7_1.AudioUsage AUDIO_USAGE_NOTIFICATION_EVENT; enum_constant public static final android.audio.policy.configuration.V7_1.AudioUsage AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE; enum_constant public static final android.audio.policy.configuration.V7_1.AudioUsage AUDIO_USAGE_SAFETY; enum_constant public static final android.audio.policy.configuration.V7_1.AudioUsage AUDIO_USAGE_UNKNOWN; diff --git a/audio/7.1/config/audio_policy_configuration.xsd b/audio/7.1/config/audio_policy_configuration.xsd index 414552e89f..7e1da90519 100644 --- a/audio/7.1/config/audio_policy_configuration.xsd +++ b/audio/7.1/config/audio_policy_configuration.xsd @@ -180,6 +180,7 @@ + @@ -188,6 +189,7 @@ + @@ -441,6 +443,7 @@ + @@ -471,6 +474,7 @@ + @@ -742,6 +746,7 @@ + diff --git a/audio/common/all-versions/default/7.0/HidlUtils.cpp b/audio/common/all-versions/default/7.0/HidlUtils.cpp index 218d7c06b7..0fd2947963 100644 --- a/audio/common/all-versions/default/7.0/HidlUtils.cpp +++ b/audio/common/all-versions/default/7.0/HidlUtils.cpp @@ -485,8 +485,12 @@ status_t HidlUtils::audioGainToHal(const AudioGain& gain, struct audio_gain* hal status_t HidlUtils::audioUsageFromHal(audio_usage_t halUsage, AudioUsage* usage) { if (halUsage == AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST || halUsage == AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT || +#if MAJOR_VERSION == 7 && MINOR_VERSION == 1 + halUsage == AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED) { +#else halUsage == AUDIO_USAGE_NOTIFICATION_COMMUNICATION_DELAYED || halUsage == AUDIO_USAGE_NOTIFICATION_EVENT) { +#endif halUsage = AUDIO_USAGE_NOTIFICATION; } *usage = audio_usage_to_string(halUsage); diff --git a/audio/common/all-versions/default/Android.bp b/audio/common/all-versions/default/Android.bp index 8f557449f1..a25565d40c 100644 --- a/audio/common/all-versions/default/Android.bp +++ b/audio/common/all-versions/default/Android.bp @@ -157,6 +157,28 @@ cc_library { ], } +cc_library { + name: "android.hardware.audio.common@7.1-util", + defaults: ["android.hardware.audio.common-util_default"], + srcs: [ + "7.0/HidlUtils.cpp", + "HidlUtilsCommon.cpp", + "UuidUtils.cpp", + ], + shared_libs: [ + "android.hardware.audio.common@7.0", + "android.hardware.audio.common@7.1-enums", + "libbase", + ], + cflags: [ + "-DMAJOR_VERSION=7", + "-DMINOR_VERSION=1", + "-DCOMMON_TYPES_MINOR_VERSION=0", + "-DCORE_TYPES_MINOR_VERSION=0", + "-include common/all-versions/VersionMacro.h", + ], +} + // Note: this isn't a VTS test, but rather a unit test // to verify correctness of conversion utilities. cc_test { @@ -214,3 +236,35 @@ cc_test { test_suites: ["device-tests"], } + +cc_test { + name: "android.hardware.audio.common@7.1-util_tests", + defaults: ["android.hardware.audio.common-util_default"], + + srcs: ["tests/hidlutils_tests.cpp"], + + // Use static linking to allow running in presubmit on + // targets that don't have HAL V7.1. + static_libs: [ + "android.hardware.audio.common@7.1-enums", + "android.hardware.audio.common@7.1-util", + "android.hardware.audio.common@7.0", + ], + + shared_libs: [ + "libbase", + "libxml2", + ], + + cflags: [ + "-Werror", + "-Wall", + "-DMAJOR_VERSION=7", + "-DMINOR_VERSION=1", + "-DCOMMON_TYPES_MINOR_VERSION=0", + "-DCORE_TYPES_MINOR_VERSION=0", + "-include common/all-versions/VersionMacro.h", + ], + + test_suites: ["device-tests"], +} diff --git a/audio/common/all-versions/default/HidlUtilsCommon.cpp b/audio/common/all-versions/default/HidlUtilsCommon.cpp index d2da1939f5..bc3d8702c9 100644 --- a/audio/common/all-versions/default/HidlUtilsCommon.cpp +++ b/audio/common/all-versions/default/HidlUtilsCommon.cpp @@ -20,7 +20,7 @@ namespace android { namespace hardware { namespace audio { namespace common { -namespace CPP_VERSION { +namespace COMMON_TYPES_CPP_VERSION { namespace implementation { status_t HidlUtils::audioPortConfigsFromHal(unsigned int numHalConfigs, @@ -51,7 +51,7 @@ status_t HidlUtils::audioPortConfigsToHal(const hidl_vec& confi } } // namespace implementation -} // namespace CPP_VERSION +} // namespace COMMON_TYPES_CPP_VERSION } // namespace common } // namespace audio } // namespace hardware diff --git a/audio/common/all-versions/default/TEST_MAPPING b/audio/common/all-versions/default/TEST_MAPPING index c96511393f..780beeab0d 100644 --- a/audio/common/all-versions/default/TEST_MAPPING +++ b/audio/common/all-versions/default/TEST_MAPPING @@ -5,6 +5,9 @@ }, { "name": "android.hardware.audio.common@7.0-util_tests" + }, + { + "name": "android.hardware.audio.common@7.1-util_tests" } ] } diff --git a/audio/common/all-versions/default/tests/hidlutils_tests.cpp b/audio/common/all-versions/default/tests/hidlutils_tests.cpp index 2749cce748..ec16b0252f 100644 --- a/audio/common/all-versions/default/tests/hidlutils_tests.cpp +++ b/audio/common/all-versions/default/tests/hidlutils_tests.cpp @@ -23,7 +23,7 @@ #include #include -#include +#include PATH(APM_XSD_ENUMS_H_FILENAME) #include #include @@ -32,7 +32,7 @@ using ::android::hardware::hidl_vec; using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION; using ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION::implementation::HidlUtils; namespace xsd { -using namespace ::android::audio::policy::configuration::V7_0; +using namespace ::android::audio::policy::configuration::CPP_VERSION; } static constexpr audio_channel_mask_t kInvalidHalChannelMask = AUDIO_CHANNEL_INVALID; diff --git a/audio/core/all-versions/default/Android.bp b/audio/core/all-versions/default/Android.bp index df688fd909..3536561fd3 100644 --- a/audio/core/all-versions/default/Android.bp +++ b/audio/core/all-versions/default/Android.bp @@ -168,10 +168,10 @@ cc_defaults { shared_libs: [ "android.hardware.audio@7.0", "android.hardware.audio@7.1", - "android.hardware.audio@7.0-util", + "android.hardware.audio@7.1-util", "android.hardware.audio.common@7.0", "android.hardware.audio.common@7.1-enums", - "android.hardware.audio.common@7.0-util", + "android.hardware.audio.common@7.1-util", "libbase", ], cflags: [ diff --git a/audio/core/all-versions/default/TEST_MAPPING b/audio/core/all-versions/default/TEST_MAPPING index 1e2944060b..07e98f37d2 100644 --- a/audio/core/all-versions/default/TEST_MAPPING +++ b/audio/core/all-versions/default/TEST_MAPPING @@ -3,6 +3,9 @@ { "name": "android.hardware.audio@7.0-util_tests" }, + { + "name": "android.hardware.audio@7.1-util_tests" + }, { "name": "HalAudioV6_0GeneratorTest" }, diff --git a/audio/core/all-versions/default/util/Android.bp b/audio/core/all-versions/default/util/Android.bp index 7caf18ddfd..b96f2d2b87 100644 --- a/audio/core/all-versions/default/util/Android.bp +++ b/audio/core/all-versions/default/util/Android.bp @@ -112,6 +112,25 @@ cc_library { ], } +cc_library { + name: "android.hardware.audio@7.1-util", + defaults: ["android.hardware.audio-util_default"], + shared_libs: [ + "android.hardware.audio.common@7.0", + "android.hardware.audio.common@7.1-enums", + "android.hardware.audio.common@7.1-util", + "android.hardware.audio@7.1", + "libbase", + ], + cflags: [ + "-DMAJOR_VERSION=7", + "-DMINOR_VERSION=1", + "-DCOMMON_TYPES_MINOR_VERSION=0", + "-DCORE_TYPES_MINOR_VERSION=0", + "-include common/all-versions/VersionMacro.h", + ], +} + // Note: this isn't a VTS test, but rather a unit test // to verify correctness of conversion utilities. cc_test { @@ -145,3 +164,37 @@ cc_test { test_suites: ["device-tests"], } + +cc_test { + name: "android.hardware.audio@7.1-util_tests", + defaults: ["android.hardware.audio-util_default"], + + srcs: ["tests/coreutils_tests.cpp"], + + // Use static linking to allow running in presubmit on + // targets that don't have HAL V7.1. + static_libs: [ + "android.hardware.audio.common@7.0", + "android.hardware.audio.common@7.1-enums", + "android.hardware.audio.common@7.1-util", + "android.hardware.audio@7.1", + "android.hardware.audio@7.1-util", + ], + + shared_libs: [ + "libbase", + "libxml2", + ], + + cflags: [ + "-Werror", + "-Wall", + "-DMAJOR_VERSION=7", + "-DMINOR_VERSION=1", + "-DCOMMON_TYPES_MINOR_VERSION=0", + "-DCORE_TYPES_MINOR_VERSION=0", + "-include common/all-versions/VersionMacro.h", + ], + + test_suites: ["device-tests"], +} diff --git a/audio/core/all-versions/default/util/tests/coreutils_tests.cpp b/audio/core/all-versions/default/util/tests/coreutils_tests.cpp index 3976b088e4..0e15960792 100644 --- a/audio/core/all-versions/default/util/tests/coreutils_tests.cpp +++ b/audio/core/all-versions/default/util/tests/coreutils_tests.cpp @@ -22,18 +22,18 @@ #define LOG_TAG "CoreUtils_Test" #include -#include +#include PATH(APM_XSD_ENUMS_H_FILENAME) #include #include #include using namespace android; using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION; -using namespace ::android::hardware::audio::CPP_VERSION; +using namespace ::android::hardware::audio::CORE_TYPES_CPP_VERSION; using ::android::hardware::hidl_vec; -using ::android::hardware::audio::CPP_VERSION::implementation::CoreUtils; +using ::android::hardware::audio::CORE_TYPES_CPP_VERSION::implementation::CoreUtils; namespace xsd { -using namespace ::android::audio::policy::configuration::V7_0; +using namespace ::android::audio::policy::configuration::CPP_VERSION; } static constexpr audio_channel_mask_t kInvalidHalChannelMask = AUDIO_CHANNEL_INVALID; diff --git a/audio/core/all-versions/vts/functional/4.0/AudioPrimaryHidlHalTest.cpp b/audio/core/all-versions/vts/functional/4.0/AudioPrimaryHidlHalTest.cpp index a9797bbfbd..7f4a777d7f 100644 --- a/audio/core/all-versions/vts/functional/4.0/AudioPrimaryHidlHalTest.cpp +++ b/audio/core/all-versions/vts/functional/4.0/AudioPrimaryHidlHalTest.cpp @@ -28,8 +28,7 @@ TEST_P(AudioHidlTest, OpenPrimaryDeviceUsingGetDevice) { if (getDeviceName() != DeviceManager::kPrimaryDevice) { GTEST_SKIP() << "No primary device on this factory"; // returns } - EXPECT_TRUE( - DeviceManager::getInstance().reset(getFactoryName(), DeviceManager::kPrimaryDevice)); + EXPECT_TRUE(DeviceManager::getInstance().resetPrimary(getFactoryName())); // Must use IDevicesFactory directly because DeviceManager always uses // the latest interfaces version and corresponding methods for opening diff --git a/audio/core/all-versions/vts/functional/Android.bp b/audio/core/all-versions/vts/functional/Android.bp index d810c5567a..03708957e4 100644 --- a/audio/core/all-versions/vts/functional/Android.bp +++ b/audio/core/all-versions/vts/functional/Android.bp @@ -195,7 +195,7 @@ cc_test { "android.hardware.audio.common@7.0", "android.hardware.audio.common@7.0-enums", "android.hardware.audio.common@7.1-enums", - "android.hardware.audio.common@7.0-util", + "android.hardware.audio.common@7.1-util", ], cflags: [ "-DMAJOR_VERSION=7", diff --git a/audio/core/all-versions/vts/functional/DeviceManager.h b/audio/core/all-versions/vts/functional/DeviceManager.h index c8e016731d..6bb39ed3ce 100644 --- a/audio/core/all-versions/vts/functional/DeviceManager.h +++ b/audio/core/all-versions/vts/functional/DeviceManager.h @@ -96,40 +96,83 @@ class DevicesFactoryManager } }; -using FactoryAndDevice = std::tuple; -class DeviceManager : public InterfaceManager { +namespace impl { + +class PrimaryDeviceManager + : public InterfaceManager { public: - static DeviceManager& getInstance() { - static DeviceManager instance; - return instance; + static sp createInterfaceInstance(const std::string& factoryName) { + sp factory = DevicesFactoryManager::getInstance().get(factoryName); + return openPrimaryDevice(factory); } + + bool reset(const std::string& factoryName) __attribute__((warn_unused_result)) { +#if MAJOR_VERSION <= 5 + return InterfaceManager::reset(factoryName, true); +#elif MAJOR_VERSION >= 6 + { + sp device = getExisting(factoryName); + if (device != nullptr) { + auto ret = device->close(); + ALOGE_IF(!ret.isOk(), "PrimaryDevice %s close failed: %s", factoryName.c_str(), + ret.description().c_str()); + } + } + return InterfaceManager::reset(factoryName, false); +#endif + } + + private: + static sp openPrimaryDevice(const sp& factory) { + if (factory == nullptr) return {}; + Result result; + sp primaryDevice; +#if !(MAJOR_VERSION == 7 && MINOR_VERSION == 1) + sp device; +#if MAJOR_VERSION == 2 + auto ret = factory->openDevice(IDevicesFactory::Device::PRIMARY, returnIn(result, device)); + if (ret.isOk() && result == Result::OK && device != nullptr) { + primaryDevice = IPrimaryDevice::castFrom(device); + } +#elif MAJOR_VERSION >= 4 + auto ret = factory->openPrimaryDevice(returnIn(result, device)); + if (ret.isOk() && result == Result::OK && device != nullptr) { + primaryDevice = IPrimaryDevice::castFrom(device); + } +#endif + if (!ret.isOk() || result != Result::OK || primaryDevice == nullptr) { + ALOGW("Primary device can not be opened, transaction: %s, result %d, device %p", + ret.description().c_str(), result, device.get()); + return nullptr; + } +#else // V7.1 + auto ret = factory->openPrimaryDevice_7_1(returnIn(result, primaryDevice)); + if (!ret.isOk() || result != Result::OK) { + ALOGW("Primary device can not be opened, transaction: %s, result %d", + ret.description().c_str(), result); + return nullptr; + } +#endif + return primaryDevice; + } +}; + +using FactoryAndDevice = std::tuple; +class RegularDeviceManager + : public InterfaceManager { + public: static sp createInterfaceInstance(const FactoryAndDevice& factoryAndDevice) { auto [factoryName, name] = factoryAndDevice; sp factory = DevicesFactoryManager::getInstance().get(factoryName); return openDevice(factory, name); } - using InterfaceManager::reset; - - static constexpr const char* kPrimaryDevice = "primary"; sp get(const std::string& factoryName, const std::string& name) { - if (name == kPrimaryDevice) { - (void)getPrimary(factoryName); // for initializing primaryDevice if needed. - } return InterfaceManager::get(std::make_tuple(factoryName, name)); } - sp getPrimary(const std::string& factoryName) { - if (primaryDevice == nullptr) { - sp factory = DevicesFactoryManager::getInstance().get(factoryName); - primaryDevice = openPrimaryDevice(factory); - } - return primaryDevice; - } + bool reset(const std::string& factoryName, const std::string& name) __attribute__((warn_unused_result)) { - if (name == kPrimaryDevice) { - primaryDevice.clear(); - } #if MAJOR_VERSION <= 5 return InterfaceManager::reset(std::make_tuple(factoryName, name), true); #elif MAJOR_VERSION >= 6 @@ -144,9 +187,6 @@ class DeviceManager : public InterfaceManager openDevice(const sp& factory, const std::string& name) { @@ -155,9 +195,7 @@ class DeviceManager : public InterfaceManager device; #if MAJOR_VERSION == 2 IDevicesFactory::Device dev = IDevicesFactory::IDevicesFactory::Device(-1); - if (name == AUDIO_HARDWARE_MODULE_ID_PRIMARY) { - dev = IDevicesFactory::Device::PRIMARY; - } else if (name == AUDIO_HARDWARE_MODULE_ID_A2DP) { + if (name == AUDIO_HARDWARE_MODULE_ID_A2DP) { dev = IDevicesFactory::Device::A2DP; } else if (name == AUDIO_HARDWARE_MODULE_ID_USB) { dev = IDevicesFactory::Device::USB; @@ -179,47 +217,62 @@ class DeviceManager : public InterfaceManager openPrimaryDevice(const sp& factory) { - if (factory == nullptr) return {}; - Result result; - sp device; - sp primaryDevice; -#if MAJOR_VERSION == 2 - auto ret = factory->openDevice(IDevicesFactory::Device::PRIMARY, returnIn(result, device)); - if (ret.isOk() && result == Result::OK && device != nullptr) { - primaryDevice = IPrimaryDevice::castFrom(device); +} // namespace impl + +class DeviceManager { + public: + static DeviceManager& getInstance() { + static DeviceManager instance; + return instance; + } + + static constexpr const char* kPrimaryDevice = "primary"; + + sp get(const std::string& factoryName, const std::string& name) { + if (name == kPrimaryDevice) { + auto primary = getPrimary(factoryName); + return primary ? deviceFromPrimary(primary) : nullptr; } -#elif MAJOR_VERSION >= 4 && (MAJOR_VERSION < 7 || (MAJOR_VERSION == 7 && MINOR_VERSION == 0)) - auto ret = factory->openPrimaryDevice(returnIn(result, device)); - if (ret.isOk() && result == Result::OK && device != nullptr) { - primaryDevice = IPrimaryDevice::castFrom(device); - } -#elif MAJOR_VERSION == 7 && MINOR_VERSION == 1 - auto ret = factory->openPrimaryDevice_7_1(returnIn(result, primaryDevice)); - if (ret.isOk() && result == Result::OK && primaryDevice != nullptr) { - auto getDeviceRet = primaryDevice->getDevice(); - if (getDeviceRet.isOk()) { - device = getDeviceRet; - } else { - primaryDevice.clear(); - ALOGW("Primary device can not downcast, transaction: %s, primary %p", - getDeviceRet.description().c_str(), primaryDevice.get()); - return {}; - } - } -#endif - if (!ret.isOk() || result != Result::OK || device == nullptr) { - ALOGW("Primary device can not be opened, transaction: %s, result %d, device %p", - ret.description().c_str(), result, device.get()); - return {}; - } - return primaryDevice; + return mDevices.get(factoryName, name); + } + + sp getPrimary(const std::string& factoryName) { + return mPrimary.get(factoryName); + } + + bool reset(const std::string& factoryName, const std::string& name) + __attribute__((warn_unused_result)) { + return name == kPrimaryDevice ? resetPrimary(factoryName) + : mDevices.reset(factoryName, name); + } + + bool resetPrimary(const std::string& factoryName) __attribute__((warn_unused_result)) { + return mPrimary.reset(factoryName); + } + + static void waitForInstanceDestruction() { + // Does not matter which device manager to use. + impl::RegularDeviceManager::waitForInstanceDestruction(); } private: - // There can only be one primary device across all HAL modules. - // A reference to a complete interface is used because in V7.1 IDevice can not - // be upcasted to IPrimaryDevice. - sp primaryDevice; + sp deviceFromPrimary(const sp& primary) { +#if MAJOR_VERSION == 7 && MINOR_VERSION == 1 + auto ret = primary->getDevice(); + if (ret.isOk()) { + return ret; + } else { + ALOGW("Error retrieving IDevice from primary: transaction: %s, primary %p", + ret.description().c_str(), primary.get()); + return nullptr; + } +#else + return primary; +#endif + } + + impl::PrimaryDeviceManager mPrimary; + impl::RegularDeviceManager mDevices; };