UNPKG

audio-router

Version:

A Node.js package for interacting with audio devices using C++ DLL

116 lines (97 loc) 4.28 kB
const path = require('path'); const koffi = require('koffi'); const dllPath = path.join(__dirname, 'AudioDLL.dll'); const audioLib = koffi.load(dllPath); const C_AudioEndpointInfo = koffi.struct('C_AudioEndpointInfo', { id: koffi.pointer('char16_t'), friendlyName: koffi.pointer('char16_t'), description: koffi.pointer('char16_t'), dataFlow: 'int', role: 'int', state: 'uint32', isDefault: 'int' }); const C_AudioSessionInfo = koffi.struct('C_AudioSessionInfo', { displayName: koffi.pointer('char16_t'), iconPath: koffi.pointer('char16_t'), processId: 'uint32', processName: koffi.pointer('char16_t'), volume: 'float', isMuted: 'int', sessionId: koffi.pointer('char16_t') }); // 工具函数:JS 字符串转 wchar_t function stringToWCharBuffer (str) { return Buffer.from(str + '\0', 'ucs2'); } module.exports = { CreateAudioUtils: audioLib.func('int __stdcall CreateAudioUtils(void**)'), DestroyAudioUtils: audioLib.func('int __stdcall DestroyAudioUtils(void*)'), AudioUtils_Initialize: audioLib.func('int __stdcall AudioUtils_Initialize(void*)'), AudioUtils_Cleanup: audioLib.func('void __stdcall AudioUtils_Cleanup(void*)'), AudioUtils_GetAudioEndpoints: audioLib.func( 'AudioUtils_GetAudioEndpoints', 'int', [ 'void*', koffi.out(koffi.pointer(C_AudioEndpointInfo, 2)), // C_AudioEndpointInfo** koffi.out(koffi.pointer('int')) // int* ] ), AudioUtils_FreeAudioEndpoints: audioLib.func('void __stdcall AudioUtils_FreeAudioEndpoints(void*, int*)'), AudioUtils_GetAudioSessions: audioLib.func( 'AudioUtils_GetAudioSessions', 'int', [ 'void*', // koffi.pointer('char16_t'), koffi.pointer('char16_t'), koffi.out(koffi.pointer(C_AudioSessionInfo, 2)), // 二级指针 koffi.out(koffi.pointer('int')) ] ), AudioUtils_GetAllAudioSessions: audioLib.func( 'AudioUtils_GetAllAudioSessions', 'int', [ 'void*', koffi.out(koffi.pointer(C_AudioSessionInfo, 2)), koffi.out(koffi.pointer('int')) ] ), AudioUtils_FreeAudioSessions: audioLib.func('void __stdcall AudioUtils_FreeAudioSessions(void* sessions, int count)'), AudioUtils_SetDefaultEndpoint: audioLib.func('int __stdcall AudioUtils_SetDefaultEndpoint(void*, wchar_t*, int)'), AudioUtils_SetEndpointName: audioLib.func('int __stdcall AudioUtils_SetEndpointName(void*, wchar_t*, wchar_t*)'), AudioUtils_SetPersistedDefaultAudioEndpoint: audioLib.func('int __stdcall AudioUtils_SetPersistedDefaultAudioEndpoint(void*, int, int, wchar_t)'), AudioUtils_GetPersistedDefaultAudioEndpoint: audioLib.func( 'AudioUtils_GetPersistedDefaultAudioEndpoint', 'int', [ 'void*', 'int', 'int', koffi.out(koffi.pointer(koffi.pointer('char16_t'))) // wchar_t* 也是二级指针 ] ), AudioUtils_FreeString: audioLib.func('void __stdcall AudioUtils_FreeString(wchar_t*)'), AudioUtils_StartMultiCapture: audioLib.func('int __stdcall AudioUtils_StartMultiCapture(void*, wchar_t*, int, wchar_t*)'), AudioUtils_StopMultiCapture: audioLib.func('int __stdcall AudioUtils_StopMultiCapture(void*)'), AudioUtils_AddCaptureEndpoint: audioLib.func('int __stdcall AudioUtils_AddCaptureEndpoint(void*, wchar_t*, float)'), AudioUtils_RemoveCaptureEndpoint: audioLib.func('int __stdcall AudioUtils_RemoveCaptureEndpoint(void*, wchar_t*)'), AudioUtils_SetCaptureEndpointVolume: audioLib.func('int __stdcall AudioUtils_SetCaptureEndpointVolume(void*, wchar_t*, float)'), AudioUtils_GetCaptureStatus: audioLib.func( 'AudioUtils_GetCaptureStatus', 'int', [ 'void*', koffi.out(koffi.pointer(koffi.pointer('char16_t'))), // wchar_t** → 三重指针 koffi.out(koffi.pointer('int')) ] ), AudioUtils_FreeCaptureStatus: audioLib.func('void __stdcall AudioUtils_FreeCaptureStatus(wchar_t*, int*)'), AudioUtils_GetAudioActivity: audioLib.func('int __stdcall AudioUtils_GetAudioActivity(void*, float*, int*)'), AudioUtils_IsCapturing: audioLib.func('int __stdcall AudioUtils_IsCapturing(void*)'), stringToWCharBuffer, C_AudioEndpointInfo, C_AudioSessionInfo, };