gsi: sysbta: Separate audio interfaces from bluetooth
This will allow us to dynamically load multiple different versions of audio interface implementation into the same sysbta hal process. Note that since we are using a weird suffix here, the default `registerPassthroughServiceImplementation` will not work, and we will have to define our own dynamic symbol for it.
This commit is contained in:
parent
323ef8d915
commit
4f1e4824dc
56
audio/hal/Android.bp
Normal file
56
audio/hal/Android.bp
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
cc_defaults {
|
||||||
|
name: "android.hardware.audio-impl-system_default",
|
||||||
|
relative_install_path: "hw",
|
||||||
|
srcs: [
|
||||||
|
"Device.cpp",
|
||||||
|
"DevicesFactory.cpp",
|
||||||
|
"ParametersUtil.cpp",
|
||||||
|
"PrimaryDevice.cpp",
|
||||||
|
"Stream.cpp",
|
||||||
|
"StreamIn.cpp",
|
||||||
|
"StreamOut.cpp",
|
||||||
|
"service.cpp",
|
||||||
|
],
|
||||||
|
shared_libs: [
|
||||||
|
"libbase",
|
||||||
|
"libcutils",
|
||||||
|
"libfmq",
|
||||||
|
"libhardware",
|
||||||
|
"libhidlbase",
|
||||||
|
"liblog",
|
||||||
|
"libmedia_helper",
|
||||||
|
"libmediautils_vendor",
|
||||||
|
"libmemunreachable",
|
||||||
|
"libutils",
|
||||||
|
"android.hardware.audio.common-util",
|
||||||
|
],
|
||||||
|
static_libs: [
|
||||||
|
"libaudiofoundation",
|
||||||
|
],
|
||||||
|
header_libs: [
|
||||||
|
"android.hardware.audio.common.util@all-versions",
|
||||||
|
"libaudioutils_headers",
|
||||||
|
"libaudio_system_headers",
|
||||||
|
"libmedia_headers",
|
||||||
|
"libmediautils_headers",
|
||||||
|
"libhardware_headers",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
cc_library_shared {
|
||||||
|
name: "android.hardware.audio@6.0-impl-system",
|
||||||
|
defaults: ["android.hardware.audio-impl-system_default"],
|
||||||
|
shared_libs: [
|
||||||
|
"android.hardware.audio@6.0",
|
||||||
|
"android.hardware.audio@6.0-util",
|
||||||
|
"android.hardware.audio.common@6.0",
|
||||||
|
"android.hardware.audio.common@6.0-util",
|
||||||
|
],
|
||||||
|
cflags: [
|
||||||
|
"-DMAJOR_VERSION=6",
|
||||||
|
"-DMINOR_VERSION=0",
|
||||||
|
"-DCOMMON_TYPES_MINOR_VERSION=0",
|
||||||
|
"-DCORE_TYPES_MINOR_VERSION=0",
|
||||||
|
"-include common/all-versions/VersionMacro.h",
|
||||||
|
],
|
||||||
|
}
|
@ -142,7 +142,7 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
IDevicesFactory* HIDL_FETCH_IDevicesFactory(const char* name) {
|
IDevicesFactory* HIDL_FETCH_IDevicesFactory(const char* name) {
|
||||||
return strcmp(name, "default") == 0 ? new DevicesFactory() : nullptr;
|
return new DevicesFactory();
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace implementation
|
} // namespace implementation
|
15
audio/hal/service.cpp
Normal file
15
audio/hal/service.cpp
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
#include "DevicesFactory.h"
|
||||||
|
#include PATH(android/hardware/audio/FILE_VERSION/IDevicesFactory.h)
|
||||||
|
|
||||||
|
#include <hidl/Status.h>
|
||||||
|
|
||||||
|
using ::android::status_t;
|
||||||
|
using ::android::hardware::audio::CPP_VERSION::implementation::DevicesFactory;
|
||||||
|
using namespace ::android::hardware::audio::CPP_VERSION;
|
||||||
|
|
||||||
|
extern "C" __attribute__((visibility("default")))
|
||||||
|
status_t createIDevicesFactory(const char *instance_name) {
|
||||||
|
::android::sp<IDevicesFactory> audio_factory = new DevicesFactory();
|
||||||
|
::android::status_t hidl_status = audio_factory->registerAsService(instance_name);
|
||||||
|
return hidl_status;
|
||||||
|
}
|
@ -1,29 +1,3 @@
|
|||||||
cc_library_shared {
|
|
||||||
name: "android.hardware.bluetooth.audio-system-impl",
|
|
||||||
vintf_fragments: ["bluetooth_audio.xml"],
|
|
||||||
srcs: [
|
|
||||||
"BluetoothAudioProvider.cpp",
|
|
||||||
"BluetoothAudioProviderFactory.cpp",
|
|
||||||
"A2dpOffloadAudioProvider.cpp",
|
|
||||||
"A2dpSoftwareAudioProvider.cpp",
|
|
||||||
"HearingAidAudioProvider.cpp",
|
|
||||||
"LeAudioOffloadAudioProvider.cpp",
|
|
||||||
"LeAudioSoftwareAudioProvider.cpp",
|
|
||||||
"service.cpp",
|
|
||||||
],
|
|
||||||
export_include_dirs: ["."],
|
|
||||||
header_libs: ["libhardware_headers"],
|
|
||||||
shared_libs: [
|
|
||||||
"libbase",
|
|
||||||
"libbinder_ndk",
|
|
||||||
"libcutils",
|
|
||||||
"libfmq",
|
|
||||||
"liblog",
|
|
||||||
"android.hardware.bluetooth.audio-V2-ndk",
|
|
||||||
"libbluetooth_audio_session_aidl_system",
|
|
||||||
],
|
|
||||||
}
|
|
||||||
|
|
||||||
cc_binary {
|
cc_binary {
|
||||||
name: "android.hardware.bluetooth.audio-service-system",
|
name: "android.hardware.bluetooth.audio-service-system",
|
||||||
vintf_fragments: ["bluetooth_audio_system.xml"],
|
vintf_fragments: ["bluetooth_audio_system.xml"],
|
||||||
@ -37,22 +11,10 @@ cc_binary {
|
|||||||
"HearingAidAudioProvider.cpp",
|
"HearingAidAudioProvider.cpp",
|
||||||
"LeAudioOffloadAudioProvider.cpp",
|
"LeAudioOffloadAudioProvider.cpp",
|
||||||
"LeAudioSoftwareAudioProvider.cpp",
|
"LeAudioSoftwareAudioProvider.cpp",
|
||||||
"Device.cpp",
|
|
||||||
"DevicesFactory.cpp",
|
|
||||||
"ParametersUtil.cpp",
|
|
||||||
"PrimaryDevice.cpp",
|
|
||||||
"Stream.cpp",
|
|
||||||
"StreamIn.cpp",
|
|
||||||
"StreamOut.cpp",
|
|
||||||
"service_system.cpp",
|
"service_system.cpp",
|
||||||
],
|
],
|
||||||
header_libs: [
|
header_libs: [
|
||||||
"libhardware_headers",
|
"libhardware_headers",
|
||||||
"android.hardware.audio.common.util@all-versions",
|
|
||||||
"libaudioutils_headers",
|
|
||||||
"libaudio_system_headers",
|
|
||||||
"libmedia_headers",
|
|
||||||
"libmediautils_headers",
|
|
||||||
],
|
],
|
||||||
shared_libs: [
|
shared_libs: [
|
||||||
"libbase",
|
"libbase",
|
||||||
@ -60,33 +22,14 @@ cc_binary {
|
|||||||
"libbinder_ndk",
|
"libbinder_ndk",
|
||||||
"libcutils",
|
"libcutils",
|
||||||
"libfmq",
|
"libfmq",
|
||||||
"liblog",
|
|
||||||
"android.hardware.bluetooth.audio-V2-ndk",
|
|
||||||
"libbluetooth_audio_session_aidl_system",
|
|
||||||
"libfmq",
|
|
||||||
"libhardware",
|
|
||||||
"libhidlbase",
|
"libhidlbase",
|
||||||
"liblog",
|
"liblog",
|
||||||
"libmedia_helper",
|
|
||||||
"libmediautils_vendor",
|
|
||||||
"libmemunreachable",
|
|
||||||
"libutils",
|
"libutils",
|
||||||
"android.hardware.audio.common-util",
|
"android.hardware.bluetooth.audio-V2-ndk",
|
||||||
"android.hardware.audio@6.0",
|
"libbluetooth_audio_session_aidl_system",
|
||||||
// "android.hardware.audio@7.1",
|
|
||||||
"android.hardware.audio@6.0-util",
|
|
||||||
"android.hardware.audio.common@6.0",
|
|
||||||
// "android.hardware.audio.common@6.0-enums",
|
|
||||||
"android.hardware.audio.common@6.0-util",
|
|
||||||
],
|
],
|
||||||
static_libs: [
|
required: [
|
||||||
"libaudiofoundation",
|
// Audio HAL impls
|
||||||
],
|
"android.hardware.audio@6.0-impl-system",
|
||||||
cflags: [
|
|
||||||
"-DMAJOR_VERSION=6",
|
|
||||||
"-DMINOR_VERSION=0",
|
|
||||||
"-DCOMMON_TYPES_MINOR_VERSION=0",
|
|
||||||
"-DCORE_TYPES_MINOR_VERSION=0",
|
|
||||||
"-include common/all-versions/VersionMacro.h",
|
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
<manifest version="1.0" type="device">
|
|
||||||
<hal format="aidl">
|
|
||||||
<name>android.hardware.bluetooth.audio</name>
|
|
||||||
<version>2</version>
|
|
||||||
<fqname>IBluetoothAudioProviderFactory/default</fqname>
|
|
||||||
</hal>
|
|
||||||
</manifest>
|
|
@ -1,38 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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.
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define LOG_TAG "BtAudioAIDLService"
|
|
||||||
|
|
||||||
#include <android/binder_manager.h>
|
|
||||||
#include <android/binder_process.h>
|
|
||||||
#include <utils/Log.h>
|
|
||||||
|
|
||||||
#include "BluetoothAudioProviderFactory.h"
|
|
||||||
|
|
||||||
using ::aidl::android::hardware::bluetooth::audio::
|
|
||||||
BluetoothAudioProviderFactory;
|
|
||||||
|
|
||||||
extern "C" __attribute__((visibility("default"))) binder_status_t
|
|
||||||
createIBluetoothAudioProviderFactory() {
|
|
||||||
auto factory = ::ndk::SharedRefBase::make<BluetoothAudioProviderFactory>();
|
|
||||||
const std::string instance_name =
|
|
||||||
std::string() + BluetoothAudioProviderFactory::descriptor + "/default";
|
|
||||||
binder_status_t aidl_status = AServiceManager_addService(
|
|
||||||
factory->asBinder().get(), instance_name.c_str());
|
|
||||||
ALOGW_IF(aidl_status != STATUS_OK, "Could not register %s, status=%d",
|
|
||||||
instance_name.c_str(), aidl_status);
|
|
||||||
return aidl_status;
|
|
||||||
}
|
|
@ -16,29 +16,61 @@
|
|||||||
|
|
||||||
#define LOG_TAG "BtAudioAIDLServiceSystem"
|
#define LOG_TAG "BtAudioAIDLServiceSystem"
|
||||||
|
|
||||||
|
#include <dlfcn.h>
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
|
||||||
#include <android/binder_manager.h>
|
#include <android/binder_manager.h>
|
||||||
#include <android/binder_process.h>
|
#include <android/binder_process.h>
|
||||||
#include <utils/Log.h>
|
#include <utils/Log.h>
|
||||||
#include <hidl/HidlTransportSupport.h>
|
#include <hidl/HidlTransportSupport.h>
|
||||||
#include <hidl/LegacySupport.h>
|
//#include <hidl/LegacySupport.h>
|
||||||
#include <hwbinder/ProcessState.h>
|
#include <hwbinder/ProcessState.h>
|
||||||
#include <binder/ProcessState.h>
|
#include <binder/ProcessState.h>
|
||||||
|
|
||||||
#include PATH(android/hardware/audio/FILE_VERSION/IDevicesFactory.h)
|
//#include PATH(android/hardware/audio/FILE_VERSION/IDevicesFactory.h)
|
||||||
|
|
||||||
#include <hardware/audio.h>
|
//#include <hardware/audio.h>
|
||||||
|
|
||||||
#include "BluetoothAudioProviderFactory.h"
|
#include "BluetoothAudioProviderFactory.h"
|
||||||
#include "DevicesFactory.h"
|
//#include "DevicesFactory.h"
|
||||||
|
|
||||||
//using namespace android::hardware;
|
//using namespace android::hardware;
|
||||||
using ::aidl::android::hardware::bluetooth::audio::
|
using ::aidl::android::hardware::bluetooth::audio::
|
||||||
BluetoothAudioProviderFactory;
|
BluetoothAudioProviderFactory;
|
||||||
|
|
||||||
using ::android::hardware::audio::CPP_VERSION::implementation::DevicesFactory;
|
//using ::android::hardware::audio::CPP_VERSION::implementation::DevicesFactory;
|
||||||
using namespace ::android::hardware::audio::CPP_VERSION;
|
//using namespace ::android::hardware::audio::CPP_VERSION;
|
||||||
|
|
||||||
|
#if defined(__LP64__)
|
||||||
|
#define HAL_LIBRARY_PATH "/system/lib64/hw"
|
||||||
|
#else
|
||||||
|
#define HAL_LIBRARY_PATH "/system/lib/hw"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void registerAudioInterfaces() {
|
||||||
|
const char *interface_libs[] = {
|
||||||
|
"android.hardware.audio@6.0-impl-system.so",
|
||||||
|
};
|
||||||
|
|
||||||
|
for (auto& lib : interface_libs) {
|
||||||
|
void* handle = dlopen((std::string() + HAL_LIBRARY_PATH + "/" + lib).c_str(), RTLD_NOW);
|
||||||
|
if (handle == nullptr) {
|
||||||
|
ALOGW("Failed to load %s, skipping", lib);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
::android::status_t (*entry_func)(const char*);
|
||||||
|
entry_func = reinterpret_cast<::android::status_t (*)(const char*)>(dlsym(handle, "createIDevicesFactory"));
|
||||||
|
|
||||||
|
if (entry_func == nullptr) {
|
||||||
|
ALOGW("Cannot find entry symbol in %s, skipping", lib);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
::android::status_t status = entry_func("sysbta");
|
||||||
|
ALOGW_IF(status != STATUS_OK, "Could not register sysbta for %s, status=%d", lib, status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
@ -57,9 +89,13 @@ int main() {
|
|||||||
ALOGW_IF(aidl_status != STATUS_OK, "Could not register %s, status=%d",
|
ALOGW_IF(aidl_status != STATUS_OK, "Could not register %s, status=%d",
|
||||||
instance_name.c_str(), aidl_status);
|
instance_name.c_str(), aidl_status);
|
||||||
|
|
||||||
::android::sp<IDevicesFactory> audio_factory = new DevicesFactory();
|
//::android::sp<IDevicesFactory> audio_factory = new DevicesFactory();
|
||||||
::android::status_t hidl_status = audio_factory->registerAsService("sysbta");
|
//::android::status_t hidl_status = audio_factory->registerAsService("sysbta");
|
||||||
ALOGW_IF(hidl_status != STATUS_OK, "Could not register sysbta, status=%d", hidl_status);
|
//ALOGW_IF(hidl_status != STATUS_OK, "Could not register sysbta, status=%d", hidl_status);
|
||||||
|
|
||||||
|
// We must also implement audio HAL interfaces in order to serve audio.sysbta.default.so
|
||||||
|
// It must be served in the *same* process to access the same libbluetooth_audio_session
|
||||||
|
registerAudioInterfaces();
|
||||||
|
|
||||||
::android::hardware::joinRpcThreadpool();
|
::android::hardware::joinRpcThreadpool();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user