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

Commit f52fe94b authored by Mikhail Naganov's avatar Mikhail Naganov
Browse files

Revert "Revert "Services : Load the IhalAdapterVendorExtension s..."

Revert submission 3400281-revert-3350769-ihaladaptervendorextension-so-ZFPCAKNDVM

Reason for revert: added aosp/3412141 to avoid breaking tests

Reverted changes: /q/submissionid:3400281-revert-3350769-ihaladaptervendorextension-so-ZFPCAKNDVM

Bug: 372181051
Test: atest DeviceBootTest
Change-Id: I44f677dca8ff33238ffe697299ba8de166af04ff
parent bbe0d951
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ cc_defaults {
    shared_libs: [
        "libbase",
        "libbinder_ndk",
        "libmediautils",
    ],

    cflags: [
+2 −2
Original line number Diff line number Diff line
@@ -14,11 +14,11 @@
 * limitations under the License.
 */

#include "ParameterParser.h"

#define LOG_TAG "Audio_ParameterParser"
#include <android-base/logging.h>

#include "ParameterParser.h"

namespace vendor::audio::parserservice {

using ::aidl::android::hardware::audio::core::VendorParameter;
+51 −10
Original line number Diff line number Diff line
@@ -16,26 +16,67 @@

#define LOG_TAG "Audio_ParameterParser"
#include <android-base/logging.h>
#include <android-base/properties.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
#include <mediautils/Library.h>

#include "ParameterParser.h"

using vendor::audio::parserservice::ParameterParser;

binder_status_t tryRegisteringVendorImpl() {
    /*
     * The property "ro.audio.ihaladaptervendorextension_libname" allows vendors
     * or OEMs to dynamically load a specific library
     * into this process space using dlopen.
     *
     * "createIHalAdapterVendorExtension" symbol needs to be defined in
     * the dynamically loaded library used to register the
     * "::aidl::android::hardware::audio::core::IHalAdapterVendorExtension/default"
     * with the ServiceManager.
     */
    static std::string kLibPropName =
            ::android::base::GetProperty("ro.audio.ihaladaptervendorextension_libname", "");
    if (kLibPropName == "") {
        LOG(DEBUG) << kLibPropName << "property is not found";
        return STATUS_BAD_VALUE;
    }
    static std::shared_ptr<void> libHandle =
            android::mediautils::loadLibrary(kLibPropName.c_str());
    if (libHandle == nullptr) {
        LOG(ERROR) << "Failed to load library:" << kLibPropName;
        return STATUS_BAD_VALUE;
    }
    const std::string kLibSymbol = "createIHalAdapterVendorExtension";
    std::shared_ptr<void> untypedObject = android::mediautils::getUntypedObjectFromLibrary(
            kLibSymbol.c_str(), libHandle);
    auto createIHalAdapterVendorExtension = reinterpret_cast<int (*)()>(untypedObject.get());
    if (createIHalAdapterVendorExtension == nullptr) {
        LOG(ERROR) << "Failed to find symbol \"" << kLibSymbol << "\"";
        return STATUS_BAD_VALUE;
    }
    return createIHalAdapterVendorExtension();
}

int main() {
    // This is a debug implementation, always enable debug logging.
    android::base::SetMinimumLogSeverity(::android::base::DEBUG);

    auto parser = ndk::SharedRefBase::make<ParameterParser>();
    if (tryRegisteringVendorImpl() != STATUS_OK) {
        const std::string parserFqn =
            std::string().append(ParameterParser::descriptor).append("/default");
                std::string()
                        .append(::aidl::android::media::audio::IHalAdapterVendorExtension::
                                        descriptor)
                        .append("/default");
        auto parser = ndk::SharedRefBase::make<ParameterParser>();
        binder_status_t status =
                AServiceManager_addService(parser->asBinder().get(), parserFqn.c_str());
        if (status != STATUS_OK) {
            LOG(ERROR) << "failed to register service for \"" << parserFqn << "\"";
        }

    } else {
        LOG(INFO) << "IHalAdapterVendorExtension registered with vendor's implementation";
    }
    ABinderProcess_joinThreadPool();
    return EXIT_FAILURE; // should not reach
}