import { IPreferencesEditor } from "../../preferences/PreferencesEditor.ts"; import { AudioPreferences } from "./AudioPreferences.ts"; import { AudioSettings } from "./AudioSettings.ts"; import { Preference, BooleanPreference, RangePreference } from "../../preferences/Preference.ts"; import { volumeRangeConfig, playbackRateRangeConfig, skipIntervalRangeConfig } from "../../preferences/Types.ts"; export class AudioPreferencesEditor implements IPreferencesEditor { preferences: AudioPreferences; private settings: AudioSettings; constructor(initialPreferences: AudioPreferences, settings: AudioSettings) { this.preferences = initialPreferences; this.settings = settings; } clear(): void { this.preferences = new AudioPreferences(); } private updatePreference(key: K, value: AudioPreferences[K]) { this.preferences[key] = value; } get volume(): RangePreference { return new RangePreference({ initialValue: this.preferences.volume, effectiveValue: this.settings.volume, isEffective: this.preferences.volume !== null, onChange: (newValue: number | null | undefined) => { this.updatePreference("volume", newValue ?? null); }, supportedRange: volumeRangeConfig.range, step: volumeRangeConfig.step }); } get playbackRate(): RangePreference { return new RangePreference({ initialValue: this.preferences.playbackRate, effectiveValue: this.settings.playbackRate, isEffective: this.preferences.playbackRate !== null, onChange: (newValue: number | null | undefined) => { this.updatePreference("playbackRate", newValue ?? null); }, supportedRange: playbackRateRangeConfig.range, step: playbackRateRangeConfig.step }); } get preservePitch(): BooleanPreference { return new BooleanPreference({ initialValue: this.preferences.preservePitch, effectiveValue: this.settings.preservePitch, isEffective: this.preferences.preservePitch !== null, onChange: (newValue: boolean | null | undefined) => { this.updatePreference("preservePitch", newValue ?? null); } }); } get skipBackwardInterval(): RangePreference { return new RangePreference({ initialValue: this.preferences.skipBackwardInterval, effectiveValue: this.settings.skipBackwardInterval, isEffective: this.preferences.skipBackwardInterval !== null, onChange: (newValue: number | null | undefined) => { this.updatePreference("skipBackwardInterval", newValue ?? null); }, supportedRange: skipIntervalRangeConfig.range, step: skipIntervalRangeConfig.step }); } get skipForwardInterval(): RangePreference { return new RangePreference({ initialValue: this.preferences.skipForwardInterval, effectiveValue: this.settings.skipForwardInterval, isEffective: this.preferences.skipForwardInterval !== null, onChange: (newValue: number | null | undefined) => { this.updatePreference("skipForwardInterval", newValue ?? null); }, supportedRange: skipIntervalRangeConfig.range, step: skipIntervalRangeConfig.step }); } get pollInterval(): Preference { return new Preference({ initialValue: this.preferences.pollInterval, effectiveValue: this.settings.pollInterval, isEffective: this.preferences.pollInterval !== null, onChange: (newValue: number | null | undefined) => { this.updatePreference("pollInterval", newValue ?? null); } }); } get autoPlay(): BooleanPreference { return new BooleanPreference({ initialValue: this.preferences.autoPlay, effectiveValue: this.settings.autoPlay, isEffective: this.preferences.autoPlay !== null, onChange: (newValue: boolean | null | undefined) => { this.updatePreference("autoPlay", newValue ?? null); } }); } get enableMediaSession(): BooleanPreference { return new BooleanPreference({ initialValue: this.preferences.enableMediaSession, effectiveValue: this.settings.enableMediaSession, isEffective: this.preferences.enableMediaSession !== null, onChange: (newValue: boolean | null | undefined) => { this.updatePreference("enableMediaSession", newValue ?? null); } }); } }