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>
This commit is contained in:
@@ -56,6 +56,7 @@ public final class AudioMixer {
|
||||
private enum Keys {
|
||||
static let volumes = "onyx.audio.volumes"
|
||||
static let muted = "onyx.audio.muted"
|
||||
static let overdrive = "onyx.audio.overdrive"
|
||||
static let managed = "onyx.audio.managed"
|
||||
static let autostart = "onyx.audio.autostart"
|
||||
}
|
||||
@@ -64,7 +65,8 @@ public final class AudioMixer {
|
||||
self.defaults = defaults
|
||||
let volumes = defaults.dictionary(forKey: Keys.volumes) as? [String: Double] ?? [:]
|
||||
let muted = defaults.stringArray(forKey: Keys.muted) ?? []
|
||||
store = VolumeStore(volumes: volumes, muted: muted)
|
||||
let overdrive = defaults.stringArray(forKey: Keys.overdrive) ?? []
|
||||
store = VolumeStore(volumes: volumes, muted: muted, overdrive: overdrive)
|
||||
// Beim Laden aussieben statt nur beim Anzeigen: hat sich der Mixer
|
||||
// einmal selbst in die Auswahl geschrieben, säße die Rückkopplung sonst
|
||||
// dauerhaft in den Einstellungen und käme bei jedem Start zurück.
|
||||
@@ -295,6 +297,18 @@ public final class AudioMixer {
|
||||
|
||||
public func volume(for bundleID: String) -> Double { store.volume(for: bundleID) }
|
||||
public func isMuted(_ bundleID: String) -> Bool { store.isMuted(for: bundleID) }
|
||||
public func isOverdriven(_ bundleID: String) -> Bool { store.isOverdriven(bundleID) }
|
||||
|
||||
/// Gibt den Bereich über 100 % frei — je Programm, nicht für alle.
|
||||
///
|
||||
/// Ein Browser braucht ihn für eine leise Konferenz, die Musik daneben
|
||||
/// nicht. Und ein Regler, der überall bis 400 % geht, führt genau dorthin,
|
||||
/// wo man ihn nicht haben will.
|
||||
public func setOverdrive(_ isOn: Bool, for bundleID: String) {
|
||||
store.setOverdrive(isOn, for: bundleID)
|
||||
applyGain(for: bundleID)
|
||||
persist()
|
||||
}
|
||||
|
||||
public func setVolume(_ volume: Double, for bundleID: String) {
|
||||
store.set(volume, for: bundleID)
|
||||
@@ -325,6 +339,7 @@ public final class AudioMixer {
|
||||
private func persist() {
|
||||
defaults.set(store.snapshot, forKey: Keys.volumes)
|
||||
defaults.set(store.mutedIdentifiers, forKey: Keys.muted)
|
||||
defaults.set(store.overdrivenIdentifiers, forKey: Keys.overdrive)
|
||||
defaults.set(Array(managed), forKey: Keys.managed)
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user