# 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).