blob: 97fbcc81fa9684076f65b45fee85f0f3fde482c8 [file] [log] [blame]
#include "AudioParamParserPriv.h"
#ifdef WIN32
#include <windows.h>
#include <io.h>
/* MediaTek Inc. (C) 2016. All rights reserved.
*
* Copyright Statement:
* This software/firmware and related documentation ("MediaTek Software") are
* protected under relevant copyright laws. The information contained herein is
* confidential and proprietary to MediaTek Inc. and/or its licensors. Without
* the prior written permission of MediaTek inc. and/or its licensors, any
* reproduction, modification, use or disclosure of MediaTek Software, and
* information contained herein, in whole or in part, shall be strictly
* prohibited.
*/
/*
* Description:
* Implement C++ & windows related APIs
*/
#include <iostream>
#include <fstream>
#include <fcntl.h>
#include <stdio.h>
#ifndef _USE_OLD_IOSTREAMS
using namespace std;
#endif
#else /* !WIN32 */
#include <inttypes.h>
#if !defined(SYS_IMPL)
#if !defined(MTK_YOCTO_AUDIO)
#include "AudioCustParam.h"
#endif
#else
#include <binder/ProcessState.h>
#include <media/AudioSystem.h>
#endif
using namespace android;
#endif
#ifndef WIN32
#if defined(SYS_IMPL)
#include <android/hardware/audio/4.0/IDevicesFactory.h>
#include <android/hardware/audio/4.0/IDevice.h>
#include <vendor/mediatek/hardware/audio/4.1/IMTKPrimaryDevice.h>
#include <vendor/mediatek/hardware/audio/4.1/IAudioParameterChangedCallback.h>
#include "MTKPrimaryDevicesHalClientInterface.h"
using ::android::hardware::audio::V4_0::IDevicesFactory;
using ::android::hardware::audio::V4_0::IDevice;
using ::android::hardware::audio::V4_0::Result;
using ::android::hardware::hidl_death_recipient;
using ::android::hardware::hidl_string;
using ::android::hardware::Return;
using ::android::hidl::base::V1_0::IBase;
using ::vendor::mediatek::hardware::audio::V4_1::IAudioParameterChangedCallback;
using ::vendor::mediatek::hardware::audio::V4_1::IMTKPrimaryDevice;
/*
* Class declaration
*/
class AudioHalDeathRecipient : public hidl_death_recipient {
public:
AudioHalDeathRecipient(void) {}
void serviceDied(uint64_t cookie, const wp<::android::hidl::base::V1_0::IBase> & /*who*/) override {
#if 1
ERR_LOG("%s() AudioServer die... exit!(cookie = %" PRIu64 ")", __FUNCTION__, cookie);
exit(1);
#else
/* Re-connect to server */
registerAudioParameterChangedCallback(appOpsGetInstance()->appHandleGetInstance());
#endif
}
};
class AudioParameterChangedCallback : public IAudioParameterChangedCallback {
Return<void> audioParameterChangedCallback(const hidl_string &audioTypeName) override {
INFO_LOG("%s() got callback! (audioType: %s)", __FUNCTION__, audioTypeName.c_str());
AudioType* audioType = appHandleGetAudioTypeByName(appHandleGetInstance(), audioTypeName.c_str());
if (audioType) {
audioType->allowReload = 1;
}
/* Notify all callback function */
appHandleNotifyAllCallbacks(appHandleGetInstance(), audioTypeName.c_str());
return ::android::hardware::Void();
}
};
/*
* Global variable
*/
const sp<IDevice> *gDevice;
sp<AudioHalDeathRecipient> gDeathRecipient;
Result gRetval = Result::NOT_INITIALIZED;
EXPORT APP_STATUS registerAudioParameterChangedCallback(AppHandle *appHandle) {
/* Get IDevicesFactory */
sp<IDevicesFactory> devicesFactory = IDevicesFactory::getService();
if (devicesFactory == 0) {
ALOGE("Failed to obtain IDevicesFactory service, terminating process.");
exit(1);
}
/* Open Device */
Return<void> ret = devicesFactory->openDevice(
"primary",
[&](Result r, const sp<IDevice> &result) {
gRetval = r;
if (gRetval == Result::OK) {
gDevice = new sp<IDevice>(result);
}
});
if (!ret.isOk() || gRetval != Result::OK) {
ERR_LOG("%s(), Load audio interface fail, (ret: %d, Result: %d)", __FUNCTION__, ret.isOk(), gRetval == Result::OK);
return APP_ERROR;
}
INFO_LOG("%s() audio interface loaded, dev %p", __FUNCTION__, gDevice->get());
/* Register AudioParameterChangedCallback */
sp<IAudioParameterChangedCallback> callback = new AudioParameterChangedCallback();
sp<IMTKPrimaryDevice> mtkPrimaryDev = IMTKPrimaryDevice::castFrom(*gDevice);
Return<Result> result = mtkPrimaryDev->setAudioParameterChangedCallback(callback);
if (!result.isOk()) {
ERR_LOG("setAudioParameterChangedCallback return fail!");
return APP_ERROR;
}
/* Link to death */
gDeathRecipient = new AudioHalDeathRecipient();
devicesFactory->linkToDeath(gDeathRecipient, 123456);
INFO_LOG("%s() linkToDeath success", __FUNCTION__);
return APP_NO_ERROR;
}
EXPORT APP_STATUS unregisterAudioParameterChangedCallback(AppHandle *appHandle) {
INFO_LOG("%s()", __FUNCTION__);
/* Clear callback first */
sp<IMTKPrimaryDevice> mtkPrimaryDev = IMTKPrimaryDevice::castFrom(*gDevice);
mtkPrimaryDev->clearAudioParameterChangedCallback();
/* unlinkToDeath */
sp<IDevicesFactory> devicesFactory = IDevicesFactory::getService();
devicesFactory->unlinkToDeath(gDeathRecipient);
gDevice = NULL;
return APP_NO_ERROR;
}
#endif
#if defined(SYS_IMPL)
void initProcessState() {
static int processStateInited = 0;
/* Init ProcessState, */
if (!processStateInited) {
ProcessState::self()->startThreadPool();
sp<ProcessState> proc(ProcessState::self());
processStateInited = 1;
}
}
#endif
EXPORT int isCustXmlEnable(void) {
#if !defined(APP_FORCE_ENABLE_CUS_XML) && !defined(CONFIG_MT_ENG_BUILD)
int res = 0;
#if !defined(SYS_IMPL)
/* Only vnd AudioParamParser can query NVRam */
AUDIO_CUSTOM_AUDIO_FUNC_SWITCH_PARAM_STRUCT eParaAudioFuncSwitch;
res = GetAudioFuncSwitchParamFromNV(&eParaAudioFuncSwitch);
if (res) {
INFO_LOG("%s(), Not eng load, Get cust xml enabled from NVRam: GET_CUST_XML_ENABLE=%d\n", __FUNCTION__, (eParaAudioFuncSwitch.cust_xml_enable == 1));
return (eParaAudioFuncSwitch.cust_xml_enable == 1);
} else
#endif
{
/* If process cannot get parameter due to permission issue, using AudioSystem API instead */
ALOGW("%s(), Query nvram fail! don't enable cust XML", __FUNCTION__);
return 0;
}
#else
INFO_LOG("%s(), always return 1\n", __FUNCTION__);
return 1;
#endif
}
EXPORT char *audioSystemGetParameters(const char *str) {
#if defined(SYS_IMPL)
String8 res;
const char* ret = NULL;
initProcessState();
res = AudioSystem::getParameters(0, String8(str));
ret = res.string() + strlen(str) + 1;
return strdup(ret);
#else
return strdup("");
#endif
}
EXPORT void audioSystemSetParameters(const char *str) {
#if defined(SYS_IMPL)
initProcessState();
AudioSystem::setParameters(0, String8(str));
#endif
}
#else /* WIN32 */
/* For Tuning Tool show the debug message */
EXPORT void redirectIOToConsole() {
CONSOLE_SCREEN_BUFFER_INFO consoleScreenBufferHandle;
AllocConsole();
GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &consoleScreenBufferHandle);
consoleScreenBufferHandle.dwSize.Y = 600;
SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), consoleScreenBufferHandle.dwSize);
long stdHandle = (long) GetStdHandle(STD_INPUT_HANDLE);
int osfHandle = _open_osfhandle(stdHandle, _O_TEXT);
FILE *fp = _fdopen(osfHandle, "r");
*stdin = *fp;
setvbuf(stdin, NULL, _IONBF, 0);
stdHandle = (long) GetStdHandle(STD_OUTPUT_HANDLE);
osfHandle = _open_osfhandle(stdHandle, _O_TEXT);
fp = _fdopen(osfHandle, "w");
*stdout = *fp;
setvbuf(stdout, NULL, _IONBF, 0);
stdHandle = (long) GetStdHandle(STD_ERROR_HANDLE);
osfHandle = _open_osfhandle(stdHandle, _O_TEXT);
fp = _fdopen(osfHandle, "w");
*stderr = *fp;
setvbuf(stderr, NULL, _IONBF, 0);
ios::sync_with_stdio();
}
#endif