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:
maik
2026-08-20 19:57:01 +02:00
co-authored by Claude Opus 4.8
commit a7c93fa266
654 changed files with 478133 additions and 0 deletions
+69
View File
@@ -0,0 +1,69 @@
# VA-Remotecontrol — Reverse-Engineering-Notizen
Analyse der `Voice_Acoustic_VA-Remotecontrol_64_bit_v_4_0_1` (Stand 08/2026).
## Was ist das?
Ein Rebrand der **AllDSP „AllControl" DSP-Software** zur Fernsteuerung/Konfiguration
der DSP-Verstärker (HDSP-Serie, Paveosub-…sp, Venia-…sp, PAV115sp usw.).
| Merkmal | Wert |
|---|---|
| Sprache | **Python 2.6** (py2exe-Bundle, 32-bit) |
| GUI | **wxPython / wxWidgets 2.8** (`wx._core_.pyd`, `wxmsw28uh_*_vc.dll`) |
| Numerik | **numpy + scipy** (FIR-Design, RTA-Messungen, PDF-Report) |
| Bootstrap-EXE | `VA-Remotecontrol.exe` (enthält angehängtes ZIP mit 904 `.pyc`) |
| MSVC-Runtime | **VC++2008 / msvcr90** (nicht gebundlet → unter Wine `vcrun2008`) |
| Lizenz-Dongle | **keiner** (`keyfile.py` = statischer Preset-Encryption-Key) |
## Ordner im Installat
- `src/`**dekompilierter App-Quellcode** (47 Module, s.u.) ← zum Analysieren
- `pycode/` — die 904 rohen `.pyc` (App + komplette Py2.6-Standardbibliothek)
- `*.pyd`,`*.dll`— native Extension-Module (numpy/scipy/wx/pywin32) + Python-Runtime
- `factory/` — Werks-Presets/Firmware `.ffi` je Produkt (HDSP-3/-6, Paveosub-112/115/118/218sp, Venia-8sp, PAV115sp-8K4 …)
- `configurations/` — DSP-Struktur-Definitionen `.cfg` + `.csv` (DPD2, DPCP88, DPD3 …)
- `dfi/` — Geräte-/Frontplatten-Layouts `.dfi/.dfu/.dfe`
- `skins/` — SVG-Bedienpanels (das UI wird aus SVGs aufgebaut, s. `svg_panel.py`)
- `local/` — Sprachdateien (deutsch, english, mandarin, nederlands, polish, portuguese, spanish, …)
- `drivers/` — Windows-USB-Treiber `adspusb.inf/.cat`
## Modul-Landkarte (`src/`)
**Einstieg**
- `main.py` → ruft `one_unit.main_application(argv).start()`
- `one_unit.py` (3.7k Z.) — Haupt-App/Fenster; `child_unit.py`, `select_unit*` — Geräteauswahl/-instanzen
- `countDSPs.py` — zählt/erkennt angeschlossene DSPs
**Kommunikation zu den Verstärkern** (der interessante Teil)
- `d_protocol.py` — Wire-Protokoll (nutzt `struct`, `socket`, `myserial`, `zipfile`)
- `d_usb.py` — findet USB-Geräte per **WMI**, Filter auf **`VID_0684` (= AllDSP GmbH)**, mappt auf COM-Port
- `d_ethernet.py` — TCP/IP-Transport (`socket`)
- `d_keepalive.py`, `d_bootloader.py` — Verbindung halten / Firmware-Flash
- `protocol.py`, `server.py` — höhere Protokoll-/Serverschicht
- `network_settings.py`, `network_graphical.py`, `network_customized.py` — Multi-Device-Netz
> **Transport = USB-Seriell (virtueller COM-Port) ODER Ethernet.** Kein FTDI-D2XX,
> sondern klassisch über COM (`myserial` = pyserial-Wrapper).
**GUI / DSP-Bedienung**
- `svg_panel.py` — rendert Bedienoberflächen aus SVG
- `control_panel.py`, `diagram.py` (EQ/Filterkurven), `my_menu.py`, `dialog.py`, `fir_dialog.py`, `MyOGLlike.py` (OpenGL-Canvas)
- `user_config_*.py` — die einzelnen DSP-Blöcke: `audio, dc, display, keys, leds, model, network, tcs, timer, various, vu`
- `rta_measurements.py` (Echtzeit-Analyzer, nutzt PortAudio/`pyaudio`), `record.py`, `makePDF.py`
**Daten**
- `data_model.py`, `definitions.py` — Datenmodell / Konstanten (STRUCT_ID_GAIN/DELAY/LPF/HPF/PEQ/LIMITER/…)
- `keyfile.py`**nur** `preset_encryption_key` (Presets sind verschlüsselt; keine Lizenzprüfung)
## Für Linux/Docker relevante Stolpersteine
1. **Crypto:** Py2.6 `random.seed()``os.urandom` → Windows-CryptoAPI. Im Wine-Prefix
muss `rsaenh.dll` registriert sein (`regsvr32 rsaenh.dll`), sonst Crash `0x80090017`.
→ ist im Docker-Image gefixt.
2. **USB-Erkennung via WMI** (`d_usb.ListUSBDevices`, `Win32_USBControllerDevice`): funktioniert
unter Wine praktisch nicht. → Gerät stattdessen als **COM-Port** durchreichen
(`/dev/ttyUSB0``dosdevices/com1`) und in der App den COM-Port **manuell** wählen,
oder die **Ethernet-Anbindung** nutzen (umgeht das USB/WMI-Problem komplett).
3. **RTA-Messung** braucht Audio-I/O (PortAudio) — im Container nur mit ALSA/Pulse-Durchreichung.
## Wie der Quellcode entstand
- `.pyc` aus dem an `VA-Remotecontrol.exe` angehängten ZIP extrahiert.
- Dekompiliert mit **uncompyle6** (42 Module); die 5 komplexeren mit **pycdc/Decompyle++**
(Kopf-Kommentar „NOTE: mit pycdc…" → dort ggf. kleinere Ungenauigkeiten prüfen).