Split Linux screensharing audio tracks, Rework screensharing functionality and layout This will need some refactoring soon
78 lines
1.8 KiB
TypeScript
78 lines
1.8 KiB
TypeScript
import { Injectable, signal } from '@angular/core';
|
|
|
|
interface ScreenSharePlaybackSettings {
|
|
muted: boolean;
|
|
volume: number;
|
|
}
|
|
|
|
const DEFAULT_SETTINGS: ScreenSharePlaybackSettings = {
|
|
muted: false,
|
|
volume: 100
|
|
};
|
|
|
|
@Injectable({ providedIn: 'root' })
|
|
export class ScreenSharePlaybackService {
|
|
private readonly _settings = signal<ReadonlyMap<string, ScreenSharePlaybackSettings>>(new Map());
|
|
|
|
settings(): ReadonlyMap<string, ScreenSharePlaybackSettings> {
|
|
return this._settings();
|
|
}
|
|
|
|
getUserVolume(peerId: string): number {
|
|
return this._settings().get(peerId)?.volume ?? DEFAULT_SETTINGS.volume;
|
|
}
|
|
|
|
isUserMuted(peerId: string): boolean {
|
|
return this._settings().get(peerId)?.muted ?? DEFAULT_SETTINGS.muted;
|
|
}
|
|
|
|
setUserVolume(peerId: string, volume: number): void {
|
|
const nextVolume = Math.max(0, Math.min(100, volume));
|
|
const current = this._settings().get(peerId) ?? DEFAULT_SETTINGS;
|
|
|
|
this._settings.update((settings) => {
|
|
const next = new Map(settings);
|
|
|
|
next.set(peerId, {
|
|
...current,
|
|
muted: nextVolume === 0 ? current.muted : false,
|
|
volume: nextVolume
|
|
});
|
|
|
|
return next;
|
|
});
|
|
}
|
|
|
|
setUserMuted(peerId: string, muted: boolean): void {
|
|
const current = this._settings().get(peerId) ?? DEFAULT_SETTINGS;
|
|
|
|
this._settings.update((settings) => {
|
|
const next = new Map(settings);
|
|
|
|
next.set(peerId, {
|
|
...current,
|
|
muted
|
|
});
|
|
|
|
return next;
|
|
});
|
|
}
|
|
|
|
resetUser(peerId: string): void {
|
|
this._settings.update((settings) => {
|
|
if (!settings.has(peerId)) {
|
|
return settings;
|
|
}
|
|
|
|
const next = new Map(settings);
|
|
|
|
next.delete(peerId);
|
|
return next;
|
|
});
|
|
}
|
|
|
|
teardownAll(): void {
|
|
// Screen-share audio is played directly by the video element.
|
|
}
|
|
}
|