Erster Commit: nativer Linux-Port aus macOS-Bytecode
Läuft die Voice Acoustic VA-Remotecontrol (AllDSP AllControl) nativ unter Linux auf echtem wxGTK 3.0 — ohne Wine und ohne dekompilierten App-Code. Ausgeführt wird das unveränderte Python-2.7-Bytecode aus dem macOS-.app; C-Extensions (wxGTK/numpy/ scipy/PortAudio) kommen nativ aus Debian stretch. Enthält: va/ (Original-.pyc + pure-Python-Libs + Assets + launch.py mit den drei Linux-Fixes), Dockerfile/run.sh/entrypoint.sh, reference/ (dekompilierter Quellcode zum Debuggen) und README/STATUS. img.cache (378 MB, regenerierbar) ist per .gitignore ausgeschlossen. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
# 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 Skin-Bitmaps) ist **nicht** im Repo — die App rendert aus den
|
||||
vorhandenen SVGs und baut den Cache bei Bedarf neu (siehe `.gitignore`).
|
||||
|
||||
## 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).
|
||||
Reference in New Issue
Block a user