Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement effect offloading to Hexagon DSP #29

Draft
wants to merge 1 commit into
base: foss
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ build.ninja

# CMake
cmake-build-*/
android_*/
hexagon_*/

# Mongo Explorer plugin
.idea/**/mongoSettings.xml
Expand Down Expand Up @@ -147,3 +149,7 @@ local.properties
.gradle/
build/
.cxx/

### Misc
LOGS/
*-hexagon/
76 changes: 62 additions & 14 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,17 @@ set(CMAKE_CXX_COMPILER_VERSION 20)
#add_compile_definitions(ANDROID_ARM_NEON=true)
#add_compile_definitions(ANDROID_PLATFORM=android-24)

project("ViPER4Android")
project("ViPER4Android" C CXX ASM)
enable_language(ASM)
add_compile_definitions(VIPER_VERSION=20240314)

# FFTS
#add_subdirectory(src/viper/ffts)

# ViPERFX
include_directories(src/include)

set(FILES
# Main
src/viper/ViPER.cpp
src/ViPER4Android.cpp
src/ViperContext.cpp

# Effects
Expand Down Expand Up @@ -70,16 +68,66 @@ set(FILES
src/viper/utils/TimeConstDelay.cpp
src/viper/utils/WaveBuffer.cpp)

add_library(
# Sets the name of the library.
v4a_re
if(HEXAGON_SDK_ROOT)
include(${HEXAGON_SDK_ROOT}/build/cmake/hexagon_fun.cmake)
set(common_incs
src/include/
${CMAKE_CURRENT_BINARY_DIR}/
${HEXAGON_SDK_ROOT}/incs/
${HEXAGON_SDK_ROOT}/incs/stddef/
${HEXAGON_SDK_ROOT}/rtos/qurt/
${HEXAGON_SDK_ROOT}/utils/examples/
)
include_directories(${common_incs})

add_compile_options(-Wno-error=reorder-ctor
-Wno-error=unused-private-field
-Wno-error=unused-variable
-fvisibility=hidden
-DNDEBUG
-flto
-ggdb
"-D__QAIC_SKEL_EXPORT=__attribute__((visibility(\"default\")))")

if(${OS_TYPE} MATCHES "HLOS")
add_compile_options(-DHEXAGON_STUB -Oz)
SET(CMAKE_CXX_CREATE_SHARED_LIBRARY "${CMAKE_CXX_CREATE_SHARED_LIBRARY} -lc++")
set(util_srcs
${HEXAGON_SDK_ROOT}/utils/examples/dsp_capabilities_utils.c
${HEXAGON_SDK_ROOT}/utils/examples/pd_status_notification.c)

add_library(v4a_re SHARED ${CMAKE_CURRENT_BINARY_DIR}/v4a_stub.c src/ViPER4Android.cpp src/ViperStub.cpp ${util_srcs})
build_idl(src/include/v4a.idl v4a_re)

choose_dsprpc(${DSP_TYPE} dsprpc)
target_link_options(v4a_re PUBLIC -llog)
link_custom_library(v4a_re ${dsprpc})

copy_binaries(v4a_re)
else()
add_compile_options(-O3)
add_library(v4a_skel SHARED ${CMAKE_CURRENT_BINARY_DIR}/v4a_skel.c src/version.c src/ViperHexagon.cpp ${FILES})
build_idl(src/include/v4a.idl v4a_skel)

target_link_libraries(v4a_skel ${HEXAGON_LIB_DIR}/${HEXAGON_ARCH}/G0/pic/libc++abi.so.1)
target_link_libraries(v4a_skel ${HEXAGON_LIB_DIR}/${HEXAGON_ARCH}/G0/pic/libc++.so.1)

copy_binaries(v4a_skel)
endif()
else()
include_directories(src/include)
add_library(
# Sets the name of the library.
v4a_re

# Sets the library as a shared library.
SHARED
# Sets the library as a shared library.
SHARED

# Provides a relative path to your source file(s).
${FILES})
# Provides a relative path to your source file(s).
${FILES}
src/ViPER4Android.cpp)

target_link_libraries(v4a_re log) # kissfft)
target_compile_options(v4a_re PRIVATE -flto -O3 -DNDEBUG)
#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)
target_link_libraries(v4a_re log) # kissfft)
target_compile_options(v4a_re PRIVATE -flto -O3 -DNDEBUG)
#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)
endif()
4 changes: 4 additions & 0 deletions src/ViPER4Android.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ typedef enum {
PARAM_GET_DISABLE_REASON,
PARAM_GET_CONFIG,
PARAM_GET_ARCHITECTURE,

PARAM_GET_MAX,
} param_get_t;

typedef enum {
Expand Down Expand Up @@ -53,4 +55,6 @@ typedef enum {
PARAM_SET_DYNAMIC_SYSTEM_Y_COEFFICIENTS,
PARAM_SET_DYNAMIC_SYSTEM_SIDE_GAIN,
PARAM_SET_DYNAMIC_SYSTEM_STRENGTH,

PARAM_SET_MAX,
} param_set_t;
12 changes: 11 additions & 1 deletion src/ViperContext.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,15 @@
#include "log.h"
#include "viper/constants.h"

#ifdef __hexagon__
#define SET(type, ptr, value) \
do { \
type v = value; \
memcpy(ptr, &v, sizeof(type)); \
} while (false)
#else
#define SET(type, ptr, value) (*(type *) (ptr) = (value))
#endif

ViperContext::ViperContext() :
config({}),
Expand All @@ -17,6 +25,8 @@ ViperContext::ViperContext() :
VIPER_LOGI("ViperContext created");
}

ViperContext::~ViperContext() {}

void ViperContext::copyBufferConfig(buffer_config_t *dest, buffer_config_t *src) {
if (src->mask & EFFECT_CONFIG_BUFFER) {
dest->buffer = src->buffer;
Expand Down Expand Up @@ -809,7 +819,7 @@ int32_t ViperContext::process(audio_buffer_t *inBuffer, audio_buffer_t *outBuffe
if (!enabled) {
return -ENODATA;
}

inBuffer = getBuffer(&config.inputCfg, inBuffer);
outBuffer = getBuffer(&config.outputCfg, outBuffer);
if (inBuffer == nullptr || outBuffer == nullptr ||
Expand Down
12 changes: 12 additions & 0 deletions src/ViperContext.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,11 @@
#include <vector>
#include <cstddef>
#include "essential.h"
#ifndef HEXAGON_STUB
#include "viper/ViPER.h"
#else
#include <mutex>
#endif
#include <string>

class ViperContext {
Expand All @@ -18,11 +22,18 @@ class ViperContext {
};

ViperContext();
~ViperContext();

int32_t handleCommand(uint32_t cmdCode, uint32_t cmdSize, void *pCmdData, uint32_t *replySize, void *pReplyData);
int32_t process(audio_buffer_t *inBuffer, audio_buffer_t *outBuffer);

private:
#ifdef HEXAGON_STUB
std::mutex mHandleLock;
uint64_t handle = 0;
size_t in_size = 0;
size_t out_size = 0;
#else
effect_config_t config;
DisableReason disableReason;

Expand All @@ -40,4 +51,5 @@ class ViperContext {
int32_t handleGetParam(effect_param_t *pCmdParam, effect_param_t *pReplyParam, uint32_t *pReplySize);

void setDisableReason(DisableReason reason);
#endif
};
35 changes: 35 additions & 0 deletions src/ViperHexagon.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#include "v4a.h"
#include "log.h"
#include "ViperContext.h"

int v4a_open(const char *uri, remote_handle64 *handle) {
*handle = (remote_handle64) new ViperContext();
return 0;
}

int v4a_close(remote_handle64 handle) {
if (handle) {
delete reinterpret_cast<ViperContext *>(handle);
}
return 0;
}

int32_t v4a_command(remote_handle64 handle, uint32_t cmdCode, const uint8_t *pCmdData, int cmdSize, uint8_t *pReplyData, int replySize, uint32_t *pReplySize) {
return reinterpret_cast<ViperContext *>(handle)->handleCommand(cmdCode, cmdSize, (void *) pCmdData, pReplySize, (void *) pReplyData);
}

int32_t v4a_process(remote_handle64 handle, const uint8_t *inPcm, int inPcmLen, uint8_t *outPcm, int outPcmLen, uint32_t frameCount) {
audio_buffer_t in = {
.frameCount = frameCount,
.raw = (void *) inPcm,
};
audio_buffer_t out = {
.frameCount = frameCount,
.raw = (void *) outPcm,
};
return reinterpret_cast<ViperContext *>(handle)->process(&in, &out);
}
Loading
Loading