audio-router
Version:
A Node.js package for interacting with audio devices using C++ DLL
116 lines (97 loc) • 4.28 kB
JavaScript
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,
};