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>
41 lines
1.7 KiB
Swift
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: ""))
|
|
}
|
|
}
|