pragma Singleton import qs.config import qs.custom import Quickshell import Quickshell.Services.Pipewire Singleton { id: root readonly property PwNode sink: Pipewire.defaultAudioSink readonly property PwNode source: Pipewire.defaultAudioSource PwObjectTracker { objects: [root.sink, root.source] } readonly property bool muted: !!sink?.audio?.muted readonly property real volume: sink?.audio?.volume ?? 0 readonly property bool sourceMuted: !!source?.audio?.muted readonly property real sourceVolume: source?.audio?.volume ?? 0 function setVolume(newVolume: real, s: PwNode): void { if (!s) s = sink; if (s?.ready && s?.audio) { s.audio.volume = Math.max(0, Math.min(1, newVolume)); } } function increaseVolume(amount: real, s: PwNode): void { setVolume(volume + (amount || Config.osd.volumeIncrement), s); } function decreaseVolume(amount: real, s: PwNode): void { setVolume(volume - (amount || Config.osd.volumeIncrement), s); } CustomShortcut { name: "volumeUp" description: "Increase volume" onPressed: root.increaseVolume() } CustomShortcut { name: "volumeDown" description: "Decrease volume" onPressed: root.decreaseVolume() } CustomShortcut { name: "mute" description: "Toggle muting of output (Pipewire default audio sink)" onPressed: root.sink.audio.muted = !root.muted } CustomShortcut { name: "muteMic" description: "Toggle muting of input (Pipewire default audio source)" onPressed: root.source.audio.muted = !root.sourceMuted } function setSourceVolume(newVolume: real, s: PwNode): void { if (!s) s = source; if (s?.ready && s?.audio) { s.audio.volume = Math.max(0, Math.min(1, newVolume)); } } function incrementSourceVolume(amount: real, s: PwNode): void { setSourceVolume(sourceVolume + (amount || Config.osd.micIncrement), s); } function decrementSourceVolume(amount: real, s: PwNode): void { setSourceVolume(sourceVolume - (amount || Config.osd.micIncrement), s); } function setAudioSink(newSink: PwNode): void { Pipewire.preferredDefaultAudioSink = newSink; } function setAudioSource(newSource: PwNode): void { Pipewire.preferredDefaultAudioSource = newSource; } }