quickshell-toki-night/services/Audio.qml

85 lines
2.4 KiB
QML

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