From 293d0c97c6d8a14ce565e6a95e962a3fa111c9ec Mon Sep 17 00:00:00 2001 From: Woomymy Date: Fri, 14 Jul 2023 18:33:27 +0000 Subject: [PATCH] hidl: mtkpower: Forward AUDIO_POWER MTK Hints to Power HAL * Mediatek audio HAL sends `MTKPOWER_HINT_AUDIO_POWER` hints to mediatek power HAL service when an audio stream is created. While this hint doesn't exist in AOSP, the `AUDIO_STREAMING_LOW_LATENCY` mode can be used to achieve the same purpose (and boost CPU frequencies while streaming audio) * The `AUDIO_STREAMING_LOW_LATENCY` mode should be configured in powerhint.json and can be used issues such as poor audio quality in some applications. Change-Id: I30bc5f65868e575c7b7911ab70ef407c00197bbf Signed-off-by: Woomymy --- hidl/mtkpower/1.2/default/Android.bp | 2 ++ hidl/mtkpower/1.2/default/MtkPower.cpp | 44 ++++++++++++++++++++++++-- hidl/mtkpower/1.2/default/MtkPower.h | 4 +++ 3 files changed, 48 insertions(+), 2 deletions(-) diff --git a/hidl/mtkpower/1.2/default/Android.bp b/hidl/mtkpower/1.2/default/Android.bp index a8264e0..4557a33 100644 --- a/hidl/mtkpower/1.2/default/Android.bp +++ b/hidl/mtkpower/1.2/default/Android.bp @@ -14,6 +14,8 @@ cc_binary { "libbase", "libhidlbase", "libutils", + "libbinder_ndk", + "android.hardware.power-V2-ndk", "vendor.mediatek.hardware.mtkpower@1.0", "vendor.mediatek.hardware.mtkpower@1.1", "vendor.mediatek.hardware.mtkpower@1.2", diff --git a/hidl/mtkpower/1.2/default/MtkPower.cpp b/hidl/mtkpower/1.2/default/MtkPower.cpp index acc8975..e890071 100644 --- a/hidl/mtkpower/1.2/default/MtkPower.cpp +++ b/hidl/mtkpower/1.2/default/MtkPower.cpp @@ -17,11 +17,36 @@ #define LOG_TAG "vendor.mediatek.hardware.mtkpower@1.2-service.stub" #include +#include +#include +#include #include "MtkPower.h" +static std::shared_ptr gAidlPowerHal; +static const std::string kInstance = + std::string(aidl::android::hardware::power::IPower::descriptor) + "/default"; + namespace vendor::mediatek::hardware::mtkpower::implementation { +bool MtkPower::getAidlPowerHal(void) { + if (!gAidlPowerHal) { + ndk::SpAIBinder pwBinder = ndk::SpAIBinder( + AServiceManager_getService(kInstance.c_str())); + gAidlPowerHal = aidl::android::hardware::power::IPower::fromBinder(pwBinder); + } + + return !!gAidlPowerHal; +} + +MtkPower::MtkPower() { + if (!getAidlPowerHal()) { + LOG(ERROR) << "Can't get AIDL Power HAL!"; + } else { + LOG(INFO) << "Connected to power AIDL HAL"; + } +} + // Methods from ::vendor::mediatek::hardware::mtkpower::V1_0::IMtkPower follow. Return MtkPower::mtkCusPowerHint(int32_t hint, int32_t data) { LOG(INFO) << "mtkCusPowerHint hint: " << hint @@ -30,8 +55,23 @@ Return MtkPower::mtkCusPowerHint(int32_t hint, int32_t data) { } Return MtkPower::mtkPowerHint(int32_t hint, int32_t data) { - LOG(INFO) << "mtkPowerHint hint: " << hint - << " data: " << data; + // Forward AUDIO_POWER hints to libperfmgr + if (hint == MTKPOWER_HINT_AUDIO_POWER) { + // Enable the mode if data is non-zero + bool enabled = data != 0; + LOG(INFO) << "mtkPowerhint hint: MTKPOWER_HINT_AUDIO_POWER data: " << data << " enabled: " << enabled; + if (getAidlPowerHal()) { + gAidlPowerHal->setMode( + aidl::android::hardware::power::Mode::AUDIO_STREAMING_LOW_LATENCY, + enabled + ); + } else { + LOG(ERROR) << "mtkPowerHint: Can't get AIDL Power HAL!"; + } + } else { + LOG(INFO) << "mtkPowerHint hint: " << hint + << " data: " << data; + } return Void(); } diff --git a/hidl/mtkpower/1.2/default/MtkPower.h b/hidl/mtkpower/1.2/default/MtkPower.h index d91da14..3391c2d 100644 --- a/hidl/mtkpower/1.2/default/MtkPower.h +++ b/hidl/mtkpower/1.2/default/MtkPower.h @@ -20,6 +20,8 @@ #include #include +#define MTKPOWER_HINT_AUDIO_POWER 47 + namespace vendor::mediatek::hardware::mtkpower::implementation { using ::android::hardware::hidl_array; @@ -31,6 +33,8 @@ using ::android::hardware::Void; using ::android::sp; struct MtkPower : public V1_2::IMtkPower { + MtkPower(); + bool getAidlPowerHal(void); // Methods from ::vendor::mediatek::hardware::mtkpower::V1_0::IMtkPower follow. Return mtkCusPowerHint(int32_t hint, int32_t data) override; Return mtkPowerHint(int32_t hint, int32_t data) override;