Summary
Spec covers Autonomic MMS (Media Media Server) line. Device exposes a TCP socket control protocol on port 5004 (CRLF-terminated text commands) plus an HTTP JSON API rooted at /api/. All control — playback, browsing, presets, scenes, playlists, queue, triggers — goes through one of these two transports.
Transport
protocols:
- tcp
- http
addressing:
port: 5004
base_url: "http://{deviceIp}/api/"
auth:
type: none # inferred: no auth procedure in source
Traits
- powerable # inferred from SetOutputTrigger
- routable # inferred from Play<Container> / BrowseTopMenu routing
- queryable # inferred from GetStatus / SubscribeEvents
- levelable # inferred from SetVolume 0-50
Actions
# Connection preamble
- id: set_client_type
label: Set Client Type
kind: action
command: "SetClientType {name}"
params:
- name: name
type: string
description: Free-form client identifier
- id: set_client_version
label: Set Client Version
kind: action
command: "SetClientVersion {version}"
params:
- name: version
type: string
description: MAJOR.MINOR.BUILD.REVISION
- id: set_host
label: Set Host
kind: action
command: "SetHost {ip}"
params:
- name: ip
type: string
description: IP the client used to reach MMS
- id: set_xml_mode
label: Set XML Mode
kind: action
command: "SetXmlMode {mode}"
params:
- name: mode
type: string
description: "None | Lists"
- id: set_encoding
label: Set Encoding
kind: action
command: "SetEncoding {codepage}"
params:
- name: codepage
type: string
description: "65001 for UTF-8"
- id: set_instance
label: Set Instance
kind: action
command: "SetInstance {instance}"
params:
- name: instance
type: string
description: Target output instance name (e.g. Player_A)
- id: subscribe_events
label: Subscribe Events
kind: action
command: "SubscribeEvents {filter}"
params:
- name: filter
type: string
description: "Optional boolean or comma-delimited event list. Omit for all."
- id: get_status
label: Get Status
kind: query
command: "GetStatus"
- id: set_option
label: Set Option
kind: action
command: "SetOption {key}={value}"
params:
- name: key
type: string
description: "supports_playnow | supports_inputbox | supports_urls"
- name: value
type: string
description: "true | false"
# Playback control
- id: play
label: Play
kind: action
command: "Play"
- id: pause
label: Pause
kind: action
command: "Pause"
- id: play_pause
label: Play / Pause Toggle
kind: action
command: "PlayPause"
- id: seek
label: Seek
kind: action
command: "Seek {position}"
params:
- name: position
type: integer
description: "Non-negative int (0..TrackDuration) for position from start; negative int (-1..-TrackDuration) for position from end"
- id: skip_next
label: Skip Next
kind: action
command: "SkipNext"
- id: skip_previous
label: Skip Previous
kind: action
command: "SkipPrevious"
- id: thumbs_up
label: Thumbs Up Toggle
kind: action
command: "ThumbsUp"
- id: thumbs_down
label: Thumbs Down Toggle
kind: action
command: "ThumbsDown"
- id: set_volume
label: Set Volume
kind: action
command: "SetVolume {level}"
params:
- name: level
type: integer
description: "0-50. Output must be in variable gain mode."
- id: set_stars
label: Set Stars
kind: action
command: "SetStars {value}"
params:
- name: value
type: integer
description: "0-5"
# Navigation
- id: back
label: Back
kind: action
command: "Back {steps}"
params:
- name: steps
type: integer
description: Number of pages to jump back in nav stack. 0 = current page.
- id: repeat
label: Repeat Toggle
kind: action
command: "Repeat"
- id: shuffle
label: Shuffle Toggle
kind: action
command: "Shuffle"
# Browse
- id: browse_albums
label: Browse Albums
kind: query
command: "BrowseAlbums {start} {count}"
params:
- name: start
type: integer
description: 1-based start index
- name: count
type: integer
description: Max items to return
- id: browse_artists
label: Browse Artists
kind: query
command: "BrowseArtists {start} {count}"
params:
- name: start
type: integer
- name: count
type: integer
- id: browse_composers
label: Browse Composers
kind: query
command: "BrowseComposers {start} {count}"
params:
- name: start
type: integer
- name: count
type: integer
- id: browse_favorites
label: Browse Favorites (Presets)
kind: query
command: "BrowseFavorites {start} {count}"
params:
- name: start
type: integer
- name: count
type: integer
- id: browse_genres
label: Browse Genres
kind: query
command: "BrowseGenres {start} {count}"
params:
- name: start
type: integer
- name: count
type: integer
- id: browse_now_playing
label: Browse Now Playing
kind: query
command: "BrowseNowPlaying {start} {count}"
params:
- name: start
type: integer
- name: count
type: integer
- id: browse_picklist
label: Browse Picklist
kind: query
command: "BrowsePicklist {start} {count}"
params:
- name: start
type: integer
- name: count
type: integer
- id: browse_playlists
label: Browse Playlists
kind: query
command: "BrowsePlaylists {start} {count}"
params:
- name: start
type: integer
- name: count
type: integer
- id: browse_radio_sources
label: Browse Radio Sources
kind: query
command: "BrowseRadioSources {start} {count}"
params:
- name: start
type: integer
- name: count
type: integer
- id: browse_titles
label: Browse Titles
kind: query
command: "BrowseTitles {start} {count}"
params:
- name: start
type: integer
- name: count
type: integer
- id: browse_top_menu
label: Browse Top Menu
kind: query
command: "BrowseTopMenu {start} {count}"
params:
- name: start
type: integer
- name: count
type: integer
- id: browse_top_menu_item
label: Browse Top Menu (Item)
kind: query
command: "BrowseTopMenu itemGuid={childGuid}"
params:
- name: childGuid
type: string
description: Child node guid to enter
- id: browse_service_accounts
label: Browse Service Accounts
kind: query
command: "BrowseServiceAccounts {start} {count}"
params:
- name: start
type: integer
- name: count
type: integer
- id: browse_presets
label: Browse Presets
kind: query
command: "BrowsePresets {start} {count}"
params:
- name: start
type: integer
- name: count
type: integer
- id: browse_scenes
label: Browse Scenes
kind: query
command: "BrowseScenes {start} {count}"
params:
- name: start
type: integer
- name: count
type: integer
# Browse-item selection
- id: ack_pick_item
label: Acknowledge Pick Item
kind: action
command: "AckPickItem {guid}"
params:
- name: guid
type: string
description: Item guid from picklist response
- id: clarify_title_intent
label: Clarify Title Intent
kind: action
command: "ClarifyTitleIntent {guid} {verb}"
params:
- name: guid
type: string
- name: verb
type: string
description: "Next | Now | Replace | AddToQueue | AddToPlaylist"
- id: ack_button_context
label: Acknowledge Context Button
kind: action
command: "AckButton CONTEXT"
# Service account
- id: set_service_account
label: Set Service Account
kind: action
command: "SetServiceAccount {serviceGuid} {accountGuid} {latch}"
params:
- name: serviceGuid
type: string
- name: accountGuid
type: string
- name: latch
type: string
description: "True (session) | False (latched to output)"
- id: set_service_account_clear_service
label: Set Service Account (Clear Service)
kind: action
command: "SetServiceAccount {service} Clear {latch}"
params:
- name: service
type: string
description: Service name or guid
- name: latch
type: string
description: "False"
- id: set_service_account_clear_all
label: Set Service Account (Clear All)
kind: action
command: "SetServiceAccount Clear Clear {latch}"
params:
- name: latch
type: string
description: "False"
# Direct playback
- id: play_album
label: Play Album
kind: action
command: "PlayAlbum {albumGuid} {verb}"
params:
- name: albumGuid
type: string
- name: verb
type: string
description: "Optional: Next | Now | Replace | AddToQueue | AddToPlaylist"
- id: play_artist
label: Play Artist
kind: action
command: "PlayArtist {artistGuid} {verb}"
params:
- name: artistGuid
type: string
- name: verb
type: string
- id: play_composer
label: Play Composer
kind: action
command: "PlayComposer {composerGuid} {verb}"
params:
- name: composerGuid
type: string
- name: verb
type: string
- id: play_genre
label: Play Genre
kind: action
command: "PlayGenre {genreGuid} {verb}"
params:
- name: genreGuid
type: string
- name: verb
type: string
- id: play_playlist
label: Play Playlist
kind: action
command: "PlayPlaylist {playlistGuid} {verb}"
params:
- name: playlistGuid
type: string
- name: verb
type: string
- id: play_preset
label: Play Preset
kind: action
command: "PlayPreset {presetGuid} {verb}"
params:
- name: presetGuid
type: string
- name: verb
type: string
- id: play_scene
label: Play Scene
kind: action
command: "PlayScene {sceneGuid} {verb}"
params:
- name: sceneGuid
type: string
- name: verb
type: string
- id: play_title
label: Play Title
kind: action
command: "PlayTitle {titleGuid} {verb}"
params:
- name: titleGuid
type: string
- name: verb
type: string
# Presets
- id: store_preset
label: Store Preset
kind: action
command: "StorePreset {name}"
params:
- name: name
type: string
description: Optional double-quoted name. Omit to trigger InputBox.
- id: recall_preset
label: Recall Preset
kind: action
command: "RecallPreset {nameOrId}"
params:
- name: nameOrId
type: string
description: Quoted name OR unique guid
- id: edit_preset
label: Edit Preset
kind: action
command: "EditPreset {nameOrId}"
params:
- name: nameOrId
type: string
- id: rename_preset
label: Rename Preset
kind: action
command: "RenamePreset {nameOrId} {newName}"
params:
- name: nameOrId
type: string
- name: newName
type: string
- id: delete_preset
label: Delete Preset
kind: action
command: "DeletePreset {nameOrId}"
params:
- name: nameOrId
type: string
# Scenes
- id: store_scene
label: Store Scene
kind: action
command: "StoreScene {name}"
params:
- name: name
type: string
description: Optional double-quoted name. Omit to trigger InputBox.
- id: recall_scene
label: Recall Scene
kind: action
command: "RecallScene {nameOrId}"
params:
- name: nameOrId
type: string
description: Quoted name OR unique guid
- id: delete_scene
label: Delete Scene
kind: action
command: "DeleteScene {nameOrId}"
params:
- name: nameOrId
type: string
# Playlists
- id: rename_playlist
label: Rename Playlist
kind: action
command: "RenamePlaylist {oldName} {newName}"
params:
- name: oldName
type: string
- name: newName
type: string
- id: delete_playlist
label: Delete Playlist
kind: action
command: "DeletePlaylist {nameOrId}"
params:
- name: nameOrId
type: string
- id: reorder_playlist
label: Reorder Playlist Tracks
kind: action
command: "ReorderPlaylist {playlistId} {sourceTrackId} {destTrackId}"
params:
- name: playlistId
type: string
- name: sourceTrackId
type: string
- name: destTrackId
type: string
# Now Playing queue
- id: jump_to_now_playing_item
label: Jump To Now Playing Item
kind: action
command: "JumpToNowPlayingItem {index}"
params:
- name: index
type: integer
description: 1-based index in queue
- id: reorder_now_playing
label: Reorder Now Playing
kind: action
command: "ReorderNowPlaying {indexToMove} {destIndex}"
params:
- name: indexToMove
type: integer
- name: destIndex
type: integer
- id: remove_now_playing_item
label: Remove Now Playing Item
kind: action
command: "RemoveNowPlayingItem {index}"
params:
- name: index
type: integer
description: 1-based index of track to remove
- id: clear_now_playing
label: Clear Now Playing
kind: action
command: "ClearNowPlaying {stopStations}"
params:
- name: stopStations
type: string
description: "True (default; stations keep playing) | False (clear and stop station playback)"
# Triggers
- id: set_output_trigger
label: Set Output Trigger
kind: action
command: "SetOutputTrigger {index} {state}"
params:
- name: index
type: integer
description: "Trigger index (1-based, in trigger order independent of label)"
- name: state
type: string
description: "true | false"
# HTTP-only
- id: script
label: Script (HTTP batch)
kind: action
command: "Script {urlEncodedCommands}"
params:
- name: urlEncodedCommands
type: string
description: One or more CRLF-joined subcommands, each URL-encoded. Subcommands separated by `/` in HTTP URL.
notes: "HTTP API only. Forces ordered execution across separate socket requests."
Feedbacks
# Push events from MMS. SubscribeEvents to receive; GetStatus to replay current state.
- id: meta_label
type: string
values: []
description: "MetaLabel1..MetaLabel4. Label for corresponding MetaData field."
- id: meta_data
type: string
values: []
description: "MetaData1..MetaData4. MetaData1=station/track count, 2=artist, 3=album, 4=track."
- id: now_playing_guid
type: string
values: []
description: "NowPlayingGuid. ID of now playing item, e.g. {20dd901a-...}."
- id: media_art_changed
type: boolean
values: [true, false]
description: "MediaArtChanged. Always true; reload art when received or when NowPlayingGuid changes."
- id: base_web_url
type: string
values: []
description: "BaseWebUrl. Protocol/address/port for art retrieval, e.g. http://192.168.0.59:5005"
- id: track_time
type: integer
values: []
description: "TrackTime. Current position in seconds (non-negative int). 0 if unknown."
- id: track_duration
type: integer
values: []
description: "TrackDuration. Total track length in seconds (non-negative int). 0 if unknown."
- id: play_state
type: enum
values: [Playing, Paused, Stopped]
description: "PlayState event."
- id: media_control
type: enum
values: [Play, Pause, Stop]
description: "MediaControl event. Same meaning as PlayState."
- id: back
type: boolean
values: [true, false]
description: "Back. True if nav stack has entries. Use `Back <int>` to jump back."
- id: browse_now_playing_available
type: boolean
values: [true, false]
description: "BrowseNowPlayingAvailable. True if queue has more than 0 items."
- id: context_menu
type: boolean
values: [true, false]
description: "ContextMenu. True if AckButton CONTEXT is valid."
- id: mute
type: boolean
values: [true, false]
description: "Mute. Current mute state of selected instance."
- id: play_pause_available
type: boolean
values: [true, false]
description: "PlayPauseAvailable. True if Play/Pause/PlayPause valid."
- id: repeat_available
type: boolean
values: [true, false]
description: "RepeatAvailable. True if Repeat command is valid."
- id: repeat
type: boolean
values: [true, false]
description: "Repeat. Current repeat state."
- id: seek_available
type: boolean
values: [true, false]
description: "SeekAvailable. True if Seek command is valid."
- id: shuffle_available
type: boolean
values: [true, false]
description: "ShuffleAvailable. True if Shuffle command is valid."
- id: shuffle
type: boolean
values: [true, false]
description: "Shuffle. Current shuffle state."
- id: skip_next_available
type: boolean
values: [true, false]
description: "SkipNextAvailable. True if SkipNext is valid."
- id: skip_prev_available
type: boolean
values: [true, false]
description: "SkipPrevAvailable. True if SkipPrevious is valid."
- id: thumbs_up
type: integer
values: [-1, 0, 1]
description: "ThumbsUp. -1=disabled, 0=enabled+unset, 1=enabled+set."
- id: thumbs_down
type: integer
values: [-1, 0, 1]
description: "ThumbsDown. Same semantics as ThumbsUp."
- id: stars
type: integer
values: [-1, 0, 1, 2, 3, 4, 5]
description: "Stars. -1=disabled, 0-5=stars set."
- id: favorites_changed
type: boolean
values: [true, false]
description: "FavoritesChanged. Always true; rebrowse presets on receipt."
- id: favorites_count
type: integer
values: []
description: "FavoritesCount. Number of presets (sent on add/delete only)."
- id: scenes_changed
type: boolean
values: [true, false]
description: "ScenesChanged. Always true; rebrowse scenes on receipt."
- id: scenes_count
type: integer
values: []
description: "ScenesCount. Number of scenes."
- id: playlists_changed
type: boolean
values: [true, false]
description: "PlaylistsChanged. Always true; rebrowse playlists on receipt."
- id: playlist_count
type: integer
values: []
description: "PlaylistCount. Number of playlists (add/delete only)."
- id: trigger_in
type: boolean
values: [true, false]
description: "TriggerIn1..TriggerInN. True when voltage applied to input pin."
- id: local_queue_options
type: string
values: [Next, Now, Replace, AddToQueue, AddToPlaylist]
description: "LocalQueueOptions. Queue modification verbs available for current state."
Variables
# Filters used in HTTP Script example - included as Variables since they look like persistent state.
- id: music_filter
label: Music Filter
command: "SetMusicFilter {value}"
description: "Filter for music browse. Set to Clear to reset."
- id: radio_filter
label: Radio Filter
command: "SetRadioFilter {value}"
description: "Filter for radio browse. Set to Clear to reset."
Events
# Events section is subsumed by Feedbacks (above) plus the source-described envelope:
#
# Format: "EventReason Source Event=Value"
# Examples:
# StateChanged Player_A TrackTime=121
# ReportState Player_A MetaData1=Pandora: Stevie Ray Vaughan Radio
#
# Reasons observed in source: StateChanged, ReportState.
# Source = currently selected instance (e.g. Player_A).
Macros
# Recommended connection preamble (verbatim from source):
preamble:
steps:
- "SetClientType DemoClient"
- "SetClientVersion 1.0.0.0"
- "SetHost 192.168.0.100"
- "SetXmlMode Lists"
- "SetEncoding 65001"
- "SetInstance Player_A"
- "SubscribeEvents"
- "GetStatus"
# Recommended HTTP batch for setting instance + subscribing (from source):
http_preamble:
url_template: "http://{ip}/api/Script/SetInstance%20{instance}/SubscribeEvents%20True"
# Recommended HTTP browse example (from source):
http_browse_example:
url_template: "http://{ip}/api/BrowsePresets/1/10"
scripted_template: "http://{ip}/api/Script/SetMusicFilter%20Clear/SetRadioFilter%20Clear/BrowsePresets%201%2010/"
# UNRESOLVED: no other multi-step sequences defined in source.
Safety
# Trigger pin electrical limits (verbatim from source):
trigger_input_voltage: "5-24V AC or DC" # verbatim
trigger_output: "12VDC 100mA max" # verbatim
confirmation_required_for: []
interlocks: []
# UNRESOLVED: no interlock, lockout, or power-on sequencing procedures described in source.
# No safety warnings other than trigger pin electrical specs.
Notes
- All TCP commands + responses are CRLF-terminated.
- HTTP API commands map by replacing spaces with
/. E.g.SubscribeEvents True→GET /api/SubscribeEvents/True. URL-encode parameters. - HTTP responses arrive on next poll to bare
http://{ip}/api/. Include?clientId=<UUID>on every command + poll request to prevent inter-client cross talk. - HTTP requests are NOT ordered across sockets. Use
Scriptto batch for ordered execution. - Album art URL:
http://{ip}:5005/getart?...(or:80). Fields: c, guid, fmt (png|jpg), instance, h, w, rfle, rflh, rflo, rz. Port may be omitted. - SetVolume 0-50 only works on outputs configured for variable gain (System tab of device config page).
SetClientVersionstrongly recommended; server may adapt behavior to client version.SetHostis for cover-art URL generation in non-flat networks. Wrong value → perf/behavior degradation.SubscribeEventsfollows the client acrossSetInstanceswitches — no re-subscribe needed.- ThumbsDown=1 may auto-skip to next track on some services.
- SkipPrevious restarts current track if TrackTime >= 5 (where supported).
- ClearNowPlaying
False→ clears queue AND stops station playback;True(default) → clears queue but stations keep playing. SetServiceAccountaccepts an optionalFalselatching flag to pin account to a specific output. Omit (orTrue) for session-only.- Browse button field values (0=Off, 1=Add, 2=Delete, 3=Play, 4=Power, 5=PowerOn, 6=Edit, 7=AllTracks, 8=ShuffleAll).
Provenance
source_domains:
- autonomic.atlassian.net
- snapav.com
source_urls:
- https://autonomic.atlassian.net/wiki/spaces/ASKB/pages/1509556225/Autonomic+Media+Server+Control+Protocol
- "https://www.snapav.com/wcsstore/ExtendedSitesCatalogAssetStore/attachments/documents/Amplifiers/ProtocolsAndDrivers/Autonomic%20MAS%20Control%20Protocol.pdf"
- https://autonomic.atlassian.net/wiki
retrieved_at: 2026-05-19T22:32:35.415Z
last_checked_at: 2026-06-02T21:40:19.734Z
Verification Summary
verdict: verified
checked_at: 2026-06-02T21:40:19.734Z
matched_actions: 68
action_count: 68
confidence: medium
summary: "All 68 spec actions matched exactly to source command definitions; transport parameters verified; Feedbacks section covers all source events. (4 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "which specific MMS hardware revisions / SKUs (MMS-1, MMS-2, MMS-5, etc.) the protocol covers — source is a generic \"MMS\" doc"
- "no other multi-step sequences defined in source."
- "no interlock, lockout, or power-on sequencing procedures described in source."
- "firmware version compatibility, specific MMS hardware SKUs, default admin credentials (none documented — auth assumed none), full enumeration of all possible event reasons beyond StateChanged/ReportState, behavior when MMS rejects a command"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0