[Feature] add GA346 baseline version

Change-Id: Ic62933698569507dcf98240cdf5d9931ae34348f
diff --git a/src/multimedia/audio-tuning/audio-xml-parser/audio_big_sw/guicon.cpp b/src/multimedia/audio-tuning/audio-xml-parser/audio_big_sw/guicon.cpp
new file mode 100644
index 0000000..97fbcc8
--- /dev/null
+++ b/src/multimedia/audio-tuning/audio-xml-parser/audio_big_sw/guicon.cpp
@@ -0,0 +1,254 @@
+#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