DMXRouter 1.5.6
🍎 macOS Installation Note
If you see a message stating that "DMXRouter is damaged and can’t be opened", this is a security restriction from macOS Gatekeeper on non-notarized apps. To fix this, move the app to your /Applications folder and run these two commands in your Terminal:
- Remove the quarantine flag:
sudo xattr -rd com.apple.quarantine /Applications/DMXRouter.app
- Re-sign the app locally:
sudo codesign --force --deep --sign - /Applications/DMXRouter.app
Note: These steps are required because DMXRouter now uses the native SystemConfiguration framework to manage IPs and VLANs. macOS requires a local signature to grant the app permission to interact with these system-level network APIs.
macOS — Native Network Stack
All network management on macOS has been migrated from command-line tools (networksetup) to Apple's native SystemConfiguration framework — the same API used by System Settings → Network
Interface names throughout the application (Interfaces tab, engine dropdowns, Show Cue selectors, VLAN Manager) now resolve correctly for all interface types — physical adapters, VLANs, bridges, and bonds. The "Physical NIC" dropdown in the VLAN Manager shows friendly names like Thunderbolt Ethernet (en4) instead of raw device names.
Set IP and Set DHCP on VLAN interfaces now work reliably. The previous shell-based approach failed silently on VLANs because macOS could not resolve the service name. The new implementation writes directly to the system network preferences via SCPreferencesCreateWithAuthorization, the same mechanism used by System Settings. Write operations (Set IP, Set DHCP) still prompt for your administrator password; read operations (checking DHCP state) require no elevation.
Interface type detection now uses SCNetworkInterfaceGetInterfaceType() to filter WiFi, Bluetooth, modem, and mobile data adapters. This replaces QNetworkInterface::type(), which incorrectly reports AirPort adapters as Ethernet on some macOS versions.
Windows and Linux are unaffected by these changes — they continue using their existing PowerShell / nmcli paths.
macOS — Performance
App Nap prevention. DMXRouter now holds a runtime activity token (NSActivityLatencyCritical) that prevents macOS from throttling timers and network I/O when the window is in the background or occluded. The NSAppSleepDisabled Info.plist key was already present but can be overridden by the system; the runtime token is the authoritative mechanism used by professional audio and lighting applications. The display is still allowed to sleep when idle. You can verify the protection in Activity Monitor → App Nap column: DMXRouter should always show "No".
Ad-hoc code signing. The macOS build now includes automatic ad-hoc code signing as a post-build step, giving the app a stable identity so the firewall only prompts once on first launch instead of on every run.
Firewall warning. When the macOS Application Layer Firewall (ALF) is enabled, DMXRouter now shows a warning at startup recommending to disable it. This is a known macOS limitation that affects all high-packet-rate UDP applications — lighting control, professional audio, amateur radio, and network capture tools like Wireshark all suffer from it. Even with an app explicitly allowed as an exception (and even with a full Apple Developer ID signature), the kernel-level socket filter (com.apple.nke.applicationfirewall) inspects every incoming UDP packet, adding latency and CPU overhead that is incompatible with real-time DMX control at 44 packets/second per universe.
There is no workaround within the ALF — neither ad-hoc signing, Developer ID signing, nor firewall exception rules eliminate the per-packet inspection overhead. Two options are available:
Option 1 — Disable ALF (recommended for dedicated lighting machines on isolated production networks):
System Settings → Network → Firewall → switch OFF.
Option 2 — Replace ALF with PF (for machines on shared or internet-connected networks that need firewall protection):
Disable ALF as above, then enable macOS's built-in Packet Filter (pfctl), which operates at network level (like iptables/nftables on Linux) without per-socket overhead. Example PF rules for a lighting machine:
# /etc/pf.conf — allow Art-Net and sACN, block everything else inbound
pass in proto udp from any to any port {6454, 5568}
pass in proto udp from any to any port 5569:5668
block in all
Enable with: sudo pfctl -e -f /etc/pf.conf
PF provides proper firewall protection without the performance penalty of ALF's application-layer socket filter.
The startup warning can be dismissed permanently.
Network Interface Hotplug Detection
DMXRouter now detects network changes in real time on all three platforms. Plugging in a USB-Ethernet adapter, disconnecting a cable, changing an IP from the OS network settings, or creating a VLAN from an external tool will automatically update the interface list — no need to click Refresh.
Each platform uses its native push-notification mechanism:
- Linux — netlink socket subscribed to link and IPv4 address events, integrated into Qt's event loop.
- macOS —
SCDynamicStoremonitoring all network interface and IPv4 state changes. - Windows —
NotifyAddrChangeon a dedicated worker thread with clean shutdown support.
Events arrive in bursts (link down → IP removed → link up → DHCP assigned), so a 500ms debounce timer collapses them into a single interface refresh.
RDM Emulator
Device Hours and Power Cycles are now editable in the detail panel and in the Create/Edit Profile dialog.
Extended PID support. The emulator now responds to GET and SET for all standard RDM configuration parameters, allowing you to test template apply workflows end-to-end against emulated devices:
- Display —
DISPLAY_INVERT(0x0500),DISPLAY_LEVEL(0x0501) - Lamp —
LAMP_STATE(0x0403),LAMP_ON_MODE(0x0404) - Pan/Tilt —
PAN_INVERT(0x0600),TILT_INVERT(0x0601),PAN_TILT_SWAP(0x0602) - Power —
POWER_STATE(0x1010) - Dimmer (E1.37-1) —
CURVE(0x0343),OUTPUT_RESPONSE_TIME(0x0345),MODULATION_FREQUENCY(0x0347),MINIMUM_LEVEL(0x0341),MAXIMUM_LEVEL(0x0342) - DMX behavior —
DMX_FAIL_MODE(0x0141),DMX_STARTUP_MODE(0x0142)
All PIDs are advertised in SUPPORTED_PARAMETERS, persisted to JSON, and initialized with sensible defaults (e.g., 4 dimmer curves, 3 response time settings, 3 modulation frequencies). SET operations validate range and return NR_DATA_OUT_OF_RANGE for invalid values.
RDM Templates — Extended Settings
The template system now supports all standard RDM SET parameters. Clicking the "N params ▸" button in the Settings column opens a dialog with grouped controls:
- Display — Display Invert (Off / On / Auto), Display Level (0–255)
- Lamp — Lamp On Mode (Off / DMX / On / After-Cal), Lamp State (Off / On / Strike / Standby)
- Pan / Tilt — Pan Invert, Tilt Invert, Pan/Tilt Swap
- Power — Power State (Full On / Shutdown / Standby / Normal)
- Dimmer (E1.37-1) — Curve index, Output Response Time index, Modulation Frequency index, Minimum Level, Maximum Level. When a matching device has been discovered, the spin boxes show the device's supported range and current value in the tooltip. Minimum Level prevents LED flicker at low intensities; Maximum Level caps output for audience safety or power control.
- DMX Behavior (E1.37-1) — DMX Fail Mode (Hold Last Look / Full Off), DMX Startup Mode (Hold Last Look / Full Off). Controls what the fixture does when it loses DMX signal and what it does on power-up before DMX arrives — critical for safety in permanent installations.
All settings use the standard "— (not set)" convention — only parameters you explicitly configure are sent to the device. Templates are applied via the existing "Apply to Selected" button or automatically on discovery when auto-apply is enabled.
RDM Alert Identify
A new "Identify fixtures on alert" toggle in the Templates tab enables automatic RDM Identify for fixtures that have a problem. When enabled, DMXRouter sends IDENTIFY_DEVICE ON to any fixture that meets either of these conditions:
- Firmware mismatch — the fixture's software version doesn't match the version stored in its template
- Lamp hours exceeded — the fixture's lamp hours exceed the limit defined in its template
The fixture flashes on the rig, letting the technician spot it without looking at the screen. This is especially useful during pre-show checks in large rigs where visually scanning for problems on a monitor isn't practical.
When a template has a lamp hours limit configured, DMXRouter now automatically fetches hours PIDs (Device Hours, Lamp Hours, Lamp Strikes, Power Cycles) immediately after the basic probe completes. Previously, lamp hours were only available after a manual extended fetch (double-click or button), which meant the alert system was effectively inactive unless the user intervened. The auto-fetch adds only 4 lightweight RDM requests (~200ms of bus time) per fixture — not the full extended fetch which includes personalities, slots, and sensors.
Identify is sent once per device per session — toggling RDM off and on, or clearing the device list, resets the tracking so alerts are re-evaluated on the next probe. The identify stays on until the technician turns it off manually (right-click → Identify Off, or via the Info tab). The setting persists across sessions.
The feature can also be toggled from the DMX Remote Control main channel: value 64–71 enables alert identify, value 72–79 disables it. This allows a technician to activate pre-show fixture checks from the desk without touching the DMXRouter interface. The checkbox in the Templates tab stays in sync with remote changes.
Fixture Database — CSV Auto-Export
The fixture database can now automatically mirror its contents to a CSV file every time it changes. In the Fixture DB tab, click Browse to select a CSV file path — it can be on a network drive, shared folder, or cloud-synced directory. Click Disable to stop auto-exporting. The setting persists across sessions.
The internal database remains in JSON format for full fidelity (snapshots, history, timestamps). The CSV mirror provides a simple, flat view suitable for external tools: one row per fixture with UID, manufacturer, model, label, latest hours readings, and last-seen timestamp. Any spreadsheet, CMMS, or inventory system that can read CSV gets a live view of the fixture fleet — updated in real time as devices are discovered and hours snapshots are recorded.
sACN Monitor Range
The default sACN monitor range has been increased from 64 to 1024 universes. Previously, only sACN universes 1–64 were joined for multicast reception by default — universes beyond that range were silently dropped unless a process engine had an explicit sACN input configured for them. This meant that setups with more than 64 sACN universes would only see partial traffic in the Universe Monitor and would not route data correctly without manually creating engine inputs first.
The monitor range is now configurable via a spinner in the Monitor tab toolbar. It sets how many sACN universes (starting from 1) are joined automatically for monitoring and pass-through. Universes required by process engine inputs are always joined regardless of this setting. The value persists across sessions.
For large-scale installations (pixel mapping, media servers, festival rigs), increase the range to match your universe count. Setting it to 0 disables default joins entirely — only universes explicitly referenced by engine inputs will be received.
UI Performance
Reduced CPU usage across several widgets that were performing unnecessary work:
- Universe Monitor grid — Skips repainting when the incoming DMX data is identical to what is already displayed. At 44 packets/second per universe, this eliminates the vast majority of redraws during a static show state. The paint routine also caches fonts and number-to-string conversions, removing hundreds of per-frame allocations.
- Active channel count — Previously computed on every incoming packet (512-byte scan). Now deferred to display time — computed once per refresh cycle, only for visible universes.
- Tab visibility — The Universe Monitor list refresh (500ms), Channel History waveform (30 fps), and Statistics panel (1 s) now skip all processing when their tab is not active. Per-packet grid and waveform updates are also suppressed when the monitor is hidden.
- Channel History waveform — Anti-aliasing is now applied selectively to the waveform line stroke only, instead of globally for the entire paint operation. Grid lines, gradient fill, crosshair, and text render without anti-aliasing — they are pixel-aligned horizontal/vertical lines where sub-pixel blending adds cost without visible benefit. Reduces oscilloscope paint time by approximately 60%, eliminating visible stutter when selecting channels with 500+ universes active.
- RDM template list — Inline edits (lamp hours, DMX address, personality) no longer trigger any table rebuild — the data is saved directly and the widget already shows the correct value. External changes (Settings dialog, Save Template, import) use an incremental in-place update that only refreshes text, tooltips, and spinbox values without destroying and recreating the embedded widgets. A full table rebuild only happens when templates are added or removed. Previously, every change destroyed and recreated all QComboBox, QSpinBox, and QPushButton widgets for every row, causing visible GUI freezes with the spinning cursor.
- RDM device tabs — When running an extended fetch on a selected device, the Info/Config/Sensors tabs no longer update on every individual PID response. Tab updates are debounced (100ms), coalescing ~10 rapid updates into one refresh.
- Statistics tables — Column widths now auto-size to fit their header text on all platforms and font sizes, eliminating truncated headers like "Art-Net (In/Out)" and "Seq Err". The Interface column and Universe column absorb extra space.
RDM Templates — Bugfixes
- Save Template now preserves extended settings. Previously, clicking "Save Template" on a device that already had a template would overwrite it from scratch, silently discarding lamp hours limit, display settings, pan/tilt configuration, DMX fail mode, and all other extended parameters configured via the Settings dialog. The template now starts from the existing one and only updates personality, DMX address, and firmware version from the current device state.
- Lamp hours limit spinbox step increased to 100. The minimum meaningful lamp limit is in the hundreds of hours. The previous step of 1 made it easy to accidentally set a 1-hour limit with a single arrow click, which would trigger false alerts on every fixture in the rig. Users can still type any value directly for fine control.
- Force Full Discovery now works correctly. Previously, clicking "Force Full Discovery" only sent ArtTodControl to Net 0 addresses 0–15 and did not re-probe existing devices — the gateway re-scanned its RDM bus but DMXRouter ignored the results because it already knew the UIDs. Now it clears all known devices, sends ArtTodControl (flush) to every active port-address across all nets, waits 500ms for gateways to complete their bus scan, then requests a fresh TOD. Every device is re-discovered and fully probed from scratch.
Engine Performance
Extensive optimization of the packet processing pipeline for live show stability with many process engines running simultaneously. The improvements span the full data path — from packet reception through merge processing to network output — and reduce both CPU usage and memory pressure under high traffic loads.
- Packet reception — Eliminated unnecessary memory allocations and data conversions on every incoming Art-Net and sACN packet. Network interface matching now uses pre-computed values instead of repeated address conversions.
- Merge engine — Internal routing between process engines now uses indexed lookups instead of scanning all engines on every packet. Channel patch identity detection is cached, avoiding repeated full-universe comparisons on every output cycle.
- sACN output — Protocol encoding no longer allocates temporary buffers on every outgoing packet. Redundant per-packet system calls for multicast interface selection have been removed.
- Rate limiter — Output scheduling no longer copies universe data through an intermediate buffer on every tick cycle.
- Show Cue playback — Sorted universe mappings are cached during playback, eliminating repeated sorting on every fade tick and sequence frame.
Socket Reliability
All network socket binds now retry without blocking the main thread. Shared receive sockets (Art-Net port 6454, sACN port 5568) use asynchronous retries via QTimer::singleShot at 100/200/300ms — if the previous socket hasn't released the port yet (due to deferred cleanup), the retry fires on the event loop without stalling DMX output or GUI rendering. Transmit sockets (per-interface) use a single attempt; if it fails, the interface operates in receive-only mode until the next interface reconfiguration.
All disk writes (fixture database JSON, CSV mirror, RDM templates) now run on background threads. Serialization happens on the main thread (where the data lives), but the actual file I/O is offloaded so slow media — network drives, SD cards on Raspberry Pi — cannot stall DMX output during a live show.
Multicast group joins for sACN monitoring run entirely on a background thread using native setsockopt calls. Changing the monitor range from 0 to 1024 universes completes in under a second with zero impact on the main event loop.
Platform Availability
Windows
Download and run DMXRouter-Setup.exe. All dependencies included.
VLAN management requires Windows Pro/Enterprise with Hyper-V enabled.
Linux
Download the binary for your architecture:
DMXRouter-v1.5.6-linux-x86_64.zip— standard PCs and serversDMXRouter-v1.5.6-linux-arm64.zip— Raspberry Pi 4/5, Orange Pi, ARM64 boards
Qt6 runtime required:
# Ubuntu / Debian / Raspberry Pi OS
sudo apt install libqt6core6 libqt6gui6 libqt6widgets6 libqt6network6
# Fedora
sudo dnf install qt6-qtbase
# Arch
sudo pacman -S qt6-base
Then: chmod +x DMXRouter && ./DMXRouter
VLAN management requires NetworkManager (sudo apt install network-manager if not present). No need to run as root — the app prompts for your password when needed. VLANs persist across reboots.
macOS
Download the .app bundle (Qt6 frameworks bundled). Requires macOS 13.0 (Ventura) or later. The app is ad-hoc signed — on first launch, allow it in System Settings → Privacy & Security.
Important: Disable the macOS Application Layer Firewall for reliable real-time DMX operation (System Settings → Network → Firewall → OFF). If you need firewall protection, use PF (pfctl) instead — see the Performance section above for details and example rules.
No need to run with sudo — the app prompts for your password when needed. VLANs appear in System Settings → Network and persist across reboots.