소스 검색

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 <[email protected]>
pkv 3 년 전
부모
커밋
cc2030ef06
2개의 변경된 파일185개의 추가작업 그리고 19개의 파일을 삭제
  1. 17 5
      plugins/obs-filters/noise-suppress-filter.c
  2. 168 14
      plugins/obs-filters/nvafx-load.h

+ 17 - 5
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:

+ 168 - 14
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