Files
onyx/Packages/OnyxKit/Tests/AudioProviderTests/OverdriveTests.swift
Scarriffle ed8b095377 Overdrive je Programm: bis 400 %, aber nur auf Ansage
Der Regler ging bisher immer bis 200 %, ohne dass man das wollen musste. Jetzt
endet er bei 100 % — der Stellung, in der ein Programm klingt, wie es gemeint
war —, und ein Blitz in der Zeile gibt den Bereich darüber frei. Je Programm:
ein Browser braucht ihn für eine leise Konferenz, die Musik daneben nicht.

Oberhalb von 100 % gilt die Kennlinie nicht mehr. Dort steht die Zahl für den
Faktor selbst: 400 % sind das Vierfache der Amplitude. Mit der Kennlinie wären
daraus 4^1,66 ≈ 10,4 geworden — eine Beschriftung, die etwas anderes verspricht,
als der Regler tut. Bei genau 100 % stimmen beide Hälften überein, die Kurve hat
also keinen Sprung, nur einen Knick. Unterhalb bleibt alles wie es war.

Beim Abschalten wird die Lautstärke zurückgeholt. Sonst bliebe ein Programm
dreifach verstärkt, während sein Regler am rechten Anschlag steht und 100 %
anzeigt. Dasselbe beim Laden alter Einstellungen: ein gespeichertes 180 % aus
der Zeit ohne Freigabe fällt auf 100 %.

Die 100 %-Markierung im Regler erscheint nur noch mit Overdrive — ohne ihn läge
sie am rechten Anschlag und sagte dort nichts mehr.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-13 18:02:43 +02:00

103 lines
3.7 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import Testing
@testable import AudioProvider
@Suite("Overdrive")
struct OverdriveTests {
@Test("Ohne Overdrive ist bei 100 % Schluss")
func normalMaximumIsOne() {
#expect(Gain.maximum(overdrive: false) == 1)
var store = VolumeStore()
store.set(3.5, for: "com.google.Chrome")
#expect(store.volume(for: "com.google.Chrome") == 1)
}
@Test("Mit Overdrive geht der Regler bis 400 %")
func overdriveMaximumIsFour() {
#expect(Gain.maximum(overdrive: true) == 4)
var store = VolumeStore()
store.setOverdrive(true, for: "com.google.Chrome")
store.set(3.4, for: "com.google.Chrome")
#expect(store.volume(for: "com.google.Chrome") == 3.4)
}
@Test("Auch mit Overdrive ist bei 400 % Schluss")
func overdriveStillHasACeiling() {
var store = VolumeStore()
store.setOverdrive(true, for: "app")
store.set(99, for: "app")
#expect(store.volume(for: "app") == 4)
}
@Test("Über 100 % bedeutet die Zahl den Faktor selbst")
func aboveOneTheNumberIsTheFactor() {
// Mit der Kennlinie wären aus 400 % das 10,4-Fache geworden. Eine
// Beschriftung, die etwas anderes verspricht als der Regler tut, ist
// schlimmer als eine grobe Kennlinie.
#expect(Gain.factor(forVolume: 4) == 4)
#expect(Gain.factor(forVolume: 2) == 2)
}
@Test("Bei genau 100 % passen beide Hälften zusammen")
func curveIsContinuousAtOne() {
#expect(abs(Gain.factor(forVolume: 1) - 1) < 0.0001)
#expect(abs(Gain.factor(forVolume: 0.999) - 1) < 0.01)
}
@Test("Unterhalb von 100 % bleibt die Kennlinie")
func belowOneTheTaperStays() {
// Halber Reglerweg soll halb so laut klingen rund 10 dB.
#expect(abs(Gain.factor(forVolume: 0.5) - 0.316) < 0.01)
}
@Test("Abschalten holt die Lautstärke zurück")
func turningOffPullsVolumeBack() {
// Sonst bliebe ein Programm dreifach verstärkt, während sein Regler am
// rechten Anschlag steht und 100 % anzeigt.
var store = VolumeStore()
store.setOverdrive(true, for: "app")
store.set(3.0, for: "app")
store.setOverdrive(false, for: "app")
#expect(store.volume(for: "app") == 1)
#expect(store.effectiveGain(for: "app") == 1)
}
@Test("Abschalten lässt eine leise Einstellung in Ruhe")
func turningOffKeepsQuietSettings() {
var store = VolumeStore()
store.setOverdrive(true, for: "app")
store.set(0.4, for: "app")
store.setOverdrive(false, for: "app")
#expect(store.volume(for: "app") == 0.4)
}
@Test("Der Overdrive übersteht einen Neustart")
func overdriveSurvivesRestart() {
var store = VolumeStore()
store.setOverdrive(true, for: "app")
store.set(2.5, for: "app")
let restored = VolumeStore(volumes: store.snapshot,
muted: store.mutedIdentifiers,
overdrive: store.overdrivenIdentifiers)
#expect(restored.isOverdriven("app"))
#expect(restored.volume(for: "app") == 2.5)
}
@Test("Ein gespeicherter Wert ohne Overdrive wird zurückgeholt")
func storedValueWithoutOverdriveIsClamped() {
// Aus der Zeit, als der Regler noch ohne Freigabe bis 200 % ging.
let restored = VolumeStore(volumes: ["app": 1.8], muted: [], overdrive: [])
#expect(restored.volume(for: "app") == 1)
}
@Test("Stumm schlägt Overdrive")
func muteWins() {
var store = VolumeStore()
store.setOverdrive(true, for: "app")
store.set(4, for: "app")
store.setMuted(true, for: "app")
#expect(store.effectiveGain(for: "app") == 0)
}
}