unpixel/src/back/utils.ts

50 lines
1.5 KiB
TypeScript
Raw Normal View History

import cp from 'child_process'
2021-06-10 22:23:19 +02:00
import { promisify } from 'util'
import Settings from './settings'
2021-06-10 22:23:19 +02:00
const exec = promisify(cp.exec)
export async function isCameraActive(): Promise<boolean> {
if (process.platform === 'darwin') {
2021-06-10 22:23:19 +02:00
// Check number of processes using the camera
const out = await exec(`lsof -n | grep "AppleCamera"`)
const processesUsingCamera = out.stdout.trim().split('\n').length
return processesUsingCamera > 1 // One is the apple daemon that is always active
}
return false
}
export async function isMicrophoneActive(): Promise<boolean> {
if (process.platform === 'darwin') {
2021-06-10 22:23:19 +02:00
const out = await exec(`ioreg -c AppleHDAEngineInput | grep "IOAudioEngineState"`)
const parsed = parseInt(out.stdout.trim().replace(/[^\d]/gim, ''))
return parsed > 0
}
return false
}
export class InputDevicesStatus {
static status = {
mic: false,
camera: false,
}
2021-06-10 22:23:19 +02:00
static update() {
// TODO: Update electron version as soon as issue is resolved https://github.com/electron/electron/issues/26143
2021-06-10 22:53:33 +02:00
isMicrophoneActive().then((result) => (InputDevicesStatus.status.mic = result))
isCameraActive().then((result) => (InputDevicesStatus.status.camera = result))
2021-06-10 22:23:19 +02:00
}
static init() {
2021-06-10 22:53:33 +02:00
setInterval(InputDevicesStatus.update, 2000)
}
static areCameraOrMicrophoneActive(): boolean {
if (Settings.load('skipOnCameraOrMic')) {
2021-06-10 22:53:33 +02:00
return InputDevicesStatus.status.mic || InputDevicesStatus.status.camera
}
return false
}
}