diff --git a/docs/04-fahrplan.md b/docs/04-fahrplan.md index 9a48c12..1d37d81 100644 --- a/docs/04-fahrplan.md +++ b/docs/04-fahrplan.md @@ -32,11 +32,11 @@ Jeder Meilenstein endet mit einem Abnahmetest. Erst wenn er bestanden ist, begin - **Abnahme:** 4 Stunden, 2 Quellen, 2 Bildschirme auf dem Mac mini 2018 – keine sichtbaren Aussetzer, CPU-Last notiert, verlorene Frames < 0,1 %. ## M2 – Ton-Matrix -- [ ] NDI-Ton einer Quelle auf beliebige Ausgangskanäle (z. B. MOTU M2 Out 2) -- [ ] Reiner Audio-Empfang (ohne Video-Bandbreite) -- [ ] Mikrofon-Eingang (Headset) auf Kanal (Out 1), Sprechtaste (Tastenkürzel, gedrückt halten / umschalten) -- [ ] Pegelanzeige, Gain, Mute je Route -- [ ] Drift-Ausgleich zwischen NDI-Takt und Interface-Takt +- [x] NDI-Ton einer Quelle auf beliebige Ausgangskanäle (z. B. MOTU M2 Out 2) +- [x] Reiner Audio-Empfang (ohne Video-Bandbreite) +- [x] Mikrofon-Eingang (Headset) auf Kanal (Out 1), Sprechtaste (Tastenkürzel, gedrückt halten / umschalten) +- [x] Pegelanzeige, Gain, Mute je Route +- [x] Drift-Ausgleich zwischen NDI-Takt und Interface-Takt - **Abnahme:** 4 Stunden ohne Knacksen und ohne hörbaren Versatz; Sprechtaste reagiert ohne Verzögerung. ## M3 – Szenen und Fernsteuerung @@ -78,3 +78,18 @@ _(nach jedem Meilenstein ergänzen)_ - Hardened Runtime + Ad-hoc-Signatur → dyld lehnt die eingebettete `libndi.dylib` ab („different Team IDs“). Vorerst aus; mit echter Team-ID für die Notarisierung wieder einschalten. - Mac mini im Leerlauf mit Quellensuche: ca. 2 % CPU, ca. 52 MB RAM. - Mac mini ist per SSH erreichbar (Entfernte Anmeldung + Bildschirmfreigabe): App per `scp` verteilen, Quarantäne entfernen, Logs mit `log stream` mitlesen. + +### M1 – Bild (umgesetzt 2026-10-21, Abnahme offen) +- „NDI Test Patterns“ sendet ein Standbild nur einmal. Eine gehaltene NDI-Verbindung zählt deshalb als lebendig; neu verbunden wird nur, wenn Frames **und** Verbindung fehlen. +- Volles NDI 1080p50 mit bewegtem Bild: ~128 Mbit/s, ~50 % eines Kerns auf dem Mac mini – fast nur NDI-Empfang/Dekodierung. HX3 (ZowieBox) noch zu messen. +- Verlorene Frames können vom **Sender** kommen: OBS auf dem Mac Studio ließ Frames aus, während dort Release-Builds liefen (~335 Frames in 6 min). Für Langzeittests darf auf dem Sender nichts Schweres laufen. +- Mauszeiger über Ausgaben per `NSCursor.hide/unhide` (gezählt, ausbalanciert), nicht `setHiddenUntilMouseMoves`. + +### M2 – Ton-Matrix (umgesetzt 2026-10-21, Langzeittest offen) +- Core Audio direkt (AUHAL je Gerät) statt `AVAudioEngine`: einzelne Kanäle beschreiben, mehrere Quellen pro Kanal mischen, Render-Callback garantiert ohne Allokation. +- Lock-freier Ringpuffer in C (`stdatomic`), weil Swifts `Atomic` erst ab macOS 15 verfügbar ist. +- NDI liefert beim Verbinden einen Rückstau (~140 ms). Nach dem Vorfüllen wird einmalig auf die Ziel-Latenz gekürzt, sonst startet der Ton mit zu viel Verzögerung. +- OBS/DistroAV sendet Audio in 1024er-Blöcken mit bis zu ~36 ms Lücke. 50 ms Puffer gaben vereinzelte Unterläufe → NDI-Routen 80 ms, Mikro-Routen 12 ms. +- Drift-Regler langsam auslegen (Sekunden): der Füllstand ist durch die Blöcke ein Sägezahn. Im Betrieb ±150 ppm Korrektur, 0 Aussetzer in 2 min auf MOTU Out 2, CPU 0,3 %. +- Entfernte Routen werden 2 s auf dem Main Thread geparkt, damit der Render-Thread nie den letzten Verweis loslässt (sonst `free` im Callback). +- Sprechtaste global per Carbon-Hotkey (⌃⌥ Leertaste) – braucht keine Bedienungshilfen-Freigabe und meldet Drücken und Loslassen. diff --git a/docs/05-testplan-hardware.md b/docs/05-testplan-hardware.md index 3343089..71c083f 100644 --- a/docs/05-testplan-hardware.md +++ b/docs/05-testplan-hardware.md @@ -31,13 +31,18 @@ Sobald die bestellte Hardware da ist, wird der echte Aufbau zu Hause nachgestell - [x] M0: App auf Mac mini 2018 kopieren, per Rechtsklick → Öffnen starten (ad-hoc signiert, Gatekeeper fragt); Rückfrage „Lokales Netzwerk“ erlauben - [x] M0: NDI Tools Test Patterns (oder OBS + DistroAV) auf einem anderen Gerät starten → Quelle erscheint auf beiden Macs in der Quellenliste -- [ ] M1 Langzeittest (Build `m1-candidate`, ohne ZowieBoxen): OBS sendet „pgm“ (1080p50, volles NDI, bewegtes Bild), Test Patterns als zweite Quelle. Start per SSH vom Mac Studio: +- [ ] M1 Langzeittest (Build `m1-candidate` oder neuer, ohne ZowieBoxen): OBS sendet „pgm“ (1080p50, volles NDI, bewegtes Bild), Test Patterns als zweite Quelle. Start per SSH vom Mac Studio: `ssh samuelzielke@10.0.100.76 'open ~/Applications/Musubi.app --args --route "MACSTUDONSAMUEL (pgm)=1" --route "MACSTUDONSAMUEL (Test Patterns)=0"'` Nach 4 h: `~/Library/Logs/Musubi/stats-.csv` auswerten (Verlustrate < 0,1 %, CPU-Verlauf, keine `stalled`-Zeilen ohne Ursache). - [ ] M1: Neu verbinden: NDI-Ausgang in OBS 10 s stoppen → Bild kommt von selbst zurück, Karte zeigt „… antwortet nicht mehr. Neuer Versuch in … s.“ - [ ] M1: Esc auf einer Ausgabe schließt sie, Bildschirm springt auf vorige Frequenz zurück - [ ] M1: Mac mini zeigt PGM + Multiview 4 h ohne Aussetzer; CPU-Last: ___ % - [ ] M1: Latenz Multiview messen (Uhr mit Millisekunden vor Kamera → ATEM → ZowieBox → Musubi): ___ ms +- [ ] M2 Langzeittest (4 h, MOTU M2 am Regie-Mac): OBS-Ton als Quelle, Start mit + `open Musubi.app --args --audio-route "ndi:MACSTUDONSAMUEL (pgm)=M2:2"`, Headset per Ansicht „Ton“ auf Out 1. + Danach `~/Library/Logs/Musubi/audio-.csv` auswerten: Spalte `dropouts` bleibt 0, `peak_dbfs` zeigt Signal. Auf dem Sender (OBS) nichts Schweres laufen lassen. +- [ ] M2: Sprechtaste (⌃⌥ Leertaste, gedrückt halten und umschalten) – Ton auf Out 1 ohne spürbare Verzögerung, Knopf rot nur während des Sprechens +- [ ] M2: MOTU während des Betriebs abziehen und wieder anstecken → Ton kommt von selbst zurück - [ ] M2: PGM-Ton über M2 Out 2 → Ui12 Kanal 4; Talkback M2 Out 1 → Ui12 Kanal 3 (nur Aux 2) - [ ] M3: Szene „OP-Live“ übersteht Neustart beider Macs - [ ] M4/M5: Handy über zweite Schnittstelle: Hören, Sprechen, Vorschau