Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b6627feb authored by Mikhail Naganov's avatar Mikhail Naganov Committed by Automerger Merge Worker
Browse files

libaudiohal: Optimize loading for minor version upgrades am: 288a3436

parents debf1160 288a3436
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@
 * limitations under the License.
 */

#include <string>

#include <media/audiohal/DevicesFactoryHalInterface.h>
#include <media/audiohal/FactoryHalHidl.h>

@@ -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
+5 −1
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@
 * limitations under the License.
 */

#include <string>

#include <media/audiohal/EffectsFactoryHalInterface.h>
#include <media/audiohal/FactoryHalHidl.h>

@@ -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
+29 −13
Original line number Diff line number Diff line
@@ -16,6 +16,10 @@

#define LOG_TAG "FactoryHalHidl"

#include <algorithm>
#include <array>
#include <utility>

#include <media/audiohal/FactoryHalHidl.h>

#include <dlfcn.h>
@@ -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,
@@ -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;
        }
    }
+31 −5
Original line number Diff line number Diff line
@@ -10,6 +10,7 @@ package {
filegroup {
    name: "audio_core_hal_client_sources",
    srcs: [
        "CoreConversionHelperHidl.cpp",
        "DeviceHalHidl.cpp",
        "DevicesFactoryHalHidl.cpp",
        "StreamHalHidl.cpp",
@@ -20,6 +21,7 @@ filegroup {
    name: "audio_effect_hal_client_sources",
    srcs: [
        "EffectBufferHalHidl.cpp",
        "EffectConversionHelperHidl.cpp",
        "EffectHalHidl.cpp",
        "EffectsFactoryHalHidl.cpp",
    ],
@@ -28,10 +30,6 @@ filegroup {
cc_defaults {
    name: "libaudiohal_default",

    srcs: [
        "ConversionHelperHidl.cpp",
    ],

    cflags: [
        "-Wall",
        "-Wextra",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
@@ -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",
+19 −26
Original line number Diff line number Diff line
@@ -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(std::string_view 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));
@@ -53,27 +45,28 @@ 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;
    }

    const std::string& getClassName() const {
@@ -81,11 +74,11 @@ class ConversionHelperHidl {
    }

  private:
    const std::string mClassName;

    static status_t analyzeResult(const CoreResult& result);
    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