| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297 | 
							- #include <Windows.h>
 
- #include <stdio.h>
 
- #include <stdbool.h>
 
- #include <stddef.h>
 
- #include <stdint.h>
 
- #include <util/platform.h>
 
- #include <util/windows/win-version.h>
 
- #define NVAFX_API
 
- #ifdef LIBNVAFX_ENABLED
 
- #define MIN_AFX_SDK_VERSION (1 << 24 | 3 << 16 | 0 << 0)
 
- static HMODULE nv_audiofx = NULL;
 
- static HMODULE nv_cuda = 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"
 
- #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 */
 
- 	NVAFX_STATUS_SUCCESS = 0,
 
- 	/** Failure */
 
- 	NVAFX_STATUS_FAILED = 1,
 
- 	/** Handle invalid */
 
- 	NVAFX_STATUS_INVALID_HANDLE = 2,
 
- 	/** Parameter value invalid */
 
- 	NVAFX_STATUS_INVALID_PARAM = 3,
 
- 	/** Parameter value immutable */
 
- 	NVAFX_STATUS_IMMUTABLE_PARAM = 4,
 
- 	/** Insufficient data to process */
 
- 	NVAFX_STATUS_INSUFFICIENT_DATA = 5,
 
- 	/** Effect not supported */
 
- 	NVAFX_STATUS_EFFECT_NOT_AVAILABLE = 6,
 
- 	/** Given buffer length too small to hold requested data */
 
- 	NVAFX_STATUS_OUTPUT_BUFFER_TOO_SMALL = 7,
 
- 	/** 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,
 
- 	/** GPU supported. The SDK requires Turing and above GPU with Tensor cores */
 
- 	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;
 
- 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,
 
- 					      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)
 
- {
 
- 	DWORD ret = GetEnvironmentVariableA("NVAFX_SDK_DIR", buffer, (DWORD)len);
 
- 	if (!ret || ret >= len - 1)
 
- 		return false;
 
- 	return true;
 
- }
 
- static bool load_lib(void)
 
- {
 
- 	char path[MAX_PATH];
 
- 	if (!nvafx_get_sdk_path(path, sizeof(path)))
 
- 		return false;
 
- 	SetDllDirectoryA(path);
 
- 	nv_audiofx = LoadLibrary(L"NVAudioEffects.dll");
 
- 	SetDllDirectoryA(NULL);
 
- 	nv_cuda = LoadLibrary(L"nvcuda.dll");
 
- 	return !!nv_audiofx && !!nv_cuda;
 
- }
 
- static unsigned int get_lib_version(void)
 
- {
 
- 	static unsigned int version = 0;
 
- 	static bool version_checked = false;
 
- 	if (version_checked)
 
- 		return version;
 
- 	version_checked = true;
 
- 	char path[MAX_PATH];
 
- 	if (!nvafx_get_sdk_path(path, sizeof(path)))
 
- 		return 0;
 
- 	SetDllDirectoryA(path);
 
- 	struct win_version_info nto_ver = {0};
 
- 	if (get_dll_ver(L"NVAudioEffects.dll", &nto_ver))
 
- 		version = nto_ver.major << 24 | nto_ver.minor << 16 | nto_ver.build << 8 | nto_ver.revis << 0;
 
- 	SetDllDirectoryA(NULL);
 
- 	return version;
 
- }
 
- #endif
 
 
  |