Summary

DHD Audio Series 52 is a professional audio DSP system supporting routing, mixing, fader control, and monitoring. The External Control Protocol (ECP) operates over TCP/IP (port 2008) or RS-232 serial (38400 8N1) and uses a proprietary CAN-bus-derived binary message format with 28-bit command IDs and up to 8 data bytes per block. ECP is deprecated for 3rd generation devices (XS3/XC3/XD3); the Control API is recommended for new integrations.

Transport

protocols:
  - tcp
  - serial
addressing:
  port: 2008  # TCP port stated in source
auth:
  type: none  # inferred: no auth procedure in source
serial:
  baud_rate: 38400  # stated in source
  data_bits: 8      # stated in source
  parity: none      # stated in source
  stop_bits: 1      # stated in source
  flow_control: none

Traits

# inferred from command set:
# - powerable: not explicitly present - no power on/off commands
# - routable: ROUTE OUTPUT (0x01F5) command present
# - queryable: Request variants of most commands present
# - levelable: SET FADER LEVEL (0x11030000), SET MONITOR LEVEL (0x11100000), SET IO GAIN (0x112D0000) present

Actions

# ROUTE OUTPUT - 0x01F5xxxx
- id: route_output_16bit
  label: Set Output Routing (16-bit)
  kind: action
  params:
    - name: output
      type: integer
      description: "Output address: 0x0180-0x1EFF (analog), 0x4000-0x7FFF (summation), 0xFFFF (mute)"
    - name: input
      type: integer
      description: "Input address: 0x0100-0x1E7F, 0x4000-0x7FFF, or 0xFFFF (mute)"
    - name: controller_module
      type: integer
      description: Controller module number (xxxx in ID, can be 0)
  notes: "16-bit variant; 32-bit (0x01F5xxxx-32bit) recommended for 52/XS/XC/XD devices"

- id: route_output_32bit_set
  label: Set Output Routing (32-bit)
  kind: action
  params:
    - name: output_id
      type: integer
      description: 32-bit Output AudioID
    - name: input_id
      type: integer
      description: 32-bit Input AudioID (0x00000000 = mute)
    - name: controller_module
      type: integer
      description: Controller module number (can be 0)
  notes: "Available 06.07.15+ / 07.01.16+; crosspoint notification activatable via length=1,D0=0x01 (TCP only)"

- id: route_output_32bit_request
  label: Request Crosspoint (32-bit)
  kind: action
  params:
    - name: output_id
      type: integer
      description: 32-bit Output AudioID
    - name: controller_module
      type: integer

# ARBITRATION - 0x01F90000
- id: set_arbitration
  label: Set Arbitration
  kind: action
  params:
    - name: audio_id
      type: integer
      description: 32-bit AudioID (output or input)
    - name: owner_device_id
      type: integer
      description: "0x00 = free; 0x40-0x60 = owner device ID"
  notes: "Available 07.02.32+; no confirmation sent on set"

- id: request_arbitration
  label: Request Arbitration
  kind: action
  params:
    - name: audio_id
      type: integer

# SET MONITOR CHANNEL - 0x11000000
- id: set_monitor_channel
  label: Set Monitor Channel
  kind: action
  params:
    - name: input_left
      type: integer
      description: "16-bit Audio address; 0x0000-0x0027 = PreFader, 0x0100-0x1E7F = Mixer input, 0x4000-0x7FFF = Summation"
    - name: input_right
      type: integer
    - name: monitor_number
      type: integer
      description: "0-5 (fw 05.xx), 0-199 (fw 06.xx+)"

# SWITCH FADER/CHANNEL ON/OFF - 0x11020000
- id: set_fader_on_off
  label: Set Fader/Channel On/Off
  kind: action
  params:
    - name: fader_hi
      type: integer
      description: "Firmware 05.xx: 0x00; firmware 06.xx+: 0x00-0x03 = Virtual Mixer 1-4, 0x10 = Fader Channel Number"
    - name: fader_lo
      type: integer
      description: "Fader number or channel number depending on fader_hi"
    - name: on
      type: integer
      description: "1 = on, 0 = off"

# SET FADER LEVEL - 0x11030000
- id: set_fader_level
  label: Set Fader Level
  kind: action
  params:
    - name: fader_hi
      type: integer
      description: "Virtual mixer (0x00-0x03) or 0x10 for channel number"
    - name: fader_lo
      type: integer
      description: "Fader/logic fader number or channel number"
    - name: level
      type: integer
      description: "0x8000-0x7FFF (-327.68 dB to +327.67 dB)"
    - name: time
      type: integer
      description: "Fade time in ms (0x0000-0x2000); only used with length=7"
    - name: type
      type: integer
      description: "0 = level linear fade, 1 = fader linear fade"

# SET FADER ACCESS - 0x11040000
- id: set_fader_access
  label: Set Fader Access
  kind: action
  params:
    - name: fader_hi
      type: integer
    - name: fader_lo
      type: integer
    - name: on
      type: integer
      description: "1 = on, 0 = off"
    - name: type
      type: integer
      description: "0 = GAIN, 1 = PAN/BAL, 2 = INPUTSELECT"
    - name: acc_group
      type: integer
      description: "0-5 (Acc-Group 1-6)"

# SET CHANNEL INPUT NUMBER - 0x110D0000
- id: set_channel_input_number
  label: Set Channel Input Number (Input Select)
  kind: action
  params:
    - name: fader_hi
      type: integer
    - name: fader_lo
      type: integer
    - name: channel
      type: integer
      description: "0x0001-0x00BA (channel number 1-250)"

# SET INTERNAL LOGIC STATES - 0x110E0000
- id: set_logic_state
  label: Set Internal Logic State
  kind: action
  params:
    - name: logic_id
      type: integer
      description: LogicID (see LogicID description in source)
    - name: on
      type: integer
      description: "1 = on, 0 = off"

# SET MONITOR LEVEL - 0x11100000
- id: set_monitor_level
  label: Set Monitor Level
  kind: action
  params:
    - name: level_left
      type: integer
      description: "0x8000-0x7FFF (-327.68 dB to +327.67 dB)"
    - name: level_right
      type: integer
    - name: monitor_number
      type: integer

# SET DISPLAY OR CHANNEL LABEL - 0x11140000 (deprecated)
- id: set_display_or_channel_label
  label: Set Display or Channel Label
  kind: action
  params:
    - name: type
      type: integer
      description: "0 = Display, 1 = Channel Label"
    - name: number
      type: integer
    - name: label_id
      type: integer
      description: "0x00-0xFF (label number)"
  notes: "Marked for imminent removal in future firmware"

# SET PFL - 0x11160000
- id: set_pfl
  label: Set PFL (Pre-Fader Listen)
  kind: action
  params:
    - name: on
      type: integer
      description: "0 = off, 1 = on, 2 = auto mute"
    - name: number
      type: integer
    - name: state
      type: integer
      description: "0 = off, 1 = on"
    - name: mode
      type: integer
      description: "0 = PFL, 1 = AFL, 2 = LB"

# LOAD/SAVE SETUPS - 0x111C0000 (deprecated)
- id: load_save_setup
  label: Load or Save Setup
  kind: action
  params:
    - name: mode
      type: integer
      description: "0 = Save, 1 = Load"
    - name: setup_number
      type: integer
      description: "0x00-0x0F (setup 0-15)"
  notes: "Marked for imminent removal in future firmware"

# SET IO GAIN - 0x112D0000
- id: set_io_gain
  label: Set IO Gain
  kind: action
  params:
    - name: module
      type: integer
      description: "Slot number 0x01-0x1E"
    - name: channel
      type: integer
      description: "Channel within slot 0x00-0x07"
    - name: gain
      type: integer
      description: "0x8000-0x7FFF (-327.68 dB to +327.67 dB)"

# FADER TOUCH - 0x11820000,2
- id: set_fader_touch
  label: Set Fader Touch State
  kind: action
  params:
    - name: fader_hi
      type: integer
    - name: fader_lo
      type: integer
    - name: touch
      type: integer
      description: "0 = released, 1 = touched"

# METERING - 0x111D0000,2
- id: request_metering
  label: Request Metering Values
  kind: action
  params:
    - name: meter_id
      type: integer
      description: "0x0001-0x003F (meter block number)"
  notes: "Available 08.01.18+ / 09.00.xx; device returns 64 metering values"

# CF IN/OUT PARAMETERS - 0x11810000
- id: set_cf_parameter
  label: Set CleanFeed Parameter
  kind: action
  params:
    - name: parameter
      type: integer
      description: "0x0001 = CleanFeed Input, 0x0002 = CleanFeed Output"
    - name: value
      type: integer
      description: "0x0000-0x7FFF"
    - name: instance
      type: integer
      description: "0x00-0x0F (CleanFeed instance number)"
  notes: "Available 09.00.05+"

- id: request_cf_parameter
  label: Request CleanFeed Parameter
  kind: action
  params:
    - name: parameter
      type: integer
      description: "0x0001 = CleanFeed Input, 0x0002 = CleanFeed Output"
    - name: instance
      type: integer

Feedbacks

# UNRESOLVED: source does not explicitly document acknowledgement block formats for each command.
# Known: serial blocks answered with ACK (0x06) or NAK (0x05) within 80ms.
# IP blocks: no explicit ack framing described beyond the CAN-bus-derived structure.

Variables

# The following are settable via commands but have explicit request/response pairs:
- id: fader_level
  label: Fader Level
  type: integer
  range: [0x8000, 0x7FFF]
  unit: dB
  notes: Requested via 0x11030000, length=2; firmware 07.02.09+ supports notifications via length=1

- id: monitor_level
  label: Monitor Level
  type: integer
  range: [0x8000, 0x7FFF]
  unit: dB
  notes: Requested via 0x11100000, length=2 (firmware 07.04.11+)

- id: fader_access
  label: Fader Access
  type: object
  properties:
    - name: type
      type: enum
      values: [gain, pan_bal, input_select]
    - name: acc_group
      type: integer
  notes: Requested via 0x11040000, length=0

- id: channel_input_number
  label: Channel Input Number
  type: integer
  notes: Requested via 0x110D0000, length=2

- id: logic_state
  label: Internal Logic State
  type: boolean
  notes: Requested via 0x110E0000, length=2

- id: pfl_state
  label: PFL State
  type: object
  properties:
    - name: on
      type: integer
    - name: state
      type: enum
      values: [off, on]
    - name: mode
      type: enum
      values: [pfl, afl, lb]
  notes: Requested via 0x11160000, length=2 (firmware 07.04.11+)

- id: io_gain
  label: IO Gain
  type: integer
  range: [0x8000, 0x7FFF]
  unit: dB
  notes: Requested via 0x112D0000, length=2 (firmware 05.02.04+)

- id: arbitration
  label: Audio ID Ownership
  type: object
  properties:
    - name: audio_id
      type: integer
    - name: owner_device_id
      type: integer
  notes: Requested via 0x01F90000, length=4; device responds with length=5

- id: crosspoint
  label: Routing Crosspoint
  type: object
  properties:
    - name: output_id
      type: integer
    - name: input_id
      type: integer
  notes: Requested via 0x01F5xxxx, length=5; device responds with length=8

- id: metering_values
  label: Metering Values
  type: array
  items:
    type: integer
  notes: Device responds to 0x111D0000 with 64 metering values

- id: cf_parameter
  label: CleanFeed Parameter
  type: object
  properties:
    - name: parameter
      type: enum
      values: [cleanfeed_input, cleanfeed_output]
    - name: value
      type: integer
    - name: instance
      type: integer
  notes: Available 09.00.05+

Events

# UNRESOLVED: source does not document unsolicited event formats except:
# - Crosspoint notification (0x01F5, length=1,D0=0x01): device sends datagram length=8 on DHD internal routing changes
# - Fader value notification (0x11030000, length=1,D0=0x01): device sends datagram length=4 on fader value change
# These are opt-in via activation commands, not push events.

Macros

# No explicit multi-step macros described in source.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: no safety warnings or interlock procedures in source
# Note: firmware 06.xx.xx+ sockets are nonblocking; if data not fetched fast enough socket is automatically closed

Notes

DHD ECP is a legacy protocol predating the CAN-bus era and has been deprecated since firmware 10.2 / Series 52 generation. The source recommends using the Control API (developer.dhd.audio/docs/API/control-api) for new integrations with 3rd generation core devices (XC3/XD3/XS3).

Binary encoding: All multi-byte values use Motorola format (MSB first). Bytes in range 0x00–0x1F are DLE-escaped when sent serially (DLE, value+0x20). Serial blocks use STX (0x02) and EOT (0x08) framing with DLE (0x10) as byte-stuffing marker.

Command 0x01F5 (16-bit) is deprecated for 52/XS/XC/XD and 52/XS2/XC2/XD2 devices; 32-bit variant should be used. Commands 0x11140000, 0x111C0000, and 0x112D0000 are marked for imminent removal.

32-bit AudioID format differs between device generations: Version 1 (RM4200D, XR Router) uses DeviceID at bits 31–24 plus slot/channel fields; Version 2 (XS/XC/XD Core series) uses a flat 15-bit address field with I/O flag.

Firmware 07.02.32+ required for Arbitration (0x01F90000). Firmware 08.01.18+ required for Metering (0x111D0000). Firmware 09.00.05+ required for CleanFeed Parameters (0x11810000).

Serial: max 3 retries, 80ms timeout per block, 100-block receive buffer.

Provenance

source_domains:
  - developer.dhd.audio
source_urls:
  - https://developer.dhd.audio/docs/API/ECP/
retrieved_at: 2026-04-30T04:41:08.337Z
last_checked_at: 2026-06-03T06:39:10.190Z

Verification Summary

verdict: verified
checked_at: 2026-06-03T06:39:10.190Z
matched_actions: 20
action_count: 20
confidence: medium
summary: "All 20 spec actions verified (7 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "port 2008 stated for IP; serial port assignments (RS-232/RS-422) not specified per controller beyond presence"
- "source does not explicitly document acknowledgement block formats for each command."
- "source does not document unsolicited event formats except:"
- "no safety warnings or interlock procedures in source"
- "RS-232/RS-422 port pin assignments not stated in source; module documentation reference only"
- "TCP keepalive / session management not described"
- "LogicID format not documented in this excerpt"

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0