From 15ca354dfe296ada065133557ad7bb8440e6f258 Mon Sep 17 00:00:00 2001 From: Peter Cai Date: Sat, 3 Sep 2022 22:44:41 -0400 Subject: [PATCH] init_gsi: Add support for optional alternate CAF audio policy --- init/Android.bp | 1 + init/init_gsi.cpp | 2 ++ init/init_gsi.rc | 4 ++++ init/quirks.cpp | 10 ++++++++++ init/quirks.h | 4 +++- init/quirks/soc/caf_audio.cpp | 21 +++++++++++++++++++++ 6 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 init/quirks/soc/caf_audio.cpp diff --git a/init/Android.bp b/init/Android.bp index aaca8b4..3bfacd2 100644 --- a/init/Android.bp +++ b/init/Android.bp @@ -7,6 +7,7 @@ cc_binary { // SoC-specific quirks "quirks/soc/mtk_ril.cpp", + "quirks/soc/caf_audio.cpp", // Device-specific quirks "quirks/device/unihertz_keylayout.cpp", diff --git a/init/init_gsi.cpp b/init/init_gsi.cpp index 67c44e3..d1fd08a 100644 --- a/init/init_gsi.cpp +++ b/init/init_gsi.cpp @@ -59,6 +59,8 @@ int main(int argc, char **argv) { // Reset SPL / device model related props during late init // so that they are set before keystore / vold is started. handle_device_model_props(); + } else if (argc >= 2 && strcmp(argv[1], "--post-fs-data") == 0) { + Quirks::RunPostData(); } else { Quirks::Run(); } diff --git a/init/init_gsi.rc b/init/init_gsi.rc index 9e572e2..9181911 100644 --- a/init/init_gsi.rc +++ b/init/init_gsi.rc @@ -4,5 +4,9 @@ on late-init on post-fs exec u:r:init_gsi:s0 root -- /system_ext/bin/init_gsi +# When we call our post-fs-data actions, we would like persist properties to be available +on load_persist_props_action + exec u:r:init_gsi:s0 root -- /system_ext/bin/init_gsi --post-fs-data + on property:persist.sys.gsi.hw.mainkeys=* setprop qemu.hw.mainkeys ${persist.sys.gsi.hw.mainkeys} diff --git a/init/quirks.cpp b/init/quirks.cpp index fa74ec4..d3eab5b 100644 --- a/init/quirks.cpp +++ b/init/quirks.cpp @@ -40,6 +40,16 @@ void Quirks::Run() { } } +void Quirks::RunPostData() { + if (quirks == nullptr) return; + + for (DeviceQuirk* quirk : *quirks) { + if (quirk->ShouldRun()) { + quirk->RunPostData(); + } + } +} + // Utility functions for use with quirks #define QUIRKS_TMP_BASE_PATH "/mnt/quirks" #define QUIRKS_TMP_FILES_PATH QUIRKS_TMP_BASE_PATH "/files" diff --git a/init/quirks.h b/init/quirks.h index 740e7dd..812346f 100644 --- a/init/quirks.h +++ b/init/quirks.h @@ -29,7 +29,8 @@ class DeviceQuirk { public: DeviceQuirk(); virtual bool ShouldRun() = 0; - virtual void Run() = 0; + virtual void Run() {} + virtual void RunPostData() {} virtual ~DeviceQuirk(); }; @@ -39,6 +40,7 @@ public: namespace Quirks { void Add(DeviceQuirk* quirk); void Run(); + void RunPostData(); int OverrideWithBindMount(filesystem::path src, filesystem::path dst); diff --git a/init/quirks/soc/caf_audio.cpp b/init/quirks/soc/caf_audio.cpp new file mode 100644 index 0000000..f73f2f7 --- /dev/null +++ b/init/quirks/soc/caf_audio.cpp @@ -0,0 +1,21 @@ +#include "../../quirks.h" +#include +#include + +using namespace std; + +class CafAudioQuirk : DeviceQuirk { +public: + bool ShouldRun() { + return filesystem::exists("/vendor/etc/audio/audio_policy_configuration.xml"); + } + + void RunPostData() { + if (android::base::GetBoolProperty("persist.sys.gsi.alternate_audio_policy", false)) { + Quirks::OverrideWithBindMount("/vendor/etc/audio/audio_policy_configuration.xml", "/vendor/etc/audio_policy_configuration.xml"); + android::base::SetProperty("ctl.restart", "audioserver"); // Ensure our new policy is loaded into audioserver + } + } +}; + +LOAD_QUIRK(CafAudioQuirk);