Files
onyx/Packages/OnyxKit/Tests/AudioProviderTests/MixerExclusionTests.swift
Scarriffle d001e439a6 Mixer war still: er hat sich selbst abgegriffen
Der Mixer gibt den Ton der bearbeiteten Programme selbst aus — und steht damit
als Tonquelle in seiner eigenen Liste. Eine Zeile wird geregelt, sobald man ihren
Regler anfasst. Ein Klick auf Onyx' eigene Zeile genügte also.

Der Selbst-Tap läuft wie jeder andere mit mutedWhenTapped und schaltet damit
Onyx' gesamte Ausgabe stumm — die Wiedergabe *aller* bearbeiteten Programme.
Völlige Stille, während die Pegelanzeigen weiter ausschlagen, weil die Taps ja
Signal bekommen. Und der Zustand stand in den Einstellungen, überlebte also
jeden Neustart.

Gemessen (Spikes/mixer-path-probe.swift): Onyx' Ausgabepegel klettert von 0,388
auf 2,833, sobald er sich selbst bearbeitet. Der Weg an sich ist in Ordnung —
Tap, Aggregate-Gerät und IOProc liefern einzeln wie zu dritt volle Pegel, das
war der Hauptverdacht und ist widerlegt.

Onyx erscheint jetzt nicht mehr in der eigenen Liste, lässt sich nicht auswählen,
und ein gespeicherter Eintrag wird beim Laden entfernt und zurückgeschrieben.

Dazu ein zweiter Fund aus derselben Ecke: setVolume und setMuted griffen auf
taps[bundleID] zu. Die Taps liegen aber unter Kennung#Prozessnummer, weil ein
Programm mehrere Tonquellen haben kann — der Zugriff ging immer ins Leere. Der
Regler wirkte erst, wenn die Auffrischung drei Sekunden später nachzog.

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

41 lines
1.7 KiB
Swift

import Testing
@testable import AudioProvider
@Suite("Wer nicht in den Mixer gehört")
struct MixerExclusionTests {
private let own = "com.scarriffleservices.onyx"
@Test("Onyx taucht in seiner eigenen Liste nicht auf")
func ownProcessIsHidden() {
// Der Mixer gibt den Ton der bearbeiteten Programme selbst aus und wird
// dadurch zur Tonquelle. Stünde er in der eigenen Liste, ließe er sich
// abgreifen und hörte seine eigene Ausgabe wieder mit.
#expect(ProcessVisibility.isExcluded(bundleID: own, ownBundleID: own))
}
@Test("Fremde Programme bleiben sichtbar")
func othersRemain() {
for bundleID in ["com.google.Chrome", "org.mozilla.firefox",
"com.spotify.client", "com.apple.Music"] {
#expect(!ProcessVisibility.isExcluded(bundleID: bundleID, ownBundleID: own))
}
}
@Test("Systemdienste bleiben draußen")
func systemServicesStayOut() {
#expect(ProcessVisibility.isExcluded(bundleID: "com.apple.audio.coreaudiod",
ownBundleID: own))
#expect(ProcessVisibility.isExcluded(bundleID: "com.apple.coremedia",
ownBundleID: own))
}
@Test("Ohne eigene Kennung wird nichts fälschlich ausgeschlossen")
func missingOwnIdentifierExcludesNothingExtra() {
// Im Test gibt es kein App-Bundle. Das darf nicht dazu führen, dass
// plötzlich Programme mit leerer Kennung verschwinden.
#expect(!ProcessVisibility.isExcluded(bundleID: "com.google.Chrome", ownBundleID: nil))
#expect(!ProcessVisibility.isExcluded(bundleID: "", ownBundleID: ""))
}
}