From cc2030ef060e677a2138861c67bbba13b4fd9f7e Mon Sep 17 00:00:00 2001 From: pkv Date: Thu, 21 Apr 2022 19:06:42 +0200 Subject: [PATCH] obs-filter: Update NVIDIA Audio SDK This updates the support of NVIDIA Audio Effects SDK to 1.1.0.5 Additionally, we add support for some CUDA functions required for fixing a bug. Signed-off-by: pkv --- plugins/obs-filters/noise-suppress-filter.c | 22 ++- plugins/obs-filters/nvafx-load.h | 182 ++++++++++++++++++-- 2 files changed, 185 insertions(+), 19 deletions(-) diff --git a/plugins/obs-filters/noise-suppress-filter.c b/plugins/obs-filters/noise-suppress-filter.c index 29bd4eb0a..db0d2c1f9 100644 --- a/plugins/obs-filters/noise-suppress-filter.c +++ b/plugins/obs-filters/noise-suppress-filter.c @@ -536,28 +536,40 @@ bool load_nvafx(void) #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 - - int err; +#define LOAD_SYM(sym) LOAD_SYM_FROM_LIB(sym, nv_cuda, "nvcuda.dll") + LOAD_SYM(cuCtxGetCurrent); + LOAD_SYM(cuCtxPopCurrent); + LOAD_SYM(cuInit); +#undef LOAD_SYM + NvAFX_Status err; NvAFX_Handle h = NULL; err = NvAFX_CreateEffect(NVAFX_EFFECT_DENOISER, &h); if (err != NVAFX_STATUS_SUCCESS) { if (err == NVAFX_STATUS_GPU_UNSUPPORTED) { blog(LOG_INFO, - "[noise suppress]: NVIDIA RTX denoiser disabled: unsupported GPU"); + "[noise suppress]: NVIDIA RTX AUDIO FX disabled: unsupported GPU"); } else { blog(LOG_ERROR, - "[noise suppress]: NVIDIA RTX denoiser disabled: error %i", + "[noise suppress]: NVIDIA RTX AUDIO FX disabled: error %i", err); } goto unload_everything; @@ -570,7 +582,7 @@ bool load_nvafx(void) } nvafx_loaded = true; - blog(LOG_INFO, "[noise suppress]: NVIDIA RTX denoiser enabled"); + blog(LOG_INFO, "[noise suppress]: NVIDIA RTX AUDIO FX enabled"); return true; unload_everything: diff --git a/plugins/obs-filters/nvafx-load.h b/plugins/obs-filters/nvafx-load.h index 323ea885e..9725d814c 100644 --- a/plugins/obs-filters/nvafx-load.h +++ b/plugins/obs-filters/nvafx-load.h @@ -9,23 +9,65 @@ #ifdef LIBNVAFX_ENABLED static HMODULE nv_audiofx = NULL; +static HMODULE nv_cuda = NULL; -/** Denoiser Effect */ +/** 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" + +#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 */ -/** Denoiser parameters. @ref NvAFX_ParameterSelector */ -/** Denoiser filter model path (char*) */ -#define NVAFX_PARAM_DENOISER_MODEL_PATH "denoiser_model_path" -/** Denoiser sample rate (unsigned int). Currently supported sample rate(s): 48000 */ -#define NVAFX_PARAM_DENOISER_SAMPLE_RATE "sample_rate" -/** Denoiser number of samples per frame (unsigned int). This is immutable parameter */ -#define NVAFX_PARAM_DENOISER_NUM_SAMPLES_PER_FRAME "num_samples_per_frame" -/** Denoiser number of channels in I/O (unsigned int). This is immutable parameter */ -#define NVAFX_PARAM_DENOISER_NUM_CHANNELS "num_channels" -/** Denoiser noise suppression factor (float) */ -#define NVAFX_PARAM_DENOISER_INTENSITY_RATIO "intensity_ratio" +#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" +#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" + +#pragma deprecated(NVAFX_PARAM_DENOISER_MODEL_PATH) +#define NVAFX_PARAM_DENOISER_MODEL_PATH NVAFX_PARAM_MODEL_PATH +#pragma deprecated(NVAFX_PARAM_DENOISER_SAMPLE_RATE) +#define NVAFX_PARAM_DENOISER_SAMPLE_RATE NVAFX_PARAM_SAMPLE_RATE +#pragma deprecated(NVAFX_PARAM_DENOISER_NUM_SAMPLES_PER_FRAME) +#define NVAFX_PARAM_DENOISER_NUM_SAMPLES_PER_FRAME \ + NVAFX_PARAM_NUM_SAMPLES_PER_FRAME +#pragma deprecated(NVAFX_PARAM_DENOISER_NUM_CHANNELS) +#define NVAFX_PARAM_DENOISER_NUM_CHANNELS NVAFX_PARAM_NUM_CHANNELS +#pragma deprecated(NVAFX_PARAM_DENOISER_INTENSITY_RATIO) +#define NVAFX_PARAM_DENOISER_INTENSITY_RATIO NVAFX_PARAM_INTENSITY_RATIO +/** Number of audio channels **/ +#pragma deprecated(NVAFX_PARAM_NUM_CHANNELS) +#define NVAFX_PARAM_NUM_CHANNELS "num_channels" +/** Sample rate (unsigned int). Currently supported sample rate(s): 48000, 16000 */ +#pragma deprecated(NVAFX_PARAM_SAMPLE_RATE) +#define NVAFX_PARAM_SAMPLE_RATE "sample_rate" +/** Number of samples per frame (unsigned int). This is immutable parameter */ +#pragma deprecated(NVAFX_PARAM_NUM_SAMPLES_PER_FRAME) +#define NVAFX_PARAM_NUM_SAMPLES_PER_FRAME "num_samples_per_frame" typedef enum { /** Success */ @@ -55,6 +97,10 @@ typedef enum { NVAFX_STATUS_GPU_UNSUPPORTED = 11, } NvAFX_Status; +#define NVAFX_TRUE 1 +#define NVAFX_FALSE 0 +typedef char NvAFX_Bool; + typedef const char *NvAFX_EffectSelector; typedef const char *NvAFX_ParameterSelector; typedef void *NvAFX_Handle; @@ -65,17 +111,32 @@ typedef NvAFX_Status 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, @@ -84,44 +145,137 @@ 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, unsigned num_samples, unsigned num_channels); +typedef NvAFX_Status NVAFX_API (*NvAFX_Reset_t)(NvAFX_Handle effect); + +/* cuda */ +typedef enum cudaError_enum { + CUDA_SUCCESS = 0, + CUDA_ERROR_INVALID_VALUE = 1, + CUDA_ERROR_OUT_OF_MEMORY = 2, + CUDA_ERROR_NOT_INITIALIZED = 3, + CUDA_ERROR_DEINITIALIZED = 4, + CUDA_ERROR_PROFILER_DISABLED = 5, + CUDA_ERROR_PROFILER_NOT_INITIALIZED = 6, + CUDA_ERROR_PROFILER_ALREADY_STARTED = 7, + CUDA_ERROR_PROFILER_ALREADY_STOPPED = 8, + CUDA_ERROR_NO_DEVICE = 100, + CUDA_ERROR_INVALID_DEVICE = 101, + CUDA_ERROR_INVALID_IMAGE = 200, + CUDA_ERROR_INVALID_CONTEXT = 201, + CUDA_ERROR_CONTEXT_ALREADY_CURRENT = 202, + CUDA_ERROR_MAP_FAILED = 205, + CUDA_ERROR_UNMAP_FAILED = 206, + CUDA_ERROR_ARRAY_IS_MAPPED = 207, + CUDA_ERROR_ALREADY_MAPPED = 208, + CUDA_ERROR_NO_BINARY_FOR_GPU = 209, + CUDA_ERROR_ALREADY_ACQUIRED = 210, + CUDA_ERROR_NOT_MAPPED = 211, + CUDA_ERROR_NOT_MAPPED_AS_ARRAY = 212, + CUDA_ERROR_NOT_MAPPED_AS_POINTER = 213, + CUDA_ERROR_ECC_UNCORRECTABLE = 214, + CUDA_ERROR_UNSUPPORTED_LIMIT = 215, + CUDA_ERROR_CONTEXT_ALREADY_IN_USE = 216, + CUDA_ERROR_INVALID_SOURCE = 300, + CUDA_ERROR_FILE_NOT_FOUND = 301, + CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND = 302, + CUDA_ERROR_SHARED_OBJECT_INIT_FAILED = 303, + CUDA_ERROR_OPERATING_SYSTEM = 304, + CUDA_ERROR_INVALID_HANDLE = 400, + CUDA_ERROR_NOT_FOUND = 500, + CUDA_ERROR_NOT_READY = 600, + CUDA_ERROR_LAUNCH_FAILED = 700, + CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES = 701, + CUDA_ERROR_LAUNCH_TIMEOUT = 702, + CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING = 703, + CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED = 704, + CUDA_ERROR_PEER_ACCESS_NOT_ENABLED = 705, + CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE = 708, + CUDA_ERROR_CONTEXT_IS_DESTROYED = 709, + CUDA_ERROR_ASSERT = 710, + CUDA_ERROR_TOO_MANY_PEERS = 711, + CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED = 712, + CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED = 713, + CUDA_ERROR_UNKNOWN = 999 +} CUresult; +typedef struct CUctx_st *CUcontext; +typedef CUresult(__stdcall *cuCtxGetCurrent_t)(CUcontext *pctx); +typedef CUresult(__stdcall *cuCtxPopCurrent_t)(CUcontext *pctx); +typedef CUresult(__stdcall *cuInit_t)(unsigned int Flags); 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; +static NvAFX_Reset_t NvAFX_Reset; +/* cuda */ +static cuCtxGetCurrent_t cuCtxGetCurrent = NULL; +static cuCtxPopCurrent_t cuCtxPopCurrent = NULL; +static cuInit_t cuInit = NULL; void release_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; + NvAFX_Reset = NULL; if (nv_audiofx) { FreeLibrary(nv_audiofx); nv_audiofx = NULL; } + cuCtxGetCurrent = NULL; + cuCtxPopCurrent = NULL; + cuInit = NULL; + if (nv_cuda) { + FreeLibrary(nv_cuda); + nv_cuda = NULL; + } } static bool nvafx_get_sdk_path(char *buffer, const size_t len) @@ -144,7 +298,7 @@ static bool load_lib(void) SetDllDirectoryA(path); nv_audiofx = LoadLibrary(L"NVAudioEffects.dll"); SetDllDirectoryA(NULL); - - return !!nv_audiofx; + nv_cuda = LoadLibrary(L"nvcuda.dll"); + return !!nv_audiofx && !!nv_cuda; } #endif