earbang protection

This commit is contained in:
end-4
2025-06-07 19:43:05 +02:00
parent c1a4670de2
commit 57327ab0fe
4 changed files with 114 additions and 20 deletions
+35 -2
View File
@@ -1,3 +1,4 @@
import "root:/modules/common"
import QtQuick
import Quickshell
import Quickshell.Services.Pipewire
@@ -11,11 +12,43 @@ Singleton {
id: root
property bool ready: Pipewire.defaultAudioSink?.ready ?? false
property var sink: Pipewire.defaultAudioSink
property var source: Pipewire.defaultAudioSource
property PwNode sink: Pipewire.defaultAudioSink
property PwNode source: Pipewire.defaultAudioSource
signal sinkProtectionTriggered(string reason);
PwObjectTracker {
objects: [sink, source]
Component.onCompleted: {
sink.audio.volume = sink.audio.volume; // Trigger initial volume change
}
}
Connections { // Protection against sudden volume changes
target: sink?.audio ?? null
property bool lastReady: false
property real lastVolume: 0
function onVolumeChanged() {
if (!ConfigOptions.audio.protection.enable) return;
if (!lastReady) {
lastVolume = sink.audio.volume;
lastReady = true;
return;
}
const newVolume = sink.audio.volume;
const maxAllowedIncrease = ConfigOptions.audio.protection.maxAllowedIncrease / 100;
const maxAllowed = ConfigOptions.audio.protection.maxAllowed / 100;
if (newVolume - lastVolume > maxAllowedIncrease) {
sink.audio.volume = lastVolume;
root.sinkProtectionTriggered("Illegal increment");
} else if (newVolume > maxAllowed) {
sink.audio.volume = lastVolume;
root.sinkProtectionTriggered("Exceeded max allowed");
}
lastVolume = sink.audio.volume;
}
}
}