Files
Toju/src/app/features/voice/screen-share-workspace/screen-share-playback.service.ts
Myx 7a4c4ede8c Screensharing rework
Split Linux screensharing audio tracks, Rework screensharing functionality and layout
This will need some refactoring soon
2026-03-08 06:33:27 +01:00

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.
}
}