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:
@@ -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",
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user