<?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;target=Davidd&amp;title=Special%3AContributions%2FDavidd</id>
		<title>OpenHome - User contributions [en]</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.openhome.org/mediawiki/index.php?feed=atom&amp;target=Davidd&amp;title=Special%3AContributions%2FDavidd"/>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Special:Contributions/Davidd"/>
		<updated>2026-05-22T02:59:18Z</updated>
		<subtitle>From OpenHome</subtitle>
		<generator>MediaWiki 1.16.2</generator>

	<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>2015-02-17T13:10:15Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* Network Services */&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: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;
* 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;
= 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;
= Songcast =&lt;br /&gt;
Songcast enables synchronised playing of audio from an unbounded number of ohMedia renderers.  Audio can be sent from an ohMedia renderer or from a desktop computer using the Songcast application.&lt;br /&gt;
&lt;br /&gt;
The [https://github.com/openhome/ohSongcast ohSongcast] github repo provides a cross-platform C++ library offering much of the code needed to write a songcast sender.&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;
= 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 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;/div&gt;</summary>
		<author><name>Davidd</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>2015-02-17T13:09:18Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* Network Services */&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: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:NetworkMonitorService | 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;
= 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;
= Songcast =&lt;br /&gt;
Songcast enables synchronised playing of audio from an unbounded number of ohMedia renderers.  Audio can be sent from an ohMedia renderer or from a desktop computer using the Songcast application.&lt;br /&gt;
&lt;br /&gt;
The [https://github.com/openhome/ohSongcast ohSongcast] github repo provides a cross-platform C++ library offering much of the code needed to write a songcast sender.&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;
= 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 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;/div&gt;</summary>
		<author><name>Davidd</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>2015-01-09T11:31:09Z</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>Davidd</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-12-03T17:04:21Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PublicKey */&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.  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 teh 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_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;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_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;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_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>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ProductService</id>
		<title>Av:Developer:ProductService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ProductService"/>
				<updated>2014-06-16T12:24:35Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* SourceXml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Product service contains a summary of a single product’s capabilities.  Control points should begin their interaction with an av.openhome device by searching for the &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; service.  Presence of various other services can be inferred from the sources and attributes this reports.&lt;br /&gt;
&lt;br /&gt;
= State Variables =&lt;br /&gt;
== Sources ==&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
The number of available sources.  Must be greater than 0.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== SourceIndex ===&lt;br /&gt;
The index of the currently active source.  This is zero-based so will be in the range &amp;lt;tt&amp;gt;[0..SourceCount-1]&amp;lt;/tt&amp;gt;&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Returns a summary of all sources in the form&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SourceList&amp;gt;&lt;br /&gt;
    &amp;lt;Source&amp;gt;&lt;br /&gt;
        &amp;lt;Name&amp;gt;[user name for source]&amp;lt;/Name&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;[Type of the source.  Read-only. See below for supported types]&amp;lt;/Type&amp;gt;&lt;br /&gt;
        &amp;lt;Visible&amp;gt;[Boolean.  Whether control points should display source]&amp;lt;/Visible&amp;gt;&lt;br /&gt;
    &amp;lt;/sourcetag&amp;gt;&lt;br /&gt;
&amp;lt;/SourceList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supported values for source Type are,&lt;br /&gt;
&lt;br /&gt;
 - Playlist - the av.openhome.org:Playlist:1 service must be available&lt;br /&gt;
 - Radio - the av.openhome.org:Radio:1 service must be available&lt;br /&gt;
 - Receiver - the av.openhome.org:Receiver:1 service must be available&lt;br /&gt;
 - UpnpAv - the upnp.org:MediaRenderer:1 device must be available&lt;br /&gt;
 - NetAux - Specifies 3rd party, non OpenHome controllable, network protocols such as AirPlay&lt;br /&gt;
 - Analog - Specifies an analog external input&lt;br /&gt;
 - Digital - Specifies a digital external input&lt;br /&gt;
 - Hdmi - Specifies a HDMI external input&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&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 for searching for each of these in turn.  Supported values for attributes include&lt;br /&gt;
 - Info – the av.openhome.org:Info:1 service must be available&lt;br /&gt;
 - Time – the av.openhome.org:Time:1 service must be available&lt;br /&gt;
 - Volume – the av.openhome.org:Volume:1 service must be available&lt;br /&gt;
 - Sender - the av.openhome.org:Sender:1 service must be available&lt;br /&gt;
 - App:Config=[link] – web UI for device configuration must be available at the url [link]&lt;br /&gt;
&lt;br /&gt;
=== ManufacturerImageUri ===&lt;br /&gt;
Uri for manufacturer’s logo.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerInfo ===&lt;br /&gt;
Manufacturer information.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerName ===&lt;br /&gt;
Manufacturer name.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerUrl ===&lt;br /&gt;
URL for manufacturer web site.  Does not vary at run-time.&lt;br /&gt;
=== ModelImageUri ===&lt;br /&gt;
Uri for model’s icon.  Does not vary at run-time.&lt;br /&gt;
=== ModelInfo ===&lt;br /&gt;
Model information.  Does not vary at run-time.&lt;br /&gt;
=== ModelName ===&lt;br /&gt;
Model name.  Does not vary at run-time.&lt;br /&gt;
=== ModelUrl ===&lt;br /&gt;
URL for model web site.  Does not vary at run-time.&lt;br /&gt;
=== ProductImageUri ===&lt;br /&gt;
Uri for product image.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== ProductInfo ===&lt;br /&gt;
Product information.  Does not vary at run-time.&lt;br /&gt;
=== ProductName ===&lt;br /&gt;
User-visible product name.  By default this is set to &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;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;
=== ProductRoom ===&lt;br /&gt;
The name of the room where the Product is located.  Set to “Main Room” by default.&lt;br /&gt;
&amp;lt;br&amp;gt;ProductRoom 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;ProductRoom&amp;lt;/tt&amp;gt; name.&lt;br /&gt;
&lt;br /&gt;
=== ProductUrl ===&lt;br /&gt;
URL for product web site.  This may be the UPnP presentation page.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
The standby state of a product (true =&amp;gt; standby enabled)&lt;br /&gt;
&amp;lt;br&amp;gt;Behaviour when &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; is enabled is implementation defined.  Devices can choose whether to remain network-controllable.  If a device is still network-controllable, invoking the &amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt; action on any source must disable &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Sources ==&lt;br /&gt;
The set of available sources does not vary at run-time (although some source attributes may change).  There is always a single source active.  Only the active source will play audio or report state updates.&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
Query the value of the (read-only) SourceCount state variable.&lt;br /&gt;
=== Source ===&lt;br /&gt;
Given the index of a source, query the values of its name, system name, type and visibility.&lt;br /&gt;
=== SetSourceIndex ===&lt;br /&gt;
Set the currently active source.  The value specified is zero-based and used to index into the source list returned by the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
=== SetSourceIndexByName ===&lt;br /&gt;
Set the currently active source.  The value specified is matched against the &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; attributes from the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that this action is deprecated.&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Query the value of the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SourceXmlChangeCount ===&lt;br /&gt;
Query how often the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable has been updated.  This action can be polled by clients that don’t support eventing.  Whenever the value returned increases, the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; has been updated so should be queried again.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ManufacturerName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Model ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Product ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ProductRoom&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductImageUri&amp;lt;/tt&amp;gt; state variables.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SetStandby ===&lt;br /&gt;
Set the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
= Product 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;Manufacturer&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;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;ManufacturerName&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;Info&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;ManufacturerInfo&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;Url&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;ManufacturerUrl&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;ImageUri&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;ManufacturerImageUri&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;Model&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;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;ModelName&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;Info&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;ModelInfo&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;Url&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;ModelUrl&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;ImageUri&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;ModelImageUri&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;Product&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;ProductRoom&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;ProductName&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;Info&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;ProductInfo&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;Url&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;ProductUrl&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;ImageUri&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;ProductImageUri&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;Standby&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;Standby&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;SetStandby&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;Standby&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;SourceCount&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;SourceCount&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;SourceXml&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;SourceXml&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;SourceIndex&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;SourceIndex&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;SetSourceIndex&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;SourceIndex&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;SetSourceIndexByName&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;SourceName&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;Source&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;SourceIndex&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;SystemName&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;SourceName&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;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SourceType&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;SourceName&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;Visible&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;SourceVisible&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;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;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;SourceXmlChangeCount&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;SourceXmlChangeCount&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;ManufacturerName&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;ManufacturerInfo&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;ManufacturerUrl&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;ManufacturerImageUri&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;ModelName&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;ModelInfo&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;ModelUrl&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;ModelImageUri&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;ProductRoom&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;ProductName&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;ProductInfo&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;ProductUrl&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;ProductImageUri&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;Standby&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;SourceIndex&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;SourceCount&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;SourceXml&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;SourceXmlChangeCount&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;SourceType&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;SourceName&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;SourceVisible&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>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ProductService</id>
		<title>Av:Developer:ProductService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ProductService"/>
				<updated>2014-06-16T12:16:53Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* SourceCount */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Product service contains a summary of a single product’s capabilities.  Control points should begin their interaction with an av.openhome device by searching for the &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; service.  Presence of various other services can be inferred from the sources and attributes this reports.&lt;br /&gt;
&lt;br /&gt;
= State Variables =&lt;br /&gt;
== Sources ==&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
The number of available sources.  Must be greater than 0.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== SourceIndex ===&lt;br /&gt;
The index of the currently active source.  This is zero-based so will be in the range &amp;lt;tt&amp;gt;[0..SourceCount-1]&amp;lt;/tt&amp;gt;&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Returns a summary of all sources in the form&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SourceList&amp;gt;&lt;br /&gt;
    &amp;lt;Source&amp;gt;&lt;br /&gt;
        &amp;lt;Name&amp;gt;[user name for source]&amp;lt;/Name&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;[Type of the source.  Read-only. See below for supported types]&amp;lt;/Type&amp;gt;&lt;br /&gt;
        &amp;lt;Visible&amp;gt;[Boolean.  Whether control points should display source]&amp;lt;/Visible&amp;gt;&lt;br /&gt;
    &amp;lt;/sourcetag&amp;gt;&lt;br /&gt;
&amp;lt;/SourceList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supported values for source Type are,&lt;br /&gt;
&lt;br /&gt;
 - Playlist - the av.openhome.org:Playlist:1 service must be available&lt;br /&gt;
 - Radio - the av.openhome.org:Radio:1 service must be available&lt;br /&gt;
 - Receiver - the av.openhome.org:Receiver:1 service must be available&lt;br /&gt;
 - UpnpAv - the upnp.org:MediaRenderer:1 device must be available&lt;br /&gt;
 - NetAux - Specifies 3rd party, non UPnP controllable, network protocols such as AirPlay&lt;br /&gt;
 - Analog - Specifies an analog external input&lt;br /&gt;
 - Digital - Specifies a digital external input&lt;br /&gt;
 - Hdmi - Specifies a HDMI external input&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&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 for searching for each of these in turn.  Supported values for attributes include&lt;br /&gt;
 - Info – the av.openhome.org:Info:1 service must be available&lt;br /&gt;
 - Time – the av.openhome.org:Time:1 service must be available&lt;br /&gt;
 - Volume – the av.openhome.org:Volume:1 service must be available&lt;br /&gt;
 - Sender - the av.openhome.org:Sender:1 service must be available&lt;br /&gt;
 - App:Config=[link] – web UI for device configuration must be available at the url [link]&lt;br /&gt;
&lt;br /&gt;
=== ManufacturerImageUri ===&lt;br /&gt;
Uri for manufacturer’s logo.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerInfo ===&lt;br /&gt;
Manufacturer information.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerName ===&lt;br /&gt;
Manufacturer name.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerUrl ===&lt;br /&gt;
URL for manufacturer web site.  Does not vary at run-time.&lt;br /&gt;
=== ModelImageUri ===&lt;br /&gt;
Uri for model’s icon.  Does not vary at run-time.&lt;br /&gt;
=== ModelInfo ===&lt;br /&gt;
Model information.  Does not vary at run-time.&lt;br /&gt;
=== ModelName ===&lt;br /&gt;
Model name.  Does not vary at run-time.&lt;br /&gt;
=== ModelUrl ===&lt;br /&gt;
URL for model web site.  Does not vary at run-time.&lt;br /&gt;
=== ProductImageUri ===&lt;br /&gt;
Uri for product image.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== ProductInfo ===&lt;br /&gt;
Product information.  Does not vary at run-time.&lt;br /&gt;
=== ProductName ===&lt;br /&gt;
User-visible product name.  By default this is set to &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;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;
=== ProductRoom ===&lt;br /&gt;
The name of the room where the Product is located.  Set to “Main Room” by default.&lt;br /&gt;
&amp;lt;br&amp;gt;ProductRoom 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;ProductRoom&amp;lt;/tt&amp;gt; name.&lt;br /&gt;
&lt;br /&gt;
=== ProductUrl ===&lt;br /&gt;
URL for product web site.  This may be the UPnP presentation page.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
The standby state of a product (true =&amp;gt; standby enabled)&lt;br /&gt;
&amp;lt;br&amp;gt;Behaviour when &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; is enabled is implementation defined.  Devices can choose whether to remain network-controllable.  If a device is still network-controllable, invoking the &amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt; action on any source must disable &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Sources ==&lt;br /&gt;
The set of available sources does not vary at run-time (although some source attributes may change).  There is always a single source active.  Only the active source will play audio or report state updates.&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
Query the value of the (read-only) SourceCount state variable.&lt;br /&gt;
=== Source ===&lt;br /&gt;
Given the index of a source, query the values of its name, system name, type and visibility.&lt;br /&gt;
=== SetSourceIndex ===&lt;br /&gt;
Set the currently active source.  The value specified is zero-based and used to index into the source list returned by the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
=== SetSourceIndexByName ===&lt;br /&gt;
Set the currently active source.  The value specified is matched against the &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; attributes from the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that this action is deprecated.&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Query the value of the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SourceXmlChangeCount ===&lt;br /&gt;
Query how often the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable has been updated.  This action can be polled by clients that don’t support eventing.  Whenever the value returned increases, the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; has been updated so should be queried again.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ManufacturerName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Model ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Product ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ProductRoom&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductImageUri&amp;lt;/tt&amp;gt; state variables.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SetStandby ===&lt;br /&gt;
Set the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
= Product 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;Manufacturer&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;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;ManufacturerName&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;Info&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;ManufacturerInfo&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;Url&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;ManufacturerUrl&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;ImageUri&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;ManufacturerImageUri&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;Model&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;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;ModelName&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;Info&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;ModelInfo&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;Url&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;ModelUrl&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;ImageUri&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;ModelImageUri&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;Product&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;ProductRoom&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;ProductName&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;Info&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;ProductInfo&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;Url&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;ProductUrl&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;ImageUri&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;ProductImageUri&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;Standby&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;Standby&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;SetStandby&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;Standby&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;SourceCount&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;SourceCount&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;SourceXml&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;SourceXml&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;SourceIndex&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;SourceIndex&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;SetSourceIndex&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;SourceIndex&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;SetSourceIndexByName&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;SourceName&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;Source&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;SourceIndex&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;SystemName&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;SourceName&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;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SourceType&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;SourceName&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;Visible&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;SourceVisible&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;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;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;SourceXmlChangeCount&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;SourceXmlChangeCount&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;ManufacturerName&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;ManufacturerInfo&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;ManufacturerUrl&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;ManufacturerImageUri&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;ModelName&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;ModelInfo&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;ModelUrl&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;ModelImageUri&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;ProductRoom&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;ProductName&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;ProductInfo&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;ProductUrl&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;ProductImageUri&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;Standby&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;SourceIndex&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;SourceCount&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;SourceXml&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;SourceXmlChangeCount&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;SourceType&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;SourceName&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;SourceVisible&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>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ProductService</id>
		<title>Av:Developer:ProductService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ProductService"/>
				<updated>2014-06-16T12:16:01Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* SourceXml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Product service contains a summary of a single product’s capabilities.  Control points should begin their interaction with an av.openhome device by searching for the &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; service.  Presence of various other services can be inferred from the sources and attributes this reports.&lt;br /&gt;
&lt;br /&gt;
= State Variables =&lt;br /&gt;
== Sources ==&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
The number of available sources.  Does not vary at run-time.&lt;br /&gt;
=== SourceIndex ===&lt;br /&gt;
The index of the currently active source.  This is zero-based so will be in the range &amp;lt;tt&amp;gt;[0..SourceCount-1]&amp;lt;/tt&amp;gt;&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Returns a summary of all sources in the form&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SourceList&amp;gt;&lt;br /&gt;
    &amp;lt;Source&amp;gt;&lt;br /&gt;
        &amp;lt;Name&amp;gt;[user name for source]&amp;lt;/Name&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;[Type of the source.  Read-only. See below for supported types]&amp;lt;/Type&amp;gt;&lt;br /&gt;
        &amp;lt;Visible&amp;gt;[Boolean.  Whether control points should display source]&amp;lt;/Visible&amp;gt;&lt;br /&gt;
    &amp;lt;/sourcetag&amp;gt;&lt;br /&gt;
&amp;lt;/SourceList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supported values for source Type are,&lt;br /&gt;
&lt;br /&gt;
 - Playlist - the av.openhome.org:Playlist:1 service must be available&lt;br /&gt;
 - Radio - the av.openhome.org:Radio:1 service must be available&lt;br /&gt;
 - Receiver - the av.openhome.org:Receiver:1 service must be available&lt;br /&gt;
 - UpnpAv - the upnp.org:MediaRenderer:1 device must be available&lt;br /&gt;
 - NetAux - Specifies 3rd party, non UPnP controllable, network protocols such as AirPlay&lt;br /&gt;
 - Analog - Specifies an analog external input&lt;br /&gt;
 - Digital - Specifies a digital external input&lt;br /&gt;
 - Hdmi - Specifies a HDMI external input&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&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 for searching for each of these in turn.  Supported values for attributes include&lt;br /&gt;
 - Info – the av.openhome.org:Info:1 service must be available&lt;br /&gt;
 - Time – the av.openhome.org:Time:1 service must be available&lt;br /&gt;
 - Volume – the av.openhome.org:Volume:1 service must be available&lt;br /&gt;
 - Sender - the av.openhome.org:Sender:1 service must be available&lt;br /&gt;
 - App:Config=[link] – web UI for device configuration must be available at the url [link]&lt;br /&gt;
&lt;br /&gt;
=== ManufacturerImageUri ===&lt;br /&gt;
Uri for manufacturer’s logo.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerInfo ===&lt;br /&gt;
Manufacturer information.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerName ===&lt;br /&gt;
Manufacturer name.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerUrl ===&lt;br /&gt;
URL for manufacturer web site.  Does not vary at run-time.&lt;br /&gt;
=== ModelImageUri ===&lt;br /&gt;
Uri for model’s icon.  Does not vary at run-time.&lt;br /&gt;
=== ModelInfo ===&lt;br /&gt;
Model information.  Does not vary at run-time.&lt;br /&gt;
=== ModelName ===&lt;br /&gt;
Model name.  Does not vary at run-time.&lt;br /&gt;
=== ModelUrl ===&lt;br /&gt;
URL for model web site.  Does not vary at run-time.&lt;br /&gt;
=== ProductImageUri ===&lt;br /&gt;
Uri for product image.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== ProductInfo ===&lt;br /&gt;
Product information.  Does not vary at run-time.&lt;br /&gt;
=== ProductName ===&lt;br /&gt;
User-visible product name.  By default this is set to &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;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;
=== ProductRoom ===&lt;br /&gt;
The name of the room where the Product is located.  Set to “Main Room” by default.&lt;br /&gt;
&amp;lt;br&amp;gt;ProductRoom 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;ProductRoom&amp;lt;/tt&amp;gt; name.&lt;br /&gt;
&lt;br /&gt;
=== ProductUrl ===&lt;br /&gt;
URL for product web site.  This may be the UPnP presentation page.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
The standby state of a product (true =&amp;gt; standby enabled)&lt;br /&gt;
&amp;lt;br&amp;gt;Behaviour when &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; is enabled is implementation defined.  Devices can choose whether to remain network-controllable.  If a device is still network-controllable, invoking the &amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt; action on any source must disable &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Sources ==&lt;br /&gt;
The set of available sources does not vary at run-time (although some source attributes may change).  There is always a single source active.  Only the active source will play audio or report state updates.&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
Query the value of the (read-only) SourceCount state variable.&lt;br /&gt;
=== Source ===&lt;br /&gt;
Given the index of a source, query the values of its name, system name, type and visibility.&lt;br /&gt;
=== SetSourceIndex ===&lt;br /&gt;
Set the currently active source.  The value specified is zero-based and used to index into the source list returned by the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
=== SetSourceIndexByName ===&lt;br /&gt;
Set the currently active source.  The value specified is matched against the &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; attributes from the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that this action is deprecated.&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Query the value of the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SourceXmlChangeCount ===&lt;br /&gt;
Query how often the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable has been updated.  This action can be polled by clients that don’t support eventing.  Whenever the value returned increases, the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; has been updated so should be queried again.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ManufacturerName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Model ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Product ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ProductRoom&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductImageUri&amp;lt;/tt&amp;gt; state variables.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SetStandby ===&lt;br /&gt;
Set the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
= Product 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;Manufacturer&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;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;ManufacturerName&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;Info&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;ManufacturerInfo&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;Url&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;ManufacturerUrl&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;ImageUri&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;ManufacturerImageUri&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;Model&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;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;ModelName&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;Info&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;ModelInfo&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;Url&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;ModelUrl&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;ImageUri&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;ModelImageUri&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;Product&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;ProductRoom&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;ProductName&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;Info&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;ProductInfo&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;Url&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;ProductUrl&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;ImageUri&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;ProductImageUri&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;Standby&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;Standby&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;SetStandby&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;Standby&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;SourceCount&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;SourceCount&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;SourceXml&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;SourceXml&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;SourceIndex&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;SourceIndex&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;SetSourceIndex&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;SourceIndex&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;SetSourceIndexByName&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;SourceName&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;Source&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;SourceIndex&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;SystemName&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;SourceName&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;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SourceType&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;SourceName&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;Visible&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;SourceVisible&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;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;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;SourceXmlChangeCount&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;SourceXmlChangeCount&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;ManufacturerName&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;ManufacturerInfo&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;ManufacturerUrl&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;ManufacturerImageUri&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;ModelName&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;ModelInfo&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;ModelUrl&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;ModelImageUri&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;ProductRoom&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;ProductName&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;ProductInfo&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;ProductUrl&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;ProductImageUri&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;Standby&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;SourceIndex&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;SourceCount&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;SourceXml&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;SourceXmlChangeCount&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;SourceType&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;SourceName&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;SourceVisible&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>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ProductService</id>
		<title>Av:Developer:ProductService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ProductService"/>
				<updated>2014-06-16T12:14:21Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* SourceXml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Product service contains a summary of a single product’s capabilities.  Control points should begin their interaction with an av.openhome device by searching for the &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; service.  Presence of various other services can be inferred from the sources and attributes this reports.&lt;br /&gt;
&lt;br /&gt;
= State Variables =&lt;br /&gt;
== Sources ==&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
The number of available sources.  Does not vary at run-time.&lt;br /&gt;
=== SourceIndex ===&lt;br /&gt;
The index of the currently active source.  This is zero-based so will be in the range &amp;lt;tt&amp;gt;[0..SourceCount-1]&amp;lt;/tt&amp;gt;&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Returns a summary of all sources in the form&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SourceList&amp;gt;&lt;br /&gt;
    &amp;lt;Source&amp;gt;&lt;br /&gt;
        &amp;lt;Name&amp;gt;[user name for source]&amp;lt;/Name&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;[Type of the source.  Read-only. See below for supported types]&amp;lt;/Type&amp;gt;&lt;br /&gt;
        &amp;lt;Visible&amp;gt;[Boolean.  Whether control points should display source]&amp;lt;/Visible&amp;gt;&lt;br /&gt;
    &amp;lt;/sourcetag&amp;gt;&lt;br /&gt;
&amp;lt;/SourceList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supported values for source Type are,&lt;br /&gt;
&lt;br /&gt;
 - Playlist - the av.openhome.org:Playlist:1 service must be available&lt;br /&gt;
 - Radio - the av.openhome.org:Radio:1 service must be available&lt;br /&gt;
 - Receiver - the av.openhome.org:Receiver:1 service must be available&lt;br /&gt;
 - UpnpAv - the upnp.org:AVTransport:1, upnp.org:RenderingControl:1, and upnp.org:ConnectionManager:1 services must be available&lt;br /&gt;
 - NetAux - used for non UPnP network protocols such as AirPlay&lt;br /&gt;
 - Analog - Specifies an analog external input&lt;br /&gt;
 - Digital - Specifies a digital external input&lt;br /&gt;
 - Hdmi - Specifies a HDMI external input&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&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 for searching for each of these in turn.  Supported values for attributes include&lt;br /&gt;
 - Info – the av.openhome.org:Info:1 service must be available&lt;br /&gt;
 - Time – the av.openhome.org:Time:1 service must be available&lt;br /&gt;
 - Volume – the av.openhome.org:Volume:1 service must be available&lt;br /&gt;
 - Sender - the av.openhome.org:Sender:1 service must be available&lt;br /&gt;
 - App:Config=[link] – web UI for device configuration must be available at the url [link]&lt;br /&gt;
&lt;br /&gt;
=== ManufacturerImageUri ===&lt;br /&gt;
Uri for manufacturer’s logo.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerInfo ===&lt;br /&gt;
Manufacturer information.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerName ===&lt;br /&gt;
Manufacturer name.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerUrl ===&lt;br /&gt;
URL for manufacturer web site.  Does not vary at run-time.&lt;br /&gt;
=== ModelImageUri ===&lt;br /&gt;
Uri for model’s icon.  Does not vary at run-time.&lt;br /&gt;
=== ModelInfo ===&lt;br /&gt;
Model information.  Does not vary at run-time.&lt;br /&gt;
=== ModelName ===&lt;br /&gt;
Model name.  Does not vary at run-time.&lt;br /&gt;
=== ModelUrl ===&lt;br /&gt;
URL for model web site.  Does not vary at run-time.&lt;br /&gt;
=== ProductImageUri ===&lt;br /&gt;
Uri for product image.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== ProductInfo ===&lt;br /&gt;
Product information.  Does not vary at run-time.&lt;br /&gt;
=== ProductName ===&lt;br /&gt;
User-visible product name.  By default this is set to &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;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;
=== ProductRoom ===&lt;br /&gt;
The name of the room where the Product is located.  Set to “Main Room” by default.&lt;br /&gt;
&amp;lt;br&amp;gt;ProductRoom 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;ProductRoom&amp;lt;/tt&amp;gt; name.&lt;br /&gt;
&lt;br /&gt;
=== ProductUrl ===&lt;br /&gt;
URL for product web site.  This may be the UPnP presentation page.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
The standby state of a product (true =&amp;gt; standby enabled)&lt;br /&gt;
&amp;lt;br&amp;gt;Behaviour when &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; is enabled is implementation defined.  Devices can choose whether to remain network-controllable.  If a device is still network-controllable, invoking the &amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt; action on any source must disable &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Sources ==&lt;br /&gt;
The set of available sources does not vary at run-time (although some source attributes may change).  There is always a single source active.  Only the active source will play audio or report state updates.&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
Query the value of the (read-only) SourceCount state variable.&lt;br /&gt;
=== Source ===&lt;br /&gt;
Given the index of a source, query the values of its name, system name, type and visibility.&lt;br /&gt;
=== SetSourceIndex ===&lt;br /&gt;
Set the currently active source.  The value specified is zero-based and used to index into the source list returned by the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
=== SetSourceIndexByName ===&lt;br /&gt;
Set the currently active source.  The value specified is matched against the &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; attributes from the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that this action is deprecated.&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Query the value of the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SourceXmlChangeCount ===&lt;br /&gt;
Query how often the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable has been updated.  This action can be polled by clients that don’t support eventing.  Whenever the value returned increases, the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; has been updated so should be queried again.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ManufacturerName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Model ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Product ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ProductRoom&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductImageUri&amp;lt;/tt&amp;gt; state variables.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SetStandby ===&lt;br /&gt;
Set the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
= Product 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;Manufacturer&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;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;ManufacturerName&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;Info&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;ManufacturerInfo&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;Url&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;ManufacturerUrl&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;ImageUri&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;ManufacturerImageUri&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;Model&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;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;ModelName&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;Info&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;ModelInfo&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;Url&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;ModelUrl&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;ImageUri&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;ModelImageUri&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;Product&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;ProductRoom&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;ProductName&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;Info&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;ProductInfo&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;Url&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;ProductUrl&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;ImageUri&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;ProductImageUri&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;Standby&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;Standby&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;SetStandby&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;Standby&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;SourceCount&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;SourceCount&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;SourceXml&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;SourceXml&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;SourceIndex&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;SourceIndex&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;SetSourceIndex&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;SourceIndex&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;SetSourceIndexByName&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;SourceName&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;Source&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;SourceIndex&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;SystemName&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;SourceName&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;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SourceType&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;SourceName&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;Visible&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;SourceVisible&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;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;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;SourceXmlChangeCount&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;SourceXmlChangeCount&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;ManufacturerName&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;ManufacturerInfo&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;ManufacturerUrl&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;ManufacturerImageUri&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;ModelName&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;ModelInfo&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;ModelUrl&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;ModelImageUri&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;ProductRoom&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;ProductName&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;ProductInfo&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;ProductUrl&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;ProductImageUri&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;Standby&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;SourceIndex&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;SourceCount&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;SourceXml&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;SourceXmlChangeCount&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;SourceType&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;SourceName&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;SourceVisible&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>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ProductService</id>
		<title>Av:Developer:ProductService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ProductService"/>
				<updated>2014-06-16T12:13:33Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* SourceXml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Product service contains a summary of a single product’s capabilities.  Control points should begin their interaction with an av.openhome device by searching for the &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; service.  Presence of various other services can be inferred from the sources and attributes this reports.&lt;br /&gt;
&lt;br /&gt;
= State Variables =&lt;br /&gt;
== Sources ==&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
The number of available sources.  Does not vary at run-time.&lt;br /&gt;
=== SourceIndex ===&lt;br /&gt;
The index of the currently active source.  This is zero-based so will be in the range &amp;lt;tt&amp;gt;[0..SourceCount-1]&amp;lt;/tt&amp;gt;&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Returns a summary of all sources in the form&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SourceList&amp;gt;&lt;br /&gt;
    &amp;lt;Source&amp;gt;&lt;br /&gt;
        &amp;lt;Name&amp;gt;[user name for source]&amp;lt;/Name&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;[Type of the source.  Read-only. See below for supported types]&amp;lt;/Type&amp;gt;&lt;br /&gt;
        &amp;lt;Visible&amp;gt;[Boolean.  Whether control points should display source]&amp;lt;/Visible&amp;gt;&lt;br /&gt;
    &amp;lt;/sourcetag&amp;gt;&lt;br /&gt;
&amp;lt;/SourceList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supported values for source Type are,&lt;br /&gt;
&lt;br /&gt;
- Playlist - the av.openhome.org:Playlist:1 service must be available&lt;br /&gt;
- Radio - the av.openhome.org:Radio:1 service must be available&lt;br /&gt;
- Receiver - the av.openhome.org:Receiver:1 service must be available&lt;br /&gt;
- UpnpAv - the upnp.org:AVTransport:1, upnp.org:RenderingControl:1, and upnp.org:ConnectionManager:1 services must be available&lt;br /&gt;
* &amp;lt;tt&amp;gt;NetAux&amp;lt;/tt&amp;gt; - used for non UPnP network protocols such as AirPlay&lt;br /&gt;
* &amp;lt;tt&amp;gt;Analog&amp;lt;/tt&amp;gt; - no control. Specifies an analog external input&lt;br /&gt;
* &amp;lt;tt&amp;gt;Digital&amp;lt;/tt&amp;gt; - no control. Specifies a digital external input&lt;br /&gt;
* &amp;lt;tt&amp;gt;Hdmi&amp;lt;/tt&amp;gt; - no control. Specifies a HDMI external input&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&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 for searching for each of these in turn.  Supported values for attributes include&lt;br /&gt;
 - Info – the av.openhome.org:Info:1 service must be available&lt;br /&gt;
 - Time – the av.openhome.org:Time:1 service must be available&lt;br /&gt;
 - Volume – the av.openhome.org:Volume:1 service must be available&lt;br /&gt;
 - Sender - the av.openhome.org:Sender:1 service must be available&lt;br /&gt;
 - App:Config=[link] – web UI for device configuration must be available at the url [link]&lt;br /&gt;
&lt;br /&gt;
=== ManufacturerImageUri ===&lt;br /&gt;
Uri for manufacturer’s logo.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerInfo ===&lt;br /&gt;
Manufacturer information.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerName ===&lt;br /&gt;
Manufacturer name.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerUrl ===&lt;br /&gt;
URL for manufacturer web site.  Does not vary at run-time.&lt;br /&gt;
=== ModelImageUri ===&lt;br /&gt;
Uri for model’s icon.  Does not vary at run-time.&lt;br /&gt;
=== ModelInfo ===&lt;br /&gt;
Model information.  Does not vary at run-time.&lt;br /&gt;
=== ModelName ===&lt;br /&gt;
Model name.  Does not vary at run-time.&lt;br /&gt;
=== ModelUrl ===&lt;br /&gt;
URL for model web site.  Does not vary at run-time.&lt;br /&gt;
=== ProductImageUri ===&lt;br /&gt;
Uri for product image.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== ProductInfo ===&lt;br /&gt;
Product information.  Does not vary at run-time.&lt;br /&gt;
=== ProductName ===&lt;br /&gt;
User-visible product name.  By default this is set to &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;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;
=== ProductRoom ===&lt;br /&gt;
The name of the room where the Product is located.  Set to “Main Room” by default.&lt;br /&gt;
&amp;lt;br&amp;gt;ProductRoom 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;ProductRoom&amp;lt;/tt&amp;gt; name.&lt;br /&gt;
&lt;br /&gt;
=== ProductUrl ===&lt;br /&gt;
URL for product web site.  This may be the UPnP presentation page.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
The standby state of a product (true =&amp;gt; standby enabled)&lt;br /&gt;
&amp;lt;br&amp;gt;Behaviour when &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; is enabled is implementation defined.  Devices can choose whether to remain network-controllable.  If a device is still network-controllable, invoking the &amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt; action on any source must disable &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Sources ==&lt;br /&gt;
The set of available sources does not vary at run-time (although some source attributes may change).  There is always a single source active.  Only the active source will play audio or report state updates.&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
Query the value of the (read-only) SourceCount state variable.&lt;br /&gt;
=== Source ===&lt;br /&gt;
Given the index of a source, query the values of its name, system name, type and visibility.&lt;br /&gt;
=== SetSourceIndex ===&lt;br /&gt;
Set the currently active source.  The value specified is zero-based and used to index into the source list returned by the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
=== SetSourceIndexByName ===&lt;br /&gt;
Set the currently active source.  The value specified is matched against the &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; attributes from the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that this action is deprecated.&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Query the value of the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SourceXmlChangeCount ===&lt;br /&gt;
Query how often the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable has been updated.  This action can be polled by clients that don’t support eventing.  Whenever the value returned increases, the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; has been updated so should be queried again.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ManufacturerName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Model ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Product ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ProductRoom&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductImageUri&amp;lt;/tt&amp;gt; state variables.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SetStandby ===&lt;br /&gt;
Set the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
= Product 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;Manufacturer&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;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;ManufacturerName&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;Info&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;ManufacturerInfo&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;Url&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;ManufacturerUrl&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;ImageUri&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;ManufacturerImageUri&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;Model&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;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;ModelName&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;Info&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;ModelInfo&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;Url&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;ModelUrl&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;ImageUri&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;ModelImageUri&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;Product&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;ProductRoom&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;ProductName&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;Info&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;ProductInfo&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;Url&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;ProductUrl&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;ImageUri&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;ProductImageUri&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;Standby&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;Standby&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;SetStandby&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;Standby&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;SourceCount&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;SourceCount&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;SourceXml&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;SourceXml&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;SourceIndex&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;SourceIndex&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;SetSourceIndex&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;SourceIndex&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;SetSourceIndexByName&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;SourceName&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;Source&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;SourceIndex&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;SystemName&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;SourceName&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;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SourceType&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;SourceName&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;Visible&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;SourceVisible&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;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;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;SourceXmlChangeCount&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;SourceXmlChangeCount&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;ManufacturerName&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;ManufacturerInfo&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;ManufacturerUrl&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;ManufacturerImageUri&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;ModelName&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;ModelInfo&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;ModelUrl&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;ModelImageUri&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;ProductRoom&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;ProductName&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;ProductInfo&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;ProductUrl&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;ProductImageUri&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;Standby&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;SourceIndex&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;SourceCount&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;SourceXml&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;SourceXmlChangeCount&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;SourceType&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;SourceName&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;SourceVisible&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>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ProductService</id>
		<title>Av:Developer:ProductService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ProductService"/>
				<updated>2014-06-16T12:10:45Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* SourceXml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Product service contains a summary of a single product’s capabilities.  Control points should begin their interaction with an av.openhome device by searching for the &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; service.  Presence of various other services can be inferred from the sources and attributes this reports.&lt;br /&gt;
&lt;br /&gt;
= State Variables =&lt;br /&gt;
== Sources ==&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
The number of available sources.  Does not vary at run-time.&lt;br /&gt;
=== SourceIndex ===&lt;br /&gt;
The index of the currently active source.  This is zero-based so will be in the range &amp;lt;tt&amp;gt;[0..SourceCount-1]&amp;lt;/tt&amp;gt;&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Returns a summary of all sources in the form&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SourceList&amp;gt;&lt;br /&gt;
    &amp;lt;Source&amp;gt;&lt;br /&gt;
        &amp;lt;Name&amp;gt;[user name for source]&amp;lt;/Name&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;[Type of the source.  Read-only. See below for supported types]&amp;lt;/Type&amp;gt;&lt;br /&gt;
        &amp;lt;Visible&amp;gt;[Boolean.  Whether control points should display source]&amp;lt;/Visible&amp;gt;&lt;br /&gt;
    &amp;lt;/sourcetag&amp;gt;&lt;br /&gt;
&amp;lt;/SourceList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supported values for source Type are,&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;Playlist&amp;lt;/tt&amp;gt; - the av.openhome.org:Playlist:1 service must be present&lt;br /&gt;
* &amp;lt;tt&amp;gt;Radio&amp;lt;/tt&amp;gt; - controlled via the Radio service&lt;br /&gt;
* &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt; - controlled via the Receiver service&lt;br /&gt;
* &amp;lt;tt&amp;gt;UpnpAv&amp;lt;/tt&amp;gt; - controlled via the AVTransport service&lt;br /&gt;
* &amp;lt;tt&amp;gt;NetAux&amp;lt;/tt&amp;gt; - used for non UPnP network protocols such as AirPlay&lt;br /&gt;
* &amp;lt;tt&amp;gt;Analog&amp;lt;/tt&amp;gt; - no control. Specifies an analog external input&lt;br /&gt;
* &amp;lt;tt&amp;gt;Digital&amp;lt;/tt&amp;gt; - no control. Specifies a digital external input&lt;br /&gt;
* &amp;lt;tt&amp;gt;Hdmi&amp;lt;/tt&amp;gt; - no control. Specifies a HDMI external input&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&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 for searching for each of these in turn.  Supported values for attributes include&lt;br /&gt;
 - Info – the av.openhome.org:Info:1 service must be available&lt;br /&gt;
 - Time – the av.openhome.org:Time:1 service must be available&lt;br /&gt;
 - Volume – the av.openhome.org:Volume:1 service must be available&lt;br /&gt;
 - Sender - the av.openhome.org:Sender:1 service must be available&lt;br /&gt;
 - App:Config=[link] – web UI for device configuration must be available at the url [link]&lt;br /&gt;
&lt;br /&gt;
=== ManufacturerImageUri ===&lt;br /&gt;
Uri for manufacturer’s logo.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerInfo ===&lt;br /&gt;
Manufacturer information.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerName ===&lt;br /&gt;
Manufacturer name.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerUrl ===&lt;br /&gt;
URL for manufacturer web site.  Does not vary at run-time.&lt;br /&gt;
=== ModelImageUri ===&lt;br /&gt;
Uri for model’s icon.  Does not vary at run-time.&lt;br /&gt;
=== ModelInfo ===&lt;br /&gt;
Model information.  Does not vary at run-time.&lt;br /&gt;
=== ModelName ===&lt;br /&gt;
Model name.  Does not vary at run-time.&lt;br /&gt;
=== ModelUrl ===&lt;br /&gt;
URL for model web site.  Does not vary at run-time.&lt;br /&gt;
=== ProductImageUri ===&lt;br /&gt;
Uri for product image.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== ProductInfo ===&lt;br /&gt;
Product information.  Does not vary at run-time.&lt;br /&gt;
=== ProductName ===&lt;br /&gt;
User-visible product name.  By default this is set to &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;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;
=== ProductRoom ===&lt;br /&gt;
The name of the room where the Product is located.  Set to “Main Room” by default.&lt;br /&gt;
&amp;lt;br&amp;gt;ProductRoom 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;ProductRoom&amp;lt;/tt&amp;gt; name.&lt;br /&gt;
&lt;br /&gt;
=== ProductUrl ===&lt;br /&gt;
URL for product web site.  This may be the UPnP presentation page.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
The standby state of a product (true =&amp;gt; standby enabled)&lt;br /&gt;
&amp;lt;br&amp;gt;Behaviour when &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; is enabled is implementation defined.  Devices can choose whether to remain network-controllable.  If a device is still network-controllable, invoking the &amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt; action on any source must disable &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Sources ==&lt;br /&gt;
The set of available sources does not vary at run-time (although some source attributes may change).  There is always a single source active.  Only the active source will play audio or report state updates.&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
Query the value of the (read-only) SourceCount state variable.&lt;br /&gt;
=== Source ===&lt;br /&gt;
Given the index of a source, query the values of its name, system name, type and visibility.&lt;br /&gt;
=== SetSourceIndex ===&lt;br /&gt;
Set the currently active source.  The value specified is zero-based and used to index into the source list returned by the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
=== SetSourceIndexByName ===&lt;br /&gt;
Set the currently active source.  The value specified is matched against the &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; attributes from the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that this action is deprecated.&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Query the value of the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SourceXmlChangeCount ===&lt;br /&gt;
Query how often the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable has been updated.  This action can be polled by clients that don’t support eventing.  Whenever the value returned increases, the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; has been updated so should be queried again.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ManufacturerName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Model ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Product ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ProductRoom&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductImageUri&amp;lt;/tt&amp;gt; state variables.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SetStandby ===&lt;br /&gt;
Set the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
= Product 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;Manufacturer&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;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;ManufacturerName&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;Info&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;ManufacturerInfo&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;Url&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;ManufacturerUrl&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;ImageUri&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;ManufacturerImageUri&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;Model&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;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;ModelName&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;Info&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;ModelInfo&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;Url&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;ModelUrl&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;ImageUri&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;ModelImageUri&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;Product&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;ProductRoom&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;ProductName&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;Info&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;ProductInfo&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;Url&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;ProductUrl&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;ImageUri&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;ProductImageUri&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;Standby&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;Standby&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;SetStandby&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;Standby&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;SourceCount&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;SourceCount&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;SourceXml&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;SourceXml&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;SourceIndex&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;SourceIndex&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;SetSourceIndex&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;SourceIndex&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;SetSourceIndexByName&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;SourceName&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;Source&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;SourceIndex&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;SystemName&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;SourceName&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;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SourceType&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;SourceName&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;Visible&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;SourceVisible&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;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;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;SourceXmlChangeCount&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;SourceXmlChangeCount&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;ManufacturerName&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;ManufacturerInfo&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;ManufacturerUrl&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;ManufacturerImageUri&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;ModelName&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;ModelInfo&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;ModelUrl&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;ModelImageUri&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;ProductRoom&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;ProductName&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;ProductInfo&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;ProductUrl&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;ProductImageUri&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;Standby&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;SourceIndex&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;SourceCount&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;SourceXml&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;SourceXmlChangeCount&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;SourceType&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;SourceName&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;SourceVisible&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>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ProductService</id>
		<title>Av:Developer:ProductService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ProductService"/>
				<updated>2014-06-16T12:09:45Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* Attributes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Product service contains a summary of a single product’s capabilities.  Control points should begin their interaction with an av.openhome device by searching for the &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; service.  Presence of various other services can be inferred from the sources and attributes this reports.&lt;br /&gt;
&lt;br /&gt;
= State Variables =&lt;br /&gt;
== Sources ==&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
The number of available sources.  Does not vary at run-time.&lt;br /&gt;
=== SourceIndex ===&lt;br /&gt;
The index of the currently active source.  This is zero-based so will be in the range &amp;lt;tt&amp;gt;[0..SourceCount-1]&amp;lt;/tt&amp;gt;&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Returns a summary of all sources in the form&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SourceList&amp;gt;&lt;br /&gt;
    &amp;lt;Source&amp;gt;&lt;br /&gt;
        &amp;lt;Name&amp;gt;[user name for source]&amp;lt;/Name&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;[Type of the source.  Read-only. See below for supported types]&amp;lt;/Type&amp;gt;&lt;br /&gt;
        &amp;lt;Visible&amp;gt;[Boolean.  Whether control points should display source]&amp;lt;/Visible&amp;gt;&lt;br /&gt;
    &amp;lt;/sourcetag&amp;gt;&lt;br /&gt;
&amp;lt;/SourceList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supported source types are,&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;Playlist&amp;lt;/tt&amp;gt; - controlled via the Playlist service&lt;br /&gt;
* &amp;lt;tt&amp;gt;Radio&amp;lt;/tt&amp;gt; - controlled via the Radio service&lt;br /&gt;
* &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt; - controlled via the Receiver service&lt;br /&gt;
* &amp;lt;tt&amp;gt;UpnpAv&amp;lt;/tt&amp;gt; - controlled via the AVTransport service&lt;br /&gt;
* &amp;lt;tt&amp;gt;NetAux&amp;lt;/tt&amp;gt; - used for non UPnP network protocols such as AirPlay&lt;br /&gt;
* &amp;lt;tt&amp;gt;Analog&amp;lt;/tt&amp;gt; - no control. Specifies an analog external input&lt;br /&gt;
* &amp;lt;tt&amp;gt;Digital&amp;lt;/tt&amp;gt; - no control. Specifies a digital external input&lt;br /&gt;
* &amp;lt;tt&amp;gt;Hdmi&amp;lt;/tt&amp;gt; - no control. Specifies a HDMI external input&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&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 for searching for each of these in turn.  Supported values for attributes include&lt;br /&gt;
 - Info – the av.openhome.org:Info:1 service must be available&lt;br /&gt;
 - Time – the av.openhome.org:Time:1 service must be available&lt;br /&gt;
 - Volume – the av.openhome.org:Volume:1 service must be available&lt;br /&gt;
 - Sender - the av.openhome.org:Sender:1 service must be available&lt;br /&gt;
 - App:Config=[link] – web UI for device configuration must be available at the url [link]&lt;br /&gt;
&lt;br /&gt;
=== ManufacturerImageUri ===&lt;br /&gt;
Uri for manufacturer’s logo.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerInfo ===&lt;br /&gt;
Manufacturer information.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerName ===&lt;br /&gt;
Manufacturer name.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerUrl ===&lt;br /&gt;
URL for manufacturer web site.  Does not vary at run-time.&lt;br /&gt;
=== ModelImageUri ===&lt;br /&gt;
Uri for model’s icon.  Does not vary at run-time.&lt;br /&gt;
=== ModelInfo ===&lt;br /&gt;
Model information.  Does not vary at run-time.&lt;br /&gt;
=== ModelName ===&lt;br /&gt;
Model name.  Does not vary at run-time.&lt;br /&gt;
=== ModelUrl ===&lt;br /&gt;
URL for model web site.  Does not vary at run-time.&lt;br /&gt;
=== ProductImageUri ===&lt;br /&gt;
Uri for product image.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== ProductInfo ===&lt;br /&gt;
Product information.  Does not vary at run-time.&lt;br /&gt;
=== ProductName ===&lt;br /&gt;
User-visible product name.  By default this is set to &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;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;
=== ProductRoom ===&lt;br /&gt;
The name of the room where the Product is located.  Set to “Main Room” by default.&lt;br /&gt;
&amp;lt;br&amp;gt;ProductRoom 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;ProductRoom&amp;lt;/tt&amp;gt; name.&lt;br /&gt;
&lt;br /&gt;
=== ProductUrl ===&lt;br /&gt;
URL for product web site.  This may be the UPnP presentation page.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
The standby state of a product (true =&amp;gt; standby enabled)&lt;br /&gt;
&amp;lt;br&amp;gt;Behaviour when &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; is enabled is implementation defined.  Devices can choose whether to remain network-controllable.  If a device is still network-controllable, invoking the &amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt; action on any source must disable &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Sources ==&lt;br /&gt;
The set of available sources does not vary at run-time (although some source attributes may change).  There is always a single source active.  Only the active source will play audio or report state updates.&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
Query the value of the (read-only) SourceCount state variable.&lt;br /&gt;
=== Source ===&lt;br /&gt;
Given the index of a source, query the values of its name, system name, type and visibility.&lt;br /&gt;
=== SetSourceIndex ===&lt;br /&gt;
Set the currently active source.  The value specified is zero-based and used to index into the source list returned by the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
=== SetSourceIndexByName ===&lt;br /&gt;
Set the currently active source.  The value specified is matched against the &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; attributes from the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that this action is deprecated.&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Query the value of the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SourceXmlChangeCount ===&lt;br /&gt;
Query how often the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable has been updated.  This action can be polled by clients that don’t support eventing.  Whenever the value returned increases, the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; has been updated so should be queried again.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ManufacturerName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Model ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Product ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ProductRoom&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductImageUri&amp;lt;/tt&amp;gt; state variables.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SetStandby ===&lt;br /&gt;
Set the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
= Product 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;Manufacturer&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;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;ManufacturerName&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;Info&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;ManufacturerInfo&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;Url&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;ManufacturerUrl&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;ImageUri&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;ManufacturerImageUri&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;Model&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;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;ModelName&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;Info&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;ModelInfo&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;Url&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;ModelUrl&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;ImageUri&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;ModelImageUri&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;Product&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;ProductRoom&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;ProductName&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;Info&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;ProductInfo&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;Url&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;ProductUrl&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;ImageUri&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;ProductImageUri&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;Standby&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;Standby&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;SetStandby&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;Standby&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;SourceCount&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;SourceCount&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;SourceXml&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;SourceXml&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;SourceIndex&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;SourceIndex&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;SetSourceIndex&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;SourceIndex&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;SetSourceIndexByName&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;SourceName&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;Source&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;SourceIndex&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;SystemName&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;SourceName&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;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SourceType&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;SourceName&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;Visible&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;SourceVisible&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;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;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;SourceXmlChangeCount&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;SourceXmlChangeCount&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;ManufacturerName&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;ManufacturerInfo&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;ManufacturerUrl&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;ManufacturerImageUri&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;ModelName&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;ModelInfo&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;ModelUrl&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;ModelImageUri&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;ProductRoom&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;ProductName&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;ProductInfo&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;ProductUrl&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;ProductImageUri&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;Standby&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;SourceIndex&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;SourceCount&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;SourceXml&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;SourceXmlChangeCount&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;SourceType&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;SourceName&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;SourceVisible&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>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ProductService</id>
		<title>Av:Developer:ProductService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ProductService"/>
				<updated>2014-06-16T11:20:59Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* SourceXml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Product service contains a summary of a single product’s capabilities.  Control points should begin their interaction with an av.openhome device by searching for the &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; service.  Presence of various other services can be inferred from the sources and attributes this reports.&lt;br /&gt;
&lt;br /&gt;
= State Variables =&lt;br /&gt;
== Sources ==&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
The number of available sources.  Does not vary at run-time.&lt;br /&gt;
=== SourceIndex ===&lt;br /&gt;
The index of the currently active source.  This is zero-based so will be in the range &amp;lt;tt&amp;gt;[0..SourceCount-1]&amp;lt;/tt&amp;gt;&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Returns a summary of all sources in the form&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SourceList&amp;gt;&lt;br /&gt;
    &amp;lt;Source&amp;gt;&lt;br /&gt;
        &amp;lt;Name&amp;gt;[user name for source]&amp;lt;/Name&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;[Type of the source.  Read-only. See below for supported types]&amp;lt;/Type&amp;gt;&lt;br /&gt;
        &amp;lt;Visible&amp;gt;[Boolean.  Whether control points should display source]&amp;lt;/Visible&amp;gt;&lt;br /&gt;
    &amp;lt;/sourcetag&amp;gt;&lt;br /&gt;
&amp;lt;/SourceList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supported source types are,&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;tt&amp;gt;Playlist&amp;lt;/tt&amp;gt; - controlled via the Playlist service&lt;br /&gt;
* &amp;lt;tt&amp;gt;Radio&amp;lt;/tt&amp;gt; - controlled via the Radio service&lt;br /&gt;
* &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt; - controlled via the Receiver service&lt;br /&gt;
* &amp;lt;tt&amp;gt;UpnpAv&amp;lt;/tt&amp;gt; - controlled via the AVTransport service&lt;br /&gt;
* &amp;lt;tt&amp;gt;NetAux&amp;lt;/tt&amp;gt; - used for non UPnP network protocols such as AirPlay&lt;br /&gt;
* &amp;lt;tt&amp;gt;Analog&amp;lt;/tt&amp;gt; - no control. Specifies an analog external input&lt;br /&gt;
* &amp;lt;tt&amp;gt;Digital&amp;lt;/tt&amp;gt; - no control. Specifies a digital external input&lt;br /&gt;
* &amp;lt;tt&amp;gt;Hdmi&amp;lt;/tt&amp;gt; - no control. Specifies a HDMI external input&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&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 for searching for each of these in turn.  Supported values for attributes include&lt;br /&gt;
 - Info – the av.openhome.org:Info:1 service is available&lt;br /&gt;
 - Time – the av.openhome.org:Time:1 service is available&lt;br /&gt;
 - Volume – the av.openhome.org:Volume:1 service is available&lt;br /&gt;
 - Sender - the av.openhome.org:Sender:1 service is available&lt;br /&gt;
 - App:Config=[link] – web UI for device configuration is available at the url [link]&lt;br /&gt;
=== ManufacturerImageUri ===&lt;br /&gt;
Uri for manufacturer’s logo.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerInfo ===&lt;br /&gt;
Manufacturer information.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerName ===&lt;br /&gt;
Manufacturer name.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerUrl ===&lt;br /&gt;
URL for manufacturer web site.  Does not vary at run-time.&lt;br /&gt;
=== ModelImageUri ===&lt;br /&gt;
Uri for model’s icon.  Does not vary at run-time.&lt;br /&gt;
=== ModelInfo ===&lt;br /&gt;
Model information.  Does not vary at run-time.&lt;br /&gt;
=== ModelName ===&lt;br /&gt;
Model name.  Does not vary at run-time.&lt;br /&gt;
=== ModelUrl ===&lt;br /&gt;
URL for model web site.  Does not vary at run-time.&lt;br /&gt;
=== ProductImageUri ===&lt;br /&gt;
Uri for product image.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== ProductInfo ===&lt;br /&gt;
Product information.  Does not vary at run-time.&lt;br /&gt;
=== ProductName ===&lt;br /&gt;
User-visible product name.  By default this is set to &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;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;
=== ProductRoom ===&lt;br /&gt;
The name of the room where the Product is located.  Set to “Main Room” by default.&lt;br /&gt;
&amp;lt;br&amp;gt;ProductRoom 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;ProductRoom&amp;lt;/tt&amp;gt; name.&lt;br /&gt;
&lt;br /&gt;
=== ProductUrl ===&lt;br /&gt;
URL for product web site.  This may be the UPnP presentation page.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
The standby state of a product (true =&amp;gt; standby enabled)&lt;br /&gt;
&amp;lt;br&amp;gt;Behaviour when &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; is enabled is implementation defined.  Devices can choose whether to remain network-controllable.  If a device is still network-controllable, invoking the &amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt; action on any source must disable &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Sources ==&lt;br /&gt;
The set of available sources does not vary at run-time (although some source attributes may change).  There is always a single source active.  Only the active source will play audio or report state updates.&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
Query the value of the (read-only) SourceCount state variable.&lt;br /&gt;
=== Source ===&lt;br /&gt;
Given the index of a source, query the values of its name, system name, type and visibility.&lt;br /&gt;
=== SetSourceIndex ===&lt;br /&gt;
Set the currently active source.  The value specified is zero-based and used to index into the source list returned by the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
=== SetSourceIndexByName ===&lt;br /&gt;
Set the currently active source.  The value specified is matched against the &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; attributes from the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that this action is deprecated.&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Query the value of the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SourceXmlChangeCount ===&lt;br /&gt;
Query how often the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable has been updated.  This action can be polled by clients that don’t support eventing.  Whenever the value returned increases, the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; has been updated so should be queried again.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ManufacturerName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Model ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Product ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ProductRoom&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductImageUri&amp;lt;/tt&amp;gt; state variables.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SetStandby ===&lt;br /&gt;
Set the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
= Product 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;Manufacturer&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;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;ManufacturerName&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;Info&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;ManufacturerInfo&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;Url&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;ManufacturerUrl&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;ImageUri&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;ManufacturerImageUri&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;Model&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;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;ModelName&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;Info&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;ModelInfo&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;Url&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;ModelUrl&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;ImageUri&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;ModelImageUri&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;Product&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;ProductRoom&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;ProductName&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;Info&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;ProductInfo&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;Url&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;ProductUrl&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;ImageUri&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;ProductImageUri&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;Standby&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;Standby&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;SetStandby&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;Standby&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;SourceCount&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;SourceCount&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;SourceXml&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;SourceXml&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;SourceIndex&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;SourceIndex&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;SetSourceIndex&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;SourceIndex&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;SetSourceIndexByName&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;SourceName&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;Source&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;SourceIndex&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;SystemName&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;SourceName&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;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SourceType&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;SourceName&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;Visible&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;SourceVisible&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;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;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;SourceXmlChangeCount&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;SourceXmlChangeCount&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;ManufacturerName&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;ManufacturerInfo&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;ManufacturerUrl&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;ManufacturerImageUri&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;ModelName&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;ModelInfo&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;ModelUrl&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;ModelImageUri&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;ProductRoom&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;ProductName&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;ProductInfo&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;ProductUrl&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;ProductImageUri&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;Standby&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;SourceIndex&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;SourceCount&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;SourceXml&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;SourceXmlChangeCount&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;SourceType&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;SourceName&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;SourceVisible&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>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ProductService</id>
		<title>Av:Developer:ProductService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ProductService"/>
				<updated>2014-06-16T11:19:14Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* SourceXml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Product service contains a summary of a single product’s capabilities.  Control points should begin their interaction with an av.openhome device by searching for the &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; service.  Presence of various other services can be inferred from the sources and attributes this reports.&lt;br /&gt;
&lt;br /&gt;
= State Variables =&lt;br /&gt;
== Sources ==&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
The number of available sources.  Does not vary at run-time.&lt;br /&gt;
=== SourceIndex ===&lt;br /&gt;
The index of the currently active source.  This is zero-based so will be in the range &amp;lt;tt&amp;gt;[0..SourceCount-1]&amp;lt;/tt&amp;gt;&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Returns a summary of all sources in the form&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SourceList&amp;gt;&lt;br /&gt;
    &amp;lt;Source&amp;gt;&lt;br /&gt;
        &amp;lt;Name&amp;gt;[user name for source]&amp;lt;/Name&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;[Type of the source.  Read-only. See below for supported types]&amp;lt;/Type&amp;gt;&lt;br /&gt;
        &amp;lt;Visible&amp;gt;[Boolean.  Whether control points should display source]&amp;lt;/Visible&amp;gt;&lt;br /&gt;
    &amp;lt;/sourcetag&amp;gt;&lt;br /&gt;
&amp;lt;/SourceList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Supported source types are,&lt;br /&gt;
&lt;br /&gt;
* Playlist - controlled via the Playlist service&lt;br /&gt;
* Radio - controlled via the Radio service&lt;br /&gt;
* Receiver - controlled via the Receiver service&lt;br /&gt;
* UpnpAv - controlled via the AVTransport service&lt;br /&gt;
* NetAux - used for non UPnP network protocols such as AirPlay&lt;br /&gt;
* Analog - no control. Specifies an analog external input&lt;br /&gt;
* Digital - no control. Specifies a digital external input&lt;br /&gt;
* Hdmi - no control. Specifies a HDMI external input&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&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 for searching for each of these in turn.  Supported values for attributes include&lt;br /&gt;
 - Info – the av.openhome.org:Info:1 service is available&lt;br /&gt;
 - Time – the av.openhome.org:Time:1 service is available&lt;br /&gt;
 - Volume – the av.openhome.org:Volume:1 service is available&lt;br /&gt;
 - Sender - the av.openhome.org:Sender:1 service is available&lt;br /&gt;
 - App:Config=[link] – web UI for device configuration is available at the url [link]&lt;br /&gt;
=== ManufacturerImageUri ===&lt;br /&gt;
Uri for manufacturer’s logo.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerInfo ===&lt;br /&gt;
Manufacturer information.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerName ===&lt;br /&gt;
Manufacturer name.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerUrl ===&lt;br /&gt;
URL for manufacturer web site.  Does not vary at run-time.&lt;br /&gt;
=== ModelImageUri ===&lt;br /&gt;
Uri for model’s icon.  Does not vary at run-time.&lt;br /&gt;
=== ModelInfo ===&lt;br /&gt;
Model information.  Does not vary at run-time.&lt;br /&gt;
=== ModelName ===&lt;br /&gt;
Model name.  Does not vary at run-time.&lt;br /&gt;
=== ModelUrl ===&lt;br /&gt;
URL for model web site.  Does not vary at run-time.&lt;br /&gt;
=== ProductImageUri ===&lt;br /&gt;
Uri for product image.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== ProductInfo ===&lt;br /&gt;
Product information.  Does not vary at run-time.&lt;br /&gt;
=== ProductName ===&lt;br /&gt;
User-visible product name.  By default this is set to &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;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;
=== ProductRoom ===&lt;br /&gt;
The name of the room where the Product is located.  Set to “Main Room” by default.&lt;br /&gt;
&amp;lt;br&amp;gt;ProductRoom 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;ProductRoom&amp;lt;/tt&amp;gt; name.&lt;br /&gt;
&lt;br /&gt;
=== ProductUrl ===&lt;br /&gt;
URL for product web site.  This may be the UPnP presentation page.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
The standby state of a product (true =&amp;gt; standby enabled)&lt;br /&gt;
&amp;lt;br&amp;gt;Behaviour when &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; is enabled is implementation defined.  Devices can choose whether to remain network-controllable.  If a device is still network-controllable, invoking the &amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt; action on any source must disable &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Sources ==&lt;br /&gt;
The set of available sources does not vary at run-time (although some source attributes may change).  There is always a single source active.  Only the active source will play audio or report state updates.&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
Query the value of the (read-only) SourceCount state variable.&lt;br /&gt;
=== Source ===&lt;br /&gt;
Given the index of a source, query the values of its name, system name, type and visibility.&lt;br /&gt;
=== SetSourceIndex ===&lt;br /&gt;
Set the currently active source.  The value specified is zero-based and used to index into the source list returned by the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
=== SetSourceIndexByName ===&lt;br /&gt;
Set the currently active source.  The value specified is matched against the &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; attributes from the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that this action is deprecated.&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Query the value of the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SourceXmlChangeCount ===&lt;br /&gt;
Query how often the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable has been updated.  This action can be polled by clients that don’t support eventing.  Whenever the value returned increases, the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; has been updated so should be queried again.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ManufacturerName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Model ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Product ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ProductRoom&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductImageUri&amp;lt;/tt&amp;gt; state variables.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SetStandby ===&lt;br /&gt;
Set the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
= Product 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;Manufacturer&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;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;ManufacturerName&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;Info&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;ManufacturerInfo&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;Url&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;ManufacturerUrl&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;ImageUri&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;ManufacturerImageUri&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;Model&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;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;ModelName&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;Info&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;ModelInfo&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;Url&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;ModelUrl&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;ImageUri&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;ModelImageUri&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;Product&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;ProductRoom&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;ProductName&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;Info&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;ProductInfo&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;Url&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;ProductUrl&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;ImageUri&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;ProductImageUri&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;Standby&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;Standby&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;SetStandby&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;Standby&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;SourceCount&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;SourceCount&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;SourceXml&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;SourceXml&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;SourceIndex&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;SourceIndex&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;SetSourceIndex&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;SourceIndex&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;SetSourceIndexByName&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;SourceName&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;Source&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;SourceIndex&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;SystemName&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;SourceName&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;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SourceType&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;SourceName&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;Visible&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;SourceVisible&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;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;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;SourceXmlChangeCount&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;SourceXmlChangeCount&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;ManufacturerName&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;ManufacturerInfo&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;ManufacturerUrl&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;ManufacturerImageUri&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;ModelName&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;ModelInfo&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;ModelUrl&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;ModelImageUri&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;ProductRoom&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;ProductName&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;ProductInfo&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;ProductUrl&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;ProductImageUri&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;Standby&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;SourceIndex&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;SourceCount&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;SourceXml&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;SourceXmlChangeCount&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;SourceType&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;SourceName&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;SourceVisible&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>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ProductService</id>
		<title>Av:Developer:ProductService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ProductService"/>
				<updated>2014-06-16T11:19:07Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* SourceXml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Product service contains a summary of a single product’s capabilities.  Control points should begin their interaction with an av.openhome device by searching for the &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; service.  Presence of various other services can be inferred from the sources and attributes this reports.&lt;br /&gt;
&lt;br /&gt;
= State Variables =&lt;br /&gt;
== Sources ==&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
The number of available sources.  Does not vary at run-time.&lt;br /&gt;
=== SourceIndex ===&lt;br /&gt;
The index of the currently active source.  This is zero-based so will be in the range &amp;lt;tt&amp;gt;[0..SourceCount-1]&amp;lt;/tt&amp;gt;&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Returns a summary of all sources in the form&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SourceList&amp;gt;&lt;br /&gt;
    &amp;lt;Source&amp;gt;&lt;br /&gt;
        &amp;lt;Name&amp;gt;[user name for source]&amp;lt;/Name&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;[Type of the source.  Read-only. See below for supported types]&amp;lt;/Type&amp;gt;&lt;br /&gt;
        &amp;lt;Visible&amp;gt;[Boolean.  Whether control points should display source]&amp;lt;/Visible&amp;gt;&lt;br /&gt;
    &amp;lt;/sourcetag&amp;gt;&lt;br /&gt;
&amp;lt;/SourceList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Supported source types are,&lt;br /&gt;
&lt;br /&gt;
* Playlist - controlled via the Playlist service&lt;br /&gt;
* Radio - controlled via the Radio service&lt;br /&gt;
* Receiver - controlled via the Receiver service&lt;br /&gt;
* UpnpAv - controlled via the AVTransport service&lt;br /&gt;
* NetAux - used for non UPnP network protocols such as AirPlay&lt;br /&gt;
* Analog - no control. Specifies an analog external input&lt;br /&gt;
* Digital - no control. Specifies a digital external input&lt;br /&gt;
* Hdmi - no control. Specifies a HDMI external input&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&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 for searching for each of these in turn.  Supported values for attributes include&lt;br /&gt;
 - Info – the av.openhome.org:Info:1 service is available&lt;br /&gt;
 - Time – the av.openhome.org:Time:1 service is available&lt;br /&gt;
 - Volume – the av.openhome.org:Volume:1 service is available&lt;br /&gt;
 - Sender - the av.openhome.org:Sender:1 service is available&lt;br /&gt;
 - App:Config=[link] – web UI for device configuration is available at the url [link]&lt;br /&gt;
=== ManufacturerImageUri ===&lt;br /&gt;
Uri for manufacturer’s logo.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerInfo ===&lt;br /&gt;
Manufacturer information.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerName ===&lt;br /&gt;
Manufacturer name.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerUrl ===&lt;br /&gt;
URL for manufacturer web site.  Does not vary at run-time.&lt;br /&gt;
=== ModelImageUri ===&lt;br /&gt;
Uri for model’s icon.  Does not vary at run-time.&lt;br /&gt;
=== ModelInfo ===&lt;br /&gt;
Model information.  Does not vary at run-time.&lt;br /&gt;
=== ModelName ===&lt;br /&gt;
Model name.  Does not vary at run-time.&lt;br /&gt;
=== ModelUrl ===&lt;br /&gt;
URL for model web site.  Does not vary at run-time.&lt;br /&gt;
=== ProductImageUri ===&lt;br /&gt;
Uri for product image.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== ProductInfo ===&lt;br /&gt;
Product information.  Does not vary at run-time.&lt;br /&gt;
=== ProductName ===&lt;br /&gt;
User-visible product name.  By default this is set to &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;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;
=== ProductRoom ===&lt;br /&gt;
The name of the room where the Product is located.  Set to “Main Room” by default.&lt;br /&gt;
&amp;lt;br&amp;gt;ProductRoom 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;ProductRoom&amp;lt;/tt&amp;gt; name.&lt;br /&gt;
&lt;br /&gt;
=== ProductUrl ===&lt;br /&gt;
URL for product web site.  This may be the UPnP presentation page.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
The standby state of a product (true =&amp;gt; standby enabled)&lt;br /&gt;
&amp;lt;br&amp;gt;Behaviour when &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; is enabled is implementation defined.  Devices can choose whether to remain network-controllable.  If a device is still network-controllable, invoking the &amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt; action on any source must disable &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Sources ==&lt;br /&gt;
The set of available sources does not vary at run-time (although some source attributes may change).  There is always a single source active.  Only the active source will play audio or report state updates.&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
Query the value of the (read-only) SourceCount state variable.&lt;br /&gt;
=== Source ===&lt;br /&gt;
Given the index of a source, query the values of its name, system name, type and visibility.&lt;br /&gt;
=== SetSourceIndex ===&lt;br /&gt;
Set the currently active source.  The value specified is zero-based and used to index into the source list returned by the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
=== SetSourceIndexByName ===&lt;br /&gt;
Set the currently active source.  The value specified is matched against the &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; attributes from the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that this action is deprecated.&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Query the value of the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SourceXmlChangeCount ===&lt;br /&gt;
Query how often the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable has been updated.  This action can be polled by clients that don’t support eventing.  Whenever the value returned increases, the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; has been updated so should be queried again.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ManufacturerName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Model ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Product ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ProductRoom&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductImageUri&amp;lt;/tt&amp;gt; state variables.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SetStandby ===&lt;br /&gt;
Set the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
= Product 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;Manufacturer&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;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;ManufacturerName&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;Info&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;ManufacturerInfo&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;Url&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;ManufacturerUrl&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;ImageUri&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;ManufacturerImageUri&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;Model&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;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;ModelName&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;Info&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;ModelInfo&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;Url&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;ModelUrl&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;ImageUri&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;ModelImageUri&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;Product&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;ProductRoom&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;ProductName&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;Info&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;ProductInfo&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;Url&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;ProductUrl&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;ImageUri&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;ProductImageUri&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;Standby&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;Standby&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;SetStandby&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;Standby&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;SourceCount&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;SourceCount&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;SourceXml&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;SourceXml&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;SourceIndex&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;SourceIndex&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;SetSourceIndex&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;SourceIndex&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;SetSourceIndexByName&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;SourceName&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;Source&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;SourceIndex&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;SystemName&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;SourceName&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;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SourceType&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;SourceName&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;Visible&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;SourceVisible&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;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;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;SourceXmlChangeCount&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;SourceXmlChangeCount&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;ManufacturerName&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;ManufacturerInfo&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;ManufacturerUrl&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;ManufacturerImageUri&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;ModelName&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;ModelInfo&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;ModelUrl&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;ModelImageUri&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;ProductRoom&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;ProductName&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;ProductInfo&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;ProductUrl&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;ProductImageUri&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;Standby&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;SourceIndex&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;SourceCount&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;SourceXml&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;SourceXmlChangeCount&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;SourceType&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;SourceName&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;SourceVisible&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>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ProductService</id>
		<title>Av:Developer:ProductService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ProductService"/>
				<updated>2014-06-16T11:10:41Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* SourceXml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Product service contains a summary of a single product’s capabilities.  Control points should begin their interaction with an av.openhome device by searching for the &amp;lt;tt&amp;gt;Product&amp;lt;/tt&amp;gt; service.  Presence of various other services can be inferred from the sources and attributes this reports.&lt;br /&gt;
&lt;br /&gt;
= State Variables =&lt;br /&gt;
== Sources ==&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
The number of available sources.  Does not vary at run-time.&lt;br /&gt;
=== SourceIndex ===&lt;br /&gt;
The index of the currently active source.  This is zero-based so will be in the range &amp;lt;tt&amp;gt;[0..SourceCount-1]&amp;lt;/tt&amp;gt;&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Returns a summary of all sources in the form&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;SourceList&amp;gt;&lt;br /&gt;
    &amp;lt;Source&amp;gt;&lt;br /&gt;
        &amp;lt;Name&amp;gt;[user name for source]&amp;lt;/Name&amp;gt;&lt;br /&gt;
        &amp;lt;Type&amp;gt;[Type of the source.  Read-only. See below for supported types]&amp;lt;/Type&amp;gt;&lt;br /&gt;
        &amp;lt;Visible&amp;gt;[Boolean.  Whether control points should display source]&amp;lt;/Visible&amp;gt;&lt;br /&gt;
    &amp;lt;/sourcetag&amp;gt;&lt;br /&gt;
&amp;lt;/SourceList&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&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 for searching for each of these in turn.  Supported values for attributes include&lt;br /&gt;
 - Info – the av.openhome.org:Info:1 service is available&lt;br /&gt;
 - Time – the av.openhome.org:Time:1 service is available&lt;br /&gt;
 - Volume – the av.openhome.org:Volume:1 service is available&lt;br /&gt;
 - Sender - the av.openhome.org:Sender:1 service is available&lt;br /&gt;
 - App:Config=[link] – web UI for device configuration is available at the url [link]&lt;br /&gt;
=== ManufacturerImageUri ===&lt;br /&gt;
Uri for manufacturer’s logo.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerInfo ===&lt;br /&gt;
Manufacturer information.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerName ===&lt;br /&gt;
Manufacturer name.  Does not vary at run-time.&lt;br /&gt;
=== ManufacturerUrl ===&lt;br /&gt;
URL for manufacturer web site.  Does not vary at run-time.&lt;br /&gt;
=== ModelImageUri ===&lt;br /&gt;
Uri for model’s icon.  Does not vary at run-time.&lt;br /&gt;
=== ModelInfo ===&lt;br /&gt;
Model information.  Does not vary at run-time.&lt;br /&gt;
=== ModelName ===&lt;br /&gt;
Model name.  Does not vary at run-time.&lt;br /&gt;
=== ModelUrl ===&lt;br /&gt;
URL for model web site.  Does not vary at run-time.&lt;br /&gt;
=== ProductImageUri ===&lt;br /&gt;
Uri for product image.  Does not vary at run-time.&lt;br /&gt;
&lt;br /&gt;
=== ProductInfo ===&lt;br /&gt;
Product information.  Does not vary at run-time.&lt;br /&gt;
=== ProductName ===&lt;br /&gt;
User-visible product name.  By default this is set to &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&amp;lt;br&amp;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;
=== ProductRoom ===&lt;br /&gt;
The name of the room where the Product is located.  Set to “Main Room” by default.&lt;br /&gt;
&amp;lt;br&amp;gt;ProductRoom 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;ProductRoom&amp;lt;/tt&amp;gt; name.&lt;br /&gt;
&lt;br /&gt;
=== ProductUrl ===&lt;br /&gt;
URL for product web site.  This may be the UPnP presentation page.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
The standby state of a product (true =&amp;gt; standby enabled)&lt;br /&gt;
&amp;lt;br&amp;gt;Behaviour when &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; is enabled is implementation defined.  Devices can choose whether to remain network-controllable.  If a device is still network-controllable, invoking the &amp;lt;tt&amp;gt;Play&amp;lt;/tt&amp;gt; action on any source must disable &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Sources ==&lt;br /&gt;
The set of available sources does not vary at run-time (although some source attributes may change).  There is always a single source active.  Only the active source will play audio or report state updates.&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
Query the value of the (read-only) SourceCount state variable.&lt;br /&gt;
=== Source ===&lt;br /&gt;
Given the index of a source, query the values of its name, system name, type and visibility.&lt;br /&gt;
=== SetSourceIndex ===&lt;br /&gt;
Set the currently active source.  The value specified is zero-based and used to index into the source list returned by the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
=== SetSourceIndexByName ===&lt;br /&gt;
Set the currently active source.  The value specified is matched against the &amp;lt;tt&amp;gt;Name&amp;lt;/tt&amp;gt; attributes from the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; action / state variable.&lt;br /&gt;
&amp;lt;br&amp;gt;Note that this action is deprecated.&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Query the value of the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SourceXmlChangeCount ===&lt;br /&gt;
Query how often the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; state variable has been updated.  This action can be polled by clients that don’t support eventing.  Whenever the value returned increases, the &amp;lt;tt&amp;gt;SourceXml&amp;lt;/tt&amp;gt; has been updated so should be queried again.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Attributes&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ManufacturerName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ManufacturerImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Model ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ModelName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ModelImageUri&amp;lt;/tt&amp;gt; state variables.  All are read-only so the values returned will not vary at runtime.&lt;br /&gt;
=== Product ===&lt;br /&gt;
Return the values of the &amp;lt;tt&amp;gt;ProductRoom&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductName&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductInfo&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductUrl&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;ProductImageUri&amp;lt;/tt&amp;gt; state variables.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Return the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
=== SetStandby ===&lt;br /&gt;
Set the value of the &amp;lt;tt&amp;gt;Standby&amp;lt;/tt&amp;gt; state variable.&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
= Product 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;Manufacturer&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;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;ManufacturerName&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;Info&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;ManufacturerInfo&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;Url&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;ManufacturerUrl&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;ImageUri&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;ManufacturerImageUri&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;Model&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;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;ModelName&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;Info&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;ModelInfo&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;Url&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;ModelUrl&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;ImageUri&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;ModelImageUri&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;Product&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;ProductRoom&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;ProductName&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;Info&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;ProductInfo&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;Url&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;ProductUrl&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;ImageUri&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;ProductImageUri&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;Standby&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;Standby&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;SetStandby&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;Standby&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;SourceCount&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;SourceCount&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;SourceXml&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;SourceXml&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;SourceIndex&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;SourceIndex&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;SetSourceIndex&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;SourceIndex&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;SetSourceIndexByName&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;SourceName&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;Source&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;SourceIndex&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;SystemName&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;SourceName&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;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SourceType&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;SourceName&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;Visible&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;SourceVisible&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;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;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;SourceXmlChangeCount&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;SourceXmlChangeCount&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;ManufacturerName&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;ManufacturerInfo&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;ManufacturerUrl&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;ManufacturerImageUri&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;ModelName&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;ModelInfo&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;ModelUrl&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;ModelImageUri&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;ProductRoom&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;ProductName&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;ProductInfo&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;ProductUrl&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;ProductImageUri&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;Standby&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;SourceIndex&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;SourceCount&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;SourceXml&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;SourceXmlChangeCount&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;SourceType&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;SourceName&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;SourceVisible&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>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-08-17T16:19:50Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistSetName */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks in an individual playlist. Each playlist and each track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id should contain the metadata for the track. Otherwise the udn should be empty and the metadata id should contain DidlLite describing the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
Likewise there are two ways to delete the tracks in a playlist. But you can only delete the playlists themselves individually.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two evented state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of artwork images a control point can associate with a playlist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a list of playlist ids, report their associated Name, Description and ImageId in the following XML form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PlaylistList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Name&amp;gt;&amp;lt;/Name&amp;gt;&lt;br /&gt;
      &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt;&lt;br /&gt;
      &amp;lt;ImageId&amp;gt;&amp;lt;/ImageId&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/PlaylistList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistSetName ==&lt;br /&gt;
&lt;br /&gt;
Sets the Name of the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistSetDescription ==&lt;br /&gt;
&lt;br /&gt;
Sets the Description of the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistSetImageId ==&lt;br /&gt;
&lt;br /&gt;
Sets the ImageId of the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id. To insert at the beginning of the list use the special playlist id of 0.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Playlist&amp;gt;&lt;br /&gt;
    &amp;lt;Track&amp;gt;&lt;br /&gt;
      &amp;lt;Udn&amp;gt;&amp;lt;/Udn&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Track&amp;gt;&lt;br /&gt;
  &amp;lt;/Playlist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
&lt;br /&gt;
Insert a track after the specified track id. To insert at the beginning of the list use the special track id of 0.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadList&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;PlaylistList&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;PlaylistList&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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistSetName&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;Name&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;Name&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;PlaylistSetDescription&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;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;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;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistSetImageId&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistMove&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;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;/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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-08-17T16:19:16Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistUpdate */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks in an individual playlist. Each playlist and each track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id should contain the metadata for the track. Otherwise the udn should be empty and the metadata id should contain DidlLite describing the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
Likewise there are two ways to delete the tracks in a playlist. But you can only delete the playlists themselves individually.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two evented state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of artwork images a control point can associate with a playlist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a list of playlist ids, report their associated Name, Description and ImageId in the following XML form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PlaylistList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Name&amp;gt;&amp;lt;/Name&amp;gt;&lt;br /&gt;
      &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt;&lt;br /&gt;
      &amp;lt;ImageId&amp;gt;&amp;lt;/ImageId&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/PlaylistList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistSetName ==&lt;br /&gt;
&lt;br /&gt;
Sets the Name of the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id. To insert at the beginning of the list use the special playlist id of 0.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Playlist&amp;gt;&lt;br /&gt;
    &amp;lt;Track&amp;gt;&lt;br /&gt;
      &amp;lt;Udn&amp;gt;&amp;lt;/Udn&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Track&amp;gt;&lt;br /&gt;
  &amp;lt;/Playlist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
&lt;br /&gt;
Insert a track after the specified track id. To insert at the beginning of the list use the special track id of 0.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadList&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;PlaylistList&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;PlaylistList&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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistSetName&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;Name&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;Name&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;PlaylistSetDescription&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;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;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;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistSetImageId&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistMove&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;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;/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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-08-17T16:18:46Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistManager Service Description (XML) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks in an individual playlist. Each playlist and each track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id should contain the metadata for the track. Otherwise the udn should be empty and the metadata id should contain DidlLite describing the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
Likewise there are two ways to delete the tracks in a playlist. But you can only delete the playlists themselves individually.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two evented state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of artwork images a control point can associate with a playlist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a list of playlist ids, report their associated Name, Description and ImageId in the following XML form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PlaylistList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Name&amp;gt;&amp;lt;/Name&amp;gt;&lt;br /&gt;
      &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt;&lt;br /&gt;
      &amp;lt;ImageId&amp;gt;&amp;lt;/ImageId&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/PlaylistList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
&lt;br /&gt;
Updates the Name, Description and ImageId for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id. To insert at the beginning of the list use the special playlist id of 0.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Playlist&amp;gt;&lt;br /&gt;
    &amp;lt;Track&amp;gt;&lt;br /&gt;
      &amp;lt;Udn&amp;gt;&amp;lt;/Udn&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Track&amp;gt;&lt;br /&gt;
  &amp;lt;/Playlist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
&lt;br /&gt;
Insert a track after the specified track id. To insert at the beginning of the list use the special track id of 0.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadList&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;PlaylistList&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;PlaylistList&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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistSetName&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;Name&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;Name&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;PlaylistSetDescription&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;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;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;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistSetImageId&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistMove&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;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;/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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-08-17T10:48:22Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistManager Service Description (XML) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks in an individual playlist. Each playlist and each track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id should contain the metadata for the track. Otherwise the udn should be empty and the metadata id should contain DidlLite describing the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
Likewise there are two ways to delete the tracks in a playlist. But you can only delete the playlists themselves individually.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two evented state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of artwork images a control point can associate with a playlist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a list of playlist ids, report their associated Name, Description and ImageId in the following XML form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PlaylistList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Name&amp;gt;&amp;lt;/Name&amp;gt;&lt;br /&gt;
      &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt;&lt;br /&gt;
      &amp;lt;ImageId&amp;gt;&amp;lt;/ImageId&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/PlaylistList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
&lt;br /&gt;
Updates the Name, Description and ImageId for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id. To insert at the beginning of the list use the special playlist id of 0.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Playlist&amp;gt;&lt;br /&gt;
    &amp;lt;Track&amp;gt;&lt;br /&gt;
      &amp;lt;Udn&amp;gt;&amp;lt;/Udn&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Track&amp;gt;&lt;br /&gt;
  &amp;lt;/Playlist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
&lt;br /&gt;
Insert a track after the specified track id. To insert at the beginning of the list use the special track id of 0.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadList&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;PlaylistList&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;PlaylistList&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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistMove&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;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;/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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-08-17T10:45:59Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* Architectural Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks in an individual playlist. Each playlist and each track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id should contain the metadata for the track. Otherwise the udn should be empty and the metadata id should contain DidlLite describing the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
Likewise there are two ways to delete the tracks in a playlist. But you can only delete the playlists themselves individually.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two evented state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of artwork images a control point can associate with a playlist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a list of playlist ids, report their associated Name, Description and ImageId in the following XML form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PlaylistList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Name&amp;gt;&amp;lt;/Name&amp;gt;&lt;br /&gt;
      &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt;&lt;br /&gt;
      &amp;lt;ImageId&amp;gt;&amp;lt;/ImageId&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/PlaylistList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
&lt;br /&gt;
Updates the Name, Description and ImageId for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id. To insert at the beginning of the list use the special playlist id of 0.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Playlist&amp;gt;&lt;br /&gt;
    &amp;lt;Track&amp;gt;&lt;br /&gt;
      &amp;lt;Udn&amp;gt;&amp;lt;/Udn&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Track&amp;gt;&lt;br /&gt;
  &amp;lt;/Playlist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
&lt;br /&gt;
Insert a track after the specified track id. To insert at the beginning of the list use the special track id of 0.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadList&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;PlaylistList&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;PlaylistList&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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-08-17T10:44:26Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* Architectural Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks in an individual playlist. Each playlist and each track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata should contain the metadata for the track. Otherwise the udn should be empty and the metadata should contain DidlLite describing the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
Likewise there are two ways to delete the tracks in a playlist. But you can only delete the playlists themselves individually.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two evented state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of artwork images a control point can associate with a playlist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a list of playlist ids, report their associated Name, Description and ImageId in the following XML form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PlaylistList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Name&amp;gt;&amp;lt;/Name&amp;gt;&lt;br /&gt;
      &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt;&lt;br /&gt;
      &amp;lt;ImageId&amp;gt;&amp;lt;/ImageId&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/PlaylistList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
&lt;br /&gt;
Updates the Name, Description and ImageId for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id. To insert at the beginning of the list use the special playlist id of 0.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Playlist&amp;gt;&lt;br /&gt;
    &amp;lt;Track&amp;gt;&lt;br /&gt;
      &amp;lt;Udn&amp;gt;&amp;lt;/Udn&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Track&amp;gt;&lt;br /&gt;
  &amp;lt;/Playlist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
&lt;br /&gt;
Insert a track after the specified track id. To insert at the beginning of the list use the special track id of 0.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadList&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;PlaylistList&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;PlaylistList&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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-08-17T10:08:22Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistManager Service Description (XML) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks in an individual playlist. Each playlist and each track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id should contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
Likewise there are two ways to delete the tracks in a playlist. But you can only delete the playlists themselves individually.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two evented state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of artwork images a control point can associate with a playlist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a list of playlist ids, report their associated Name, Description and ImageId in the following XML form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PlaylistList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Name&amp;gt;&amp;lt;/Name&amp;gt;&lt;br /&gt;
      &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt;&lt;br /&gt;
      &amp;lt;ImageId&amp;gt;&amp;lt;/ImageId&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/PlaylistList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
&lt;br /&gt;
Updates the Name, Description and ImageId for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id. To insert at the beginning of the list use the special playlist id of 0.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Playlist&amp;gt;&lt;br /&gt;
    &amp;lt;Track&amp;gt;&lt;br /&gt;
      &amp;lt;Udn&amp;gt;&amp;lt;/Udn&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Track&amp;gt;&lt;br /&gt;
  &amp;lt;/Playlist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
&lt;br /&gt;
Insert a track after the specified track id. To insert at the beginning of the list use the special track id of 0.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadList&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;PlaylistList&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;PlaylistList&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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-08-17T10:07:09Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistReadMetadata */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks in an individual playlist. Each playlist and each track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id should contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
Likewise there are two ways to delete the tracks in a playlist. But you can only delete the playlists themselves individually.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two evented state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of artwork images a control point can associate with a playlist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a list of playlist ids, report their associated Name, Description and ImageId in the following XML form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PlaylistList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Name&amp;gt;&amp;lt;/Name&amp;gt;&lt;br /&gt;
      &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt;&lt;br /&gt;
      &amp;lt;ImageId&amp;gt;&amp;lt;/ImageId&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/PlaylistList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
&lt;br /&gt;
Updates the Name, Description and ImageId for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id. To insert at the beginning of the list use the special playlist id of 0.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Playlist&amp;gt;&lt;br /&gt;
    &amp;lt;Track&amp;gt;&lt;br /&gt;
      &amp;lt;Udn&amp;gt;&amp;lt;/Udn&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Track&amp;gt;&lt;br /&gt;
  &amp;lt;/Playlist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
&lt;br /&gt;
Insert a track after the specified track id. To insert at the beginning of the list use the special track id of 0.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-08-17T10:06:43Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistReadMetadata */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks in an individual playlist. Each playlist and each track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id should contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
Likewise there are two ways to delete the tracks in a playlist. But you can only delete the playlists themselves individually.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two evented state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of artwork images a control point can associate with a playlist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
&lt;br /&gt;
Given a list of playlist ids, report their associated Name, Description and ImageId in the following XML form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PlaylistList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Name&amp;gt;&amp;lt;/Name&amp;gt;&lt;br /&gt;
      &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt;&lt;br /&gt;
      &amp;lt;ImageId&amp;gt;&amp;lt;/ImageId&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/PlaylistList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
&lt;br /&gt;
Updates the Name, Description and ImageId for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id. To insert at the beginning of the list use the special playlist id of 0.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Playlist&amp;gt;&lt;br /&gt;
    &amp;lt;Track&amp;gt;&lt;br /&gt;
      &amp;lt;Udn&amp;gt;&amp;lt;/Udn&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Track&amp;gt;&lt;br /&gt;
  &amp;lt;/Playlist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
&lt;br /&gt;
Insert a track after the specified track id. To insert at the beginning of the list use the special track id of 0.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-08-17T10:06:12Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistReadMetadata */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks in an individual playlist. Each playlist and each track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id should contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
Likewise there are two ways to delete the tracks in a playlist. But you can only delete the playlists themselves individually.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two evented state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of artwork images a control point can associate with a playlist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
&lt;br /&gt;
Given a list of playlist ids, report their associated name, description and imageId in the following XML form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;PlaylistList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Name&amp;gt;&amp;lt;/Name&amp;gt;&lt;br /&gt;
      &amp;lt;Description&amp;gt;&amp;lt;/Description&amp;gt;&lt;br /&gt;
      &amp;lt;ImageId&amp;gt;&amp;lt;/ImageId&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/PlaylistList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
&lt;br /&gt;
Updates the Name, Description and ImageId for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id. To insert at the beginning of the list use the special playlist id of 0.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;Playlist&amp;gt;&lt;br /&gt;
    &amp;lt;Track&amp;gt;&lt;br /&gt;
      &amp;lt;Udn&amp;gt;&amp;lt;/Udn&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Track&amp;gt;&lt;br /&gt;
  &amp;lt;/Playlist&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
&lt;br /&gt;
Insert a track after the specified track id. To insert at the beginning of the list use the special track id of 0.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:22:06Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistInsert */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of artwork images a control point can associate with a playlist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
&lt;br /&gt;
Updates the Name, Description and ImageId for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id. To insert at the beginning of the list use the special playlist id of 0.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;TrackList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/TrackList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
&lt;br /&gt;
Insert a track after the specified track id. To insert at the beginning of the list use the special track id of 0.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:21:47Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* Insert */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of artwork images a control point can associate with a playlist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
&lt;br /&gt;
Updates the Name, Description and ImageId for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;TrackList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/TrackList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
&lt;br /&gt;
Insert a track after the specified track id. To insert at the beginning of the list use the special track id of 0.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:20:35Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* ImagesXml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
Returns a list of artwork images a control point can associate with a playlist.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
&lt;br /&gt;
Updates the Name, Description and ImageId for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;TrackList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/TrackList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:19:48Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistInsert */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
&lt;br /&gt;
Updates the Name, Description and ImageId for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
&lt;br /&gt;
Inserts an empty playlist with the specified Name, Description and ImageId after the specified playlist id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;TrackList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/TrackList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:19:04Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistUpdate */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
&lt;br /&gt;
Updates the Name, Description and ImageId for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;TrackList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/TrackList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:16:29Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* Metadata */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
&lt;br /&gt;
Returns the Metadata describing the PlaylistManager.&lt;br /&gt;
&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;TrackList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/TrackList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:15:08Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistRead */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Name, Description and ImageId.&lt;br /&gt;
&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;TrackList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/TrackList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:14:39Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistReadMetadata */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;TrackList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/TrackList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:13:39Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* ReadList */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a space separated list of track Id's, report their associated Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;TrackList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Metadata&amp;gt;&amp;lt;/Metadata&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/TrackList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:13:00Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* Read */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
&lt;br /&gt;
Given a playlist id and a track Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
== ReadList ==&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:11:06Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* ImagesXml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;ImageList&amp;gt;&lt;br /&gt;
    &amp;lt;Entry&amp;gt;&lt;br /&gt;
      &amp;lt;Id&amp;gt;&amp;lt;/Id&amp;gt;&lt;br /&gt;
      &amp;lt;Uri&amp;gt;&amp;lt;/Uri&amp;gt;&lt;br /&gt;
    &amp;lt;/Entry&amp;gt;&lt;br /&gt;
  &amp;lt;/ImageList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
== ReadList ==&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:10:07Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistsMax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of playlists in the playlists id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
== ReadList ==&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:09:42Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* TracksMax */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
&lt;br /&gt;
Report the maximum number of tracks in a playlist id array. This remains constant while a particular OpenHome device remains registerted on the network, but may vary between different models of OpenHome device from different manufacturers. A value of 0 indicates no limit.&lt;br /&gt;
&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
== ReadList ==&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:08:39Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistDeleteId */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the list of playlists the playlist with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
== ReadList ==&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:08:17Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistDeleteAll */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears all the playlists.&lt;br /&gt;
&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
== ReadList ==&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:08:01Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* DeleteAll */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
== ReadList ==&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
&lt;br /&gt;
Clears the specified playlist.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:07:49Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* DeleteId */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
== ReadList ==&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
&lt;br /&gt;
Delete from the specified playlist the track with the specified Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:07:16Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistReadArray */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array for the specified playlist.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
== ReadList ==&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
== DeleteAll ==&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:05:32Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistArraysChanged */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
&lt;br /&gt;
Check to see if the id array or token array has changed since gathering the specified Token. This Token must have been previously collected from the PlaylistArrays action.&lt;br /&gt;
&lt;br /&gt;
This mechanism is provided specifically for clients unable to partake in UPnP eventing.&lt;br /&gt;
&lt;br /&gt;
== Read ==&lt;br /&gt;
== ReadList ==&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
== DeleteAll ==&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:04:59Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* PlaylistArrays */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
&lt;br /&gt;
Report the current id array and token array.&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered array of ids that represent each playlist in the list of playlists.&lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array or token array has changed since it was last read (see PlaylistArraysChanged).&lt;br /&gt;
&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
== Read ==&lt;br /&gt;
== ReadList ==&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
== DeleteAll ==&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T10:02:31Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* Actions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
== ImagesXml ==&lt;br /&gt;
== PlaylistReadArray ==&lt;br /&gt;
== PlaylistReadMetadata ==&lt;br /&gt;
== PlaylistRead ==&lt;br /&gt;
== PlaylistUpdate ==&lt;br /&gt;
== PlaylistInsert ==&lt;br /&gt;
== PlaylistDeleteId ==&lt;br /&gt;
== PlaylistDeleteAll ==&lt;br /&gt;
== PlaylistsMax ==&lt;br /&gt;
== TracksMax ==&lt;br /&gt;
== PlaylistArrays ==&lt;br /&gt;
== PlaylistArraysChanged ==&lt;br /&gt;
== Read ==&lt;br /&gt;
== ReadList ==&lt;br /&gt;
== Insert ==&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
== DeleteAll ==&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T09:57:22Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* Architectural Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&lt;br /&gt;
&lt;br /&gt;
= Actions =&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T09:53:33Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* Playlist IdArray */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
When you acquire the IdArray, through the action PlaylistReadArray, you immediately know the number and order of the ids in the playlist. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlist changes is inefficient and will give a poor user experience. In order to quickly display playlist updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlist. Changes to the order of ids in the playlist require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T09:50:59Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: /* IdArray and TokenIdArray */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray and TokenArray via events or polling, you immediately know the number and order of the ids of the playlists, as well as whether an individual playlist has changed. What you don't necessarily know is the metadata for those ids.&lt;br /&gt;
&lt;br /&gt;
As the metadata for a large number of playlists can easily be several megabytes of xml, blindly fetching all the metadata every time the playlists change is inefficient and will give a poor user experience. In order to quickly display playlists updates and ensure interoperability with other control points on the network, it is strongly recommended that you maintain the following two data structures:&lt;br /&gt;
&lt;br /&gt;
* A copy of the latest IdArray and TokenArray&lt;br /&gt;
* A cache mapping id's to their associated metadata.&lt;br /&gt;
&lt;br /&gt;
With this decoupled approach, you only need to fetch the metadata for the ids added to the playlists. Changes to the order of ids in the playlists require no action.&lt;br /&gt;
&lt;br /&gt;
As a further enhancement, when an insert completes successfully, you know both the metadata (as you supplied it), and the new id (returned by the PlaylistManager on completion of the insert action). This information can be directly inserted into the cache, saving subsequent unnecessary retrieval.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService</id>
		<title>Av:Developer:PlaylistManagerService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistManagerService"/>
				<updated>2011-07-27T09:43:51Z</updated>
		
		<summary type="html">&lt;p&gt;Davidd: Created page with &amp;quot;= Architectural Overview =  The PlaylistManager service provides the ability to create and maintain playlists.  The PlaylistManager service provides access to a list of playlists...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides the ability to create and maintain playlists.&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service provides access to a list of playlists, which in turn, contain a list of tracks.&lt;br /&gt;
&lt;br /&gt;
Using the PlaylistManager service you can read, insert and delete playlists as well as read, insert and delete tracks from an individual playlist. Each playlist and track within a playlist is given a unique id.&lt;br /&gt;
&lt;br /&gt;
To insert a playlist, provide the id of the playlist you wish to insert 'after' and the associated metadata, (name, description and image id). An empty playlist is inserted into the correct position and the id of the new playlist is returned. To insert in the first position, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
To insert a track, provide the id of the playlist and the id of the track you wish to insert 'after' and the associated udn and metadata id. The track is inserted and the id of the new track is returned. To insert in the first position. insert after the special id of 0. If the track originated from a media server the udn should contain the udn of the media server and the metadata id contain the id contained in the DidlLite of the track. Otherwise the udn should be empty and the metadata id contain DidlLite describing of the track.&lt;br /&gt;
&lt;br /&gt;
There are two ways to read the list of playlists or the list of tracks in a playlist. The first reads a single entry and the second reads a list of entries.&lt;br /&gt;
&lt;br /&gt;
There are two ways to delete the playlists or the the tracks in a playlist. The first deletes a single entry and the second deletes a list of entries.&lt;br /&gt;
&lt;br /&gt;
== IdArray and TokenIdArray ==&lt;br /&gt;
&lt;br /&gt;
The PlaylistManager service has two eventide state variable called IdArray and TokenArray. Both arrays are base64 encoded arrays of 32 bit, big endian unsigned integers. Each Id and Token represents a playlist in the list of playlists. An empty array indicates an empty list if playlists. A Change in Token for a playlist indicates that the playlist contents has changed.&lt;br /&gt;
&lt;br /&gt;
== Playlist IdArray ==&lt;br /&gt;
&lt;br /&gt;
The obtain a playlist's IdArray, provide the id of the playlist to the action PlaylistReadArray. The IdArray returned is a base64 encoded array of 32 bit, big endian unsigned integers. Each Id represents a track in the playlist. An empty IdArray indicates an empty playlist.&lt;br /&gt;
&lt;br /&gt;
== Events ==&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any change to the list of playlists, the PlaylistManager will event all subscribers the current IdArray and TokenArray. The eventing of these state variables is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
A short while (approx 300ms) after any changes to a playlist, the PlaylistManager will event all subscribers the current TokenArray. The eventing of this state variable is moderated to prevent excessive updates.&lt;br /&gt;
&lt;br /&gt;
== Polling ==&lt;br /&gt;
&lt;br /&gt;
For control points that can't subscribe to events, two additional actions are provided. The first, PlaylistArrays, reads the IdArray and TokenArray directly. This action also returns an ArraysToken, which should be saved and periodically passed to a second action, PlaylistArraysChanged, which reports whether or not your copy of IdArray and TokenArray are out of date. If they are, calling PlaylistArrays again will ensure you have up to date versions.&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    : PlaylistManager&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PlaylistManager Service Description (XML) ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;xml&amp;quot;&amp;gt;&lt;br /&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;
&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&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;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;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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImagesXml&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;ImagesXml&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;ImagesXml&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;
&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistReadArray&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;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;PlaylistReadMetadata&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;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;PlaylistRead&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;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;Description&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ImageId&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;ImageId&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;PlaylistUpdate&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistInsert&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;Name&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;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;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;Description&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;ImageId&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;ImageId&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;PlaylistDeleteId&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;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;PlaylistDeleteAll&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;PlaylistsMax&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;PlaylistsMax&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;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;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;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;PlaylistArrays&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;ArraysToken&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;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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TokenArray&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;TokenArray&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;PlaylistArraysChanged&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;ArraysToken&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;
&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;TrackId&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;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;TrackIdList&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;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;AfterTrackId&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;Udn&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;Udn&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;MetadataId&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;MetadataId&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;NewTrackId&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;DeleteId&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;TrackId&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;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;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;DeleteAll&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;TrackId&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;/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;
&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;ImagesXml&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;bin.base64&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;TokenArray&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;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistsMax&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;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;
&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PlaylistList&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;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;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;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;no&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;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ImageId&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;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;Udn&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;MetadataId&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;ArraysToken&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;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Davidd</name></author>	</entry>

	</feed>