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 <woomy@woomy.be>
This commit is contained in:
Woomymy
2023-07-14 18:33:27 +00:00
committed by bengris32
parent 5145815478
commit 293d0c97c6
3 changed files with 48 additions and 2 deletions

View File

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

View File

@@ -17,11 +17,36 @@
#define LOG_TAG "vendor.mediatek.hardware.mtkpower@1.2-service.stub"
#include <android-base/logging.h>
#include <aidl/android/hardware/power/IPower.h>
#include <aidl/android/hardware/power/Mode.h>
#include <android/binder_manager.h>
#include "MtkPower.h"
static std::shared_ptr<aidl::android::hardware::power::IPower> 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<void> MtkPower::mtkCusPowerHint(int32_t hint, int32_t data) {
LOG(INFO) << "mtkCusPowerHint hint: " << hint
@@ -30,8 +55,23 @@ Return<void> MtkPower::mtkCusPowerHint(int32_t hint, int32_t data) {
}
Return<void> 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();
}

View File

@@ -20,6 +20,8 @@
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
#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<void> mtkCusPowerHint(int32_t hint, int32_t data) override;
Return<void> mtkPowerHint(int32_t hint, int32_t data) override;