forked from mirror/Vesktop
74 lines
2.1 KiB
TypeScript
74 lines
2.1 KiB
TypeScript
/*
|
|
* SPDX-License-Identifier: GPL-3.0
|
|
* Vesktop, a desktop app aiming to give you a snappier Discord Experience
|
|
* Copyright (c) 2023 Vendicated and Vencord contributors
|
|
*/
|
|
|
|
import { app, ipcMain } from "electron";
|
|
import { join } from "path";
|
|
import { IpcEvents } from "shared/IpcEvents";
|
|
import { STATIC_DIR } from "shared/paths";
|
|
|
|
let initialized = false;
|
|
let patchBay: import("@vencord/venmic").PatchBay | undefined;
|
|
let isGlibcxxToOld = false;
|
|
|
|
function getRendererAudioServicePid() {
|
|
return (
|
|
app
|
|
.getAppMetrics()
|
|
.find(proc => proc.name === "Audio Service")
|
|
?.pid?.toString() ?? "owo"
|
|
);
|
|
}
|
|
|
|
function obtainVenmic() {
|
|
if (!initialized) {
|
|
initialized = true;
|
|
try {
|
|
const { PatchBay } = require(
|
|
join(STATIC_DIR, `dist/venmic-${process.arch}.node`)
|
|
) as typeof import("@vencord/venmic");
|
|
patchBay = new PatchBay();
|
|
} catch (e: any) {
|
|
console.error("Failed to initialise venmic. Make sure you're using pipewire", e);
|
|
isGlibcxxToOld = (e?.stack || e?.message || "").toLowerCase().includes("glibc");
|
|
}
|
|
}
|
|
|
|
return patchBay;
|
|
}
|
|
|
|
ipcMain.handle(IpcEvents.VIRT_MIC_LIST, () => {
|
|
const audioPid = getRendererAudioServicePid();
|
|
const list = obtainVenmic()
|
|
?.list()
|
|
.filter(s => s["application.process.id"] !== audioPid)
|
|
.map(s => s["application.name"]);
|
|
|
|
return list
|
|
? { ok: true, targets: [...new Set(list)] } // Remove duplicates
|
|
: { ok: false, isGlibcxxToOld };
|
|
});
|
|
|
|
ipcMain.handle(
|
|
IpcEvents.VIRT_MIC_START,
|
|
(_, target: string) =>
|
|
obtainVenmic()?.link({
|
|
key: "application.name",
|
|
value: target,
|
|
mode: "include"
|
|
})
|
|
);
|
|
|
|
ipcMain.handle(
|
|
IpcEvents.VIRT_MIC_START_SYSTEM,
|
|
() =>
|
|
obtainVenmic()?.link({
|
|
key: "application.process.id",
|
|
value: getRendererAudioServicePid(),
|
|
mode: "exclude"
|
|
})
|
|
);
|
|
|
|
ipcMain.handle(IpcEvents.VIRT_MIC_STOP, () => obtainVenmic()?.unlink());
|