signal-desktop/ts/calling/findBestMatchingDevice.ts
2023-01-09 10:38:57 -08:00

66 lines
1.8 KiB
TypeScript

// Copyright 2021 Signal Messenger, LLC
// SPDX-License-Identifier: AGPL-3.0-only
import type { AudioDevice } from '@signalapp/ringrtc';
import { AudioDeviceModule } from './audioDeviceModule';
export function findBestMatchingAudioDeviceIndex({
available,
preferred,
previousAudioDeviceModule,
currentAudioDeviceModule,
}: Readonly<{
available: ReadonlyArray<AudioDevice>;
preferred: undefined | AudioDevice;
previousAudioDeviceModule: AudioDeviceModule;
currentAudioDeviceModule: AudioDeviceModule;
}>): undefined | number {
if (!preferred) {
return available.length > 0 ? 0 : undefined;
}
if (
(currentAudioDeviceModule === AudioDeviceModule.WindowsAdm2 &&
preferred.index === 0) ||
(previousAudioDeviceModule === AudioDeviceModule.WindowsAdm2 &&
preferred.index === 1 &&
available.length >= 2)
) {
return preferred.index;
}
if (preferred.uniqueId) {
const idMatchIndex = available.findIndex(
d => d.uniqueId === preferred.uniqueId
);
if (idMatchIndex !== -1) {
return idMatchIndex;
}
}
const nameMatchIndex = available.findIndex(d => d.name === preferred.name);
if (nameMatchIndex !== -1) {
return nameMatchIndex;
}
return available.length > 0 ? 0 : undefined;
}
export function findBestMatchingCameraId(
available: ReadonlyArray<MediaDeviceInfo>,
preferred?: string
): undefined | string {
const matchingId = available.filter(d => d.deviceId === preferred);
const nonInfrared = available.filter(d => !d.label.includes('IR Camera'));
// By default, pick the first non-IR camera (but allow the user to pick the
// infrared if they so desire)
if (matchingId.length > 0) {
return matchingId[0].deviceId;
}
if (nonInfrared.length > 0) {
return nonInfrared[0].deviceId;
}
return undefined;
}