Loading media/libaudiohal/DevicesFactoryHalInterface.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,8 @@ * limitations under the License. */ #include <string> #include <media/audiohal/DevicesFactoryHalInterface.h> #include <media/audiohal/FactoryHalHidl.h> Loading @@ -21,8 +23,10 @@ namespace android { // static sp<DevicesFactoryHalInterface> DevicesFactoryHalInterface::create() { using namespace std::string_literals; return createPreferredImpl<DevicesFactoryHalInterface>( "android.hardware.audio", "IDevicesFactory"); std::make_pair("android.hardware.audio"s, "IDevicesFactory"s), std::make_pair("android.hardware.audio.effect"s, "IEffectsFactory"s)); } } // namespace android media/libaudiohal/EffectsFactoryHalInterface.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,8 @@ * limitations under the License. */ #include <string> #include <media/audiohal/EffectsFactoryHalInterface.h> #include <media/audiohal/FactoryHalHidl.h> Loading @@ -21,8 +23,10 @@ namespace android { // static sp<EffectsFactoryHalInterface> EffectsFactoryHalInterface::create() { using namespace std::string_literals; return createPreferredImpl<EffectsFactoryHalInterface>( "android.hardware.audio.effect", "IEffectsFactory"); std::make_pair("android.hardware.audio.effect"s, "IEffectsFactory"s), std::make_pair("android.hardware.audio"s, "IDevicesFactory"s)); } // static Loading media/libaudiohal/FactoryHalHidl.cpp +29 −13 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ #define LOG_TAG "FactoryHalHidl" #include <algorithm> #include <array> #include <utility> #include <media/audiohal/FactoryHalHidl.h> #include <dlfcn.h> Loading @@ -28,15 +32,16 @@ namespace android::detail { namespace { /** Supported HAL versions, in order of preference. /** Supported HAL versions, from most recent to least recent. */ const char* sAudioHALVersions[] = { "7.1", "7.0", "6.0", "5.0", "4.0", nullptr #define CONC_VERSION(maj, min) #maj "." #min #define DECLARE_VERSION(maj, min) std::make_pair(std::make_pair(maj, min), CONC_VERSION(maj, min)) static constexpr std::array<std::pair<std::pair<int, int>, const char*>, 5> sAudioHALVersions = { DECLARE_VERSION(7, 1), DECLARE_VERSION(7, 0), DECLARE_VERSION(6, 0), DECLARE_VERSION(5, 0), DECLARE_VERSION(4, 0) }; bool createHalService(const std::string& version, const std::string& interface, Loading Loading @@ -94,11 +99,22 @@ bool hasHalService(const std::string& package, const std::string& version, } // namespace void* createPreferredImpl(const std::string& package, const std::string& interface) { for (auto version = detail::sAudioHALVersions; *version != nullptr; ++version) { void* rawInterface = nullptr; if (hasHalService(package, *version, interface) && createHalService(*version, interface, &rawInterface)) { void* createPreferredImpl(const InterfaceName& iface, const InterfaceName& siblingIface) { auto findMostRecentVersion = [](const InterfaceName& iface) { return std::find_if(detail::sAudioHALVersions.begin(), detail::sAudioHALVersions.end(), [&](const auto& v) { return hasHalService(iface.first, v.second, iface.second); }); }; auto ifaceVersionIt = findMostRecentVersion(iface); auto siblingVersionIt = findMostRecentVersion(siblingIface); if (ifaceVersionIt != detail::sAudioHALVersions.end() && siblingVersionIt != detail::sAudioHALVersions.end() && // same major version ifaceVersionIt->first.first == siblingVersionIt->first.first) { std::string libraryVersion = ifaceVersionIt->first >= siblingVersionIt->first ? ifaceVersionIt->second : siblingVersionIt->second; void* rawInterface; if (createHalService(libraryVersion, iface.second, &rawInterface)) { return rawInterface; } } Loading media/libaudiohal/impl/Android.bp +31 −5 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ package { filegroup { name: "audio_core_hal_client_sources", srcs: [ "CoreConversionHelperHidl.cpp", "DeviceHalHidl.cpp", "DevicesFactoryHalHidl.cpp", "StreamHalHidl.cpp", Loading @@ -20,6 +21,7 @@ filegroup { name: "audio_effect_hal_client_sources", srcs: [ "EffectBufferHalHidl.cpp", "EffectConversionHelperHidl.cpp", "EffectHalHidl.cpp", "EffectsFactoryHalHidl.cpp", ], Loading @@ -28,10 +30,6 @@ filegroup { cc_defaults { name: "libaudiohal_default", srcs: [ "ConversionHelperHidl.cpp", ], cflags: [ "-Wall", "-Wextra", Loading Loading @@ -76,6 +74,7 @@ cc_library_shared { srcs: [ ":audio_core_hal_client_sources", ":audio_effect_hal_client_sources", "EffectsFactoryHalHidlEntry.cpp", ], shared_libs: [ "android.hardware.audio.common@4.0", Loading @@ -98,6 +97,7 @@ cc_library_shared { srcs: [ ":audio_core_hal_client_sources", ":audio_effect_hal_client_sources", "EffectsFactoryHalHidlEntry.cpp", ], shared_libs: [ "android.hardware.audio.common@5.0", Loading @@ -120,6 +120,7 @@ cc_library_shared { srcs: [ ":audio_core_hal_client_sources", ":audio_effect_hal_client_sources", "EffectsFactoryHalHidlEntry.cpp", ], shared_libs: [ "android.hardware.audio.common@6.0", Loading @@ -136,12 +137,31 @@ cc_library_shared { ] } cc_library_static { name: "libaudiohal.effect@7.0", defaults: ["libaudiohal_default"], srcs: [ ":audio_effect_hal_client_sources", ], static_libs: [ "android.hardware.audio.common@7.0", "android.hardware.audio.common@7.0-util", "android.hardware.audio.effect@7.0", "android.hardware.audio.effect@7.0-util", ], cflags: [ "-DMAJOR_VERSION=7", "-DMINOR_VERSION=0", "-include common/all-versions/VersionMacro.h", ] } cc_library_shared { name: "libaudiohal@7.0", defaults: ["libaudiohal_default"], srcs: [ ":audio_core_hal_client_sources", ":audio_effect_hal_client_sources", "EffectsFactoryHalHidlEntry.cpp", ], static_libs: [ "android.hardware.audio.common@7.0", Loading @@ -151,6 +171,7 @@ cc_library_shared { "android.hardware.audio.effect@7.0-util", "android.hardware.audio@7.0", "android.hardware.audio@7.0-util", "libaudiohal.effect@7.0", ], cflags: [ "-DMAJOR_VERSION=7", Loading @@ -164,14 +185,19 @@ cc_library_shared { defaults: ["libaudiohal_default"], srcs: [ ":audio_core_hal_client_sources", "EffectsFactoryHalHidlEntry.cpp", ], static_libs: [ "android.hardware.audio.common@7.0", "android.hardware.audio.common@7.0-util", "android.hardware.audio.common@7.1-enums", "android.hardware.audio.common@7.1-util", "android.hardware.audio.effect@7.0", "android.hardware.audio.effect@7.0-util", "android.hardware.audio@7.0", "android.hardware.audio@7.1", "android.hardware.audio@7.1-util", "libaudiohal.effect@7.0", ], cflags: [ "-DMAJOR_VERSION=7", Loading media/libaudiohal/impl/ConversionHelperHidl.h +23 −26 Original line number Diff line number Diff line Loading @@ -17,33 +17,25 @@ #ifndef ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H #define ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H #include PATH(android/hardware/audio/CORE_TYPES_FILE_VERSION/types.h) #include <functional> #include <hidl/HidlSupport.h> #include <system/audio.h> #include <utils/String8.h> #include <utils/String16.h> #include <utils/Vector.h> using ::android::hardware::audio::CORE_TYPES_CPP_VERSION::ParameterValue; using CoreResult = ::android::hardware::audio::CORE_TYPES_CPP_VERSION::Result; using ::android::hardware::Return; using ::android::hardware::hidl_string; using ::android::hardware::hidl_vec; namespace android { template<typename HalResult> class ConversionHelperHidl { protected: static status_t keysFromHal(const String8& keys, hidl_vec<hidl_string> *hidlKeys); static status_t parametersFromHal(const String8& kvPairs, hidl_vec<ParameterValue> *hidlParams); static void parametersToHal(const hidl_vec<ParameterValue>& parameters, String8 *values); static void argsFromHal(const Vector<String16>& args, hidl_vec<hidl_string> *hidlArgs); using HalResultConverter = std::function<status_t(const HalResult&)>; const std::string mClassName; ConversionHelperHidl(const char* className); ConversionHelperHidl(std::string_view className, HalResultConverter resultConv) : mClassName(className), mResultConverter(resultConv) {} template<typename R, typename T> status_t processReturn(const char* funcName, const Return<R>& ret, T *retval) { status_t processReturn(const char* funcName, const ::android::hardware::Return<R>& ret, T *retval) { if (ret.isOk()) { // This way it also works for enum class to unscoped enum conversion. *retval = static_cast<T>(static_cast<R>(ret)); Loading @@ -53,35 +45,40 @@ class ConversionHelperHidl { } template<typename T> status_t processReturn(const char* funcName, const Return<T>& ret) { status_t processReturn(const char* funcName, const ::android::hardware::Return<T>& ret) { if (!ret.isOk()) { emitError(funcName, ret.description().c_str()); } return ret.isOk() ? OK : FAILED_TRANSACTION; } status_t processReturn(const char* funcName, const Return<CoreResult>& ret) { status_t processReturn(const char* funcName, const ::android::hardware::Return<HalResult>& ret) { if (!ret.isOk()) { emitError(funcName, ret.description().c_str()); } return ret.isOk() ? analyzeResult(ret) : FAILED_TRANSACTION; return ret.isOk() ? mResultConverter(ret) : FAILED_TRANSACTION; } template<typename T> status_t processReturn( const char* funcName, const Return<T>& ret, CoreResult retval) { const char* funcName, const ::android::hardware::Return<T>& ret, HalResult retval) { if (!ret.isOk()) { emitError(funcName, ret.description().c_str()); } return ret.isOk() ? analyzeResult(retval) : FAILED_TRANSACTION; return ret.isOk() ? mResultConverter(retval) : FAILED_TRANSACTION; } private: const char* mClassName; const std::string& getClassName() const { return mClassName; } static status_t analyzeResult(const CoreResult& result); private: HalResultConverter mResultConverter; void emitError(const char* funcName, const char* description); void emitError(const char* funcName, const char* description) { ALOGE("%s %p %s: %s (from rpc)", mClassName.c_str(), this, funcName, description); } }; } // namespace android Loading Loading
media/libaudiohal/DevicesFactoryHalInterface.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,8 @@ * limitations under the License. */ #include <string> #include <media/audiohal/DevicesFactoryHalInterface.h> #include <media/audiohal/FactoryHalHidl.h> Loading @@ -21,8 +23,10 @@ namespace android { // static sp<DevicesFactoryHalInterface> DevicesFactoryHalInterface::create() { using namespace std::string_literals; return createPreferredImpl<DevicesFactoryHalInterface>( "android.hardware.audio", "IDevicesFactory"); std::make_pair("android.hardware.audio"s, "IDevicesFactory"s), std::make_pair("android.hardware.audio.effect"s, "IEffectsFactory"s)); } } // namespace android
media/libaudiohal/EffectsFactoryHalInterface.cpp +5 −1 Original line number Diff line number Diff line Loading @@ -14,6 +14,8 @@ * limitations under the License. */ #include <string> #include <media/audiohal/EffectsFactoryHalInterface.h> #include <media/audiohal/FactoryHalHidl.h> Loading @@ -21,8 +23,10 @@ namespace android { // static sp<EffectsFactoryHalInterface> EffectsFactoryHalInterface::create() { using namespace std::string_literals; return createPreferredImpl<EffectsFactoryHalInterface>( "android.hardware.audio.effect", "IEffectsFactory"); std::make_pair("android.hardware.audio.effect"s, "IEffectsFactory"s), std::make_pair("android.hardware.audio"s, "IDevicesFactory"s)); } // static Loading
media/libaudiohal/FactoryHalHidl.cpp +29 −13 Original line number Diff line number Diff line Loading @@ -16,6 +16,10 @@ #define LOG_TAG "FactoryHalHidl" #include <algorithm> #include <array> #include <utility> #include <media/audiohal/FactoryHalHidl.h> #include <dlfcn.h> Loading @@ -28,15 +32,16 @@ namespace android::detail { namespace { /** Supported HAL versions, in order of preference. /** Supported HAL versions, from most recent to least recent. */ const char* sAudioHALVersions[] = { "7.1", "7.0", "6.0", "5.0", "4.0", nullptr #define CONC_VERSION(maj, min) #maj "." #min #define DECLARE_VERSION(maj, min) std::make_pair(std::make_pair(maj, min), CONC_VERSION(maj, min)) static constexpr std::array<std::pair<std::pair<int, int>, const char*>, 5> sAudioHALVersions = { DECLARE_VERSION(7, 1), DECLARE_VERSION(7, 0), DECLARE_VERSION(6, 0), DECLARE_VERSION(5, 0), DECLARE_VERSION(4, 0) }; bool createHalService(const std::string& version, const std::string& interface, Loading Loading @@ -94,11 +99,22 @@ bool hasHalService(const std::string& package, const std::string& version, } // namespace void* createPreferredImpl(const std::string& package, const std::string& interface) { for (auto version = detail::sAudioHALVersions; *version != nullptr; ++version) { void* rawInterface = nullptr; if (hasHalService(package, *version, interface) && createHalService(*version, interface, &rawInterface)) { void* createPreferredImpl(const InterfaceName& iface, const InterfaceName& siblingIface) { auto findMostRecentVersion = [](const InterfaceName& iface) { return std::find_if(detail::sAudioHALVersions.begin(), detail::sAudioHALVersions.end(), [&](const auto& v) { return hasHalService(iface.first, v.second, iface.second); }); }; auto ifaceVersionIt = findMostRecentVersion(iface); auto siblingVersionIt = findMostRecentVersion(siblingIface); if (ifaceVersionIt != detail::sAudioHALVersions.end() && siblingVersionIt != detail::sAudioHALVersions.end() && // same major version ifaceVersionIt->first.first == siblingVersionIt->first.first) { std::string libraryVersion = ifaceVersionIt->first >= siblingVersionIt->first ? ifaceVersionIt->second : siblingVersionIt->second; void* rawInterface; if (createHalService(libraryVersion, iface.second, &rawInterface)) { return rawInterface; } } Loading
media/libaudiohal/impl/Android.bp +31 −5 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ package { filegroup { name: "audio_core_hal_client_sources", srcs: [ "CoreConversionHelperHidl.cpp", "DeviceHalHidl.cpp", "DevicesFactoryHalHidl.cpp", "StreamHalHidl.cpp", Loading @@ -20,6 +21,7 @@ filegroup { name: "audio_effect_hal_client_sources", srcs: [ "EffectBufferHalHidl.cpp", "EffectConversionHelperHidl.cpp", "EffectHalHidl.cpp", "EffectsFactoryHalHidl.cpp", ], Loading @@ -28,10 +30,6 @@ filegroup { cc_defaults { name: "libaudiohal_default", srcs: [ "ConversionHelperHidl.cpp", ], cflags: [ "-Wall", "-Wextra", Loading Loading @@ -76,6 +74,7 @@ cc_library_shared { srcs: [ ":audio_core_hal_client_sources", ":audio_effect_hal_client_sources", "EffectsFactoryHalHidlEntry.cpp", ], shared_libs: [ "android.hardware.audio.common@4.0", Loading @@ -98,6 +97,7 @@ cc_library_shared { srcs: [ ":audio_core_hal_client_sources", ":audio_effect_hal_client_sources", "EffectsFactoryHalHidlEntry.cpp", ], shared_libs: [ "android.hardware.audio.common@5.0", Loading @@ -120,6 +120,7 @@ cc_library_shared { srcs: [ ":audio_core_hal_client_sources", ":audio_effect_hal_client_sources", "EffectsFactoryHalHidlEntry.cpp", ], shared_libs: [ "android.hardware.audio.common@6.0", Loading @@ -136,12 +137,31 @@ cc_library_shared { ] } cc_library_static { name: "libaudiohal.effect@7.0", defaults: ["libaudiohal_default"], srcs: [ ":audio_effect_hal_client_sources", ], static_libs: [ "android.hardware.audio.common@7.0", "android.hardware.audio.common@7.0-util", "android.hardware.audio.effect@7.0", "android.hardware.audio.effect@7.0-util", ], cflags: [ "-DMAJOR_VERSION=7", "-DMINOR_VERSION=0", "-include common/all-versions/VersionMacro.h", ] } cc_library_shared { name: "libaudiohal@7.0", defaults: ["libaudiohal_default"], srcs: [ ":audio_core_hal_client_sources", ":audio_effect_hal_client_sources", "EffectsFactoryHalHidlEntry.cpp", ], static_libs: [ "android.hardware.audio.common@7.0", Loading @@ -151,6 +171,7 @@ cc_library_shared { "android.hardware.audio.effect@7.0-util", "android.hardware.audio@7.0", "android.hardware.audio@7.0-util", "libaudiohal.effect@7.0", ], cflags: [ "-DMAJOR_VERSION=7", Loading @@ -164,14 +185,19 @@ cc_library_shared { defaults: ["libaudiohal_default"], srcs: [ ":audio_core_hal_client_sources", "EffectsFactoryHalHidlEntry.cpp", ], static_libs: [ "android.hardware.audio.common@7.0", "android.hardware.audio.common@7.0-util", "android.hardware.audio.common@7.1-enums", "android.hardware.audio.common@7.1-util", "android.hardware.audio.effect@7.0", "android.hardware.audio.effect@7.0-util", "android.hardware.audio@7.0", "android.hardware.audio@7.1", "android.hardware.audio@7.1-util", "libaudiohal.effect@7.0", ], cflags: [ "-DMAJOR_VERSION=7", Loading
media/libaudiohal/impl/ConversionHelperHidl.h +23 −26 Original line number Diff line number Diff line Loading @@ -17,33 +17,25 @@ #ifndef ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H #define ANDROID_HARDWARE_CONVERSION_HELPER_HIDL_H #include PATH(android/hardware/audio/CORE_TYPES_FILE_VERSION/types.h) #include <functional> #include <hidl/HidlSupport.h> #include <system/audio.h> #include <utils/String8.h> #include <utils/String16.h> #include <utils/Vector.h> using ::android::hardware::audio::CORE_TYPES_CPP_VERSION::ParameterValue; using CoreResult = ::android::hardware::audio::CORE_TYPES_CPP_VERSION::Result; using ::android::hardware::Return; using ::android::hardware::hidl_string; using ::android::hardware::hidl_vec; namespace android { template<typename HalResult> class ConversionHelperHidl { protected: static status_t keysFromHal(const String8& keys, hidl_vec<hidl_string> *hidlKeys); static status_t parametersFromHal(const String8& kvPairs, hidl_vec<ParameterValue> *hidlParams); static void parametersToHal(const hidl_vec<ParameterValue>& parameters, String8 *values); static void argsFromHal(const Vector<String16>& args, hidl_vec<hidl_string> *hidlArgs); using HalResultConverter = std::function<status_t(const HalResult&)>; const std::string mClassName; ConversionHelperHidl(const char* className); ConversionHelperHidl(std::string_view className, HalResultConverter resultConv) : mClassName(className), mResultConverter(resultConv) {} template<typename R, typename T> status_t processReturn(const char* funcName, const Return<R>& ret, T *retval) { status_t processReturn(const char* funcName, const ::android::hardware::Return<R>& ret, T *retval) { if (ret.isOk()) { // This way it also works for enum class to unscoped enum conversion. *retval = static_cast<T>(static_cast<R>(ret)); Loading @@ -53,35 +45,40 @@ class ConversionHelperHidl { } template<typename T> status_t processReturn(const char* funcName, const Return<T>& ret) { status_t processReturn(const char* funcName, const ::android::hardware::Return<T>& ret) { if (!ret.isOk()) { emitError(funcName, ret.description().c_str()); } return ret.isOk() ? OK : FAILED_TRANSACTION; } status_t processReturn(const char* funcName, const Return<CoreResult>& ret) { status_t processReturn(const char* funcName, const ::android::hardware::Return<HalResult>& ret) { if (!ret.isOk()) { emitError(funcName, ret.description().c_str()); } return ret.isOk() ? analyzeResult(ret) : FAILED_TRANSACTION; return ret.isOk() ? mResultConverter(ret) : FAILED_TRANSACTION; } template<typename T> status_t processReturn( const char* funcName, const Return<T>& ret, CoreResult retval) { const char* funcName, const ::android::hardware::Return<T>& ret, HalResult retval) { if (!ret.isOk()) { emitError(funcName, ret.description().c_str()); } return ret.isOk() ? analyzeResult(retval) : FAILED_TRANSACTION; return ret.isOk() ? mResultConverter(retval) : FAILED_TRANSACTION; } private: const char* mClassName; const std::string& getClassName() const { return mClassName; } static status_t analyzeResult(const CoreResult& result); private: HalResultConverter mResultConverter; void emitError(const char* funcName, const char* description); void emitError(const char* funcName, const char* description) { ALOGE("%s %p %s: %s (from rpc)", mClassName.c_str(), this, funcName, description); } }; } // namespace android Loading