img.cache (~378 MB) sind die vor-gerenderten Button-/Status-Bitmaps der Control-Panels und NICHT regenerierbar (keine PNG-Quellen). Ohne sie bricht das Panel mit "Failed to get image ..." (z.B. cs_in3_off). Waren versehentlich per .gitignore ausgeschlossen -> zurück ins Repo. Zusätzlich: VA_SVG_WINPATH deckt jetzt auch diagram.py ab, damit der EQ nicht auf negatives Y (außerhalb des Panels) positioniert wird. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
106 lines
5.0 KiB
Markdown
106 lines
5.0 KiB
Markdown
# VA-Control for Linux
|
|
|
|
Nativer Linux-Port der **Voice Acoustic VA-Remotecontrol** (technisch = *AllDSP „AllControl"
|
|
DSP-Software*) zur Fernsteuerung/Konfiguration der DSP-Verstärker (HDSP-Serie, Paveosub-…sp,
|
|
Venia-…sp, PAV115sp …).
|
|
|
|
**Kein Wine. Kein dekompilierter App-Code.** Es läuft das **unveränderte, originale
|
|
Python-2.7-Bytecode aus dem macOS-`.app`** direkt auf einem Linux-CPython-2.7 mit nativem
|
|
wxGTK/numpy/scipy.
|
|
|
|

|
|
|
|
## Warum dieser Weg
|
|
|
|
CPython-**Bytecode ist plattformunabhängig** — er hängt nur an der Python-*Version* (2.7), nicht
|
|
am Betriebssystem. Das macOS-Bundle liefert die App-Module (`one_unit`, `child_unit`, …) als
|
|
originale `.pyc`. Die laufen unter Linux direkt weiter; nur die C-Extensions (wxWidgets, numpy,
|
|
scipy, PortAudio) kommen nativ aus dem Distro.
|
|
|
|
Das umgeht beide Sackgassen der bisherigen Versuche:
|
|
- **Wine** rendert die App nur als schwarzes Fenster (wxWidgets/`CreateActCtx`-Probleme).
|
|
- Ein **dekompilierter** Port scheiterte, weil `one_unit`/`child_unit` (Py2.6-Bytecode) sich nicht
|
|
sauber dekompilieren lassen — und geratener Code, der echte Limiter/Verstärker steuert, ist ein
|
|
No-Go. Hier läuft **korrektes Original-Bytecode**, kein Rateanteil.
|
|
|
|
## Voraussetzungen
|
|
|
|
- Docker (oder Podman)
|
|
- Ein X11-/Wayland-Desktop (für die GUI)
|
|
- Zugang zu `archive.debian.org` beim Build (Debian stretch ist EOL)
|
|
|
|
## Build
|
|
|
|
```bash
|
|
docker build -t va-remotecontrol:native-mac .
|
|
```
|
|
|
|
Das Image basiert auf **Debian stretch** (letzte Distribution mit `python-wxgtk3.0` für Python 2)
|
|
und installiert wxGTK 3.0, numpy, scipy, pyserial, pyaudio, PIL aus dem Archiv.
|
|
|
|
## Start
|
|
|
|
```bash
|
|
./run.sh # GUI + Ethernet-Amps (Host-Netz)
|
|
SERIAL_DEV=/dev/ttyUSB0 ./run.sh # zusätzlich seriell/COM
|
|
NET=bridge ./run.sh # ohne Host-Netz (keine LAN-Amps)
|
|
```
|
|
|
|
`run.sh` gibt das Host-X11 frei, setzt `--ipc=host` (gegen X-SHM-Fehler unter XWayland) und reicht
|
|
optional den seriellen Port durch.
|
|
|
|
## Verbindung zu den Verstärkern
|
|
|
|
Die App spricht die DSPs über **Ethernet** oder **seriellen COM-Port** an:
|
|
|
|
- **Ethernet (empfohlen):** `run.sh` nutzt `--network host`, d. h. das Container erreicht dein LAN
|
|
direkt (auch UDP-Discovery/Broadcast). In der App die Netzwerk-/Ethernet-Verbindung wählen.
|
|
- **USB/seriell:** Die USB-Auto-Erkennung nutzt Windows-WMI (auf Linux gestubbt → leer). Gerät als
|
|
COM-Port durchreichen (`SERIAL_DEV=/dev/ttyUSB0`) und in der App den Port **manuell** wählen.
|
|
|
|
## Die Linux-Fixes (in `va/launch.py`, non-invasiv — kein Bytecode-Patch)
|
|
|
|
Der Start läuft über `va/launch.py` statt über den macOS-py2app-Bootstrap. Dort sitzen drei kleine
|
|
Kompatibilitäts-Fixes, weil die App Linux (`os.name='posix'`) wie einen **Mac** behandelt
|
|
(`mac_names='posix'`):
|
|
|
|
1. **`platform.version()`** beginnt unter Linux mit `#…` → `int('#')` in einer Windows-
|
|
Versionsprüfung crasht (und deaktiviert dabei RTA). Wird auf einen Windows-artigen String
|
|
gemappt.
|
|
2. **wx-Assertions → `SUPPRESS`**: diese wxGTK-Build wirft C++-Assertions als Python-Exceptions;
|
|
sonst crasht wxPythons eigenes `flatmenu`. Auf Release-/Mac-wx sind sie unterdrückt.
|
|
3. **`my_MenuBar.left_down`**: wird nur im Nicht-Mac-Zweig gesetzt → Klassen-Default ergänzt.
|
|
|
|
## Bekannte Punkte
|
|
|
|
- **Fader lassen sich nicht ziehen?** Die SVG-Regler haben einen Mac- und einen Windows-
|
|
Koordinatenpfad; Linux nimmt fälschlich den Mac-Pfad (Y gespiegelt/versetzt). **Experimentell:**
|
|
mit `VA_SVG_WINPATH=1 ./run.sh` erzwingt man den Windows-Pfad. Siehe `STATUS.md`.
|
|
- **RTA-Messung (Mikrofon)** braucht Audio-Durchreichung (ALSA/Pulse) in den Container.
|
|
- **`img.cache`** (vor-gerenderte Button-/Status-Bitmaps der Control-Panels, ~378 MB) ist
|
|
**notwendige Laufzeitdaten** und im Repo enthalten — es gibt keine PNG-Quellen, aus denen sie
|
|
regeneriert werden könnten. Fehlen sie, meldet die App `Failed to get image …`.
|
|
|
|
## Aufbau
|
|
|
|
```
|
|
va/ Lauffähiger App-Baum: Original-macOS-.pyc + pure-Python-Libs + Assets
|
|
launch.py Start-Wrapper mit den Linux-Fixes
|
|
one_unit.pyc … App-Module (Original-Bytecode, Python 2.7)
|
|
win32*.py … Linux-Stubs für die wenigen Windows-APIs
|
|
skins/ dfi/ … SVG-Bedienpanels, Geräte-Layouts, Factory-Presets, Sprachen
|
|
Dockerfile Debian stretch + wxGTK3.0/numpy/scipy/… via archive.debian.org
|
|
run.sh Start mit X11 + Netz + optional seriell
|
|
entrypoint.sh Container-Entrypoint
|
|
reference/ Dekompilierter Quellcode (nur zum Lesen/Debuggen) + ARCHITEKTUR.md
|
|
```
|
|
|
|
## Herkunft
|
|
|
|
Der `va/`-Baum stammt aus `Voice Acoustic VA-Remotecontrol.app` (macOS, Version 4.0.1, py2app,
|
|
Python 2.7.10, wxPython 3.0.3). Nur die reinen `.pyc` (App + pure-Python-Libs) wurden übernommen;
|
|
die macOS-`.so`/`.dylib` wurden weggelassen und durch native Linux-Builds ersetzt.
|
|
|
|
`reference/decompiled/` enthält den aus dem **Windows**-Build (Py2.6) dekompilierten Quellcode —
|
|
funktional dieselbe App, unverzichtbar zum Debuggen der `.pyc` (z. B. der Fader-Analyse oben).
|