mirror of
https://github.com/obsproject/obs-studio.git
synced 2026-09-27 17:55:42 -04:00
nv-filters: Enable audio FX SDK 3.0.0 for ARM
SDK 3.0.0 brings compatibility with arm64. The DLL loading sequence has been adjusted since the FX are now loaded in their own child DLL. The DLL loader has been also cleaned up by removing unused symbols. This allowed us to dodge a few ABI breaks from NVIDIA... Signed-off-by: pkv <pkv@obsproject.com>
This commit is contained in:
@@ -5,7 +5,7 @@ Nvafx.Method="Method"
|
||||
Nvafx.Method.Denoiser="NVIDIA Noise Removal"
|
||||
Nvafx.Method.Dereverb="NVIDIA Room Echo Removal"
|
||||
Nvafx.Method.DenoiserPlusDereverb="NVIDIA Noise Removal + Room Echo Removal"
|
||||
Nvafx.OutdatedSDK="WARNING: Please upgrade both NVIDIA Video & Audio SDK. Your current version of Audio SDK is outdated."
|
||||
Nvafx.OutdatedSDK="WARNING: Please upgrade both NVIDIA Video & Audio SDK. Your current version of Audio SDK is outdated. This can break Audio FX, Video FX, or both."
|
||||
Nvafx.VAD="Voice Optimized"
|
||||
Nvvfx.Method.Greenscreen="NVIDIA Background Removal"
|
||||
Nvvfx.Method.Greenscreen.Mode="Mode"
|
||||
|
||||
@@ -23,7 +23,6 @@ extern void unload_nvidia_vfx(void);
|
||||
bool obs_module_load(void)
|
||||
{
|
||||
#ifdef LIBNVAFX_ENABLED
|
||||
/* load nvidia audio fx dll */
|
||||
if (load_nvidia_afx())
|
||||
obs_register_source(&nvidia_audiofx_filter);
|
||||
#endif
|
||||
|
||||
@@ -1,2 +1,5 @@
|
||||
#define MIN_VFX_SDK_VERSION (0 << 24 | 7 << 16 | 6 << 8 | 0 << 0)
|
||||
|
||||
#define MIN_AFX_SDK_VERSION (1 << 24 | 6 << 16 | 1 << 8 | 2 << 0)
|
||||
#define MIN_AFX_LOGGER_VERSION (1 << 24 | 6 << 16 | 1 << 8 | 2 << 0) // also gates VAD feature
|
||||
#define MIN_ARM_AFX_SDK_VERSION (3 << 24 | 0 << 16 | 0 << 8 | 49 << 0)
|
||||
|
||||
@@ -12,43 +12,43 @@
|
||||
|
||||
#ifdef LIBNVAFX_ENABLED
|
||||
static HMODULE nv_audiofx = NULL;
|
||||
static HMODULE nv_denoiserfx = NULL;
|
||||
static HMODULE nv_dereverbfx = NULL;
|
||||
static HMODULE nv_dereverbdenoiserfx = NULL;
|
||||
|
||||
/** Effects @ref NvAFX_EffectSelector */
|
||||
#define NVAFX_EFFECT_DENOISER "denoiser"
|
||||
#define NVAFX_EFFECT_DEREVERB "dereverb"
|
||||
#define NVAFX_EFFECT_DEREVERB_DENOISER "dereverb_denoiser"
|
||||
#define NVAFX_EFFECT_AEC "aec"
|
||||
#define NVAFX_EFFECT_SUPERRES "superres"
|
||||
|
||||
/** Model paths */
|
||||
#define NVAFX_EFFECT_DENOISER_MODEL "\\models\\denoiser_48k.trtpkg"
|
||||
#define NVAFX_EFFECT_DEREVERB_MODEL "\\models\\dereverb_48k.trtpkg"
|
||||
#define NVAFX_EFFECT_DEREVERB_DENOISER_MODEL "\\models\\dereverb_denoiser_48k.trtpkg"
|
||||
|
||||
#define NVAFX_CHAINED_EFFECT_DENOISER_16k_SUPERRES_16k_TO_48k "denoiser16k_superres16kto48k"
|
||||
#define NVAFX_CHAINED_EFFECT_DEREVERB_16k_SUPERRES_16k_TO_48k "dereverb16k_superres16kto48k"
|
||||
#define NVAFX_CHAINED_EFFECT_DEREVERB_DENOISER_16k_SUPERRES_16k_TO_48k "dereverb_denoiser16k_superres16kto48k"
|
||||
#define NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DENOISER_16k "superres8kto16k_denoiser16k"
|
||||
#define NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DEREVERB_16k "superres8kto16k_dereverb16k"
|
||||
#define NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DEREVERB_DENOISER_16k "superres8kto16k_dereverb_denoiser16k"
|
||||
|
||||
/** Parameter selectors */
|
||||
|
||||
#define NVAFX_PARAM_NUM_STREAMS "num_streams"
|
||||
#define NVAFX_PARAM_USE_DEFAULT_GPU "use_default_gpu"
|
||||
#define NVAFX_PARAM_USER_CUDA_CONTEXT "user_cuda_context"
|
||||
#define NVAFX_PARAM_DISABLE_CUDA_GRAPH "disable_cuda_graph"
|
||||
#define NVAFX_PARAM_ENABLE_VAD "enable_vad"
|
||||
|
||||
/** Effect parameters. @ref NvAFX_ParameterSelector */
|
||||
#define NVAFX_PARAM_MODEL_PATH "model_path"
|
||||
#define NVAFX_PARAM_INPUT_SAMPLE_RATE "input_sample_rate"
|
||||
#define NVAFX_PARAM_OUTPUT_SAMPLE_RATE "output_sample_rate"
|
||||
|
||||
#define NVAFX_PARAM_NUM_INPUT_SAMPLES_PER_FRAME "num_input_samples_per_frame"
|
||||
#define NVAFX_PARAM_NUM_OUTPUT_SAMPLES_PER_FRAME "num_output_samples_per_frame"
|
||||
/* SDK >= 3.0.0.49: replaces the 2 previous define... */
|
||||
#define NVAFX_PARAM_NUM_SAMPLES_PER_INPUT_FRAME "num_samples_per_input_frame"
|
||||
#define NVAFX_PARAM_NUM_SAMPLES_PER_OUTPUT_FRAME "num_samples_per_output_frame"
|
||||
|
||||
#define NVAFX_PARAM_NUM_INPUT_CHANNELS "num_input_channels"
|
||||
#define NVAFX_PARAM_NUM_OUTPUT_CHANNELS "num_output_channels"
|
||||
#define NVAFX_PARAM_INTENSITY_RATIO "intensity_ratio"
|
||||
#define NVAFX_PARAM_ENABLE_VAD "enable_vad"
|
||||
/** SDK >= 3.0.0.49: Voice activity status (boolean) is an immutable parameter. */
|
||||
#define NVAFX_PARAM_VAD_RESULT "vad_result"
|
||||
|
||||
#pragma deprecated(NVAFX_PARAM_DENOISER_MODEL_PATH)
|
||||
#define NVAFX_PARAM_DENOISER_MODEL_PATH NVAFX_PARAM_MODEL_PATH
|
||||
@@ -90,12 +90,32 @@ typedef enum {
|
||||
/** Model file could not be loaded */
|
||||
NVAFX_STATUS_MODEL_LOAD_FAILED = 8,
|
||||
|
||||
/** (32 bit SDK only) COM server was not registered, please see user manual for details */
|
||||
NVAFX_STATUS_32_SERVER_NOT_REGISTERED = 9,
|
||||
/** (32 bit SDK only) COM operation failed */
|
||||
NVAFX_STATUS_32_COM_ERROR = 10,
|
||||
/** Model is not loaded, it needs to be loaded for this operation */
|
||||
NVAFX_STATUS_MODEL_NOT_LOADED = 9,
|
||||
/** Selected model is incompatible */
|
||||
NVAFX_STATUS_INCOMPATIBLE_MODEL = 10,
|
||||
/** GPU supported. The SDK requires Turing and above GPU with Tensor cores */
|
||||
NVAFX_STATUS_GPU_UNSUPPORTED = 11,
|
||||
/** No supported GPU found on the system */
|
||||
NVAFX_STATUS_NO_SUPPORTED_GPU_FOUND = 12,
|
||||
/** Current GPU is not the one selected */
|
||||
NVAFX_STATUS_WRONG_GPU = 13,
|
||||
/** Cuda operation failure */
|
||||
NVAFX_STATUS_CUDA_ERROR = 14,
|
||||
/** Invalid operation performed **/
|
||||
NVAFX_STATUS_INVALID_OPERATION = 15,
|
||||
/** CUDA runtime is less than supported version*/
|
||||
NVAFX_UNSUPPORTED_RUNTIME = 16,
|
||||
/** (32 bit SDK only) COM server was not registered, please see user manual for details */
|
||||
NVAFX_STATUS_32_SERVER_NOT_REGISTERED = 17,
|
||||
/** (32 bit SDK only) COM operation failed */
|
||||
NVAFX_STATUS_32_COM_ERROR = 18,
|
||||
/** Cuda Context Failure Error */
|
||||
NVAFX_STATUS_CUDA_CONTEXT_CREATION_FAILED = 19,
|
||||
/** Dynamic Load Library Error */
|
||||
NVAFX_STATUS_LIBRARY_ERROR = 20,
|
||||
/** Dynamic Load Library out of memory error */
|
||||
NVAFX_STATUS_OUT_OF_MEMORY = 21,
|
||||
} NvAFX_Status;
|
||||
|
||||
#define NVAFX_TRUE 1
|
||||
@@ -131,30 +151,18 @@ typedef const char *NvAFX_EffectSelector;
|
||||
typedef const char *NvAFX_ParameterSelector;
|
||||
typedef void *NvAFX_Handle;
|
||||
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_GetEffectList_t)(int *num_effects, NvAFX_EffectSelector *effects[]);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_CreateEffect_t)(NvAFX_EffectSelector code, NvAFX_Handle *effect);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_CreateChainedEffect_t)(NvAFX_EffectSelector code, NvAFX_Handle *effect);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_DestroyEffect_t)(NvAFX_Handle effect);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_SetU32_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
|
||||
unsigned int val);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_SetU32List_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
|
||||
unsigned int *val, unsigned int size);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_SetString_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
|
||||
const char *val);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_SetStringList_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
|
||||
const char **val, unsigned int size);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_SetFloat_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, float val);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_SetFloatList_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
|
||||
float *val, unsigned int size);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_GetU32_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
|
||||
unsigned int *val);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_GetString_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, char *val,
|
||||
int max_length);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_GetStringList_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
|
||||
char **val, int *max_length, unsigned int size);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_GetFloat_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, float *val);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_GetFloatList_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
|
||||
float *val, unsigned int size);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_Load_t)(NvAFX_Handle effect);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_GetSupportedDevices_t)(NvAFX_Handle effect, int *num, int *devices);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_Run_t)(NvAFX_Handle effect, const float **input, float **output,
|
||||
@@ -166,21 +174,14 @@ typedef NvAFX_Status NVAFX_API (*NvAFX_InitializeLogger_t)(LoggingSeverity level
|
||||
const char *filename, logging_cb_t cb, void *userdata);
|
||||
typedef NvAFX_Status NVAFX_API (*NvAFX_UninitializeLogger_t)();
|
||||
|
||||
static NvAFX_GetEffectList_t NvAFX_GetEffectList = NULL;
|
||||
static NvAFX_CreateEffect_t NvAFX_CreateEffect = NULL;
|
||||
static NvAFX_CreateChainedEffect_t NvAFX_CreateChainedEffect = NULL;
|
||||
static NvAFX_DestroyEffect_t NvAFX_DestroyEffect = NULL;
|
||||
static NvAFX_SetU32_t NvAFX_SetU32 = NULL;
|
||||
static NvAFX_SetU32List_t NvAFX_SetU32List = NULL;
|
||||
static NvAFX_SetString_t NvAFX_SetString = NULL;
|
||||
static NvAFX_SetStringList_t NvAFX_SetStringList = NULL;
|
||||
static NvAFX_SetFloat_t NvAFX_SetFloat = NULL;
|
||||
static NvAFX_SetFloatList_t NvAFX_SetFloatList = NULL;
|
||||
static NvAFX_GetU32_t NvAFX_GetU32 = NULL;
|
||||
static NvAFX_GetString_t NvAFX_GetString = NULL;
|
||||
static NvAFX_GetStringList_t NvAFX_GetStringList = NULL;
|
||||
static NvAFX_GetFloat_t NvAFX_GetFloat = NULL;
|
||||
static NvAFX_GetFloatList_t NvAFX_GetFloatList = NULL;
|
||||
static NvAFX_Load_t NvAFX_Load = NULL;
|
||||
static NvAFX_GetSupportedDevices_t NvAFX_GetSupportedDevices = NULL;
|
||||
static NvAFX_Run_t NvAFX_Run = NULL;
|
||||
@@ -189,23 +190,16 @@ static NvAFX_Reset_t NvAFX_Reset = NULL;
|
||||
static NvAFX_InitializeLogger_t NvAFX_InitializeLogger = NULL;
|
||||
static NvAFX_UninitializeLogger_t NvAFX_UninitializeLogger = NULL;
|
||||
|
||||
void release_lib(void)
|
||||
static inline void release_afx_lib(void)
|
||||
{
|
||||
NvAFX_GetEffectList = NULL;
|
||||
NvAFX_CreateEffect = NULL;
|
||||
NvAFX_CreateChainedEffect = NULL;
|
||||
NvAFX_DestroyEffect = NULL;
|
||||
NvAFX_SetU32 = NULL;
|
||||
NvAFX_SetU32List = NULL;
|
||||
NvAFX_SetString = NULL;
|
||||
NvAFX_SetStringList = NULL;
|
||||
NvAFX_SetFloat = NULL;
|
||||
NvAFX_SetFloatList = NULL;
|
||||
NvAFX_GetU32 = NULL;
|
||||
NvAFX_GetString = NULL;
|
||||
NvAFX_GetStringList = NULL;
|
||||
NvAFX_GetFloat = NULL;
|
||||
NvAFX_GetFloatList = NULL;
|
||||
NvAFX_Load = NULL;
|
||||
NvAFX_GetSupportedDevices = NULL;
|
||||
NvAFX_Run = NULL;
|
||||
@@ -213,16 +207,32 @@ void release_lib(void)
|
||||
/* SDK >= 1.6.0 */
|
||||
NvAFX_InitializeLogger = NULL;
|
||||
NvAFX_UninitializeLogger = NULL;
|
||||
|
||||
if (nv_audiofx) {
|
||||
FreeLibrary(nv_audiofx);
|
||||
nv_audiofx = NULL;
|
||||
}
|
||||
if (nv_denoiserfx) {
|
||||
FreeLibrary(nv_denoiserfx);
|
||||
nv_denoiserfx = NULL;
|
||||
}
|
||||
if (nv_dereverbfx) {
|
||||
FreeLibrary(nv_dereverbfx);
|
||||
nv_dereverbfx = NULL;
|
||||
}
|
||||
if (nv_dereverbdenoiserfx) {
|
||||
FreeLibrary(nv_dereverbdenoiserfx);
|
||||
nv_dereverbdenoiserfx = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static inline bool nvafx_get_sdk_path(char *buffer, const size_t len)
|
||||
{
|
||||
DWORD ret = GetEnvironmentVariableA("NVAFX_SDK_DIR", buffer, (DWORD)len);
|
||||
|
||||
if (!ret || ret >= len - 1) {
|
||||
ret = GetEnvironmentVariableA("AFX_SDK_DIR", buffer, (DWORD)len);
|
||||
}
|
||||
if (!ret || ret >= len - 1) {
|
||||
char path[MAX_PATH];
|
||||
if (!GetEnvironmentVariableA("ProgramFiles", path, MAX_PATH)) {
|
||||
@@ -240,25 +250,6 @@ static inline bool nvafx_get_sdk_path(char *buffer, const size_t len)
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool load_lib()
|
||||
{
|
||||
char sdkPath[MAX_PATH];
|
||||
char effectsPath[MAX_PATH];
|
||||
|
||||
if (!nvafx_get_sdk_path(sdkPath, MAX_PATH)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (_snprintf_s(effectsPath, _countof(effectsPath), _TRUNCATE, "%s\\NVAudioEffects.dll", sdkPath) == -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
nv_audiofx =
|
||||
LoadLibraryExA(effectsPath, NULL, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
|
||||
|
||||
return !!nv_audiofx;
|
||||
}
|
||||
|
||||
static unsigned int get_lib_version(void)
|
||||
{
|
||||
static unsigned int version = 0;
|
||||
@@ -287,4 +278,42 @@ static unsigned int get_lib_version(void)
|
||||
return version;
|
||||
}
|
||||
|
||||
static inline bool load_afx_module(HMODULE *module, const char *sdk_path, const char *filename)
|
||||
{
|
||||
char path[MAX_PATH];
|
||||
|
||||
if (*module) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (_snprintf_s(path, _countof(path), _TRUNCATE, "%s\\%s", sdk_path, filename) < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
*module = LoadLibraryExA(path, NULL, LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR | LOAD_LIBRARY_SEARCH_DEFAULT_DIRS);
|
||||
return *module != NULL;
|
||||
}
|
||||
|
||||
static inline bool load_lib(unsigned int version)
|
||||
{
|
||||
char sdk_path[MAX_PATH];
|
||||
|
||||
if (!nvafx_get_sdk_path(sdk_path, _countof(sdk_path)))
|
||||
return false;
|
||||
|
||||
if (!load_afx_module(&nv_audiofx, sdk_path, "NVAudioEffects.dll"))
|
||||
return false;
|
||||
|
||||
if (version < MIN_ARM_AFX_SDK_VERSION)
|
||||
return true;
|
||||
|
||||
if (!load_afx_module(&nv_denoiserfx, sdk_path, "nvafxdenoiser.dll") ||
|
||||
!load_afx_module(&nv_dereverbfx, sdk_path, "nvafxdereverb.dll") ||
|
||||
!load_afx_module(&nv_dereverbdenoiserfx, sdk_path, "nvafxdereverbdenoiser.dll")) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
@@ -49,8 +49,6 @@
|
||||
#define ssize_t intptr_t
|
||||
#endif
|
||||
|
||||
bool nvafx_new_sdk = false;
|
||||
|
||||
struct nvidia_audio_data {
|
||||
obs_source_t *context;
|
||||
|
||||
@@ -116,8 +114,9 @@ struct nvidia_audio_data {
|
||||
struct obs_audio_data output_audio;
|
||||
DARRAY(float) output_data;
|
||||
|
||||
/* Optimization for Voice Audio Data (VAD) ; requires SDK >= 0.7.6 */
|
||||
/* Optimization for Voice Audio Data (VAD) ; requires SDK >= 1.6.2 */
|
||||
bool vad;
|
||||
unsigned int sdk_version;
|
||||
};
|
||||
|
||||
static const char *nvidia_audio_name(void *unused)
|
||||
@@ -136,7 +135,7 @@ static void nvidia_audio_destroy(void *data)
|
||||
if (ng->nvidia_sdk_dir_found)
|
||||
pthread_mutex_lock(&ng->nvafx_mutex);
|
||||
|
||||
if (nvafx_new_sdk)
|
||||
if (ng->sdk_version >= MIN_AFX_LOGGER_VERSION)
|
||||
NvAFX_UninitializeLogger();
|
||||
|
||||
for (size_t i = 0; i < ng->channels; i++) {
|
||||
@@ -180,32 +179,6 @@ bool nvidia_afx_loaded = false;
|
||||
#pragma warning(push)
|
||||
#pragma warning(disable : 4706)
|
||||
#endif
|
||||
void release_afxlib(void)
|
||||
{
|
||||
NvAFX_GetEffectList = NULL;
|
||||
NvAFX_CreateEffect = NULL;
|
||||
NvAFX_CreateChainedEffect = NULL;
|
||||
NvAFX_DestroyEffect = NULL;
|
||||
NvAFX_SetU32 = NULL;
|
||||
NvAFX_SetU32List = NULL;
|
||||
NvAFX_SetString = NULL;
|
||||
NvAFX_SetStringList = NULL;
|
||||
NvAFX_SetFloat = NULL;
|
||||
NvAFX_SetFloatList = NULL;
|
||||
NvAFX_GetU32 = NULL;
|
||||
NvAFX_GetString = NULL;
|
||||
NvAFX_GetStringList = NULL;
|
||||
NvAFX_GetFloat = NULL;
|
||||
NvAFX_GetFloatList = NULL;
|
||||
NvAFX_Load = NULL;
|
||||
NvAFX_GetSupportedDevices = NULL;
|
||||
NvAFX_Run = NULL;
|
||||
NvAFX_Reset = NULL;
|
||||
if (nv_audiofx) {
|
||||
FreeLibrary(nv_audiofx);
|
||||
nv_audiofx = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
bool load_nvidia_afx(void)
|
||||
{
|
||||
@@ -224,9 +197,10 @@ bool load_nvidia_afx(void)
|
||||
(MIN_VFX_SDK_VERSION >> 16) & 0x00ff, (MIN_VFX_SDK_VERSION >> 8) & 0x0000ff);
|
||||
}
|
||||
}
|
||||
if (!load_lib()) {
|
||||
if (!load_lib(version)) {
|
||||
blog(LOG_INFO,
|
||||
"[NVIDIA Audio Effects:] NVIDIA denoiser disabled, redistributable not found or could not be loaded.");
|
||||
release_afx_lib();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -239,47 +213,24 @@ bool load_nvidia_afx(void)
|
||||
goto unload_everything; \
|
||||
}
|
||||
|
||||
#define LOAD_SYM_FROM_LIB2(sym, lib, dll) \
|
||||
if (!(sym = (sym##_t)GetProcAddress(lib, #sym))) { \
|
||||
DWORD err = GetLastError(); \
|
||||
printf("[NVIDIA Audio Effects:]: Couldn't load " #sym " from " dll ": %lu (0x%lx)", err, err); \
|
||||
nvafx_new_sdk = false; \
|
||||
} else { \
|
||||
nvafx_new_sdk = true; \
|
||||
}
|
||||
|
||||
#define LOAD_SYM(sym) LOAD_SYM_FROM_LIB(sym, nv_audiofx, "NVAudioEffects.dll")
|
||||
LOAD_SYM(NvAFX_GetEffectList);
|
||||
LOAD_SYM(NvAFX_CreateEffect);
|
||||
LOAD_SYM(NvAFX_CreateChainedEffect);
|
||||
LOAD_SYM(NvAFX_DestroyEffect);
|
||||
LOAD_SYM(NvAFX_SetU32);
|
||||
LOAD_SYM(NvAFX_SetU32List);
|
||||
LOAD_SYM(NvAFX_SetString);
|
||||
LOAD_SYM(NvAFX_SetStringList);
|
||||
LOAD_SYM(NvAFX_SetFloat);
|
||||
LOAD_SYM(NvAFX_SetFloatList);
|
||||
LOAD_SYM(NvAFX_GetU32);
|
||||
LOAD_SYM(NvAFX_GetString);
|
||||
LOAD_SYM(NvAFX_GetStringList);
|
||||
LOAD_SYM(NvAFX_GetFloat);
|
||||
LOAD_SYM(NvAFX_GetFloatList);
|
||||
LOAD_SYM(NvAFX_Load);
|
||||
LOAD_SYM(NvAFX_GetSupportedDevices);
|
||||
LOAD_SYM(NvAFX_Run);
|
||||
LOAD_SYM(NvAFX_Reset);
|
||||
#undef LOAD_SYM
|
||||
#define LOAD_SYM(sym) LOAD_SYM_FROM_LIB2(sym, nv_audiofx, "NVAudioEffects.dll")
|
||||
LOAD_SYM(NvAFX_InitializeLogger);
|
||||
bool new_sdk = nvafx_new_sdk;
|
||||
LOAD_SYM(NvAFX_UninitializeLogger);
|
||||
if (!nvafx_new_sdk || !new_sdk) {
|
||||
blog(LOG_INFO, "[NVIDIA AUDIO FX]: SDK loaded but old redistributable detected. Please upgrade.");
|
||||
nvafx_new_sdk = false;
|
||||
}
|
||||
#undef LOAD_SYM
|
||||
NvAFX_Status err;
|
||||
|
||||
NvAFX_Status err;
|
||||
NvAFX_Handle h = NULL;
|
||||
|
||||
err = NvAFX_CreateEffect(NVAFX_EFFECT_DENOISER, &h);
|
||||
@@ -303,7 +254,7 @@ bool load_nvidia_afx(void)
|
||||
return true;
|
||||
|
||||
unload_everything:
|
||||
release_afxlib();
|
||||
release_afx_lib();
|
||||
|
||||
return false;
|
||||
}
|
||||
@@ -313,7 +264,7 @@ unload_everything:
|
||||
|
||||
void unload_nvidia_afx(void)
|
||||
{
|
||||
release_afxlib();
|
||||
release_afx_lib();
|
||||
|
||||
if (nvidia_afx_initializer_mutex_initialized) {
|
||||
pthread_mutex_destroy(&nvidia_afx_initializer_mutex);
|
||||
@@ -352,8 +303,9 @@ static bool nvidia_audio_initialize_internal(void *data)
|
||||
}
|
||||
|
||||
// Set VAD (Voice Audio Data)
|
||||
if (nvafx_new_sdk) {
|
||||
if (get_lib_version() >= MIN_AFX_LOGGER_VERSION && strcmp(ng->fx, NVAFX_EFFECT_DEREVERB) != 0) {
|
||||
err = NvAFX_SetU32(ng->handle[i], NVAFX_PARAM_ENABLE_VAD, ng->vad);
|
||||
|
||||
if (err != NVAFX_STATUS_SUCCESS) {
|
||||
do_log(LOG_ERROR, "NvAFX_SetU32(VAD: %i) failed, error %i", ng->vad, err);
|
||||
goto failure;
|
||||
@@ -415,7 +367,10 @@ static void *nvidia_audio_initialize(void *data)
|
||||
do_log(LOG_ERROR, "The number of channels is not 1 in the sdk any more ==> update code");
|
||||
goto failure;
|
||||
}
|
||||
NvAFX_Status err = NvAFX_GetU32(ng->handle[0], NVAFX_PARAM_NUM_INPUT_SAMPLES_PER_FRAME,
|
||||
bool updated_string = ng->sdk_version >= MIN_ARM_AFX_SDK_VERSION;
|
||||
NvAFX_Status err = NvAFX_GetU32(ng->handle[0],
|
||||
updated_string ? NVAFX_PARAM_NUM_SAMPLES_PER_INPUT_FRAME
|
||||
: NVAFX_PARAM_NUM_INPUT_SAMPLES_PER_FRAME,
|
||||
&ng->num_samples_per_frame);
|
||||
if (err != NVAFX_STATUS_SUCCESS) {
|
||||
do_log(LOG_ERROR, "NvAFX_GetU32() failed to get the number of samples per frame, error %i",
|
||||
@@ -529,7 +484,7 @@ static void nvidia_audio_update(void *data, obs_data_t *s)
|
||||
pthread_mutex_unlock(&ng->nvafx_mutex);
|
||||
}
|
||||
/* updating for VAD toggled on or off */
|
||||
if (nvafx_new_sdk) {
|
||||
if (ng->sdk_version >= MIN_AFX_LOGGER_VERSION && strcmp(ng->fx, NVAFX_EFFECT_DEREVERB) != 0) {
|
||||
if (vad != ng->vad && (strcmp(ng->fx, method) == 0)) {
|
||||
NvAFX_Status err;
|
||||
ng->vad = vad;
|
||||
@@ -599,7 +554,7 @@ static void *nvidia_audio_create(obs_data_t *settings, obs_source_t *filter)
|
||||
ng->nvafx_initialized = false;
|
||||
ng->nvafx_loading = false;
|
||||
ng->fx = NULL;
|
||||
|
||||
ng->sdk_version = get_lib_version();
|
||||
pthread_mutex_init(&ng->nvafx_mutex, NULL);
|
||||
|
||||
info("NVAFX SDK redist path was found here %s", sdk_path);
|
||||
@@ -656,7 +611,7 @@ static void *nvidia_audio_create(obs_data_t *settings, obs_source_t *filter)
|
||||
nvidia_audio_update(ng, settings);
|
||||
|
||||
/* Setup NVIDIA logger */
|
||||
if (nvafx_new_sdk) {
|
||||
if (ng->sdk_version >= MIN_AFX_LOGGER_VERSION) {
|
||||
NvAFX_Status err = NvAFX_InitializeLogger(NVAFX_LOG_LEVEL_ERROR, LOG_TARGET_CALLBACK, NULL,
|
||||
&nvafx_logger_callback, ng);
|
||||
if (err != NVAFX_STATUS_SUCCESS) {
|
||||
@@ -853,10 +808,11 @@ static void nvidia_audio_defaults(obs_data_t *s)
|
||||
{
|
||||
obs_data_set_default_double(s, S_NVAFX_INTENSITY, 1.0);
|
||||
obs_data_set_default_string(s, S_METHOD, S_METHOD_NVAFX_DENOISER);
|
||||
if (nvafx_new_sdk)
|
||||
if (get_lib_version() >= MIN_AFX_LOGGER_VERSION)
|
||||
obs_data_set_default_bool(s, S_NVAFX_VAD, 1);
|
||||
}
|
||||
|
||||
|
||||
static obs_properties_t *nvidia_audio_properties(void *data)
|
||||
{
|
||||
obs_properties_t *ppts = obs_properties_create();
|
||||
@@ -871,7 +827,7 @@ static obs_properties_t *nvidia_audio_properties(void *data)
|
||||
obs_property_t *slider = obs_properties_add_float_slider(ppts, S_NVAFX_INTENSITY, TEXT_NVAFX_INTENSITY,
|
||||
0.0f, 1.0f, 0.01f);
|
||||
obs_property_t *vad = obs_properties_add_bool(ppts, S_NVAFX_VAD, TEXT_NVAFX_VAD);
|
||||
if (!nvafx_new_sdk)
|
||||
if (get_lib_version() >= MIN_AFX_LOGGER_VERSION)
|
||||
obs_property_set_visible(vad, 0);
|
||||
|
||||
unsigned int version = get_lib_version();
|
||||
|
||||
Reference in New Issue
Block a user