AVPro Edge AC-MX88
The avpro_acmx88 driver controls the AVPro Edge AC-MX88 8×8 HDMI matrix switcher. It
speaks the AVPro ASCII IP control protocol over TCP — plain-text commands such as
SET OUT1 VS IN2, \r\n terminated in both directions, no login. Each of the eight outputs
carries two mirrored video ports — an HDMI port and an HDBaseT (Cat-cable) port — plus a
separate extracted audio output, so in GEM the AC-MX88 is a controller: one device
drives eight output rooms and routes eight source inputs between them.
You route any input to any output for video, and (in matrix mode) route audio independently. Bind each output to an AV zone and each input to an AV source; once an AV zone's Volume Device points at the matrix, the zone's volume/mute controls drive that output and the matrix mirrors the output's state back onto the zone.
Prerequisites
- The AC-MX88 on the same LAN as GEM, with a static IP or a DHCP reservation.
- IP control enabled in the AC-MX88 web UI. Note the control port shown there — you enter it when you create the device.
- A rack map of which physical OUT number feeds each room (and whether that room is on the HDMI port or the HDBaseT port), and which IN number each source is wired to. AVPro numbers OUT/IN ports 1-based, 1–8; confirm the numbering printed on the chassis matches your drawings before you start.
An AC-MX88 AV zone address is the output (OUT) number and an AV source address is the
input (IN) number — both 1-based integers, 1–8, that match the chassis. The query OUT0 is a
wildcard the driver uses internally to read all outputs at once; you never enter 0 as a real
zone address.
Setup
-
System → Devices → Add Device: choose driver AVPro Edge AC-MX88 (
avpro_acmx88). Setipto the matrix's LAN address andportto the IP control port from the AC-MX88 web UI. Set Enabled to Yes and save. On connect the driver sweeps every output's video route, audio route, extracted-audio volume, and mute state once, so the current matrix state populates immediately. -
On that first connect the driver also auto-creates one plain zone per output —
Output 1throughOutput 8, each addressed with its OUT number — in the AV subsystem. You do not pre-create these; they appear on their own and are where the driver mirrors live per-output state. (The AV subsystem ships with GEM; if it has been removed, the zones can't be created.) -
AV → AV Zones → Add — create one AV zone per output you want on a touchpanel:
- AV Type —
videofor a display/room fed HDMI or HDBaseT;audioif you only use the output's extracted audio. - Address — the OUT number for this room (e.g.
3for OUT3). This one number covers both video routing and volume, because the matrix addresses both by output. - Volume Device — the Device that controls volume for this zone picker. Set it to the AC-MX88 so the zone's volume and mute controls reach that output. (See Volume, mute, and the three audio paths below for exactly what they affect.)
- AV Type —
-
AV → AV Sources → Add — create one AV source per input:
- Device — the physical source feeding that input (cable box, streamer, media player).
- AV Type, Label — required; the label is what users see when they pick the source.
- Address — the IN number this source is wired to (e.g.
5for IN5). - On Macro — the route command (see Routing a source to a zone below).
-
On a touchpanel, selecting a source for the zone runs that source's On Macro to route the input to the zone's output; the zone's volume/mute controls drive the output directly.
Routing a source to a zone
GEM does not auto-route a matrix — a source is routed by its On Macro. Build one Run Command macro and reuse it for every AC-MX88 source:
- Automation → Macros → Add a macro, e.g.
Route AC-MX88. - Add a step that sends the AC-MX88
set_inputcommand (wire:SET OUT[address] VS IN[input]). This is the video route — it switches both the HDMI and HDBaseT mirror ports of the output together. - Leave its argument pickers on the AV defaults — address resolves to the AV zone's OUT number and input resolves to the AV source's IN number. GEM fills both in at run time from whichever zone and source are involved, so the single macro works for all of them.
- Set this macro as the On Macro on each AC-MX88 AV source.
When a user picks that source in a zone, GEM substitutes the zone's OUT and the source's IN and
sends SET OUT<out> VS IN<in>. The matrix reports the new route back and the zone's input
attribute updates.
By default audio follows the video route. To route audio separately from video, set the matrix
to full-matrix audio mode once with set_audio_matrix_mode (mode = 2), then route audio
with the audio_source command (SET OUT[address] AS IN[input]). In the default binding
modes (0 bind-to-output, 1 bind-to-input) audio_source has no effect — the video route
carries the audio. The driver tracks the routed video input on the zone's input attribute and
the routed audio input on audio_input; it never writes the zone's source field, which GEM
manages from your AV source selection.
Volume, mute, and the three audio paths
Every output on the AC-MX88 has three independent audio surfaces, and GEM's controls map to specific ones — know which before you commission:
- Extracted audio (EXAUD) — the output's dedicated audio breakout, typically feeding a local
amp or the room's audio system. The zone's volume control (
volumecommand,SET OUT[address] EXAUD LEV[level], 0–100) drives this level. - HDMI-port embedded audio (HP) — the audio inside the HDMI mirror output. The zone's
mute control (
mute_on/mute_off,SET OUT[address] HP HA MUTE ON/OFF) mutes this path.mute_toggleis synthesized from the last known mute state. - HDBaseT-port embedded audio (TP) — the audio inside the HDBaseT (Cat-cable) mirror output.
This has its own mute commands (
hdbt_mute_on/hdbt_mute_off) — the zone's standard mute does not touch it.
Practical consequences:
- If a room's audio rides the HDBaseT link to a downstream receiver, the zone's standard volume and mute won't silence it — control volume at the receiver, or use the HDBaseT mute commands in a macro. The zone volume/mute path is meant for rooms driven off the extracted audio output and HDMI port.
- To fully kill a room's picture and sound at the matrix, use the per-port stream commands
(
hdmi_stream_off/hdbt_stream_off), which disable the whole output signal, rather than mute alone.
Attributes
Device — required
| Attribute | Type | Description |
|---|---|---|
ip | string | LAN IP of the AC-MX88. |
port | int | IP control (TCP) port from the AC-MX88 web UI. |
Reflected output-zone attributes
The driver writes these onto the auto-created output zone as the matrix confirms each command
and during the connect sweep. You can watch them live in the Attribute editor and use them in
attribute triggers — for example, alert when an input loses signal or when an output's routed
input changes.
| Attribute | Type | Notes |
|---|---|---|
input | int | The IN number currently routed to this output (video). |
audio_input | int | The IN number currently routed for audio (only differs from input in full-matrix audio mode). |
volume | int | Extracted-audio output level, 0–100. |
mute_state | string | Output audio mute, on / off. The matrix reports HDMI-port and HDBaseT-port mute onto this one value, so it reflects whichever the driver read most recently. |
hdmi_stream | string | HDMI mirror-port signal, on / off. |
hdbt_stream | string | HDBaseT mirror-port signal, on / off. |
The AC-MX88 reads all outputs once when GEM connects (and again after any reconnect) — it
does not poll on a cycle. After that, the displayed state stays current because the driver applies
the matrix's own confirmations to every command it sends. A change made outside GEM — at the
matrix web UI or front panel — shows up the next time GEM reconnects, not immediately. For a
manual refresh, run get_system_status, or the per-output get_video_route / get_audio_route /
get_volume queries (pass 0 as the address to sweep all outputs at once).
AV zone
- Address required: yes — the output (OUT) number, 1-based (1–8), in the AV zone's Address field. A zone whose Volume Device is the AC-MX88 is what the driver drives for that output.
- Advanced addressing: the AC-MX88 addresses video and audio by the same OUT number, so the plain Address field is all you need. The Advanced addressing panel (separate Video Routing / Audio Routing fields) is only for matrices that split those addresses — leave it off here.
AV source
- Address: the input (IN) number, 1-based (1–8), in the AV source Address field. The source's On Macro routes this input to the chosen zone output.
Commands
get_* commands take an output (address) or input (input) argument and return current state;
the rest are control commands. The address argument is an AV zone (output) address and input
is an AV source (input) address — the pickers offer your real zones and sources, and most get_*
commands also accept 0 to query all outputs/inputs at once.
Routing
| Command | Args | Wire | Notes |
|---|---|---|---|
set_input | address, input | SET OUT[address] VS IN[input] | Route an input to an output (video; drives both mirror ports). Used by AV source On Macros. |
audio_source | address, input | SET OUT[address] AS IN[input] | Route audio independently — only in full-matrix audio mode. |
set_ir_route | address, input | SET IRT OUT[address] IS IN[input] | Route the bidirectional IR pass-through channel between an output and input. |
Volume & mute (per output)
| Command | Args | Wire | Notes |
|---|---|---|---|
volume | address, level | SET OUT[address] EXAUD LEV[level] | Set the extracted-audio output level, 0–100. |
get_volume | address | GET OUT[address] EXAUD LEV | Read the extracted-audio level. |
mute_on / mute_off | address | SET OUT[address] HP HA MUTE ON/OFF | Mute / unmute the HDMI-port audio. |
hdbt_mute_on / hdbt_mute_off | address | SET OUT[address] TP HA MUTE ON/OFF | Mute / unmute the HDBaseT-port audio. |
get_hdmi_mute | address | GET OUT[address] HP HA MUTE | Read HDMI-port mute state. |
get_hdbt_mute | address | GET OUT[address] TP HA MUTE | Read HDBaseT-port mute state. |
Output stream on/off
| Command | Args | Wire | Notes |
|---|---|---|---|
hdmi_stream_on / hdmi_stream_off | address | SET OUT[address] HP STREAM ON/OFF | Enable / disable the HDMI mirror-port signal. |
hdbt_stream_on / hdbt_stream_off | address | SET OUT[address] TP STREAM ON/OFF | Enable / disable the HDBaseT mirror-port signal. |
enable_audio_output / disable_audio_output | address | SET OUT[address] EXA EN/DIS | Enable / disable the extracted-audio output. |
Audio processing (per output)
| Command | Args | Wire | Notes |
|---|---|---|---|
set_audio_delay | address, delay (0–7) | SET OUT[address] EXADL PH[delay] | Lip-sync delay on extracted audio: 0 = bypass, 1–7 = 90–630 ms. |
set_eq_mode | address, mode (0–7) | SET OUT[address] EXEQ MODE[mode] | Audio EQ preset: 0 Off, 1 Classical, 2 Headphone, 3 Hall, 4 Live, 5 Pop, 6 Rock, 7 Vocal. |
set_audio_matrix_mode | mode (0/1/2) | SET EXAMX MODE[mode] | Whole-matrix audio mode: 0 bind to output, 1 bind to input, 2 full matrix (enables audio_source). |
Video output modes
| Command | Args | Wire | Notes |
|---|---|---|---|
set_hdbt_video_mode | address, mode (2/5) | SET OUT[address] TP VIDEO[mode] | HDBaseT scaling: 2 = 4K→2K downscale, 5 = ICT (full-bandwidth) mode. |
set_hdmi_video_mode | address, mode (1/3) | SET OUT[address] HP VIDEO[mode] | HDMI scaling: 1 = bypass, 3 = 2K→4K upscale. |
set_long_range_mode | address, state (EN/DIS) | SET OUT[address] LR MODE [state] | HDBaseT long-range mode (reduced bandwidth for longer cable runs). |
EDID
| Command | Args | Wire | Notes |
|---|---|---|---|
set_edid | input, edid (0–32) | SET IN[input] EDID [edid] | Set the EDID presented to a source input. Fixes handshake / no-picture issues; values per AVPro documentation. |
Queries
| Command | Args | Wire |
|---|---|---|
get_video_route | address | GET OUT[address] VS |
get_audio_route | address | GET OUT[address] AS IN |
get_input_signal | input | GET IN[input] SIG STA |
get_input_video_info | input | GET IN[input] VID FMT INF |
get_input_audio_info | input | GET IN[input] AUD FMT INF |
get_system_status | — | GET STA |
get_global_status | — | STA |
get_dhcp_status | — | GET DHCP |
get_ip_address | — | GET HIP |
get_mac_address | — | GET MAC |
System
| Command | Args | Wire | Notes |
|---|---|---|---|
reboot | — | SET RBT | Reboot the matrix. |
factory_reset | — | SET RST | Reset to factory defaults — clears all routing and settings. |
help | — | H | Device help / command list. |
Known quirks
- Output zones are auto-created, not pre-built. The eight
Output Nzones appear the first time the matrix answers for that output — the connect-time all-outputs sweep creates all eight. Pre-creating them is not required; if their addresses ever look wrong, re-runget_video_routewith address0to refresh. - OUT/IN numbers are 1-based and must match the chassis labels.
OUT0is an internal all-outputs query, never a real zone address. - Audio follows video unless you switch modes.
audio_sourceonly takes effect afterset_audio_matrix_modeis set to full matrix (2); otherwise the video route carries the audio. mute_statecollapses two ports. The matrix reports HDMI-port and HDBaseT-port mute onto the samemute_stateattribute, so the reflected value tracks whichever port was read last. Use the port-specificget_hdmi_mute/get_hdbt_mutequeries when you need to be certain.- Status is read on connect, not on a poll. Changes made directly at the matrix (web UI or
front panel) appear after GEM's next reconnect. Run a
get_*query for an on-demand refresh.
Troubleshooting
| Symptom | Check |
|---|---|
| Source select does not switch the picture | The source needs an On Macro that runs the set_input command (see Routing a source to a zone). Confirm the source Address is the right IN number and the zone Address is the right OUT number. |
| Video switches but audio doesn't follow | If you routed audio with audio_source, confirm the matrix is in full-matrix audio mode (set_audio_matrix_mode = 2). In the default binding modes, only set_input routes audio. |
| Zone volume or mute does nothing for a room | Confirm the AV zone's Volume Device is set to the AC-MX88 and the Address is the output's OUT number. If the room is fed over HDBaseT to a receiver, the matrix's extracted-audio volume/HDMI mute won't affect it — control volume at the receiver or use the HDBaseT mute commands. |
| No picture on one display, others fine | Try setting that input's EDID (set_edid) to a mode the display supports; check the output's video scaling mode (set_hdmi_video_mode / set_hdbt_video_mode) matches the display. |
| Sparkles / dropouts on a long HDBaseT run | Enable set_long_range_mode (EN) on that output for reduced-bandwidth, longer-cable operation. |
| Auto-created output zones have wrong addresses | The driver creates zones from incoming OUT responses. Run get_video_route with address 0 to refresh, and confirm the matrix responds with the \r\n terminator. |
| Reported state is stale after a web-UI change | Status is read on connect, not polled. Reconnect the device, or run get_system_status / the per-output queries. |
Related documentation
- AV Zones — bind each output as a zone's Volume Device.
- AV Sources — define the inputs and their routing macros.
- Macros — build the source On Macro.
- Devices — add and configure the matrix.
- Commands — the command grid and the Test runner.