summaryrefslogtreecommitdiff
authorjiejing.wang <jiejing.wang@amlogic.com>2018-11-09 05:15:22 (GMT)
committer jiejing.wang <jiejing.wang@amlogic.com>2018-11-14 06:14:38 (GMT)
commitcbc5759734a1d16fb7d31bc73066587ddda2d869 (patch)
tree4b5f28eef3f20179023021b3ed65b7e76db0552d
parentb14ea1490af4eb2a279206b6dfa5df6296de676b (diff)
downloadav-cbc5759734a1d16fb7d31bc73066587ddda2d869.zip
av-cbc5759734a1d16fb7d31bc73066587ddda2d869.tar.gz
av-cbc5759734a1d16fb7d31bc73066587ddda2d869.tar.bz2
audio: libeffects: add virtualsurround function [3/3]
PD#SWPL-558 Problem: no virtualsurround effect Solution: add virtualsurround effect Verify: verify by r311 Change-Id: Ic3dd66d74134a789ecc47dfe39deb968facde306 Signed-off-by: jiejing.wang <jiejing.wang@amlogic.com>
Diffstat
-rw-r--r--libaudioeffect/Virtualsurround/Android.mk40
-rw-r--r--libaudioeffect/Virtualsurround/Virtualsurround.cpp552
-rw-r--r--libaudioeffect/Virtualsurround/Virtualsurround.h7
-rw-r--r--libaudioeffect/Virtualsurround/libmusicbundle.a3330
4 files changed, 3929 insertions, 0 deletions
diff --git a/libaudioeffect/Virtualsurround/Android.mk b/libaudioeffect/Virtualsurround/Android.mk
new file mode 100644
index 0000000..98385f3
--- a/dev/null
+++ b/libaudioeffect/Virtualsurround/Android.mk
@@ -0,0 +1,40 @@
+LOCAL_PATH:= $(call my-dir)
+
+include $(CLEAR_VARS)
+
+LOCAL_MODULE_TAGS := optional
+
+LOCAL_MODULE:= libvirtualsurround
+
+LOCAL_SHARED_LIBRARIES := \
+ libcutils \
+ libdl \
+ libutils \
+ libamaudioutils
+
+LOCAL_C_INCLUDES := \
+ $(LOCAL_PATH) \
+ hardware/amlogic/audio/utils/ini/include \
+ hardware/libhardware/include/hardware \
+ hardware/libhardware/include \
+ system/media/audio/include \
+ frameworks/av/media/libeffects/lvm/lib/StereoWidening/lib \
+ frameworks/av/media/libeffects/lvm/lib/StereoWidening/src \
+ frameworks/av/media/libeffects/lvm/lib/Common/lib \
+ frameworks/av/media/libeffects/lvm/lib/Common/src \
+
+LOCAL_SRC_FILES += Virtualsurround.cpp
+
+LOCAL_LDFLAGS_arm += $(LOCAL_PATH)/libmusicbundle.a
+#LOCAL_LDFLAGS_arm64 += $(LOCAL_PATH)/libmusicbundle64.a
+#LOCAL_MULTILIB := both
+LOCAL_PRELINK_MODULE := false
+
+LOCAL_LDLIBS += -llog
+ifeq ($(shell test $(PLATFORM_SDK_VERSION) -ge 26 && echo OK),OK)
+LOCAL_PROPRIETARY_MODULE := true
+endif
+
+LOCAL_MODULE_RELATIVE_PATH := soundfx
+
+include $(BUILD_SHARED_LIBRARY)
diff --git a/libaudioeffect/Virtualsurround/Virtualsurround.cpp b/libaudioeffect/Virtualsurround/Virtualsurround.cpp
new file mode 100644
index 0000000..465f3b5
--- a/dev/null
+++ b/libaudioeffect/Virtualsurround/Virtualsurround.cpp
@@ -0,0 +1,552 @@
+/*
+ * Copyright (C) 2017 Amlogic Corporation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * DESCRIPTION
+ * This file implements a special EQ from Amlogic.
+ *
+ */
+#define LOG_TAG "Virtualsurround_Effect"
+//#define LOG_NDEBUG 0
+
+#include <cutils/log.h>
+#include <utils/Log.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <assert.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <pthread.h>
+
+#include <hardware/audio_effect.h>
+#include <cutils/properties.h>
+#include "Virtualsurround.h"
+
+
+#include "IniParser.h"
+
+extern "C"{
+
+#include "LVCS.h"
+#include "InstAlloc.h"
+#include "LVCS_Private.h"
+
+LVCS_Handle_t hCSInstance = LVM_NULL; /* Concert Sound instance handle */
+LVCS_Instance_t CS_Instance; /* Concert Sound instance */
+LVCS_MemTab_t CS_MemTab; /* Memory table */
+LVCS_Capabilities_t CS_Capabilities; /* Initial capabilities */
+static pthread_mutex_t audio_vir_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+#define MODEL_SUM_DEFAULT_PATH "/vendor/etc/tvconfig/model/model_sum.ini"
+#define AUDIO_EFFECT_DEFAULT_PATH "/vendor/etc/tvconfig/audio/AMLOGIC_AUDIO_EFFECT_DEFAULT.ini"
+
+// effect_handle_t interface implementation for Virtualsurround effect
+extern const struct effect_interface_s VirtualsurroundInterface;
+
+//Virtualsurround effect TYPE: c656ec6f-d6be-4e7f-854b-1218077f3915
+//Virtualsurround effect UUID: c8459cd3-4400-4859-b76b-e12cc2aa67ce
+const effect_descriptor_t VirtualsurroundDescriptor = {
+ {0xc656ec6f,0xd6be,0x4e7f,0x854b,{0x12,0x18,0x07,0x7f,0x39,0x15}},
+ {0xc8459cd3,0x4400,0x4859,0xb76b,{0xe1,0x2c,0xc2,0xaa,0x67,0xce}},
+ EFFECT_CONTROL_API_VERSION,
+ EFFECT_FLAG_TYPE_POST_PROC | EFFECT_FLAG_DEVICE_IND | EFFECT_FLAG_NO_PROCESS | EFFECT_FLAG_OFFLOAD_SUPPORTED,
+ VIRTUALSURROUND_CUP_LOAD_ARM9E,
+ VIRTUALSURROUND_MEM_USAGE,
+ "Virtualsurround",
+ "Amlogic",
+};
+
+enum Virtualsurround_state_e {
+ VIRTUALSURROUND_STATE_UNINITIALIZED,
+ VIRTUALSURROUND_STATE_INITIALIZED,
+ VIRTUALSURROUND_STATE_ACTIVE,
+};
+
+/*parameter number passed from the Java layer corresponds to this*/
+typedef enum {
+ VIRTUALSURROUND_PARAM_ENABLE,
+ VIRTUALSURROUND_PARAM_EFFECTLEVEL,
+} Virtualsurroundparams;
+
+typedef struct Virtualsurroundcfg_s {
+ int enable;
+ int effectlevel;
+} Virtualsurroundcfg;
+
+typedef struct Virtualsurrounddata_s {
+ /* Virtualsurround API needed data */
+ Virtualsurroundcfg tbcfg;
+} Virtualsurrounddata;
+
+typedef struct VirtualsurroundContext_s {
+ const struct effect_interface_s *itfe;
+ effect_config_t config;
+ Virtualsurround_state_e state;
+ Virtualsurrounddata gVirtualsurrounddata;
+} VirtualsurroundContext;
+
+const char *VirtualsurroundStatusstr[] = {"Disable", "Enable"};
+
+int Virtualsurround_get_model_name(char *model_name, int size) {
+ int ret = -1;
+ char node[PROPERTY_VALUE_MAX];
+
+ ret = property_get("tv.model_name", node, NULL);
+
+ if (ret < 0)
+ snprintf(model_name, size, "DEFAULT");
+ else
+ snprintf(model_name, size, "%s", node);
+ ALOGD("%s: Model Name -> %s", __FUNCTION__, model_name);
+ return ret;
+}
+
+int Virtualsurround_get_ini_file(char *ini_name, int size) {
+ int result = -1;
+ char model_name[50] = {0};
+ IniParser* pIniParser = NULL;
+ const char *ini_value = NULL;
+ const char *filename = MODEL_SUM_DEFAULT_PATH;
+
+ Virtualsurround_get_model_name(model_name, sizeof(model_name));
+ pIniParser = new IniParser();
+ if (pIniParser->parse(filename) < 0) {
+ ALOGW("%s: Load INI file -> %s Failed", __FUNCTION__, filename);
+ goto exit;
+ }
+ ini_value = pIniParser->GetString(model_name, "AMLOGIC_AUDIO_EFFECT_INI_PATH", AUDIO_EFFECT_DEFAULT_PATH);
+ if (ini_value == NULL || access(ini_value, F_OK) == -1) {
+ ALOGD("%s: INI File is not exist", __FUNCTION__);
+ goto exit;
+ }
+ ALOGD("%s: INI File -> %s", __FUNCTION__, ini_value);
+ strncpy(ini_name, ini_value, size);
+
+ result = 0;
+exit:
+ delete pIniParser;
+ pIniParser = NULL;
+ return result;
+}
+
+int Virtualsurround_load_ini_file(VirtualsurroundContext *pContext)
+{
+ int result = -1;
+ char ini_name[100] = {0};
+ const char *ini_value = NULL;
+ Virtualsurrounddata *data = &pContext->gVirtualsurrounddata;
+ IniParser* pIniParser = NULL;
+ if (Virtualsurround_get_ini_file(ini_name, sizeof(ini_name)) < 0)
+ goto error;
+
+ pIniParser = new IniParser();
+ if (pIniParser->parse((const char *)ini_name) < 0) {
+ ALOGD("%s: %s load failed", __FUNCTION__, ini_name);
+ goto error;
+ }
+ /*
+ ini_value = pIniParser->GetString("Virtualsurround", "Virtualsurround_enable", "1");
+ if (ini_value == NULL)
+ goto error;
+ ALOGD("%s: enable -> %s", __FUNCTION__, ini_value);
+ data->tbcfg.enable = atoi(ini_value);
+ */
+error:
+ ALOGD("%s: %s", __FUNCTION__, result == 0 ? "sucessful" : "failed");
+ delete pIniParser;
+ pIniParser = NULL;
+ return result;
+}
+
+int Virtualsurround_init(VirtualsurroundContext *pContext) {
+ LVCS_ReturnStatus_en LVCS_Status;
+ LVCS_Params_t *CS_Params = &CS_Instance.Params;
+ int i = 0;
+
+ pthread_mutex_lock(&audio_vir_mutex);
+ CS_Capabilities.MaxBlockSize = 2048;
+ CS_Capabilities.pBundleInstance = (void*)hCSInstance;
+ LVCS_Status = LVCS_Memory(LVM_NULL,
+ &CS_MemTab,
+ &CS_Capabilities);
+ CS_MemTab.Region[LVCS_MEMREGION_PERSISTENT_SLOW_DATA].pBaseAddress = &CS_Instance;
+ /* Allocate memory */
+ for (i = 0; i < LVM_NR_MEMORY_REGIONS; i++) {
+ if (CS_MemTab.Region[i].Size != 0) {
+ CS_MemTab.Region[i].pBaseAddress = malloc(CS_MemTab.Region[i].Size);
+ if (CS_MemTab.Region[i].pBaseAddress == LVM_NULL) {
+ ALOGV("\tLVM_ERROR :LvmBundle_init CreateInstance Failed to allocate %"
+ " bytes for region %u\n", CS_MemTab.Region[i].Size, i );
+ return LVCS_NULLADDRESS;
+ } else {
+ ALOGV("\tLvmBundle_init CreateInstance allocated %"
+ " bytes for region %u at %p\n",
+ CS_MemTab.Region[i].Size, i, CS_MemTab.Region[i].pBaseAddress);
+ }
+ }
+ }
+ hCSInstance = LVM_NULL;
+ LVCS_Status = LVCS_Init(&hCSInstance,
+ &CS_MemTab,
+ &CS_Capabilities);
+ pContext->gVirtualsurrounddata.tbcfg.effectlevel = 0;
+ pContext->gVirtualsurrounddata.tbcfg.enable = 0;
+ CS_Params->OperatingMode = LVCS_OFF;
+ CS_Params->CompressorMode = LVM_MODE_ON;
+ CS_Params->SourceFormat = LVCS_STEREO;
+ CS_Params->SpeakerType = LVCS_HEADPHONES;
+ CS_Params->SampleRate = LVM_FS_48000;
+ CS_Params->ReverbLevel = 100;
+ CS_Params->EffectLevel =32700; /* 0~32767 */
+ pthread_mutex_unlock(&audio_vir_mutex);
+
+ pContext->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
+ pContext->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
+ pContext->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
+ pContext->config.inputCfg.samplingRate = 48000;
+ pContext->config.inputCfg.bufferProvider.getBuffer = NULL;
+ pContext->config.inputCfg.bufferProvider.releaseBuffer = NULL;
+ pContext->config.inputCfg.bufferProvider.cookie = NULL;
+ pContext->config.inputCfg.mask = EFFECT_CONFIG_ALL;
+ pContext->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE;
+ pContext->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
+ pContext->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
+ pContext->config.outputCfg.samplingRate = 48000;
+ pContext->config.outputCfg.bufferProvider.getBuffer = NULL;
+ pContext->config.outputCfg.bufferProvider.releaseBuffer = NULL;
+ pContext->config.outputCfg.bufferProvider.cookie = NULL;
+ pContext->config.outputCfg.mask = EFFECT_CONFIG_ALL;
+ ALOGD("%s: sucessful", __FUNCTION__);
+ return 0;
+}
+
+/*Set I/O configuration: sample rate, channel, format, etc.*/
+int Virtualsurround_configure(VirtualsurroundContext *pContext, effect_config_t *pConfig)
+{
+ if (pConfig->inputCfg.samplingRate != pConfig->outputCfg.samplingRate)
+ return -EINVAL;
+ if (pConfig->inputCfg.channels != pConfig->outputCfg.channels)
+ return -EINVAL;
+ if (pConfig->inputCfg.format != pConfig->outputCfg.format)
+ return -EINVAL;
+ if (pConfig->inputCfg.channels != AUDIO_CHANNEL_OUT_STEREO) {
+ ALOGW("%s: channels in = 0x%x channels out = 0x%x", __FUNCTION__, pConfig->inputCfg.channels, pConfig->outputCfg.channels);
+ pConfig->inputCfg.channels = pConfig->outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
+ }
+ if (pConfig->outputCfg.accessMode != EFFECT_BUFFER_ACCESS_WRITE &&
+ pConfig->outputCfg.accessMode != EFFECT_BUFFER_ACCESS_ACCUMULATE)
+ return -EINVAL;
+ if (pConfig->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT) {
+ ALOGW("%s: format in = 0x%x format out = 0x%x", __FUNCTION__, pConfig->inputCfg.format, pConfig->outputCfg.format);
+ pConfig->inputCfg.format = pConfig->outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
+ }
+ memcpy(&pContext->config, pConfig, sizeof(effect_config_t));
+ return 0;
+}
+
+int Virtualsurround_setParameter(VirtualsurroundContext *pContext, void *pParam, void *pValue)
+{
+ int32_t param = *(int32_t *)pParam;
+ int32_t value;
+ Virtualsurrounddata *data=&pContext->gVirtualsurrounddata;
+ Virtualsurroundcfg *tbcfg=&data->tbcfg;
+ LVCS_ReturnStatus_en CS_Status;
+ LVCS_Params_t *CS_Params = &CS_Instance.Params;
+ if (hCSInstance == LVM_NULL)
+ return LVCS_NULLADDRESS;
+ pthread_mutex_lock(&audio_vir_mutex);
+ switch (param) {
+ case VIRTUALSURROUND_PARAM_ENABLE:
+ value = *(int32_t *)pValue;
+ tbcfg->enable = value;
+ if (tbcfg->enable == 1)
+ CS_Params->OperatingMode = LVCS_ON;
+ else
+ CS_Params->OperatingMode = LVCS_OFF;
+ LVCS_Control(hCSInstance,CS_Params);
+ pthread_mutex_unlock(&audio_vir_mutex);
+ break;
+ case VIRTUALSURROUND_PARAM_EFFECTLEVEL:
+ value = *(int32_t *)pValue;
+ tbcfg->effectlevel = value;
+ if (tbcfg->effectlevel > 100)
+ CS_Params->EffectLevel = 32700;
+ else if (tbcfg->effectlevel < 0)
+ CS_Params->EffectLevel = 0;
+ else
+ CS_Params->EffectLevel = tbcfg->effectlevel * 327;
+ LVCS_Control(hCSInstance,CS_Params);
+ pthread_mutex_unlock(&audio_vir_mutex);
+ break;
+ default:
+ ALOGE("%s: unknown param %08x", __FUNCTION__, param);
+ return -EINVAL;
+ }
+ return 0;
+}
+
+int Virtualsurround_getParameter(VirtualsurroundContext*pContext, void *pParam, size_t *pValueSize, void *pValue)
+{
+ int32_t param = *(int32_t *)pParam;
+ Virtualsurrounddata *data=&pContext->gVirtualsurrounddata;
+ Virtualsurroundcfg *tbcfg=&data->tbcfg;
+ switch (param) {
+ case VIRTUALSURROUND_PARAM_ENABLE:
+ if (*pValueSize < sizeof(int32_t)) {
+ *pValueSize = 0;
+ return -EINVAL;
+ }
+ *(int*)pValue = (int)tbcfg->enable;
+ ALOGD("%s: Get enable -> %d ", __FUNCTION__, tbcfg->enable);
+ break;
+ case VIRTUALSURROUND_PARAM_EFFECTLEVEL:
+ if (*pValueSize < sizeof(int32_t)) {
+ *pValueSize = 0;
+ return -EINVAL;
+ }
+ *(int*)pValue = tbcfg->effectlevel;
+ ALOGD("%s: Get effctlevel -> %d ", __FUNCTION__, tbcfg->effectlevel);
+ break;
+ default:
+ ALOGE("%s: unknown param %d", __FUNCTION__, param);
+ return -EINVAL;
+ }
+ return 0;
+}
+
+int Virtualsurround_release(VirtualsurroundContext *pContext __unused) {
+ int i;
+ pthread_mutex_lock(&audio_vir_mutex);
+ for (i = 0; i < LVM_NR_MEMORY_REGIONS; i++) {
+ if (CS_MemTab.Region[i].pBaseAddress != 0) {
+ free(CS_MemTab.Region[i].pBaseAddress);
+ CS_MemTab.Region[i].pBaseAddress = NULL;
+ }
+ }
+ hCSInstance = LVM_NULL;
+ pthread_mutex_unlock(&audio_vir_mutex);
+ return 0;
+}
+
+//-------------------Effect Control Interface Implementation--------------------------
+
+int Virtualsurround_process(effect_handle_t self, audio_buffer_t *inBuffer, audio_buffer_t *outBuffer)
+{
+ LVCS_ReturnStatus_en CS_Status;
+ VirtualsurroundContext * pContext = (VirtualsurroundContext *)self;
+ if (pContext == NULL) {
+ return -EINVAL;
+ }
+
+ if (inBuffer == NULL || inBuffer->raw == NULL ||
+ outBuffer == NULL || outBuffer->raw == NULL ||
+ inBuffer->frameCount != outBuffer->frameCount ||
+ inBuffer->frameCount == 0) {
+ return -EINVAL;
+ }
+ if (pContext->state != VIRTUALSURROUND_STATE_ACTIVE) {
+ return -ENODATA;
+ }
+ int16_t *in = (int16_t *)inBuffer->raw;
+ int16_t *out = (int16_t *)outBuffer->raw;
+ Virtualsurrounddata *data = &pContext->gVirtualsurrounddata;
+ if (!data->tbcfg.enable) {
+ for (size_t i = 0; i < inBuffer->frameCount; i++) {
+ *out++ = *in++;
+ *out++ = *in++;
+ }
+ } else {
+
+ if (hCSInstance == LVM_NULL)
+ return LVCS_NULLADDRESS;
+ pthread_mutex_lock(&audio_vir_mutex);
+ LVCS_Process(hCSInstance,in,out,inBuffer->frameCount);
+
+ pthread_mutex_unlock(&audio_vir_mutex);
+ }
+ return 0;
+}
+
+int Virtualsurround_command(effect_handle_t self, uint32_t cmdCode, uint32_t cmdSize,
+ void *pCmdData, uint32_t *replySize, void *pReplyData)
+{
+ VirtualsurroundContext* pContext = (VirtualsurroundContext *)self;
+ effect_param_t *p;
+ int voffset;
+ if (pContext == NULL || pContext->state == VIRTUALSURROUND_STATE_UNINITIALIZED) {
+ return -EINVAL;
+ }
+ ALOGD("%s: cmd = %u", __FUNCTION__, cmdCode);
+ switch (cmdCode) {
+ case EFFECT_CMD_INIT:
+ if (pReplyData == NULL || replySize == NULL || *replySize != sizeof(int)) {
+ return -EINVAL;
+ }
+ *(int *) pReplyData = Virtualsurround_init(pContext);
+ break;
+ case EFFECT_CMD_SET_CONFIG:
+ if (pCmdData == NULL || cmdSize != sizeof(effect_config_t) || pReplyData == NULL || replySize == NULL || *replySize != sizeof(int))
+ return -EINVAL;
+ *(int *) pReplyData = Virtualsurround_configure(pContext, (effect_config_t *) pCmdData);
+ break;
+ case EFFECT_CMD_RESET:
+ //HPEQ_reset(pContext);
+ break;
+ case EFFECT_CMD_ENABLE:
+ if (pReplyData == NULL || replySize == NULL || *replySize != sizeof(int))
+ return -EINVAL;
+ if (pContext->state != VIRTUALSURROUND_STATE_INITIALIZED)
+ return -ENOSYS;
+ pContext->state = VIRTUALSURROUND_STATE_ACTIVE;
+ *(int *)pReplyData = 0;
+ break;
+ case EFFECT_CMD_DISABLE:
+ if (pReplyData == NULL || replySize == NULL || *replySize != sizeof(int))
+ return -EINVAL;
+ if (pContext->state != VIRTUALSURROUND_STATE_ACTIVE)
+ return -ENOSYS;
+ pContext->state = VIRTUALSURROUND_STATE_INITIALIZED;
+ *(int *)pReplyData = 0;
+ break;
+ case EFFECT_CMD_GET_PARAM:
+ if (pCmdData == NULL ||
+ cmdSize != (int)(sizeof(effect_param_t) + sizeof(uint32_t)) ||
+ pReplyData == NULL || replySize == NULL ||
+ *replySize < (int)(sizeof(effect_param_t) + sizeof(uint32_t) + sizeof(uint32_t)))
+ return -EINVAL;
+ p = (effect_param_t *)pCmdData;
+ memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize);
+ p = (effect_param_t *)pReplyData;
+
+ voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
+
+ p->status = Virtualsurround_getParameter(pContext, p->data, (size_t *)&p->vsize, p->data + voffset);
+ *replySize = sizeof(effect_param_t) + voffset + p->vsize;
+ break;
+ case EFFECT_CMD_SET_PARAM:
+ if (pCmdData == NULL ||
+ cmdSize != (int)(sizeof(effect_param_t) + sizeof(uint32_t) + sizeof(uint32_t)) ||
+ pReplyData == NULL || replySize == NULL || *replySize != sizeof(int32_t))
+ return -EINVAL;
+ p = (effect_param_t *)pCmdData;
+ if (p->psize != sizeof(uint32_t) || p->vsize != sizeof(uint32_t)) {
+ *(int32_t *)pReplyData = -EINVAL;
+ break;
+ }
+ *(int *)pReplyData = Virtualsurround_setParameter(pContext, (void *)p->data, p->data + p->psize);
+ break;
+ case EFFECT_CMD_OFFLOAD:
+ *(int *)pReplyData = 0;
+ break;
+ case EFFECT_CMD_SET_DEVICE:
+ case EFFECT_CMD_SET_VOLUME:
+ case EFFECT_CMD_SET_AUDIO_MODE:
+ break;
+ default:
+ ALOGE("%s: invalid command %d", __FUNCTION__, cmdCode);
+ return -EINVAL;
+ }
+ return 0;
+}
+
+int Virtualsurround_getDescriptor(effect_handle_t self, effect_descriptor_t *pDescriptor)
+{
+ VirtualsurroundContext * pContext = ( VirtualsurroundContext *) self;
+ if (pContext == NULL || pDescriptor == NULL) {
+ ALOGE("%s: invalid param", __FUNCTION__);
+ return -EINVAL;
+ }
+ *pDescriptor = VirtualsurroundDescriptor;
+ return 0;
+}
+
+//-------------------- Effect Library Interface Implementation------------------------
+
+int VirtualsurroundLib_Create(const effect_uuid_t * uuid, int32_t sessionId __unused, int32_t ioId __unused, effect_handle_t * pHandle)
+{
+ if (pHandle == NULL || uuid == NULL) {
+ return -EINVAL;
+ }
+ if (memcmp(uuid, &VirtualsurroundDescriptor.uuid, sizeof(effect_uuid_t)) != 0) {
+ return -EINVAL;
+ }
+ VirtualsurroundContext *pContext = new VirtualsurroundContext;
+ if (!pContext) {
+ ALOGE("%s: alloc VirtualsurroundContext failed", __FUNCTION__);
+ return -EINVAL;
+ }
+ memset(pContext, 0, sizeof(VirtualsurroundContext));
+ if (Virtualsurround_load_ini_file(pContext) < 0) {
+ ALOGE("%s: Load INI File faied, use default param", __FUNCTION__);
+ pContext->gVirtualsurrounddata.tbcfg.enable = 0;
+ }
+ pContext->itfe = &VirtualsurroundInterface;
+ pContext->state = VIRTUALSURROUND_STATE_UNINITIALIZED;
+ *pHandle = (effect_handle_t)pContext;
+ pContext->state = VIRTUALSURROUND_STATE_INITIALIZED;
+ ALOGD("%s: %p", __FUNCTION__, pContext);
+ return 0;
+}
+
+int VirtualsurroundLib_Release(effect_handle_t handle)
+{
+ VirtualsurroundContext * pContext = (VirtualsurroundContext *)handle;
+ if (pContext == NULL) {
+ return -EINVAL;
+ }
+ Virtualsurround_release(pContext);
+ pContext->state = VIRTUALSURROUND_STATE_UNINITIALIZED;
+ delete pContext;
+ return 0;
+}
+
+int VirtualsurroundLib_GetDescriptor(const effect_uuid_t *uuid, effect_descriptor_t *pDescriptor)
+{
+ if (pDescriptor == NULL || uuid == NULL) {
+ ALOGE("%s: called with NULL pointer", __FUNCTION__);
+ return -EINVAL;
+ }
+ if (memcmp(uuid, &VirtualsurroundDescriptor.uuid, sizeof(effect_uuid_t)) == 0) {
+ *pDescriptor = VirtualsurroundDescriptor;
+ return 0;
+ }
+ return -EINVAL;
+}
+
+// effect_handle_t interface implementation for VirtualsurroundInterface effect
+
+const struct effect_interface_s VirtualsurroundInterface = {
+ Virtualsurround_process,
+ Virtualsurround_command,
+ Virtualsurround_getDescriptor,
+ NULL,
+};
+
+audio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM = {
+ .tag = AUDIO_EFFECT_LIBRARY_TAG,
+ .version = EFFECT_LIBRARY_API_VERSION,
+ .name = "Virtualsurround",
+ .implementor = "Amlogic",
+ .create_effect = VirtualsurroundLib_Create,
+ .release_effect = VirtualsurroundLib_Release,
+ .get_descriptor = VirtualsurroundLib_GetDescriptor,
+};
+
+};//extern "C"
+
+
diff --git a/libaudioeffect/Virtualsurround/Virtualsurround.h b/libaudioeffect/Virtualsurround/Virtualsurround.h
new file mode 100644
index 0000000..e0314d4
--- a/dev/null
+++ b/libaudioeffect/Virtualsurround/Virtualsurround.h
@@ -0,0 +1,7 @@
+#ifndef ANDROID_VIRTUALSURROUND_H_
+#define ANDROID_VIRTUALSURROUND_H_
+
+#define VIRTUALSURROUND_CUP_LOAD_ARM9E 100 //Expressed in 0.1 MIPS
+#define VIRTUALSURROUND_MEM_USAGE 50 // Expressed in kB
+
+#endif
diff --git a/libaudioeffect/Virtualsurround/libmusicbundle.a b/libaudioeffect/Virtualsurround/libmusicbundle.a
new file mode 100644
index 0000000..a4d7fff
--- a/dev/null
+++ b/libaudioeffect/Virtualsurround/libmusicbundle.a
@@ -0,0 +1,3330 @@
+!<arch>
+/ 0 0 0 0 4778 `
+
+
+
+"
+&
+9
+L
+_
+v
+
+
+
+
+LVCS_BypassMix.o/
+LVCS_Equaliser.o/
+LVCS_ReverbGenerator.o/
+LVCS_StereoEnhancer.o/
+LVM_API_Specials.o/
+LVPSA_QPD_Init.o/
+LVPSA_QPD_Process.o/
+LVEQNB_CalcCoef.o/
+LVEQNB_Control.o/
+LVEQNB_Process.o/
+DC_2I_D16_TRC_WRA_01.o/
+DC_2I_D16_TRC_WRA_01_Init.o/
+FO_2I_D16F32C15_LShx_TRC_WRA_01.o/
+FO_2I_D16F32Css_LShx_TRC_WRA_01_Init.o/
+FO_1I_D16F16C15_TRC_WRA_01.o/
+FO_1I_D16F16Css_TRC_WRA_01_Init.o/
+BP_1I_D16F32C30_TRC_WRA_01.o/
+BP_1I_D16F16C14_TRC_WRA_01.o/
+BP_1I_D32F32C30_TRC_WRA_02.o/
+BP_1I_D16F16Css_TRC_WRA_01_Init.o/
+BP_1I_D16F32Cll_TRC_WRA_01_Init.o/
+BP_1I_D32F32Cll_TRC_WRA_02_Init.o/
+BQ_2I_D32F32Cll_TRC_WRA_01_Init.o/
+BQ_2I_D32F32C30_TRC_WRA_01.o/
+BQ_2I_D16F32C15_TRC_WRA_01.o/
+BQ_2I_D16F32C14_TRC_WRA_01.o/
+BQ_2I_D16F32C13_TRC_WRA_01.o/
+BQ_2I_D16F32Css_TRC_WRA_01_init.o/
+BQ_2I_D16F16C15_TRC_WRA_01.o/
+BQ_2I_D16F16C14_TRC_WRA_01.o/
+BQ_2I_D16F16Css_TRC_WRA_01_Init.o/
+BQ_1I_D16F16C15_TRC_WRA_01.o/
+BQ_1I_D16F16Css_TRC_WRA_01_Init.o/
+BQ_1I_D16F32C14_TRC_WRA_01.o/
+BQ_1I_D16F32Css_TRC_WRA_01_init.o/
+PK_2I_D32F32C30G11_TRC_WRA_01.o/
+PK_2I_D32F32C14G11_TRC_WRA_01.o/
+PK_2I_D32F32CssGss_TRC_WRA_01_Init.o/
+PK_2I_D32F32CllGss_TRC_WRA_01_Init.o/
+Int16LShiftToInt32_16x32.o/
+From2iToMono_16.o/
+Shift_Sat_v16xv16.o/
+Shift_Sat_v32xv32.o/
+Int32RShiftToInt16_Sat_32x16.o/
+From2iToMono_32.o/
+NonLinComp_D16.o/
+DelayMix_16x16.o/
+MSTo2i_Sat_16x16.o/
+From2iToMS_16x16.o/
+Mac3s_Sat_16x16.o/
+Mac3s_Sat_32x16.o/
+Add2_Sat_16x16.o/
+Add2_Sat_32x32.o/
+LVC_MixSoft_1St_2i_D16C31_SAT.o/
+LVC_MixSoft_1St_D16C31_SAT.o/
+LVC_Mixer_VarSlope_SetTimeConstant.o/
+LVC_Mixer_SetTimeConstant.o/
+LVC_Mixer_SetTarget.o/
+LVC_Mixer_GetTarget.o/
+LVC_Mixer_Init.o/
+LVC_Core_MixHard_1St_2i_D16C31_SAT.o/
+LVC_Core_MixSoft_1St_2i_D16C31_WRA.o/
+LVC_Core_MixInSoft_D16C31_SAT.o/
+LVC_Mixer_GetCurrent.o/
+LVC_MixSoft_2St_D16C31_SAT.o/
+LVC_Core_MixSoft_1St_D16C31_WRA.o/
+LVC_Core_MixHard_2St_D16C31_SAT.o/
+LVC_MixInSoft_D16C31_SAT.o/
+AGC_MIX_VOL_2St1Mon_D32_WRA.o/
+LVM_Timer_Init.o/
+/0 0 0 0 644 16396 `
+ELF
+
+
+
+
+P
+
+I
+X
+
+ 
+
+b
+4 D
+*
+0
+2@
+
+ 
+> 
+8
+;
+<
+=
+
+A 
+ 
+FxJ-
+J Jr JJ Jr J(~
+5J5)JJ)J% /O})J/M&M JI J6J
+}J6N FKuJ  0  J<
+
+
+
+
+
+
+
+ELF
+b
+A
+l"
+
+`
+@
+`
+I
+
+`O
+
+I
+X
+
+ 
+
+b
+4 D
+*
+0
+2@
+
+ 
+> 
+8
+;
+<
+=
+
+A 
+ 
+H
+LGH2L J/-2PJJ 3J?J3J I9
+J
+
+
+
+
+
+
+ELF
+
+I
+X
+
+ 
+
+b
+4 D
+*
+0
+2@
+
+ 
+ 
+ 
+
+:
+A 
+ 
+K3QJ?J4J I?KJ=O3E!O=J<!MK=G L=I NE OFK KJ L, J~$<~
+
+~J JwJ  J~J
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+ 0
+`*`
+AJ@
+a
+F
+I
+X
+ 
+
+b
+4 D
+*
+0
+2@
+
+ 
+A 
+ 
+ $($GMJP
+JMKIFJMQ
+ J& eJ`LJREOEO(qJ&OuJP( J&wJLMuJ(J&NpJJ(FJ(nJNmJ JLJJJ2
+F2IMIIN~
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+P0
+
+
+
+
+
+ PpP
+
+I
+X
+ 
+
+b
+4 D
+*
+0
+2@
+
+ 
+A 
+ 
+ tpz JJ K DD t
+|J    9JNJ J
+
+ELF
+$p
+
+@
+
+0
+
+I
+X
+
+ 
+
+b
+4 D
+*
+0
+2@
+
+ 
+ 
+ 
+
+:
+A 
+ 
+JJ|p JlJJ!-L3G1J!J L9 'F9N!MK9G L9I NEKK K&MG L9 ) J~t2JJ:JJ~J<~
+}JtJ}J J H <J<J  HD JHJ J  I <"NG I
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+(p
+
+
+I
+
+X
+
+ 
+
+b
+4 D
+*
+0
+2@
+
+ 
+ 
+ 
+
+:
+
+
+
+A 
+ 
+K3RJ?J4J I@
+$J@J&P@zJ$L@I#KIK M8 ( J+L:(E& J:xJ%MK:G$L:I OzJ PEK$KJ M% J@@C~t~
+
+8 Ht 
+Ju" J H J ytOJ J JPJ J  <
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+$
+
+
+A 
+ 
+
+
+
+
+ELF
+b*`
+A
+*BU5MP
+
+
+d*d
+F
+$
+
+
+
+
+
+A 
+ 
+vHL
+!HL
+ & JI;yJ-RI8 1I8KKlJFI8J18LII&JI-KI8 18K1H8LKI~
+PI\J0KIKI0J
+J0wJI.KIQM~J1P.L>~J
+ J~$J lJ(JrJ(J8
+J$wJ1J e8J(vJ$K(I$(IT JuJJ8rJTJQK*JZO1J/L1H/ Jvw?JL?H3J>NH}
+ 3J>wJ? J8J I;}-RIKy8JFkJ1J8K18LII&JI-KI8 1I8LKI3JJ?J4JAJ2J H|0I0KIK J0vJ
+J0wJI.K J.~JQM1.L$< J7$I J1ZJ&J;J3J?J3J?J6J G3J? J) JJ J)K JJ JP4J@J JGM)rJ JJ J)K JJ J|
+
+
+ELF
+@
+c*dJcj@
+A*@
+
+`
+
+`
+,
+`
+<
+`
+`
+@L
+$
+
+
+
+
+
+A 
+ 
+ J$34$GMJE
+JEuJLKKRLKKS JDNIKRFDOREDL J
+J~JVLJ%
+J J)JDBJ%z J)JDBJ%z J)JDBJ%z J)JDBJ
+)JqJzJPNmJ)
+JvJ,)KNuJ) JKN JJQNzJJP9QLyJ,JQ7JJ*JM1
+J1pJJ/oJ)QO6ML6H5IM<LIO6L6H5IM<LI }J
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+d
+x
+
+0p儱P
+
+0p@
+d
+d
+ P
+ 0
+$
+
+
+
+
+
+A 
+ 
+
+ itJR J.J ,CJ3J-RJ
+<|,J
+J3J*RJ1J
+
+
+
+
+ELF
+ۂ{*>4fMO~ >׾ >zIƲ~d>7md>2>)2>7ZBJN>ibN>ťHbYW7<RW7<DŽ\P{ڛ=JȄڛ=_OÀ|="= Íc|>Чƒ>L=}n>ς"n>L~
+/#p~>7>.)~>>܂M>>/[a&>$<>ڹ8<҆<c'NŞwzO=H`O=P!9{w=w=m8O|$=U,$=õ¤9;}81H>o81H>d}\>F\>Qq'~4>uӂ4>q^~>Wt>.~W>S_W> ʵ5/<5/<gay1:=1:= yu]{rE2=urE2=2Ĝ˽{+=ͩ+=9|!>!><Fы}v(9>v(9>Q_}ϐ{>aϐ{> g~ro>!ro>K&?~@>@> d[~/
+$
+
+
+A 
+ 
+
+
+
+
+
+ELF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+k
+
+
+
+A
+
+)
+a
+
+
+
+
+
+
+
+
+.
+\
+g
+>
+r
+'
+
+
+=
+
+&
+C
+
+^
+y
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+@
+"
+(
+4
+
+g
+L
+t
+-
+
+T
+o
+
+8
+l
+
+
+
+
+
+
+0
+
+
+
+
+t
+
+
+ 
+
+
+
+
+
+
+A
+#
+\
+
+f
+
+
+}
+
+
+
++
+F
+
+
+Z
+
+
++
+X
+t
+
+a
+
+<
+x
+
+|
+
+
+
+
+>
+|
+
+
+
+;
+
+%
+
+
+"
+
+
+
+
+
+
+
+
+A 
+ 
+
+C$
+<tJ  JJy <J
+KJ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+䐔
+!
+
+
+0
+
+
+
+
+
+0H-
+
+
+B p
+H
+p 
+p 
+H
+w
+p 
+t`B @
+p 
+
+
+
+
+
+@->0CMnj>s
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+-
+a
+l
+A
+w
+)
+"
+
+I
+d
+
+
+
+
+
+>
+
+'
+
+)
+=
+4
+&
+
+V
+
+:
+a
+|
+
+
+
+
+
+"
+
+
+
+
+
+
+
+
+
+@
+
+
+(
+
+
+
+
+
+
+
+
+
+M
+
+0
+K
+
+
+
+f
+6
+v
+
+
+
+
+>
+Z
+
+
+
+
+
+
+
+|
+
+
+
+
+7
+_
+{
+
+
+
+
+
+
+
+
+L
+t
+>
+e
+
+
+
+
+
+
+
+
+
+
+
+
+|
+
+
+
+
+
+
+/
+
+"
+
+
+
+
+$
+=
+W
+
+^
+
+
+
+
+
+
+H
+
+
+;
+
+%
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+ 
+
+
+~JJKKJO J B~3J%K@I%LHLM%2J J%q JJ -E  P2J H(H J/"J-JK QJ( H0EIO"JRNI0J5QLyJ"JQ5J} J,O H%
+IKL
+ JI|2J%J6R'yJ Q%yJ(K P&zJ|JJKJK
+ /w|J J
+ JzJ JI zJ2J%J6R'yJ Q%yJ(K P&zJJKJJ
+ .vJxJJ KIQ1J# JyQ x " H4MJP&zJP"L Hyx J"X H&1IIxJJx
+J J J" H4
+tIIxJ xJ5M,J H0IJ" JHKK+KJK"O H2IxJ
+ JL!HLL!I'P=yJ!J"L!IIK PM
+O J'E O "LI I2)KwJ %yJ Q M"K H8)J6JJK&K RJ"I I3J&JLG&J
+ Jv0JL!HLL!I'P=yJ!J"L!IIK PM wJ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+ 
+`
+DJ@*D
+
+q
+
+
+`V *`WJ`
+A
+pL
+
+
+
+
+
+
+$
+,
+
+q
+
+f
+A
+a0
+A
+
+/
+
+㰀H`tp@D A 
+
+
+
+㰀
+
+
+
+` *`QJ`
+@
+
+p=
+ P
+b
+C*C
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+H
+S
+A
+^
+)
+a
+
+
+
+
+
+
+
+
+
+
+
+(
+I
+d
+
+
+>
+
+'
+
+
+
+
+=
+
+
+&
+y
+
+=
+
+
+
+
+
+
+ 
+
+
+
+
+
+
+
+
+
+@
+
+(
+
+p
+
+
+
+-
+4
+T
+o
+
+
+
+
+
+]
+
+%
+A
+i
+
+
+c
+p
+
+
+F
+
+
+
+A
+
+\
+p
+
+3
+[
+}
+
+
+
++
+F
+
+
+
+c
+
+
+
+
+
+a
+p
+
+
+ 
+|
+>
+f
+
+
+
+
+/
+h
+s
+;
+~
+%
+
+
+"
+p
+
+
+
+
+G
+^
+7 $
+
+
+
+)
+V
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+ 
+
+ t  <$
+ |<&{1J& I&1J& I&1J& I&1J& I
+: J|JA y J|0J I0K I0K I0K I"|J!R(IK4B!JBoJ K"Q J{(J&ELZ2 Q0yJ Q'K7JEsJ6 J3LJ(vJ
+J(zJF
+J+P-P.M< wJ(JF
+J<M(uJK<
+JHI<LN  JsJ {<{J@
+tzJ-J
+J-u@QG@HP@EOLv@HKOL6BQ!5MPJ!J5JJ5qJJ)xJ/K)K"IQZHLJVKLGVLLVLLK " J,J*
+J,qJ,jJJ,iJL*JG JWLWHIJSKIGSLISLIK #!J0J+ J0uJ+J0pJ+ 
+J+tJ:M+KR+wJ8L,K+IQYLYHKJUKKGULKHULKK $)Q"yJ)Q')L&5JP'zJPPGI:JPKLJ=
+JO JyDJ5QDxJ"DF J5EIHN=P=PFzJPO=FzJPOF$ J"PF-?IOx%xJ/K'Q/xJR'J$ Jc<'IKxD
+xtJ$xJ4wOJJ+Jwtw
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+
+|
+
+ 
+
+
+! r
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+D
+l
+
+
+A
+
+)
+a
+
+
+
+
+
+.
+5
+@
+>
+K
+'
+]
+h
+=
+s
+&
+C
+
+^
+y
+
+
+
+
+
+
+
+
+a
+
+
+
+
+
+
+
+
+
+@
+
+
+(
+
+
+
+@
+%
+M
+-
+
+T
+o
+
+
+E
+
+
+u
+
+
+
+ 
+}
+
+
+
+
+M
+
+
+
+
+
+
+
+v
+
+
+
+
+A
+
+
+\
+
+?
+
+
+}
+
+
+
++
+F
+
+
+3
+
+
+
+
+
+
+
+
+1
+M
+n
+a
+
+
+
+Q
+c
+|
+
+
+
+
+
+
+
+U
+
+
+
+
+;
+
+%
+
+
+
+3
+G
+
+7
+
+
+
+
+"
+
+
+
+
+
+
+
+
+
+A 
+ 
+
+ wLK P}J!JDJ%J , 
+ J 
+ J@}JL%J)KI.N(KI  
+tJJ$I/IJNJPJ6(II5LGJPJ LI+IJNJPLI*IJNJJJ'&JH,I=JJ-  I$=JVJJ" I   ~J}t|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+]
+͟>L"
+&
+x
+A 
+ 
+
+
+ELF
+
+
+
+
+$
+
+
+$
+[
+
+2
+ 
+
+
+
+
+
+L
+@
+
+000
+
+
+
+0
+0H-+
+
+
+ Qr
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+H
+S
+A
+^
+)
+
+
+
+
+
+
+
+
+
+
+a
+|
+
+
+
+
+
+>
+
+'
+
+
+
+
+=
+
+
+&
+
+
+=
+
+7
+R
+y
+
+
+
+
+
+
+
+
+
+
+
+
+@
+
+(
+
+p
+
+
+
+-
+4
+T
+o
+
+
+
+
+
+]
+
+%
+A
+i
+
+
+c
+p
+
+
+F
+
+
+
+A
+
+\
+p
+
+3
+[
+}
+
+
+
++
+F
+
+
+
+c
+
+
+
+
+
+a
+p
+
+
+ 
+|
+>
+f
+
+
+
+
+/
+h
+s
+;
+~
+%
+
+
+"
+
+p
+
+
+)
+V
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+A 
+ 
+
+<~J3J/JN0JJ tJJ<JJJJ5JJ5J  0J" ~9J0HL0L"H 7~J8J7K I~3X4XJ4YJ/zJ J3JK>J9JL.J<J4J9J J
+<oJ" J~7 JJ8H,L,LH J4'J
+ 2J5J1J %9J6J}EZJ.J2o9J>I. :.R I}
+ J"t0 I
+J J%JJJJ   J|'J$=r' $'IJHJ)5 JqJ  |
+4RJ JJL4f | |7(vI:?JJ7}J JM JFqJMJqJJJ`JJ qJ qJ|J J
+ #"K0K60zJJ0PJ #6P/wJ JBJ:JJJ<JNJ9JHJ7J F2}2JL1J}4RJ J 
+JK3H%N}KKK  pJJHP zJAyJ&J wJ& 8 4qJ8JHrJ&IK'$JyJy-JK eJ?zJ J eJ J wJ-JHmJ*JJWm 8wJJ8gJ& 8w"J%yJ!Jy%QK@yJP(K"O JxJ
+Kx<x
+e0JE Jx"M1GMxJ> HJ-L-L6OLLIK9
+wDJ%3Nw8EH-L-LH*L-J
+J J  J wJ
+LJLJ
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+
+
+ 
+ X
+` 0
+{
+| 
+ X
+P
+X
+
+
+
+
+
+D
+@p
+
+P
+X
+!
+:
+:
+:
+:
+:
+
+
+
+
+
+
+
+
+
+A 
+ 
+NNJ F"I"K
+MB%JBK%J
+ :z+J:K+J:K+J:+JM
+ A*F*J?) JJJvDJ_J!  J!K 2JJ|!GZMJaJKJPJ K~N%J+H)L9J+H J~!(L,JJ+ J)
+ JJ*~S}J*}J!QyJ8K Q(I KS J$wS J}2JJJ }
+J}<J J>
+!J1|J>I
+!JJQ!gJJJvJ
+JyJJ JIJ KJIpJ#J oJ KIJG P+hJII1K6ILJyJJ$jJJH JwJLOzJQ;{JJ;K>!J0~J>IJ
+gJ!JR
+J JIJJ KI#JKI oJ JJ JJ JIJJJJ oJKJ)JG+nJ1JII6JLJzJJ'RyJ$IR'H}JJ'KJ:}J;KJ2JJ}<|
+J"q|J0J|JJDJ_JJ! J J!K 2JJ |
+ J&yxJFHJJ&xJ9HJJ
+ 
+JJ!hJ J!wJJ!hJJgJJvJ
+JyJJ JI oJ J#IJJ KIJMGJIpJ P+hJ1J6ILJJ$jJHJLONvJQMyJ
+"
+JJ!hJ J!wJJP!hJJRJyJzJJ J JJ JJ JJ JIJJJJJJJJJMG#JJ oJ)J+nJII1K6ILJJ'yJ$IR'HJ'KJNz
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+
+
+
+
+
+
+
+ 
+
+,
+
+
+0
+!
+:
+:
+:
+:
+:
+A 
+ 
+4OJIJ>IJ zJ
+-TJ-TJ-TJ-JJRQKYKYK NJ
+
+
+
+
+
+ELF
+
+`8
+D*D
+
+!
+:
+:
+:
+:
+:
+A 
+ 
+
+<AJ?<#<~ 
+1XJ1KXJ1XJ1J J
+
+
+
+ELF
+
+@
+
+
+h&0璇"B8qpr`CHAA1!s0t0D('8#( X
+
+`
+
+
+!
+:
+:
+:
+:
+:
+A 
+ 
+ t
+8j<JJJ  ~@Jt>2JN~J
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+I
+
+
+A 
+ 
+$KJ$KJK
+
+
+
+
+
+
+ELF
+!
+
+
+
+
+
+A 
+ 
+;mJJ%fJJ%hJJ9wJJ"
+NJ!L_JI:K I KL
+
+
+
+
+
+
+ELF
+
+L 9
+ : ;
++
+A 
+ 
+
+
+
+
+
+ELF
+.@: ;'I?
+
+A 
+ 
+" Q:aJ!J
+J K!I Q!yJrJ Q zJ  JJ JL0IK)ILJQJK KJIJ KJ#IJJMG KIJ mJ JzJJ vJJ$iJJJOMwJQLJL~
+$ Q:`J!J
+J K!I Q!y Q zJ JrJ  JJ JL0IK)ILJQPzJPK J JJ JJ JJ JIJJJJJJJJJMG#JJqJPzJPzJ*MJ J$wJ'RyJQ'HJ'KJLM}
+
+
+ELF
+`P
+A
+`
+A/
+0
+ 0x@0P0G
+
+
+
+
+
+p @
+|
+t
+|
+
+
+h
+`
+G
+
+P
+
+
+`
+$
+
+
+
+
+
+
+A 
+ 
+QGw
+N!G
+ JTEQHL*yJ$~J# J6wJJ:K#RM J3~ L'J#ZJ3-JJ*JS*-JSJJ0~J
+ J~!<J K4I@I@JJ@KI4I@I@JJ@KIBJ,JJ~<}
+L JP+wJcK N
+
+
+ Au  JTJ+ { J)I K.K J
+
+
+
+
+ELF
+0
+b
+D*@JDp
+
+
+
+
+
+,
+0
+<
+ 
+hT
+@
+`
+@
+$
+
+
+
+
+!
+
+
+ 
+A 
+ 
+<~ 
+
+~<%~ J)J% J)J% J)J% J)JP  LJ}J}J$JyJJ$Qy$QK$zJ'
+JPJ$" JKKIR(J8KM(J8 ~"J ~JJ(J6KQCKI.Q'xJJ'xJKIM>GO>>ELMK?>R>zKOK0?}
+
+
+
+ELF
+
+
+
+
+
+xl
+
+
+$
+
+
+
+
+A 
+ 
+ )B 
+
+
+
+
+
+ELF
+A 
+ 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ELF
+a
+@
+@/
+.@1
+
+
+A 
+ 
+I4KIKK
+LLHLKIKL
+ L
+L&+JJKML&K+JJKML&K+JJEML&K+JJL
+KP~
+NJHJL mJ JnJA
+KJH$HLL 
+
+
+
+
+
+ELF
+4
+P
+A 
+ 
+P L
+
+
+ELF
+ : ;
+%
+A 
+ 
+LKK
+
+
+
+ELF
+
+ig&pGTk
+W
+.@: ; '?
+
+
+A 
+ 
+~%~ J5y)pJRP P2v~J JMJyJ5H rJJJJz2O>J2BJ  JJzJ P~J
+J~JzJI
+J~J%JIM(J
+
+
+
+ELF
+.@: ; '?
+
+
+A 
+ 
+LKKKKKLKK
+
+ELF
+.@: ; '?
+
+A 
+ 
+
+J%wIsJ*yJ
+J
+vJ5
+J2GPGM M
+JvJ;iJ
+Q%JI
+
+
+ELF
+.@: ; '?
+
+A 
+ 
+LKKKKKK
+
+ELF
+
+ Fv z .(J"l"Kh("ρ
+
+.@: ; '?
+
+A 
+ 
+
+&
+bJ)
+xJ"J
+
+ELF
+
+.@: ; '?
+
+A 
+ 
+
+O&
+J5sJ4PzJ?J% J*kJ2R% JM
+iJ@RMML J%PP4oJ
+uJ J
+
+
+ELF
+
+0F0C$" 
+.@: ; '?
+
+A 
+ 
+ 
+
+
+ELF
+.@: ; '?
+
+A 
+ 
+LJKJKJK
+
+ELF
+.@: ; '?
+
+A 
+ 
+$LJ$KJ$KJK
+
+ELF
+.@: ; '?
+
+A 
+ 
+!LJ!LJ!LJK
+
+ELF
+.@: ; '?
+
+A 
+ 
+LKKKKKKKKKK
+
+
+
+ELF
+
+
+Cxs`{u`:#H@"hExt&x(q"/Dq 
+
+BhrP`H
+.@: ; '?
+
+A 
+ 
+
+~ NuJ JNxJ fJJgJJJ yJyJeJ J JtJM J% JI&L ]JuJ&/J%I hJ%J gJJpJG~<JGJ~nJJOEnJJ N~(JmJ lJJ^$"Jt~JJK ]J~JG~JJMMFtNF~JJ M~J@FtNF~JJ M~0JFJNFK~J J~,JJiJJj~J J% J uJ~J I'  tJ% J'L
+FJ%:J'L*D%<J
+DJ
+J~JJ
+
+ELF
+
+p
+.@: ; '?
+
+A 
+ 
+
+%LzMGI~
+[ %JlJJlJ*oJG (JzJ vJy Qh% QlJ~J
+J
+CJ=J)wJ
+L%J~LKIJ
+
+
+
+
+ELF
+
+p
+.@: ; '?
+
+A 
+ 
+%LzMGI~
+J CJ=J)wJ L%J~LKIJ
+
+
+
+
+ELF
+
+p
+.@: ; '?
+
+A 
+ 
+
+%LzMGI~
+[ %JlJJlJ*oJG (JzJ vJy Qh% QlJ~J
+J
+CJ=J)wJ
+L%J~LKIJ
+
+
+
+
+ELF
+.@: ; '?
+
+:
+A 
+ 
+LKKKKKKKKKK
+
+ELF
+
+
+.@: ; '?
+
+A 
+ 
+
+%EIMIF<Kt*xJ J2J5rJ2zJ4JlJJ
+aJ JPJlJJlM<eJ~J<QJJJ[J
+jJ:J
+FJ<y
+QJ%JGIMI 
+
+ELF
+
+
+.@: ; '?
+
+A 
+ 
+
+%EIMIF<Lt*yJ
+J2J5rJ2zJ4JlJJ
+bJ
+JPJlJJlM<fJ~J<RJJJ[J
+kJ9J
+GJ<y
+QJ%JGIMI
+
+ELF
+.@: ; '?
+
+:
+A 
+ 
+LKKKKKKKKKK
+
+ELF
+.@: ; '?
+
+A 
+ 
+
+'J%vIH<_JJ<qJJ*uJ2RP5J
+rJ JPGPG<hJJ<eJJ J
+^J%JH 
+
+ELF
+.@: ; '?
+
+:
+A 
+ 
+LKKKKKKKKKK
+
+ELF
+u`槄pJHGpFH$g` @
+ PO/
+.@: ; '?
+
+A 
+ 
+
+&J%xHIbJ JMrJ5J M2wJP*rJ
+J JFJJNvJ 
+JyNkJJ( J)zJPZJ
+M%JIH 
+
+
+
+
+
+ELF
+.@: ; '?
+
+:
+A 
+ 
+LKKKKKKKKKK
+
+ELF
+
+.@: ; '?
+
+A 
+ 
+
+M <NNtJJlJ KJxJ R&J"j t~%$J [J%&J ZJ&'J YJ%'J YJ0MGM~ DJ<J FD
+@J
+
+
+
+ELF
+
+
+.@: ; '?
+
+A 
+ 
+
+~ QNtJ N&J"jJ sJ" J oJ%%J!lJ%JK kJ&J%J mJJkJJ~JGM~JMGNN%J _JJ~JJ~JJF%-JSJ~J JGMyJQ~JN%%J'K ]J%# ]J'%J [J%%J
+GJ,JkJ~JJ*TJ?J
+AJ
+
+ELF
+
+@Ѝ/
+.@: ; '?
+
+A 
+ 
+LLtR
+
+ELF
+.@: ; '?
+
+A 
+ 
+!LJ!LJ!LJLJL
+
+ELF
+@BPtP
+\ B
+A 
+ 
+P  GKLZ0&JZ(J$JJZ(JHJ$LJHR
+
+
+
+
+
+
+ELF
+@B0t0
+A 
+ 
+MP\J'JVJ"J JQ$HOE"MJxJ J
+
+
+
+
+
+
+ELF
+`B0v0
+``VM
+A
+`BPvP0
+`PUN
+D
+\ BC
+A 
+ 
+MPZJ&JZJ $J   HK K\ Q1J!HL HQ&!HL H
+
+
+
+
+
+
+ELF
+
+PB0u@1N0C
+dQ!`E@
+ B
+A 
+ 
+O M HIKLLT}\&JHLHOJE 
+
+ELF
+PB0u@1N0C
+dQ!`@
+
+A 
+ 
+O IM HIKLLT}\&JHLHOJE 
+
+
+
+
+
+
+
+
+ELF
+
+B0|0
+A^
+A 
+ 
+^">\J"WJ"JLH
+
+
+ELF
+
+B0|0
+A^
+A 
+ 
+O1>MJ1HJ1JLH
+
+
+ELF
+A 
+ 
+  
+
+
+
+ELF
+s`
+
+
+A 
+ 
+N  J@XJ(JFNFNFNFS &J    <(<XJ+JLO!& J@
+
+
+
+
+ELF
+s`
+
+
+&
+"
+
+A 
+ 
+N  J<
+JyQEJJ JJ 
+
+
+
+
+ELF
+A 
+ 
+!
+ xJ
+ELF
+PB@uP
+
+A 
+ 
+N\$(ZJ&JQFNFW$J\&ZJ&J MS$J
+
+
+
+ELF
+@B0t0
+A 
+ 
+NP[J(JJMUJ#J JP%HJJMxJ J
+
+
+
+
+
+
+ELF
+@CPtP
+A 
+ 
+NTZJ&J"WJ$J\&HJ"L!MJE
+J
+
+
+
+
+
+
+
+ELF
+PC`u`
+&
+"
+J
+A 
+ 
+N`YJ *JTJ%J['HJ OyJ J
+
+
+
+ELF
+:|~
+c
+A 
+ 
+
+J
+
+
+
+ELF
+&
+"
+A 
+ 
+MYH*)JHJ=J;JWJKMJK)OOHE=;JWJKrJJoJJK NjJ JjJJM
+
+ELF
+pC`w
+
+A 
+ 
+O[p'tYJ*JVJ-J LM=JCJ ?J%J*VJ[t%JVJ'JJp~tJ JtJJ~A%J
+
+ELF
+`CPv
+
+A 
+ 
+M]%HOE OEOFOqJJlJv[J,JOEOFOEOEONJ#J
+
+ELF
+@CPtP
+&
+J
+A 
+ 
+P`NJ5JLHLFNFN~E0JP5<LHNGJ ;JA0J
+
+
+
+ELF
+PC`u`
+&
+"
+J
+A 
+ 
+Od J uJK RE+J J<J J JCJ&JZ(HQ HM+J J J iJ
+
+
+
+ELF
+@B0t0
+A 
+ 
+M\\J2$J#JFNFNFNFY"JJJ$<&J#J\J 'JU"J
+
+
+
+
+ELF
+@B0t0
+A 
+ 
+M T 
+J y Q zJKJJ(J J JJJ#J] %H O KKJJ J mJ
+
+
+
+ELF
+ r
+
+
+
+
+
+
+4
+I
+F
+g
+A 
+ 
+z-4yJQZCJ J J,JOJJ/~JJ=)J0JJSJJ~<1JAM J Am%t J4'J JJJ J</IK!I*K K-5KXJJ% J4 J'J JJJ J</IK!I*K K-5KXJJ
+
+
+
+
+ELF
+ r
+
+q
+@
+
+p
+
+
+I
+_
+g
+A 
+ 
+A*J J J: I.K)J,JMJJ:-I.K I)K~J JJ =)JJ#K ~)CJg<J=#K~J~% J2&J JGJ J:-I.K I)K K-5KXJJ
+
+
+
+
+
+
+
+ELF
+Eg
+,
+Android (4691093 based on r316199) clang version 6.0.2 (https://android.googlesource.com/toolchain/clang 183abd29fc496f55536e7d904e0abae47888fc7f) (https://android.googlesource.com/toolchain/llvm 34361f192e41ed6e4e8f9aca80a4ea7e9856f327) (based on LLVM 6.0.2svn)
+
+
+
+R
+p
+A 
+ 
+<~ J6#J+J pOEJ L K~JJK~J
+
+
+
+
+
+
+ELF
+,
+Android (4691093 based on r316199) clang version 6.0.2 (https://android.googlesource.com/toolchain/clang 183abd29fc496f55536e7d904e0abae47888fc7f) (https://android.googlesource.com/toolchain/llvm 34361f192e41ed6e4e8f9aca80a4ea7e9856f327) (based on LLVM 6.0.2svn)
+
+
+
+<
+Z
+A 
+ 
+JOLKJ
+
+
+ELF
+4
+
+R
+r
+A 
+ 
+OJ(JK#IKB
+
+
+
+ELF
+I
+g
+A 
+ 
+2J&J!JL
+
+ELF
+4
+&
+A 
+ 
+N
+
+
+ELF
+@LP
+b) I" f$.cdc$ƒ$X>H$#(&r(br
+ baZ
+4
+
+
+
+A 
+ 
+ 
+ -L-GMdJ
+
+
+
+
+
+ELF
+
+0.
+
+0
+MCn
+
+0
+4
+
+
+
+"
+
+
+
+
+'
+[
+A 
+ 
+ F%P&I%G&I
+J M ~ JJ~J 
+ K~c  JJ  ~J J~J~(0L%9 %)H9LTJJ%K G9MTJJ G~J ~ JJ~ J K~J  J~!J_J5!JPJJ!K5JPJJ!K5JPJJ!K5JPJJ!K5JPJJ!K5JPJJ!K5JPJJ!KXJ5(JPJJXJ*KL
+
+ELF
+p`
+@
+@D`
+@D
+4
+
+
+
+A 
+ 
+ N$EN"E~JJ QyJJE~.~JJBJ*JK~# J  ~ J.R xJR xJLB*~JJ~.JBJ*JK~.JBJ*J~.JJBJ*JK~ J&~J J  PE ~.JBJ*J~JJ~# J~JJ  J~~.QzJPzJ~JBJ*J~JJ~.JBJ*JK~.JBJ*J~.JBJJ*JK~ J& JJK
+
+ELF
+I
+g
+A 
+ 
+4J(J#JK
+
+
+
+ELF
+$0
+
+
+p
+p
+
+[
+A 
+ 
+-4yJQ2J9J: =x
+
+
+
+
+
+ELF
+pP'`'Pa
+@0`$$
+@DP
+@D
+4
+P
+A 
+ 
+RN$EN"ER JJQyJQE~)J#I=KWJJ I ~ J%Q yJ&9RSJ%K9JSJJ%K9JSJJ%K uJ9 JSJJ uJ  PE OE~J)#I=KWJJ I %PE&9QSJJ%K9JSJJ%K9JSJJ%K vJ9
+JSJJ vJ K~J ~JK~J J
+
+
+
+
+ELF
+@LP
+
+
+<`` "b~zP|nf*f,.
+4
+
+
+A 
+ 
+ -L-GMJ
+vJ,J
+
+
+
+
+
+
+ELF
+ r
+/ R
+q
+q
+p
+
+
+I
+_
+g
+A 
+ 
+A*J J J: I.K)J,JMJJ:-I.K I)K~J J~J=?<=J1=$JhJ~<%< J2&J JGJ J:-I.K I)K K-5KXJJ
+
+
+
+
+
+
+
+ELF
+
+QXy
+
+
+
+
+
+
+
+
+
+
+
+A 
+ 
+<P J/rJ
+
+
+
+
+
+ELF
+.@: ; '?
+
+A 
+ 
+ J J-xJ TJ6'J%I6MII%I K
+
+
+
+
+ELF
+b !
+B
+.@: ; '?
+
+A 
+ 
+P/zJ$N~$JPKIK
+
+
+