fix(iphone-bt): iPhone-Route-Watcher greift wieder — Gegenseite fehlte in Aufnahme
aime-iphone-route.sh v1 hat seit dem Reboot am 29.07. nie gegriffen (0 Zeilen in journalctl -t aime-iphone-route über den ganzen Boot). Zwei Gründe: 1. Die Portnamen waren hartcodiert auf input_FL/input_FR. HFP/mSBC ist mono, die Ports heißen playback_MONO/capture_MONO — der grep matchte nie. 2. Der Guard "micgate.out schon verlinkt -> überspringen" war einmal pro Anruf. WirePlumber legt die HFP-Nodes nicht atomar an, der Uplink erscheint vor der Gegenseite. War bluez_input in genau diesem Durchlauf noch nicht da, wurde die Gegenseite für den ganzen Anruf nicht mehr nachverlinkt. Ein erst mitten im Anruf gesetztes callrec_mix->Uplink wurde ebenso nie entfernt. Folge: Gegenseite -> callmix fehlte (nicht in der Aufnahme, #80/#81 hatten je nur 1 Sprecher) und der Uplink führte den ungegateten Mix statt micgate.out, also wieder das Echo von vor dem Fix am 13.07. v2 ermittelt die Portnamen über pw-link -i/-o und prüft alle drei Links in jedem Durchlauf einzeln nach. link_all legt genau einen Link pro Ziel-Port an: eine Mono-Quelle speist beide Kanäle, eine Stereo-Quelle auf einem Mono-HFP-Port sendet nur FL, weil beide Links in denselben Port summieren würden (+6 dB Uplink). Gegenprobe am echten Anruf steht noch aus.
This commit is contained in:
@@ -3,6 +3,55 @@
|
||||
Chronik der Entwicklungsschritte. **Regel: jede zukünftige Änderung bekommt hier einen Eintrag** (Datum,
|
||||
Was, Warum, betroffene Dateien/Backups).
|
||||
|
||||
## 2026-07-30 — iPhone-Anruf: Gegenseite fehlt in der Aufnahme + Gegenseite hört sich doppelt
|
||||
|
||||
**Ausgangslage (Nutzer):** Ein BT-Telefonat wurde aufgenommen, in der Aufnahme ist nur die Nahseite zu
|
||||
hören; die Gegenseite berichtete zusätzlich, sich selbst stark doppelt zu hören. Der Pfad hatte am
|
||||
2026-07-13 nachweislich funktioniert.
|
||||
|
||||
**Messung:** Aufnahme #80 (13:16, 44 s) → Diarisierung `1 Sprecher` (bekannte Stimme „sascha", cos 0,779);
|
||||
#81 (13:38) ebenso 1 Sprecher. `journalctl -t aime-iphone-route` über den **gesamten** Boot seit
|
||||
2026-07-29 12:15 → `-- No entries --`. Watcher-Prozess lief (PID 1446, 27 h), Service `active`, WirePlumber-
|
||||
Drop-in intakt (`bluez5.roles`, `hfphsp-backend=native`), iPhone `Paired/Bonded/Trusted/Connected = yes`,
|
||||
Profil-Enum bietet `audio-gateway (A2DP Source & HSP/HFP AG)`. Der Nutzer hat die Gegenseite im H390-Headset
|
||||
gehört → die HFP-Nodes **existierten**, der Watcher hat sie nur nicht erkannt.
|
||||
|
||||
**Ursache: eine, mit zwei Symptomen.** `aime-iphone-route.sh` v1 hat nie gegriffen:
|
||||
|
||||
1. *Hartcodierte Portnamen.* Gesucht wurde `bluez_output.<MAC>…:input_FL`. HFP/mSBC ist **mono**, die Ports
|
||||
heißen `playback_MONO`/`capture_MONO` → der `grep` matchte nie, das Script tat buchstäblich nichts.
|
||||
Erklärt die 0 Log-Zeilen.
|
||||
2. *Einmal-Guard.* `if ! pw-link -l "$B" | grep -q micgate.out` übersprang den gesamten Block, sobald
|
||||
micgate einmal verlinkt war. Da WirePlumber die HFP-Nodes **nicht atomar** anlegt (Uplink erscheint
|
||||
typischerweise vor der Gegenseite), blieb `bluez_input` in genau diesem einen Durchlauf leer → die
|
||||
Gegenseite wurde für den ganzen Anruf nie nachverlinkt. Ebenso wurde ein erst mitten im Anruf von
|
||||
WirePlumber gesetztes `callrec_mix → Uplink` nie mehr entfernt.
|
||||
|
||||
Daraus: Gegenseite → `callmix` fehlt → **nicht in der Aufnahme**. Und `callrec_mix → Uplink` bleibt stehen →
|
||||
Uplink führt den ungegateten Mix statt `micgate.out` → **Rückfall auf genau den Echo-Zustand vor dem
|
||||
Fix vom 2026-07-13**.
|
||||
|
||||
**Fix `aime-iphone-route.sh` v2 (`.bak-v1`):** Portnamen werden über `pw-link -i/-o` **ermittelt** statt
|
||||
hartcodiert; neue `link_all`-Hilfsfunktion legt **genau einen Link pro Ziel-Port** (mono-Quelle speist beide
|
||||
Kanäle; Stereo-Quelle auf mono-HFP-Port sendet nur FL — beide zu verlinken würde sie in denselben Port
|
||||
summieren = +6 dB auf dem Uplink). Alle drei Links werden in **jedem** Durchlauf einzeln geprüft und
|
||||
nachgezogen (Takt 2 s → 1 s), das Einmal-Guard ist weg. `logger` schreibt nur bei Zustandswechsel, damit
|
||||
das Journal nicht flutet.
|
||||
|
||||
**Verifiziert:** `bash -n` OK; `link_all` mit gestubbtem `pw-link` gegen alle drei Fälle getestet
|
||||
(stereo→stereo, stereo→mono, mono→stereo) und gegen leere Arrays; Graph nach dem Service-Neustart
|
||||
unverändert bei 32 Links, Script idle ohne HFP-Nodes. **Noch offen: Gegenprobe am echten Anruf** —
|
||||
`journalctl -t aime-iphone-route` muss dann `+micgate` und `+far-end` zeigen.
|
||||
|
||||
**Doku:** Kapitel 06 — Watcher-Sequenzdiagramm auf den Ein-Sekunden-Prüfzyklus umgestellt, Klarstellung
|
||||
dass Gegenseite → Headset von WirePlumber kommt und nicht vom Watcher (das alte Diagramm behauptete das
|
||||
Gegenteil), Kontrollkommando ergänzt.
|
||||
|
||||
**Nebenbefund (offen):** `callrec.service` ist am 2026-07-30 13:39:33 mit `Error: write EPIPE` in
|
||||
`llm.js:84` gestorben (rkllm-Socket beim Schreiben weg), systemd hat neu gestartet (Restart-Counter 1).
|
||||
Der Socket-Write in `llm.js` hat keinen `error`-Handler → unhandled `'error'` event reißt den ganzen
|
||||
Server mit. Die Zusammenfassung von #81 dürfte dadurch fehlen.
|
||||
|
||||
## 2026-07-29 — #79: verlorener Sprecher + magere Zusammenfassung (Vergleich gegen MS Teams)
|
||||
|
||||
**Ausgangslage (Nutzer):** Aufnahme #79 (23-min-Marketing-Jour-fixe) wurde trotz live getippter Namen
|
||||
|
||||
Reference in New Issue
Block a user