The mcintosh_ma12000 driver controls the McIntosh MA12000 hybrid integrated amplifier over its native RS232 protocol fronted by a serial-to-IP bridge. One GEM device represents the amplifier; there are no zones — the MA12000 is a single-zone unit.
Power, volume (0-100), mute, input selection (1-17), Output 1 / Output 2 speaker switching, balance, per-input trim, EQ, mono, meter and tube lights, display brightness, headphone HXD crossfeed, and MM/MC phono trim are all controllable. The amplifier pushes status updates automatically (it re-enables status feedback on every power cycle), so most attribute changes appear in GEM without polling. A 60 s safety resync re-reads power, volume, mute, input, and both speaker outputs as a backstop; every other setting (balance, trim, EQ, lights, brightness, phono) relies on the amp's automatic push.
Serial-to-IP bridge (Brainboxes, Global Cache, etc.) wired to the MA12000 RS232 jack with a DB9-F to 3.5 mm TRS cable (e.g. SF Cable D935-06: Tip = TXD, Ring = RXD, Sleeve = GND).
Bridge serial port set to 115200 8N1, no flow control (the amp also supports 57600 / 38400 / 19200 / 9600).
Bridge running in raw TCP mode (not telnet), with a stable LAN IP (DHCP reservation or static).
Configure the bridge to expose the serial port as raw TCP at 115200 8N1.
System → Devices: add a device with driver mcintosh_ma12000. Set:
ip — LAN IP of the bridge
port — TCP port the bridge maps to that serial port
Save and enable. On AC connect the amp emits its model, serial number, and firmware version banner — the driver captures these into the model, serial_number, and firmware_version device attributes automatically.
Safety resync cadence. The amp pushes updates on every change; this is a backstop.
max_volume
int (0-100)
60
Hard cap applied to discrete volume commands. volume_up / volume_down are not clamped since they only step by 1%. Protects against accidental loud levels on this very high-output amp.
Every readable setting also has a matching get_… query — get_output1, get_output2, get_eq, get_mono, get_meter_lights, get_display_brightness, get_headphone_hxd, get_headphone_state, get_phono_resistance, get_phono_capacitance — that fetches its current value on demand. query_all asks the amp to report the status of every setting in one shot.
While the amp is in standby, every command except PWR returns (ERROR - Invalid Command). The driver only polls non-power state when power_state is on.
The amp turns its status feedback (STA) on automatically at every power cycle, so unsolicited updates are the norm.
phono_resistance (TPR) only works while input is MC PHONO; phono_capacitance (TPC) only works while input is MM PHONO. They return an Invalid Input error otherwise.
Power-on takes ~15 s; commands sent during warm-up are buffered and acted on after.
tube_lights_on / tube_lights_off switch the tube lighting, but the amp reports no tube-light state back, so GEM never reflects their current status. The meter lights, by contrast, do report (meter_lights).
The driver keeps the link alive with a get_power query every 60 s — the one query the amp answers while in standby — so an idle socket stays connected even with the amp off.
Confirm the bridge is in raw TCP mode (not telnet) and the serial settings are 115200 8N1.
Phono resistance / capacitance command rejected
TPR requires MC PHONO selected; TPC requires MM PHONO selected.
Model / serial / firmware never populated
The banner is only emitted when the amp is power-cycled at the AC mains while the bridge is connected. Power-cycle the amp once after wiring.
Connection drops when the amp sits idle
The driver already pings the amp every 60 s. If a firewall or NAT still idles the socket, add a ping_interval attribute (ms) on the device row and lower it.