Merge changes from topic "upstream-hal-v7_1-p4"

* changes:
  audio VTS: Fix HAL device management
  Make AUDIO_USAGE_NOTIFICATION_EVENT available to HALs
  audio: Add android.hardware.audio[.common]@7.1-util modules
  audio: add Ultrasound materials to 7.1
This commit is contained in:
Mikhail Naganov 2022-02-14 17:26:17 +00:00 committed by Gerrit Code Review
commit 7ed70a8033
14 changed files with 257 additions and 78 deletions

View file

@ -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_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_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_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; 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_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_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_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_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_COMPRESS_OFFLOAD;
enum_constant public static final android.audio.policy.configuration.V7_1.AudioInOutFlag AUDIO_OUTPUT_FLAG_DEEP_BUFFER; 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_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_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_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; 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_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_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_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_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_CALL;
enum_constant public static final android.audio.policy.configuration.V7_1.AudioSource AUDIO_SOURCE_VOICE_COMMUNICATION; 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_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_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;
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_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_SAFETY;
enum_constant public static final android.audio.policy.configuration.V7_1.AudioUsage AUDIO_USAGE_UNKNOWN; enum_constant public static final android.audio.policy.configuration.V7_1.AudioUsage AUDIO_USAGE_UNKNOWN;

View file

@ -180,6 +180,7 @@
<xs:enumeration value="AUDIO_OUTPUT_FLAG_INCALL_MUSIC" /> <xs:enumeration value="AUDIO_OUTPUT_FLAG_INCALL_MUSIC" />
<xs:enumeration value="AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD" /> <xs:enumeration value="AUDIO_OUTPUT_FLAG_GAPLESS_OFFLOAD" />
<xs:enumeration value="AUDIO_OUTPUT_FLAG_SPATIALIZER" /> <xs:enumeration value="AUDIO_OUTPUT_FLAG_SPATIALIZER" />
<xs:enumeration value="AUDIO_OUTPUT_FLAG_ULTRASOUND" />
<xs:enumeration value="AUDIO_INPUT_FLAG_FAST" /> <xs:enumeration value="AUDIO_INPUT_FLAG_FAST" />
<xs:enumeration value="AUDIO_INPUT_FLAG_HW_HOTWORD" /> <xs:enumeration value="AUDIO_INPUT_FLAG_HW_HOTWORD" />
<xs:enumeration value="AUDIO_INPUT_FLAG_RAW" /> <xs:enumeration value="AUDIO_INPUT_FLAG_RAW" />
@ -188,6 +189,7 @@
<xs:enumeration value="AUDIO_INPUT_FLAG_VOIP_TX" /> <xs:enumeration value="AUDIO_INPUT_FLAG_VOIP_TX" />
<xs:enumeration value="AUDIO_INPUT_FLAG_HW_AV_SYNC" /> <xs:enumeration value="AUDIO_INPUT_FLAG_HW_AV_SYNC" />
<xs:enumeration value="AUDIO_INPUT_FLAG_DIRECT" /> <xs:enumeration value="AUDIO_INPUT_FLAG_DIRECT" />
<xs:enumeration value="AUDIO_INPUT_FLAG_ULTRASOUND" />
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:simpleType name="audioInOutFlags"> <xs:simpleType name="audioInOutFlags">
@ -441,6 +443,7 @@
<xs:enumeration value="AUDIO_USAGE_ALARM" /> <xs:enumeration value="AUDIO_USAGE_ALARM" />
<xs:enumeration value="AUDIO_USAGE_NOTIFICATION" /> <xs:enumeration value="AUDIO_USAGE_NOTIFICATION" />
<xs:enumeration value="AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE" /> <xs:enumeration value="AUDIO_USAGE_NOTIFICATION_TELEPHONY_RINGTONE" />
<xs:enumeration value="AUDIO_USAGE_NOTIFICATION_EVENT" />
<xs:enumeration value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" /> <xs:enumeration value="AUDIO_USAGE_ASSISTANCE_ACCESSIBILITY" />
<xs:enumeration value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" /> <xs:enumeration value="AUDIO_USAGE_ASSISTANCE_NAVIGATION_GUIDANCE" />
<xs:enumeration value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" /> <xs:enumeration value="AUDIO_USAGE_ASSISTANCE_SONIFICATION" />
@ -471,6 +474,7 @@
<xs:enumeration value="AUDIO_CONTENT_TYPE_MUSIC"/> <xs:enumeration value="AUDIO_CONTENT_TYPE_MUSIC"/>
<xs:enumeration value="AUDIO_CONTENT_TYPE_MOVIE"/> <xs:enumeration value="AUDIO_CONTENT_TYPE_MOVIE"/>
<xs:enumeration value="AUDIO_CONTENT_TYPE_SONIFICATION"/> <xs:enumeration value="AUDIO_CONTENT_TYPE_SONIFICATION"/>
<xs:enumeration value="AUDIO_CONTENT_TYPE_ULTRASOUND"/>
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<xs:simpleType name="samplingRates"> <xs:simpleType name="samplingRates">
@ -742,6 +746,7 @@
<xs:enumeration value="AUDIO_SOURCE_ECHO_REFERENCE"/> <xs:enumeration value="AUDIO_SOURCE_ECHO_REFERENCE"/>
<xs:enumeration value="AUDIO_SOURCE_FM_TUNER"/> <xs:enumeration value="AUDIO_SOURCE_FM_TUNER"/>
<xs:enumeration value="AUDIO_SOURCE_HOTWORD"/> <xs:enumeration value="AUDIO_SOURCE_HOTWORD"/>
<xs:enumeration value="AUDIO_SOURCE_ULTRASOUND"/>
</xs:restriction> </xs:restriction>
</xs:simpleType> </xs:simpleType>
<!-- Enum values of device_category from Volume.h. --> <!-- Enum values of device_category from Volume.h. -->

View file

@ -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) { status_t HidlUtils::audioUsageFromHal(audio_usage_t halUsage, AudioUsage* usage) {
if (halUsage == AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST || if (halUsage == AUDIO_USAGE_NOTIFICATION_COMMUNICATION_REQUEST ||
halUsage == AUDIO_USAGE_NOTIFICATION_COMMUNICATION_INSTANT || 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_COMMUNICATION_DELAYED ||
halUsage == AUDIO_USAGE_NOTIFICATION_EVENT) { halUsage == AUDIO_USAGE_NOTIFICATION_EVENT) {
#endif
halUsage = AUDIO_USAGE_NOTIFICATION; halUsage = AUDIO_USAGE_NOTIFICATION;
} }
*usage = audio_usage_to_string(halUsage); *usage = audio_usage_to_string(halUsage);

View file

@ -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 // Note: this isn't a VTS test, but rather a unit test
// to verify correctness of conversion utilities. // to verify correctness of conversion utilities.
cc_test { cc_test {
@ -214,3 +236,35 @@ cc_test {
test_suites: ["device-tests"], 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"],
}

View file

@ -20,7 +20,7 @@ namespace android {
namespace hardware { namespace hardware {
namespace audio { namespace audio {
namespace common { namespace common {
namespace CPP_VERSION { namespace COMMON_TYPES_CPP_VERSION {
namespace implementation { namespace implementation {
status_t HidlUtils::audioPortConfigsFromHal(unsigned int numHalConfigs, status_t HidlUtils::audioPortConfigsFromHal(unsigned int numHalConfigs,
@ -51,7 +51,7 @@ status_t HidlUtils::audioPortConfigsToHal(const hidl_vec<AudioPortConfig>& confi
} }
} // namespace implementation } // namespace implementation
} // namespace CPP_VERSION } // namespace COMMON_TYPES_CPP_VERSION
} // namespace common } // namespace common
} // namespace audio } // namespace audio
} // namespace hardware } // namespace hardware

View file

@ -5,6 +5,9 @@
}, },
{ {
"name": "android.hardware.audio.common@7.0-util_tests" "name": "android.hardware.audio.common@7.0-util_tests"
},
{
"name": "android.hardware.audio.common@7.1-util_tests"
} }
] ]
} }

View file

@ -23,7 +23,7 @@
#include <log/log.h> #include <log/log.h>
#include <HidlUtils.h> #include <HidlUtils.h>
#include <android_audio_policy_configuration_V7_0-enums.h> #include PATH(APM_XSD_ENUMS_H_FILENAME)
#include <system/audio.h> #include <system/audio.h>
#include <xsdc/XsdcSupport.h> #include <xsdc/XsdcSupport.h>
@ -32,7 +32,7 @@ using ::android::hardware::hidl_vec;
using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION; using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION;
using ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION::implementation::HidlUtils; using ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION::implementation::HidlUtils;
namespace xsd { 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; static constexpr audio_channel_mask_t kInvalidHalChannelMask = AUDIO_CHANNEL_INVALID;

View file

@ -168,10 +168,10 @@ cc_defaults {
shared_libs: [ shared_libs: [
"android.hardware.audio@7.0", "android.hardware.audio@7.0",
"android.hardware.audio@7.1", "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.0",
"android.hardware.audio.common@7.1-enums", "android.hardware.audio.common@7.1-enums",
"android.hardware.audio.common@7.0-util", "android.hardware.audio.common@7.1-util",
"libbase", "libbase",
], ],
cflags: [ cflags: [

View file

@ -3,6 +3,9 @@
{ {
"name": "android.hardware.audio@7.0-util_tests" "name": "android.hardware.audio@7.0-util_tests"
}, },
{
"name": "android.hardware.audio@7.1-util_tests"
},
{ {
"name": "HalAudioV6_0GeneratorTest" "name": "HalAudioV6_0GeneratorTest"
}, },

View file

@ -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 // Note: this isn't a VTS test, but rather a unit test
// to verify correctness of conversion utilities. // to verify correctness of conversion utilities.
cc_test { cc_test {
@ -145,3 +164,37 @@ cc_test {
test_suites: ["device-tests"], 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"],
}

View file

@ -22,18 +22,18 @@
#define LOG_TAG "CoreUtils_Test" #define LOG_TAG "CoreUtils_Test"
#include <log/log.h> #include <log/log.h>
#include <android_audio_policy_configuration_V7_0-enums.h> #include PATH(APM_XSD_ENUMS_H_FILENAME)
#include <system/audio.h> #include <system/audio.h>
#include <util/CoreUtils.h> #include <util/CoreUtils.h>
#include <xsdc/XsdcSupport.h> #include <xsdc/XsdcSupport.h>
using namespace android; using namespace android;
using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION; 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::hidl_vec;
using ::android::hardware::audio::CPP_VERSION::implementation::CoreUtils; using ::android::hardware::audio::CORE_TYPES_CPP_VERSION::implementation::CoreUtils;
namespace xsd { 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; static constexpr audio_channel_mask_t kInvalidHalChannelMask = AUDIO_CHANNEL_INVALID;

View file

@ -28,8 +28,7 @@ TEST_P(AudioHidlTest, OpenPrimaryDeviceUsingGetDevice) {
if (getDeviceName() != DeviceManager::kPrimaryDevice) { if (getDeviceName() != DeviceManager::kPrimaryDevice) {
GTEST_SKIP() << "No primary device on this factory"; // returns GTEST_SKIP() << "No primary device on this factory"; // returns
} }
EXPECT_TRUE( EXPECT_TRUE(DeviceManager::getInstance().resetPrimary(getFactoryName()));
DeviceManager::getInstance().reset(getFactoryName(), DeviceManager::kPrimaryDevice));
// Must use IDevicesFactory directly because DeviceManager always uses // Must use IDevicesFactory directly because DeviceManager always uses
// the latest interfaces version and corresponding methods for opening // the latest interfaces version and corresponding methods for opening

View file

@ -195,7 +195,7 @@ cc_test {
"android.hardware.audio.common@7.0", "android.hardware.audio.common@7.0",
"android.hardware.audio.common@7.0-enums", "android.hardware.audio.common@7.0-enums",
"android.hardware.audio.common@7.1-enums", "android.hardware.audio.common@7.1-enums",
"android.hardware.audio.common@7.0-util", "android.hardware.audio.common@7.1-util",
], ],
cflags: [ cflags: [
"-DMAJOR_VERSION=7", "-DMAJOR_VERSION=7",

View file

@ -96,40 +96,83 @@ class DevicesFactoryManager
} }
}; };
using FactoryAndDevice = std::tuple<std::string, std::string>; namespace impl {
class DeviceManager : public InterfaceManager<DeviceManager, FactoryAndDevice, IDevice> {
class PrimaryDeviceManager
: public InterfaceManager<PrimaryDeviceManager, std::string, IPrimaryDevice> {
public: public:
static DeviceManager& getInstance() { static sp<IPrimaryDevice> createInterfaceInstance(const std::string& factoryName) {
static DeviceManager instance; sp<IDevicesFactory> factory = DevicesFactoryManager::getInstance().get(factoryName);
return instance; 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<IPrimaryDevice> 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<IPrimaryDevice> openPrimaryDevice(const sp<IDevicesFactory>& factory) {
if (factory == nullptr) return {};
Result result;
sp<IPrimaryDevice> primaryDevice;
#if !(MAJOR_VERSION == 7 && MINOR_VERSION == 1)
sp<IDevice> 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<std::string, std::string>;
class RegularDeviceManager
: public InterfaceManager<RegularDeviceManager, FactoryAndDevice, IDevice> {
public:
static sp<IDevice> createInterfaceInstance(const FactoryAndDevice& factoryAndDevice) { static sp<IDevice> createInterfaceInstance(const FactoryAndDevice& factoryAndDevice) {
auto [factoryName, name] = factoryAndDevice; auto [factoryName, name] = factoryAndDevice;
sp<IDevicesFactory> factory = DevicesFactoryManager::getInstance().get(factoryName); sp<IDevicesFactory> factory = DevicesFactoryManager::getInstance().get(factoryName);
return openDevice(factory, name); return openDevice(factory, name);
} }
using InterfaceManager::reset;
static constexpr const char* kPrimaryDevice = "primary";
sp<IDevice> get(const std::string& factoryName, const std::string& name) { sp<IDevice> 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)); return InterfaceManager::get(std::make_tuple(factoryName, name));
} }
sp<IPrimaryDevice> getPrimary(const std::string& factoryName) {
if (primaryDevice == nullptr) {
sp<IDevicesFactory> factory = DevicesFactoryManager::getInstance().get(factoryName);
primaryDevice = openPrimaryDevice(factory);
}
return primaryDevice;
}
bool reset(const std::string& factoryName, const std::string& name) bool reset(const std::string& factoryName, const std::string& name)
__attribute__((warn_unused_result)) { __attribute__((warn_unused_result)) {
if (name == kPrimaryDevice) {
primaryDevice.clear();
}
#if MAJOR_VERSION <= 5 #if MAJOR_VERSION <= 5
return InterfaceManager::reset(std::make_tuple(factoryName, name), true); return InterfaceManager::reset(std::make_tuple(factoryName, name), true);
#elif MAJOR_VERSION >= 6 #elif MAJOR_VERSION >= 6
@ -144,9 +187,6 @@ class DeviceManager : public InterfaceManager<DeviceManager, FactoryAndDevice, I
return InterfaceManager::reset(std::make_tuple(factoryName, name), false); return InterfaceManager::reset(std::make_tuple(factoryName, name), false);
#endif #endif
} }
bool resetPrimary(const std::string& factoryName) __attribute__((warn_unused_result)) {
return reset(factoryName, kPrimaryDevice);
}
private: private:
static sp<IDevice> openDevice(const sp<IDevicesFactory>& factory, const std::string& name) { static sp<IDevice> openDevice(const sp<IDevicesFactory>& factory, const std::string& name) {
@ -155,9 +195,7 @@ class DeviceManager : public InterfaceManager<DeviceManager, FactoryAndDevice, I
sp<IDevice> device; sp<IDevice> device;
#if MAJOR_VERSION == 2 #if MAJOR_VERSION == 2
IDevicesFactory::Device dev = IDevicesFactory::IDevicesFactory::Device(-1); IDevicesFactory::Device dev = IDevicesFactory::IDevicesFactory::Device(-1);
if (name == AUDIO_HARDWARE_MODULE_ID_PRIMARY) { if (name == AUDIO_HARDWARE_MODULE_ID_A2DP) {
dev = IDevicesFactory::Device::PRIMARY;
} else if (name == AUDIO_HARDWARE_MODULE_ID_A2DP) {
dev = IDevicesFactory::Device::A2DP; dev = IDevicesFactory::Device::A2DP;
} else if (name == AUDIO_HARDWARE_MODULE_ID_USB) { } else if (name == AUDIO_HARDWARE_MODULE_ID_USB) {
dev = IDevicesFactory::Device::USB; dev = IDevicesFactory::Device::USB;
@ -179,47 +217,62 @@ class DeviceManager : public InterfaceManager<DeviceManager, FactoryAndDevice, I
} }
return device; return device;
} }
};
static sp<IPrimaryDevice> openPrimaryDevice(const sp<IDevicesFactory>& factory) { } // namespace impl
if (factory == nullptr) return {};
Result result; class DeviceManager {
sp<IDevice> device; public:
sp<IPrimaryDevice> primaryDevice; static DeviceManager& getInstance() {
#if MAJOR_VERSION == 2 static DeviceManager instance;
auto ret = factory->openDevice(IDevicesFactory::Device::PRIMARY, returnIn(result, device)); return instance;
if (ret.isOk() && result == Result::OK && device != nullptr) { }
primaryDevice = IPrimaryDevice::castFrom(device);
static constexpr const char* kPrimaryDevice = "primary";
sp<IDevice> 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)) return mDevices.get(factoryName, name);
auto ret = factory->openPrimaryDevice(returnIn(result, device)); }
if (ret.isOk() && result == Result::OK && device != nullptr) {
primaryDevice = IPrimaryDevice::castFrom(device); sp<IPrimaryDevice> getPrimary(const std::string& factoryName) {
} return mPrimary.get(factoryName);
#elif MAJOR_VERSION == 7 && MINOR_VERSION == 1 }
auto ret = factory->openPrimaryDevice_7_1(returnIn(result, primaryDevice));
if (ret.isOk() && result == Result::OK && primaryDevice != nullptr) { bool reset(const std::string& factoryName, const std::string& name)
auto getDeviceRet = primaryDevice->getDevice(); __attribute__((warn_unused_result)) {
if (getDeviceRet.isOk()) { return name == kPrimaryDevice ? resetPrimary(factoryName)
device = getDeviceRet; : mDevices.reset(factoryName, name);
} else { }
primaryDevice.clear();
ALOGW("Primary device can not downcast, transaction: %s, primary %p", bool resetPrimary(const std::string& factoryName) __attribute__((warn_unused_result)) {
getDeviceRet.description().c_str(), primaryDevice.get()); return mPrimary.reset(factoryName);
return {}; }
}
} static void waitForInstanceDestruction() {
#endif // Does not matter which device manager to use.
if (!ret.isOk() || result != Result::OK || device == nullptr) { impl::RegularDeviceManager::waitForInstanceDestruction();
ALOGW("Primary device can not be opened, transaction: %s, result %d, device %p",
ret.description().c_str(), result, device.get());
return {};
}
return primaryDevice;
} }
private: private:
// There can only be one primary device across all HAL modules. sp<IDevice> deviceFromPrimary(const sp<IPrimaryDevice>& primary) {
// A reference to a complete interface is used because in V7.1 IDevice can not #if MAJOR_VERSION == 7 && MINOR_VERSION == 1
// be upcasted to IPrimaryDevice. auto ret = primary->getDevice();
sp<IPrimaryDevice> primaryDevice; 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;
}; };