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,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).
|
||||
Reference in New Issue
Block a user