Summary

Shure ANI4IN is a 4-channel audio network interface that accepts microphone/line analog inputs and exposes them to a Dante/AES67 audio network. This spec covers its TCP/IP control protocol for integration with AMX, Crestron, Extron, and similar control systems, using ASCII command strings over an Ethernet (TCP) connection on port 2202. The protocol supports GET, SET, REPORT (REP), and SAMPLE message types for querying state, changing parameters, and metering audio levels.

Transport

protocols:
  - tcp
addressing:
  port: 2202
auth:
  type: none  # inferred: no auth procedure in source

Traits

- queryable       # inferred from GET command examples
- levelable       # inferred from AUDIO_GAIN / AUDIO_GAIN_HI_RES commands
- powerable       # inferred from PHANTOM_PWR_ENABLE (per-channel phantom power)

Actions

- id: get_all
  label: Get All Parameters
  kind: query
  command: "< GET {x} ALL >"
  params:
    - name: x
      type: string
      description: Channel number 0-4 (0 = all channels)
  notes: Use on first power-on to update status of all parameters. ANI4IN responds with individual REP strings for all parameters.

- id: get_model
  label: Get Model Number
  kind: query
  command: "< GET MODEL >"
  params: []
  notes: Device responds with 32-character model number.

- id: get_serial
  label: Get Serial Number
  kind: query
  command: "< GET SERIAL_NUM >"
  params: []
  notes: Device responds with 32-character serial number.

- id: get_firmware
  label: Get Firmware Version
  kind: query
  command: "< GET FW_VER >"
  params: []
  notes: Device responds with 18-character firmware version string.

- id: get_ip_addr_audio
  label: Get Audio Network IP Address
  kind: query
  command: "< GET IP_ADDR_NET_AUDIO_PRIMARY >"
  params: []
  notes: Returns 15-character IP address.

- id: get_ip_subnet_audio
  label: Get Audio Network Subnet
  kind: query
  command: "< GET IP_SUBNET_NET_AUDIO_PRIMARY >"
  params: []
  notes: Returns 15-character subnet address.

- id: get_ip_gateway_audio
  label: Get Audio Network Gateway
  kind: query
  command: "< GET IP_GATEWAY_NET_AUDIO_PRIMARY >"
  params: []
  notes: Returns 15-character gateway address.

- id: get_channel_name
  label: Get Channel Name
  kind: query
  command: "< GET {x} CHAN_NAME >"
  params:
    - name: x
      type: string
      description: Channel number 0-4
  notes: Returns 31-character channel name (padded with spaces).

- id: get_device_id
  label: Get Device ID
  kind: query
  command: "< GET DEVICE_ID >"
  params: []
  notes: Device-level (no channel). Returns 31-character device ID.

- id: get_preset
  label: Get Active Preset
  kind: query
  command: "< GET PRESET >"
  params: []
  notes: Returns preset number 01-10.

- id: set_preset
  label: Recall Preset
  kind: action
  command: "< SET PRESET {nn} >"
  params:
    - name: nn
      type: string
      description: Preset number 1-10 (leading zero optional on SET)
  notes: Device replies with REP PRESET nn (01-10).

- id: get_preset1_name
  label: Get Preset 1 Name
  kind: query
  command: "< GET PRESET1 >"
  params: []
  notes: Returns 25-character preset name.

- id: get_preset2_name
  label: Get Preset 2 Name
  kind: query
  command: "< GET PRESET2 >"
  params: []
  notes: Returns 25-character preset name.

- id: get_preset3_name
  label: Get Preset 3 Name
  kind: query
  command: "< GET PRESET3 >"
  params: []
  notes: Returns 25-character preset name.

- id: get_audio_gain_hi_res
  label: Get Digital Audio Gain (high-res)
  kind: query
  command: "< GET {x} AUDIO_GAIN_HI_RES >"
  params:
    - name: x
      type: string
      description: Channel number 0-4
  notes: Returns yyyy 0000-1400 in 0.1 dB steps.

- id: set_audio_gain_hi_res
  label: Set Digital Audio Gain (high-res)
  kind: action
  command: "< SET {x} AUDIO_GAIN_HI_RES {yyyy} >"
  params:
    - name: x
      type: string
      description: Channel number 1-4
    - name: yyyy
      type: string
      description: Gain 0000-1400 in 0.1 dB steps
  notes: Device replies with REP x AUDIO_GAIN_HI_RES yyyy.

- id: increase_audio_gain_hi_res
  label: Increase Digital Audio Gain
  kind: action
  command: "< SET {x} AUDIO_GAIN_HI_RES INC {nn} >"
  params:
    - name: x
      type: string
      description: Channel number 1-4
    - name: nn
      type: string
      description: Increment in 0.1 dB (1-3 digit value)
  notes: Device replies with REP x AUDIO_GAIN_HI_RES yyyy.

- id: decrease_audio_gain_hi_res
  label: Decrease Digital Audio Gain
  kind: action
  command: "< SET {x} AUDIO_GAIN_HI_RES DEC {nn} >"
  params:
    - name: x
      type: string
      description: Channel number 1-4
    - name: nn
      type: string
      description: Decrement in 0.1 dB (1-3 digit value)
  notes: "Device replies with REP x AUDIO_GAIN_HI_RES yyyy. Note: source typo says range 0000-1280 in decrement response."

- id: get_audio_gain
  label: Get Analog Audio Gain
  kind: query
  command: "< GET {x} AUDIO_GAIN >"
  params:
    - name: x
      type: string
      description: Channel number 0-4
  notes: Returns yy 00-51 in 3 dB steps.

- id: set_audio_gain
  label: Set Analog Audio Gain
  kind: action
  command: "< SET {x} AUDIO_GAIN {yy} >"
  params:
    - name: x
      type: string
      description: Channel number 1-4
    - name: yy
      type: string
      description: Gain 00-51 in 3 dB steps
  notes: Device replies with REP x AUDIO_GAIN yy.

- id: increase_audio_gain
  label: Increment Analog Audio Gain
  kind: action
  command: "< SET {x} AUDIO_GAIN INC {yy} >"
  params:
    - name: x
      type: string
      description: Channel number 0-4
    - name: yy
      type: string
      description: Increment in 3 dB steps (saturated to 00-51)
  notes: Resulting gain is saturated to the range allowed in SET.

- id: decrease_audio_gain
  label: Decrement Analog Audio Gain
  kind: action
  command: "< SET {x} AUDIO_GAIN DEC {yy} >"
  params:
    - name: x
      type: string
      description: Channel number 0-4
    - name: yy
      type: string
      description: Decrement in 3 dB steps (saturated to 00-51)
  notes: Resulting gain is saturated to the range allowed in SET.

- id: get_audio_mute
  label: Get Channel Audio Mute
  kind: query
  command: "< GET {x} AUDIO_MUTE >"
  params:
    - name: x
      type: string
      description: Channel number 0-4
  notes: Returns ON or OFF.

- id: set_audio_mute_on
  label: Mute Channel Audio
  kind: action
  command: "< SET {x} AUDIO_MUTE ON >"
  params:
    - name: x
      type: string
      description: Channel number 1-4
  notes: Device replies with REP x AUDIO_MUTE ON.

- id: set_audio_mute_off
  label: Unmute Channel Audio
  kind: action
  command: "< SET {x} AUDIO_MUTE OFF >"
  params:
    - name: x
      type: string
      description: Channel number 1-4
  notes: Device replies with REP x AUDIO_MUTE OFF.

- id: toggle_audio_mute
  label: Toggle Channel Audio Mute
  kind: action
  command: "< SET {x} AUDIO_MUTE TOGGLE >"
  params:
    - name: x
      type: string
      description: Channel number 1-4
  notes: Device replies with REP x AUDIO_MUTE ON or OFF.

- id: flash_on
  label: Flash Lights On
  kind: action
  command: "< SET FLASH ON >"
  params: []
  notes: Front-panel flash auto-turns off after 30 seconds. Device replies with REP FLASH ON.

- id: flash_off
  label: Flash Lights Off
  kind: action
  command: "< SET FLASH OFF >"
  params: []
  notes: Device replies with REP FLASH OFF.

- id: set_meter_rate
  label: Set Meter Rate (turn metering on)
  kind: action
  command: "< SET METER_RATE {sssss} >"
  params:
    - name: sssss
      type: string
      description: Metering period in milliseconds (0 turns off, minimum 100)
  notes: "After SET, device replies with REP METER_RATE sssss and begins emitting < SAMPLE aaa bbb ccc ddd > where aaa=output1 ... ddd=output4 (values 000-060). Off by default."

- id: stop_metering
  label: Stop Metering
  kind: action
  command: "< SET METER_RATE 0 >"
  params: []
  notes: 00000 is also accepted. Device replies with REP METER_RATE 00000.

- id: get_sig_clip_led
  label: Get Sig/Clip LED State
  kind: query
  command: "< GET {x} LED_COLOR_SIG_CLIP >"
  params:
    - name: x
      type: string
      description: Channel number 0-4
  notes: "Device also sends REPORT whenever status changes. Returns OFF, GREEN, AMBER, or RED."

- id: get_led_brightness
  label: Get LED Brightness
  kind: query
  command: "< GET LED_BRIGHTNESS >"
  params: []
  notes: "Returns 0 (disabled), 1 (dim), or 2 (default)."

- id: set_led_brightness
  label: Set LED Brightness
  kind: action
  command: "< SET LED_BRIGHTNESS {n} >"
  params:
    - name: n
      type: string
      description: "0 = LED disabled, 1 = LED dim, 2 = LED default"
  notes: Device replies with REP LED_BRIGHTNESS n.

- id: get_phantom_power
  label: Get Phantom Power Status
  kind: query
  command: "< GET {x} PHANTOM_PWR_ENABLE >"
  params:
    - name: x
      type: string
      description: Channel number 0-4
  notes: Returns ON or OFF.

- id: set_phantom_power_on
  label: Enable Phantom Power
  kind: action
  command: "< SET {x} PHANTOM_PWR_ENABLE ON >"
  params:
    - name: x
      type: string
      description: Channel number 1-4
  notes: Device replies with REP x PHANTOM_PWR_ENABLE ON.

- id: set_phantom_power_off
  label: Disable Phantom Power
  kind: action
  command: "< SET {x} PHANTOM_PWR_ENABLE OFF >"
  params:
    - name: x
      type: string
      description: Channel number 1-4
  notes: Device replies with REP x PHANTOM_PWR_ENABLE OFF.

- id: get_hw_gating_logic
  label: Get Mic Logic Switch Out
  kind: query
  command: "< GET {x} HW_GATING_LOGIC >"
  params:
    - name: x
      type: string
      description: Channel number 0-4
  notes: "Returns ON or OFF. Device also sends REPORT whenever status changes. (ANI4IN-BLOCK only.)"

- id: get_chan_led_in_state
  label: Get Mic Logic LED In
  kind: query
  command: "< GET {x} CHAN_LED_IN_STATE >"
  params:
    - name: x
      type: string
      description: Channel number 0-4
  notes: "Returns ON or OFF. (ANI4IN-BLOCK only.)"

- id: set_chan_led_in_state_on
  label: Set Mic Logic LED In On
  kind: action
  command: "< SET {x} CHAN_LED_IN_STATE ON >"
  params:
    - name: x
      type: string
      description: Channel number 1-4
  notes: "Device replies with REP x CHAN_LED_IN_STATE ON. (ANI4IN-BLOCK only.)"

- id: set_chan_led_in_state_off
  label: Set Mic Logic LED In Off
  kind: action
  command: "< SET {x} CHAN_LED_IN_STATE OFF >"
  params:
    - name: x
      type: string
      description: Channel number 1-4
  notes: "Device replies with REP x CHAN_LED_IN_STATE OFF. (ANI4IN-BLOCK only.)"

- id: reboot
  label: Reboot ANI4IN
  kind: action
  command: "< SET REBOOT >"
  params: []
  notes: "Firmware > v2.0. Device does NOT send a response."

- id: get_last_error_event
  label: Get Last Error Event
  kind: query
  command: "< GET LAST_ERROR_EVENT >"
  params: []
  notes: "Firmware > v2.0. Returns up to 128 characters."

- id: get_input_meter_mode
  label: Get Input Meter Mode
  kind: query
  command: "< GET INPUT_METER_MODE >"
  params: []
  notes: "Firmware > v2.0. Returns PRE_FADER or POST_FADER."

- id: set_input_meter_mode_pre
  label: Set Input Meter Mode Pre-Fader
  kind: action
  command: "< SET INPUT_METER_MODE PRE_FADER >"
  params: []
  notes: "Firmware > v2.0. Device replies with REP INPUT_METER_MODE PRE_FADER."

- id: set_input_meter_mode_post
  label: Set Input Meter Mode Post-Fader
  kind: action
  command: "< SET INPUT_METER_MODE POST_FADER >"
  params: []
  notes: "Firmware > v2.0. Device replies with REP INPUT_METER_MODE POST_FADER."

- id: get_limiter_engaged
  label: Get Limiter Engaged
  kind: query
  command: "< GET {x} LIMITER_ENGAGED >"
  params:
    - name: x
      type: string
      description: Channel number 1 or 3 (limiter only in summing mode)
  notes: "Firmware > v2.0. Returns ON or OFF."

- id: get_audio_summing_mode
  label: Get Audio Summing Mode
  kind: query
  command: "< GET AUDIO_SUMMING_MODE >"
  params: []
  notes: "Firmware > v2.0. Returns OFF, 1+2, 3+4, 1+2/3+4, or 1+2+3+4."

- id: set_audio_summing_mode_off
  label: Set Audio Summing Mode Off
  kind: action
  command: "< SET AUDIO_SUMMING_MODE OFF >"
  params: []
  notes: "Firmware > v2.0."

- id: set_audio_summing_mode_1_2
  label: Set Audio Summing Mode 1+2
  kind: action
  command: "< SET AUDIO_SUMMING_MODE 1+2 >"
  params: []
  notes: "Firmware > v2.0."

- id: set_audio_summing_mode_3_4
  label: Set Audio Summing Mode 3+4
  kind: action
  command: "< SET AUDIO_SUMMING_MODE 3+4 >"
  params: []
  notes: "Firmware > v2.0."

- id: set_audio_summing_mode_1_2_3_4_split
  label: Set Audio Summing Mode 1+2/3+4
  kind: action
  command: "< SET AUDIO_SUMMING_MODE 1+2/3+4 >"
  params: []
  notes: "Firmware > v2.0."

- id: set_audio_summing_mode_1_2_3_4_mix
  label: Set Audio Summing Mode 1+2+3+4
  kind: action
  command: "< SET AUDIO_SUMMING_MODE 1+2+3+4 >"
  params: []
  notes: "Firmware > v2.0."

- id: get_audio_in_rms_lvl
  label: Get RMS Audio Level
  kind: query
  command: "< GET {x} AUDIO_IN_RMS_LVL >"
  params:
    - name: x
      type: string
      description: Channel number 0 (all) or 1-4
  notes: "Firmware > v2.0."

- id: get_audio_in_peak_lvl
  label: Get Peak Audio Level
  kind: query
  command: "< GET {x} AUDIO_IN_PEAK_LVL >"
  params:
    - name: x
      type: string
      description: Channel number 0 (all) or 1-4
  notes: "Firmware > v2.0. Returns REP x AUDIO_IN_PEAK_LVLnnn where nnn is 000-060."

- id: get_na_device_name
  label: Get Network Audio Device Name
  kind: query
  command: "< GET NA_DEVICE_NAME >"
  params: []
  notes: Returns 31-character device name (padded with spaces).

- id: get_na_chan_name
  label: Get Network Audio Channel Name
  kind: query
  command: "< GET NA_CHAN_NAME >"
  params: []
  notes: "Returns REP xx NA_CHAN_NAME {31-char name}. xx = channel (ANI4OUT uses 1-4, source says all channels use 0 for ANI4OUT context)."

- id: get_control_mac_addr
  label: Get Control Network MAC Address
  kind: query
  command: "< GET CONTROL_MAC_ADDR >"
  params: []
  notes: "Returns 17-character MAC address (e.g. 00:0E:DD:FF:F1:63)."

- id: restore_default_settings
  label: Restore Default Settings
  kind: action
  command: "< SET DEFAULT_SETTINGS >"
  params: []
  notes: "Firmware > v2.0. Device replies with REP PRESET 00 on success."

- id: get_led_state_sig_clip
  label: Get LED State (Sig/Clip)
  kind: query
  command: "< GET {x} LED_STATE_SIG_CLIP >"
  params:
    - name: x
      type: string
      description: Channel number 0-4
  notes: "Returns yyy = On - Steady, Flashing, or Off."

- id: get_peq_filter_enable
  label: Get PEQ Filter Enable
  kind: query
  command: "< GET {xx} PEQ {yy} >"
  params:
    - name: xx
      type: string
      description: PEQ block 01-04 (00 = all blocks)
    - name: yy
      type: string
      description: PEQ filter 01-04 within block (00 = all filters)
  notes: "Firmware > v2.0. Source documents the response format (REP xx PEQ yy ON/OFF) but not the GET command line itself - UNRESOLVED: full GET command string not stated."

- id: get_encryption
  label: Get Encryption Status
  kind: query
  command: "< GET ENCRYPTION >"
  params: []
  notes: "Firmware > v2.0. Returns ON or OFF."

Feedbacks

- id: audio_mute
  type: enum
  values: [on, off]
  notes: "Per-channel (x = 0-4). Rep string: < REP x AUDIO_MUTE ON/OFF >"

- id: sig_clip_led
  type: enum
  values: [off, green, amber, red]
  notes: "Per-channel (x = 0-4). Rep string: < REP x LED_COLOR_SIG_CLIP {state} >"

- id: led_state
  type: enum
  values: ["on_steady", flashing, off]
  notes: "Per-channel (x = 0-4). Rep string: < REP x LED_STATE_SIG_CLIP yyy >"

- id: led_brightness
  type: enum
  values: ["0_disabled", "1_dim", "2_default"]
  notes: "Device-level. Rep string: < REP LED_BRIGHTNESS n >"

- id: phantom_power
  type: enum
  values: [on, off]
  notes: "Per-channel. Rep string: < REP x PHANTOM_PWR_ENABLE ON/OFF >"

- id: hw_gating_logic
  type: enum
  values: [on, off]
  notes: "Per-channel (x = 0-4). ANI4IN-BLOCK only. Rep string: < REP x HW_GATING_LOGIC ON/OFF >"

- id: chan_led_in_state
  type: enum
  values: [on, off]
  notes: "Per-channel (x = 0-4). ANI4IN-BLOCK only. Rep string: < REP x CHAN_LED_IN_STATE ON/OFF >"

- id: input_meter_mode
  type: enum
  values: [pre_fader, post_fader]
  notes: "Device-level. Rep string: < REP INPUT_METER_MODE {value} >"

- id: limiter_engaged
  type: enum
  values: [on, off]
  notes: "Per-channel (x = 1 or 3 only, summing mode). Rep string: < REP x LIMITER_ENGAGED ON/OFF >"

- id: audio_summing_mode
  type: enum
  values: [off, "1+2", "3+4", "1+2/3+4", "1+2+3+4"]
  notes: "Device-level. Rep string: < REP AUDIO_SUMMING_MODE {value} >"

- id: encryption
  type: enum
  values: [on, off]
  notes: "Device-level. Rep string: < REP ENCRYPTION ON/OFF >"

- id: active_preset
  type: string
  notes: "01-10. Rep string: < REP PRESET nn >"

- id: audio_gain_hi_res
  type: integer
  notes: "Per-channel (x = 0-4). Range 0000-1400 in 0.1 dB steps. Rep string: < REP x AUDIO_GAIN_HI_RES yyyy >"

- id: audio_gain
  type: integer
  notes: "Per-channel (x = 0-4). Range 00-51 in 3 dB steps. Rep string: < REP x AUDIO_GAIN yy >"

- id: peak_audio_level
  type: integer
  notes: "Per-channel. Range 000-060. Rep string: < REP x AUDIO_IN_PEAK_LVLnnn >"

- id: rms_audio_level
  type: integer
  notes: "Per-channel. UNRESOLVED: exact range and reply string format for AUDIO_IN_RMS_LVL not stated in source."

Variables

- id: model
  type: string
  length: 32
  notes: "Rep string: < REP MODEL {32-char model} >"

- id: serial_num
  type: string
  length: 32
  notes: "Rep string: < REP SERIAL_NUM {32-char serial} >"

- id: fw_ver
  type: string
  length: 18
  notes: "Rep string: < REP FW_VER {18-char fwver} >"

- id: ip_addr_audio
  type: string
  length: 15
  notes: "Rep string: < REP IP_ADDR_NET_AUDIO_PRIMARY {15-char ip} >"

- id: ip_subnet_audio
  type: string
  length: 15
  notes: "Rep string: < REP IP_SUBNET_NET_AUDIO_PRIMARY {15-char subnet} >"

- id: ip_gateway_audio
  type: string
  length: 15
  notes: "Rep string: < REP IP_GATEWAY_NET_AUDIO_PRIMARY {15-char gw} >"

- id: chan_name
  type: string
  length: 31
  notes: "Per-channel (x = 0-4). Padded with spaces. Rep string: < REP x CHAN_NAME {31-char name} >"

- id: device_id
  type: string
  length: 31
  notes: "Device-level. Rep string: < REP DEVICE_ID {31-char id} >"

- id: na_device_name
  type: string
  length: 31
  notes: "Device-level. Rep string: < REP NA_DEVICE_NAME {31-char name} >"

- id: na_chan_name
  type: string
  length: 31
  notes: "Network audio channel. Rep string: < REP xx NA_CHAN_NAME {31-char name} >"

- id: control_mac_addr
  type: string
  length: 17
  notes: "Device-level. Format yy:yy:yy:yy:yy:yy. Rep string: < REP CONTROL_MAC_ADDR {mac} >"

- id: preset1_name
  type: string
  length: 25
  notes: "Rep string: < REP PRESET1 {25-char name} >"

- id: preset2_name
  type: string
  length: 25
  notes: "Rep string: < REP PRESET2 {25-char name} >"

- id: preset3_name
  type: string
  length: 25
  notes: "Rep string: < REP PRESET3 {25-char name} >"

- id: meter_rate
  type: integer
  notes: "0 (off) or >=100 ms. Rep string: < REP METER_RATE sssss >"

- id: last_error_event
  type: string
  max_length: 128
  notes: "Firmware > v2.0. Rep string: < REP LAST_ERROR_EVENT {128-char err} >"

- id: peq_filter_enable
  type: enum
  values: [on, off]
  notes: "Firmware > v2.0. Rep string: < REP xx PEQ yy ON/OFF >. UNRESOLVED: full GET command string not stated in source."

Events

- id: parameter_report
  description: "Unsolicited REPORT string emitted by ANI4IN whenever any of these parameters change on the device or through the GUI: AUDIO_MUTE, AUDIO_GAIN, AUDIO_GAIN_HI_RES, LED_COLOR_SIG_CLIP, LED_BRIGHTNESS, PHANTOM_PWR_ENABLE, HW_GATING_LOGIC, CHAN_LED_IN_STATE, INPUT_METER_MODE, LIMITER_ENGAGED, AUDIO_SUMMING_MODE, ENCRYPTION, PRESET, NA_DEVICE_NAME, NA_CHAN_NAME, CHAN_NAME, DEVICE_ID, LED_STATE_SIG_CLIP."
  notes: "Application should subscribe to REP strings rather than polling GET. Rep format: < REP {params} >"

- id: audio_sample
  description: Streaming SAMPLE messages emitted while metering is active.
  format: "< SAMPLE {aaa} {bbb} {ccc} {ddd} >"
  notes: "aaa=output 1, bbb=output 2, ccc=output 3, ddd=output 4. Each value 000-060. Emitted at rate set by SET METER_RATE sssss."

Macros

# UNRESOLVED: source does not describe any multi-step sequences as named macros.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings, interlock procedures, or power-on sequencing requirements.

Notes

  • Connection model: TCP/IP, port 2202. Source says "select 'Client' in the AMX/Crestron program" — the device accepts inbound TCP client connections from the controller.
  • Message framing: ASCII strings wrapped in < and > angle brackets. All messages terminated with >.
  • Channel encoding: x is the channel character. Source documents 0 (all) and 1-4 for individual channels.
  • ANAI4IN-BLOCK variant: Commands for HW_GATING_LOGIC and CHAN_LED_IN_STATE only apply to the BLOCK (logic-enabled) variant.
  • Firmware gating: Commands marked "(firmware > v2.0)" in the source are not available on older firmware. Firmware version itself is queryable via GET FW_VER.
  • Asynchronous reports: Per the source, "Most parameters will send a REPORT command when they change. Thus, it is not necessary to constantly query parameters." Recommended pattern is GET on connect for initial state, then listen for unsolicited REP.
  • Flash auto-off: Front-panel flash command auto-disables after 30 seconds.
  • Source typo noted: The "Decrease Digital Audio Gain" section shows response range "0000 to 1280" while the rest of the gain command set uses 0000-1400. Preserved as documented; flag for verification.
  • Metering auto-stop: Setting METER_RATE to 0 (or 00000) stops sample streaming.

Saved at `/tmp/shure_ani4in_spec.md`. 61 actions, 16 feedbacks, 17 variables, 2 events. All 8 YAML blocks parse clean. ANI4OUT commands absent from source → marked unresolved. Three real source gaps flagged: PEQ GET command, RMS response format, ANI4OUT commands.

## Provenance

```yaml
source_domains:
  - content-files.shure.com
  - pubs.shure.com
source_urls:
  - https://content-files.shure.com/Pubs/ANI4IN/ANI4IN_Command_Strings.pdf
  - https://pubs.shure.com/command-strings/MXA310/en-US
  - https://pubs.shure.com/view/guide/ANI4IN/en-US.pdf
  - https://pubs.shure.com/view/guide/ANI4OUT/en-US.pdf
  - https://content-files.shure.com/FileRepository/common-ip-ports-v2.pdf
retrieved_at: 2026-06-15T23:35:32.919Z
last_checked_at: 2026-06-16T07:17:45.335Z

Verification Summary

verdict: verified
checked_at: 2026-06-16T07:17:45.335Z
matched_actions: 61
action_count: 61
confidence: medium
summary: "All 61 spec actions matched verbatim in source with correct transport parameters; bidirectional coverage complete. (9 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "ANI4OUT (output variant) commands are not in this source; spec covers ANI4IN only."
- "full GET command string not stated.\""
- "exact range and reply string format for AUDIO_IN_RMS_LVL not stated in source.\""
- "full GET command string not stated in source.\""
- "source does not describe any multi-step sequences as named macros."
- "source contains no safety warnings, interlock procedures, or power-on sequencing requirements."
- "ANI4OUT (output-side) commands are not in this source. The NA_CHAN_NAME GET response references ANI4OUT channels, but the ANI4OUT-specific commands are not in this document."
- "PEQ filter GET command line is not stated in source — only the response format is documented."
- "RMS audio level exact reply string format is not stated in source (only the GET command is given)."

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