author | jiejing.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) |
commit | cbc5759734a1d16fb7d31bc73066587ddda2d869 (patch) | |
tree | 4b5f28eef3f20179023021b3ed65b7e76db0552d | |
parent | b14ea1490af4eb2a279206b6dfa5df6296de676b (diff) | |
download | av-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>
-rw-r--r-- | libaudioeffect/Virtualsurround/Android.mk | 40 | ||||
-rw-r--r-- | libaudioeffect/Virtualsurround/Virtualsurround.cpp | 552 | ||||
-rw-r--r-- | libaudioeffect/Virtualsurround/Virtualsurround.h | 7 | ||||
-rw-r--r-- | libaudioeffect/Virtualsurround/libmusicbundle.a | 3330 |
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&MJI
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
DDt +|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$(ITJuJJ8rJTJQK*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 JDNIKRFDOREDLJ +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'K7JEsJ6J3LJ(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= +JOJyDJ5QDxJ"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 +JJ%JJJJ J|'J$=r'
$'IJHJ)5 JqJ | +4RJ JJL4f |
|7(vI:?JJ7}J
JMJFqJMJqJJJ`JJ qJ qJ|JJ +#"K0K60zJJ0PJ #6P/wJ JBJ:JJJ<JNJ9JHJ7J F2}2JL1J}4RJ J +JK3H%N}KKK
pJJHPzJAyJ&JwJ&8
4qJ8JHrJ&IK'$JyJy-JKeJ?zJ JeJ JwJ-JHmJ*JJWm 8wJJ8gJ& 8w"J%yJ!Jy%QK@yJP(K"OJxJ +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:KI KL + + + + + + +ELF + +L9 +:; ++ +A + + + + + + +ELF +.@:;'I? + +A + +"
Q:aJ!J +J K!I
Q!yJrJ
Q zJJJ
JL0IK)ILJQJK KJIJ KJ#IJJMG KIJmJ JzJJ vJJ$iJJJOMwJQLJL~ +$
Q:`J!J +J K!I
Q!y
Q zJ
JrJ
JJ
JL0IK)ILJQPzJPK J JJ JJ JJ JIJJJJJJJJJMG#JJqJPzJPzJ*MJJ$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 + + +~
NuJJNxJ
fJJgJJJ
yJyJeJJJtJM 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*xJJ2J5rJ2zJ4JlJJ +aJJPJlJJlM<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 +rJJPGPG<hJJ<eJJJ +^J%JH + +ELF +.@:;'? + +: +A + +LKKKKKKKKKK + +ELF +u`槄pJHGpFH$g`@ +PO/ +.@:;'? + +A + + +&J%xHIbJJMrJ5J
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< +JyQEJJJJ + + + + +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 OyJJ + + + +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~tJJtJJ~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
JJCJ&JZ(HQ HM+J J
JiJ + + + +ELF +@B0t0 +A + +M\\J2$J#JFNFNFNFY"JJJ$<&J#J\J
'JU"J + + + + +ELF +@B0t0 +A + +MT
+Jy
QzJKJJ(J
JJJJ#J]%HOKKJJ
JmJ + + + +ELF + r + + + + + + +4 +I +F +g +A + +z-4yJQZCJ JJ,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 JJ: 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+JpOEJL 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 uJ9JSJJ 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 JJ: 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 + + + |