nvafx-load.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. #pragma once
  2. #include <Windows.h>
  3. #include <stdio.h>
  4. #include <stdbool.h>
  5. #include <stddef.h>
  6. #include <stdint.h>
  7. #include <util/platform.h>
  8. #include <util/windows/win-version.h>
  9. #include "nv_sdk_versions.h"
  10. #define NVAFX_API
  11. #ifdef LIBNVAFX_ENABLED
  12. static HMODULE nv_audiofx = NULL;
  13. static HMODULE nv_cuda = NULL;
  14. /** Effects @ref NvAFX_EffectSelector */
  15. #define NVAFX_EFFECT_DENOISER "denoiser"
  16. #define NVAFX_EFFECT_DEREVERB "dereverb"
  17. #define NVAFX_EFFECT_DEREVERB_DENOISER "dereverb_denoiser"
  18. #define NVAFX_EFFECT_AEC "aec"
  19. #define NVAFX_EFFECT_SUPERRES "superres"
  20. /** Model paths */
  21. #define NVAFX_EFFECT_DENOISER_MODEL "\\models\\denoiser_48k.trtpkg"
  22. #define NVAFX_EFFECT_DEREVERB_MODEL "\\models\\dereverb_48k.trtpkg"
  23. #define NVAFX_EFFECT_DEREVERB_DENOISER_MODEL "\\models\\dereverb_denoiser_48k.trtpkg"
  24. #define NVAFX_CHAINED_EFFECT_DENOISER_16k_SUPERRES_16k_TO_48k "denoiser16k_superres16kto48k"
  25. #define NVAFX_CHAINED_EFFECT_DEREVERB_16k_SUPERRES_16k_TO_48k "dereverb16k_superres16kto48k"
  26. #define NVAFX_CHAINED_EFFECT_DEREVERB_DENOISER_16k_SUPERRES_16k_TO_48k "dereverb_denoiser16k_superres16kto48k"
  27. #define NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DENOISER_16k "superres8kto16k_denoiser16k"
  28. #define NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DEREVERB_16k "superres8kto16k_dereverb16k"
  29. #define NVAFX_CHAINED_EFFECT_SUPERRES_8k_TO_16k_DEREVERB_DENOISER_16k "superres8kto16k_dereverb_denoiser16k"
  30. /** Parameter selectors */
  31. #define NVAFX_PARAM_NUM_STREAMS "num_streams"
  32. #define NVAFX_PARAM_USE_DEFAULT_GPU "use_default_gpu"
  33. #define NVAFX_PARAM_USER_CUDA_CONTEXT "user_cuda_context"
  34. #define NVAFX_PARAM_DISABLE_CUDA_GRAPH "disable_cuda_graph"
  35. #define NVAFX_PARAM_ENABLE_VAD "enable_vad"
  36. /** Effect parameters. @ref NvAFX_ParameterSelector */
  37. #define NVAFX_PARAM_MODEL_PATH "model_path"
  38. #define NVAFX_PARAM_INPUT_SAMPLE_RATE "input_sample_rate"
  39. #define NVAFX_PARAM_OUTPUT_SAMPLE_RATE "output_sample_rate"
  40. #define NVAFX_PARAM_NUM_INPUT_SAMPLES_PER_FRAME "num_input_samples_per_frame"
  41. #define NVAFX_PARAM_NUM_OUTPUT_SAMPLES_PER_FRAME "num_output_samples_per_frame"
  42. #define NVAFX_PARAM_NUM_INPUT_CHANNELS "num_input_channels"
  43. #define NVAFX_PARAM_NUM_OUTPUT_CHANNELS "num_output_channels"
  44. #define NVAFX_PARAM_INTENSITY_RATIO "intensity_ratio"
  45. #define NVAFX_PARAM_ENABLE_VAD "enable_vad"
  46. #pragma deprecated(NVAFX_PARAM_DENOISER_MODEL_PATH)
  47. #define NVAFX_PARAM_DENOISER_MODEL_PATH NVAFX_PARAM_MODEL_PATH
  48. #pragma deprecated(NVAFX_PARAM_DENOISER_SAMPLE_RATE)
  49. #define NVAFX_PARAM_DENOISER_SAMPLE_RATE NVAFX_PARAM_SAMPLE_RATE
  50. #pragma deprecated(NVAFX_PARAM_DENOISER_NUM_SAMPLES_PER_FRAME)
  51. #define NVAFX_PARAM_DENOISER_NUM_SAMPLES_PER_FRAME NVAFX_PARAM_NUM_SAMPLES_PER_FRAME
  52. #pragma deprecated(NVAFX_PARAM_DENOISER_NUM_CHANNELS)
  53. #define NVAFX_PARAM_DENOISER_NUM_CHANNELS NVAFX_PARAM_NUM_CHANNELS
  54. #pragma deprecated(NVAFX_PARAM_DENOISER_INTENSITY_RATIO)
  55. #define NVAFX_PARAM_DENOISER_INTENSITY_RATIO NVAFX_PARAM_INTENSITY_RATIO
  56. /** Number of audio channels **/
  57. #pragma deprecated(NVAFX_PARAM_NUM_CHANNELS)
  58. #define NVAFX_PARAM_NUM_CHANNELS "num_channels"
  59. /** Sample rate (unsigned int). Currently supported sample rate(s): 48000, 16000 */
  60. #pragma deprecated(NVAFX_PARAM_SAMPLE_RATE)
  61. #define NVAFX_PARAM_SAMPLE_RATE "sample_rate"
  62. /** Number of samples per frame (unsigned int). This is immutable parameter */
  63. #pragma deprecated(NVAFX_PARAM_NUM_SAMPLES_PER_FRAME)
  64. #define NVAFX_PARAM_NUM_SAMPLES_PER_FRAME "num_samples_per_frame"
  65. typedef enum {
  66. /** Success */
  67. NVAFX_STATUS_SUCCESS = 0,
  68. /** Failure */
  69. NVAFX_STATUS_FAILED = 1,
  70. /** Handle invalid */
  71. NVAFX_STATUS_INVALID_HANDLE = 2,
  72. /** Parameter value invalid */
  73. NVAFX_STATUS_INVALID_PARAM = 3,
  74. /** Parameter value immutable */
  75. NVAFX_STATUS_IMMUTABLE_PARAM = 4,
  76. /** Insufficient data to process */
  77. NVAFX_STATUS_INSUFFICIENT_DATA = 5,
  78. /** Effect not supported */
  79. NVAFX_STATUS_EFFECT_NOT_AVAILABLE = 6,
  80. /** Given buffer length too small to hold requested data */
  81. NVAFX_STATUS_OUTPUT_BUFFER_TOO_SMALL = 7,
  82. /** Model file could not be loaded */
  83. NVAFX_STATUS_MODEL_LOAD_FAILED = 8,
  84. /** (32 bit SDK only) COM server was not registered, please see user manual for details */
  85. NVAFX_STATUS_32_SERVER_NOT_REGISTERED = 9,
  86. /** (32 bit SDK only) COM operation failed */
  87. NVAFX_STATUS_32_COM_ERROR = 10,
  88. /** GPU supported. The SDK requires Turing and above GPU with Tensor cores */
  89. NVAFX_STATUS_GPU_UNSUPPORTED = 11,
  90. } NvAFX_Status;
  91. #define NVAFX_TRUE 1
  92. #define NVAFX_FALSE 0
  93. typedef char NvAFX_Bool;
  94. /** Logging level to enable, each level is inclusive of the level preceding it */
  95. typedef enum LoggingSeverity_t {
  96. NVAFX_LOG_LEVEL_NONE = -1,
  97. NVAFX_LOG_LEVEL_FATAL = 0,
  98. NVAFX_LOG_LEVEL_ERROR = 1,
  99. NVAFX_LOG_LEVEL_WARNING = 2,
  100. NVAFX_LOG_LEVEL_INFO = 3,
  101. } LoggingSeverity;
  102. typedef enum LoggingTarget_t {
  103. // No logging.
  104. LOG_TARGET_NONE = -1,
  105. // Log to stderr.
  106. LOG_TARGET_STDERR = 0,
  107. // Log to specified file.
  108. LOG_TARGET_FILE = 1,
  109. // Log through invocation of a user-specified callback.
  110. LOG_TARGET_CALLBACK = 2,
  111. } LoggingTarget;
  112. /** Function used for logging callback */
  113. /// @param[in,out] user_data a pointer to data needed by the specific logger.
  114. /// @param[in] msg a C-string to add to the log.
  115. typedef void (*logging_cb_t)(void *user_data, const char *msg);
  116. typedef const char *NvAFX_EffectSelector;
  117. typedef const char *NvAFX_ParameterSelector;
  118. typedef void *NvAFX_Handle;
  119. typedef NvAFX_Status NVAFX_API (*NvAFX_GetEffectList_t)(int *num_effects, NvAFX_EffectSelector *effects[]);
  120. typedef NvAFX_Status NVAFX_API (*NvAFX_CreateEffect_t)(NvAFX_EffectSelector code, NvAFX_Handle *effect);
  121. typedef NvAFX_Status NVAFX_API (*NvAFX_CreateChainedEffect_t)(NvAFX_EffectSelector code, NvAFX_Handle *effect);
  122. typedef NvAFX_Status NVAFX_API (*NvAFX_DestroyEffect_t)(NvAFX_Handle effect);
  123. typedef NvAFX_Status NVAFX_API (*NvAFX_SetU32_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
  124. unsigned int val);
  125. typedef NvAFX_Status NVAFX_API (*NvAFX_SetU32List_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
  126. unsigned int *val, unsigned int size);
  127. typedef NvAFX_Status NVAFX_API (*NvAFX_SetString_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
  128. const char *val);
  129. typedef NvAFX_Status NVAFX_API (*NvAFX_SetStringList_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
  130. const char **val, unsigned int size);
  131. typedef NvAFX_Status NVAFX_API (*NvAFX_SetFloat_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, float val);
  132. typedef NvAFX_Status NVAFX_API (*NvAFX_SetFloatList_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
  133. float *val, unsigned int size);
  134. typedef NvAFX_Status NVAFX_API (*NvAFX_GetU32_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
  135. unsigned int *val);
  136. typedef NvAFX_Status NVAFX_API (*NvAFX_GetString_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, char *val,
  137. int max_length);
  138. typedef NvAFX_Status NVAFX_API (*NvAFX_GetStringList_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
  139. char **val, int *max_length, unsigned int size);
  140. typedef NvAFX_Status NVAFX_API (*NvAFX_GetFloat_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name, float *val);
  141. typedef NvAFX_Status NVAFX_API (*NvAFX_GetFloatList_t)(NvAFX_Handle effect, NvAFX_ParameterSelector param_name,
  142. float *val, unsigned int size);
  143. typedef NvAFX_Status NVAFX_API (*NvAFX_Load_t)(NvAFX_Handle effect);
  144. typedef NvAFX_Status NVAFX_API (*NvAFX_GetSupportedDevices_t)(NvAFX_Handle effect, int *num, int *devices);
  145. typedef NvAFX_Status NVAFX_API (*NvAFX_Run_t)(NvAFX_Handle effect, const float **input, float **output,
  146. unsigned num_samples, unsigned num_channels);
  147. typedef NvAFX_Status NVAFX_API (*NvAFX_Reset_t)(NvAFX_Handle effect);
  148. /* SDK >= 1.6.0 */
  149. typedef NvAFX_Status NVAFX_API (*NvAFX_InitializeLogger_t)(LoggingSeverity level, LoggingTarget target,
  150. const char *filename, logging_cb_t cb, void *userdata);
  151. typedef NvAFX_Status NVAFX_API (*NvAFX_UninitializeLogger_t)();
  152. /* cuda */
  153. typedef enum cudaError_enum {
  154. CUDA_SUCCESS = 0,
  155. CUDA_ERROR_INVALID_VALUE = 1,
  156. CUDA_ERROR_OUT_OF_MEMORY = 2,
  157. CUDA_ERROR_NOT_INITIALIZED = 3,
  158. CUDA_ERROR_DEINITIALIZED = 4,
  159. CUDA_ERROR_PROFILER_DISABLED = 5,
  160. CUDA_ERROR_PROFILER_NOT_INITIALIZED = 6,
  161. CUDA_ERROR_PROFILER_ALREADY_STARTED = 7,
  162. CUDA_ERROR_PROFILER_ALREADY_STOPPED = 8,
  163. CUDA_ERROR_NO_DEVICE = 100,
  164. CUDA_ERROR_INVALID_DEVICE = 101,
  165. CUDA_ERROR_INVALID_IMAGE = 200,
  166. CUDA_ERROR_INVALID_CONTEXT = 201,
  167. CUDA_ERROR_CONTEXT_ALREADY_CURRENT = 202,
  168. CUDA_ERROR_MAP_FAILED = 205,
  169. CUDA_ERROR_UNMAP_FAILED = 206,
  170. CUDA_ERROR_ARRAY_IS_MAPPED = 207,
  171. CUDA_ERROR_ALREADY_MAPPED = 208,
  172. CUDA_ERROR_NO_BINARY_FOR_GPU = 209,
  173. CUDA_ERROR_ALREADY_ACQUIRED = 210,
  174. CUDA_ERROR_NOT_MAPPED = 211,
  175. CUDA_ERROR_NOT_MAPPED_AS_ARRAY = 212,
  176. CUDA_ERROR_NOT_MAPPED_AS_POINTER = 213,
  177. CUDA_ERROR_ECC_UNCORRECTABLE = 214,
  178. CUDA_ERROR_UNSUPPORTED_LIMIT = 215,
  179. CUDA_ERROR_CONTEXT_ALREADY_IN_USE = 216,
  180. CUDA_ERROR_INVALID_SOURCE = 300,
  181. CUDA_ERROR_FILE_NOT_FOUND = 301,
  182. CUDA_ERROR_SHARED_OBJECT_SYMBOL_NOT_FOUND = 302,
  183. CUDA_ERROR_SHARED_OBJECT_INIT_FAILED = 303,
  184. CUDA_ERROR_OPERATING_SYSTEM = 304,
  185. CUDA_ERROR_INVALID_HANDLE = 400,
  186. CUDA_ERROR_NOT_FOUND = 500,
  187. CUDA_ERROR_NOT_READY = 600,
  188. CUDA_ERROR_LAUNCH_FAILED = 700,
  189. CUDA_ERROR_LAUNCH_OUT_OF_RESOURCES = 701,
  190. CUDA_ERROR_LAUNCH_TIMEOUT = 702,
  191. CUDA_ERROR_LAUNCH_INCOMPATIBLE_TEXTURING = 703,
  192. CUDA_ERROR_PEER_ACCESS_ALREADY_ENABLED = 704,
  193. CUDA_ERROR_PEER_ACCESS_NOT_ENABLED = 705,
  194. CUDA_ERROR_PRIMARY_CONTEXT_ACTIVE = 708,
  195. CUDA_ERROR_CONTEXT_IS_DESTROYED = 709,
  196. CUDA_ERROR_ASSERT = 710,
  197. CUDA_ERROR_TOO_MANY_PEERS = 711,
  198. CUDA_ERROR_HOST_MEMORY_ALREADY_REGISTERED = 712,
  199. CUDA_ERROR_HOST_MEMORY_NOT_REGISTERED = 713,
  200. CUDA_ERROR_UNKNOWN = 999
  201. } CUresult;
  202. typedef struct CUctx_st *CUcontext;
  203. typedef CUresult(__stdcall *cuCtxGetCurrent_t)(CUcontext *pctx);
  204. typedef CUresult(__stdcall *cuCtxPopCurrent_t)(CUcontext *pctx);
  205. typedef CUresult(__stdcall *cuInit_t)(unsigned int Flags);
  206. static NvAFX_GetEffectList_t NvAFX_GetEffectList = NULL;
  207. static NvAFX_CreateEffect_t NvAFX_CreateEffect = NULL;
  208. static NvAFX_CreateChainedEffect_t NvAFX_CreateChainedEffect = NULL;
  209. static NvAFX_DestroyEffect_t NvAFX_DestroyEffect = NULL;
  210. static NvAFX_SetU32_t NvAFX_SetU32 = NULL;
  211. static NvAFX_SetU32List_t NvAFX_SetU32List = NULL;
  212. static NvAFX_SetString_t NvAFX_SetString = NULL;
  213. static NvAFX_SetStringList_t NvAFX_SetStringList = NULL;
  214. static NvAFX_SetFloat_t NvAFX_SetFloat = NULL;
  215. static NvAFX_SetFloatList_t NvAFX_SetFloatList = NULL;
  216. static NvAFX_GetU32_t NvAFX_GetU32 = NULL;
  217. static NvAFX_GetString_t NvAFX_GetString = NULL;
  218. static NvAFX_GetStringList_t NvAFX_GetStringList = NULL;
  219. static NvAFX_GetFloat_t NvAFX_GetFloat = NULL;
  220. static NvAFX_GetFloatList_t NvAFX_GetFloatList = NULL;
  221. static NvAFX_Load_t NvAFX_Load = NULL;
  222. static NvAFX_GetSupportedDevices_t NvAFX_GetSupportedDevices = NULL;
  223. static NvAFX_Run_t NvAFX_Run = NULL;
  224. static NvAFX_Reset_t NvAFX_Reset = NULL;
  225. /* SDK >= 1.6.0 */
  226. static NvAFX_InitializeLogger_t NvAFX_InitializeLogger = NULL;
  227. static NvAFX_UninitializeLogger_t NvAFX_UninitializeLogger = NULL;
  228. /* cuda */
  229. static cuCtxGetCurrent_t cuCtxGetCurrent = NULL;
  230. static cuCtxPopCurrent_t cuCtxPopCurrent = NULL;
  231. static cuInit_t cuInit = NULL;
  232. void release_lib(void)
  233. {
  234. NvAFX_GetEffectList = NULL;
  235. NvAFX_CreateEffect = NULL;
  236. NvAFX_CreateChainedEffect = NULL;
  237. NvAFX_DestroyEffect = NULL;
  238. NvAFX_SetU32 = NULL;
  239. NvAFX_SetU32List = NULL;
  240. NvAFX_SetString = NULL;
  241. NvAFX_SetStringList = NULL;
  242. NvAFX_SetFloat = NULL;
  243. NvAFX_SetFloatList = NULL;
  244. NvAFX_GetU32 = NULL;
  245. NvAFX_GetString = NULL;
  246. NvAFX_GetStringList = NULL;
  247. NvAFX_GetFloat = NULL;
  248. NvAFX_GetFloatList = NULL;
  249. NvAFX_Load = NULL;
  250. NvAFX_GetSupportedDevices = NULL;
  251. NvAFX_Run = NULL;
  252. NvAFX_Reset = NULL;
  253. /* SDK >= 1.6.0 */
  254. NvAFX_InitializeLogger = NULL;
  255. NvAFX_UninitializeLogger = NULL;
  256. if (nv_audiofx) {
  257. FreeLibrary(nv_audiofx);
  258. nv_audiofx = NULL;
  259. }
  260. cuCtxGetCurrent = NULL;
  261. cuCtxPopCurrent = NULL;
  262. cuInit = NULL;
  263. if (nv_cuda) {
  264. FreeLibrary(nv_cuda);
  265. nv_cuda = NULL;
  266. }
  267. }
  268. static bool nvafx_get_sdk_path(char *buffer, const size_t len)
  269. {
  270. DWORD ret = GetEnvironmentVariableA("NVAFX_SDK_DIR", buffer, (DWORD)len);
  271. if (!ret || ret >= len - 1)
  272. return false;
  273. return true;
  274. }
  275. static bool load_lib(void)
  276. {
  277. char path[MAX_PATH];
  278. if (!nvafx_get_sdk_path(path, sizeof(path)))
  279. return false;
  280. SetDllDirectoryA(path);
  281. nv_audiofx = LoadLibrary(L"NVAudioEffects.dll");
  282. SetDllDirectoryA(NULL);
  283. nv_cuda = LoadLibrary(L"nvcuda.dll");
  284. return !!nv_audiofx && !!nv_cuda;
  285. }
  286. static unsigned int get_lib_version(void)
  287. {
  288. static unsigned int version = 0;
  289. static bool version_checked = false;
  290. if (version_checked)
  291. return version;
  292. version_checked = true;
  293. char path[MAX_PATH];
  294. if (!nvafx_get_sdk_path(path, sizeof(path)))
  295. return 0;
  296. SetDllDirectoryA(path);
  297. struct win_version_info nto_ver = {0};
  298. if (get_dll_ver(L"NVAudioEffects.dll", &nto_ver))
  299. version = nto_ver.major << 24 | nto_ver.minor << 16 | nto_ver.build << 8 | nto_ver.revis << 0;
  300. SetDllDirectoryA(NULL);
  301. return version;
  302. }
  303. #endif