Files
VA-Control-for-linux/README.md
T
maikandClaude Opus 4.8 dbc60c7504 Fix: img.cache gehört ins Repo (Control-Panel-Bitmaps) + EQ-Koordinatenpfad
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>
2026-08-20 20:31:13 +02:00

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.
![Native GUI unter Linux](screenshot-native.png)
## 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).