From 11952040a3d4d6c29bb1590a3006e2863c8d4445 Mon Sep 17 00:00:00 2001 From: Iscle Date: Fri, 6 Jan 2023 03:24:08 +0100 Subject: [PATCH] Update --- CMakeLists.txt | 12 ++--- src/ViPER4Android.cpp | 104 ++++++++++++++++++++++++++++++++---------- 2 files changed, 87 insertions(+), 29 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 27b0875..6c55da3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -5,11 +5,11 @@ set(CMAKE_CXX_COMPILER_VERSION 20) #set(ANDROID_ABI arm64-v8a) set(ANDROID_ABI armeabi-v7a) set(ANDROID_ARM_NEON true) -set(ANDROID_PLATFORM android-21) +set(ANDROID_PLATFORM android-24) project("ViPER4Android") -add_compile_definitions(VERSION_CODE=1) -add_compile_definitions(VERSION_NAME="1.0.0") +add_compile_definitions(VERSION_CODE=20221231) +add_compile_definitions(VERSION_NAME="0.1.0") ## KISS FFT #set(KISSFFT_PKGCONFIG OFF) @@ -78,7 +78,7 @@ message(${CMAKE_BUILD_TYPE}) add_library( # Sets the name of the library. - v4afx_r + v4a_re # Sets the library as a shared library. SHARED @@ -86,5 +86,5 @@ add_library( # Provides a relative path to your source file(s). ${FILES}) -target_link_libraries(v4afx_r log) # kissfft) -target_compile_options(v4afx_r PRIVATE -Wall -Wextra -Wno-unused-parameter) +target_link_libraries(v4a_re log) # kissfft) +#target_compile_options(v4afx_r PRIVATE -O2 -DNDEBUG -Wall -Wsign-conversion -Wno-unused-result -Wno-unneeded-internal-declaration -fstrict-aliasing -fvisibility=hidden -Wextra -Wno-unused-parameter) diff --git a/src/ViPER4Android.cpp b/src/ViPER4Android.cpp index dfadfbe..1cd546b 100644 --- a/src/ViPER4Android.cpp +++ b/src/ViPER4Android.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "viper/ViPER.h" #include "essential.h" #include "log.h" @@ -9,10 +10,7 @@ static effect_descriptor_t viper_descriptor = { .type = EFFECT_UUID_INITIALIZER, - // 41d3c987-e6cf-11e3-a88a-11aba5d5c51b - // Original: {0x41d3c987, 0xe6cf, 0x11e3, 0xa88a, {0x11, 0xab, 0xa5, 0xd5, 0xc5, 0x1b}} - // New: {0x90380da3, 0x8536, 0x4744, 0xa6a3, {0x57, 0x31, 0x97, 0x0e, 0x64, 0x0f}} - .uuid = {0x41d3c987, 0xe6cf, 0x11e3, 0xa88a, {0x11, 0xab, 0xa5, 0xd5, 0xc5, 0x1b}}, + .uuid = {0x90380da3, 0x8536, 0x4744, 0xa6a3, {0x57, 0x31, 0x97, 0x0e, 0x64, 0x0f}}, .apiVersion = EFFECT_CONTROL_API_VERSION, .flags = EFFECT_FLAG_OUTPUT_DIRECT | EFFECT_FLAG_INPUT_DIRECT | EFFECT_FLAG_INSERT_LAST | EFFECT_FLAG_TYPE_INSERT, .cpuLoad = 8, // In 0.1 MIPS units as estimated on an ARM9E core (ARMv5TE) with 0 WS @@ -29,6 +27,34 @@ struct ViperContext { ViPER *viper; }; +static void pcm16ToFloat(float *dst, const int16_t *src, size_t frameCount) { + for (size_t i = 0; i < frameCount * 2; i++) { + dst[i] = (float) src[i] / (float) (1 << 15); + } +} + +static void pcm32ToFloat(float *dst, const int32_t *src, size_t frameCount) { + for (size_t i = 0; i < frameCount * 2; i++) { + dst[i] = (float) src[i] / (float) (1 << 31); + } +} + +static void floatToFloat(float *dst, const float *src, size_t frameCount) { + memcpy(dst, src, frameCount * 2 * sizeof(float)); +} + +static void floatToPcm16(int16_t *dst, const float *src, size_t frameCount) { + for (size_t i = 0; i < frameCount * 2; i++) { + dst[i] = (int16_t) round(src[i] * (float) (1 << 15)); + } +} + +static void floatToPcm32(int32_t *dst, const float *src, size_t frameCount) { + for (size_t i = 0; i < frameCount * 2; i++) { + dst[i] = (int32_t) round(src[i] * (float) (1 << 31)); + } +} + static int32_t Viper_IProcess(effect_handle_t self, audio_buffer_t *inBuffer, audio_buffer_t *outBuffer) { auto pContext = reinterpret_cast(self); @@ -40,27 +66,57 @@ static int32_t Viper_IProcess(effect_handle_t self, audio_buffer_t *inBuffer, au return -EINVAL; } - float *inBufferPtr = inBuffer->f32; - float *outBufferPtr = outBuffer->f32; + float *buffer; + size_t frameCount = outBuffer->frameCount; - if (inBufferPtr != outBufferPtr) { - memcpy(outBufferPtr, inBufferPtr, outBuffer->frameCount * 2 * sizeof(float)); + switch (pContext->config.inputCfg.format) { + case AUDIO_FORMAT_PCM_16_BIT: + buffer = new float[outBuffer->frameCount * 2]; + pcm16ToFloat(buffer, inBuffer->s16, frameCount); + break; + case AUDIO_FORMAT_PCM_32_BIT: + buffer = new float[outBuffer->frameCount * 2]; + pcm32ToFloat(buffer, inBuffer->s32, frameCount); + break; + case AUDIO_FORMAT_PCM_FLOAT: + buffer = outBuffer->f32; + floatToFloat(buffer, inBuffer->f32, frameCount); + break; + default: + return -EINVAL; + } + + pContext->viper->processBuffer(buffer, frameCount); + + switch (pContext->config.outputCfg.format) { + case AUDIO_FORMAT_PCM_16_BIT: + floatToPcm16(outBuffer->s16, buffer, frameCount); + delete[] buffer; + break; + case AUDIO_FORMAT_PCM_32_BIT: + floatToPcm32(outBuffer->s32, buffer, frameCount); + delete[] buffer; + break; + case AUDIO_FORMAT_PCM_FLOAT: + floatToFloat(outBuffer->f32, buffer, frameCount); + break; + default: + return -EINVAL; } - pContext->viper->processBuffer(outBufferPtr, outBuffer->frameCount); return 0; } static int handleSetConfig(ViperContext *pContext, effect_config_t *newConfig) { - VIPER_LOGI("Begin handleSetConfig ..."); + VIPER_LOGD("Begin handleSetConfig ..."); VIPER_LOGI("Checking input and output configuration ..."); - VIPER_LOGD("Input sampling rate: %d", newConfig->inputCfg.samplingRate); - VIPER_LOGD("Input channels: %d", newConfig->inputCfg.channels); - VIPER_LOGD("Input format: %d", newConfig->inputCfg.format); - VIPER_LOGD("Output sampling rate: %d", newConfig->outputCfg.samplingRate); - VIPER_LOGD("Output channels: %d", newConfig->outputCfg.channels); - VIPER_LOGD("Output format: %d", newConfig->outputCfg.format); + VIPER_LOGI("Input sampling rate: %d", newConfig->inputCfg.samplingRate); + VIPER_LOGI("Input channels: %d", newConfig->inputCfg.channels); + VIPER_LOGI("Input format: %d", newConfig->inputCfg.format); + VIPER_LOGI("Output sampling rate: %d", newConfig->outputCfg.samplingRate); + VIPER_LOGI("Output channels: %d", newConfig->outputCfg.channels); + VIPER_LOGI("Output format: %d", newConfig->outputCfg.format); pContext->isConfigValid = false; @@ -86,17 +142,19 @@ static int handleSetConfig(ViperContext *pContext, effect_config_t *newConfig) { return -EINVAL; } - // AUDIO_FORMAT_PCM_16_BIT - if (newConfig->inputCfg.format != AUDIO_FORMAT_PCM_FLOAT) { + if (newConfig->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT && + newConfig->inputCfg.format != AUDIO_FORMAT_PCM_32_BIT && + newConfig->inputCfg.format != AUDIO_FORMAT_PCM_FLOAT) { VIPER_LOGE("ViPER4Android disabled, reason [in.FMT = %d]", newConfig->inputCfg.format); - VIPER_LOGE("We only accept f32 format"); + VIPER_LOGE("We only accept AUDIO_FORMAT_PCM_16_BIT, AUDIO_FORMAT_PCM_32_BIT and AUDIO_FORMAT_PCM_FLOAT input format!"); return -EINVAL; } - // AUDIO_FORMAT_PCM_16_BIT - if (newConfig->outputCfg.format != AUDIO_FORMAT_PCM_FLOAT) { + if (newConfig->outputCfg.format != AUDIO_FORMAT_PCM_16_BIT && + newConfig->outputCfg.format != AUDIO_FORMAT_PCM_32_BIT && + newConfig->outputCfg.format != AUDIO_FORMAT_PCM_FLOAT) { VIPER_LOGE("ViPER4Android disabled, reason [out.FMT = %d]", newConfig->outputCfg.format); - VIPER_LOGE("We only accept f32 format"); + VIPER_LOGE("We only accept AUDIO_FORMAT_PCM_16_BIT, AUDIO_FORMAT_PCM_32_BIT and AUDIO_FORMAT_PCM_FLOAT output format!"); return -EINVAL; } @@ -107,7 +165,7 @@ static int handleSetConfig(ViperContext *pContext, effect_config_t *newConfig) { pContext->viper->ResetAllEffects(); pContext->isConfigValid = true; - VIPER_LOGI("Audio handleSetConfig finished"); + VIPER_LOGD("Audio handleSetConfig finished"); return 0; }