UNPKG

process-audio-capture

Version:

Native process-level audio capture for Node.js and Electron applications

118 lines (98 loc) 2.68 kB
import { ipcMain } from "electron"; import { audioCapture } from "./core"; import type { AudioData } from "./types"; import { AUDIO_CAPTURE_IPC_PREFIX } from "./shared"; const PREFIX = AUDIO_CAPTURE_IPC_PREFIX; let registered = false; /** * 设置音频捕获IPC通信 * * 在主进程中注册所有音频捕获相关的IPC处理器 * 配合 preload.ts 中的 exposeAudioCaptureApi() 使用 */ export const setupAudioCaptureIpc = () => { if (registered) { return; } registered = true; ipcMain.handle(`${PREFIX}:check-permission`, () => { try { return audioCapture.checkPermission(); } catch (error: any) { return error; } }); ipcMain.handle(`${PREFIX}:request-permission`, async () => { try { return audioCapture.requestPermission(); } catch (error: any) { return error; } }); ipcMain.handle(`${PREFIX}:get-process-list`, () => { try { return audioCapture.getProcessList(); } catch (error: any) { return error; } }); ipcMain.handle(`${PREFIX}:start-capture`, (_event, pid) => { try { return audioCapture.startCapture(pid); } catch (error: any) { return error; } }); ipcMain.handle(`${PREFIX}:stop-capture`, () => { try { return audioCapture.stopCapture(); } catch (error: any) { return error; } }); ipcMain.handle(`${PREFIX}:is-capturing`, () => { try { return audioCapture.isCapturing; } catch (error: any) { return error; } }); listenAudioData(); listenCapturing(); }; const listenAudioData = () => { const listeners = new Map<string, (audioData: AudioData) => void>(); ipcMain.on(`${PREFIX}:on-audio-data`, (event, id) => { listeners.set(id, (audioData) => { if (!event.sender.isDestroyed()) { event.sender.send(`${PREFIX}:on-audio-data:${id}`, audioData); } }); }); ipcMain.on(`${PREFIX}:off-audio-data`, (_event, id) => { listeners.delete(id); }); audioCapture.on("audio-data", (audioData) => { listeners.forEach((listener) => { listener(audioData); }); }); }; const listenCapturing = () => { const listeners = new Map<string, (capturing: boolean) => void>(); ipcMain.on(`${PREFIX}:on-capturing`, (event, id) => { listeners.set(id, (capturing) => { if (!event.sender.isDestroyed()) { event.sender.send(`${PREFIX}:on-capturing:${id}`, capturing); } }); }); ipcMain.on(`${PREFIX}:off-capturing`, (_event, id) => { listeners.delete(id); }); audioCapture.on("capturing", (capturing) => { listeners.forEach((listener) => { listener(capturing); }); }); };