<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.openhome.org/mediawiki/skins/common/feed.css?270"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
		<id>http://wiki.openhome.org/mediawiki/index.php?feed=atom&amp;namespace=0&amp;title=Special%3ANewPages</id>
		<title>OpenHome - New pages [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.openhome.org/mediawiki/index.php?feed=atom&amp;namespace=0&amp;title=Special%3ANewPages"/>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Special:NewPages"/>
		<updated>2026-05-12T22:56:08Z</updated>
		<subtitle>From OpenHome</subtitle>
		<generator>MediaWiki 1.16.2</generator>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PinInvokers</id>
		<title>Av:Developer:PinInvokers</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PinInvokers"/>
				<updated>2018-08-17T16:06:11Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: /* CalmRadio */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
All pins have a uri associated with them which is used by the pins service to interpret one or more playable items and must be in the following form: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt; &amp;lt;mode&amp;gt;://&amp;lt;type&amp;gt;?&amp;lt;pin specific query parameters&amp;gt;&amp;amp;version&amp;lt;pin version&amp;gt; &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;mode&amp;lt;/tt&amp;gt; indicates which music provider will provide the playable content. Each has a number of query parameters which are outlined below. The pins service allows you to query which modes the device currently supports.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;type&amp;lt;/tt&amp;gt; describes what the pin is such as an artist, album or playlist.&lt;br /&gt;
&lt;br /&gt;
The current pin version is &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;. The version has been omitted from the examples below.&lt;br /&gt;
&lt;br /&gt;
= (Linn) Kazoo Server =&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| mode&lt;br /&gt;
| openhome.me&lt;br /&gt;
| &lt;br /&gt;
|-&lt;br /&gt;
| type&lt;br /&gt;
| album&lt;br /&gt;
| Requires response type tracks&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| artist&lt;br /&gt;
| Requires response type albums&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| playlist&lt;br /&gt;
| Requires response type tracks&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| genre&lt;br /&gt;
| Requires response type of either albums, playlists or tracks&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| container&lt;br /&gt;
| Only supported in a list pin&lt;br /&gt;
|-&lt;br /&gt;
| ''Query Parameters''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| udn&lt;br /&gt;
| Server's Udn&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| me&lt;br /&gt;
| Endpoint Id&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| response&lt;br /&gt;
| Response type&lt;br /&gt;
| See above&lt;br /&gt;
|-&lt;br /&gt;
| browse&lt;br /&gt;
| Item id&lt;br /&gt;
| Performs a browse query with the given item id. Can't contain list parameter&lt;br /&gt;
|-&lt;br /&gt;
| list&lt;br /&gt;
| Tag id&lt;br /&gt;
| Performs a list query with given tag id. Can't contain a browse parameter&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example Uris: &lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  // Browse pin&lt;br /&gt;
  openhome.me://[type]?udn=[device udn]&amp;amp;me=[endpoint id]&amp;amp;browse=[item id]&amp;amp;response=[response type]&lt;br /&gt;
  &lt;br /&gt;
  // List pin&lt;br /&gt;
  openhome.me://[type]?udn=[device udn]&amp;amp;me=[endpoint id]&amp;amp;list=[item id]&amp;amp;response[response type]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Tidal =&lt;br /&gt;
== Tracks ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| mode&lt;br /&gt;
| tidal&lt;br /&gt;
|-&lt;br /&gt;
| type&lt;br /&gt;
| track&lt;br /&gt;
|-&lt;br /&gt;
| ''Query Parameters''&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| trackId&lt;br /&gt;
| Tidal track id&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example Uri:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  tidal://track?trackId=[id]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Tidal Content ==&lt;br /&gt;
&lt;br /&gt;
For other Tidal content the pin will provide a link to the Tidal API resource and a hint as to what you expect that resource to return. &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| mode&lt;br /&gt;
| tidal&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| type&lt;br /&gt;
| album&lt;br /&gt;
| Requires response type tracks&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| artist&lt;br /&gt;
| Requires response type albums&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| playlist&lt;br /&gt;
| Requires response type tracks&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| genre&lt;br /&gt;
| Requires response type of either albums, playlists or tracks&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| container&lt;br /&gt;
| Requires response type of either albums, playlists or tracks&lt;br /&gt;
|-&lt;br /&gt;
| ''Query Parameters''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| path&lt;br /&gt;
| Tidal API link&lt;br /&gt;
| Must to be url encoded&lt;br /&gt;
|-&lt;br /&gt;
| response&lt;br /&gt;
| Response type&lt;br /&gt;
| See above&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example Uri:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  tidal://[type]?path=[api link]&amp;amp;response=[response type]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Qobuz =&lt;br /&gt;
== Tracks ==&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| mode&lt;br /&gt;
| qobuz&lt;br /&gt;
|-&lt;br /&gt;
| type&lt;br /&gt;
| track&lt;br /&gt;
|-&lt;br /&gt;
| ''Query Parameters''&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| trackId&lt;br /&gt;
| Qobuz track id&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example Uri:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  qobuz://track?trackId=[id]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Other Qobuz Content ==&lt;br /&gt;
&lt;br /&gt;
For other Qobuz content the pin will provide a link to the Qobuz API resource and a hint as to what you expect that resource to return. &lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| mode&lt;br /&gt;
| qobuz&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| type&lt;br /&gt;
| album&lt;br /&gt;
| Requires response type tracks&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| artist&lt;br /&gt;
| Requires response type albums&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| playlist&lt;br /&gt;
| Requires response type tracks&lt;br /&gt;
|-&lt;br /&gt;
|&lt;br /&gt;
| container&lt;br /&gt;
| Requires response type of either albums, playlists&lt;br /&gt;
|-&lt;br /&gt;
| ''Query Parameters''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| path&lt;br /&gt;
| Qobuz API link&lt;br /&gt;
| Must to be url encoded&lt;br /&gt;
|-&lt;br /&gt;
| response&lt;br /&gt;
| Response type&lt;br /&gt;
| See above&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example Uri:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  qobuz://[type]?path=[api link]&amp;amp;response=[response type]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= TuneIn =&lt;br /&gt;
== Stations ==&lt;br /&gt;
&lt;br /&gt;
A TuneIn station pin should play the station from the TuneIn link specified in the pin uri.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that the pin's title and artwork uri will be presented as track metadata by the [[Av:Developer:InfoService | Info]] service.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| mode&lt;br /&gt;
| tunein&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| type&lt;br /&gt;
| stream&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ''Query Parameters''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| path&lt;br /&gt;
| Radio stream link&lt;br /&gt;
| Must to be url encoded&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example Uri:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  tunein://stream?path=[stream]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Shows / Podcasts ==&lt;br /&gt;
&lt;br /&gt;
A TuneIn show/podcast pin should play the most recent episode as reported by the TuneIn link specified in the pin uri.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| mode&lt;br /&gt;
| tunein&lt;br /&gt;
| Latest episode&lt;br /&gt;
|-&lt;br /&gt;
| mode&lt;br /&gt;
| tuneinlist&lt;br /&gt;
| All episodes&lt;br /&gt;
|-&lt;br /&gt;
| type&lt;br /&gt;
| podcast&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ''Query Parameters''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| path&lt;br /&gt;
| Show/podcast link&lt;br /&gt;
| Must to be url encoded&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example Uri:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  tunein://podcast?path=[stream]&lt;br /&gt;
  tuneinlist://podcast?path=[stream]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Radio Preset =&lt;br /&gt;
Play a radio preset by index:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  radio://preset?id=[index]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= iTunes Podcast =&lt;br /&gt;
Play either the latest episode from a podcast or load a playlist with the last N episodes&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| mode&lt;br /&gt;
| itunes&lt;br /&gt;
| Latest episode only&lt;br /&gt;
|-&lt;br /&gt;
| mode&lt;br /&gt;
| ituneslist&lt;br /&gt;
| Load all of the episode list&lt;br /&gt;
|-&lt;br /&gt;
| type&lt;br /&gt;
| podcast&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ''Query Parameters''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| id&lt;br /&gt;
| iTunes podcast id&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  itunes://podcast?id=[identifier]&lt;br /&gt;
  ituneslist://podcast?id=[identifier]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Sources =&lt;br /&gt;
&lt;br /&gt;
A source pin should switch to the source matching the system name specified in the pin uri.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| mode&lt;br /&gt;
| transport&lt;br /&gt;
|-&lt;br /&gt;
| type&lt;br /&gt;
| source&lt;br /&gt;
|-&lt;br /&gt;
| ''Query Parameters''&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| id&lt;br /&gt;
| The system name of the source&lt;br /&gt;
|-&lt;br /&gt;
| udn&lt;br /&gt;
| Udn of the device to which the source belongs&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example Uri:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  transport://source?id=[system name]&amp;amp;udn=[device udn]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CalmRadio =&lt;br /&gt;
&lt;br /&gt;
A CalmRadio pin should play the stream specified in the pin uri&lt;br /&gt;
&amp;lt;br&amp;gt;Note that the pin's title and artwork uri will be presented as track metadata by the [[Av:Developer:InfoService | Info]] service.&lt;br /&gt;
&lt;br /&gt;
{|&lt;br /&gt;
|-&lt;br /&gt;
| mode&lt;br /&gt;
| calmradio&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| type&lt;br /&gt;
| stream&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| ''Query Parameters''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| path&lt;br /&gt;
| Radio stream link&lt;br /&gt;
| Must to be url encoded&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Example Uri:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  calmradio://stream?path=[stream]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Url =&lt;br /&gt;
Play a hard-coded url.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that the pin's title and artwork uri will be presented as track metadata by the [[Av:Developer:InfoService | Info]] service.&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
  url://stream?path=[stream]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PinsService</id>
		<title>Av:Developer:PinsService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PinsService"/>
				<updated>2018-08-17T09:10:11Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
A pin is a set of instructions to switch source or play one or more tracks on a device. Some pins will have wholly predictable results (e.g. switch to Analog2, play named playlist); others may be more dynamic (e.g. play the latest podcast from a given feed or a curated playlist of the week from a streaming service).&lt;br /&gt;
&lt;br /&gt;
The Pins service provides access both device-specific and account-wide pins. Both classes of pin can be read from or invoked on a device. Device-specific pins can also be edited; account-wide pins may be editable via a device but should also have edit APIs in the service or location that provides general account support.&lt;br /&gt;
&lt;br /&gt;
= Supported Content =&lt;br /&gt;
Reference code contains support for the following [[Av:Developer:PinInvokers | pinnable content]].&lt;br /&gt;
&lt;br /&gt;
= State Variables =&lt;br /&gt;
== DeviceMax ==&lt;br /&gt;
The maximum number of device-specific pins supported&lt;br /&gt;
&lt;br /&gt;
== AccountMax ==&lt;br /&gt;
The maximum number of account-wide pins supported&lt;br /&gt;
&lt;br /&gt;
== Modes ==&lt;br /&gt;
JSON array of strings identifying the different styles of pins supported&lt;br /&gt;
&lt;br /&gt;
== CloudConnected ==&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if a connection is available to cloud-backed master copy of account pins (i.e. when account pins are editable); &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
== IdArray ==&lt;br /&gt;
JSON array of identifiers (unsigned integer) for all pins. &lt;br /&gt;
&amp;lt;br&amp;gt;Device pins are listed first, followed by Account pins. i.e. array will always have &amp;lt;tt&amp;gt;DeviceMax&amp;lt;/tt&amp;gt; + &amp;lt;tt&amp;gt;AccountMax&amp;lt;/tt&amp;gt; entries. &lt;br /&gt;
&amp;lt;br&amp;gt;Identifiers will normally be unique; &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; is a special case which signifies an empty pin.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== GetDeviceMax ==&lt;br /&gt;
Read the &amp;lt;tt&amp;gt;DeviceMax&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
== GetAccountMax ==&lt;br /&gt;
Read the &amp;lt;tt&amp;gt;AccountMax&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
== GetModes ==&lt;br /&gt;
Read the &amp;lt;tt&amp;gt;Modes&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
== GetCloudConnected ==&lt;br /&gt;
Read the &amp;lt;tt&amp;gt;CloudConnected&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
== GetIdArray ==&lt;br /&gt;
Read the &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
Input: JSON integer array, specifying ids of pins to be read. &lt;br /&gt;
&amp;lt;br&amp;gt;Output: JSON array of pins&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
[&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;id&amp;quot;: {unsigned integer, unique across device &amp;amp; account pins},&lt;br /&gt;
        &amp;quot;mode&amp;quot;: &amp;quot;where track(s) will be fetched from&amp;quot;,&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;instructs the device how to interpret the uri below&amp;quot;,&lt;br /&gt;
        &amp;quot;uri&amp;quot;: &amp;quot;absolute uri&amp;quot;,&lt;br /&gt;
        &amp;quot;title&amp;quot;: &amp;quot;Short text, may be user-visible&amp;quot;,&lt;br /&gt;
        &amp;quot;description&amp;quot;: &amp;quot;Longer text, may be user-visible&amp;quot;,&lt;br /&gt;
        &amp;quot;artworkUri&amp;quot;: &amp;quot;absolute uri to image&amp;quot;,&lt;br /&gt;
        &amp;quot;shuffle&amp;quot;: {boolean}&lt;br /&gt;
    },&lt;br /&gt;
    { ... }&lt;br /&gt;
]&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== InvokeIndex ==&lt;br /&gt;
Invoke the pin at the specified index in &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt;. This will stop anything that is currently playing and may clear any current playlist.&lt;br /&gt;
&lt;br /&gt;
== InvokeId ==&lt;br /&gt;
Invoke the pin with the specified id. This will stop anything that is currently playing and may clear any current playlist.&lt;br /&gt;
&lt;br /&gt;
== InvokeUri ==&lt;br /&gt;
Invoke a pin using data (mode, type, uri, shuffle) from a control point. Should be used by any control point that wants to determine which account to read pins from. (Note however that pins which themselves require cloud support to load cannot be loaded by the device - control points would have to load them directly into a playlist instead.) This will stop anything that is currently playing and may clear any current playlist.&lt;br /&gt;
&lt;br /&gt;
== SetDevice ==&lt;br /&gt;
Set a device pin, specifying the mode, type, uri, title, description, artworkUri and shuffle plus index into the set of device pins. &lt;br /&gt;
&amp;lt;br&amp;gt;Any pin currently assigned at the specified index will be replaced. &lt;br /&gt;
&amp;lt;br&amp;gt;Any playing content is unaffected (i.e. invoking then replacing a pin leaves the old representation of the pin playing). &lt;br /&gt;
index must be in the range &amp;lt;tt&amp;gt;[0..DeviceMax)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;Some errors are notified in response to this action. Success should only be assumed when an update is evented to IdArray showing a change in id at the specified index.&lt;br /&gt;
&lt;br /&gt;
== SetAccount ==&lt;br /&gt;
Set an account pin, specifying the mode, type, uri, title, description, artworkUri and shuffle plus index into the set of device pins. &lt;br /&gt;
&amp;lt;br&amp;gt;Any pin currently assigned at the specified index will be replaced. &lt;br /&gt;
&amp;lt;br&amp;gt;Any playing content is unaffected (i.e. invoking then replacing a pin leaves the old representation of the pin playing). &lt;br /&gt;
index must be in the range &amp;lt;tt&amp;gt;[0..AccountMax)&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;gt;Requests to update an account pin are proxied to a remote server so are likely to be slower and have greater chance of failure. &lt;br /&gt;
&amp;lt;br&amp;gt;Some errors are notified in response to this action. Success should only be assumed when an update is evented to &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt; showing a change in id at &amp;lt;tt&amp;gt;DeviceMax + index&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Clear ==&lt;br /&gt;
Clear any content in the pin with the specified id. &lt;br /&gt;
&amp;lt;br&amp;gt;As with Set, changes to device pins are implemented locally; changes to account pins are proxied to a remote server. &lt;br /&gt;
&amp;lt;br&amp;gt;Some errors are notified in response to this action. Success should only be assumed when an update is evented to the sequence number for the specified id.&lt;br /&gt;
&lt;br /&gt;
== Swap ==&lt;br /&gt;
Swap contents of the 2 pins at the specified indices. &lt;br /&gt;
&amp;lt;br&amp;gt;Pins can only be swapped within either device or account lists.&lt;br /&gt;
&lt;br /&gt;
= Technical Details =&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    Domain  : av.openhome.org&lt;br /&gt;
    Name    : Pins&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
  &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
  &amp;lt;actionList&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GetDeviceMax&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;DeviceMax&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;DeviceMax&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GetAccountMax&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;AccountMax&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;AccountMax&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GetModes&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Modes&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Modes&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GetIdArray&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;IdArray&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;IdArray&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GetCloudConnected&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;CloudConnected&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;CloudConnected&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;ReadList&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Ids&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;List&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;InvokeId&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Uint&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;InvokeIndex&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Index&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Uint&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;InvokeUri&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Mode&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Type&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Shuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Bool&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SetDevice&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Index&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Uint&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Mode&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Type&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Title&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Description&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;ArtworkUri&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Shuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Bool&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SetAccount&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Index&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Uint&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Mode&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Type&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Title&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Description&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;ArtworkUri&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Shuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Bool&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Clear&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Uint&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Swap&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Index1&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Uint&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Index2&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Uint&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
  &amp;lt;/actionList&amp;gt;&lt;br /&gt;
  &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;DeviceMax&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;AccountMax&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Modes&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;IdArray&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;CloudConnected&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;A_ARG_TYPE_String&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;A_ARG_TYPE_Uint&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;A_ARG_TYPE_Bool&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
  &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av::OhMetadata</id>
		<title>Av::OhMetadata</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av::OhMetadata"/>
				<updated>2017-06-23T15:39:00Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: /* OpenHome Metadata Format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenHome Metadata Format =&lt;br /&gt;
OpenHome Metadata format describes metadata for an audio track as a series of key-value pairs.&lt;br /&gt;
&lt;br /&gt;
The list of supported keys, their mapping into DIDL-Lite and the number of instances that may be used are listed below:&lt;br /&gt;
{|&lt;br /&gt;
! '''Key'''&lt;br /&gt;
! '''DIDL-Lite mapping'''&lt;br /&gt;
! '''Instances'''&lt;br /&gt;
|-&lt;br /&gt;
| uri&lt;br /&gt;
| res&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| id&lt;br /&gt;
| @id in item&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| type&lt;br /&gt;
| &lt;br /&gt;
* track -&amp;gt; object.item.audioItem.musicTrack&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| provider&lt;br /&gt;
| oh:provider&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| title&lt;br /&gt;
| dc:title&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| artwork&lt;br /&gt;
| oh:artwork&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| artist&lt;br /&gt;
| upnp:artist&lt;br /&gt;
| [0..n]&lt;br /&gt;
|-&lt;br /&gt;
| composer&lt;br /&gt;
| upnp:artist @role=composer&lt;br /&gt;
| [0..n]&lt;br /&gt;
|-&lt;br /&gt;
| conductor&lt;br /&gt;
| upnp:artist @role=conductor&lt;br /&gt;
| [0..n]&lt;br /&gt;
|-&lt;br /&gt;
| genre&lt;br /&gt;
| upnp:genre&lt;br /&gt;
| [0..n]&lt;br /&gt;
|-&lt;br /&gt;
| albumTitle&lt;br /&gt;
| upnp:album&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| albumArtwork&lt;br /&gt;
| upnp:albumArtURI&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| albumArtist&lt;br /&gt;
| upnp:artist @role=AlbumArtist&lt;br /&gt;
| [0..n]&lt;br /&gt;
|-&lt;br /&gt;
| albumGenre&lt;br /&gt;
| upnp:genre&lt;br /&gt;
| [0..n]&lt;br /&gt;
|-&lt;br /&gt;
| year&lt;br /&gt;
| dc:date&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| disc&lt;br /&gt;
| oh:originalDiscNumber&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| discs&lt;br /&gt;
| oh:originalDiscCount&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| track&lt;br /&gt;
| upnp:originalTrackNumber&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| tracks&lt;br /&gt;
| oh:originalTrackCount&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| channels&lt;br /&gt;
| res @nrAudioChannels&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| bitDepth&lt;br /&gt;
| res @bitsPerSample&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| sampleRate&lt;br /&gt;
| res @sampleFrequency&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| bitRate&lt;br /&gt;
| res @bitrate (integer / string of digits)&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| duration&lt;br /&gt;
| res @duration (seconds - string of digits, zero = live/eternal)&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| mimeType&lt;br /&gt;
| res @protocolInfo&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| work&lt;br /&gt;
| oh:work&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| movement&lt;br /&gt;
| oh:movement&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| show&lt;br /&gt;
| oh:show&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| episode&lt;br /&gt;
| oh:episodeNumber&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| episodes&lt;br /&gt;
| oh:episodeCount&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| author&lt;br /&gt;
| dc:author&lt;br /&gt;
| [0..n]&lt;br /&gt;
|-&lt;br /&gt;
| narrator&lt;br /&gt;
| upnp:artist @role=narrator&lt;br /&gt;
| [0..n]&lt;br /&gt;
|-&lt;br /&gt;
| performer&lt;br /&gt;
| upnp:artist @role=performer&lt;br /&gt;
| [0..n]&lt;br /&gt;
|-&lt;br /&gt;
| publisher&lt;br /&gt;
| dc:publisher&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| published&lt;br /&gt;
| oh:published (ISO 8601)&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| website&lt;br /&gt;
| oh:website&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| location&lt;br /&gt;
| oh:location (ISO 6709)&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| details&lt;br /&gt;
| oh:details&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| description&lt;br /&gt;
| dc:description&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| rating&lt;br /&gt;
| upnp:rating&lt;br /&gt;
| [0..1]&lt;br /&gt;
|-&lt;br /&gt;
| extensions&lt;br /&gt;
| oh:extensions&lt;br /&gt;
| [0..1]&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Odp</id>
		<title>Av:Developer:Odp</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Odp"/>
				<updated>2017-06-23T14:40:01Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Rev protocol version (addition of device id and service domains in various messages)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= OpenHome Device Protocol =&lt;br /&gt;
== Overview ==&lt;br /&gt;
OpenHome Device Protocl (ODP) allows a control point to control and receive evented updates from an OpenHome device using a single TCP socket.  This has some advantages over UPnP:&lt;br /&gt;
* No need to define error handling policy for cases where evented updates cannot be delivered.&amp;lt;br&amp;gt;If the socket connection is open, it'll be possible to deliver an evented update.&amp;lt;br&amp;gt;If the socket connection is broken, the device can automatically clean up all subscriptions from that control point.&lt;br /&gt;
* No need to define additional protocol to allow control points to infer removal of a device.&amp;lt;br&amp;gt;If the socket connection is open, a control point can assume the device is available.&amp;lt;br&amp;gt;If the socket connection is broken, the control point is immediately prompted to retry connection; if this fails, it can quickly update its state to show that the device is no longer available.&lt;br /&gt;
* No danger of TIME_WAIT socket errors when control points invoke very large numbers of actions and/or devices are rebooted.&lt;br /&gt;
&lt;br /&gt;
== Discovery ==&lt;br /&gt;
Using mDNS, search for &amp;lt;tt&amp;gt;_openhome._odp&amp;lt;/tt&amp;gt; to identify an ODP endpoint.&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
[https://github.com/openhome/ohPipeline ohPipeline] contains [https://github.com/openhome/ohPipeline/tree/master/OpenHome/Net/Odp reference code] for control point or device stacks.&lt;br /&gt;
&lt;br /&gt;
Control point authors can instantiate [https://github.com/openhome/ohPipeline/blob/master/OpenHome/Net/Odp/Tests/CpiDeviceOdp.h CpiDeviceOdp] then use standard ohNet proxy classes to access all OpenHome network services.  Proxies can be generated from UPnP service XML; pre-generated versions are available in [https://github.com/openhome/ohNetGenerated ohNetGenerated].&lt;br /&gt;
&lt;br /&gt;
See [https://github.com/openhome/ohPipeline/blob/master/OpenHome/Net/Odp/Tests/TestDvOdp.cpp ODP test code] for a simple example of a control point invoking actions and receiving evented updates over ODP.&lt;br /&gt;
&lt;br /&gt;
Sample code for mDNS discovery of ODP devices is coming soon.&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
=== Framing ===&lt;br /&gt;
Each message, in either direction, is a JSON object followed by a newline (&amp;lt;tt&amp;gt;'\n'&amp;lt;/tt&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Announcement ===&lt;br /&gt;
When a client connects, a device announces its capabilities:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;type&amp;quot;:&amp;quot;announcement&amp;quot;,&lt;br /&gt;
        &amp;quot;protocolVersion&amp;quot;:3,&lt;br /&gt;
        &amp;quot;devices&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;id&amp;quot;:&amp;quot;udn&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;:&amp;quot;one of Ds, MediaRenderer, ZoneSetup, ZoneSource, ZoneReceiver&amp;quot;,&lt;br /&gt;
                &amp;quot;services&amp;quot;: [&lt;br /&gt;
                    { &amp;quot;domain&amp;quot;: &amp;quot;abc.org&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;service1&amp;quot;, &amp;quot;version&amp;quot;:1 },&lt;br /&gt;
                    { &amp;quot;domain&amp;quot;: &amp;quot;abc.org&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;service2&amp;quot;, &amp;quot;version&amp;quot;:2 },&lt;br /&gt;
                    { &amp;quot;domain&amp;quot;: &amp;quot;xyz.com&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;service3&amp;quot;, &amp;quot;version&amp;quot;:1 }&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;udn&amp;quot;,&lt;br /&gt;
                &amp;quot;type&amp;quot;:&amp;quot;one of Ds, MediaRenderer, ZoneSetup, ZoneSource, ZoneReceiver&amp;quot;,&lt;br /&gt;
                &amp;quot;services&amp;quot;: [&lt;br /&gt;
                    { &amp;quot;domain&amp;quot;: &amp;quot;abc.org&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;service4&amp;quot;, &amp;quot;version&amp;quot;:1 },&lt;br /&gt;
                    { &amp;quot;domain&amp;quot;: &amp;quot;xyz.com&amp;quot;, &amp;quot;name&amp;quot;:&amp;quot;service5&amp;quot;, &amp;quot;version&amp;quot;:1 }&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== Control ===&lt;br /&gt;
The control point can invoke an action on a device as follows.  This will block until a response is sent.  Note that it is possible that the control point may receive other messages (e.g. &amp;lt;tt&amp;gt;notify&amp;lt;/tt&amp;gt; - see below) before the action response.&lt;br /&gt;
&amp;lt;br&amp;gt;The name for each input argument will match the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; element for that argument in the service description XML.  All values are strings.&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;action&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;udn&amp;quot;,&lt;br /&gt;
        &amp;quot;device&amp;quot;: &amp;quot;type&amp;quot;,&lt;br /&gt;
        &amp;quot;service&amp;quot;: { &amp;quot;domain&amp;quot;: &amp;quot;xyz.com&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;service_name&amp;quot;, &amp;quot;version&amp;quot;: 1 },&lt;br /&gt;
        &amp;quot;action&amp;quot;: &amp;quot;action_name&amp;quot;,&lt;br /&gt;
        &amp;quot;arguments&amp;quot;: [&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;input_arg_str&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;json_escaped_str&amp;quot; },&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;input_arg_bin&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;base64_encoded_str&amp;quot; },&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;input_arg_bool&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;true&amp;quot; },&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;input_arg_int&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;-1&amp;quot; },&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;input_arg_uint&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;3&amp;quot; }&lt;br /&gt;
            ],&lt;br /&gt;
        &amp;quot;correlationId&amp;quot;:&amp;quot;optional request identifier&amp;quot;,&lt;br /&gt;
        &amp;quot;userAgent&amp;quot;:&amp;quot;optional client identifier&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Response when action invocation is successful.&lt;br /&gt;
&amp;lt;br&amp;gt;The name for each output argument will match the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; element for that argument in the service description XML.  All values are strings.&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;actionResponse&amp;quot;,&lt;br /&gt;
        &amp;quot;error&amp;quot;: null,&lt;br /&gt;
        &amp;quot;arguments&amp;quot;: [&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;output_arg_str&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;json_escaped_str&amp;quot; },&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;output_arg_bin&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;base64_encoded_str&amp;quot; },&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;output_arg_bool&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;true&amp;quot; },&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;output_arg_int&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;-1&amp;quot; },&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;output_arg_uint&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;3&amp;quot; }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;correlationId&amp;quot;:&amp;quot;echoed from request&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Response when action invocation fails:&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;actionResponse&amp;quot;,&lt;br /&gt;
        &amp;quot;error&amp;quot;: { &amp;quot;code&amp;quot;: 123, &amp;quot;description&amp;quot;: &amp;quot;error msg&amp;quot; },&lt;br /&gt;
        &amp;quot;arguments&amp;quot;: null,&lt;br /&gt;
        &amp;quot;correlationId&amp;quot;:&amp;quot;echoed from request&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
=== Eventing ===&lt;br /&gt;
Subscribe to a particular service.  On successful completion, the device will send out unsolicited messages (with type &amp;lt;tt&amp;gt;notify&amp;lt;/tt&amp;gt;) whenever one or more evented properties of a service change.&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;subscribe&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;, &amp;quot;udn&amp;quot;,&lt;br /&gt;
        &amp;quot;device&amp;quot;: &amp;quot;type&amp;quot;,&lt;br /&gt;
        &amp;quot;service&amp;quot;: { &amp;quot;domain&amp;quot;: &amp;quot;abc.org&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;service_name&amp;quot;, &amp;quot;version&amp;quot;: 2 },&lt;br /&gt;
        &amp;quot;correlationId&amp;quot;:&amp;quot;optional request identifier&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Response when a subscribe request succeeds.  The subscription id (sid) will be included in all later evented updates for this subscription.&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;subscribeResponse&amp;quot;,&lt;br /&gt;
        &amp;quot;device&amp;quot;: &amp;quot;type&amp;quot;,&lt;br /&gt;
        &amp;quot;service&amp;quot;: { &amp;quot;name&amp;quot;: &amp;quot;service_name&amp;quot;, &amp;quot;version&amp;quot;: 2 }&lt;br /&gt;
        &amp;quot;error&amp;quot;: null,&lt;br /&gt;
        &amp;quot;correlationId&amp;quot;:&amp;quot;echoed from request&amp;quot;,&lt;br /&gt;
        &amp;quot;sid&amp;quot;: &amp;quot;subscription_id&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Response when a subscribe request fails.  No later evented updates will be sent.&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;subscribeResponse&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;, &amp;quot;udn&amp;quot;,&lt;br /&gt;
        &amp;quot;device&amp;quot;: &amp;quot;type&amp;quot;,&lt;br /&gt;
        &amp;quot;service&amp;quot;: { &amp;quot;domain&amp;quot;: &amp;quot;abc.org&amp;quot;, &amp;quot;name&amp;quot;: &amp;quot;service_name&amp;quot;, &amp;quot;version&amp;quot;: 2 }&lt;br /&gt;
        &amp;quot;error&amp;quot;: { &amp;quot;code&amp;quot;: 123, &amp;quot;description&amp;quot;: &amp;quot;error msg&amp;quot; },&lt;br /&gt;
        &amp;quot;correlationId&amp;quot;:&amp;quot;echoed from request&amp;quot;,&lt;br /&gt;
        &amp;quot;sid&amp;quot;: null&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Unsubscribe (halt a particular stream of evented updates).&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;unsubscribe&amp;quot;,&lt;br /&gt;
        &amp;quot;correlationId&amp;quot;:&amp;quot;optional request identifier&amp;quot;,&lt;br /&gt;
        &amp;quot;sid&amp;quot;: &amp;quot;subscription_id&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
Response when an unsubscribe completes.  No evented updates for this subscription will be sent after this.&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;unsubscribeResponse&amp;quot;,&lt;br /&gt;
        &amp;quot;correlationId&amp;quot;:&amp;quot;echoed from request&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
A device will send the following whenever one or more evented properties change on a service with an active subscription.&lt;br /&gt;
&amp;lt;br&amp;gt;The name for each property will match the &amp;lt;tt&amp;gt;name&amp;lt;/tt&amp;gt; element for the associated &amp;lt;tt&amp;gt;stateVariable&amp;lt;/tt&amp;gt; in the service description XML.  All values are strings.&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;type&amp;quot;: &amp;quot;notify&amp;quot;,&lt;br /&gt;
        &amp;quot;sid&amp;quot;: &amp;quot;subscription_id&amp;quot;,&lt;br /&gt;
        &amp;quot;properties&amp;quot;: [&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;property_str&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;json_escaped_str&amp;quot; },&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;property_bin&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;base64_encoded_str&amp;quot; },&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;property_bool&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;true&amp;quot; },&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;property_int&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;-1&amp;quot; },&lt;br /&gt;
            { &amp;quot;name&amp;quot;: &amp;quot;property_uint&amp;quot;, &amp;quot;value&amp;quot;:&amp;quot;3&amp;quot; }&lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Scd</id>
		<title>Av:Developer:Scd</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Scd"/>
				<updated>2017-06-23T12:47:35Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Songcast Direct =&lt;br /&gt;
== Overview ==&lt;br /&gt;
Songcast Direct (SCD) can be used to send decoded audio from any computing device to an OpenHome device.  The Sender device is responsible for decoding audio to PCM, framing this in a simple protocol and making it available via a simple TCP server.  The Receiver pulls data from this server, giving the Receiver complete control of the audio clock.&lt;br /&gt;
&lt;br /&gt;
A Songcast Direct sender performs a broadly similar role to a Songcast sender.  Applications that perform their own decoding to PCM will find SCD is easier to integrate and offers higher audio performance:&lt;br /&gt;
* There is a constant TCP connection between sender and receiver, avoiding the need for application-level resend support&lt;br /&gt;
* It uses the clock of the receiver, allowing for higher quality playback if the sender is on a desktop computer&lt;br /&gt;
* It offers the receiver limited control over the stream – initially Transport (play / pause / stop) and Volume.  While the primary control UI may reside on the sender device, this allows for basic integration with any Ir handset for the receiver.&lt;br /&gt;
&lt;br /&gt;
== Sample Code ==&lt;br /&gt;
[https://github.com/openhome/ohPipeline/tree/master/OpenHome/Av/Scd ohPipeline] contains sample code.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;WavSender&amp;lt;/tt&amp;gt; contains an example of a trivial SCD Sender, scanning a single directory and decoding then sending any WAV files it finds. (Note that compilation of this is currently disabled.  &amp;lt;tt&amp;gt;DirScanner::Run()&amp;lt;/tt&amp;gt; contains code from an experimental precursor to C++17's &amp;lt;tt&amp;gt;std::filesystem::directory_iterator&amp;lt;/tt&amp;gt;.  Current code is compatible with VS2013; it should only require a couple of lines of change to make this compile against any more recent compiler.)&lt;br /&gt;
&lt;br /&gt;
Code in the [https://github.com/openhome/ohPipeline/tree/master/OpenHome/Av/Scd Scd] and [https://github.com/openhome/ohPipeline/tree/master/OpenHome/Av/Scd/Sender Sender] directories should be usable without any change.  It will be possible to write a commercial quality sender using the &amp;lt;tt&amp;gt;ScdSender&amp;lt;/tt&amp;gt; library, passing audio into &amp;lt;tt&amp;gt;IScdSupply&amp;lt;/tt&amp;gt; and relying on the configuration of &amp;lt;tt&amp;gt;ScdMsgFactory&amp;lt;/tt&amp;gt; to determine how much audio is buffered by the Sender.&lt;br /&gt;
&lt;br /&gt;
Sample code demonstrating how a Sender can control a Receiver via ODP is coming soon.  For now, see [https://github.com/openhome/ohPipeline/blob/master/OpenHome/Net/Odp/Tests/TestDvOdp.cpp ODP tests] for a basic example.&lt;br /&gt;
&lt;br /&gt;
== Discovery ==&lt;br /&gt;
=== SSDP ===&lt;br /&gt;
First search for &amp;lt;tt&amp;gt;av-openhome-org:service:Product:2&amp;lt;/tt&amp;gt; then either&lt;br /&gt;
* Check &amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; on &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; service for &amp;lt;tt&amp;gt;&amp;quot;Transport&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Check &amp;lt;tt&amp;gt;Modes&amp;lt;/tt&amp;gt; on &amp;lt;tt&amp;gt;Transport&amp;lt;/tt&amp;gt; service for &amp;lt;tt&amp;gt;&amp;quot;scd&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
* Check &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; on &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; for a source with &amp;lt;tt&amp;gt;Type&amp;lt;/tt&amp;gt; of &amp;lt;tt&amp;gt;&amp;quot;scd&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== mDNS ===&lt;br /&gt;
Search for &amp;lt;tt&amp;gt;_openhome._odp&amp;lt;/tt&amp;gt; service to identify ODP endpoint&lt;br /&gt;
&lt;br /&gt;
== Control ==&lt;br /&gt;
Control of the Receiver is out of band, via the standard [[OhMediaDevelopers#Network_Services | OpenHome network APIs]].  These are available over UPnP or [[OhMediaDevelopers#ODP | ODP]] (a single connected socket).&lt;br /&gt;
&lt;br /&gt;
== Protocol ==&lt;br /&gt;
The protocol used for communication between Sender and Receiver contains the following message types:&lt;br /&gt;
{|&lt;br /&gt;
! '''Type'''&lt;br /&gt;
! '''Description'''&lt;br /&gt;
! '''Sent by'''&lt;br /&gt;
|-&lt;br /&gt;
| Ready&lt;br /&gt;
| Signals availability and version support to other party&lt;br /&gt;
| Receiver &amp;amp; Sender&lt;br /&gt;
|-&lt;br /&gt;
| MetadataDidl &lt;br /&gt;
| Metadata relevant until the end of the next track.&amp;lt;br&amp;gt;Will cause the receiver to reset its reported time indicator for the audio stream.&amp;lt;br&amp;gt;Should be sent after all Audio for any preceding track.&amp;lt;br&amp;gt;Uses DIDL-Lite.&lt;br /&gt;
| Sender&lt;br /&gt;
|-&lt;br /&gt;
| MetadataOh&lt;br /&gt;
| Metadata relevant until the end of the next track.&amp;lt;br&amp;gt;Will cause the receiver to reset its reported time indicator for the audio stream.&amp;lt;br&amp;gt;Should be sent after all Audio for any preceding track.&amp;lt;br&amp;gt;Uses [[Av::OhMetadata | OpenHome Metadata format]].&lt;br /&gt;
| Sender&lt;br /&gt;
|-&lt;br /&gt;
| Format&lt;br /&gt;
| Format for the following (PCM) audio. Must be sent before any audio.&lt;br /&gt;
| Sender&lt;br /&gt;
|-&lt;br /&gt;
| FormatDsd&lt;br /&gt;
| Format for the following (DSD) audio. Must be sent before any audio.&lt;br /&gt;
| Sender&lt;br /&gt;
|-&lt;br /&gt;
| Audio&lt;br /&gt;
| Decoded audio.  Can only be sent after a &amp;lt;tt&amp;gt;Format&amp;lt;/tt&amp;gt; message describing  its sample rate etc.&lt;br /&gt;
| Sender&lt;br /&gt;
|-&lt;br /&gt;
| MetatextDidl&lt;br /&gt;
| Metadata relevant to a portion of a track.&amp;lt;br&amp;gt;May be sent [0..n] times during a track.&amp;lt;br&amp;gt;Uses DIDL-Lite.&lt;br /&gt;
| Sender&lt;br /&gt;
|-&lt;br /&gt;
| MetatextOh&lt;br /&gt;
| Metadata relevant to a portion of a track.&amp;lt;br&amp;gt;May be sent [0..n] times during a track.&amp;lt;br&amp;gt;Uses [[Av::OhMetadata | OpenHome Metadata format]].  Note that a uri does not need to be specified.&lt;br /&gt;
| Sender&lt;br /&gt;
|-&lt;br /&gt;
| Halt&lt;br /&gt;
| Indicates that a break in audio follows.  E.g. at the end of a track with no further tracks to be played, or when the Sender has paused.&lt;br /&gt;
| Sender&lt;br /&gt;
|-&lt;br /&gt;
| Disconnect&lt;br /&gt;
| Indicates that the originator of the message is closing its SCD session. No further audio will be available. The message receiver should disconnect its socket.&lt;br /&gt;
| Receiver &amp;amp; Sender&lt;br /&gt;
|-&lt;br /&gt;
| Seek&lt;br /&gt;
| Indicates that the Receiver wants to jump to a different point in the current track.&amp;lt;br&amp;gt;Is only sent for tracks that the Sender has indicated support seeking.&lt;br /&gt;
| Receiver&lt;br /&gt;
|-&lt;br /&gt;
| Skip&lt;br /&gt;
| Indicates that the Receiver wants to immediately jump to the next or previous track.&lt;br /&gt;
| Receiver&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A SCD session is initiated by the Sender.  It instantiates a simple TCP server then instructs the Receiver to start playing from it.&lt;br /&gt;
&lt;br /&gt;
The Receiver connects to the Sender and sends a &amp;lt;tt&amp;gt;Ready&amp;lt;/tt&amp;gt; message, indicating the protocol version it supports.  If the Sender is compatible with this version, it responds with a &amp;lt;tt&amp;gt;Ready&amp;lt;/tt&amp;gt; message stating the same version.  Otherwise, the Sender sends a &amp;lt;tt&amp;gt;Ready&amp;lt;/tt&amp;gt; message stating the version it supports.  If the Receiver cannot support this version, it must close the connection.&lt;br /&gt;
&lt;br /&gt;
After sending a &amp;lt;tt&amp;gt;Ready&amp;lt;/tt&amp;gt; message, the Sender should send either &amp;lt;tt&amp;gt;Halt&amp;lt;/tt&amp;gt; (if it has nothing to send yet) or one of &amp;lt;tt&amp;gt;MetadataDidl&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;MetadataOh&amp;lt;/tt&amp;gt; plus &amp;lt;tt&amp;gt;Format&amp;lt;/tt&amp;gt;.  The order of &amp;lt;tt&amp;gt;Format&amp;lt;/tt&amp;gt; versus &amp;lt;tt&amp;gt;Metadata*&amp;lt;/tt&amp;gt; is not important.&lt;br /&gt;
&lt;br /&gt;
After this, the Sender should then send &amp;lt;tt&amp;gt;Audio&amp;lt;/tt&amp;gt;.  Any number of &amp;lt;tt&amp;gt;Audio&amp;lt;/tt&amp;gt; messages can be sent until the end of the stream is reached.  &amp;lt;tt&amp;gt;Metatext&amp;lt;/tt&amp;gt; messages (either &amp;lt;tt&amp;gt;Didl&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;Oh&amp;lt;/tt&amp;gt;) may be interleaved with &amp;lt;tt&amp;gt;Audio&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;tt&amp;gt;Halt&amp;lt;/tt&amp;gt; message implies that a break in audio may follow.  If this break is during a stream, the Sender must have applied attenuation to samples immediately before this to avoid any audio artifacts at the break in transmission.  Senders which cannot do this should implement pausing of streams using the Transport.Pause control API instead.&lt;br /&gt;
&lt;br /&gt;
The details of the wire protocol are shown below.  Note that all multi-byte integer values are big endian.&lt;br /&gt;
{|&lt;br /&gt;
! '''Bytes'''&lt;br /&gt;
! '''Name'''&lt;br /&gt;
! '''Description'''&lt;br /&gt;
|-&lt;br /&gt;
| '''Header'''&lt;br /&gt;
|&lt;br /&gt;
| Prefixes to all messages below&lt;br /&gt;
|-&lt;br /&gt;
| 4 &lt;br /&gt;
| Signature&lt;br /&gt;
| 0x73, 0x63, 0x64,0x20 ('scd ')&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Type&lt;br /&gt;
| The type of message:&lt;br /&gt;
* 0 – Ready&lt;br /&gt;
* 1 – MetadataDidl&lt;br /&gt;
* 2 - MetaDataOh&lt;br /&gt;
* 3 – Format&lt;br /&gt;
* 4 – FormatDsd&lt;br /&gt;
* 5 – Audio&lt;br /&gt;
* 7 – MetatextDidl&lt;br /&gt;
* 8 – MetatextOh&lt;br /&gt;
* 9 – Halt&lt;br /&gt;
* 10 – Disconnect&lt;br /&gt;
* 11 – Seek&lt;br /&gt;
* 12 – Skip&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Length&lt;br /&gt;
| Length in bytes of the whole message including this header&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| Reserved&lt;br /&gt;
| Unused, reserved for future use&lt;br /&gt;
|-&lt;br /&gt;
| '''Ready'''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| Major Version&lt;br /&gt;
| 1&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Minor Version&lt;br /&gt;
| 0&lt;br /&gt;
|-&lt;br /&gt;
| '''MetadataDidl'''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| TrackUriLength&lt;br /&gt;
| Length, in bytes, of the track URI&lt;br /&gt;
|-&lt;br /&gt;
| m&lt;br /&gt;
| TrackUri&lt;br /&gt;
| The track URI, where m = TrackUriLength&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| MetadataLength&lt;br /&gt;
| Length, in bytes, of the track metadata, in DIDL-Lite format&lt;br /&gt;
|-&lt;br /&gt;
| n&lt;br /&gt;
| Metadata&lt;br /&gt;
| The track metadata, where n = MetadataLength&lt;br /&gt;
|-&lt;br /&gt;
| '''MetadataOh'''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Count&lt;br /&gt;
| Number of key-value pairs that follow&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| KeyLength&lt;br /&gt;
| Length, in bytes, of the key&lt;br /&gt;
|-&lt;br /&gt;
| p&lt;br /&gt;
| Key&lt;br /&gt;
| Key for the metadata element, where p = KeyLength&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| ValueLength&lt;br /&gt;
| Length, in bytes, of the value&lt;br /&gt;
|-&lt;br /&gt;
| q&lt;br /&gt;
| Value&lt;br /&gt;
| Value for the metadata element, where q = ValueLength&lt;br /&gt;
|-&lt;br /&gt;
| ...&lt;br /&gt;
| ...&lt;br /&gt;
| Repeat key-value pairs for all Count metadata elements&lt;br /&gt;
|-&lt;br /&gt;
| '''Format'''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| BitDepth&lt;br /&gt;
| Bit depth of the following audio&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| SampleRate&lt;br /&gt;
| Sample rate of the following audio&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Channels&lt;br /&gt;
| Number of channels of the following audio&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| BitRate&lt;br /&gt;
| Bit rate of the following audio&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| SampleStart&lt;br /&gt;
| Sample position of the first sample in the next &amp;lt;tt&amp;gt;Audio&amp;lt;/tt&amp;gt; message&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| SamplesTotal&lt;br /&gt;
| Total number of samples in the following audio (requirement for this to be confirmed)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Flags&lt;br /&gt;
|&lt;br /&gt;
* Bit 0 - Seekable&lt;br /&gt;
* Bit 1 - Lossless&lt;br /&gt;
* Bit 2 - Live (content generated upstream of the Sender, e.g. internet radio)&lt;br /&gt;
* Bit 3 - Broadcastable (whether the Receiver is allowed to offer the following audio via any multi-room protocols&lt;br /&gt;
* Bits 4-7 - Reserved.  Must be zero.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| CodecNameLength&lt;br /&gt;
| Length, in bytes, of the codec name&lt;br /&gt;
|-&lt;br /&gt;
| r&lt;br /&gt;
| CodecName&lt;br /&gt;
| The codec name, where r = CodecNameLength&lt;br /&gt;
|-&lt;br /&gt;
| '''FormatDsd'''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| SampleRate&lt;br /&gt;
| Sample rate of the following audio&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Channels&lt;br /&gt;
| Number of channels of the following audio&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| SampleBlockBits&lt;br /&gt;
| Block size (in bits) of DSD data.  2 for stereo where left/right channels are interleaved, 16 for stereo with one byte of left subsamples followed by one byte of right subsamples, etc.&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| SampleStart&lt;br /&gt;
| Sample position of the first sample in the next &amp;lt;tt&amp;gt;Audio&amp;lt;/tt&amp;gt; message&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| SamplesTotal&lt;br /&gt;
| Total number of samples in the following audio (requirement for this to be confirmed)&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Flags&lt;br /&gt;
|&lt;br /&gt;
* Bit 0 - Seekable&lt;br /&gt;
* Bit 1-2 - Reserved.  Must be zero.&lt;br /&gt;
* Bit 3 - Broadcastable (whether the Receiver is allowed to offer the following audio via any multi-room protocols&lt;br /&gt;
* Bits 4-7 - Reserved.  Must be zero.&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| CodecNameLength&lt;br /&gt;
| Length, in bytes, of the codec name&lt;br /&gt;
|-&lt;br /&gt;
| r&lt;br /&gt;
| CodecName&lt;br /&gt;
| The codec name, where r = CodecNameLength&lt;br /&gt;
|-&lt;br /&gt;
| '''Audio'''&lt;br /&gt;
|-&lt;br /&gt;
| 2 &lt;br /&gt;
| NumSamples&lt;br /&gt;
| The number of audio samples in this message&lt;br /&gt;
|-&lt;br /&gt;
| s&lt;br /&gt;
| AudioData&lt;br /&gt;
| Audio data.  Where s = NumSamples * (BitDepth/8) * NumChannels.&amp;lt;br&amp;gt;Multi-channel audio must supply data sample at a time, with left channel first.  Audio is packed (i.e. no padding bytes rounding samples up to 32-bit boundaries) and big endian.&lt;br /&gt;
|-&lt;br /&gt;
| '''MetatextDidl'''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| Metatext Length&lt;br /&gt;
| Length, in bytes, of the metatext, in DIDL-Lite format&lt;br /&gt;
|-&lt;br /&gt;
| n&lt;br /&gt;
| Metatext&lt;br /&gt;
| The metatext, where n = MetatextLength&lt;br /&gt;
|-&lt;br /&gt;
| '''MetatextOh'''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| Count&lt;br /&gt;
| Number of key-value pairs that follow&lt;br /&gt;
|-&lt;br /&gt;
| 1&lt;br /&gt;
| KeyLength&lt;br /&gt;
| Length, in bytes, of the key&lt;br /&gt;
|-&lt;br /&gt;
| p&lt;br /&gt;
| Key&lt;br /&gt;
| Key for the metatext element, where p = KeyLength&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| ValueLength&lt;br /&gt;
| Length, in bytes, of the value&lt;br /&gt;
|-&lt;br /&gt;
| q&lt;br /&gt;
| Value&lt;br /&gt;
| Value for the metatext element, where q = ValueLength&lt;br /&gt;
|-&lt;br /&gt;
| ...&lt;br /&gt;
| ...&lt;br /&gt;
| Repeat key-value pairs for all Count metatext elements&lt;br /&gt;
|-&lt;br /&gt;
| '''Halt'''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| No message body (only header required)&lt;br /&gt;
|-&lt;br /&gt;
| '''Disconnect'''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| No message body (only header required)&lt;br /&gt;
|-&lt;br /&gt;
| '''Seek'''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| To be confirmed &lt;br /&gt;
|-&lt;br /&gt;
| '''Skip'''&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| To be confirmed &lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/CalmRadioInternetRadio</id>
		<title>CalmRadioInternetRadio</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/CalmRadioInternetRadio"/>
				<updated>2017-06-02T08:26:48Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;Calm Radio's API is private.  See Calm Radio for access to it.  Or speak to us for help if you think that your access to the API would benefit OpenHome.  Assuming access to Calm ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Calm Radio's API is private.  See Calm Radio for access to it.  Or speak to us for help if you think that your access to the API would benefit OpenHome.&lt;br /&gt;
&lt;br /&gt;
Assuming access to Calm Radio's API, the [[Av:Developer:CredentialsService | Credentials]] service can be used to retrieve the following information:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;tt&amp;gt;Ids&amp;lt;/tt&amp;gt; state variable includes &amp;lt;tt&amp;gt;calmradio.com&amp;lt;/tt&amp;gt; if Calm Radio is supported.&lt;br /&gt;
* &amp;lt;tt&amp;gt;Data&amp;lt;/tt&amp;gt; from &amp;lt;tt&amp;gt;Get&amp;lt;/tt&amp;gt; contains the json object returned from login (so includes both a login token and a note on membership level).&lt;br /&gt;
* &amp;lt;tt&amp;gt;Status&amp;lt;/tt&amp;gt; from &amp;lt;tt&amp;gt;Get&amp;lt;/tt&amp;gt; is blank if Username and Password are both either blank or set and valid.  If &amp;lt;tt&amp;gt;Status&amp;lt;/tt&amp;gt; is not blank, it contains either json returned from a Calm Radio API or an error string.&lt;br /&gt;
* The token returned from &amp;lt;tt&amp;gt;Login&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ReLogin&amp;lt;/tt&amp;gt; is a Calm Radio token.  No streams can be played if this is empty.&lt;br /&gt;
&lt;br /&gt;
Tracks can be added to either [[Av:Developer:PlaylistService | Playlist]] or [[Av:Developer:RadioService | Radio]] services with urls in the form &amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;calmradio://stream?[url encoded full url to calm radio stream]&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:TransportPlayAsCommands</id>
		<title>Av:Developer:TransportPlayAsCommands</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:TransportPlayAsCommands"/>
				<updated>2017-04-24T13:38:42Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Add track={json}&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Transport PlayAs Options =&lt;br /&gt;
The [[Av:Developer:TransportService | Transport]] service’s &amp;lt;tt&amp;gt;PlayAs&amp;lt;/tt&amp;gt; action takes arguments for &amp;lt;tt&amp;gt;mode&amp;lt;/tt&amp;gt; (source or group of related sources) and a mode-specific &amp;lt;tt&amp;gt;command&amp;lt;/tt&amp;gt;.  Some standard modes and commands are listed below; other manufacturer-specific options are possible.&lt;br /&gt;
&lt;br /&gt;
=== Playlist ===&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;quot;playlist&amp;quot;&amp;lt;/tt&amp;gt; mode supports the following commands:&lt;br /&gt;
* &amp;lt;tt&amp;gt;id=[track_id]&amp;lt;/tt&amp;gt; - Halt playback of any current track and switch to the track with the specified id. Returns a &amp;lt;tt&amp;gt;800&amp;lt;/tt&amp;gt; fault code if &amp;lt;tt&amp;gt;[track_id]&amp;lt;/tt&amp;gt; is not valid.&lt;br /&gt;
* &amp;lt;tt&amp;gt;index=[playlist_index]&amp;lt;/tt&amp;gt; - Halt playback of the current track and switch to the track with the specified index. Returns a &amp;lt;tt&amp;gt;802&amp;lt;/tt&amp;gt; fault code if the index is beyond the end of the playlist.&lt;br /&gt;
* &amp;lt;tt&amp;gt;track={&amp;quot;uri&amp;quot;:&amp;quot;track_uri&amp;quot;,&amp;quot;metadata&amp;quot;:&amp;quot;didl_lite&amp;quot;}&amp;lt;/tt&amp;gt; - load the specified track at the end of the current Playlist and play it next.&lt;br /&gt;
&lt;br /&gt;
=== Radio ===&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;quot;radio&amp;quot;&amp;lt;/tt&amp;gt; mode supports the following command:&lt;br /&gt;
* &amp;lt;tt&amp;gt;id=[preset_id]&amp;lt;/tt&amp;gt; – Start playing the specified preset.  Returns a &amp;lt;tt&amp;gt;800&amp;lt;/tt&amp;gt; fault code if &amp;lt;tt&amp;gt;[preset_id]&amp;lt;/tt&amp;gt; does not match a current preset&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;quot;Radio-Single&amp;quot;&amp;lt;/tt&amp;gt; mode supports the following command:&lt;br /&gt;
* &amp;lt;tt&amp;gt;track={&amp;quot;uri&amp;quot;:&amp;quot;track_uri&amp;quot;,&amp;quot;metadata&amp;quot;:&amp;quot;didl_lite&amp;quot;}&amp;lt;/tt&amp;gt; - load the specified track.&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:TransportService</id>
		<title>Av:Developer:TransportService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:TransportService"/>
				<updated>2017-04-24T13:36:36Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: /* SeekSecondAbsolute */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Transport Service =&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Transport service provides source-independent control of play, pause, stop, skip and seek.&lt;br /&gt;
&lt;br /&gt;
If a device's [[Av:Developer:ProductService | Product]] service reports an attribute &amp;lt;tt&amp;gt;&amp;quot;Transport&amp;quot;&amp;lt;/tt&amp;gt;, 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.&lt;br /&gt;
&lt;br /&gt;
== Evented Properties ==&lt;br /&gt;
=== Modes ===&lt;br /&gt;
List of available modes (JSON array of strings).&lt;br /&gt;
&lt;br /&gt;
=== CanSkipNext ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if the &amp;lt;tt&amp;gt;SkipNext&amp;lt;/tt&amp;gt; action is currently available; &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
Any mode that is sometimes capable of changing stream as a consequence of &amp;lt;tt&amp;gt;SkipNext&amp;lt;/tt&amp;gt; will always report &amp;lt;tt&amp;gt;CanSkipNext&amp;lt;/tt&amp;gt; as &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== CanSkipPrevious ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if the &amp;lt;tt&amp;gt;SkipPrevious&amp;lt;/tt&amp;gt; action is currently available; &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
Any mode that is sometimes capable of changing stream as a consequence of &amp;lt;tt&amp;gt;SkipPrevious&amp;lt;/tt&amp;gt; will always report &amp;lt;tt&amp;gt;CanSkipPrevious&amp;lt;/tt&amp;gt; as &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== CanRepeat ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if the &amp;lt;tt&amp;gt;SetRepeat&amp;lt;/tt&amp;gt; action is currently available; &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
=== CanShuffle ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if the &amp;lt;tt&amp;gt;SetShuffle&amp;lt;/tt&amp;gt; action is currently available; &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
=== StreamId ===&lt;br /&gt;
Integer id, uniquely identifying the current stream.&lt;br /&gt;
&lt;br /&gt;
=== CanSeek ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if the &amp;lt;tt&amp;gt;SeekSecondAbsolute&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SeekSecondRelative&amp;lt;/tt&amp;gt; actions are available for the current stream; &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
=== CanPause ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if the stream can be paused (so is not being played at a rate determined by a remote sender); &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
=== TransportState ===&lt;br /&gt;
One of&lt;br /&gt;
* &amp;lt;tt&amp;gt;Playing&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Paused&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Stopped&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Buffering&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Waiting&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Repeat ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if repeat mode is currently enabled; &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Shuffle ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if shuffle mode is currently enabled; &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
=== PlayAs ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string mode, in string command)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
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 [[Av:Developer:TransportPlayAsCommands | modes and commands]] are documented separately.&lt;br /&gt;
&lt;br /&gt;
=== Play ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Start a pending stream playing.&lt;br /&gt;
&lt;br /&gt;
A stream must be ready to play. Possibly via calls to another network service.&lt;br /&gt;
&lt;br /&gt;
Behaviour when a stream is already playing varies depending on the active modes (source).&lt;br /&gt;
&lt;br /&gt;
=== Pause ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pause the current stream.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;801&amp;lt;/tt&amp;gt; fault code if the current channel does not support being paused (is being played at a rate determined by a remote sender).&lt;br /&gt;
&lt;br /&gt;
=== Stop ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
Stop the current stream.&lt;br /&gt;
&lt;br /&gt;
=== Next ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Move to the next stream (i.e. skip forwards).  Determination of what comes next may vary between sources/modes.  If &amp;lt;tt&amp;gt;TransportState&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;Stopped&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;Paused&amp;lt;/tt&amp;gt;, try to start playing.&lt;br /&gt;
&lt;br /&gt;
=== Previous ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Move to the previous stream (i.e. skip backwards).  If &amp;lt;tt&amp;gt;TransportState&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;Stopped&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;Paused&amp;lt;/tt&amp;gt;, try to start playing.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;801&amp;lt;/tt&amp;gt; fault code if the current channel does not support skipping backwards. &lt;br /&gt;
&lt;br /&gt;
=== SetRepeat ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint repeat)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Sets the Repeat state of the device, affecting all sources that are capable of implementing a repeat feature.&lt;br /&gt;
&lt;br /&gt;
=== SetShuffle ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint shuffle)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Sets the Shuffle state of the device, affecting all sources that are capable of implementing a randomise feature.&lt;br /&gt;
&lt;br /&gt;
=== SeekSecondAbsolute ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint streamId, in uint secondsAbsolute)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Seek to an absolute position in the current stream.  If &amp;lt;tt&amp;gt;TransportState&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;Stopped&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;Paused&amp;lt;/tt&amp;gt;, try to start playing.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;803&amp;lt;/tt&amp;gt; fault code if the seek is not possible.&lt;br /&gt;
&lt;br /&gt;
=== SeekSecondRelative ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint streamId, in int secondsRelative)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Seek to a position relative to what's currently playing in the current stream.  If &amp;lt;tt&amp;gt;TransportState&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;Stopped&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;Paused&amp;lt;/tt&amp;gt;, try to start playing.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;803&amp;lt;/tt&amp;gt; fault code if the seek is not possible.&lt;br /&gt;
&lt;br /&gt;
=== TransportState ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string state)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read the current value of the TransportState property.&lt;br /&gt;
&lt;br /&gt;
=== Modes ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string modes)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Modes&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== ModeInfo ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string mode, out bool canSkipNext, out bool canSkipPrevious, out bool canRepeat, out bool canShuffle)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Reports the values of the &amp;lt;tt&amp;gt;Mode&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;CanSkipNext&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;CanSkipPrev&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;CanRepeat&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;CanShuffle&amp;lt;/tt&amp;gt; properties.&lt;br /&gt;
&lt;br /&gt;
=== StreamInfo ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: &amp;lt;br&amp;gt;&lt;br /&gt;
(out uint streamId, out bool seekable, out bool pausable)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reports current stream information:&lt;br /&gt;
* &amp;lt;tt&amp;gt;StreamId&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Seekable&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Pausable&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StreamId ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint streamId)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read the current value of the &amp;lt;tt&amp;gt;StreamId&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== Repeat ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint repeat)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read the current value of the &amp;lt;tt&amp;gt;Repeat&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== Shuffle ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint shuffle)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read the current value of the &amp;lt;tt&amp;gt;Shuffle&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
== UPnP Service Description ==&lt;br /&gt;
For devices supporting the UPnP protocol, the service description is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;name: &amp;quot;Transport&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;domain: &amp;quot;av.openhome.org&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;version: &amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
  &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
  &amp;lt;actionList&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;PlayAs&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Mode&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_string&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Command&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_string&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Play&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Pause&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Stop&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SkipNext&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SkipPrevious&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SetRepeat&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Repeat&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Repeat&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SetShuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Shuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Shuffle&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SeekSecondAbsolute&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;StreamId&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;SecondAbsolute&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_uint&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SeekSecondRelative&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;StreamId&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;SecondRelative&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_int&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;TransportState&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;State&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;TransportState&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Modes&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Modes&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Modes&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;ModeInfo&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;CanSkipNext&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;CanSkipNext&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;CanSkipPrevious&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;CanSkipPrevious&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;CanRepeat&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;CanRepeat&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;CanShuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;CanShuffle&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;StreamInfo&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;StreamId&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;CanSeek&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;CanSeek&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;CanPause&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;CanPause&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;StreamId&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Repeat&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Repeat&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Repeat&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Shuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Shuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Shuffle&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
  &amp;lt;/actionList&amp;gt;&lt;br /&gt;
  &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Modes&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;CanSkipNext&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;CanSkipPrevious&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;CanRepeat&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;CanShuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;CanSeek&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;CanPause&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;TransportState&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
      &amp;lt;allowedValueList&amp;gt;&lt;br /&gt;
        &amp;lt;allowedValue&amp;gt;Playing&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
        &amp;lt;allowedValue&amp;gt;Paused&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
        &amp;lt;allowedValue&amp;gt;Stopped&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
        &amp;lt;allowedValue&amp;gt;Buffering&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
        &amp;lt;allowedValue&amp;gt;Waiting&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
      &amp;lt;/allowedValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Repeat&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Shuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;A_ARG_TYPE_uint&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;A_ARG_TYPE_int&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;i4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;A_ARG_TYPE_string&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
  &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:DavaarChanges</id>
		<title>Av:Developer:Eriskay:DavaarChanges</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:DavaarChanges"/>
				<updated>2015-12-15T14:54:55Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;= Changes between Davaar and Eriskay =  This page outlines the API changes between Davaar and Eriskay.  == Device == New service.  Control points use this service to determine wh...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Changes between Davaar and Eriskay =&lt;br /&gt;
&lt;br /&gt;
This page outlines the API changes between Davaar and Eriskay.&lt;br /&gt;
&lt;br /&gt;
== Device ==&lt;br /&gt;
New service.&lt;br /&gt;
&lt;br /&gt;
Control points use this service to determine whether a device is using compatible software.  The presence of some services below can be inferred from this service.&lt;br /&gt;
&lt;br /&gt;
== Product ==&lt;br /&gt;
Still the entrypoint for Topology algorithm.  Control points no longer need to search for this – its presence can be inferred by checking for the &amp;lt;tt&amp;gt;openhome.org.product&amp;lt;/tt&amp;gt; attribute in the versions section of the [[Av:Developer:Eriskay:DeviceService | Device]] description.&lt;br /&gt;
&lt;br /&gt;
The following actions / properties have changed:&lt;br /&gt;
* &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; is now &amp;lt;tt&amp;gt;SourceArray&amp;lt;/tt&amp;gt; and is formatted as JSON&lt;br /&gt;
* Similarly, &amp;lt;tt&amp;gt;SourceXmlChangeCount&amp;lt;/tt&amp;gt; is now &amp;lt;tt&amp;gt;SourceArrayChangeCount&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;ProductName&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ProductRoom&amp;lt;/tt&amp;gt; are now simply &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;Room&amp;lt;/tt&amp;gt;&lt;br /&gt;
* The &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; action is now &amp;lt;tt&amp;gt;Names&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;SetSourceIndexByName&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetSourceIndex&amp;lt;/tt&amp;gt; have been replaced by &amp;lt;tt&amp;gt;SetSource&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;SourceIndex&amp;lt;/tt&amp;gt; has been replaced by &amp;lt;tt&amp;gt;SourceSystemName&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The following actions / properties have been (re)moved:&lt;br /&gt;
* &amp;lt;tt&amp;gt;SourceCount&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SourceIndex&amp;lt;/tt&amp;gt; have been removed.  Use the &amp;lt;tt&amp;gt;SetSource&amp;lt;/tt&amp;gt; action and &amp;lt;tt&amp;gt;SourceSystemName&amp;lt;/tt&amp;gt; property instead.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;Source&amp;lt;/tt&amp;gt; action has been removed.  Use &amp;lt;tt&amp;gt;SourceArray&amp;lt;/tt&amp;gt;, parsing the JSON returned, to get information about a single source.&lt;br /&gt;
* &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; has been removed and is now available via the [[Av:Developer:Eriskay:DeviceService | Device]] service.&lt;br /&gt;
* The various &amp;lt;tt&amp;gt;Manufacturer&amp;lt;/tt&amp;gt; properties and &amp;lt;tt&amp;gt;Manufacturer&amp;lt;/tt&amp;gt; action have been removed and are now available via the [[Av:Developer:Eriskay:DeviceService | Device]] service.&lt;br /&gt;
* The various &amp;lt;tt&amp;gt;Model&amp;lt;/tt&amp;gt; properties and &amp;lt;tt&amp;gt;Model&amp;lt;/tt&amp;gt; action have been removed and are now available via the [[Av:Developer:Eriskay:DeviceService | Device]] service.&lt;br /&gt;
* The &amp;lt;tt&amp;gt;ProductInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductUri&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductImageUri&amp;lt;/tt&amp;gt; properties have been removed and are no longer returned by the &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; action.  These can now be read via the [[Av:Developer:Eriskay:DeviceService | Device]] service.&lt;br /&gt;
* &amp;lt;tt&amp;gt;SetSourceIndexByName&amp;lt;/tt&amp;gt; has been removed.&lt;br /&gt;
&lt;br /&gt;
The following actions / properties have been added:&lt;br /&gt;
* &amp;lt;tt&amp;gt;Home&amp;lt;/tt&amp;gt; provides an identifier for a group of rooms.  Traditional control points do not need to use this.&lt;br /&gt;
&lt;br /&gt;
== Info ==&lt;br /&gt;
Removed.  Use the [[Av:Developer:Eriskay:TransportService | Transport]] service instead.&lt;br /&gt;
&lt;br /&gt;
== Transport ==&lt;br /&gt;
New service.&lt;br /&gt;
&lt;br /&gt;
Replaces Info service plus transport commands (&amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Pause&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Stop&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Next&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Prev&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;SeekSecondsAbsolute&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SeekSecondsRelative&amp;lt;/tt&amp;gt;) from source-specific services.&lt;br /&gt;
&lt;br /&gt;
== Time ==&lt;br /&gt;
No Changes&lt;br /&gt;
&lt;br /&gt;
== Volume ==&lt;br /&gt;
Removed the &amp;lt;tt&amp;gt;VolumeMilliDbPerStep&amp;lt;/tt&amp;gt; property.  Control points which set volume as an absolute decibel level are no longer supported.&lt;br /&gt;
&lt;br /&gt;
One new property – &amp;lt;tt&amp;gt;UnityGain&amp;lt;/tt&amp;gt; – which reports whether the current channel is already volume controlled.&lt;br /&gt;
&lt;br /&gt;
== Credentials ==&lt;br /&gt;
&amp;lt;tt&amp;gt;ReLogin&amp;lt;/tt&amp;gt; action renamed &amp;lt;tt&amp;gt;Relogin&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Tokens and data returned for Tidal and Qobuz streaming services are now JSON arrays to allow for additional information to be communicated in future.&lt;br /&gt;
&lt;br /&gt;
== Sender==&lt;br /&gt;
&amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;PresentationUrl&amp;lt;/tt&amp;gt; properties / getters have been removed.  These can be published as attributes via the [[Av:Developer:Eriskay:DeviceService | Device]] service if required.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Metadata&amp;lt;/tt&amp;gt; format has changed from DIDL-Lite to OpenHome Metadata.&lt;br /&gt;
&lt;br /&gt;
Updated list of allowed values for &amp;lt;tt&amp;gt;Status&amp;lt;/tt&amp;gt; property (no change in behaviour – Davaar docs were incorrect).&lt;br /&gt;
&lt;br /&gt;
== Configuration ==&lt;br /&gt;
New service.&lt;br /&gt;
&lt;br /&gt;
Developer aid that may be useful from test programs but should not be used in production code.&lt;br /&gt;
&lt;br /&gt;
== Playlist ==&lt;br /&gt;
The following actions have been removed.  Use equivalents in [[Av:Developer:Eriskay:TransportService | Transport]] service instead:&lt;br /&gt;
* &amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;Pause&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;Stop&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Next&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;Prev&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;SeekSecondsAbsolute&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;SeekSecondsRelative&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;TransportState&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Read&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;DeleteId&amp;lt;/tt&amp;gt; have been removed.  Use &amp;lt;tt&amp;gt;ReadList&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;DeleteList&amp;lt;/tt&amp;gt; instead.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Metadata&amp;lt;/tt&amp;gt; passed to &amp;lt;tt&amp;gt;Insert&amp;lt;/tt&amp;gt; is expected to now be in OpenHome Metadata format.  Whatever format is passed in will be returned from both &amp;lt;tt&amp;gt;Read&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ReadList&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The following actions have been added:&lt;br /&gt;
* &amp;lt;tt&amp;gt;Move&amp;lt;/tt&amp;gt;, which simplifies playlist editing&lt;br /&gt;
* &amp;lt;tt&amp;gt;DeleteList&amp;lt;/tt&amp;gt;, which simplifies bulk deletion (e.g. an entire album).&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt; property now has string type and contains a JSON integer array.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;SeekId&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SeekIndex&amp;lt;/tt&amp;gt; actions have been removed.  Equivalent functionality is available via&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;Transport.PlayAs(&amp;quot;playlist&amp;quot;, &amp;quot;id=[track_id]&amp;quot;)&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;Transport.PlayAs(&amp;quot;playlist&amp;quot;, &amp;quot;index=[track_index]&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;ProtocolInfo&amp;lt;/tt&amp;gt; property / getter has been removed.  Control points are recommended to just queue any audio content with a player.  Any that still want to check audio capabilities can do so via &amp;lt;tt&amp;gt;AVTransport&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Radio ==&lt;br /&gt;
The following actions have been removed.  Use equivalents in [[Av:Developer:Eriskay:TransportService | Transport]] service instead:&lt;br /&gt;
U &amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;Pause&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;Stop&amp;lt;/tt&amp;gt;&lt;br /&gt;
U &amp;lt;tt&amp;gt;SeekSecondsAbsolute&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;SeekSecondsRelative&amp;lt;/tt&amp;gt;&lt;br /&gt;
U &amp;lt;tt&amp;gt;TransportState&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Next&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;Prev&amp;lt;/tt&amp;gt; are now supported via the [[Av:Developer:Eriskay:TransportService | Transport]] service&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Metadata&amp;lt;/tt&amp;gt; (for the current track and from &amp;lt;tt&amp;gt;Read&amp;lt;/tt&amp;gt; / &amp;lt;tt&amp;gt;ReadList&amp;lt;/tt&amp;gt;) is now in OpenHome Metadata format&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt; property now has string type and contains a JSON integer array.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;SetId&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SetChannel&amp;lt;/tt&amp;gt; actions have been removed.  Equivalent functionality is available via&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;Transport.PlayAs(&amp;quot;radio&amp;quot;, &amp;quot;id=[preset_id]&amp;quot;)&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;Transport.PlayAs(&amp;quot;single&amp;quot;, &amp;quot;{&amp;quot;url&amp;quot;: &amp;quot;[track_url]&amp;quot;, &amp;quot;metadata&amp;quot;: &amp;quot;{track_metadata]&amp;quot;}&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;ProtocolInfo&amp;lt;/tt&amp;gt; property / getter has been removed.  Control points are recommended to just queue any audio content with a player.  Any that still want to check audio capabilities can do so via &amp;lt;tt&amp;gt;AVTransport&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Receiver ==&lt;br /&gt;
The &amp;lt;tt&amp;gt;TransportState&amp;lt;/tt&amp;gt; property and getter have been removed.  Use equivalents in [[Av:Developer:Eriskay:TransportService | Transport]] service instead.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;ProtocolInfo&amp;lt;/tt&amp;gt; property / getter is now a space-separated list of protocols.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;SetSender&amp;lt;/tt&amp;gt; action has been removed.  Equivalent functionality is available via&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;Transport.PlayAs(&amp;quot;receiver&amp;quot;, &amp;quot;{&amp;quot;url&amp;quot;: &amp;quot;[sender_url]&amp;quot;, &amp;quot;metadata&amp;quot;: &amp;quot;[openhome_sender_metadata]&amp;quot;}&amp;quot;)&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Exakt ==&lt;br /&gt;
Service has been moved to the &amp;lt;tt&amp;gt;linn.co.uk&amp;lt;/tt&amp;gt; domain.&lt;br /&gt;
&lt;br /&gt;
There are no guarantees about compatibility so use by third parties is not encouraged.&lt;br /&gt;
&lt;br /&gt;
== NetworkMonitor ==&lt;br /&gt;
Service has been moved to the &amp;lt;tt&amp;gt;linn.co.uk&amp;lt;/tt&amp;gt; domain.&lt;br /&gt;
&lt;br /&gt;
There are no guarantees about compatibility so use by third parties is not encouraged.&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager ==&lt;br /&gt;
Service has been withdrawn.&lt;br /&gt;
&lt;br /&gt;
There is no support for shared playlists in Eriskay media servers.&lt;br /&gt;
&lt;br /&gt;
Equivalent functionality may be supported by a cloud service in future.&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:StreamingServices</id>
		<title>Av:Developer:Eriskay:StreamingServices</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:StreamingServices"/>
				<updated>2015-12-15T14:47:25Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;= Streaming Services =  == TIDAL == Tidal's API is private. See Tidal for access to it. Or speak to us for help if you think that your access to the API would benefit OpenHome.  ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Streaming Services =&lt;br /&gt;
&lt;br /&gt;
== TIDAL ==&lt;br /&gt;
Tidal's API is private. See Tidal for access to it. Or speak to us for help if you think that your access to the API would benefit OpenHome.&lt;br /&gt;
&lt;br /&gt;
Assuming access to Tidal's API, the [[Av:Developer:Eriskay:CredentialsService | Credentials]] service can be used to retrieve the following information:&lt;br /&gt;
* The &amp;lt;tt&amp;gt;Ids&amp;lt;/tt&amp;gt; property variable includes &amp;lt;tt&amp;gt;tidalhifi.com&amp;lt;/tt&amp;gt; if Tidal is supported.&lt;br /&gt;
* &amp;lt;tt&amp;gt;Data&amp;lt;/tt&amp;gt; from &amp;lt;tt&amp;gt;Get&amp;lt;/tt&amp;gt; is JSON and contains at least the following fields:&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;country_code&amp;quot;: &amp;quot;Tidal country code&amp;quot;,&lt;br /&gt;
        &amp;quot;user_id&amp;quot;: &amp;quot;Tidal user identifier&amp;quot;&lt;br /&gt;
        .....&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Status&amp;lt;/tt&amp;gt; from &amp;lt;tt&amp;gt;Get&amp;lt;/tt&amp;gt; is blank if &amp;lt;tt&amp;gt;Username&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;Password&amp;lt;/tt&amp;gt; are both either blank or set and valid. If &amp;lt;tt&amp;gt;Status&amp;lt;/tt&amp;gt; is not blank, it contains either JSON returned from a Tidal API or an error string.&lt;br /&gt;
* The token returned from &amp;lt;tt&amp;gt;Login&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;Relogin&amp;lt;/tt&amp;gt; is JSON  and contains at least the following fields:&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;session_id&amp;quot;: &amp;quot;Tidal session id&amp;quot;&lt;br /&gt;
        .....&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
* Tracks can be added to the [[Av:Developer:Eriskay:PlaylistService | Playlist]] service with urls in the form&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    tidal://track?version=1&amp;amp;trackId=[tidal_track_id]&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Qobuz ==&lt;br /&gt;
Qobuz's [https://github.com/Qobuz/api-documentation developer API] is published on github.&lt;br /&gt;
&lt;br /&gt;
The [[Av:Developer:Eriskay:CredentialsService | Credentials]] service can be used to retrieve the following information:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;tt&amp;gt;Ids&amp;lt;/tt&amp;gt; state variable includes &amp;lt;tt&amp;gt;qobuz.com&amp;lt;/tt&amp;gt; if Qobuz is supported.&lt;br /&gt;
* &amp;lt;tt&amp;gt;Data&amp;lt;/tt&amp;gt; from &amp;lt;tt&amp;gt;Get&amp;lt;/tt&amp;gt; is JSON  and contains at least the following fields:&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;app_id&amp;quot;: &amp;quot;qobuz app id&amp;quot;&lt;br /&gt;
        .....&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Status&amp;lt;/tt&amp;gt; from &amp;lt;tt&amp;gt;Get&amp;lt;/tt&amp;gt; is blank if &amp;lt;tt&amp;gt;Username&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;Password&amp;lt;/tt&amp;gt; are both either blank or set and valid.  If &amp;lt;tt&amp;gt;Status&amp;lt;/tt&amp;gt; is not blank, it contains either JSON returned from a Qobuz API or an error string.&lt;br /&gt;
* The token returned from &amp;lt;tt&amp;gt;Login&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;Relogin&amp;lt;/tt&amp;gt; is JSON and contains at least the &amp;lt;tt&amp;gt;user_auth_token&amp;lt;/tt&amp;gt; required by some Qobuz calls.&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;user_auth_token&amp;quot;: &amp;quot;[token from qobuz]&amp;quot;&lt;br /&gt;
        .....&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Some Qobuz APIs require an &amp;lt;tt&amp;gt;app_secret&amp;lt;/tt&amp;gt; argument.  These APIs should not need to be called from control points.  Qobuz's standard development agreement prohibits this being shared between device and control point.&lt;br /&gt;
&lt;br /&gt;
Tracks can be added to the [[Av:Developer:Eriskay:PlaylistService | Playlist]] service with urls in the form&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    qobuz://track?version=2&amp;amp;trackId=[qobuz_track_id]&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:TransportPlayAsCommands</id>
		<title>Av:Developer:Eriskay:TransportPlayAsCommands</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:TransportPlayAsCommands"/>
				<updated>2015-12-15T14:44:39Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;= Transport PlayAs Options = The  Transport service’s &amp;lt;tt&amp;gt;PlayAs&amp;lt;/tt&amp;gt; action takes arguments for &amp;lt;tt&amp;gt;mode&amp;lt;/tt&amp;gt; (source or group of re...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Transport PlayAs Options =&lt;br /&gt;
The [[Av:Developer:Eriskay:TransportService | Transport]] service’s &amp;lt;tt&amp;gt;PlayAs&amp;lt;/tt&amp;gt; action takes arguments for &amp;lt;tt&amp;gt;mode&amp;lt;/tt&amp;gt; (source or group of related sources) and a mode-specific &amp;lt;tt&amp;gt;command&amp;lt;/tt&amp;gt;.  Some standard modes and commands are listed below; other manufacturer-specific options are possible.&lt;br /&gt;
&lt;br /&gt;
=== Playlist ===&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;quot;playlist&amp;quot;&amp;lt;/tt&amp;gt; mode supports the following commands:&lt;br /&gt;
* &amp;lt;tt&amp;gt;id=[track_id]&amp;lt;/tt&amp;gt; - Halt playback of any current track and switch to the track with the specified id. Returns a &amp;lt;tt&amp;gt;800&amp;lt;/tt&amp;gt; fault code if &amp;lt;tt&amp;gt;[track_id]&amp;lt;/tt&amp;gt; is not valid.&lt;br /&gt;
* &amp;lt;tt&amp;gt;index=[playlist_index]&amp;lt;/tt&amp;gt; - Halt playback of the current track and switch to the track with the specified index. Returns a &amp;lt;tt&amp;gt;802&amp;lt;/tt&amp;gt; fault code if the index is beyond the end of the playlist.&lt;br /&gt;
&lt;br /&gt;
=== Radio ===&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;quot;radio&amp;quot;&amp;lt;/tt&amp;gt; mode supports the following command:&lt;br /&gt;
* &amp;lt;tt&amp;gt;id=[preset_id]&amp;lt;/tt&amp;gt; – Start playing the specified preset.  Returns a &amp;lt;tt&amp;gt;800&amp;lt;/tt&amp;gt; fault code if &amp;lt;tt&amp;gt;[preset_id]&amp;lt;/tt&amp;gt; does not match a current preset&lt;br /&gt;
&lt;br /&gt;
=== Receiver ===&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;quot;receiver&amp;quot;&amp;lt;/tt&amp;gt; mode supports the following command:&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;url&amp;quot;: &amp;quot;[sender_url]&amp;quot;,&lt;br /&gt;
        &amp;quot;metadata&amp;quot;: &amp;quot;[openhome_sender_metadata]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
and will start playing the same content as the device that either hosts the &amp;lt;tt&amp;gt;ohu&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;ohm&amp;lt;/tt&amp;gt; sender or matches the zone in the &amp;lt;tt&amp;gt;ohz&amp;lt;/tt&amp;gt; url.&lt;br /&gt;
&lt;br /&gt;
=== Single ===&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;quot;single&amp;quot;&amp;lt;/tt&amp;gt; mode supports the following command&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;url&amp;quot;: &amp;quot;[track_url]&amp;quot;,&lt;br /&gt;
        &amp;quot;metadata&amp;quot;: &amp;quot;[openhome_metadata]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
and will start playing &amp;lt;tt&amp;gt;[track_url]&amp;lt;/tt&amp;gt;, reporting the specified metadata.  When the track completes, it will be queued again then &amp;lt;tt&amp;gt;TransportState&amp;lt;/tt&amp;gt; will change to &amp;lt;tt&amp;gt;Stopped&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== External ===&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;quot;external&amp;quot;&amp;lt;/tt&amp;gt; mode supports the following command:&lt;br /&gt;
* &amp;lt;tt&amp;gt;[system_name]&amp;lt;/tt&amp;gt; – activate the source with whose system name matches &amp;lt;tt&amp;gt;[system_name]&amp;lt;/tt&amp;gt; and start playing.&lt;br /&gt;
&lt;br /&gt;
=== UpnpAv ===&lt;br /&gt;
The &amp;lt;tt&amp;gt;&amp;quot;upnpav&amp;quot;&amp;lt;/tt&amp;gt; mode supports the following command:&lt;br /&gt;
* &amp;lt;tt&amp;gt;[blank]&amp;lt;/tt&amp;gt; – Start playing the last uri set via &amp;lt;tt&amp;gt;AVTransport.SetAVTransportUri&amp;lt;/tt&amp;gt;.  Activates the source but leaves transport state as &amp;lt;tt&amp;gt;STOPPED&amp;lt;/tt&amp;gt; if no uri is set.&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:DeviceService</id>
		<title>Av:Developer:Eriskay:DeviceService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:DeviceService"/>
				<updated>2015-12-15T14:42:02Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;= Device Service = == Overview == The Device service serves as the starting point for retrieving information about an OpenHome device and resolving questions of compatibility bet...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Device Service =&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Device service serves as the starting point for retrieving information about an OpenHome device and resolving questions of compatibility between that device and an OpenHome control point.&lt;br /&gt;
&lt;br /&gt;
Before consuming further services, an OpenHome control point MUST engage with the Device service in order to establish whether the device is compatible with the OpenHome client software with which the control point was built.&lt;br /&gt;
&lt;br /&gt;
An OpenHome control point SHOULD indicate to the user the presence of any incompatible device on the network but MUST NOT engage with the device beyond this requirement.&lt;br /&gt;
&lt;br /&gt;
In this situation the device can be identified to the user using the version-independent information provided by the Device service: primarily the name and manufacturer information.&lt;br /&gt;
&lt;br /&gt;
In addition to describing standard OpenHome capabilities, the Device service can be used to publish the presence of vendor-specific enhancements using the version-specific attributes property.&lt;br /&gt;
&lt;br /&gt;
The Device service may also be used to publish the availability of both standard and vendor-specific web applications using the webapps property.&lt;br /&gt;
&lt;br /&gt;
Further free-form vendor-specific information can be included in the JSON document using the extensions property.&lt;br /&gt;
&lt;br /&gt;
The Device publishes read-only information about an OpenHome device using its Description property, which is in JSON format and has the following JSON-Schema.&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;title&amp;quot;: &amp;quot;OpenHome Device Description&amp;quot;,&lt;br /&gt;
        &amp;quot;$schema&amp;quot;: &amp;quot;http://json-schema.org/draft-04/schema#&amp;quot;,&lt;br /&gt;
        &amp;quot;properties&amp;quot;: {&lt;br /&gt;
            &amp;quot;name&amp;quot;: {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;domain&amp;quot;: {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;id&amp;quot;: {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;manufacturer&amp;quot; : {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
                &amp;quot;properties&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: {&lt;br /&gt;
                        &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;info&amp;quot;: {&lt;br /&gt;
                        &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;url&amp;quot;: {&lt;br /&gt;
                        &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;image&amp;quot;: {&lt;br /&gt;
                        &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;required&amp;quot;: [&amp;quot;name&amp;quot;]&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;model&amp;quot; : {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
                &amp;quot;properties&amp;quot;: {&lt;br /&gt;
                    &amp;quot;name&amp;quot;: {&lt;br /&gt;
                        &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;info&amp;quot;: {&lt;br /&gt;
                        &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;url&amp;quot;: {&lt;br /&gt;
                        &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;image&amp;quot;: {&lt;br /&gt;
                        &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
                    }&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;required&amp;quot;: [&amp;quot;name&amp;quot;]&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;webapps&amp;quot; : {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,&lt;br /&gt;
                &amp;quot;items&amp;quot;: {&lt;br /&gt;
                    &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
                    &amp;quot;properties&amp;quot;: {&lt;br /&gt;
                        &amp;quot;id&amp;quot; : {&lt;br /&gt;
                            &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;url&amp;quot;: {&lt;br /&gt;
                            &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;,&lt;br /&gt;
                        }&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;required&amp;quot;: [&amp;quot;id&amp;quot;, &amp;quot;url&amp;quot;]&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;minItems&amp;quot;: 1,&lt;br /&gt;
                &amp;quot;uniqueItems&amp;quot;: true&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;versions&amp;quot; : {&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,&lt;br /&gt;
                &amp;quot;items&amp;quot;: {&lt;br /&gt;
                    &amp;quot;type&amp;quot;: &amp;quot;object&amp;quot;,&lt;br /&gt;
                    &amp;quot;properties&amp;quot;: {&lt;br /&gt;
                        &amp;quot;version&amp;quot; : {&lt;br /&gt;
                            &amp;quot;type&amp;quot;: &amp;quot;integer&amp;quot;,&lt;br /&gt;
                            &amp;quot;minimum&amp;quot; : 5&lt;br /&gt;
                        },&lt;br /&gt;
                        &amp;quot;attributes&amp;quot;: {&lt;br /&gt;
                            &amp;quot;type&amp;quot;: &amp;quot;array&amp;quot;,&lt;br /&gt;
                            &amp;quot;items&amp;quot;: {&lt;br /&gt;
                                &amp;quot;type&amp;quot;: &amp;quot;string&amp;quot;&lt;br /&gt;
                            },&lt;br /&gt;
                            &amp;quot;minItems&amp;quot;: 1,&lt;br /&gt;
                            &amp;quot;uniqueItems&amp;quot;: true&lt;br /&gt;
                        }&lt;br /&gt;
                    },&lt;br /&gt;
                    &amp;quot;required&amp;quot;: [&amp;quot;version&amp;quot;]&lt;br /&gt;
                },&lt;br /&gt;
                &amp;quot;minItems&amp;quot;: 1,&lt;br /&gt;
                &amp;quot;uniqueItems&amp;quot;: true&lt;br /&gt;
            },&lt;br /&gt;
            &amp;quot;extensions&amp;quot; : {&lt;br /&gt;
            }&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;required&amp;quot;: [&lt;br /&gt;
          &amp;quot;name&amp;quot;,&lt;br /&gt;
          &amp;quot;domain&amp;quot;,&lt;br /&gt;
          &amp;quot;id&amp;quot;,&lt;br /&gt;
          &amp;quot;manufacturer&amp;quot;,&lt;br /&gt;
          &amp;quot;model&amp;quot;,&lt;br /&gt;
          &amp;quot;versions&amp;quot;&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;additionalProperties&amp;quot;: false&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Examples ===&lt;br /&gt;
A typical device supporting Eriskay (OpenHome Version 5)&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Kitchen:Sneaky DS&amp;quot;,&lt;br /&gt;
        &amp;quot;domain&amp;quot;: &amp;quot;linn.co.uk&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;1203431&amp;quot;,&lt;br /&gt;
        &amp;quot;manufacturer&amp;quot; : {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;Linn&amp;quot;,&lt;br /&gt;
          &amp;quot;info&amp;quot;: &amp;quot;just listen&amp;quot;&lt;br /&gt;
          &amp;quot;url&amp;quot;: &amp;quot;http://www.linn.co.uk&amp;quot;,&lt;br /&gt;
          &amp;quot;image&amp;quot;: &amp;quot;/images/logo.png&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;model&amp;quot; : {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;Sneaky DS&amp;quot;,&lt;br /&gt;
          &amp;quot;url&amp;quot;: &amp;quot;http://www.linn.co.uk//wiki/index.php/sneaky&amp;quot;,&lt;br /&gt;
          &amp;quot;image&amp;quot;: &amp;quot;/images/icon.png&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;webapps&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;id&amp;quot;: &amp;quot;openhome.org.presentation&amp;quot;,&lt;br /&gt;
              &amp;quot;url&amp;quot;: &amp;quot;/index.html&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;id&amp;quot;: &amp;quot;openhome.org.configuration&amp;quot;,&lt;br /&gt;
              &amp;quot;url&amp;quot;: &amp;quot;/Config/Layouts/Default/index.html?service=Ds&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;id&amp;quot;: &amp;quot;openhome.org.control&amp;quot;,&lt;br /&gt;
              &amp;quot;url&amp;quot;: &amp;quot;Control/Layouts/Default/index.html?service=Ds&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;versions&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;version&amp;quot;: 5&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;extensions&amp;quot;: {&lt;br /&gt;
            &amp;quot;bsp&amp;quot;: &amp;quot;magma&amp;quot;,&lt;br /&gt;
              &amp;quot;mac&amp;quot;: &amp;quot;00:26:0f:21:82:e9&amp;quot;,&lt;br /&gt;
            &amp;quot;software&amp;quot;: &amp;quot;4.25.1134&amp;quot;,&lt;br /&gt;
            &amp;quot;boards&amp;quot; : [&lt;br /&gt;
              {&lt;br /&gt;
                &amp;quot;pcb&amp;quot;: 723,&lt;br /&gt;
                &amp;quot;type&amp;quot;: &amp;quot;PCAS723L2R3&amp;quot;,&lt;br /&gt;
                &amp;quot;id&amp;quot;: &amp;quot;070000041bdec314&amp;quot;,&lt;br /&gt;
                  &amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
              }&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A device that supports Eriskay (OpenHome Version 5) and Fetlar (OpenHome Version 6). The device implements the Linn Exakt extension in Version 5 and 6, and the Linn Exakt v2 extension in version 6.&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;name&amp;quot;: &amp;quot;Bedroom:Akurate DSM&amp;quot;,&lt;br /&gt;
        &amp;quot;domain&amp;quot;: &amp;quot;linn.co.uk&amp;quot;,&lt;br /&gt;
        &amp;quot;id&amp;quot;: &amp;quot;1286201&amp;quot;,&lt;br /&gt;
        &amp;quot;manufacturer&amp;quot; : {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;Linn&amp;quot;,&lt;br /&gt;
          &amp;quot;url&amp;quot;: &amp;quot;http://www.linn.co.uk&amp;quot;,&lt;br /&gt;
          &amp;quot;image&amp;quot;: &amp;quot;/images/logo.png&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;model&amp;quot; : {&lt;br /&gt;
          &amp;quot;name&amp;quot;: &amp;quot;Akurate DSM&amp;quot;,&lt;br /&gt;
          &amp;quot;url&amp;quot;: &amp;quot;http://www.linn.co.uk//wiki/index.php/akurate-dsm&amp;quot;,&lt;br /&gt;
          &amp;quot;image&amp;quot;: &amp;quot;/images/icon.png&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        &amp;quot;webapps&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;id&amp;quot;: &amp;quot;openhome.org.presentation&amp;quot;,&lt;br /&gt;
              &amp;quot;url&amp;quot;: &amp;quot;/index.html&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;id&amp;quot;: &amp;quot;openhome.org.configuration&amp;quot;,&lt;br /&gt;
              &amp;quot;url&amp;quot;: &amp;quot;/Config/Layouts/Default/index.html?service=Ds&amp;quot;&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
              &amp;quot;id&amp;quot;: &amp;quot;openhome.org.control&amp;quot;,&lt;br /&gt;
              &amp;quot;url&amp;quot;: &amp;quot;/Control/Layouts/Default/index.html?service=Ds&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;versions&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;version&amp;quot;: 5,&lt;br /&gt;
                &amp;quot;attributes&amp;quot;: [&lt;br /&gt;
                    &amp;quot;openhome.org.topology&amp;quot;,&lt;br /&gt;
                    &amp;quot;linn.co.uk.exakt&amp;quot;&lt;br /&gt;
                ]&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;version&amp;quot;: 6,&lt;br /&gt;
                &amp;quot;attributes&amp;quot;: [&lt;br /&gt;
                    &amp;quot;openhome.org.topology&amp;quot;,&lt;br /&gt;
                    &amp;quot;linn.co.uk.exakt&amp;quot;,&lt;br /&gt;
                    &amp;quot;linn.co.uk.exakt2&amp;quot;&lt;br /&gt;
                ]&lt;br /&gt;
            }&lt;br /&gt;
        ],&lt;br /&gt;
        &amp;quot;extensions&amp;quot;: {&lt;br /&gt;
            &amp;quot;bsp&amp;quot;: &amp;quot;magma&amp;quot;,&lt;br /&gt;
              &amp;quot;mac&amp;quot;: &amp;quot;00:26:0f:21:b1:18&amp;quot;,&lt;br /&gt;
            &amp;quot;software&amp;quot;: &amp;quot;4.24.1066&amp;quot;,&lt;br /&gt;
            &amp;quot;boards&amp;quot; : [&lt;br /&gt;
                {&lt;br /&gt;
                  &amp;quot;pcb&amp;quot;: 797,&lt;br /&gt;
                  &amp;quot;type&amp;quot;: &amp;quot;PCAS797L1R1&amp;quot;,&lt;br /&gt;
                  &amp;quot;id&amp;quot;: &amp;quot;db000004d775f014&amp;quot;,&lt;br /&gt;
                  &amp;quot;description&amp;quot;: &amp;quot;2011 variant&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                {&lt;br /&gt;
                  &amp;quot;pcb&amp;quot;: 802,&lt;br /&gt;
                  &amp;quot;type&amp;quot;: &amp;quot;PCAS802L3R1&amp;quot;,&lt;br /&gt;
                  &amp;quot;id&amp;quot;: &amp;quot;9f00000505929814&amp;quot;,&lt;br /&gt;
                  &amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                {&lt;br /&gt;
                  &amp;quot;pcb&amp;quot;: 611,&lt;br /&gt;
                  &amp;quot;type&amp;quot;: &amp;quot;PCAS611L1R2&amp;quot;,&lt;br /&gt;
                  &amp;quot;id&amp;quot;: &amp;quot;45000004d7a73414&amp;quot;,&lt;br /&gt;
                  &amp;quot;description&amp;quot;: &amp;quot;Moving Coil&amp;quot;&lt;br /&gt;
                  },&lt;br /&gt;
                {&lt;br /&gt;
                  &amp;quot;pcb&amp;quot;: 799,&lt;br /&gt;
                  &amp;quot;type&amp;quot;: &amp;quot;PCAS799L2R1&amp;quot;,&lt;br /&gt;
                  &amp;quot;id&amp;quot;: &amp;quot;5f000004d7757214&amp;quot;,&lt;br /&gt;
                  &amp;quot;description&amp;quot;: &amp;quot;&amp;quot;&lt;br /&gt;
                  }&lt;br /&gt;
            ]&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Difference Between Device Service Attributes and Product Service Attributes ===&lt;br /&gt;
Those attributes that are necessary for the operation of OpenHome Topology remain in the Product service. These include &amp;lt;tt&amp;gt;Info&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Time&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Volume&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Credentials&amp;lt;/tt&amp;gt;, and &amp;lt;tt&amp;gt;Sender&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;tt&amp;gt;Exakt&amp;lt;/tt&amp;gt; attribute is now more sensibly expressed in the Device service.  And the functionality of the &amp;lt;tt&amp;gt;App:Config&amp;lt;/tt&amp;gt; attribute is now delivered, not as an attribute, but using the &amp;lt;tt&amp;gt;webapps&amp;lt;/tt&amp;gt; property of the Device service.&lt;br /&gt;
&lt;br /&gt;
== Evented Properties ==&lt;br /&gt;
=== Description ===&lt;br /&gt;
A device description in the format outlined above.&lt;br /&gt;
&amp;lt;br&amp;gt;Does not change at run-time.&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
=== Description ===&lt;br /&gt;
Read the value of the &amp;lt;tt&amp;gt;Description&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
== UPnP Service Description ==&lt;br /&gt;
For devices supporting the UPnP protocol, the service description is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;name: &amp;quot;Device&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;domain: &amp;quot;openhome.org.eriskay&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;version: &amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
  &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
  &amp;lt;actionList&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Description&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Description&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
  &amp;lt;/actionList&amp;gt;&lt;br /&gt;
  &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Description&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
  &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:ReceiverService</id>
		<title>Av:Developer:Eriskay:ReceiverService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:ReceiverService"/>
				<updated>2015-12-15T13:28:49Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;= Receiver Service = == Overview == A Songcast receiver plays audio broadcast from a  sender.  The Receiver service provides the means for...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Receiver Service =&lt;br /&gt;
== Overview ==&lt;br /&gt;
A Songcast receiver plays audio broadcast from a [[Av:Developer:Eriskay:SenderService | sender]].  The Receiver service provides the means for controlling a Receiver source.&lt;br /&gt;
&lt;br /&gt;
If a device's [[Av:Developer:Eriskay:ProductService | Product]] service reports a source of type &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt;, then that device is guaranteed to bear the Receiver service.  If the Receiver service is available, all its properties and actions must be fully implemented.&lt;br /&gt;
&lt;br /&gt;
== Evented Properties ==&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
The metadata of the sender to listen to.  In the OpenHome Metadata format provided by the [[Av:Developer:Eriskay:SenderService | Sender]] service.&lt;br /&gt;
&lt;br /&gt;
=== Uri ===&lt;br /&gt;
The uri of the [[Av:Developer:Eriskay:SenderService | Sender]] to listen to.&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
== Sender ==&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string uri, out string metadata)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Report the values of the &amp;lt;tt&amp;gt;Uri&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;Metadata&amp;lt;/tt&amp;gt; properties.&lt;br /&gt;
&lt;br /&gt;
== UPnP Service Description ==&lt;br /&gt;
For devices supporting the UPnP protocol, the service description is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;name: &amp;quot;Receiver&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;domain: &amp;quot;openhome.org.eriskay&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;version: &amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
  &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
  &amp;lt;actionList&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Sender&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Uri&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
  &amp;lt;/actionList&amp;gt;&lt;br /&gt;
  &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
  &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:RadioService</id>
		<title>Av:Developer:Eriskay:RadioService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:RadioService"/>
				<updated>2015-12-15T13:25:01Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;= Radio Service = == Overview == The Radio service offers a means for controlling radio presets.  If a device's  Product service reports ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Radio Service =&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Radio service offers a means for controlling radio presets.&lt;br /&gt;
&lt;br /&gt;
If a device's [[Av:Developer:Eriskay:ProductService | Product]] service reports a source of type &amp;lt;tt&amp;gt;&amp;quot;Radio&amp;quot;&amp;lt;/tt&amp;gt;, then that device is guaranteed to also bear the Radio service.  If the Radio service is available, all its properties and actions must be fully implemented.&lt;br /&gt;
&lt;br /&gt;
== Evented Properties ==&lt;br /&gt;
=== ChannelsMax ===&lt;br /&gt;
The maximum number of presets (and so the number of elements in &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt;).  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== Id ===&lt;br /&gt;
The id of the currently selected preset.  Or &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; if no preset has ever been selected.&lt;br /&gt;
&lt;br /&gt;
=== IdArray ===&lt;br /&gt;
A JSON integer array containing preset ids.  Will always have &amp;lt;tt&amp;gt;ChannelsMax&amp;lt;/tt&amp;gt; elements.  A value of &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; implies that no preset is set for that slot.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
Metadata for the last preset to be selected.&lt;br /&gt;
&lt;br /&gt;
=== Uri ===&lt;br /&gt;
Uri for the last preset to be selected.&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
=== Channel ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string uri, out string metadata)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;Uri&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;Metadata&amp;lt;/tt&amp;gt; properties.&lt;br /&gt;
&lt;br /&gt;
=== ChannelsMax ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint max)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return  the value of the &amp;lt;tt&amp;gt;ChannelsMax&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== Id ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint id)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== IdArray ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint token, out string idArray)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== IdArrayChanged ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint token, out bool changed)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Check to see if the &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt; state variable has changed since gathering the specified &amp;lt;tt&amp;gt;IdArrayToken&amp;lt;/tt&amp;gt;. This Token must have been previously collected from the &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt; action.  This action is provided specifically for clients which cannot consume standard evented updates of properties.&lt;br /&gt;
&lt;br /&gt;
=== Read ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint id, out string metadata)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Given a channel preset id, return its associated metadata.  The metadata will be of the form&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;Title&amp;quot;: &amp;quot;[title]&amp;quot;&lt;br /&gt;
        &amp;quot;Origin&amp;quot;: &amp;quot;[id of origin of metadata]&amp;quot;&lt;br /&gt;
        &amp;quot;Uri&amp;quot;: &amp;quot;[preset uri]&amp;quot;&lt;br /&gt;
        &amp;quot;Artwork&amp;quot;: &amp;quot;[image url]&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
The elements listed above are guaranteed to be present; additional elements may also be included.&lt;br /&gt;
&lt;br /&gt;
=== ReadList ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string ids, out string json)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Given a space separated list of channel preset ids, return their associated metadata.  The metadata will be of the form&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;channels&amp;quot;: [&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;id&amp;quot;: [preset_id_1],&lt;br /&gt;
                &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
                    &amp;quot;Title&amp;quot;: &amp;quot;[title]&amp;quot;&lt;br /&gt;
                    &amp;quot;Origin&amp;quot;: &amp;quot;[id of origin of metadata]&amp;quot;&lt;br /&gt;
                    &amp;quot;Uri&amp;quot;: &amp;quot;[preset uri]&amp;quot;&lt;br /&gt;
                    &amp;quot;Artwork&amp;quot;: &amp;quot;[image url]&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            {&lt;br /&gt;
                &amp;quot;id&amp;quot;: [preset_id_1],&lt;br /&gt;
                &amp;quot;metadata&amp;quot;: {&lt;br /&gt;
                    &amp;quot;Title&amp;quot;: &amp;quot;[title]&amp;quot;&lt;br /&gt;
                    &amp;quot;Origin&amp;quot;: &amp;quot;[id of origin of metadata]&amp;quot;&lt;br /&gt;
                    &amp;quot;Uri&amp;quot;: &amp;quot;[preset uri]&amp;quot;&lt;br /&gt;
                    &amp;quot;Artwork&amp;quot;: &amp;quot;[image url]&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            },&lt;br /&gt;
            ........    &lt;br /&gt;
        ]&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== UPnP Service Description ==&lt;br /&gt;
For devices supporting the UPnP protocol, the service description is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;name: &amp;quot;Radio&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;domain: &amp;quot;openhome.org.eriskay&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;version: &amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
  &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
  &amp;lt;actionList&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Channel&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Uri&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Id&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Read&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Id&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;ReadList&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;IdList&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;IdList&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;ChannelList&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;ChannelList&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;IdArray&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Token&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;IdArrayToken&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Array&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;IdArray&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;IdArrayChanged&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Token&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;IdArrayToken&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;IdArrayChanged&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;ChannelsMax&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;ChannelsMax&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
  &amp;lt;/actionList&amp;gt;&lt;br /&gt;
  &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;IdArray&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;ChannelsMax&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;IdArrayToken&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;IdArrayChanged&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;IdList&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;ChannelList&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
  &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:PlaylistService</id>
		<title>Av:Developer:Eriskay:PlaylistService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:PlaylistService"/>
				<updated>2015-12-15T13:22:59Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;= Playlist Service =  == Overview == The Playlist service provides access to a list of tracks, which can be played in sequence, starting at any point. ‘Shuffle’ and ‘Repeat...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Playlist Service =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Playlist service provides access to a list of tracks, which can be played in sequence, starting at any point. ‘Shuffle’ and ‘Repeat’ modes also exist, allowing track order to be randomised and playback to loop.&lt;br /&gt;
&lt;br /&gt;
If a device's [[Av:Developer:Eriskay:ProductService | Product]] service reports a source of type &amp;lt;tt&amp;gt;&amp;quot;Playlist&amp;quot;&amp;lt;/tt&amp;gt;, then that device is guaranteed to bear the Playlist service.  If the Playlist service is available, all its properties and actions must be fully implemented.&lt;br /&gt;
&lt;br /&gt;
== Evented Properties ==&lt;br /&gt;
=== Repeat ===&lt;br /&gt;
By default a playlist plays each track in sequence then stops after playing the final track. Setting the &amp;lt;tt&amp;gt;Repeat&amp;lt;/tt&amp;gt; property changes this behaviour to loop from the last track back to the first, playing it immediately.&lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;tt&amp;gt;Repeat&amp;lt;/tt&amp;gt; is off.&lt;br /&gt;
&lt;br /&gt;
=== Shuffle ===&lt;br /&gt;
Tracks are played in random order if the &amp;lt;tt&amp;gt;Shuffle&amp;lt;/tt&amp;gt; property is enabled.  As with normal playback, each track is played once then the playlist stops.  If &amp;lt;tt&amp;gt;Shuffle&amp;lt;/tt&amp;gt; is enabled mid-way through a playlist, each track in the list is shuffled, including any that have just been played. &lt;br /&gt;
&lt;br /&gt;
When combined with &amp;lt;tt&amp;gt;Repeat&amp;lt;/tt&amp;gt;, each track is played once before any track is played for a second time. &lt;br /&gt;
&lt;br /&gt;
By default, &amp;lt;tt&amp;gt;Shuffle&amp;lt;/tt&amp;gt; is off.&lt;br /&gt;
&lt;br /&gt;
=== Id ===&lt;br /&gt;
The id of the current track (the track currently playing or that would be played if the &amp;lt;tt&amp;gt;Transport.Play&amp;lt;/tt&amp;gt; action was invoked while this source was active). Or &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; if the playlist is empty.&lt;br /&gt;
&lt;br /&gt;
=== IdArray ===&lt;br /&gt;
A JSON integer array containing the ids of the tracks currently in the playlist.&lt;br /&gt;
&lt;br /&gt;
For example, &amp;lt;tt&amp;gt;[2, 276, 19]&amp;lt;/tt&amp;gt; describes a playlist containing track ids 2, 276, and 19 in that order.&lt;br /&gt;
&lt;br /&gt;
Contains &amp;lt;tt&amp;gt;[0..TracksMax]&amp;lt;/tt&amp;gt; elements.&lt;br /&gt;
&lt;br /&gt;
=== TracksMax ===&lt;br /&gt;
The maximum number of tracks a playlist can contain. Set on startup and invariant thereafter.&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
=== SetRepeat ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in bool repeat)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Enable or disable repeat mode.&lt;br /&gt;
&lt;br /&gt;
=== Repeat ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out bool repeat)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Report whether repeat mode is enabled.&lt;br /&gt;
&lt;br /&gt;
=== SetShuffle ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out bool shuffle)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Enable or disable shuffle mode.&lt;br /&gt;
&lt;br /&gt;
=== Shuffle ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in bool shuffle)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Report whether shuffle mode is enabled.&lt;br /&gt;
&lt;br /&gt;
=== Id ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint id)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
&lt;br /&gt;
=== ReadList ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string ids, out string json)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Given a space separated list of track ids, report their associated uri and metadata in the following JSON form:&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: integer_id,&lt;br /&gt;
            &amp;quot;uri&amp;quot;: &amp;quot;track_uri&amp;quot;,&lt;br /&gt;
            &amp;quot;metadata&amp;quot;: &amp;quot;track_metadata&amp;quot;&lt;br /&gt;
        },&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;id&amp;quot;: integer_id,&lt;br /&gt;
            &amp;quot;uri&amp;quot;: &amp;quot;track_uri&amp;quot;,&lt;br /&gt;
            &amp;quot;metadata&amp;quot;: &amp;quot;track_metadata&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
Any ids not in the playlist are ignored.&lt;br /&gt;
&lt;br /&gt;
=== Insert ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint afterId, in string uri, in string metadata, out uint newId)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Adds the given uri and metadata as a new track to the playlist. &lt;br /&gt;
&lt;br /&gt;
Set the &amp;lt;tt&amp;gt;AfterId&amp;lt;/tt&amp;gt; argument to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; to insert a track at the start of the playlist. &lt;br /&gt;
&lt;br /&gt;
Reports a &amp;lt;tt&amp;gt;800&amp;lt;/tt&amp;gt; fault code if &amp;lt;tt&amp;gt;AfterId&amp;lt;/tt&amp;gt; is not &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; and doesn’t appear in the playlist. &lt;br /&gt;
&amp;lt;br&amp;gt;Reports a &amp;lt;tt&amp;gt;801&amp;lt;/tt&amp;gt; fault code if the playlist is full (i.e. already contains &amp;lt;tt&amp;gt;TracksMax&amp;lt;/tt&amp;gt; tracks).&lt;br /&gt;
&lt;br /&gt;
=== DeleteList ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (int string ids)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Given a space separated list of track ids, remove the tracks with these ids from the playlist. &lt;br /&gt;
&lt;br /&gt;
If the id to be deleted is currently playing, the next track becomes current. &lt;br /&gt;
&lt;br /&gt;
Any ids not in the playlist are silently ignored.&lt;br /&gt;
&lt;br /&gt;
=== DeleteAll ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Delete all tracks from the playlist.&lt;br /&gt;
&lt;br /&gt;
== Move ==&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string ids, in uint afterId)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Move a space separated list of ids.&lt;br /&gt;
&lt;br /&gt;
Set &amp;lt;tt&amp;gt;AfterId&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; to move the tracks to the start of the playlist.&lt;br /&gt;
&lt;br /&gt;
Any ids not in the playlist are silently ignored.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;AfterId&amp;lt;/tt&amp;gt; must not also be in the list to be moved.&lt;br /&gt;
&lt;br /&gt;
=== TracksMax ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint max)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;TracksMax&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== IdArray ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint token, out string json)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt; property.  Supports polling implementations by returning a token which can be used with the &amp;lt;tt&amp;gt;IdArrayChanged&amp;lt;/tt&amp;gt; action.&lt;br /&gt;
&lt;br /&gt;
=== IdArrayChanged ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint token, out bool changed)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Check to see if &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt; has changed since gathering the specified token. This token must have been previously collected from the &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt; action. &lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for any basic control points unable to partake in standard eventing.&lt;br /&gt;
&lt;br /&gt;
== UPnP Service Description ==&lt;br /&gt;
For devices supporting the UPnP protocol, the service description is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;name: &amp;quot;Playlist&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;domain: &amp;quot;openhome.org.eriskay&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;version: &amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
  &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
  &amp;lt;actionList&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SetRepeat&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Repeat&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Repeat&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Repeat&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Repeat&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Repeat&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SetShuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Shuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Shuffle&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Shuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Shuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Shuffle&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Id&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;ReadList&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;IdList&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;IdList&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;TrackList&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;TrackList&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Insert&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;AfterId&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Id&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Uri&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;NewId&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Id&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Move&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;AfterId&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Id&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;IdList&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;IdList&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;DeleteList&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;IdList&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;IdList&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;DeleteAll&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;TracksMax&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;TracksMax&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;TracksMax&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;IdArray&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Token&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;IdArrayToken&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Array&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;IdArray&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;IdArrayChanged&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Token&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;IdArrayToken&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;IdArrayChanged&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
  &amp;lt;/actionList&amp;gt;&lt;br /&gt;
  &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Repeat&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Shuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;IdArray&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;TracksMax&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;IdList&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;TrackList&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;IdArrayToken&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;IdArrayChanged&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
  &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:ConfigurationService</id>
		<title>Av:Developer:Eriskay:ConfigurationService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:ConfigurationService"/>
				<updated>2015-12-15T13:18:03Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;= Configuration Service = == Overview == The Configuration service provides access to all user-configurable values on a product.  It is intended as a developer aid only - configu...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Configuration Service =&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Configuration service provides access to all user-configurable values on a product.  It is intended as a developer aid only - configuration UIs should use the web app framework instead.&lt;br /&gt;
&lt;br /&gt;
If a device's [[Av:Developer:Eriskay:DeviceService | Device]] service to reports the attribute &amp;lt;tt&amp;gt;openhome.org.configuration&amp;lt;/tt&amp;gt; in its &amp;lt;tt&amp;gt;version&amp;lt;/tt&amp;gt; section, that device is guaranteed to bear the Configuration service.  If the Configuration service is available, all its properties and actions must be fully implemented.&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
=== GetKeys ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string keys)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read a JSON list of all configuration items for the product.&lt;br /&gt;
&lt;br /&gt;
=== SetValue ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string key, in string value)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Update the value of a configuration item.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;800&amp;lt;/tt&amp;gt; fault code if the specified key does not match a configuration item.&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a &amp;lt;tt&amp;gt;801&amp;lt;/tt&amp;gt; fault code if the configuration item has integer type but the specified value is not a number.&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a &amp;lt;tt&amp;gt;802&amp;lt;/tt&amp;gt; fault code if the configuration item has integer type but the specified value is outside the permitted range.&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a &amp;lt;tt&amp;gt;803&amp;lt;/tt&amp;gt; fault code if the configuration item has a list of allowed values and the specified value is not in this allowed list.&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a &amp;lt;tt&amp;gt;804&amp;lt;/tt&amp;gt; fault code if the specified value is longer than the maximum storage available for the configuration item.&lt;br /&gt;
&lt;br /&gt;
=== GetValue ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string key, out string value)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read the value of a configuration item.&lt;br /&gt;
&amp;lt;br&amp;gt;The return value is always text; the caller is responsible for converting this to an integer if necessary.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;800&amp;lt;/tt&amp;gt; fault code if the specified key does not match a configuration item.&lt;br /&gt;
&lt;br /&gt;
== UPnP Service Description ==&lt;br /&gt;
For devices supporting the UPnP protocol, the service description is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;name: &amp;quot;Configuration&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;domain: &amp;quot;openhome.org.eriskay&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;version: &amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
  &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
  &amp;lt;actionList&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GetKeys&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;KeyList&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SetValue&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Key&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GetValue&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Key&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
  &amp;lt;/actionList&amp;gt;&lt;br /&gt;
  &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;A_ARG_TYPE_String&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
  &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:SenderService</id>
		<title>Av:Developer:Eriskay:SenderService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:SenderService"/>
				<updated>2015-12-15T13:15:44Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;= Sender Service = == Overview == The Sender service indicates the presence of a Songcast sender and provides information concerning that sender.  A Songcast sender broadcasts mu...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Sender Service =&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Sender service indicates the presence of a Songcast sender and provides information concerning that sender.&lt;br /&gt;
&lt;br /&gt;
A Songcast sender broadcasts music on a network in a way that is playable by a Songcast [[Av:Developer:Eriskay:ReceiverService | receiver]].&lt;br /&gt;
&lt;br /&gt;
If a device's [[Av:Developer:Eriskay:ProductService | Product]] service reports an attribute &amp;lt;tt&amp;gt;&amp;quot;Sender&amp;quot;&amp;lt;/tt&amp;gt;, then that device is guaranteed to bear the Sender service.  Alternatively, Songcast senders can be discovered independently of the Product service by checking for the &amp;lt;tt&amp;gt;openhome.org.sender&amp;lt;/tt&amp;gt; attribute on the [[Av:Developer:Eriskay:DeviceService | Device]] service. &lt;br /&gt;
&lt;br /&gt;
If the Sender service is available, all its properties and actions must be fully implemented.&lt;br /&gt;
&lt;br /&gt;
== Evented Properties ==&lt;br /&gt;
=== Audio ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if audio is currently available from this Sender; &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
Provides basic information about the sender in OpenHome Metadata format.&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        &amp;quot;Title&amp;quot;   : &amp;quot;[sender name]&amp;quot;,&lt;br /&gt;
        &amp;quot;Origin&amp;quot;  : &amp;quot;openhome.org.sender&amp;quot;,&lt;br /&gt;
        &amp;quot;Uri&amp;quot;     : &amp;quot;[ohz uri.  ohu/ohm if ohz is not supported]&amp;quot;,&lt;br /&gt;
        &amp;quot;Artwork&amp;quot; : &amp;quot;[uri to icon for sender]&amp;quot;,&lt;br /&gt;
        &amp;quot;Channel&amp;quot; : &amp;quot;Songcast&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Status ===&lt;br /&gt;
Reports the status of the sender:&lt;br /&gt;
* &amp;lt;tt&amp;gt;Enabled&amp;lt;/tt&amp;gt; - sender enabled by user configuration (default)&lt;br /&gt;
* &amp;lt;tt&amp;gt;Disabled&amp;lt;/tt&amp;gt; - sender disabled by user configuration&lt;br /&gt;
* &amp;lt;tt&amp;gt;Blocked&amp;lt;/tt&amp;gt; - audio from another sender detected on the same channel (mis-configuration)&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
=== Audio ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out bool audio)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Audio&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== Metadata ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string metadata)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Metadata&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== Status ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string status)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Status&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
== UPnP Service Description ==&lt;br /&gt;
For devices supporting the UPnP protocol, the service description is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;name: &amp;quot;Sender&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;domain: &amp;quot;openhome.org.eriskay&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;version: &amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
  &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;actionList&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Audio&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Audio&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Status&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Status&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
  &amp;lt;/actionList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Audio&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Status&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
      &amp;lt;allowedValueList&amp;gt;&lt;br /&gt;
        &amp;lt;allowedValue&amp;gt;Enabled&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
        &amp;lt;allowedValue&amp;gt;Disabled&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
        &amp;lt;allowedValue&amp;gt;Blocked&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
      &amp;lt;/allowedValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
  &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:CredentialsService</id>
		<title>Av:Developer:Eriskay:CredentialsService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:CredentialsService"/>
				<updated>2015-12-15T13:09:24Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;= Credentials Service = == Overview == The Credentials service provides access to username, password and current status of all remote services that require unique logins.  If a d...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Credentials Service =&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Credentials service provides access to username, password and current status of all remote services that require unique logins.&lt;br /&gt;
&lt;br /&gt;
If a device's [[Av:Developer:Eriskay:ProductService | Product]] service reports an attribute &amp;lt;tt&amp;gt;&amp;quot;Credentials&amp;quot;&amp;lt;/tt&amp;gt;, then that device is guaranteed to bear the Credentials service.  If the Credentials service is available, all its properties and actions must be fully implemented.&lt;br /&gt;
&lt;br /&gt;
== Evented Properties ==&lt;br /&gt;
=== Ids ===&lt;br /&gt;
Space separated list of identifiers for services whose credentials can be set.&lt;br /&gt;
&amp;lt;br&amp;gt;Set on startup; does not change at runtime.&lt;br /&gt;
&lt;br /&gt;
=== PublicKey ===&lt;br /&gt;
RSA public key that must be used to encrypt any/all passwords.&lt;br /&gt;
&lt;br /&gt;
When encrypting ensure PKCS1 OAEP padding is used.&lt;br /&gt;
&lt;br /&gt;
May be blank on startup; will not vary once set.  With the exception of the &amp;lt;tt&amp;gt;Ids&amp;lt;/tt&amp;gt; state variable, the rest of the service cannot usefully be used before this is set.&lt;br /&gt;
&lt;br /&gt;
=== SequenceNumber ===&lt;br /&gt;
Increases whenever any aspect of state for any user of credentials listed in &amp;lt;tt&amp;gt;Ids&amp;lt;/tt&amp;gt; changes.  The client is responsible for polling each Id they are interested in to determine what has changed.&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
=== Set ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string id, in string username, in string password)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Set the username and password for a given service.  The password must be encrypted using the RSA public key in the &amp;lt;tt&amp;gt;PublicKey&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
&amp;lt;br&amp;gt;Calling this action automatically enables the service.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that some processing may happen asynchronously.  If any of username, password or enabled states are changed for the service, &amp;lt;tt&amp;gt;SequenceNumber&amp;lt;/tt&amp;gt; will automatically change.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;800&amp;lt;/tt&amp;gt; fault code if the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; argument is invalid.&lt;br /&gt;
&lt;br /&gt;
=== Clear ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string id)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Remove both username and password for a given service.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that some processing may happen asynchronously.  If any of username, password or enabled states are changed for the service, &amp;lt;tt&amp;gt;SequenceNumber&amp;lt;/tt&amp;gt; will automatically change.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;800&amp;lt;/tt&amp;gt; fault code if the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; argument is invalid.&lt;br /&gt;
&lt;br /&gt;
=== SetEnabled ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string id, in bool enabled&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Set or clear the &amp;lt;tt&amp;gt;Enabled&amp;lt;/tt&amp;gt; state of a service.  Disabling a service temporarily prevents its use by a device but allows the device to retain the username/password for later use (if the service is re-enabled by calling &amp;lt;tt&amp;gt;SetEnabled()&amp;lt;/tt&amp;gt; again).&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;800&amp;lt;/tt&amp;gt; fault code if the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; argument is invalid.&lt;br /&gt;
&lt;br /&gt;
=== Get ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string id, out string username, out string encPassword, out bool enabled, out string status, out string data)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Retrieve username, password, status and enabled state for a service.&lt;br /&gt;
&lt;br /&gt;
Username, password and enabled will only change in response to invocations of the Credentials service.  The password is encrypted so is not suitable for user display.  Clients can infer whether a password has been set by checking whether the value returned has non-zero length.&lt;br /&gt;
&lt;br /&gt;
Status may change in response to runtime events.  e.g. If an account expires, the status may change to include the error returned by the remote service provider.  Status is only set for error cases - a blank status indicates that a service is functioning correctly.  The exact format of status content varies between services.&lt;br /&gt;
&lt;br /&gt;
Data contains any other service-specific information.  The format of content varies between services.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;800&amp;lt;/tt&amp;gt; fault code if the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; argument is invalid.&lt;br /&gt;
&lt;br /&gt;
=== Login ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string id, out string token)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read a token indicating that a registered user has logged in to a remote service.  This allows control points to access data that is specific to a certain user account without requiring access to the (sensitive) password for that account.  The data returned may vary between credential-consuming services; the control point is responsible for knowing how to interpret it.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;800&amp;lt;/tt&amp;gt; fault code if the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; argument is invalid.&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a &amp;lt;tt&amp;gt;801&amp;lt;/tt&amp;gt; fault code if the login was attempted but failed.&lt;br /&gt;
&lt;br /&gt;
=== Relogin ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string id, in string currentToken, out string newToken)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Refresh an existing token returned from &amp;lt;tt&amp;gt;Login()&amp;lt;/tt&amp;gt;.  This should only be called after the remote service has indicated that the current token has expired and is no longer valid.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;800&amp;lt;/tt&amp;gt; fault code if the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; argument is invalid.&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a &amp;lt;tt&amp;gt;801&amp;lt;/tt&amp;gt; fault code if a new login was attempted but failed.&lt;br /&gt;
&lt;br /&gt;
=== GetIds ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string ids)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read the value of the &amp;lt;tt&amp;gt;Ids&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== GetPublicKey ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string key)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read the value of the &amp;lt;tt&amp;gt;PublicKey&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== GetSequenceNumber ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint seq)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read the value of the &amp;lt;tt&amp;gt;SequenceNumber&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
== UPnP Service Description ==&lt;br /&gt;
For devices supporting the UPnP protocol, the service description is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;name: &amp;quot;Credentials&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;domain: &amp;quot;openhome.org.eriskay&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;version: &amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
  &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
  &amp;lt;actionList&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Set&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;UserName&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Password&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Binary&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Clear&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SetEnabled&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Enabled&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Bool&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Get&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;UserName&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Password&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Binary&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Enabled&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Bool&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Status&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Data&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Login&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Token&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Relogin&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;CurrentToken&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;NewToken&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GetIds&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Ids&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Ids&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GetPublicKey&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;PublicKey&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;PublicKey&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;GetSequenceNumber&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;SequenceNumber&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;SequenceNumber&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
  &amp;lt;/actionList&amp;gt;&lt;br /&gt;
  &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Ids&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;PublicKey&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SequenceNumber&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;A_ARG_TYPE_String&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;A_ARG_TYPE_Binary&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;bin.base64&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;A_ARG_TYPE_Bool&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
  &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:VolumeService</id>
		<title>Av:Developer:Eriskay:VolumeService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:VolumeService"/>
				<updated>2015-12-15T13:00:03Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;= Volume Service = == Overview == The Volume service provides a means of controlling various settings which affect the product's volume (signal amplitude) measured at the output ...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Volume Service =&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Volume service provides a means of controlling various settings which affect the product's volume (signal amplitude) measured at the output channels.  A product may have one or more output channels. Balance or Fade settings may result in different volumes at each output.  In the Mute state, all output channels are reduced to zero volume. &lt;br /&gt;
&lt;br /&gt;
If a device's [[Av:Developer:Eriskay:ProductService | Product]] service reports an attribute &amp;lt;tt&amp;gt;&amp;quot;Volume&amp;quot;&amp;lt;/tt&amp;gt;, then that device is guaranteed to bear the Volume service.  If the Volume service is available, all its properties and actions must be fully implemented.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Volume&amp;lt;/tt&amp;gt; is an adjustable setting that controls the loudness of the audio at the output channels of the product.  It can be set to an absolute value or incremented/decremented in single steps of integrator-defined size.  The maximum &amp;lt;tt&amp;gt;Volume&amp;lt;/tt&amp;gt; setting is defined by the current value of &amp;lt;tt&amp;gt;VolumeLimit&amp;lt;/tt&amp;gt;.  The minimum Volume setting is always zero.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Balance&amp;lt;/tt&amp;gt; is an adjustable setting that specifies the bias in volume between  left and right output channels.  A setting of zero results in neutral balance (i.e. no bias applied) between left and right output channels.  Negative values amplify left and attenuate right output channels.  Conversely, positive values attenuate left and amplify right output channels.  Increasing absolute values result in progressively larger amplification/attenuation being applied to output channels in this asymmetric manner.  At or near the maximum settings, the attenuated channels may ended up being effectively reduced to volume zero.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;Fade&amp;lt;/tt&amp;gt; is an adjustable setting that specifies the bias in volume between the front and rear output channels.&lt;br /&gt;
&lt;br /&gt;
== Evented Properties ==&lt;br /&gt;
=== Volume ===&lt;br /&gt;
The current user volume setting, i.e. an integer value in the range &amp;lt;tt&amp;gt;[0..VolumeLimit]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Mute ===&lt;br /&gt;
A boolean setting indicating whether all output channels are currently forced to zero volume.&lt;br /&gt;
&lt;br /&gt;
Note that (un)muting a product has no effect on its &amp;lt;tt&amp;gt;TransportState&amp;lt;/tt&amp;gt; or it's ability to send audio to other rooms.&lt;br /&gt;
&lt;br /&gt;
=== VolumeLimit ===&lt;br /&gt;
User-imposed (soft) maximum volume setting.  Must be in the range &amp;lt;tt&amp;gt;[0..VolumeMax]&amp;lt;/tt&amp;gt;; other values will be ignored.&lt;br /&gt;
&lt;br /&gt;
=== VolumeMax ===&lt;br /&gt;
System-imposed (hard) maximum volume setting.  Must be exactly divisible by &amp;lt;tt&amp;gt;VolumeSteps&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== VolumeUnity ===&lt;br /&gt;
System-specific volume setting that results in the input signal amplitude equalling the output signal amplitude (0dB gain), i.e. an integer in the range &amp;lt;tt&amp;gt;[0..VolumeMax]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Values in the range &amp;lt;tt&amp;gt;[0..VolumeUnity)&amp;lt;/tt&amp;gt; will be attenuated.  Values in the range &amp;lt;tt&amp;gt;(VolumeUnity..VolumeLimit]&amp;lt;/tt&amp;gt; will be amplified.&lt;br /&gt;
&lt;br /&gt;
=== VolumeSteps ===&lt;br /&gt;
System-specific number of user-visible volume steps that would increase the volume from zero to &amp;lt;tt&amp;gt;VolumeMax&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== UnityGain ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if the active source as reported by the [&amp;quot;ProductServiceEriskay&amp;quot; Product] service is already volume controlled; &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
Changes to &amp;lt;tt&amp;gt;Volume&amp;lt;/tt&amp;gt; will be accepted while &amp;lt;tt&amp;gt;UnityGain&amp;lt;/tt&amp;gt; is enabled but will have no immediate effect.&lt;br /&gt;
&lt;br /&gt;
=== Balance ===&lt;br /&gt;
Current setting of bias between left and right output channels, i.e. an integer value in the range &amp;lt;tt&amp;gt;[-BalanceMax..+BalanceMax]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Negative values amplify left and attenuate right output channels.  Conversely, positive values attenuate left and amplify right output channels.&lt;br /&gt;
&lt;br /&gt;
A value of zero specifies no bias.&lt;br /&gt;
&lt;br /&gt;
=== BalanceMax ===&lt;br /&gt;
System-specific balance value for maximum bias between left and right channels.&lt;br /&gt;
&lt;br /&gt;
=== Fade ===&lt;br /&gt;
Current setting of bias between front and back output channels, i.e. an integer value in the range &amp;lt;tt&amp;gt;[-FadeMax..+FadeMax]&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A value of zero specifies no bias.&lt;br /&gt;
&lt;br /&gt;
=== FadeMax ===&lt;br /&gt;
System-specific fade value for maximum bias between front and rear between channels.&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
=== Characteristics ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint volMax, out uint volUnity, out uint volSteps, out uint balanceMax, out uint fadeMax)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the values of the system-specified properties which do not change at run-time - &amp;lt;tt&amp;gt;VolumeMax&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;VolumeUnity&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;VolumeSteps&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;BalanceMax&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;FadeMax&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Volume ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint volume)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the current value of the &amp;lt;tt&amp;gt;Volume&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== SetVolume ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint volume)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Set the &amp;lt;tt&amp;gt;Volume&amp;lt;/tt&amp;gt; property to an absolute value.&lt;br /&gt;
&lt;br /&gt;
Any attempt to set a value above the &amp;lt;tt&amp;gt;VolumeLimit&amp;lt;/tt&amp;gt; must reset &amp;lt;tt&amp;gt;Volume&amp;lt;/tt&amp;gt; to &amp;lt;tt&amp;gt;VolumeLimit&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== VolumeInc ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Increase &amp;lt;tt&amp;gt;Volume&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;VolumeMax / VolumeSteps&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Volume Dec ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Decrease &amp;lt;tt&amp;gt;Volume&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;VolumeMax / VolumeSteps&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== VolumeLimit ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint limit)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;VolumeLimit&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== UnityGain ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint unityGain)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;UnityGain&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== Balance ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out int balance)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Balance&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== SetBalance ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in int balance)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Set the &amp;lt;tt&amp;gt;Balance&amp;lt;/tt&amp;gt; property to an absolute value.&lt;br /&gt;
&lt;br /&gt;
=== BalanceInc===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Increase &amp;lt;tt&amp;gt;Balance&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== BalanceDec ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Decrease &amp;lt;tt&amp;gt;Balance&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Fade ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out int fade)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Fade&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== SetFade ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in int fade)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Set the &amp;lt;tt&amp;gt;Fade&amp;lt;/tt&amp;gt; property to an absolute value.&lt;br /&gt;
&lt;br /&gt;
=== FadeInc ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Increase &amp;lt;tt&amp;gt;Fade&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== FadeDec ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Decrease &amp;lt;tt&amp;gt;Fade&amp;lt;/tt&amp;gt; by &amp;lt;tt&amp;gt;1&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Mute ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out bool mute)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Mute&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== SetMute(in bool mute) ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in bool mute)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Set the &amp;lt;tt&amp;gt;Mute&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
== UPnP Service Description ==&lt;br /&gt;
For devices supporting the UPnP protocol, the service description is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;name: &amp;quot;Volume&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;domain: &amp;quot;openhome.org.eriskay&amp;quot; &lt;br /&gt;
&amp;lt;br&amp;gt;version: &amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
  &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
  &amp;lt;actionList&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Characteristics&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;VolumeMax&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;VolumeMax&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;VolumeUnity&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;VolumeUnity&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;VolumeSteps&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;VolumeSteps&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;BalanceMax&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;BalanceMax&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;FadeMax&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;FadeMax&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SetVolume&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Volume&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;VolumeInc&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;VolumeDec&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Volume&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Volume&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SetBalance&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Balance&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;BalanceInc&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;BalanceDec&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Balance&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Balance&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SetFade&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Fade&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;FadeInc&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;FadeDec&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Fade&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Fade&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SetMute&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Mute&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Mute&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Mute&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;VolumeLimit&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;VolumeLimit&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;UnityGain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;UnityGain&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
  &amp;lt;/actionList&amp;gt;&lt;br /&gt;
  &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Volume&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Mute&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Balance&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;i4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Fade&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;i4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;VolumeLimit&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;VolumeMax&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;VolumeUnity&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;VolumeSteps&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;UnityGain&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;BalanceMax&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;FadeMax&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
  &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:TimeService</id>
		<title>Av:Developer:Eriskay:TimeService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:TimeService"/>
				<updated>2015-12-15T12:15:50Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;= Time Service = == Overview == The Time service reports the duration of the currently playing track and the number of seconds played so far.  It also maintains a count of the to...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Time Service =&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Time service reports the duration of the currently playing track and the number of seconds played so far.  It also maintains a count of the total number of tracks played.&lt;br /&gt;
&lt;br /&gt;
If a device's [[Av:Developer:Eriskay:ProductService | Product]] service reports an attribute &amp;lt;tt&amp;gt;&amp;quot;Time&amp;quot;&amp;lt;/tt&amp;gt;, then that device is guaranteed to bear the Time service.&lt;br /&gt;
&lt;br /&gt;
This service is intentionally separated from the [[Av:Developer:Eriskay:TransportService | Transport]] service. When a track is being played, &amp;lt;tt&amp;gt;Time&amp;lt;/tt&amp;gt; delivers an event every second, which can overwhelm some primitive control points. Keeping &amp;lt;tt&amp;gt;Time&amp;lt;/tt&amp;gt; separate from the [&amp;quot;TransportServiceEriskay&amp;quot; Transport] service allows control points to decide whether to subscribe to it independently.&lt;br /&gt;
&lt;br /&gt;
== Evented Properties ==&lt;br /&gt;
=== Track Count ===&lt;br /&gt;
The number of tracks that have been played, including any currently playing one.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;TrackCount&amp;lt;/tt&amp;gt; corresponds with the &amp;lt;tt&amp;gt;TrackCount&amp;lt;/tt&amp;gt; property reported by the [&amp;quot;TransportServiceEriskay&amp;quot; Transport] service, but bears no relation to a track or preset &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; properties reported from the [&amp;quot;PlaylistServiceEriskay&amp;quot; Playlist] or [&amp;quot;RadioServiceEriskay&amp;quot; Radio] services.&lt;br /&gt;
&lt;br /&gt;
=== Duration ===&lt;br /&gt;
The total length of the current track in seconds.  Zero for live streams.&lt;br /&gt;
&lt;br /&gt;
=== Seconds ===&lt;br /&gt;
The total length of time in seconds for which the current track has been playing.&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
=== Time ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;TrackCount&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Duration&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;Seconds&amp;lt;/tt&amp;gt; properties.&lt;br /&gt;
&lt;br /&gt;
== UPnP Service Description ==&lt;br /&gt;
For devices supporting the UPnP protocol, the service description is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;name: &amp;quot;Time&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;domain: &amp;quot;openhome.org.eriskay&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;version: &amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
  &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
  &amp;lt;actionList&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Time&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;TrackCount&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;TrackCount&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Duration&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Duration&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Seconds&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Seconds&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
  &amp;lt;/actionList&amp;gt;&lt;br /&gt;
  &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;TrackCount&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Duration&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Seconds&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
  &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:ProductService</id>
		<title>Av:Developer:Eriskay:ProductService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:ProductService"/>
				<updated>2015-12-15T12:10:15Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: /* UPnP Service Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Product Service =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Product service contains a summary of a single product’s capabilities.  After using the [[Av:Developer:Eriskay:DeviceService | Device]] service to confirm both compatibility and the presence of the &amp;lt;tt&amp;gt;openhome.org.product&amp;lt;/tt&amp;gt; attribute, control points should begin their interaction with an OpenHome device by using the Product service.  Presence of various other services can be inferred from the sources and attributes this reports.&lt;br /&gt;
&lt;br /&gt;
If the Product service is available, all its properties and actions must be fully implemented.&lt;br /&gt;
&lt;br /&gt;
== Evented Properties ==&lt;br /&gt;
=== SourceArray ===&lt;br /&gt;
Returns a summary of all sources as a JSON array:&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
    [&lt;br /&gt;
        {&lt;br /&gt;
            &amp;quot;name&amp;quot;: &amp;quot;user name for source&amp;quot;&lt;br /&gt;
            &amp;quot;type&amp;quot;: &amp;quot;type of source&amp;quot;&lt;br /&gt;
            &amp;quot;visible&amp;quot;: &amp;quot;Boolean.  Whether control points should display source&amp;quot;&lt;br /&gt;
            &amp;quot;systemName&amp;quot;: &amp;quot;default name for source&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
    ]&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
Source &amp;lt;tt&amp;gt;type&amp;lt;/tt&amp;gt; may have any implementation-defined value.  The following values have a commonly understood meaning:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;Playlist&amp;lt;/tt&amp;gt; - the &amp;lt;tt&amp;gt;openhome.org.eriskay:Playlist:1&amp;lt;/tt&amp;gt; service must be available&lt;br /&gt;
* &amp;lt;tt&amp;gt;Radio&amp;lt;/tt&amp;gt; - the &amp;lt;tt&amp;gt;openhome.org.eriskay:Radio:1&amp;lt;/tt&amp;gt; service must be available&lt;br /&gt;
* &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt; - the &amp;lt;tt&amp;gt;openhome.org.eriskay:Receiver:1&amp;lt;/tt&amp;gt; service must be available&lt;br /&gt;
* &amp;lt;tt&amp;gt;UpnpAv&amp;lt;/tt&amp;gt; - the &amp;lt;tt&amp;gt;upnp.org:MediaRenderer:1&amp;lt;/tt&amp;gt; device must be available&lt;br /&gt;
* &amp;lt;tt&amp;gt;Single&amp;lt;/tt&amp;gt; - software source that plays a single track&lt;br /&gt;
* &amp;lt;tt&amp;gt;NetAux&amp;lt;/tt&amp;gt; - Specifies 3rd party, non OpenHome controllable, network protocols such as AirPlay&lt;br /&gt;
* &amp;lt;tt&amp;gt;Analog&amp;lt;/tt&amp;gt; - Specifies an analog external input&lt;br /&gt;
* &amp;lt;tt&amp;gt;Digital&amp;lt;/tt&amp;gt; - Specifies a digital external input&lt;br /&gt;
* &amp;lt;tt&amp;gt;Hdmi&amp;lt;/tt&amp;gt; - Specifies a HDMI external input&lt;br /&gt;
&lt;br /&gt;
Other implementation-defined values are possible.  Control points that have not been developed to support them should treat such sources as comparable to external inputs.&lt;br /&gt;
&lt;br /&gt;
Each &amp;lt;tt&amp;gt;systemName&amp;lt;/tt&amp;gt; is guaranteed to be unique within the array.&lt;br /&gt;
&lt;br /&gt;
=== SourceSystemName ===&lt;br /&gt;
The &amp;lt;tt&amp;gt;systemName&amp;lt;/tt&amp;gt; of the currently active source.&lt;br /&gt;
&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Space delimited set of values. Each value guarantees the availability of a service or resource, saving a control point from searching for each of these in turn. Supported values for attributes include&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;Transport&amp;lt;/tt&amp;gt; – the &amp;lt;tt&amp;gt;openhome.org.eriskay:Transport:1&amp;lt;/tt&amp;gt; service must be available&lt;br /&gt;
* &amp;lt;tt&amp;gt;Time&amp;lt;/tt&amp;gt; – the &amp;lt;tt&amp;gt;openhome.org.eriskay:Time:1&amp;lt;/tt&amp;gt; service must be available&lt;br /&gt;
* &amp;lt;tt&amp;gt;Volume&amp;lt;/tt&amp;gt; – the &amp;lt;tt&amp;gt;openhome.org.eriskay:Volume:1&amp;lt;/tt&amp;gt; service must be available&lt;br /&gt;
* &amp;lt;tt&amp;gt;Sender&amp;lt;/tt&amp;gt; - the &amp;lt;tt&amp;gt;openhome.org.eriskay:Sender:1&amp;lt;/tt&amp;gt; service must be available&lt;br /&gt;
* &amp;lt;tt&amp;gt;Credentials&amp;lt;/tt&amp;gt; - the &amp;lt;tt&amp;gt;openhome.org.eriskay:Credentials:1&amp;lt;/tt&amp;gt; service must be available&lt;br /&gt;
&lt;br /&gt;
=== Name ===&lt;br /&gt;
User-visible product name. By default this is set to the model name as reported by the Device service. &lt;br /&gt;
Note that the UPnP friendly name is derived by combining this with Room name in the form &amp;lt;tt&amp;gt;Room : Name&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== Room ===&lt;br /&gt;
The name of the room where the Product is located.  &amp;lt;tt&amp;gt;Room&amp;lt;/tt&amp;gt; is used to group the Product with other related Products in the same physical room (e.g. a source with a pre-amp). Products which are physically linked must always share the same &amp;lt;tt&amp;gt;Room&amp;lt;/tt&amp;gt; name.&lt;br /&gt;
&lt;br /&gt;
=== Home ===&lt;br /&gt;
User-visible name for a home (a collection of rooms).  Reserved for future use.&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
=== SourceArray ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string array)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;SourceArray&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== SourceArrayChangeCount ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint count)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Query how often the &amp;lt;tt&amp;gt;SourceArray&amp;lt;/tt&amp;gt; property has been updated. This action can be polled by clients that don’t support eventing. Whenever the value returned increases, &amp;lt;tt&amp;gt;SourceArray&amp;lt;/tt&amp;gt; has been updated so should be queried again.&lt;br /&gt;
&lt;br /&gt;
=== SourceSystemName ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string systemName)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;SourceSystemName&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== SetSource ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string systemName)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Set the currently active source to the one with the specified system name.&lt;br /&gt;
&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string attributes)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== Names ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string room, out string name, out string home)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;Room&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;Home&amp;lt;/tt&amp;gt; properties.&lt;br /&gt;
&lt;br /&gt;
== UPnP Service Description ==&lt;br /&gt;
For devices supporting the UPnP protocol, the service description is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;name: &amp;quot;Product&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;domain: &amp;quot;openhome.org.eriskay&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;version: &amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
  &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
  &amp;lt;actionList&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Names&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Room&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Room&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Name&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Name&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Home&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Home&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SourceArray&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Array&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;SourceArray&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SetSource&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Index&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;SourceSystemName&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Attributes&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Attributes&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Attributes&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SourceSystemName&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;SourceSystemName&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Attributes&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SourceArrayChangeCount&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Count&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;SourceArrayChangeCount&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
  &amp;lt;/actionList&amp;gt;&lt;br /&gt;
  &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Room&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Name&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Home&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SourceSystemName&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SourceArray&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Attributes&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SourceArrayChangeCount&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
  &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:Eriskay:TransportService</id>
		<title>Av:Developer:Eriskay:TransportService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:Eriskay:TransportService"/>
				<updated>2015-12-14T18:05:32Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: /* UPnP Service Description */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Transport Service =&lt;br /&gt;
== Overview ==&lt;br /&gt;
The Transport service provides both source-independent control of play, pause, stop, skip and seek and information concerning the currently playing media.&lt;br /&gt;
&lt;br /&gt;
Summary information is provided in a number of levels, each of which have a URI and metadata in OpenHome Metadata format.  E.g. A (notional) internet radio service that broadcast information about the currently playing track may have a level describing the radio station then another level describing the track.  Control points with limited screen estate may choose to display the most derived level(s) of metadata that are available.&lt;br /&gt;
&lt;br /&gt;
In addition to a hierarchy of metadata, detailed information such as bit-rate, sample-rate, bit-depth is available describing what is currently playing.&lt;br /&gt;
&lt;br /&gt;
If a device's [[Av:Developer:Eriskay:ProductService | Product]] service reports an attribute &amp;lt;tt&amp;gt;&amp;quot;Transport&amp;quot;&amp;lt;/tt&amp;gt;, 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.&lt;br /&gt;
&lt;br /&gt;
== Evented Properties ==&lt;br /&gt;
=== Modes ===&lt;br /&gt;
Space separated list of available modes.&lt;br /&gt;
&lt;br /&gt;
=== LevelCount ===&lt;br /&gt;
The number of levels of information (uri / metadata) provided by this device.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== Mode ===&lt;br /&gt;
The currently active mode&lt;br /&gt;
&lt;br /&gt;
=== SequenceNumbers ===&lt;br /&gt;
A space-separated list of integers that change when their associated uri and/or metadata are updated.  A value of &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; implies that both the associated uri and metadata are empty.&lt;br /&gt;
&lt;br /&gt;
=== StreamCount ===&lt;br /&gt;
Changes when each new stream is played.&lt;br /&gt;
&lt;br /&gt;
Indicates a change in one or more stream encoding parameters (&amp;lt;tt&amp;gt;Duration&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Seekable&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Pausable&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;BitRate&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;BitDepth&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;SampleRate&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Lossless&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;CodecName&amp;lt;/tt&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
A value of &amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt; can be assumed to imply empty/&amp;lt;tt&amp;gt;0&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; values for all stream-specific data.&lt;br /&gt;
&lt;br /&gt;
=== MetatextCount ===&lt;br /&gt;
Changes whenever metatext changes.&lt;br /&gt;
&lt;br /&gt;
=== NextAvailable ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if the &amp;lt;tt&amp;gt;Next&amp;lt;/tt&amp;gt; (skip forwards) action is currently available; &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
This will only change when &amp;lt;tt&amp;gt;Mode&amp;lt;/tt&amp;gt; changes.  A mode that is sometimes capable of changing stream as a consequence of &amp;lt;tt&amp;gt;Next&amp;lt;/tt&amp;gt; will always report &amp;lt;tt&amp;gt;NextAvailable&amp;lt;/tt&amp;gt; as &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== PrevAvailable ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if the &amp;lt;tt&amp;gt;Prev&amp;lt;/tt&amp;gt; (skip backwards) action is currently available; &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
This will only change when &amp;lt;tt&amp;gt;Mode&amp;lt;/tt&amp;gt; changes.  A mode that is sometimes capable of changing stream as a consequence of &amp;lt;tt&amp;gt;Prev&amp;lt;/tt&amp;gt; will always report &amp;lt;tt&amp;gt;PrevAvailable&amp;lt;/tt&amp;gt; as &amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== StreamId ===&lt;br /&gt;
Integer id, uniquely identifying the current stream.&lt;br /&gt;
&lt;br /&gt;
=== Duration ===&lt;br /&gt;
The length of the currently playing stream in seconds.&lt;br /&gt;
&lt;br /&gt;
=== Seekable ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if the &amp;lt;tt&amp;gt;SeekSecondsAbsolute&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;SeekSecondsRelative&amp;lt;/tt&amp;gt; actions are available for the current stream; &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
=== Pausable ===&lt;br /&gt;
&amp;lt;tt&amp;gt;true&amp;lt;/tt&amp;gt; if the stream can be paused (so is not being played at a rate determined by a remote sender); &amp;lt;tt&amp;gt;false&amp;lt;/tt&amp;gt; otherwise.&lt;br /&gt;
&lt;br /&gt;
=== BitRate ===&lt;br /&gt;
Dataflow rate in bits per second of the currently playing stream in its encoded representation.&lt;br /&gt;
&lt;br /&gt;
=== BitDepth ===&lt;br /&gt;
Sample (data) resolution in bits per channel sample of the currently playing stream.&lt;br /&gt;
&lt;br /&gt;
=== SampleRate ===&lt;br /&gt;
Time resolution of samples per second in kHz of the currently playing stream.&lt;br /&gt;
&lt;br /&gt;
=== Lossless ===&lt;br /&gt;
Indication of whether the currently playing stream can be decoded (decompressed) to a bit-accurate representation of the original audio data (lossless) or merely to a good approximation (lossy encoding).&lt;br /&gt;
&lt;br /&gt;
=== CodecName ===&lt;br /&gt;
Shorthand name for the audio encoding and container format used to represent the currently playing stream (e.g. AAC).&lt;br /&gt;
&lt;br /&gt;
=== Metatext ===&lt;br /&gt;
Additional textual information (if any) associated with the currently playing stream.&lt;br /&gt;
&lt;br /&gt;
=== TransportState ===&lt;br /&gt;
One of&lt;br /&gt;
* &amp;lt;tt&amp;gt;Playing&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Paused&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Stopped&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Buffering&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Waiting&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Actions ==&lt;br /&gt;
=== PlayAs ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in string mode, in string command)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
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 [[Av:Developer:Eriskay:TransportPlayAsCommands | modes and commands]] are documented separately.&lt;br /&gt;
&lt;br /&gt;
=== Play ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Start a pending stream playing.&lt;br /&gt;
&lt;br /&gt;
A stream must be ready to play. Possibly via calls to another network service.&lt;br /&gt;
&lt;br /&gt;
Behaviour when a stream is already playing varies depending on the active modes (source).&lt;br /&gt;
&lt;br /&gt;
=== Pause ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Pause the current stream.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;801&amp;lt;/tt&amp;gt; fault code if the current channel does not support being paused (is being played at a rate determined by a remote sender).&lt;br /&gt;
&lt;br /&gt;
=== Stop ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: None&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
Stop the current stream.&lt;br /&gt;
&lt;br /&gt;
=== Next ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint streamId)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Move to the next stream (i.e. skip forwards).  Determination of what comes next may vary between sources/modes.  If &amp;lt;tt&amp;gt;TransportState&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;Stopped&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;Paused&amp;lt;/tt&amp;gt;, try to start playing.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;801&amp;lt;/tt&amp;gt; fault code if the current channel does not support skipping forwards. &lt;br /&gt;
&lt;br /&gt;
=== Prev ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint streamId)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Move to the previous stream (i.e. skip backwards).  If &amp;lt;tt&amp;gt;TransportState&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;Stopped&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;Paused&amp;lt;/tt&amp;gt;, try to start playing.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;801&amp;lt;/tt&amp;gt; fault code if the current channel does not support skipping backwards. &lt;br /&gt;
&lt;br /&gt;
=== SeekSecondsAbsolute ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint streamId, in uint secondsAbsolute)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Seek to an absolute position in the current stream.  If &amp;lt;tt&amp;gt;TransportState&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;Stopped&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;Paused&amp;lt;/tt&amp;gt;, try to start playing.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;801&amp;lt;/tt&amp;gt; fault code if the current stream does not support seek. &lt;br /&gt;
[[br]]Returns a &amp;lt;tt&amp;gt;803&amp;lt;/tt&amp;gt; fault code if the seek position is beyond the end of the stream.&lt;br /&gt;
&lt;br /&gt;
=== SeekSecondsRelative ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint streamId, in int secondsRelative)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Seek to a position relative to what's currently playing in the current stream.  If &amp;lt;tt&amp;gt;TransportState&amp;lt;/tt&amp;gt; is &amp;lt;tt&amp;gt;Stopped&amp;lt;/tt&amp;gt; or &amp;lt;tt&amp;gt;Paused&amp;lt;/tt&amp;gt;, try to start playing.&lt;br /&gt;
&lt;br /&gt;
Returns a &amp;lt;tt&amp;gt;801&amp;lt;/tt&amp;gt; fault code if the current stream does not support seek. &lt;br /&gt;
[[br]]Returns a &amp;lt;tt&amp;gt;803&amp;lt;/tt&amp;gt; fault code if the seek position is beyond the end of the stream.&lt;br /&gt;
&lt;br /&gt;
=== TransportState ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string state)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read the current value of the TransportState property.&lt;br /&gt;
&lt;br /&gt;
=== Modes ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string modes)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Modes&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== Counters ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string seq, out uint stream, out uint metatext)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read the values of the sequence numbers associated with each level of information plus the counters for current stream details.&lt;br /&gt;
&lt;br /&gt;
=== ModeInfo ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string mode, out bool nextAvailable, out bool prevAvailable)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Reports the values of the &amp;lt;tt&amp;gt;Mode&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;NextAvailable&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;PrevAvailable&amp;lt;/tt&amp;gt; properties.&lt;br /&gt;
&lt;br /&gt;
=== LevelInfo ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (in uint index, out string uri, out string metadata)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Reports uri &amp;amp; metadata for the specified level (a zero-based index into the &amp;lt;tt&amp;gt;SequenceNumbers&amp;lt;/tt&amp;gt; array).&lt;br /&gt;
&lt;br /&gt;
=== StreamInfo ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: &amp;lt;br&amp;gt;&lt;br /&gt;
(out uint streamId, out string uri, out bool seekable, out bool pausable,&lt;br /&gt;
out uint durationSecs, out uint bitRate, out uint bitDepth, out uint SampleRate,&lt;br /&gt;
out bool lossless, out string codec)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reports current stream information:&lt;br /&gt;
* &amp;lt;tt&amp;gt;StreamId&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Uri&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Seekable&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Pausable&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Duration&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;BitRate&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;BitDepth&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;SampleRate&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;Lossless&amp;lt;/tt&amp;gt;&lt;br /&gt;
* &amp;lt;tt&amp;gt;CodecName&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StreamId ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out uint streamId)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read the current value of the &amp;lt;tt&amp;gt;StreamId&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
=== Metatext ===&lt;br /&gt;
&amp;lt;tt&amp;gt;&lt;br /&gt;
Arguments: (out string text)&lt;br /&gt;
&amp;lt;/tt&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Read the current value of the &amp;lt;tt&amp;gt;Metatext&amp;lt;/tt&amp;gt; property.&lt;br /&gt;
&lt;br /&gt;
== UPnP Service Description ==&lt;br /&gt;
For devices supporting the UPnP protocol, the service description is&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;name: &amp;quot;Transport&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;domain: &amp;quot;openhome.org.eriskay&amp;quot;&lt;br /&gt;
&amp;lt;br&amp;gt;version: &amp;quot;1&amp;quot;&amp;lt;/tt&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
    &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
  &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;actionList&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;PlayAs&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argument&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;Mode&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
        &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_string&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
      &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;argument&amp;gt;&lt;br /&gt;
        &amp;lt;name&amp;gt;Command&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
        &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_string&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
      &amp;lt;/argument&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Play&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Pause&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Stop&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Next&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;StreamId&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Prev&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;StreamId&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SeekSecondsAbsolute&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;StreamId&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;SecondsAbsolute&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_uint&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SeekSecondsRelative&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;StreamId&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;SecondsRelative&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_int&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;TransportState&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;State&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;TransportState&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Modes&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Modes&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Modes&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Counters&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;SequenceNumbers&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;SequenceNumbers&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;StreamCount&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;StreamCount&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;MetatextCount&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;MetatextCount&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;LevelInfo&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Index&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_uint&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_string&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_string&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;ModeInfo&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Mode&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Mode&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;NextAvailable&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;NextAvailable&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;PrevAvailable&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;PrevAvailable&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;StreamInfo&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;StreamId&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_string&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Seekable&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Seekable&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Pausable&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Pausable&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Duration&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Duration&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;BitRate&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;BitRate&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;BitDepth&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;BitDepth&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;SampleRate&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;SampleRate&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Lossless&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Lossless&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;CodecName&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;CodecName&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;StreamId&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;action&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Metatext&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;argument&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Metatext&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
          &amp;lt;relatedStateVariable&amp;gt;Metatext&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;/argument&amp;gt;&lt;br /&gt;
      &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
    &amp;lt;/action&amp;gt;&lt;br /&gt;
  &amp;lt;/actionList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Modes&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;LevelCount&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Mode&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SequenceNumbers&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;StreamCount&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;MetatextCount&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;NextAvailable&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;PrevAvailable&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;StreamId&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Duration&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Seekable&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Pausable&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;BitRate&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;BitDepth&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;SampleRate&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Lossless&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;CodecName&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;Metatext&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;TransportState&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
      &amp;lt;allowedValueList&amp;gt;&lt;br /&gt;
        &amp;lt;allowedValue&amp;gt;Playing&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
        &amp;lt;allowedValue&amp;gt;Paused&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
        &amp;lt;allowedValue&amp;gt;Stopped&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
        &amp;lt;allowedValue&amp;gt;Buffering&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
        &amp;lt;allowedValue&amp;gt;Waiting&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
      &amp;lt;/allowedValueList&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;A_ARG_TYPE_uint&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;A_ARG_TYPE_int&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;i4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;name&amp;gt;A_ARG_TYPE_string&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
    &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
  &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:EriskayServices</id>
		<title>Av:Developer:EriskayServices</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:EriskayServices"/>
				<updated>2015-12-14T17:36:01Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: /* Other APIs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Eriskay =&lt;br /&gt;
This page describes APIs for Eriskay, the second major release of OpenHome network services.&lt;br /&gt;
&lt;br /&gt;
There are a number of [[Av:Developer:Eriskay:DavaarChanges | changes]] from Davaar.&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
Links to documentation for individual services is below.&lt;br /&gt;
&lt;br /&gt;
The Device service is in the &amp;lt;tt&amp;gt;openhome.org&amp;lt;/tt&amp;gt; domain; all other services are in the &amp;lt;tt&amp;gt;openhome.org.eriskay&amp;lt;/tt&amp;gt; domain.  Provision of the device service is mandatory; all other services are optional.  All properties and actions in all services are mandatory; a device that implements a service must fully implement all of its properties and actions.&lt;br /&gt;
* [[Av:Developer:Eriskay:DeviceService | Device]]&lt;br /&gt;
* [[Av:Developer:Eriskay:TransportService | Transport]]&lt;br /&gt;
* [[Av:Developer:Eriskay:ProductService | Product]]&lt;br /&gt;
* [[Av:Developer:Eriskay:TimeService | Time]]&lt;br /&gt;
* [[Av:Developer:Eriskay:VolumeService | Volume]]&lt;br /&gt;
* [[Av:Developer:Eriskay:CredentialsService | Credentials]]&lt;br /&gt;
* [[Av:Developer:Eriskay:SenderService | Sender]]&lt;br /&gt;
* [[Av:Developer:Eriskay:ConfigurationService | Configuration]]&lt;br /&gt;
* [[Av:Developer:Eriskay:PlaylistService | Playlist]]&lt;br /&gt;
* [[Av:Developer:Eriskay:RadioService | Radio]]&lt;br /&gt;
* [[Av:Developer:Eriskay:ReceiverService | Receiver]]&lt;br /&gt;
&lt;br /&gt;
== Other APIs ==&lt;br /&gt;
* [[Av:Developer:Eriskay:TransportPlayAsCommands | PlayAs]] options in [[Av:Developer:Eriskay:TransportService | Transport]] service&lt;br /&gt;
* [[Av:Developer:Eriskay:StreamingServices | Streaming Services]]&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/QobuzStreamingService</id>
		<title>QobuzStreamingService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/QobuzStreamingService"/>
				<updated>2015-03-02T17:16:38Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Qobuz's [https://github.com/Qobuz/api-documentation developer API] is published on github.&lt;br /&gt;
&lt;br /&gt;
The [[Av:Developer:CredentialsService | Credentials]] service can be used to retrieve the following information:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;tt&amp;gt;Ids&amp;lt;/tt&amp;gt; state variable includes &amp;lt;tt&amp;gt;qobuz.com&amp;lt;/tt&amp;gt; if Qobuz is supported.&lt;br /&gt;
* &amp;lt;tt&amp;gt;Data&amp;lt;/tt&amp;gt; from &amp;lt;tt&amp;gt;Get&amp;lt;/tt&amp;gt; contains the &amp;lt;tt&amp;gt;app_id&amp;lt;/tt&amp;gt; used by many Qobuz API calls.&lt;br /&gt;
* &amp;lt;tt&amp;gt;Status&amp;lt;/tt&amp;gt; from &amp;lt;tt&amp;gt;Get&amp;lt;/tt&amp;gt; is blank if Username and Password are both either blank or set and valid.  If &amp;lt;tt&amp;gt;Status&amp;lt;/tt&amp;gt; is not blank, it contains either json returned from a Qobuz API or an error string.&lt;br /&gt;
* The token returned from &amp;lt;tt&amp;gt;Login&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ReLogin&amp;lt;/tt&amp;gt; is a Qobuz &amp;lt;tt&amp;gt;user_auth_token&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Some Qobuz APIs require an &amp;lt;tt&amp;gt;app_secret&amp;lt;/tt&amp;gt; argument.  These APIs should not need to be called from control points.&lt;br /&gt;
&lt;br /&gt;
Tracks can be added to the [[Av:Developer:PlaylistService | Playlist]] service with urls in the form &amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;qobuz://track?version=2&amp;amp;trackId=[insert_qobuz_track_id]&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ohTopologyDescription</id>
		<title>Av:Developer:ohTopologyDescription</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ohTopologyDescription"/>
				<updated>2015-02-13T16:51:14Z</updated>
		
		<summary type="html">&lt;p&gt;Eamonnb: /* Source Naming */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=ohTopology=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
ohTopology is a software stack which provides a means of controlling devices, on a local network, via their UPnP service actions. Devices are grouped based on their Room names and presented as a tree structure based on their interconnectivity. It consists of a number of distinct layers. Each layer focuses on exposing specific properties and actions that are intended to be utilised by the layers above. Clients of ohTopology need only interface directly with the highest layer of the stack to gain access to the properties and actions exposed by the lower layers.&lt;br /&gt;
&lt;br /&gt;
==Watchable System==&lt;br /&gt;
===Overview===&lt;br /&gt;
Actions exposed by a layer can be called directly, but property values can only be monitored through a callback notification system (observer pattern). Properties are exposed as &amp;quot;watchable&amp;quot; values that may be monitored by &amp;quot;watcher&amp;quot; clients. When a (watchable) property changes, all of its watchers are automatically notified of the change and the property's new value. Watchers can be added and removed at any time. The IWatchable interface is used to expose single value properties and the IWatchableUnordered and IWatchableOrdered interfaces are used for multivalue property lists. Property client objects must conform to the appropriate Iwatchable/IWatchableUnordered/IWatchableOrdered interface for the property that they wish to observe.&lt;br /&gt;
&lt;br /&gt;
===Watchable Thread ===&lt;br /&gt;
Although ohTopology is designed to run on multithreaded platforms, actions are executed in a single thread through the use of a thread scheduler class, WatchableThread. Enforcing single threaded execution removes the burden of having to manage thread safety, simplifies debugging and reduces the risk of deadlock. The WatchableThread class provides three methods; Execute, Schedule and Assert.&lt;br /&gt;
&lt;br /&gt;
===Schedule Method===&lt;br /&gt;
Schedule provides a mechanism for '''asynchronous callback'''. The specified callback is placed in a queue (FIFO) to be run on the watchable thread, in turn, at some point in the future. Schedule takes a functor, for the callback method, and a generic void* argument to be passed to the callback.&lt;br /&gt;
&lt;br /&gt;
===Execute Method===&lt;br /&gt;
Execute provides a mechanism for '''synchronous callback'''. If called from the watchable thread it executes the callback immediately. Otherwise it schedules the callback, for execution on the watchable thread. In either case, it blocks until the callback has completed. Execute takes a functor for the callback method and a generic void* argument to be passed to the callback.&lt;br /&gt;
&lt;br /&gt;
===Assert Method===&lt;br /&gt;
Assert provides a way of checking if the current thread is the watchable thread.&lt;br /&gt;
&lt;br /&gt;
==Injector==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Network==&lt;br /&gt;
&lt;br /&gt;
==Topology1==&lt;br /&gt;
&lt;br /&gt;
===Overview===&lt;br /&gt;
Topology1 collects a list of '''Product Service''' devices from Network and exposes a collection of '''Products'''.&lt;br /&gt;
&lt;br /&gt;
===Topology1===&lt;br /&gt;
Topology1 watches a (Product Service) device list from '''Network''' and creates a corresponding list of '''ProxyProduct''' objects that is updated whenever the device list changes. The '''Products''' method exposes the '''ProxyProduct''' list as an IWatchableUnordered.&lt;br /&gt;
&lt;br /&gt;
==Topology2 ==&lt;br /&gt;
===Overview===&lt;br /&gt;
Topology2 collects the list of '''Products''' from '''Topology1''' and exposes a collection of '''Groups'''. Each '''Group''' exposes a '''Sources''' collection and pertinent properties and actions of the '''Product Service'''. Each '''Source''' exposes the standard set of Source properties.&lt;br /&gt;
&lt;br /&gt;
===Topology2===&lt;br /&gt;
Topology2 watches '''Topology1::Products''' and creates a corresponding list of '''Topology2Group''' objects that is updated whenever '''Topology1::Products''' changes. The '''Groups''' method exposes the '''Topology2Group''' list as an IWatchableUnordered.&lt;br /&gt;
&lt;br /&gt;
===Topology2Source===&lt;br /&gt;
Topology2Source exposes the three standard source properties: '''Name''', '''Visible''' and '''Type'''. The '''Index''' method exposes the source's position in the source list of '''Topology2Group'''.&lt;br /&gt;
&lt;br /&gt;
===Topology2Group===&lt;br /&gt;
Topology2Group watches the '''SourceXml''' property of its underlying '''ProxyProduct''' object. Source information retrieved from '''SourceXml''' is used to to create and update a list of '''Topology2Source''' objects. The '''Sources''' method exposes the '''Topology2Source''' list as an IWatchableUnordered.&lt;br /&gt;
&lt;br /&gt;
==Topology3 ==&lt;br /&gt;
===Overview===&lt;br /&gt;
Topology3 collects the list of '''Groups''' from '''Topology2''' and exposes a collection of '''Groups'''. Each '''Group''' exposes a '''Sources''' collection, pertinent actions and properties of the '''Product Service''', and a '''Sender''' property.&lt;br /&gt;
&lt;br /&gt;
===Topology3===&lt;br /&gt;
Topology3 watches '''Topology2::Groups''' to create and maintain a corresponding list of '''Topology3Group''' objects. A dedicated '''SenderWatcher''' is created for each '''Topology3Group''' that has a Sender attribute,  to monitor the '''Metadata''' property of its '''Sender Service''' . A dedicated '''ReceiverWatcher''' is created for each '''Topology3Group'''  to monitor both the '''Metadata''' and '''TransportState''' properties of its '''Receiver Service'''. &lt;br /&gt;
&lt;br /&gt;
Topology3 marries receivers and senders by matching their '''Uri''' properties, reassigning the '''Sender''' property of each '''Topology3Group''' when changes are reported by the watchers. The '''Groups''' method exposes the '''Topology3Group''' list as an IWatchableUnordered.&lt;br /&gt;
&lt;br /&gt;
===Topology3Group ===&lt;br /&gt;
Topology3Group exposes all of the properties and actions of its underlying '''Topology2Group''' plus a '''Sender''' property. The Sender property holds a reference to a '''Sender''' object that reflects the Songcast sender device that the group's receiver source is listening to. The '''SenderEmpty''' object is used when no sender is selected or the selected sender is inactive.&lt;br /&gt;
&lt;br /&gt;
===ReceiverWatcher===&lt;br /&gt;
ReceiverWatcher watches the '''Sources''' property of Topology3Group to find a source of type '''Receiver''' as an indicator of the existence of a '''Receiver service'''. If it exists, the '''Receiver service''' is subscribed to and its '''TransportState''' and '''Metadata''' properties are watched. When either of these two properties change Topology3 is notified via its '''ReceiverChanged''' method.&lt;br /&gt;
&lt;br /&gt;
===SenderWatcher===&lt;br /&gt;
SenderWatcher subscribes to it's group's '''Sender service''' to watch its '''Metadata''' property. When this property changes Topology3 is notified via its '''SenderChanged''' method.&lt;br /&gt;
&lt;br /&gt;
==Topology4 ==&lt;br /&gt;
===Overview===&lt;br /&gt;
Topology4 collects the list of '''Groups''' from '''Topology3''' and exposes a new collection of '''Rooms'''. Each '''Room''' in the new collection exposes a  collection of '''Groups''' with matching '''RoomName''' properties.&lt;br /&gt;
&lt;br /&gt;
===Topology4===&lt;br /&gt;
&lt;br /&gt;
Topology4 watches '''Topology3::Groups''' and creates a '''Topology4Room''' list that is updated whenever there is a change to the '''RoomName''' property of any '''Topology3Group'''. A dedicated '''Topology4GroupWatcher''' is created for each '''Topology3Group''' to watch its '''RoomName''' property. The Rooms method exposes the '''Topology4Room''' list as an IWatchableUnordered.&lt;br /&gt;
&lt;br /&gt;
===Topology4Room ===&lt;br /&gt;
Topology4Room maintains a collection of '''Topology4Group''' objects with matching '''RoomName''' properties. The collection contains at least one group. Groups are added and removed by the Topology4 class. The '''Name''' method exposes the '''Name''' property which reflects the common '''RoomName''' value shared by all groups in the collection. The '''SetStandby''' method sets the standby state of all groups. The '''Groups''' method exposes the collection of groups as an IWatchableUnordered.&lt;br /&gt;
&lt;br /&gt;
===Topology4GroupWatcher ===&lt;br /&gt;
Topology4GroupWatcher  watches the '''RoomName''' property of a single '''Topology3Group''' and updates '''Topology4''',  removing the group from one room and adding it to another, whenever its '''RoomName''' property changes.&lt;br /&gt;
&lt;br /&gt;
==Topology5 ==&lt;br /&gt;
===Overview===&lt;br /&gt;
Topology5 collects the list of '''Rooms''' from '''Topology4''' and organises the products ('''Groups''') in each room, evaluating their interrelationship as a family tree of connected '''parents''' and '''children'''. It exposes a list of  '''Rooms''', with each '''Room''' exposing a list of parent products ('''Roots''') and a list of sources. &lt;br /&gt;
&lt;br /&gt;
====Roots====&lt;br /&gt;
Products in a room can be daisychained by connecting the outputs of one product to the inputs of another, creating a tree of devices. In such a setup, the '''Root''' (parent) of the tree (the product at the end of the chain) is the output for all the products in the room. Typically there should only be one '''Root''' in each room, whose outputs are connected to the speakers. A '''Root''' is thus defined as a product whose outputs are '''not''' connected to the inputs of any other product.&lt;br /&gt;
&lt;br /&gt;
====Source Naming====&lt;br /&gt;
It is not possible for a product to detect if other products are connected to its inputs. Topology, therefore, can only imply this through source naming configured by the user, as follows. If a '''source name''' on a product &amp;quot;ProductA&amp;quot; matches the '''device name''' of another product &amp;quot;ProductB&amp;quot;, in the same room, it implies that the outputs of ProductB are connected to the inputs of that source on ProductA. In the family tree of products in a room, ProductA is the '''parent''' of ProductB and ProductB is a '''child''' of ProductA.&lt;br /&gt;
&lt;br /&gt;
===Topology5===&lt;br /&gt;
Topology5 watches '''Topology4::Rooms''' to create and maintain a corresponding collection of '''Topology5Room''' objects. The '''Rooms''' method exposes the collection of rooms as an IWatchableUnordered.&lt;br /&gt;
&lt;br /&gt;
===Topology5Room ===&lt;br /&gt;
Topology5Room maintains a Topology3Group list of by watching the Groups list of its underlying Topology4Room. A dedicated Topology5GroupWatcher is created for each group to watch its '''Name''' and '''Sources''' properties. Since all groups in the room may not share the same standby state, an additional &amp;quot;'''mixed'''&amp;quot; state is introduced to create a '''tristate Standby''' property. The '''Topology3Group''' list is used to maintain a corresponding '''Topology5Group''' list which is then filtered to obtain a '''Roots''' list. A super list of sources (Topology5Source) is then created by gathering all the sources of each Root replacing each source with its child group's sources where appropriate. The '''Roots''' method exposes the Roots list as an IWatchableUnordered. The '''Sources''' method exposes the Roots list as an IWatchableUnordered. The '''Standby''' method exposes the standby state of the room. The '''SetStandby''' method sets the standby state of all groups in the room. The '''Name''' method exposes the common room name shared by all groups in the room.&lt;br /&gt;
&lt;br /&gt;
===Topology5Group ===&lt;br /&gt;
Topology5Group keeps track of it's '''parent''' and '''children''' groups, its currently active source, a list of its currently visible sources (expanded to include the sources of any child groups), a list of groups (from my group upwards) with the Volume service, a list of all child groups that have the Sender service.&lt;br /&gt;
&lt;br /&gt;
===Topology5GroupWatcher ===&lt;br /&gt;
Monitors the '''Name''' and '''Sources''' properties of a specific '''Topology3Group''', updating '''Topology5Room''' whenever a change occurs.&lt;br /&gt;
&lt;br /&gt;
===Topology5Source ===&lt;br /&gt;
Topology5Source provides a number of methods that expose the standard source parameters, flags to the presence of the Info and Time services, the source's parent group, the group's device and a list of parent groups with the Volume service. Also provided is a method to reset the list of volume service groups, a method select the source and a factory method, '''CreatePreset''', that returns a '''MediaPresetExternal''' object.&lt;br /&gt;
&lt;br /&gt;
===MediaPresetExternal===&lt;br /&gt;
MediaPresetExternal is an object that provides access to a single '''Topology5Source''' object via the standard '''IMediaPreset''' interface. It monitors the transport state of the Source by watching the '''Source''' property of the its parent '''Topology5Group'''. The state is exposed via the three IWatchable properties '''Playing''', '''Buffering''' and '''Selected'''. The '''Play''' method selects the source in its parent group.&lt;br /&gt;
&lt;br /&gt;
==Services==&lt;br /&gt;
===Overview===&lt;br /&gt;
&lt;br /&gt;
===Service===&lt;br /&gt;
===ServicePlaylist===&lt;br /&gt;
===ServiceRadio===&lt;br /&gt;
===ServiceSender===&lt;br /&gt;
===ServiceReceiver===&lt;br /&gt;
===ServiceVolume===&lt;br /&gt;
===ServiceInfo===&lt;br /&gt;
===ServiceProduct===&lt;/div&gt;</summary>
		<author><name>Eamonnb</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/TidalStreamingService</id>
		<title>TidalStreamingService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/TidalStreamingService"/>
				<updated>2014-12-08T18:30:24Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Tidal's API is private.  See Tidal for access to it.  Or speak to us for help if you think that your access to the API would benefit OpenHome.&lt;br /&gt;
&lt;br /&gt;
Assuming access to Tidal's API, the [[Av:Developer:CredentialsService | Credentials]] service can be used to retrieve the following information:&lt;br /&gt;
&lt;br /&gt;
* The &amp;lt;tt&amp;gt;Ids&amp;lt;/tt&amp;gt; state variable includes &amp;lt;tt&amp;gt;tidalhifi.com&amp;lt;/tt&amp;gt; if Tidal is supported.&lt;br /&gt;
* &amp;lt;tt&amp;gt;Data&amp;lt;/tt&amp;gt; from &amp;lt;tt&amp;gt;Get&amp;lt;/tt&amp;gt; contains the country code used for many Tidal API calls.&lt;br /&gt;
* &amp;lt;tt&amp;gt;Status&amp;lt;/tt&amp;gt; from &amp;lt;tt&amp;gt;Get&amp;lt;/tt&amp;gt; is blank if Username and Password are both either blank or set and valid.  If &amp;lt;tt&amp;gt;Status&amp;lt;/tt&amp;gt; is not blank, it contains either json returned from a Tidal API or an error string.&lt;br /&gt;
* The token returned from &amp;lt;tt&amp;gt;Login&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;ReLogin&amp;lt;/tt&amp;gt; is a Tidal session id.&lt;br /&gt;
&lt;br /&gt;
Tracks can be added to the [[Av:Developer:PlaylistService | Playlist]] service with urls in the form &amp;lt;br&amp;gt;&amp;lt;tt&amp;gt;tidal://track?version=1&amp;amp;trackId=[insert_tidal_track_id]&amp;lt;/tt&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:CredentialsService</id>
		<title>Av:Developer:CredentialsService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:CredentialsService"/>
				<updated>2014-11-11T13:43:01Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* ReLogin */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
The Credentials provides access to username, password and current status of all remote services that require unique logins.&lt;br /&gt;
&amp;lt;br&amp;gt;If a device's [[Developer:ProductService|Product]] service reports an attribute 'Credentials', then that device is guaranteed to bear the Credentials service.&lt;br /&gt;
&lt;br /&gt;
= State Variables =&lt;br /&gt;
== Ids ==&lt;br /&gt;
Space separated list of identifiers for services whose credentials can be set.&lt;br /&gt;
&amp;lt;br&amp;gt;Set on startup; does not change at runtime.&lt;br /&gt;
&lt;br /&gt;
== PublicKey ==&lt;br /&gt;
RSA public key that must be used to encrypt any/all passwords.&lt;br /&gt;
&amp;lt;br&amp;gt;When encrypting ensure PKCS1 OAEP padding is used.&lt;br /&gt;
&amp;lt;br&amp;gt;May be blank on startup; will not vary once set.  With the exception of the &amp;lt;tt&amp;gt;Ids&amp;lt;/tt&amp;gt; state variable, the rest of the service cannot usefully be used before this is set.&lt;br /&gt;
&lt;br /&gt;
== SequenceNumber ==&lt;br /&gt;
Increases whenever any aspect of state for any user of credentials listed in &amp;lt;tt&amp;gt;Ids&amp;lt;/tt&amp;gt; changes.  The client is responsible for polling each Id they are interested in to determine what has changed.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Set ==&lt;br /&gt;
Set the username and password for a given service.  The password must be encrypted using the RSA public key in the &amp;lt;tt&amp;gt;PublicKey&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
&amp;lt;br&amp;gt;Calling this action automatically enables the service.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that some processing may happen asynchronously.  If any of username, password or enabled states are changed for the service, &amp;lt;tt&amp;gt;SequenceNumber&amp;lt;/tt&amp;gt; will automatically change.&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a 800 fault code if the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; argument is invalid.&lt;br /&gt;
&lt;br /&gt;
== Clear ==&lt;br /&gt;
Remove both username and password for a given service.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that some processing may happen asynchronously.  If any of username, password or enabled states are changed for the service, &amp;lt;tt&amp;gt;SequenceNumber&amp;lt;/tt&amp;gt; will automatically change.&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a 800 fault code if the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; argument is invalid.&lt;br /&gt;
&lt;br /&gt;
== SetEnabled ==&lt;br /&gt;
Set or clear the enabled state of a service.  Disabling a service temporarily prevents its use by a device but allows the device to retain the username/password for later use (if the service is re-enabled by calling &amp;lt;tt&amp;gt;SetEnabled()&amp;lt;/tt&amp;gt; again).&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a 800 fault code if the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; argument is invalid.&lt;br /&gt;
&lt;br /&gt;
== Get ==&lt;br /&gt;
Retrieve username, password, status and enabled state for a service.&lt;br /&gt;
&amp;lt;br&amp;gt;Username, password and enabled will only change in response to invocations of the Credentials service.  The password is encrypted so is not suitable for user display.  Clients can infer whether a password has been set by checking whether the value returned has non-zero length.&lt;br /&gt;
&amp;lt;br&amp;gt;Status may change in response to runtime events.  e.g. If an account expires, the status may change to include the error returned by the remote service provider.  Status is only set for error cases - a blank status indicates that a service is functioning correctly.  The exact format of status content varies between services.&lt;br /&gt;
&amp;lt;br&amp;gt;Data contains any other service-specific information.  The format of content varies between services.&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a 800 fault code if the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; argument is invalid.&lt;br /&gt;
&lt;br /&gt;
== Login ==&lt;br /&gt;
Read a token indicating that a registered user has logged in to a remote service.  This allows control points to access data that is specific to a certain user account without requiring access to the (sensitive) password for that account.  The data returned may vary between credential-consuming services; the control point is responsible for knowing how to interpret it.&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a 800 fault code if the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; argument is invalid.&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a 801 fault code if the login was attempted but failed.&lt;br /&gt;
&lt;br /&gt;
== ReLogin ==&lt;br /&gt;
Refresh an existing token returned from &amp;lt;tt&amp;gt;Login()&amp;lt;/tt&amp;gt;.  This should only be called after the remote service has indicated that the current token has expired and is no longer valid.&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a 800 fault code if the &amp;lt;tt&amp;gt;Id&amp;lt;/tt&amp;gt; argument is invalid.&lt;br /&gt;
&amp;lt;br&amp;gt;Returns a 801 fault code if a new login was attempted but failed.&lt;br /&gt;
&lt;br /&gt;
== GetIds ==&lt;br /&gt;
Read the value of the &amp;lt;tt&amp;gt;Ids&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
&lt;br /&gt;
== GetPublicKey ==&lt;br /&gt;
Read the value of the &amp;lt;tt&amp;gt;PublicKey&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
&lt;br /&gt;
== GetSequenceNumber ==&lt;br /&gt;
Read the value of the &amp;lt;tt&amp;gt;SequenceNumber&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
&lt;br /&gt;
= Technical Details =&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
    Domain  : av.openhome.org&lt;br /&gt;
    Name    : Credentials&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;specVersion&amp;gt;&lt;br /&gt;
        &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
        &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
    &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;actionList&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Set&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;UserName&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Password&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Binary&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Clear&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SetEnabled&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Enabled&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Bool&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Get&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;UserName&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Password&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Binary&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Enabled&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_Bool&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Status&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Data&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Login&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Token&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ReLogin&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;CurrentToken&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;NewToken&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;A_ARG_TYPE_String&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;GetIds&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Ids&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Ids&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;GetPublicKey&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;PublicKey&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;PublicKey&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;GetSequenceNumber&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;SequenceNumber&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SequenceNumber&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/actionList&amp;gt;&lt;br /&gt;
    &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Ids&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PublicKey&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SequenceNumber&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;A_ARG_TYPE_String&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;A_ARG_TYPE_Binary&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;bin.base64&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;A_ARG_TYPE_Bool&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Developer:IdArray</id>
		<title>Developer:IdArray</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Developer:IdArray"/>
				<updated>2014-03-27T09:52:44Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt; is an array of 32 bit, big endian unsigned integers. Each Id typically represents a track.  An empty &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt; indicates an rray with no elements i.e. no tracks are available.&lt;br /&gt;
&lt;br /&gt;
For example the &amp;lt;tt&amp;gt;IdArray&amp;lt;/tt&amp;gt; of:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
0x00 0x00 0x00 0x02 0x00 0x00 0x01 0x14 0x00 0x00 0x00 0x13&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
contains 3 ids with the values of 2, 276, and 19 in that order.&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:IdArray</id>
		<title>Av:Developer:IdArray</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:IdArray"/>
				<updated>2013-08-01T14:28:33Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Created page with &amp;quot;= IdArray = Various services require the ability to return a collection of track identifiers.  This is achieved using an IdArray.  An IdArray represents an array of big endian 32...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= IdArray =&lt;br /&gt;
Various services require the ability to return a collection of track identifiers.  This is achieved using an IdArray.&lt;br /&gt;
&lt;br /&gt;
An IdArray represents an array of big endian 32-bit unsigned integers.  For example,&lt;br /&gt;
&amp;lt;pre&amp;gt;0x00 0x00 0x00 0x02 0x00 0x00 0x01 0x03 0x00 0x00 0x00 0x13&amp;lt;/pre&amp;gt; &lt;br /&gt;
represents 3 tracks with the id's 2, 259, and 19 in that order.&lt;br /&gt;
&lt;br /&gt;
Since UPnP has no native collection types, an IdArray has binary type in UPnP services.&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMediaPlayer</id>
		<title>OhMediaPlayer</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMediaPlayer"/>
				<updated>2013-07-12T08:47:43Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: /* Source Code */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ohMediaPlayer =&lt;br /&gt;
ohMediaPlayer is a portable software version of the ohMedia and UPnP:AV network services.  It is written in C++ and can be deployed to any desktop or mobile platform and many embedded platforms.&lt;br /&gt;
Its headline features include&lt;br /&gt;
* Support for all popular digital formats&lt;br /&gt;
** …including FLAC, MP3, ALAC, WAV, AAC, Vorbis, WMA&lt;br /&gt;
** …for both 44.1kHz and 48kHz family sample rates&lt;br /&gt;
** …supported sample rates from 7.35kHz to 192kHz&lt;br /&gt;
** …at 8/16/24 bit depths&lt;br /&gt;
** …in 1-8 channels&lt;br /&gt;
* Playlist source.  Store a playlist of hundreds or even thousands of tracks on device, playing these without requiring further interaction from a control point.&lt;br /&gt;
* Songcast.&lt;br /&gt;
** Sender.  Share your audio stream with an unlimited number of other players&lt;br /&gt;
** Receiver.  Listen to the same audio stream as another device, in exact synchronisation with that device and all other receivers.&lt;br /&gt;
** Supports all audio resolutions, up to and including 24-bit / 192kHz&lt;br /&gt;
** &amp;quot;Clock pulling&amp;quot; architecture guarantees that playback starts then remains synchronised between all devices&lt;br /&gt;
* Radio.  Supports internet radio stations, podcasts and listen again.  Includes integration to the popular TuneIn service, allowing users to setup personalised presets from a list of all worldwide internet stations.&lt;br /&gt;
* UPnP:AV.  Presents the standard UPnP Media Renderer network services for use with basic control points.&lt;br /&gt;
* Playback of popular analogue and digital inputs - HDMI, SPDIF, TOS, Analogue, etc.&lt;br /&gt;
* Airplay.  Receive an audio stream via Apple’s Airplay protocol.&lt;br /&gt;
&lt;br /&gt;
= Architecture Overview =&lt;br /&gt;
[[File:MediaPlayer-Integrators.png]]&lt;br /&gt;
&lt;br /&gt;
= System Requirements =&lt;br /&gt;
RAM: 16MB standard; 4MB possible&lt;br /&gt;
&lt;br /&gt;
ROM: 8MB standard; 2.5MB possible (if Radio and Airplay sources are omitted)&lt;br /&gt;
&lt;br /&gt;
= Integration =&lt;br /&gt;
The integrator supplies a small number of components&lt;br /&gt;
* Driver.  This pulls decoded audio samples from ohMediaPlayer’s audio pipeline and is responsible for feeding them into the host’s audio hardware at the appropriate rate.&lt;br /&gt;
* Mutes.  Optionally mute audio hardware around changes in audio sample rate or bit depth.&lt;br /&gt;
* OS compatibility layer.  Threading and socket abstractions.  Many standard platforms are available with ohNet, including&lt;br /&gt;
** Linux (x86, x64, ARM)&lt;br /&gt;
** Windows (x86, x64)&lt;br /&gt;
** Mac (x86, x64)&lt;br /&gt;
** Embedded (using [http://www.freertos.org/ FreeRTOS] and [http://lwip.wikia.com/wiki/LwIP_Wiki lwIP]).  Big and little endian ports exist.&lt;br /&gt;
* R/W Store.  At a minimum, this can simply provide a set of string literals that are determined at design time.  If runtime user configuration is supported, this should also provide a means to persist and restore (string) key / (binary) value pairs.&lt;br /&gt;
* Application.  This can be pretty short - &amp;lt;100 lines of code - to cover&lt;br /&gt;
** Initialise the UPnP stack&lt;br /&gt;
** Create a UPnP device, adding manufacturer-specific attributes to it&lt;br /&gt;
** Create MediaPlayer object&lt;br /&gt;
** Add desired plug-ins to MediaPlayer object&lt;br /&gt;
*** Sources&lt;br /&gt;
*** Codecs&lt;br /&gt;
*** Protocols&lt;br /&gt;
*** Content Processors&lt;br /&gt;
*** (Note that a future release may reduce this to selection of sources, with each source enabling appropriate codecs, protocols, etc. automatically.)&lt;br /&gt;
** Create Driver, R/W Store&lt;br /&gt;
** Enable UPnP device&lt;br /&gt;
No further code is required.  ohMediaPlayer is controlled via [[OhMediaDevelopers#Network_Services | network APIs]] which will be automatically advertised on the network, ready to be used by any number of controllers in parallel.&lt;br /&gt;
&lt;br /&gt;
= Configuration =&lt;br /&gt;
APIs are provided for design-time configuration&lt;br /&gt;
* Which audio ‘sources’ to include&lt;br /&gt;
* Which audio formats to support&lt;br /&gt;
* Sizes of various thread and memory pools&lt;br /&gt;
Additional software can be provided for run-time configuration, including&lt;br /&gt;
* Product name&lt;br /&gt;
* Username for externally provided radio presets&lt;br /&gt;
* Source naming + visibility to control app&lt;br /&gt;
* Delays to apply to different sources (e.g. for lip-sync)&lt;br /&gt;
This additional software includes&lt;br /&gt;
* On-device UPnP service&lt;br /&gt;
* On-device web UI to access these configuration values&lt;br /&gt;
* Desktop/mobile app to detect media players and display their configuration page.&lt;br /&gt;
&lt;br /&gt;
= Software Updates =&lt;br /&gt;
Deployments to open systems are assumed to use the host’s existing support for application deployment and update.&lt;br /&gt;
A highly robust, well proved firmware update mechanism is available for embedded products.  This includes&lt;br /&gt;
* Additional UPnP services to support reprogramming&lt;br /&gt;
* Desktop reprogramming utility&lt;br /&gt;
* Optionally, a desktop app which includes the reprogramming utility plus a user interface onto other device configuration options&lt;br /&gt;
This functionality is supplied separately from ohMediaPlayer and requires an additional 500KB ROM.&lt;br /&gt;
&lt;br /&gt;
= Source Code =&lt;br /&gt;
ohMediaPlayer is provided in binary form (static library + header files) by default.  Contact us if you want to discuss a license to access the full source code.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that we use a small number of externally sourced, commercially licensed audio codecs.  We could only share the source for these if you negotiate access to them directly with the copyright holders.&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMediaDevelopers</id>
		<title>OhMediaDevelopers</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMediaDevelopers"/>
				<updated>2013-07-12T08:37:50Z</updated>
		
		<summary type="html">&lt;p&gt;Simonc: Add Pins&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Network Services =&lt;br /&gt;
ohMedia defines the following network services:&lt;br /&gt;
* [[Av:Developer:ProductService | Product]].  The core of a renderer and the only mandatory service.  The state of this service allows control points to infer which other services are present on a device.  In more complex installations it allows devices to mapped into a multi-room hi-fi system&lt;br /&gt;
* [[Av:Developer:PlaylistService | Playlist]].  An ordered list of tracks to be played.&lt;br /&gt;
* [[Av:Developer:RadioService | Radio]].  Browse and select from a list of favourite internet radio, podcast and listen again presets.&lt;br /&gt;
* [[Av:Developer:InfoService | Info]].  Report information about currently playing track.&lt;br /&gt;
* [[Av:Developer:TimeService | Time]].  Report information about progress through a track.&lt;br /&gt;
* [[Av:Developer:VolumeService | Volume]].  Control volume on a renderer or a connected pre-amp.&lt;br /&gt;
* [[Av:Developer:TransportService | Transport]].  Source-independent transport controls.&lt;br /&gt;
* [[Av:Developer:SenderService | Sender]].  Indicate presence and state of a Songcast sender.&lt;br /&gt;
* [[Av:Developer:ReceiverService | Receiver]].  Control a Songcast receiver.&lt;br /&gt;
* [[Av:Developer:CredentialsService | Credentials]].  Securely manage login details for external services supported by a device.&lt;br /&gt;
* [[Av:Developer:PinsService | Pins]].  Quick access to smart presets, supporting dynamic content.&lt;br /&gt;
* NetworkMonitor.  Measures network performance.&lt;br /&gt;
* [[Av:Developer:PlaylistManagerService | PlaylistManager]].  Included in media servers.  Allows playlists to be shared between renderers and saved for future reuse.&lt;br /&gt;
&lt;br /&gt;
The [[Av:Developer:EriskayServices | Eriskay]] family of services will later replace these.  Feedback on Eriskay is welcomed.&lt;br /&gt;
&lt;br /&gt;
= UPnP =&lt;br /&gt;
All ohMedia products publish and/or consume network services using UPnP.  This is enabled by [[OhNet | ohNet]] - a cross-platform UPnP stack suitable for use in control points and devices.  ohNet is open source, liberally licensed and intended for use in external products.&lt;br /&gt;
&lt;br /&gt;
= ODP =&lt;br /&gt;
[[Av:Developer:Odp | OpenHome Device Protocol]] (ODP) allows control of and evented updates from a device via a single socket.  [https://github.com/openhome/ohPipeline ohPipeline] contains [https://github.com/openhome/ohPipeline/tree/master/OpenHome/Net/Odp reference code] for control point or device stacks.&lt;br /&gt;
&lt;br /&gt;
All services that are available using over UPnP are also available using ODP.  The same auto-generated 'proxies' allow control point authors to invoke an action as a single function call and register callbacks to be informed of evented updates.&lt;br /&gt;
&lt;br /&gt;
= Songcast =&lt;br /&gt;
The Songcast brand encompasses a range of products and protocols.&lt;br /&gt;
&lt;br /&gt;
== Desktop senders ==&lt;br /&gt;
Virtual audio drivers that send all audio from a Windows or Mac device to a songcast receiver.  [https://www.linn.co.uk/software#songcast Linn] provide a full implementation of these.  The bulk of the code required is also available in the [https://github.com/openhome/ohSongcast ohSongcast] repo.&lt;br /&gt;
&lt;br /&gt;
== Multi-room ==&lt;br /&gt;
The Songcast protocol enables synchronised playing of audio from an unbounded number of ohMedia renderers.&lt;br /&gt;
&lt;br /&gt;
The [https://github.com/openhome/ohSongcast ohSongcast] repo provides a cross-platform C++ library offering much of the code needed to write a stand-alone songcast sender.  The [https://github.com/openhome/ohPipeline ohPipeline] repo contains a reference sender and receiver fully integrated to the OpenHome reference audio pipeline.&lt;br /&gt;
&lt;br /&gt;
The Songcast protocols are also documented:&lt;br /&gt;
* [[Av:Developer:Songcast:Ohm | OHM/OHU protocol specification]]&lt;br /&gt;
* [[Av:Developer:Songcast:Ohz | OHZ protocol specification]]&lt;br /&gt;
&lt;br /&gt;
== Direct ==&lt;br /&gt;
A specialised protocol, offering simpler integration and potentially higher audio quality, used when there is a single receiver and the sender has control over the rate of streaming (this often means that the sender is responsible for audio decode).&lt;br /&gt;
&lt;br /&gt;
More information, including protocol spec and sample code is available [[Av:Developer:Scd | here]].&lt;br /&gt;
&lt;br /&gt;
= Topology =&lt;br /&gt;
ohMedia models a home as a number of hi-fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
A hi-fi system is modelled as a hierarchical tree of products, where a product is defined as a single physical box that is located in a room, has a unique name within the room, has at least one output and any number of inputs.&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the [[Av:Developer:ProductService | Product]] service specification.&lt;br /&gt;
&lt;br /&gt;
When a control point wants to construct a model of a user's home they use the Topology algorithm:&lt;br /&gt;
* discover all the products in the home that have a Product service&lt;br /&gt;
* group the discovered products based on the room they are in&lt;br /&gt;
* create a hierarchical tree structure by matching source names to product names *&lt;br /&gt;
* discover source functionality based on source type&lt;br /&gt;
* discover additional functionality based on product attributes&lt;br /&gt;
Example implementations of the Topology algorithm are available in C# and C++ from the [https://github.com/openhome/ohTopology ohTopology] github repo.&lt;br /&gt;
&lt;br /&gt;
A more detailed description of the ohTopology software can be found [[Av:Developer:ohTopologyDescription | here]].&lt;br /&gt;
&lt;br /&gt;
= Streaming Services =&lt;br /&gt;
Both Linn's DS  and [[OhMediaPlayer | ohMediaPlayer]] include reference implementations for the following streaming services:&lt;br /&gt;
* [[TidalStreamingService | Tidal]]&lt;br /&gt;
* [[QobuzStreamingService | Qobuz]]&lt;br /&gt;
* [[CalmRadioInternetRadio | Calm Radio]]&lt;/div&gt;</summary>
		<author><name>Simonc</name></author>	</entry>

	</feed>