Das Mikrofon nur noch auf Knopfdruck

Ein offener Eingangsstrom ist bei Bluetooth-Hörern kein stiller Mitleser.
Gemessen an AirPods Pro:

  vorher    48000 Hz, Gerätelautstärke 0.0
  mit Mikro 24000 Hz, Gerätelautstärke 0.6
  danach    48000 Hz, Gerätelautstärke 0.0

macOS schaltet sie ins Telefonprofil: halbe Abtastrate, und der
Lautstärkeregler des Geräts springt. Die Musik wird hörbar lauter und
schlechter — beim Öffnen des Popovers, und beim Schließen wieder zurück.
Dasselbe passiert, wenn am Telefon eine App das Mikrofon greift.

Das darf nicht passieren, weil jemand ein Lautstärkefenster aufmacht. Der
Mikrofonpegel hängt deshalb an einem Knopf in der Eingabezeile, mit dem
Hinweis im Tooltip, was er auslöst. Beim Schließen des Popovers geht er in
jedem Fall wieder aus.

Der Ausgangspegel bleibt automatisch: der läuft über einen Process Tap und
fasst das Gerät nicht an.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-08-18 09:32:19 +02:00
parent 4dee12e4b9
commit 286d886e9e
3 changed files with 92 additions and 12 deletions

View File

@@ -495,6 +495,9 @@ private struct SystemSection: View {
selected: system.inputDeviceID,
volume: system.inputVolume,
level: system.levels.input,
// Der Mikrofonpegel nur auf Knopfdruck siehe SystemLevels.
metering: MeteringButton(isOn: system.levels.isListeningToInput,
toggle: { system.levels.toggleInputMetering() }),
muted: system.inputMuted,
adjustable: system.inputIsAdjustable,
compact: compact,
@@ -528,6 +531,8 @@ private struct SystemRow: View {
let selected: AudioObjectID
let volume: Double
let level: Double
/// Nur die Eingabezeile hat einen die Ausgabe misst ohne Nebenwirkung.
var metering: MeteringButton?
let muted: Bool
let adjustable: Bool
let compact: Bool
@@ -578,6 +583,7 @@ private struct SystemRow: View {
if adjustable {
SystemVolumeBar(volume: volume, level: level,
isActive: !muted, onChange: onVolume)
if let metering { metering }
Text("\(Int(volume * 100)) %")
.font(Onyx.Font.metricSmall).monospacedDigit()
.foregroundStyle(Onyx.Color.textTertiary)
@@ -598,6 +604,28 @@ private struct SystemRow: View {
}
}
/// Der Knopf, der den Mikrofonpegel anschaltet.
///
/// **Ein Knopf und kein Automatismus**, weil ein offener Eingangsstrom bei
/// Bluetooth-Hörern nicht folgenlos ist: macOS schaltet sie ins Telefonprofil,
/// die Abtastrate halbiert sich und die Wiedergabe wird hörbar lauter. Wer nur
/// die Lautstärke regeln will, hat das nicht bestellt.
struct MeteringButton: View {
let isOn: Bool
let toggle: () -> Void
var body: some View {
Button(action: toggle) {
Image(systemName: isOn ? "waveform.circle.fill" : "waveform.circle")
.font(.system(size: 12))
.frame(width: 14, height: 14)
}
.buttonStyle(.plain)
.foregroundStyle(isOn ? Onyx.Color.accent : Onyx.Color.textTertiary)
.help(Text(isOn ? "mixer.input.meterOff" : "mixer.input.meterOn", bundle: .module))
}
}
/// Wie der Programmregler, nur ohne Verstärkung und ohne Pegel: die
/// Systemlautstärke geht von null bis hundert, mehr gibt Core Audio nicht her.
private struct SystemVolumeBar: View {