diff --git a/Assets/settings-default.json b/Assets/settings-default.json index ac12bc70..5ba03f2e 100644 --- a/Assets/settings-default.json +++ b/Assets/settings-default.json @@ -137,6 +137,7 @@ }, "audio": { "volumeStep": 5, + "volumeOverdrive": false, "cavaFrameRate": 60, "visualizerType": "linear", "mprisBlacklist": [], diff --git a/Commons/Settings.qml b/Commons/Settings.qml index 06a42d3e..7ba3be04 100644 --- a/Commons/Settings.qml +++ b/Commons/Settings.qml @@ -261,6 +261,7 @@ Singleton { // audio property JsonObject audio: JsonObject { property int volumeStep: 5 + property bool volumeOverdrive: false property int cavaFrameRate: 60 property string visualizerType: "linear" property list mprisBlacklist: [] diff --git a/Modules/OSD/OSD.qml b/Modules/OSD/OSD.qml index 277bf1b9..e8d9064a 100644 --- a/Modules/OSD/OSD.qml +++ b/Modules/OSD/OSD.qml @@ -70,7 +70,11 @@ Loader { // Get progress bar color function getProgressColor() { if (osdType === OSD.Type.Volume) { - return isMuted ? Color.mError : Color.mPrimary + if (isMuted) + return Color.mError + if (currentVolume > 1.0) + return Color.mError + return Color.mPrimary } else { return Color.mPrimary } diff --git a/Modules/Settings/Tabs/AudioTab.qml b/Modules/Settings/Tabs/AudioTab.qml index 93faa75c..d739b8ca 100644 --- a/Modules/Settings/Tabs/AudioTab.qml +++ b/Modules/Settings/Tabs/AudioTab.qml @@ -51,7 +51,7 @@ ColumnLayout { NValueSlider { Layout.fillWidth: true from: 0 - to: Settings.data.audio.volumeOverdrive ? 2.0 : 1.0 + to: Settings.data.audio.volumeOverdrive ? 1.5 : 1.0 value: localVolume stepSize: 0.01 text: Math.floor(AudioService.volume * 100) + "%" @@ -91,7 +91,7 @@ ColumnLayout { NValueSlider { Layout.fillWidth: true from: 0 - to: 1.0 + to: Settings.data.audio.volumeOverdrive ? 1.5 : 1.0 value: AudioService.inputVolume stepSize: 0.01 text: Math.floor(AudioService.inputVolume * 100) + "%" @@ -130,6 +130,19 @@ ColumnLayout { } } + // Raise maximum volume above 100% + ColumnLayout { + spacing: Style.marginS * scaling + Layout.fillWidth: true + + NToggle { + label: "Allow volume overdrive" + description: "Allow raising volume above 100%." + checked: Settings.data.audio.volumeOverdrive + onToggled: checked => Settings.data.audio.volumeOverdrive = checked + } + } + NDivider { Layout.fillWidth: true Layout.topMargin: Style.marginXL * scaling diff --git a/Services/AudioService.qml b/Services/AudioService.qml index 3b23234f..b1260131 100644 --- a/Services/AudioService.qml +++ b/Services/AudioService.qml @@ -96,7 +96,7 @@ Singleton { if (sink?.ready && sink?.audio) { // Clamp it accordingly sink.audio.muted = false - sink.audio.volume = Math.max(0, Math.min(1, newVolume)) + sink.audio.volume = Math.max(0, Math.min(Settings.data.audio.volumeOverdrive ? 1.5 : 1.0, newVolume)) //Logger.log("AudioService", "SetVolume", sink.audio.volume); } else { Logger.warn("AudioService", "No sink available") @@ -115,7 +115,7 @@ Singleton { if (source?.ready && source?.audio) { // Clamp it accordingly source.audio.muted = false - source.audio.volume = Math.max(0, Math.min(1, newVolume)) + source.audio.volume = Math.max(0, Math.min(Settings.data.audio.volumeOverdrive ? 1.5 : 1.0, newVolume)) } else { Logger.warn("AudioService", "No source available") }