Compare commits

..

2 commits

Author SHA1 Message Date
5a38b5b333 gsi: sysbta: Implement all existing audio HAL versions
This is needed because libaudiohal.so can only interact with one HAL
version at a time (loading only one of the libaudiohal@version.so
implementations), so only the interface that matches the stock HAL
version will be used. libaudiohal decides which version to use by
looking through the interfaces whose variant is `default` and picking
the highest versioned one, so our hal will not interfere in the process
(because we use `sysbta` as our variant).
2022-08-24 21:07:35 -04:00
94f2037c77 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.
2022-08-24 20:33:33 -04:00
22 changed files with 209 additions and 120 deletions

139
audio/hal/Android.bp Normal file
View file

@ -0,0 +1,139 @@
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@2.0-impl-system",
defaults: ["android.hardware.audio-impl-system_default"],
shared_libs: [
"android.hardware.audio@2.0",
"android.hardware.audio@2.0-util",
"android.hardware.audio.common@2.0",
"android.hardware.audio.common@2.0-util",
],
cflags: [
"-DMAJOR_VERSION=2",
"-DMINOR_VERSION=0",
"-include common/all-versions/VersionMacro.h",
],
}
cc_library_shared {
name: "android.hardware.audio@4.0-impl-system",
defaults: ["android.hardware.audio-impl-system_default"],
shared_libs: [
"android.hardware.audio@4.0",
"android.hardware.audio@4.0-util",
"android.hardware.audio.common@4.0",
"android.hardware.audio.common@4.0-util",
],
cflags: [
"-DMAJOR_VERSION=4",
"-DMINOR_VERSION=0",
"-include common/all-versions/VersionMacro.h",
],
}
cc_library_shared {
name: "android.hardware.audio@5.0-impl-system",
defaults: ["android.hardware.audio-impl-system_default"],
shared_libs: [
"android.hardware.audio@5.0",
"android.hardware.audio@5.0-util",
"android.hardware.audio.common@5.0",
"android.hardware.audio.common@5.0-util",
],
cflags: [
"-DMAJOR_VERSION=5",
"-DMINOR_VERSION=0",
"-include common/all-versions/VersionMacro.h",
],
}
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",
"-include common/all-versions/VersionMacro.h",
],
}
cc_library_shared {
name: "android.hardware.audio@7.0-impl-system",
defaults: ["android.hardware.audio-impl-system_default"],
shared_libs: [
"android.hardware.audio@7.0",
"android.hardware.audio@7.0-util",
"android.hardware.audio.common@7.0",
"android.hardware.audio.common@7.0-enums",
"android.hardware.audio.common@7.0-util",
"libbase",
],
cflags: [
"-DMAJOR_VERSION=7",
"-DMINOR_VERSION=0",
"-include common/all-versions/VersionMacro.h",
],
}
cc_library_shared {
name: "android.hardware.audio@7.1-impl-system",
defaults: ["android.hardware.audio-impl-system_default"],
shared_libs: [
"android.hardware.audio@7.0",
"android.hardware.audio@7.1",
"android.hardware.audio@7.1-util",
"android.hardware.audio.common@7.0",
"android.hardware.audio.common@7.1-enums",
"android.hardware.audio.common@7.1-util",
"libbase",
],
cflags: [
"-DMAJOR_VERSION=7",
"-DMINOR_VERSION=1",
"-DCOMMON_TYPES_MINOR_VERSION=0",
"-DCORE_TYPES_MINOR_VERSION=0",
"-include common/all-versions/VersionMacro.h",
],
}

View file

@ -142,7 +142,7 @@ out:
}
IDevicesFactory* HIDL_FETCH_IDevicesFactory(const char* name) {
return strcmp(name, "default") == 0 ? new DevicesFactory() : nullptr;
return new DevicesFactory();
}
} // namespace implementation

15
audio/hal/service.cpp Normal file
View 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;
}

View file

@ -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 {
name: "android.hardware.bluetooth.audio-service-system",
vintf_fragments: ["bluetooth_audio_system.xml"],
@ -37,22 +11,10 @@ cc_binary {
"HearingAidAudioProvider.cpp",
"LeAudioOffloadAudioProvider.cpp",
"LeAudioSoftwareAudioProvider.cpp",
"Device.cpp",
"DevicesFactory.cpp",
"ParametersUtil.cpp",
"PrimaryDevice.cpp",
"Stream.cpp",
"StreamIn.cpp",
"StreamOut.cpp",
"service_system.cpp",
],
header_libs: [
"libhardware_headers",
"android.hardware.audio.common.util@all-versions",
"libaudioutils_headers",
"libaudio_system_headers",
"libmedia_headers",
"libmediautils_headers",
],
shared_libs: [
"libbase",
@ -60,33 +22,19 @@ cc_binary {
"libbinder_ndk",
"libcutils",
"libfmq",
"liblog",
"android.hardware.bluetooth.audio-V2-ndk",
"libbluetooth_audio_session_aidl_system",
"libfmq",
"libhardware",
"libhidlbase",
"liblog",
"libmedia_helper",
"libmediautils_vendor",
"libmemunreachable",
"libutils",
"android.hardware.audio.common-util",
"android.hardware.audio@6.0",
// "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",
"android.hardware.bluetooth.audio-V2-ndk",
"libbluetooth_audio_session_aidl_system",
],
static_libs: [
"libaudiofoundation",
],
cflags: [
"-DMAJOR_VERSION=6",
"-DMINOR_VERSION=0",
"-DCOMMON_TYPES_MINOR_VERSION=0",
"-DCORE_TYPES_MINOR_VERSION=0",
"-include common/all-versions/VersionMacro.h",
required: [
// Audio HAL impls
"android.hardware.audio@2.0-impl-system",
"android.hardware.audio@4.0-impl-system",
"android.hardware.audio@5.0-impl-system",
"android.hardware.audio@6.0-impl-system",
"android.hardware.audio@7.0-impl-system",
"android.hardware.audio@7.1-impl-system",
],
}

View file

@ -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>

View file

@ -7,6 +7,11 @@
<hal>
<name>android.hardware.audio</name>
<transport>hwbinder</transport>
<fqname>@2.0::IDevicesFactory/sysbta</fqname>
<fqname>@4.0::IDevicesFactory/sysbta</fqname>
<fqname>@5.0::IDevicesFactory/sysbta</fqname>
<fqname>@6.0::IDevicesFactory/sysbta</fqname>
<fqname>@7.0::IDevicesFactory/sysbta</fqname>
<fqname>@7.1::IDevicesFactory/sysbta</fqname>
</hal>
</manifest>

View file

@ -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;
}

View file

@ -16,29 +16,56 @@
#define LOG_TAG "BtAudioAIDLServiceSystem"
#include <dlfcn.h>
#include <signal.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
#include <utils/Log.h>
#include <hidl/HidlTransportSupport.h>
#include <hidl/LegacySupport.h>
#include <hwbinder/ProcessState.h>
#include <binder/ProcessState.h>
#include PATH(android/hardware/audio/FILE_VERSION/IDevicesFactory.h)
#include <hardware/audio.h>
#include "BluetoothAudioProviderFactory.h"
#include "DevicesFactory.h"
//using namespace android::hardware;
using ::aidl::android::hardware::bluetooth::audio::
BluetoothAudioProviderFactory;
using ::android::hardware::audio::CPP_VERSION::implementation::DevicesFactory;
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@2.0-impl-system.so",
"android.hardware.audio@4.0-impl-system.so",
"android.hardware.audio@5.0-impl-system.so",
"android.hardware.audio@6.0-impl-system.so",
"android.hardware.audio@7.0-impl-system.so",
"android.hardware.audio@7.1-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() {
signal(SIGPIPE, SIG_IGN);
@ -57,9 +84,9 @@ int main() {
ALOGW_IF(aidl_status != STATUS_OK, "Could not register %s, status=%d",
instance_name.c_str(), aidl_status);
::android::sp<IDevicesFactory> audio_factory = new DevicesFactory();
::android::status_t hidl_status = audio_factory->registerAsService("sysbta");
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();
}