From OpenHome

(Difference between revisions)
Jump to: navigation, search
(Created page with "= Transport Service = == Overview == The Transport service provides source-independent control of play, pause, stop, skip and seek. If a device's [[Av:Developer:ProductService |...")
(SeekSecondAbsolute)
 
(7 intermediate revisions not shown)
Line 7: Line 7:
== Evented Properties ==
== Evented Properties ==
=== Modes ===
=== Modes ===
-
Space separated list of available modes.
+
List of available modes (JSON array of strings).
-
=== NextAvailable ===
+
=== CanSkipNext ===
-
<tt>true</tt> if the <tt>Next</tt> (skip forwards) action is currently available; <tt>false</tt> otherwise.
+
<tt>true</tt> if the <tt>SkipNext</tt> action is currently available; <tt>false</tt> otherwise.
-
Any mode that is sometimes capable of changing stream as a consequence of <tt>Next</tt> will always report <tt>NextAvailable</tt> as <tt>true</tt>.
+
Any mode that is sometimes capable of changing stream as a consequence of <tt>SkipNext</tt> will always report <tt>CanSkipNext</tt> as <tt>true</tt>.
-
=== PrevAvailable ===
+
=== CanSkipPrevious ===
-
<tt>true</tt> if the <tt>Prev</tt> (skip backwards) action is currently available; <tt>false</tt> otherwise.
+
<tt>true</tt> if the <tt>SkipPrevious</tt> action is currently available; <tt>false</tt> otherwise.
-
Any mode that is sometimes capable of changing stream as a consequence of <tt>Prev</tt> will always report <tt>PrevAvailable</tt> as <tt>true</tt>.
+
Any mode that is sometimes capable of changing stream as a consequence of <tt>SkipPrevious</tt> will always report <tt>CanSkipPrevious</tt> as <tt>true</tt>.
-
=== RepeatAvailable ===
+
=== CanRepeat ===
<tt>true</tt> if the <tt>SetRepeat</tt> action is currently available; <tt>false</tt> otherwise.
<tt>true</tt> if the <tt>SetRepeat</tt> action is currently available; <tt>false</tt> otherwise.
-
=== RandomAvailable ===
+
=== CanShuffle ===
-
<tt>true</tt> if the <tt>SetRandom</tt> action is currently available; <tt>false</tt> otherwise.
+
<tt>true</tt> if the <tt>SetShuffle</tt> action is currently available; <tt>false</tt> otherwise.
=== StreamId ===
=== StreamId ===
Integer id, uniquely identifying the current stream.
Integer id, uniquely identifying the current stream.
-
=== Seekable ===
+
=== CanSeek ===
-
<tt>true</tt> if the <tt>SeekSecondsAbsolute</tt> and <tt>SeekSecondsRelative</tt> actions are available for the current stream; <tt>false</tt> otherwise.
+
<tt>true</tt> if the <tt>SeekSecondAbsolute</tt> and <tt>SeekSecondRelative</tt> actions are available for the current stream; <tt>false</tt> otherwise.
-
=== Pausable ===
+
=== CanPause ===
<tt>true</tt> if the stream can be paused (so is not being played at a rate determined by a remote sender); <tt>false</tt> otherwise.
<tt>true</tt> if the stream can be paused (so is not being played at a rate determined by a remote sender); <tt>false</tt> otherwise.
Line 43: Line 43:
=== Repeat ===
=== Repeat ===
-
<tt>true</tt> if repeat mode is currently enabled (i.e. playing content will loop endlessly).
+
<tt>true</tt> if repeat mode is currently enabled; <tt>false</tt> otherwise.
 +
 
 +
=== Shuffle ===
 +
<tt>true</tt> if shuffle mode is currently enabled; <tt>false</tt> otherwise.
-
=== Random ===
 
-
<tt>true</tt> if random (aka shuffle) mode is currently enabled.
 
== Actions ==
== Actions ==
Line 81: Line 82:
=== Next ===
=== Next ===
<tt>
<tt>
-
Arguments: (in uint streamId)
+
Arguments: None
</tt><br>
</tt><br>
Move to the next stream (i.e. skip forwards).  Determination of what comes next may vary between sources/modes.  If <tt>TransportState</tt> is <tt>Stopped</tt> or <tt>Paused</tt>, try to start playing.
Move to the next stream (i.e. skip forwards).  Determination of what comes next may vary between sources/modes.  If <tt>TransportState</tt> is <tt>Stopped</tt> or <tt>Paused</tt>, try to start playing.
-
Returns a <tt>801</tt> fault code if the current channel does not support skipping forwards.
+
=== Previous ===
-
 
+
-
=== Prev ===
+
<tt>
<tt>
-
Arguments: (in uint streamId)
+
Arguments: None
</tt><br>
</tt><br>
Move to the previous stream (i.e. skip backwards).  If <tt>TransportState</tt> is <tt>Stopped</tt> or <tt>Paused</tt>, try to start playing.
Move to the previous stream (i.e. skip backwards).  If <tt>TransportState</tt> is <tt>Stopped</tt> or <tt>Paused</tt>, try to start playing.
Line 97: Line 96:
=== SetRepeat ===
=== SetRepeat ===
<tt>
<tt>
-
Arguments: (in bool repeat)
+
Arguments: (in uint repeat)
</tt><br>
</tt><br>
Sets the Repeat state of the device, affecting all sources that are capable of implementing a repeat feature.
Sets the Repeat state of the device, affecting all sources that are capable of implementing a repeat feature.
-
=== SetRandom ===
+
=== SetShuffle ===
<tt>
<tt>
-
Arguments: (in bool random)
+
Arguments: (in uint shuffle)
</tt><br>
</tt><br>
-
Sets the Random (aka Shuffle) state of the device, affecting all sources that are capable of implementing a randomise feature.
+
Sets the Shuffle state of the device, affecting all sources that are capable of implementing a randomise feature.
-
=== SeekSecondsAbsolute ===
+
=== SeekSecondAbsolute ===
<tt>
<tt>
Arguments: (in uint streamId, in uint secondsAbsolute)
Arguments: (in uint streamId, in uint secondsAbsolute)
Line 113: Line 112:
Seek to an absolute position in the current stream.  If <tt>TransportState</tt> is <tt>Stopped</tt> or <tt>Paused</tt>, try to start playing.
Seek to an absolute position in the current stream.  If <tt>TransportState</tt> is <tt>Stopped</tt> or <tt>Paused</tt>, try to start playing.
-
Returns a <tt>801</tt> fault code if the current stream does not support seek.
+
Returns a <tt>803</tt> fault code if the seek is not possible.
-
[[br]]Returns a <tt>803</tt> fault code if the seek position is beyond the end of the stream.
+
-
=== SeekSecondsRelative ===
+
=== SeekSecondRelative ===
<tt>
<tt>
Arguments: (in uint streamId, in int secondsRelative)
Arguments: (in uint streamId, in int secondsRelative)
Line 122: Line 120:
Seek to a position relative to what's currently playing in the current stream.  If <tt>TransportState</tt> is <tt>Stopped</tt> or <tt>Paused</tt>, try to start playing.
Seek to a position relative to what's currently playing in the current stream.  If <tt>TransportState</tt> is <tt>Stopped</tt> or <tt>Paused</tt>, try to start playing.
-
Returns a <tt>801</tt> fault code if the current stream does not support seek.
+
Returns a <tt>803</tt> fault code if the seek is not possible.
-
[[br]]Returns a <tt>803</tt> fault code if the seek position is beyond the end of the stream.
+
=== TransportState ===
=== TransportState ===
Line 139: Line 136:
=== ModeInfo ===
=== ModeInfo ===
<tt>
<tt>
-
Arguments: (out string mode, out bool nextAvailable, out bool prevAvailable)
+
Arguments: (out string mode, out bool canSkipNext, out bool canSkipPrevious, out bool canRepeat, out bool canShuffle)
</tt><br>
</tt><br>
-
Reports the values of the <tt>Mode</tt>, <tt>NextAvailable</tt> and <tt>PrevAvailable</tt> properties.
+
Reports the values of the <tt>Mode</tt>, <tt>CanSkipNext</tt>, <tt>CanSkipPrev</tt>, <tt>CanRepeat</tt> and <tt>CanShuffle</tt> properties.
=== StreamInfo ===
=== StreamInfo ===
Line 162: Line 159:
=== Repeat ===
=== Repeat ===
<tt>
<tt>
-
Arguments: (out bool repeat)
+
Arguments: (out uint repeat)
</tt><br>
</tt><br>
Read the current value of the <tt>Repeat</tt> property.
Read the current value of the <tt>Repeat</tt> property.
-
=== Random ===
+
=== Shuffle ===
<tt>
<tt>
-
Arguments: (out bool random)
+
Arguments: (out uint shuffle)
</tt><br>
</tt><br>
-
Read the current value of the <tt>Random</tt> property.
+
Read the current value of the <tt>Shuffle</tt> property.
== UPnP Service Description ==
== UPnP Service Description ==
Line 211: Line 208:
     </action>
     </action>
     <action>
     <action>
-
       <name>Next</name>
+
       <name>SkipNext</name>
-
      <argumentList>
+
-
        <argument>
+
-
          <name>StreamId</name>
+
-
          <direction>in</direction>
+
-
          <relatedStateVariable>StreamId</relatedStateVariable>
+
-
        </argument>
+
-
      </argumentList>
+
     </action>
     </action>
     <action>
     <action>
-
       <name>Prev</name>
+
       <name>SkipPrevious</name>
-
      <argumentList>
+
-
        <argument>
+
-
          <name>StreamId</name>
+
-
          <direction>in</direction>
+
-
          <relatedStateVariable>StreamId</relatedStateVariable>
+
-
        </argument>
+
-
      </argumentList>
+
     </action>
     </action>
     <action>
     <action>
Line 236: Line 219:
           <name>Repeat</name>
           <name>Repeat</name>
           <direction>in</direction>
           <direction>in</direction>
-
           <relatedStateVariable>A_ARG_TYPE_boolean</relatedStateVariable>
+
           <relatedStateVariable>Repeat</relatedStateVariable>
         </argument>
         </argument>
       </argumentList>
       </argumentList>
     </action>
     </action>
     <action>
     <action>
-
       <name>SetRandom</name>
+
       <name>SetShuffle</name>
       <argumentList>
       <argumentList>
         <argument>
         <argument>
-
           <name>Random</name>
+
           <name>Shuffle</name>
           <direction>in</direction>
           <direction>in</direction>
-
           <relatedStateVariable>A_ARG_TYPE_boolean</relatedStateVariable>
+
           <relatedStateVariable>Shuffle</relatedStateVariable>
         </argument>
         </argument>
       </argumentList>
       </argumentList>
     </action>
     </action>
     <action>
     <action>
-
       <name>SeekSecondsAbsolute</name>
+
       <name>SeekSecondAbsolute</name>
       <argumentList>
       <argumentList>
         <argument>
         <argument>
Line 259: Line 242:
         </argument>
         </argument>
         <argument>
         <argument>
-
           <name>SecondsAbsolute</name>
+
           <name>SecondAbsolute</name>
           <direction>in</direction>
           <direction>in</direction>
           <relatedStateVariable>A_ARG_TYPE_uint</relatedStateVariable>
           <relatedStateVariable>A_ARG_TYPE_uint</relatedStateVariable>
Line 266: Line 249:
     </action>
     </action>
     <action>
     <action>
-
       <name>SeekSecondsRelative</name>
+
       <name>SeekSecondRelative</name>
       <argumentList>
       <argumentList>
         <argument>
         <argument>
Line 274: Line 257:
         </argument>
         </argument>
         <argument>
         <argument>
-
           <name>SecondsRelative</name>
+
           <name>SecondRelative</name>
           <direction>in</direction>
           <direction>in</direction>
           <relatedStateVariable>A_ARG_TYPE_int</relatedStateVariable>
           <relatedStateVariable>A_ARG_TYPE_int</relatedStateVariable>
Line 304: Line 287:
       <argumentList>
       <argumentList>
         <argument>
         <argument>
-
           <name>NextAvailable</name>
+
           <name>CanSkipNext</name>
           <direction>out</direction>
           <direction>out</direction>
-
           <relatedStateVariable>NextAvailable</relatedStateVariable>
+
           <relatedStateVariable>CanSkipNext</relatedStateVariable>
         </argument>
         </argument>
         <argument>
         <argument>
-
           <name>PrevAvailable</name>
+
           <name>CanSkipPrevious</name>
           <direction>out</direction>
           <direction>out</direction>
-
           <relatedStateVariable>PrevAvailable</relatedStateVariable>
+
           <relatedStateVariable>CanSkipPrevious</relatedStateVariable>
         </argument>
         </argument>
         <argument>
         <argument>
-
           <name>RepeatAvailable</name>
+
           <name>CanRepeat</name>
           <direction>out</direction>
           <direction>out</direction>
-
           <relatedStateVariable>RepeatAvailable</relatedStateVariable>
+
           <relatedStateVariable>CanRepeat</relatedStateVariable>
         </argument>
         </argument>
         <argument>
         <argument>
-
           <name>RandomAvailable</name>
+
           <name>CanShuffle</name>
           <direction>out</direction>
           <direction>out</direction>
-
           <relatedStateVariable>RandomAvailable</relatedStateVariable>
+
           <relatedStateVariable>CanShuffle</relatedStateVariable>
         </argument>
         </argument>
       </argumentList>
       </argumentList>
Line 334: Line 317:
         </argument>
         </argument>
         <argument>
         <argument>
-
           <name>Seekable</name>
+
           <name>CanSeek</name>
           <direction>out</direction>
           <direction>out</direction>
-
           <relatedStateVariable>Seekable</relatedStateVariable>
+
           <relatedStateVariable>CanSeek</relatedStateVariable>
         </argument>
         </argument>
         <argument>
         <argument>
-
           <name>Pausable</name>
+
           <name>CanPause</name>
           <direction>out</direction>
           <direction>out</direction>
-
           <relatedStateVariable>Pausable</relatedStateVariable>
+
           <relatedStateVariable>CanPause</relatedStateVariable>
         </argument>
         </argument>
       </argumentList>
       </argumentList>
Line 366: Line 349:
     </action>
     </action>
     <action>
     <action>
-
       <name>Random</name>
+
       <name>Shuffle</name>
       <argumentList>
       <argumentList>
         <argument>
         <argument>
-
           <name>Random</name>
+
           <name>Shuffle</name>
           <direction>out</direction>
           <direction>out</direction>
-
           <relatedStateVariable>Random</relatedStateVariable>
+
           <relatedStateVariable>Shuffle</relatedStateVariable>
         </argument>
         </argument>
       </argumentList>
       </argumentList>
Line 382: Line 365:
     </stateVariable>
     </stateVariable>
     <stateVariable sendEvents="yes">
     <stateVariable sendEvents="yes">
-
       <name>NextAvailable</name>
+
       <name>CanSkipNext</name>
       <dataType>boolean</dataType>
       <dataType>boolean</dataType>
     </stateVariable>
     </stateVariable>
     <stateVariable sendEvents="yes">
     <stateVariable sendEvents="yes">
-
       <name>PrevAvailable</name>
+
       <name>CanSkipPrevious</name>
       <dataType>boolean</dataType>
       <dataType>boolean</dataType>
     </stateVariable>
     </stateVariable>
     <stateVariable sendEvents="yes">
     <stateVariable sendEvents="yes">
-
       <name>RepeatAvailable</name>
+
       <name>CanRepeat</name>
       <dataType>boolean</dataType>
       <dataType>boolean</dataType>
     </stateVariable>
     </stateVariable>
     <stateVariable sendEvents="yes">
     <stateVariable sendEvents="yes">
-
       <name>RandomAvailable</name>
+
       <name>CanShuffle</name>
       <dataType>boolean</dataType>
       <dataType>boolean</dataType>
     </stateVariable>
     </stateVariable>
Line 402: Line 385:
     </stateVariable>
     </stateVariable>
     <stateVariable sendEvents="yes">
     <stateVariable sendEvents="yes">
-
       <name>Seekable</name>
+
       <name>CanSeek</name>
       <dataType>boolean</dataType>
       <dataType>boolean</dataType>
     </stateVariable>
     </stateVariable>
     <stateVariable sendEvents="yes">
     <stateVariable sendEvents="yes">
-
       <name>Pausable</name>
+
       <name>CanPause</name>
       <dataType>boolean</dataType>
       <dataType>boolean</dataType>
     </stateVariable>
     </stateVariable>
Line 425: Line 408:
     </stateVariable>
     </stateVariable>
     <stateVariable sendEvents="yes">
     <stateVariable sendEvents="yes">
-
       <name>Random</name>
+
       <name>Shuffle</name>
       <dataType>boolean</dataType>
       <dataType>boolean</dataType>
     </stateVariable>
     </stateVariable>
Line 439: Line 422:
       <name>A_ARG_TYPE_string</name>
       <name>A_ARG_TYPE_string</name>
       <dataType>string</dataType>
       <dataType>string</dataType>
-
    </stateVariable>
 
-
    <stateVariable sendEvents="no">
 
-
      <name>A_ARG_TYPE_boolean</name>
 
-
      <dataType>boolean</dataType>
 
     </stateVariable>
     </stateVariable>
   </serviceStateTable>
   </serviceStateTable>
</scpd>
</scpd>
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 11:46, 10 January 2018

Contents

Transport Service

Overview

The Transport service provides source-independent control of play, pause, stop, skip and seek.

If a device's Product service reports an attribute "Transport", then that device is guaranteed to bear the Transport service. If the Transport service is available, all its properties and actions must be fully implemented.

Evented Properties

Modes

List of available modes (JSON array of strings).

CanSkipNext

true if the SkipNext action is currently available; false otherwise.

Any mode that is sometimes capable of changing stream as a consequence of SkipNext will always report CanSkipNext as true.

CanSkipPrevious

true if the SkipPrevious action is currently available; false otherwise.

Any mode that is sometimes capable of changing stream as a consequence of SkipPrevious will always report CanSkipPrevious as true.

CanRepeat

true if the SetRepeat action is currently available; false otherwise.

CanShuffle

true if the SetShuffle action is currently available; false otherwise.

StreamId

Integer id, uniquely identifying the current stream.

CanSeek

true if the SeekSecondAbsolute and SeekSecondRelative actions are available for the current stream; false otherwise.

CanPause

true if the stream can be paused (so is not being played at a rate determined by a remote sender); false otherwise.

TransportState

One of

  • Playing
  • Paused
  • Stopped
  • Buffering
  • Waiting

Repeat

true if repeat mode is currently enabled; false otherwise.

Shuffle

true if shuffle mode is currently enabled; false otherwise.


Actions

PlayAs

Arguments: (in string mode, in string command)
Start a new stream playing, specifying both a mode (source) to be used and a mode-specific command which describes the track to be played. Common options for modes and commands are documented separately.

Play

Arguments: None
Start a pending stream playing.

A stream must be ready to play. Possibly via calls to another network service.

Behaviour when a stream is already playing varies depending on the active modes (source).

Pause

Arguments: None
Pause the current stream.

Returns a 801 fault code if the current channel does not support being paused (is being played at a rate determined by a remote sender).

Stop

Arguments: None Stop the current stream.

Next

Arguments: None
Move to the next stream (i.e. skip forwards). Determination of what comes next may vary between sources/modes. If TransportState is Stopped or Paused, try to start playing.

Previous

Arguments: None
Move to the previous stream (i.e. skip backwards). If TransportState is Stopped or Paused, try to start playing.

Returns a 801 fault code if the current channel does not support skipping backwards.

SetRepeat

Arguments: (in uint repeat)
Sets the Repeat state of the device, affecting all sources that are capable of implementing a repeat feature.

SetShuffle

Arguments: (in uint shuffle)
Sets the Shuffle state of the device, affecting all sources that are capable of implementing a randomise feature.

SeekSecondAbsolute

Arguments: (in uint streamId, in uint secondsAbsolute)
Seek to an absolute position in the current stream. If TransportState is Stopped or Paused, try to start playing.

Returns a 803 fault code if the seek is not possible.

SeekSecondRelative

Arguments: (in uint streamId, in int secondsRelative)
Seek to a position relative to what's currently playing in the current stream. If TransportState is Stopped or Paused, try to start playing.

Returns a 803 fault code if the seek is not possible.

TransportState

Arguments: (out string state)
Read the current value of the TransportState property.

Modes

Arguments: (out string modes)
Return the value of the Modes property.

ModeInfo

Arguments: (out string mode, out bool canSkipNext, out bool canSkipPrevious, out bool canRepeat, out bool canShuffle)
Reports the values of the Mode, CanSkipNext, CanSkipPrev, CanRepeat and CanShuffle properties.

StreamInfo

Arguments:
(out uint streamId, out bool seekable, out bool pausable)

Reports current stream information:

  • StreamId
  • Seekable
  • Pausable

StreamId

Arguments: (out uint streamId)
Read the current value of the StreamId property.

Repeat

Arguments: (out uint repeat)
Read the current value of the Repeat property.

Shuffle

Arguments: (out uint shuffle)
Read the current value of the Shuffle property.

UPnP Service Description

For devices supporting the UPnP protocol, the service description is

name: "Transport"
domain: "av.openhome.org"
version: "1"

<?xml version="1.0" encoding="utf-8"?>
<scpd xmlns="urn:schemas-upnp-org:service-1-0">
  <specVersion>
    <major>1</major>
    <minor>0</minor>
  </specVersion>
  <actionList>
    <action>
      <name>PlayAs</name>
      <argumentList>
        <argument>
          <name>Mode</name>
          <direction>in</direction>
          <relatedStateVariable>A_ARG_TYPE_string</relatedStateVariable>
        </argument>
        <argument>
          <name>Command</name>
          <direction>in</direction>
          <relatedStateVariable>A_ARG_TYPE_string</relatedStateVariable>
        </argument>
      </argumentList>
    </action>
    <action>
      <name>Play</name>
    </action>
    <action>
      <name>Pause</name>
    </action>
    <action>
      <name>Stop</name>
    </action>
    <action>
      <name>SkipNext</name>
    </action>
    <action>
      <name>SkipPrevious</name>
    </action>
    <action>
      <name>SetRepeat</name>
      <argumentList>
        <argument>
          <name>Repeat</name>
          <direction>in</direction>
          <relatedStateVariable>Repeat</relatedStateVariable>
        </argument>
      </argumentList>
    </action>
    <action>
      <name>SetShuffle</name>
      <argumentList>
        <argument>
          <name>Shuffle</name>
          <direction>in</direction>
          <relatedStateVariable>Shuffle</relatedStateVariable>
        </argument>
      </argumentList>
    </action>
    <action>
      <name>SeekSecondAbsolute</name>
      <argumentList>
        <argument>
          <name>StreamId</name>
          <direction>in</direction>
          <relatedStateVariable>StreamId</relatedStateVariable>
        </argument>
        <argument>
          <name>SecondAbsolute</name>
          <direction>in</direction>
          <relatedStateVariable>A_ARG_TYPE_uint</relatedStateVariable>
        </argument>
      </argumentList>
    </action>
    <action>
      <name>SeekSecondRelative</name>
      <argumentList>
        <argument>
          <name>StreamId</name>
          <direction>in</direction>
          <relatedStateVariable>StreamId</relatedStateVariable>
        </argument>
        <argument>
          <name>SecondRelative</name>
          <direction>in</direction>
          <relatedStateVariable>A_ARG_TYPE_int</relatedStateVariable>
        </argument>
      </argumentList>
    </action>
    <action>
      <name>TransportState</name>
      <argumentList>
        <argument>
          <name>State</name>
          <direction>out</direction>
          <relatedStateVariable>TransportState</relatedStateVariable>
        </argument>
      </argumentList>
    </action>
    <action>
      <name>Modes</name>
      <argumentList>
        <argument>
          <name>Modes</name>
          <direction>out</direction>
          <relatedStateVariable>Modes</relatedStateVariable>
        </argument>
      </argumentList>
    </action>
    <action>
      <name>ModeInfo</name>
      <argumentList>
        <argument>
          <name>CanSkipNext</name>
          <direction>out</direction>
          <relatedStateVariable>CanSkipNext</relatedStateVariable>
        </argument>
        <argument>
          <name>CanSkipPrevious</name>
          <direction>out</direction>
          <relatedStateVariable>CanSkipPrevious</relatedStateVariable>
        </argument>
        <argument>
          <name>CanRepeat</name>
          <direction>out</direction>
          <relatedStateVariable>CanRepeat</relatedStateVariable>
        </argument>
        <argument>
          <name>CanShuffle</name>
          <direction>out</direction>
          <relatedStateVariable>CanShuffle</relatedStateVariable>
        </argument>
      </argumentList>
    </action>
    <action>
      <name>StreamInfo</name>
      <argumentList>
        <argument>
          <name>StreamId</name>
          <direction>out</direction>
          <relatedStateVariable>StreamId</relatedStateVariable>
        </argument>
        <argument>
          <name>CanSeek</name>
          <direction>out</direction>
          <relatedStateVariable>CanSeek</relatedStateVariable>
        </argument>
        <argument>
          <name>CanPause</name>
          <direction>out</direction>
          <relatedStateVariable>CanPause</relatedStateVariable>
        </argument>
      </argumentList>
    </action>
    <action>
      <name>StreamId</name>
      <argumentList>
        <argument>
          <name>StreamId</name>
          <direction>out</direction>
          <relatedStateVariable>StreamId</relatedStateVariable>
        </argument>
      </argumentList>
    </action>
    <action>
      <name>Repeat</name>
      <argumentList>
        <argument>
          <name>Repeat</name>
          <direction>out</direction>
          <relatedStateVariable>Repeat</relatedStateVariable>
        </argument>
      </argumentList>
    </action>
    <action>
      <name>Shuffle</name>
      <argumentList>
        <argument>
          <name>Shuffle</name>
          <direction>out</direction>
          <relatedStateVariable>Shuffle</relatedStateVariable>
        </argument>
      </argumentList>
    </action>
  </actionList>
  <serviceStateTable>
    <stateVariable sendEvents="yes">
      <name>Modes</name>
      <dataType>string</dataType>
    </stateVariable>
    <stateVariable sendEvents="yes">
      <name>CanSkipNext</name>
      <dataType>boolean</dataType>
    </stateVariable>
    <stateVariable sendEvents="yes">
      <name>CanSkipPrevious</name>
      <dataType>boolean</dataType>
    </stateVariable>
    <stateVariable sendEvents="yes">
      <name>CanRepeat</name>
      <dataType>boolean</dataType>
    </stateVariable>
    <stateVariable sendEvents="yes">
      <name>CanShuffle</name>
      <dataType>boolean</dataType>
    </stateVariable>
    <stateVariable sendEvents="yes">
      <name>StreamId</name>
      <dataType>ui4</dataType>
    </stateVariable>
    <stateVariable sendEvents="yes">
      <name>CanSeek</name>
      <dataType>boolean</dataType>
    </stateVariable>
    <stateVariable sendEvents="yes">
      <name>CanPause</name>
      <dataType>boolean</dataType>
    </stateVariable>
    <stateVariable sendEvents="yes">
      <name>TransportState</name>
      <dataType>string</dataType>
      <allowedValueList>
        <allowedValue>Playing</allowedValue>
        <allowedValue>Paused</allowedValue>
        <allowedValue>Stopped</allowedValue>
        <allowedValue>Buffering</allowedValue>
        <allowedValue>Waiting</allowedValue>
      </allowedValueList>
    </stateVariable>
    <stateVariable sendEvents="yes">
      <name>Repeat</name>
      <dataType>boolean</dataType>
    </stateVariable>
    <stateVariable sendEvents="yes">
      <name>Shuffle</name>
      <dataType>boolean</dataType>
    </stateVariable>
    <stateVariable sendEvents="no">
      <name>A_ARG_TYPE_uint</name>
      <dataType>ui4</dataType>
    </stateVariable>
    <stateVariable sendEvents="no">
      <name>A_ARG_TYPE_int</name>
      <dataType>i4</dataType>
    </stateVariable>
    <stateVariable sendEvents="no">
      <name>A_ARG_TYPE_string</name>
      <dataType>string</dataType>
    </stateVariable>
  </serviceStateTable>
</scpd>