McIntosh MA12000
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.
What's supported
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.
Prerequisites
- 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).
Setup
- Cable the MA12000 RS232 jack to the bridge.
- 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 bridgeport— 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, andfirmware_versiondevice attributes automatically.
Attributes
Device — required
| Attribute | Type | Description |
|---|---|---|
ip | string | LAN IP of the serial-to-IP bridge. |
port | int | TCP port on the bridge that mirrors the RS232 serial port. |
Device — optional
| Attribute | Type | Default | Description |
|---|---|---|---|
monitor_interval | int (ms) | 60000 | Safety resync cadence. The amp pushes updates on every change; this is a backstop. A value that is not a positive number uses the 60000 default; anything under 1000 is raised to 1000. If the amp sends nothing for three resyncs in a row (bridge up, amp unplugged), the cadence doubles each time up to 5 minutes and returns to normal as soon as the amp is heard again. |
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. |
Reflected device attributes
The driver mirrors the following onto the device as state changes:
| Attribute | Type | Source |
|---|---|---|
power_state | string | on / off |
volume | int | 0-100 |
mute | bool | |
input | int | 1-17 |
input_label | string | Resolved label (BAL1, UNBAL3, MM PHONO, etc.) |
output1, output2 | bool | Speaker output switching |
balance | int | -50…+50 (left negative, right positive) |
input_trim | int | -12…+12 (0.5 dB steps) |
eq | bool | |
mono | bool | |
meter_lights | bool | |
display_brightness | int | 1 (dimmest) … 4 (brightest) |
headphone_hxd | bool | Crossfeed; only effective with headphones plugged in |
headphone_state | string | unplugged / plugged / no_jack |
phono_resistance | int | 1=50Ω 2=100Ω 3=200Ω 4=400Ω 5=1000Ω (MC only) |
phono_capacitance | int | 1=50pF 2=100pF 3=150pF 4=200pF 5=250pF 6=300pF 7=350pF 8=400pF (MM only) |
status_feedback | bool | Whether the amp is pushing unsolicited status updates |
Input map
| Index | Input |
|---|---|
| 1-2 | BAL1, BAL2 |
| 3-8 | UNBAL1 … UNBAL6 |
| 9 | MM PHONO |
| 10 | MC PHONO |
| 11-12 | COAX1, COAX2 |
| 13-14 | OPTI1, OPTI2 |
| 15 | USB |
| 16 | MCT |
| 17 | HDMI (DA2 module only) |
Commands
| Command | Args | Notes |
|---|---|---|
power_on / power_off / get_power | — | |
volume | volume (0-100) | Absolute level. Clamped server-side to the max_volume attribute (default 60). |
volume_up / volume_down / get_volume | — | |
mute_on / mute_off / get_mute | — | |
output1_on / output1_off / output2_on / output2_off | — | Speaker A / B switching. |
input | input (1-17) | See input map. |
input_up / input_down / get_input | — | |
balance | balance (-50…+50) | |
balance_left / balance_right / get_balance | — | Step in single increments. |
input_trim | trim (-12…+12) | Absolute per-input trim in 0.5 dB steps; persists per source. |
input_trim_up / input_trim_down / get_input_trim | — | Step the active input's trim up/down by one increment. |
eq_on / eq_off / mono_on / mono_off | — | |
meter_lights_on / meter_lights_off / tube_lights_on / tube_lights_off | — | |
display_brightness | level (1-4) | |
headphone_hxd_on / headphone_hxd_off | — | Headphones must be plugged in. |
phono_resistance | index (1-5) | MC PHONO must be the active input. |
phono_capacitance | index (1-8) | MM PHONO must be the active input. |
trim_menu_close | — | Closes the front-panel trim menu (else it times out). |
status_feedback_on / status_feedback_off / query_all | — |
For input, balance, input_trim, phono_resistance, phono_capacitance and display_brightness, a value that is missing, blank, not a whole number or outside the range shown is refused with an error and nothing is sent to the amp. input and input_trim also accept the amp's own U / D step letters and balance accepts L / R. volume is different: an unreadable value sends 0, and every value is held under max_volume.
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.
Known quirks
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_offswitch 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_powerquery every 60 s — the one query the amp answers while in standby — so an idle socket stays connected even with the amp off.
Troubleshooting
| Symptom | Check |
|---|---|
| Every command returns Invalid Command | Amp is in standby. Send power_on first. |
| No volume / input updates appear in GEM | 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. |
Related documentation
- Devices — add and configure the amplifier (this driver creates a single standalone device, no zones).
- Subsystems — the AV subsystem the device is placed in.
- Commands — the command grid and Test runner for the power, volume, input, and trim commands above.
- Device Types — the
av_receiver/amplifierclassification the driver hints.