Loading media/libaudiohal/impl/AidlUtils.h 0 → 100644 +44 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <memory> #include <string> #include <android/binder_auto_utils.h> #include <android/binder_manager.h> namespace android { template<class Intf> std::shared_ptr<Intf> getServiceInstance(const std::string& instanceName) { const std::string serviceName = std::string(Intf::descriptor).append("/").append(instanceName); std::shared_ptr<Intf> service; while (!service) { AIBinder* serviceBinder = nullptr; while (!serviceBinder) { // 'waitForService' may return a nullptr, hopefully a transient error. serviceBinder = AServiceManager_waitForService(serviceName.c_str()); } // `fromBinder` may fail and return a nullptr if the service has died in the meantime. service = Intf::fromBinder(ndk::SpAIBinder(serviceBinder)); } return service; } } // namespace android media/libaudiohal/impl/DevicesFactoryHalAidl.cpp +3 −17 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <media/AidlConversionUtil.h> #include <utils/Log.h> #include "AidlUtils.h" #include "DeviceHalAidl.h" #include "DevicesFactoryHalAidl.h" Loading Loading @@ -179,16 +180,8 @@ status_t DevicesFactoryHalAidl::openDevice(const char *name, sp<DeviceHalInterfa if (name == nullptr || device == nullptr) { return BAD_VALUE; } std::shared_ptr<IModule> service; if (strcmp(name, "primary") == 0) name = "default"; auto serviceName = std::string(IModule::descriptor) + "/" + name; service = IModule::fromBinder( ndk::SpAIBinder(AServiceManager_waitForService(serviceName.c_str()))); if (service == nullptr) { ALOGE("%s fromBinder %s failed", __func__, serviceName.c_str()); return NO_INIT; } *device = sp<DeviceHalAidl>::make(name, service, mVendorExt); *device = sp<DeviceHalAidl>::make(name, getServiceInstance<IModule>(name), mVendorExt); return OK; } Loading Loading @@ -229,14 +222,7 @@ status_t DevicesFactoryHalAidl::getEngineConfig( // Main entry-point to the shared library. extern "C" __attribute__((visibility("default"))) void* createIDevicesFactoryImpl() { auto serviceName = std::string(IConfig::descriptor) + "/default"; auto service = IConfig::fromBinder( ndk::SpAIBinder(AServiceManager_waitForService(serviceName.c_str()))); if (!service) { ALOGE("%s binder service %s not exist", __func__, serviceName.c_str()); return nullptr; } return new DevicesFactoryHalAidl(service); return new DevicesFactoryHalAidl(getServiceInstance<IConfig>("default")); } } // namespace android media/libaudiohal/impl/EffectsFactoryHalAidl.cpp +2 −8 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <system/audio_aidl_utils.h> #include <utils/Log.h> #include "AidlUtils.h" #include "EffectBufferHalAidl.h" #include "EffectHalAidl.h" #include "EffectProxy.h" Loading Loading @@ -356,14 +357,7 @@ std::shared_ptr<const effectsConfig::Processings> EffectsFactoryHalAidl::getProc // exports from a static library are optimized out unless actually used by // the shared library. See EffectsFactoryHalEntry.cpp. extern "C" void* createIEffectsFactoryImpl() { auto serviceName = std::string(IFactory::descriptor) + "/default"; auto service = IFactory::fromBinder( ndk::SpAIBinder(AServiceManager_waitForService(serviceName.c_str()))); if (!service) { ALOGE("%s binder service %s not exist", __func__, serviceName.c_str()); return nullptr; } return new effect::EffectsFactoryHalAidl(service); return new effect::EffectsFactoryHalAidl(getServiceInstance<IFactory>("default")); } } // namespace android Loading
media/libaudiohal/impl/AidlUtils.h 0 → 100644 +44 −0 Original line number Diff line number Diff line /* * Copyright (C) 2024 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. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include <memory> #include <string> #include <android/binder_auto_utils.h> #include <android/binder_manager.h> namespace android { template<class Intf> std::shared_ptr<Intf> getServiceInstance(const std::string& instanceName) { const std::string serviceName = std::string(Intf::descriptor).append("/").append(instanceName); std::shared_ptr<Intf> service; while (!service) { AIBinder* serviceBinder = nullptr; while (!serviceBinder) { // 'waitForService' may return a nullptr, hopefully a transient error. serviceBinder = AServiceManager_waitForService(serviceName.c_str()); } // `fromBinder` may fail and return a nullptr if the service has died in the meantime. service = Intf::fromBinder(ndk::SpAIBinder(serviceBinder)); } return service; } } // namespace android
media/libaudiohal/impl/DevicesFactoryHalAidl.cpp +3 −17 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <media/AidlConversionUtil.h> #include <utils/Log.h> #include "AidlUtils.h" #include "DeviceHalAidl.h" #include "DevicesFactoryHalAidl.h" Loading Loading @@ -179,16 +180,8 @@ status_t DevicesFactoryHalAidl::openDevice(const char *name, sp<DeviceHalInterfa if (name == nullptr || device == nullptr) { return BAD_VALUE; } std::shared_ptr<IModule> service; if (strcmp(name, "primary") == 0) name = "default"; auto serviceName = std::string(IModule::descriptor) + "/" + name; service = IModule::fromBinder( ndk::SpAIBinder(AServiceManager_waitForService(serviceName.c_str()))); if (service == nullptr) { ALOGE("%s fromBinder %s failed", __func__, serviceName.c_str()); return NO_INIT; } *device = sp<DeviceHalAidl>::make(name, service, mVendorExt); *device = sp<DeviceHalAidl>::make(name, getServiceInstance<IModule>(name), mVendorExt); return OK; } Loading Loading @@ -229,14 +222,7 @@ status_t DevicesFactoryHalAidl::getEngineConfig( // Main entry-point to the shared library. extern "C" __attribute__((visibility("default"))) void* createIDevicesFactoryImpl() { auto serviceName = std::string(IConfig::descriptor) + "/default"; auto service = IConfig::fromBinder( ndk::SpAIBinder(AServiceManager_waitForService(serviceName.c_str()))); if (!service) { ALOGE("%s binder service %s not exist", __func__, serviceName.c_str()); return nullptr; } return new DevicesFactoryHalAidl(service); return new DevicesFactoryHalAidl(getServiceInstance<IConfig>("default")); } } // namespace android
media/libaudiohal/impl/EffectsFactoryHalAidl.cpp +2 −8 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ #include <system/audio_aidl_utils.h> #include <utils/Log.h> #include "AidlUtils.h" #include "EffectBufferHalAidl.h" #include "EffectHalAidl.h" #include "EffectProxy.h" Loading Loading @@ -356,14 +357,7 @@ std::shared_ptr<const effectsConfig::Processings> EffectsFactoryHalAidl::getProc // exports from a static library are optimized out unless actually used by // the shared library. See EffectsFactoryHalEntry.cpp. extern "C" void* createIEffectsFactoryImpl() { auto serviceName = std::string(IFactory::descriptor) + "/default"; auto service = IFactory::fromBinder( ndk::SpAIBinder(AServiceManager_waitForService(serviceName.c_str()))); if (!service) { ALOGE("%s binder service %s not exist", __func__, serviceName.c_str()); return nullptr; } return new effect::EffectsFactoryHalAidl(service); return new effect::EffectsFactoryHalAidl(getServiceInstance<IFactory>("default")); } } // namespace android