diff --git a/audio_service/Android.bp b/audio_service/Android.bp new file mode 100644 index 0000000..d35fbdd --- /dev/null +++ b/audio_service/Android.bp @@ -0,0 +1,33 @@ +// +// Copyright (C) 2022 The LineageOS-UL Project +// SPDX-License-Identifier: Apache-2.0 +// + +cc_binary { + name: "android.hardware.audio.service.samsung8974", + + init_rc: ["android.hardware.audio.service.samsung8974.rc"], + relative_install_path: "hw", + vendor: true, + + srcs: ["service.cpp"], + + cflags: [ + "-Wall", + "-Wextra", + "-Werror", + ], + + shared_libs: [ + "libcutils", + "libbinder", + "libhidlbase", + "liblog", + "libutils", + "libhardware", + ], + + defaults: [ + "android_hardware_audio_config_defaults", + ], +} diff --git a/audio_service/android.hardware.audio.service.samsung8974.rc b/audio_service/android.hardware.audio.service.samsung8974.rc new file mode 100644 index 0000000..72791c2 --- /dev/null +++ b/audio_service/android.hardware.audio.service.samsung8974.rc @@ -0,0 +1,9 @@ +service vendor.audio-hal /vendor/bin/hw/android.hardware.audio.service.samsung8974 + class hal + user audioserver + # media gid needed for /dev/fm (radio) and for /data/misc/media (tee) + group audio camera drmrpc inet media mediadrm net_bt net_bt_admin net_bw_acct wakelock context_hub + capabilities BLOCK_SUSPEND + ioprio rt 4 + task_profiles ProcessCapacityHigh HighPerformance + onrestart restart audioserver diff --git a/audio_service/service.cpp b/audio_service/service.cpp new file mode 100644 index 0000000..b1e59b1 --- /dev/null +++ b/audio_service/service.cpp @@ -0,0 +1,122 @@ +/* + * Copyright (C) 2016 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 "audiohalservice" + +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace android::hardware; +using android::OK; + +using InterfacesList = std::vector; + +/** Try to register the provided factories in the provided order. + * If any registers successfully, do not register any other and return true. + * If all fail, return false. + */ +template +static bool registerPassthroughServiceImplementations(Iter first, Iter last) { + for (; first != last; ++first) { + if (registerPassthroughServiceImplementation(*first) == OK) { + return true; + } + } + return false; +} + +int main(int /* argc */, char* /* argv */ []) { + signal(SIGPIPE, SIG_IGN); + + ::android::ProcessState::initWithDriver("/dev/vndbinder"); + // start a threadpool for vndbinder interactions + ::android::ProcessState::self()->startThreadPool(); + + const int32_t defaultValue = -1; + int32_t value = + property_get_int32("persist.vendor.audio.service.hwbinder.size_kbyte", defaultValue); + if (value != defaultValue) { + ALOGD("Configuring hwbinder with mmap size %d KBytes", value); + ProcessState::initWithMmapSize(static_cast(value) * 1024); + } + configureRpcThreadpool(16, true /*callerWillJoin*/); + + // Automatic formatting tries to compact the lines, making them less readable + // clang-format off + const std::vector mandatoryInterfaces = { + { + "Audio Core API", + "android.hardware.audio@7.1::IDevicesFactory", + "android.hardware.audio@7.0::IDevicesFactory", + "android.hardware.audio@6.0::IDevicesFactory", + "android.hardware.audio@5.0::IDevicesFactory", + "android.hardware.audio@4.0::IDevicesFactory", + }, + { + "Audio Effect API", + "android.hardware.audio.effect@7.0::IEffectsFactory", + "android.hardware.audio.effect@6.0::IEffectsFactory", + "android.hardware.audio.effect@5.0::IEffectsFactory", + "android.hardware.audio.effect@4.0::IEffectsFactory", + } + }; + + const std::vector optionalInterfaces = { + { + "Soundtrigger API", + "android.hardware.soundtrigger@2.3::ISoundTriggerHw", + "android.hardware.soundtrigger@2.2::ISoundTriggerHw", + "android.hardware.soundtrigger@2.1::ISoundTriggerHw", + "android.hardware.soundtrigger@2.0::ISoundTriggerHw", + }, + { + "Bluetooth Audio API", + "android.hardware.bluetooth.audio@2.2::IBluetoothAudioProvidersFactory", + "android.hardware.bluetooth.audio@2.1::IBluetoothAudioProvidersFactory", + "android.hardware.bluetooth.audio@2.0::IBluetoothAudioProvidersFactory", + }, + // remove the old HIDL when Bluetooth Audio Hal V2 has offloading supported + { + "Bluetooth Audio Offload API", + "android.hardware.bluetooth.a2dp@1.0::IBluetoothAudioOffload" + } + }; + // clang-format on + + for (const auto& listIter : mandatoryInterfaces) { + auto iter = listIter.begin(); + const std::string& interfaceFamilyName = *iter++; + LOG_ALWAYS_FATAL_IF(!registerPassthroughServiceImplementations(iter, listIter.end()), + "Could not register %s", interfaceFamilyName.c_str()); + } + + for (const auto& listIter : optionalInterfaces) { + auto iter = listIter.begin(); + const std::string& interfaceFamilyName = *iter++; + ALOGW_IF(!registerPassthroughServiceImplementations(iter, listIter.end()), + "Could not register %s", interfaceFamilyName.c_str()); + } + + joinRpcThreadpool(); +} + diff --git a/manifest.xml b/manifest.xml index fb91934..c38f115 100644 --- a/manifest.xml +++ b/manifest.xml @@ -26,6 +26,11 @@ default + + android.hardware.bluetooth.audio + hwbinder + @2.0::IBluetoothAudioProvidersFactory/default + android.hardware.camera.provider passthrough diff --git a/msm8974.mk b/msm8974.mk index 59ba141..bb04aaf 100644 --- a/msm8974.mk +++ b/msm8974.mk @@ -47,7 +47,7 @@ PRODUCT_COPY_FILES += \ # Audio PRODUCT_PACKAGES += \ - android.hardware.audio.service \ + android.hardware.audio.service.samsung8974 \ android.hardware.audio@7.0-impl:32 \ android.hardware.audio.effect@7.0-impl:32 \ audio.bluetooth.default \ @@ -61,6 +61,8 @@ PRODUCT_PACKAGES += \ # Bluetooth PRODUCT_PACKAGES += \ + audio.bluetooth.default \ + android.hardware.bluetooth.audio@2.0-impl \ android.hardware.bluetooth@1.0-impl \ android.hardware.bluetooth@1.0-service \ libbt-vendor diff --git a/sepolicy/common/file_contexts b/sepolicy/common/file_contexts index f71e647..8db8b5b 100644 --- a/sepolicy/common/file_contexts +++ b/sepolicy/common/file_contexts @@ -23,6 +23,7 @@ # executeables /system/vendor/bin/macloader u:object_r:macloader_exec:s0 +/(vendor|system/vendor)/bin/hw/android\.hardware\.audio\.service\.samsung8974 u:object_r:hal_audio_default_exec:s0 /(vendor|system/vendor)/bin/hw/android\.hardware\.gatekeeper@1\.0-service\.software u:object_r:hal_gatekeeper_default_exec:s0 /(vendor|system/vendor)/bin/hw/android\.hardware\.ir@1\.0-service\.samsung u:object_r:hal_ir_default_exec:s0 /(vendor|system/vendor)/bin/hw/android\.hardware\.light@2\.0-service\.samsung u:object_r:hal_light_default_exec:s0 diff --git a/sepolicy/common/hal_audio_default.te b/sepolicy/common/hal_audio_default.te new file mode 100644 index 0000000..00ab6f4 --- /dev/null +++ b/sepolicy/common/hal_audio_default.te @@ -0,0 +1,2 @@ +get_prop(hal_audio_default, audio_prop) +allow hal_audio_default default_android_vndservice:service_manager { find };