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

Commit c9c108d3 authored by Shunkai Yao's avatar Shunkai Yao Committed by Gerrit Code Review
Browse files

Merge changes from topic "libaudiohal_audiohalversion"

* changes:
  Update AudioFlinger with AudioHalVersionInfo
  Update libaudiohal with AudioHalVersionInfo
parents dab574b8 d95dcdba
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -13,7 +13,7 @@ cc_library_shared {
    srcs: [
        "DevicesFactoryHalInterface.cpp",
        "EffectsFactoryHalInterface.cpp",
        "FactoryHalHidl.cpp",
        "FactoryHal.cpp",
    ],

    cflags: [
@@ -28,10 +28,12 @@ cc_library_shared {
        "libaudiohal@6.0",
        "libaudiohal@7.0",
        "libaudiohal@7.1",
        "libaudiohal@aidl",
    ],

    shared_libs: [
        "audioclient-types-aidl-cpp",
        "libbinder_ndk",
        "libdl",
        "libhidlbase",
        "liblog",
@@ -65,7 +67,7 @@ cc_library_shared {

    header_libs: [
        "libaudiohal_headers"
    ]
    ],
}

cc_library_headers {
+2 −7
Original line number Diff line number Diff line
@@ -14,19 +14,14 @@
 * limitations under the License.
 */

#include <string>

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

namespace android {

// static
sp<DevicesFactoryHalInterface> DevicesFactoryHalInterface::create() {
    using namespace std::string_literals;
    return createPreferredImpl<DevicesFactoryHalInterface>(
            std::make_pair("android.hardware.audio"s, "IDevicesFactory"s),
            std::make_pair("android.hardware.audio.effect"s, "IEffectsFactory"s));
    return createPreferredImpl<DevicesFactoryHalInterface>(true /* isCore */);
}

} // namespace android
+2 −7
Original line number Diff line number Diff line
@@ -14,19 +14,14 @@
 * limitations under the License.
 */

#include <string>

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

namespace android {

// static
sp<EffectsFactoryHalInterface> EffectsFactoryHalInterface::create() {
    using namespace std::string_literals;
    return createPreferredImpl<EffectsFactoryHalInterface>(
            std::make_pair("android.hardware.audio.effect"s, "IEffectsFactory"s),
            std::make_pair("android.hardware.audio"s, "IDevicesFactory"s));
    return createPreferredImpl<EffectsFactoryHalInterface>(false /* isCore */);
}

// static
+189 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2020 The Android Open Source Project
 * Copyright (C) 2022 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.
@@ -14,40 +14,69 @@
 * limitations under the License.
 */

#define LOG_TAG "FactoryHalHidl"
#include <map>
#include <memory>
#define LOG_TAG "FactoryHal"

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

#include <media/audiohal/FactoryHalHidl.h>

#include <cstddef>
#include <dlfcn.h>
#include <utility>

#include <android/binder_manager.h>
#include <android/hidl/manager/1.0/IServiceManager.h>
#include <hidl/ServiceManagement.h>
#include <hidl/Status.h>
#include <utils/Log.h>

#include "include/media/audiohal/AudioHalVersionInfo.h"
#include "include/media/audiohal/FactoryHal.h"

namespace android::detail {

namespace {
/** Supported HAL versions, from most recent to least recent.

using ::android::detail::AudioHalVersionInfo;

// The pair of the interface's package name and the interface name,
// e.g. <"android.hardware.audio", "IDevicesFactory"> for HIDL, <"android.hardware.audio.core",
// "IModule"> for AIDL.
// Splitting is used for easier construction of versioned names (FQNs).
using InterfaceName = std::pair<std::string, std::string>;

/**
 * Supported HAL versions, from most recent to least recent.
 * This list need to keep sync with AudioHalVersionInfo.VERSIONS in
 * media/java/android/media/AudioHalVersionInfo.java.
 */
#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)
static const std::array<AudioHalVersionInfo, 5> sAudioHALVersions = {
    // TODO: remove this comment to get AIDL
    // AudioHalVersionInfo(AudioHalVersionInfo::Type::AIDL, 1, 0),
    AudioHalVersionInfo(AudioHalVersionInfo::Type::HIDL, 7, 1),
    AudioHalVersionInfo(AudioHalVersionInfo::Type::HIDL, 7, 0),
    AudioHalVersionInfo(AudioHalVersionInfo::Type::HIDL, 6, 0),
    AudioHalVersionInfo(AudioHalVersionInfo::Type::HIDL, 5, 0),
    AudioHalVersionInfo(AudioHalVersionInfo::Type::HIDL, 4, 0),
};

static const std::map<AudioHalVersionInfo::Type, InterfaceName> sDevicesHALInterfaces = {
        {AudioHalVersionInfo::Type::AIDL, std::make_pair("android.hardware.audio.core", "IModule")},
        {AudioHalVersionInfo::Type::HIDL,
         std::make_pair("android.hardware.audio", "IDevicesFactory")},
};

static const std::map<AudioHalVersionInfo::Type, InterfaceName> sEffectsHALInterfaces = {
        {AudioHalVersionInfo::Type::AIDL,
         std::make_pair("android.hardware.audio.effect", "IFactory")},
        {AudioHalVersionInfo::Type::HIDL,
         std::make_pair("android.hardware.audio.effect", "IEffectsFactory")},
};

bool createHalService(const std::string& version, const std::string& interface,
        void** rawInterface) {
    const std::string libName = "libaudiohal@" + version + ".so";
    const std::string factoryFunctionName = "create" + interface;
bool createHalService(const AudioHalVersionInfo& version, bool isDevice, void** rawInterface) {
    const std::string libName = "libaudiohal@" + version.toVersionString() + ".so";
    const std::string factoryFunctionName =
            isDevice ? "createIDevicesFactory" : "createIEffectsFactory";
    constexpr int dlMode = RTLD_LAZY;
    void* handle = nullptr;
    dlerror(); // clear
@@ -74,49 +103,85 @@ bool createHalService(const std::string& version, const std::string& interface,
    return true;
}

bool hasHalService(const std::string& package, const std::string& version,
        const std::string& interface) {
bool hasAidlHalService(const InterfaceName& interface, const AudioHalVersionInfo& version) {
    const std::string name = interface.first + "." + interface.second + "/default";
    AIBinder* binder = AServiceManager_checkService(name.c_str());
    if (binder == nullptr) {
        ALOGW("%s Service %s doesn't exist", __func__, name.c_str());
        return false;
    }
    ALOGI("%s AIDL Service %s exist: %s", __func__, name.c_str(), version.toString().c_str());
    return true;
}

bool hasHidlHalService(const InterfaceName& interface, const AudioHalVersionInfo& version) {
    using ::android::hidl::manager::V1_0::IServiceManager;
    sp<IServiceManager> sm = ::android::hardware::defaultServiceManager();
    if (!sm) {
        ALOGE("Failed to obtain HIDL ServiceManager");
        ALOGW("Failed to obtain HIDL ServiceManager");
        return false;
    }
    // Since audio HAL doesn't support multiple clients, avoid instantiating
    // the interface right away. Instead, query the transport type for it.
    using ::android::hardware::Return;
    using Transport = IServiceManager::Transport;
    const std::string fqName = package + "@" + version + "::" + interface;
    const std::string fqName =
            interface.first + "@" + version.toVersionString() + "::" + interface.second;
    const std::string instance = "default";
    Return<Transport> transport = sm->getTransport(fqName, instance);
    if (!transport.isOk()) {
        ALOGE("Failed to obtain transport type for %s/%s: %s",
        ALOGW("Failed to obtain transport type for %s/%s: %s",
              fqName.c_str(), instance.c_str(), transport.description().c_str());
        return false;
    }
    return transport != Transport::EMPTY;
}

bool hasHalService(const InterfaceName& interface, const AudioHalVersionInfo& version) {
    auto halType = version.getType();
    if (halType == AudioHalVersionInfo::Type::AIDL) {
        return hasAidlHalService(interface, version);
    } else if (version.getType() == AudioHalVersionInfo::Type::HIDL) {
        return hasHidlHalService(interface, version);
    } else {
        ALOGE("HalType not supported %s", version.toString().c_str());
        return false;
    }
}

}  // namespace

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); });
void *createPreferredImpl(bool isDevice) {
    auto findMostRecentVersion = [](const auto& iMap) {
        return std::find_if(sAudioHALVersions.begin(), sAudioHALVersions.end(),
                            [iMap](const auto& v) {
                                auto iface = iMap.find(v.getType());
                                return hasHalService(iface->second, v);
                            });
    };
    auto ifaceVersionIt = findMostRecentVersion(iface);
    auto siblingVersionIt = findMostRecentVersion(siblingIface);
    if (ifaceVersionIt != detail::sAudioHALVersions.end() &&
            siblingVersionIt != detail::sAudioHALVersions.end() &&

    auto interfaceMap = isDevice ? sDevicesHALInterfaces : sEffectsHALInterfaces;
    auto siblingInterfaceMap = isDevice ? sEffectsHALInterfaces : sDevicesHALInterfaces;
    auto ifaceVersionIt = findMostRecentVersion(interfaceMap);
    auto siblingVersionIt = findMostRecentVersion(siblingInterfaceMap);
    if (ifaceVersionIt != sAudioHALVersions.end() &&
        siblingVersionIt != sAudioHALVersions.end() &&
        // same major version
            ifaceVersionIt->first.first == siblingVersionIt->first.first) {
        std::string libraryVersion =
                ifaceVersionIt->first >= siblingVersionIt->first ?
                ifaceVersionIt->second : siblingVersionIt->second;
        ifaceVersionIt->getMajorVersion() == siblingVersionIt->getMajorVersion()) {
        void* rawInterface;
        if (createHalService(libraryVersion, iface.second, &rawInterface)) {
        if (createHalService(std::max(*ifaceVersionIt, *siblingVersionIt), isDevice,
                             &rawInterface)) {
            return rawInterface;
        } else {
            ALOGE("Failed to create HAL services with major %s, sibling %s!",
                  ifaceVersionIt->toString().c_str(), siblingVersionIt->toString().c_str());
        }
    } else {
        ALOGE("Found no HAL version, main(%s) %s %s!", isDevice ? "Device" : "Effect",
              (ifaceVersionIt == sAudioHALVersions.end()) ? "null"
                                                          : ifaceVersionIt->toString().c_str(),
              (siblingVersionIt == sAudioHALVersions.end()) ? "null"
                                                            : siblingVersionIt->toString().c_str());
    }
    return nullptr;
}
+70 −24
Original line number Diff line number Diff line
@@ -12,13 +12,14 @@ filegroup {
    srcs: [
        "CoreConversionHelperHidl.cpp",
        "DeviceHalHidl.cpp",
        "DevicesFactoryHalEntry.cpp",
        "DevicesFactoryHalHidl.cpp",
        "StreamHalHidl.cpp",
    ],
}

filegroup {
    name: "audio_effect_hal_client_sources",
    name: "audio_effect_hidl_hal_client_sources",
    srcs: [
        "EffectBufferHalHidl.cpp",
        "EffectConversionHelperHidl.cpp",
@@ -27,6 +28,21 @@ filegroup {
    ],
}

cc_defaults {
    name: "libaudiohal_hidl_default",
    shared_libs: [
        "android.hardware.audio.common-util",
        "android.hidl.allocator@1.0",
        "android.hidl.memory@1.0",
        "libaudiohal_deathhandler",
        "libhidlbase",
        "libhidlmemory",
    ],
    header_libs: [
        "android.hardware.audio.common.util@all-versions",
    ]
}

cc_defaults {
    name: "libaudiohal_default",

@@ -37,28 +53,21 @@ cc_defaults {
        "-fvisibility=hidden",
    ],
    shared_libs: [
        "android.hardware.audio.common-util",
        "android.hidl.allocator@1.0",
        "android.hidl.memory@1.0",
        "audioclient-types-aidl-cpp",
        "av-types-aidl-cpp",
        "libaudiofoundation",
        "libaudiohal_deathhandler",
        "libaudioutils",
        "libbase",
        "libbinder",
        "libcutils",
        "libfmq",
        "libhardware",
        "libhidlbase",
        "libhidlmemory",
        "liblog",
        "libmedia_helper",
        "libmediautils",
        "libutils",
        "audioclient-types-aidl-cpp",
    ],
    header_libs: [
        "android.hardware.audio.common.util@all-versions",
        "libaudioclient_headers",
        "libaudiohal_headers"
    ],
@@ -70,11 +79,14 @@ cc_defaults {

cc_library_shared {
    name: "libaudiohal@4.0",
    defaults: ["libaudiohal_default"],
    defaults: [
        "libaudiohal_default",
        "libaudiohal_hidl_default"
    ],
    srcs: [
        ":audio_core_hal_client_sources",
        ":audio_effect_hal_client_sources",
        "EffectsFactoryHalHidlEntry.cpp",
        ":audio_effect_hidl_hal_client_sources",
        "EffectsFactoryHalEntry.cpp",
    ],
    shared_libs: [
        "android.hardware.audio.common@4.0",
@@ -93,11 +105,14 @@ cc_library_shared {

cc_library_shared {
    name: "libaudiohal@5.0",
    defaults: ["libaudiohal_default"],
    defaults: [
        "libaudiohal_default",
        "libaudiohal_hidl_default"
    ],
    srcs: [
        ":audio_core_hal_client_sources",
        ":audio_effect_hal_client_sources",
        "EffectsFactoryHalHidlEntry.cpp",
        ":audio_effect_hidl_hal_client_sources",
        "EffectsFactoryHalEntry.cpp",
    ],
    shared_libs: [
        "android.hardware.audio.common@5.0",
@@ -116,11 +131,14 @@ cc_library_shared {

cc_library_shared {
    name: "libaudiohal@6.0",
    defaults: ["libaudiohal_default"],
    defaults: [
        "libaudiohal_default",
        "libaudiohal_hidl_default"
    ],
    srcs: [
        ":audio_core_hal_client_sources",
        ":audio_effect_hal_client_sources",
        "EffectsFactoryHalHidlEntry.cpp",
        ":audio_effect_hidl_hal_client_sources",
        "EffectsFactoryHalEntry.cpp",
    ],
    shared_libs: [
        "android.hardware.audio.common@6.0",
@@ -139,9 +157,12 @@ cc_library_shared {

cc_library_static {
    name: "libaudiohal.effect@7.0",
    defaults: ["libaudiohal_default"],
    defaults: [
        "libaudiohal_default",
        "libaudiohal_hidl_default"
    ],
    srcs: [
        ":audio_effect_hal_client_sources",
        ":audio_effect_hidl_hal_client_sources",
    ],
    static_libs: [
        "android.hardware.audio.common@7.0",
@@ -158,10 +179,13 @@ cc_library_static {

cc_library_shared {
    name: "libaudiohal@7.0",
    defaults: ["libaudiohal_default"],
    defaults: [
        "libaudiohal_default",
        "libaudiohal_hidl_default"
    ],
    srcs: [
        ":audio_core_hal_client_sources",
        "EffectsFactoryHalHidlEntry.cpp",
        "EffectsFactoryHalEntry.cpp",
    ],
    static_libs: [
        "android.hardware.audio.common@7.0",
@@ -182,10 +206,13 @@ cc_library_shared {

cc_library_shared {
    name: "libaudiohal@7.1",
    defaults: ["libaudiohal_default"],
    defaults: [
        "libaudiohal_default",
        "libaudiohal_hidl_default"
    ],
    srcs: [
        ":audio_core_hal_client_sources",
        "EffectsFactoryHalHidlEntry.cpp",
        "EffectsFactoryHalEntry.cpp",
    ],
    static_libs: [
        "android.hardware.audio.common@7.0",
@@ -207,3 +234,22 @@ cc_library_shared {
        "-include common/all-versions/VersionMacro.h",
    ]
}

cc_library_shared {
    name: "libaudiohal@aidl",
    defaults: [
        "libaudiohal_default",
        "latest_android_hardware_audio_common_ndk_shared",
        "latest_android_hardware_audio_core_ndk_shared",
        "latest_android_hardware_audio_effect_ndk_shared",
    ],
    srcs: [
        "DevicesFactoryHalEntry.cpp",
        "DevicesFactoryHalAidl.cpp",
        "EffectsFactoryHalAidl.cpp",
        "EffectsFactoryHalEntry.cpp",
    ],
    shared_libs: [
        "libbinder_ndk",
    ]
}
 No newline at end of file
Loading