Add flags to optimize EC device handling

This commit is contained in:
Timo
2025-05-16 15:50:19 +02:00
parent abf683f275
commit 35963bbc9e
3 changed files with 14 additions and 4 deletions

View File

@@ -12,7 +12,7 @@ A few aspects of Element Call's interface can be controlled through a global API
These functions must be used in conjunction with the `controlledOutput` URL parameter in order to have any effect. These functions must be used in conjunction with the `controlledOutput` URL parameter in order to have any effect.
- `controls.setAvailableOutputDevices(devices: { id: string, name: string, forEarpiece?: boolean }[]): void` Sets the list of available audio outputs. `forEarpiece` is used on ios only. - `controls.setAvailableOutputDevices(devices: { id: string, name: string, forEarpiece?: boolean, isEarpiece?: boolean isSpeaker?: boolean, isBluetooth?, boolean;}[]): void` Sets the list of available audio outputs. `forEarpiece` is used on ios only.
It flags the device that should be used if the user selects earpiece mode. This should be the main stereo loudspeaker of the device. It flags the device that should be used if the user selects earpiece mode. This should be the main stereo loudspeaker of the device.
- `controls.onOutputDeviceSelect: ((id: string) => void) | undefined` Callback called whenever the user or application selects a new audio output. - `controls.onOutputDeviceSelect: ((id: string) => void) | undefined` Callback called whenever the user or application selects a new audio output.
- `controls.setOutputDevice(id: string): void` Sets the selected audio device in EC menu. This should be used if the os decides to automatically switch to bluetooth. - `controls.setOutputDevice(id: string): void` Sets the selected audio device in EC menu. This should be used if the os decides to automatically switch to bluetooth.

View File

@@ -22,6 +22,9 @@ export interface OutputDevice {
id: string; id: string;
name: string; name: string;
forEarpiece?: boolean; forEarpiece?: boolean;
isEarpiece?: boolean;
isSpeaker?: boolean;
isBluetooth?: boolean;
} }
export const setPipEnabled$ = new Subject<boolean>(); export const setPipEnabled$ = new Subject<boolean>();

View File

@@ -327,10 +327,17 @@ function useControlledOutput(): MediaDeviceHandle {
startWith<OutputDevice[]>([]), startWith<OutputDevice[]>([]),
map((devices) => { map((devices) => {
const deviceForEarpiece = devices.find((d) => d.forEarpiece); const deviceForEarpiece = devices.find((d) => d.forEarpiece);
const deviceMapTuple: [string, DeviceLabel][] = devices.map(
({ id, name, isEarpiece, isSpeaker /*,isBluetooth*/ }) => {
let deviceLabel: DeviceLabel = { type: "name", name };
// if (isBluetooth) // Do we want this?
if (isEarpiece) deviceLabel = { type: "earpiece" };
if (isSpeaker) deviceLabel = { type: "default", name };
return [id, deviceLabel];
},
);
return { return {
devicesMap: new Map<string, DeviceLabel>( devicesMap: new Map<string, DeviceLabel>(deviceMapTuple),
devices.map(({ id, name }) => [id, { type: "name", name }]),
),
deviceForEarpiece, deviceForEarpiece,
}; };
}), }),