<?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=Joshh&amp;title=Special%3AContributions</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=Joshh&amp;title=Special%3AContributions"/>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Special:Contributions/Joshh"/>
		<updated>2026-05-22T04:21:33Z</updated>
		<subtitle>From OpenHome</subtitle>
		<generator>MediaWiki 1.16.2</generator>

	<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>2013-06-13T08:31:47Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ProductRoom */&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 Product service.  Presence of various other services can be inferred from the sources and attributes this reports.&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;
=== 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 SourceXml action / state variable.&lt;br /&gt;
=== SetSourceIndexByName ===&lt;br /&gt;
Set the currently active source.  The value specified is matched against the Type attributes from the SourceXml action / state variable.&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Query the value of the SourceXml state variable.&lt;br /&gt;
=== SourceXmlChangeCount ===&lt;br /&gt;
Query how often the SourceXml state variable has been updated.  This action can be polled by clients that don’t support eventing.  Whenever the value returned increases, the SourceXml 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 Attributes state variable.&lt;br /&gt;
&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
Return the values of the ManufacturerName, ManufacturerInfo, ManufacturerUrl, ManufacturerImageUri 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 ModelName, ModelInfo, ModelUrl, ModelImageUri 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 ProductRoom, ProductName, ProductInfo, ProductUrl, ProductImageUri state variables.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Return the value of the Standby state variable.&lt;br /&gt;
=== SetStandby ===&lt;br /&gt;
Set the value of the Standby 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;
= State Variables =&lt;br /&gt;
== Sources ==&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
The number of available sources.  Read-only.&lt;br /&gt;
=== SourceIndex ===&lt;br /&gt;
The index of the currently active source.  This is zero-based so will be in the range [0..SourceCount-1]&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;[system name for source.  Read-only]&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.  Read-only.&lt;br /&gt;
=== ManufacturerInfo ===&lt;br /&gt;
Manufacturer information.  Read-only&lt;br /&gt;
=== ManufacturerName ===&lt;br /&gt;
Manufacturer name.  Read-only.&lt;br /&gt;
=== ManufacturerUrl ===&lt;br /&gt;
URL for manufacturer web site.  Read only.&lt;br /&gt;
=== ModelImageUri ===&lt;br /&gt;
Uri for model’s icon.  Read-only.&lt;br /&gt;
=== ModelInfo ===&lt;br /&gt;
Model information.  Read-only.&lt;br /&gt;
=== ModelName ===&lt;br /&gt;
Model name.  Read-only.&lt;br /&gt;
=== ModelUrl ===&lt;br /&gt;
URL for model web site.  Read-only.&lt;br /&gt;
=== ProductImageUri ===&lt;br /&gt;
Uri for product image.  Read-only.&lt;br /&gt;
&lt;br /&gt;
=== ProductInfo ===&lt;br /&gt;
Product information.  Read-only.&lt;br /&gt;
=== ProductName ===&lt;br /&gt;
User-visible product name.  By default this is set to ModelName.&lt;br /&gt;
Note that the UPnP friendly name is derived by combining this with Room name in the form Room : Name&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;
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 ProductRoom 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;
&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>Joshh</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>2013-06-13T08:30:46Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ProductImageUri */&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 Product service.  Presence of various other services can be inferred from the sources and attributes this reports.&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;
=== 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 SourceXml action / state variable.&lt;br /&gt;
=== SetSourceIndexByName ===&lt;br /&gt;
Set the currently active source.  The value specified is matched against the Type attributes from the SourceXml action / state variable.&lt;br /&gt;
=== SourceXml ===&lt;br /&gt;
Query the value of the SourceXml state variable.&lt;br /&gt;
=== SourceXmlChangeCount ===&lt;br /&gt;
Query how often the SourceXml state variable has been updated.  This action can be polled by clients that don’t support eventing.  Whenever the value returned increases, the SourceXml 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 Attributes state variable.&lt;br /&gt;
&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
Return the values of the ManufacturerName, ManufacturerInfo, ManufacturerUrl, ManufacturerImageUri 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 ModelName, ModelInfo, ModelUrl, ModelImageUri 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 ProductRoom, ProductName, ProductInfo, ProductUrl, ProductImageUri state variables.&lt;br /&gt;
&lt;br /&gt;
== Standby ==&lt;br /&gt;
=== Standby ===&lt;br /&gt;
Return the value of the Standby state variable.&lt;br /&gt;
=== SetStandby ===&lt;br /&gt;
Set the value of the Standby 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;
= State Variables =&lt;br /&gt;
== Sources ==&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
The number of available sources.  Read-only.&lt;br /&gt;
=== SourceIndex ===&lt;br /&gt;
The index of the currently active source.  This is zero-based so will be in the range [0..SourceCount-1]&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;[system name for source.  Read-only]&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.  Read-only.&lt;br /&gt;
=== ManufacturerInfo ===&lt;br /&gt;
Manufacturer information.  Read-only&lt;br /&gt;
=== ManufacturerName ===&lt;br /&gt;
Manufacturer name.  Read-only.&lt;br /&gt;
=== ManufacturerUrl ===&lt;br /&gt;
URL for manufacturer web site.  Read only.&lt;br /&gt;
=== ModelImageUri ===&lt;br /&gt;
Uri for model’s icon.  Read-only.&lt;br /&gt;
=== ModelInfo ===&lt;br /&gt;
Model information.  Read-only.&lt;br /&gt;
=== ModelName ===&lt;br /&gt;
Model name.  Read-only.&lt;br /&gt;
=== ModelUrl ===&lt;br /&gt;
URL for model web site.  Read-only.&lt;br /&gt;
=== ProductImageUri ===&lt;br /&gt;
Uri for product image.  Read-only.&lt;br /&gt;
&lt;br /&gt;
=== ProductInfo ===&lt;br /&gt;
Product information.  Read-only.&lt;br /&gt;
=== ProductName ===&lt;br /&gt;
User-visible product name.  By default this is set to ModelName.&lt;br /&gt;
Note that the UPnP friendly name is derived by combining this with Room name in the form Room : Name&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;
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 ProductRoom name. Room is set to Main Room by default.&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;
&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>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia</id>
		<title>OhMedia</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia"/>
				<updated>2011-12-15T21:08:44Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohProduct and ohTopology */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ohMedia Overview =&lt;br /&gt;
&lt;br /&gt;
ohMedia is an open standard that allows the seamless interaction of media within your home.&lt;br /&gt;
&lt;br /&gt;
ohMedia's high level design is influenced by the UPnP AV standard (UAV). UAV correctly modelled media in the home as the interaction between 3 types of devices: Control Points, Media Renderers, and Media Servers.&lt;br /&gt;
&amp;lt;&amp;lt;picture&amp;gt;&amp;gt;&lt;br /&gt;
This model correctly identified the potential presence of an arbitrary number of each of these devices. However, the Media Server specification, and in particular the Media Renderer specification is deeply flawed. The next section explains those flaws and outlines how ohMedia fixes them.&lt;br /&gt;
&lt;br /&gt;
= Flaws in the UPnP AV Standard =&lt;br /&gt;
&lt;br /&gt;
== Problem 1: No support for gap-less audio ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification is technically able to support gap-less audio though the AV Transport service actions, setAVTRansportURI and setNextAVTransportURI. However, the UPnP forum chose to make the setNextAVTransportURI action optional. This meant that no, or very few, media renderer manufacturers chose to support the action, which in turn, meant that no control points have added support for gap-less audio. So the real world situation is that UPnP AV has no support for gap-less audio.&lt;br /&gt;
&lt;br /&gt;
== Problem 2: No support for a user's playlist to continue playing when a control point is turned off ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification only allows for a media renderer to store a maximum of two URIs, but, as previously discussed, the real world maximum is in fact only a single URI. This means that in order for a media renderer to play a user created playlist the control point has to be continually monitoring the media renderer. When the media renderer indicates that it has finished playing the current URI the control point then has to set the next URI. If the control point is turned off and not monitoring the media renderer then the media renderer will not be informed of the next URI and playback will stop.&lt;br /&gt;
&lt;br /&gt;
== Problem 3:  No support for multiple control points ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification caters for the case where a user wants multiple control  points to show the metadata that is associated with the currently playing URI. However when it comes to controlling a media renderer from multiple control points the standard quickly shows it inadequacies.&lt;br /&gt;
&lt;br /&gt;
The main problems comes from the fact that the media renderer only holds a URI for the currently playing URI. This means that only the control point that the user used to create a playlist has knowledge about the playlist. As described earlier, because this control point holds the user's playlist it is actually controlling the flow of URIs to the media renderer. What happens if the same user adds tracks to a different control point? At this point two control points are trying to control the flow of different URIs to the media renderer. At this point the whole system fails to operate as the user expects.&lt;br /&gt;
&lt;br /&gt;
When a user creates a playlist on their control point and starts playback on a UPnP AV media renderer the renderer only holds the currently playing URI. When the renderer finishes the current URI the control point provides the renderer with next URI. If the control point is turned off at the point when the renderer finishes playing the current URI the renderer will stop playback.&lt;br /&gt;
&lt;br /&gt;
With the control point controlling the flow of URIs to the media renderer the UPnP AV media renderer specification violates the 3 box model separation where the control point should, without any intervention, enable content to flow between the media server and media renderer.&lt;br /&gt;
&lt;br /&gt;
== Problem 4: No concept of a Hi-Fi system comprising of more than one product or a home comprising of more than one Hi-Fi system ==&lt;br /&gt;
&lt;br /&gt;
A modern home can have one or more Hi-Fi systems of which each Hi-Fi system can comprise of one or more products connected together, e.g. a media player and a pre-amp.&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard assumes a single box which is made up of a single source and possibly a volume control. The standard has no way of representing a system that is made up of several different boxes connected together, e.g. a media renderer connected into a pre-amp. Taking the example of a media renderer connected to a pre-amp, without the ability to represent the different boxes and how they are connected it is impossible, using the UPnP AV standard, to select the input on the pre-amp that the media renderer is connected to when the user selects the media renderer in a control point.&lt;br /&gt;
&lt;br /&gt;
== Problem 5: Media's URI changing when media server rebuilds its database ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media server specification does not have a requirement for media servers to present a piece of media to the network with the same URI. This has resulted in media server implementations that change media URIs when a user changes their media collection. This results in unexpected behaviour for the user. For example, a user plays some media on their renderer. The user then modifies their media collection which results in the media server rebuilding its database. The user then presses play on their renderer to only hear nothing (the URI is now no longer valid) or worse some different piece of media (the URI now represents some different media).&lt;br /&gt;
&lt;br /&gt;
= ohMeida Solutions =&lt;br /&gt;
The ohMedia standard has been designed to solve all the problems described above.&lt;br /&gt;
&lt;br /&gt;
The first three problems are solved through the [[#ohPlaylist|ohPlaylist]] service specification.&lt;br /&gt;
&lt;br /&gt;
Problem 4 is solved through the [[#ohProduct_and_ohTopology|ohProduct service specification and the ohTopology algorithm]].&lt;br /&gt;
&lt;br /&gt;
Problem 5 is solved through the [[#Server|ohMedia server]] specification.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard goes further and adds the [[#ohSongcast|ohSongcast]] standard. [[#ohSongcast|ohSongcast]] provides the ability to synchronise playback between products, commonly referred to as party mode. However in general [[#ohSongcast|ohSongcast]] provides the ability for a product to stream its audio over a standard home network and for any product that supports the [[#ohSongcast|ohSongcast]] receiver specification to receive the audio and play it back.&lt;br /&gt;
&lt;br /&gt;
= How it works =&lt;br /&gt;
&lt;br /&gt;
ohMedia models media in the home through the interaction of 3 types of device, Control Points, Media Players and Media Servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of 3 devices as before, but with arrows labelled with 1. Browse, 2. Tell, 3. Retrieve&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Control Point first browses the Media Server to locate the desired media. The Control Point then tells the Media Player to play the selected media and finally Media Player retrieves the media from the Media Server.&lt;br /&gt;
&lt;br /&gt;
== ohProduct and ohTopology ==&lt;br /&gt;
&lt;br /&gt;
ohMedia models a home as a number Hi-Fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
ohMedia models a Hi-Fi system 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 one output and any number of sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;diagram of a product with multi-in, one out&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the ohProduct 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 ohTopology algorithm. The ohTopology algorithm is as follows,&lt;br /&gt;
&lt;br /&gt;
#discover all the products in the home that have an ohProduct 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;
&lt;br /&gt;
e.g. if we had two products, a pre-amp and a media player, which were connected together then both their ohProduct services would return the same room name and one of the source names returned by the pre-amp's ohProduct service would be the same as the product name returned by the media renderer's ohProduct service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of example&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines four source types,&lt;br /&gt;
&lt;br /&gt;
#Playlist – product supports on device playlists&lt;br /&gt;
#Radio – product supports internet radio with presets&lt;br /&gt;
#Receiver – product supports receiving ohSongcast broadcasts&lt;br /&gt;
#UpnpAv – product also implements the UPnP AV media renderer specification&lt;br /&gt;
&lt;br /&gt;
If a source type is not one of the types above an ohMedia control point will be able to switch to the source but will treat the source as a non controllable external input e.g. Analogue, TOS or HDMI.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines three attributes,&lt;br /&gt;
&lt;br /&gt;
#Volume – product supports volume control&lt;br /&gt;
#Info – product supports providing information about the currently playing media&lt;br /&gt;
#Time – product supports providing the current time within the currently playing media&lt;br /&gt;
#Sender – product supports ohSongcast broadcasting&lt;br /&gt;
&lt;br /&gt;
== ohPlaylist ==&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist specification has been designed to allow gap-less audio, playlists to proceed without the intervention of a control point and to function correctly under the manipulation of multiple control points.&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist is a list of media associated with a unique ID. Media is defined by its URI and metadata. A control point is required to keep in memory the current list of playlist IDs. This list of IDs can then be used to list the media in the order of play, obtain the metadata and manipulate the list.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the API that allow control points to manipulate, keep track of playlist changes and control playback.&lt;br /&gt;
&lt;br /&gt;
== ohSongcast ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Developers =&lt;br /&gt;
&lt;br /&gt;
If you are interested in ohMedia development, more information can be found [[Av:Developer|here]]&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Oh:Overview</id>
		<title>Oh:Overview</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Oh:Overview"/>
				<updated>2011-12-15T21:07:46Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohOs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The adoption of broadband internet and the proliferation of wifi-connected devices such as smartphones, web tablets, and netbooks has resulted in the computer network becoming a standard feature of the modern home. But there are a number of ways in which the modern family is yet to realize the full benefit of this home networking revolution.&lt;br /&gt;
&lt;br /&gt;
OpenHome is an independent body committed to redressing this through the design, implementation, and promotion of open standards. It stimulates innovation by transforming the home network into a rich environment for applications that fit with the way families live.&lt;br /&gt;
&lt;br /&gt;
= [[OhOs|ohOs]] =&lt;br /&gt;
&lt;br /&gt;
Users of personal computers and portable computing devices are familiar with the process of installing applications according to their own personal tastes or needs. But there are a number of applications that do not fit neatly into this pattern of deployment and use.&lt;br /&gt;
&lt;br /&gt;
The OpenHome Operating System, [[OhOs|ohOs]], fills this gap by providing a place to deploy software that is for use not only by a single individual but by all family members. And in doing so [[OhOs|ohOs]] opens the way for applications that:&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
* Allow the family to access and control a wide range of domestic appliances, such as lights, media players, and security cameras, organized from the perspective of the home as a whole.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone controlling lights using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Allow the family to view, and maintain structured information that is most meaningful in the context of the home, such as shared calendars, family address books, and photo albums.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone putting car servicing appointment into a family calendar using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Provide opportunities for creativity and fun for the family as a whole. &lt;br /&gt;
&lt;br /&gt;
[Illustration of family members each with their own iPad or iPhone jointly doing a crossword?]&lt;br /&gt;
&lt;br /&gt;
* Provide rich, user-friendly control over otherwise technically challenging networking facilities, such as parental control over internet access.&lt;br /&gt;
&lt;br /&gt;
[Illustration of a child unable to access the internet from their bedroom at night with happy care-free parents downstairs?]&lt;br /&gt;
&lt;br /&gt;
* Provide a trusted domain for archiving and messaging that keeps all information safely within the boundary of the domestic network.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone storing the code for a safe using an iPhone-like device?]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
[[OhOs|ohOs]] achieves this by providing lightweight, always-on, networked computing for applications that can be installed from a readily accessible app store and used by any web-browser-enabled device.&lt;br /&gt;
&lt;br /&gt;
= [[OhMedia|ohMedia]] =&lt;br /&gt;
&lt;br /&gt;
Networked audio was arguably the first popular application for the networked home. The idea of storing a digital music collection on a central server and playing it on a range of networked audio devices has begun to take hold. Add to this the idea that choosing and controlling that music should be possible from wirelessly networked mobile devices and we have the basic architecture for home audio that was first outlined in the UPnP AV specification.&lt;br /&gt;
&lt;br /&gt;
[Illustration of networked audio home with music being enjoyed in different rooms and being controlled by iPad-like devices]&lt;br /&gt;
&lt;br /&gt;
However, UPnP AV contains serious oversights and flaws that prevent it from delivering an appealing networked music experience throughout the home.&lt;br /&gt;
&lt;br /&gt;
OpenHome addresses this by creating a set of open extensions to UPnP AV that were designed from the ground up from a home-centered perspective. Furthermore, OpenHome goes beyond UPnP AV by developing completely new network standards, such as Songcast, which deliver additional home-centered functionality. More details are avaliable [[OhMedia|here]].&lt;br /&gt;
&lt;br /&gt;
= [[Oh:Downloads|ohDownload]] =&lt;br /&gt;
&lt;br /&gt;
OpenHome maintains that open standards are best developed in parallel with real-world implementations of those standards. This ensures that they are both fit for use and immediately available for use.&lt;br /&gt;
&lt;br /&gt;
[Possible illustration of person in ivory tower dreaming of ridiculous fantastical car, and person on the ground dreaming of really good car]&lt;br /&gt;
&lt;br /&gt;
In pursuit of this principle, OpenHome publishes an ever-growing suite of high quality, open software that is actively maintained and already proven in successful commercial products.&lt;br /&gt;
&lt;br /&gt;
This includes:&lt;br /&gt;
&lt;br /&gt;
* [[OhNet|ohNet]], the OpenHome networking stack, which facilitates the creation of service-oriented, SOAP-based networking software with inherent UPnP support.&lt;br /&gt;
&lt;br /&gt;
* [[OhSongcast|ohSongcast]], which implements OpenHome standards for one-to-many transmission of audio around a home network&lt;br /&gt;
&lt;br /&gt;
* [[OhNetworkMonitor|ohNetworkMonitor]], which provides facilities for troubleshooting home networking problems&lt;br /&gt;
&lt;br /&gt;
OpenHome software may be downloaded [[Oh:Downloads|here]].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Oh:Overview</id>
		<title>Oh:Overview</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Oh:Overview"/>
				<updated>2011-12-15T21:05:56Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohOs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The adoption of broadband internet and the proliferation of wifi-connected devices such as smartphones, web tablets, and netbooks has resulted in the computer network becoming a standard feature of the modern home. But there are a number of ways in which the modern family is yet to realize the full benefit of this home networking revolution.&lt;br /&gt;
&lt;br /&gt;
OpenHome is an independent body committed to redressing this through the design, implementation, and promotion of open standards. It stimulates innovation by transforming the home network into a rich environment for applications that fit with the way families live.&lt;br /&gt;
&lt;br /&gt;
= [[OhOs|ohOs]] =&lt;br /&gt;
&lt;br /&gt;
Users of personal computers and portable computing devices are familiar with the process of installing applications according to their own personal tastes or needs. But there are a number of applications that do not fit neatly into this pattern of deployment and use.&lt;br /&gt;
&lt;br /&gt;
The OpenHome Operating System, [[OhOs|ohOs]], fills this gap by providing a place to deploy software that is for use not only by a single individual but by all family members. And in doing so [[OhOs|ohOs]] opens the way for applications that:&lt;br /&gt;
&lt;br /&gt;
; Allow the family to access and control a wide range of domestic appliances, such as lights, media players, and security cameras, organized from the perspective of the home as a whole.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone controlling lights using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
; Allow the family to view, and maintain structured information that is most meaningful in the context of the home, such as shared calendars, family address books, and photo albums.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone putting car servicing appointment into a family calendar using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
# Provide opportunities for creativity and fun for the family as a whole. &lt;br /&gt;
&lt;br /&gt;
[Illustration of family members each with their own iPad or iPhone jointly doing a crossword?]&lt;br /&gt;
&lt;br /&gt;
# Provide rich, user-friendly control over otherwise technically challenging networking facilities, such as parental control over internet access.&lt;br /&gt;
&lt;br /&gt;
[Illustration of a child unable to access the internet from their bedroom at night with happy care-free parents downstairs?]&lt;br /&gt;
&lt;br /&gt;
# Provide a trusted domain for archiving and messaging that keeps all information safely within the boundary of the domestic network.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone storing the code for a safe using an iPhone-like device?]&lt;br /&gt;
&lt;br /&gt;
[[OhOs|ohOs]] achieves this by providing lightweight, always-on, networked computing for applications that can be installed from a readily accessible app store and used by any web-browser-enabled device.&lt;br /&gt;
&lt;br /&gt;
= [[OhMedia|ohMedia]] =&lt;br /&gt;
&lt;br /&gt;
Networked audio was arguably the first popular application for the networked home. The idea of storing a digital music collection on a central server and playing it on a range of networked audio devices has begun to take hold. Add to this the idea that choosing and controlling that music should be possible from wirelessly networked mobile devices and we have the basic architecture for home audio that was first outlined in the UPnP AV specification.&lt;br /&gt;
&lt;br /&gt;
[Illustration of networked audio home with music being enjoyed in different rooms and being controlled by iPad-like devices]&lt;br /&gt;
&lt;br /&gt;
However, UPnP AV contains serious oversights and flaws that prevent it from delivering an appealing networked music experience throughout the home.&lt;br /&gt;
&lt;br /&gt;
OpenHome addresses this by creating a set of open extensions to UPnP AV that were designed from the ground up from a home-centered perspective. Furthermore, OpenHome goes beyond UPnP AV by developing completely new network standards, such as Songcast, which deliver additional home-centered functionality. More details are avaliable [[OhMedia|here]].&lt;br /&gt;
&lt;br /&gt;
= [[Oh:Downloads|ohDownload]] =&lt;br /&gt;
&lt;br /&gt;
OpenHome maintains that open standards are best developed in parallel with real-world implementations of those standards. This ensures that they are both fit for use and immediately available for use.&lt;br /&gt;
&lt;br /&gt;
[Possible illustration of person in ivory tower dreaming of ridiculous fantastical car, and person on the ground dreaming of really good car]&lt;br /&gt;
&lt;br /&gt;
In pursuit of this principle, OpenHome publishes an ever-growing suite of high quality, open software that is actively maintained and already proven in successful commercial products.&lt;br /&gt;
&lt;br /&gt;
This includes:&lt;br /&gt;
&lt;br /&gt;
* [[OhNet|ohNet]], the OpenHome networking stack, which facilitates the creation of service-oriented, SOAP-based networking software with inherent UPnP support.&lt;br /&gt;
&lt;br /&gt;
* [[OhSongcast|ohSongcast]], which implements OpenHome standards for one-to-many transmission of audio around a home network&lt;br /&gt;
&lt;br /&gt;
* [[OhNetworkMonitor|ohNetworkMonitor]], which provides facilities for troubleshooting home networking problems&lt;br /&gt;
&lt;br /&gt;
OpenHome software may be downloaded [[Oh:Downloads|here]].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Oh:Overview</id>
		<title>Oh:Overview</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Oh:Overview"/>
				<updated>2011-12-15T21:05:42Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohOs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The adoption of broadband internet and the proliferation of wifi-connected devices such as smartphones, web tablets, and netbooks has resulted in the computer network becoming a standard feature of the modern home. But there are a number of ways in which the modern family is yet to realize the full benefit of this home networking revolution.&lt;br /&gt;
&lt;br /&gt;
OpenHome is an independent body committed to redressing this through the design, implementation, and promotion of open standards. It stimulates innovation by transforming the home network into a rich environment for applications that fit with the way families live.&lt;br /&gt;
&lt;br /&gt;
= [[OhOs|ohOs]] =&lt;br /&gt;
&lt;br /&gt;
Users of personal computers and portable computing devices are familiar with the process of installing applications according to their own personal tastes or needs. But there are a number of applications that do not fit neatly into this pattern of deployment and use.&lt;br /&gt;
&lt;br /&gt;
The OpenHome Operating System, [[OhOs|ohOs]], fills this gap by providing a place to deploy software that is for use not only by a single individual but by all family members. And in doing so [[OhOs|ohOs]] opens the way for applications that:&lt;br /&gt;
&lt;br /&gt;
# Allow the family to access and control a wide range of domestic appliances, such as lights, media players, and security cameras, organized from the perspective of the home as a whole.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone controlling lights using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
# Allow the family to view, and maintain structured information that is most meaningful in the context of the home, such as shared calendars, family address books, and photo albums.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone putting car servicing appointment into a family calendar using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
# Provide opportunities for creativity and fun for the family as a whole. &lt;br /&gt;
&lt;br /&gt;
[Illustration of family members each with their own iPad or iPhone jointly doing a crossword?]&lt;br /&gt;
&lt;br /&gt;
# Provide rich, user-friendly control over otherwise technically challenging networking facilities, such as parental control over internet access.&lt;br /&gt;
&lt;br /&gt;
[Illustration of a child unable to access the internet from their bedroom at night with happy care-free parents downstairs?]&lt;br /&gt;
&lt;br /&gt;
# Provide a trusted domain for archiving and messaging that keeps all information safely within the boundary of the domestic network.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone storing the code for a safe using an iPhone-like device?]&lt;br /&gt;
&lt;br /&gt;
[[OhOs|ohOs]] achieves this by providing lightweight, always-on, networked computing for applications that can be installed from a readily accessible app store and used by any web-browser-enabled device.&lt;br /&gt;
&lt;br /&gt;
= [[OhMedia|ohMedia]] =&lt;br /&gt;
&lt;br /&gt;
Networked audio was arguably the first popular application for the networked home. The idea of storing a digital music collection on a central server and playing it on a range of networked audio devices has begun to take hold. Add to this the idea that choosing and controlling that music should be possible from wirelessly networked mobile devices and we have the basic architecture for home audio that was first outlined in the UPnP AV specification.&lt;br /&gt;
&lt;br /&gt;
[Illustration of networked audio home with music being enjoyed in different rooms and being controlled by iPad-like devices]&lt;br /&gt;
&lt;br /&gt;
However, UPnP AV contains serious oversights and flaws that prevent it from delivering an appealing networked music experience throughout the home.&lt;br /&gt;
&lt;br /&gt;
OpenHome addresses this by creating a set of open extensions to UPnP AV that were designed from the ground up from a home-centered perspective. Furthermore, OpenHome goes beyond UPnP AV by developing completely new network standards, such as Songcast, which deliver additional home-centered functionality. More details are avaliable [[OhMedia|here]].&lt;br /&gt;
&lt;br /&gt;
= [[Oh:Downloads|ohDownload]] =&lt;br /&gt;
&lt;br /&gt;
OpenHome maintains that open standards are best developed in parallel with real-world implementations of those standards. This ensures that they are both fit for use and immediately available for use.&lt;br /&gt;
&lt;br /&gt;
[Possible illustration of person in ivory tower dreaming of ridiculous fantastical car, and person on the ground dreaming of really good car]&lt;br /&gt;
&lt;br /&gt;
In pursuit of this principle, OpenHome publishes an ever-growing suite of high quality, open software that is actively maintained and already proven in successful commercial products.&lt;br /&gt;
&lt;br /&gt;
This includes:&lt;br /&gt;
&lt;br /&gt;
* [[OhNet|ohNet]], the OpenHome networking stack, which facilitates the creation of service-oriented, SOAP-based networking software with inherent UPnP support.&lt;br /&gt;
&lt;br /&gt;
* [[OhSongcast|ohSongcast]], which implements OpenHome standards for one-to-many transmission of audio around a home network&lt;br /&gt;
&lt;br /&gt;
* [[OhNetworkMonitor|ohNetworkMonitor]], which provides facilities for troubleshooting home networking problems&lt;br /&gt;
&lt;br /&gt;
OpenHome software may be downloaded [[Oh:Downloads|here]].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia</id>
		<title>OhMedia</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia"/>
				<updated>2011-12-15T21:04:12Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Attributes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ohMedia Overview =&lt;br /&gt;
&lt;br /&gt;
ohMedia is an open standard that allows the seamless interaction of media within your home.&lt;br /&gt;
&lt;br /&gt;
ohMedia's high level design is influenced by the UPnP AV standard (UAV). UAV correctly modelled media in the home as the interaction between 3 types of devices: Control Points, Media Renderers, and Media Servers.&lt;br /&gt;
&amp;lt;&amp;lt;picture&amp;gt;&amp;gt;&lt;br /&gt;
This model correctly identified the potential presence of an arbitrary number of each of these devices. However, the Media Server specification, and in particular the Media Renderer specification is deeply flawed. The next section explains those flaws and outlines how ohMedia fixes them.&lt;br /&gt;
&lt;br /&gt;
= Flaws in the UPnP AV Standard =&lt;br /&gt;
&lt;br /&gt;
== Problem 1: No support for gap-less audio ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification is technically able to support gap-less audio though the AV Transport service actions, setAVTRansportURI and setNextAVTransportURI. However, the UPnP forum chose to make the setNextAVTransportURI action optional. This meant that no, or very few, media renderer manufacturers chose to support the action, which in turn, meant that no control points have added support for gap-less audio. So the real world situation is that UPnP AV has no support for gap-less audio.&lt;br /&gt;
&lt;br /&gt;
== Problem 2: No support for a user's playlist to continue playing when a control point is turned off ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification only allows for a media renderer to store a maximum of two URIs, but, as previously discussed, the real world maximum is in fact only a single URI. This means that in order for a media renderer to play a user created playlist the control point has to be continually monitoring the media renderer. When the media renderer indicates that it has finished playing the current URI the control point then has to set the next URI. If the control point is turned off and not monitoring the media renderer then the media renderer will not be informed of the next URI and playback will stop.&lt;br /&gt;
&lt;br /&gt;
== Problem 3:  No support for multiple control points ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification caters for the case where a user wants multiple control  points to show the metadata that is associated with the currently playing URI. However when it comes to controlling a media renderer from multiple control points the standard quickly shows it inadequacies.&lt;br /&gt;
&lt;br /&gt;
The main problems comes from the fact that the media renderer only holds a URI for the currently playing URI. This means that only the control point that the user used to create a playlist has knowledge about the playlist. As described earlier, because this control point holds the user's playlist it is actually controlling the flow of URIs to the media renderer. What happens if the same user adds tracks to a different control point? At this point two control points are trying to control the flow of different URIs to the media renderer. At this point the whole system fails to operate as the user expects.&lt;br /&gt;
&lt;br /&gt;
When a user creates a playlist on their control point and starts playback on a UPnP AV media renderer the renderer only holds the currently playing URI. When the renderer finishes the current URI the control point provides the renderer with next URI. If the control point is turned off at the point when the renderer finishes playing the current URI the renderer will stop playback.&lt;br /&gt;
&lt;br /&gt;
With the control point controlling the flow of URIs to the media renderer the UPnP AV media renderer specification violates the 3 box model separation where the control point should, without any intervention, enable content to flow between the media server and media renderer.&lt;br /&gt;
&lt;br /&gt;
== Problem 4: No concept of a Hi-Fi system comprising of more than one product or a home comprising of more than one Hi-Fi system ==&lt;br /&gt;
&lt;br /&gt;
A modern home can have one or more Hi-Fi systems of which each Hi-Fi system can comprise of one or more products connected together, e.g. a media player and a pre-amp.&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard assumes a single box which is made up of a single source and possibly a volume control. The standard has no way of representing a system that is made up of several different boxes connected together, e.g. a media renderer connected into a pre-amp. Taking the example of a media renderer connected to a pre-amp, without the ability to represent the different boxes and how they are connected it is impossible, using the UPnP AV standard, to select the input on the pre-amp that the media renderer is connected to when the user selects the media renderer in a control point.&lt;br /&gt;
&lt;br /&gt;
== Problem 5: Media's URI changing when media server rebuilds its database ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media server specification does not have a requirement for media servers to present a piece of media to the network with the same URI. This has resulted in media server implementations that change media URIs when a user changes their media collection. This results in unexpected behaviour for the user. For example, a user plays some media on their renderer. The user then modifies their media collection which results in the media server rebuilding its database. The user then presses play on their renderer to only hear nothing (the URI is now no longer valid) or worse some different piece of media (the URI now represents some different media).&lt;br /&gt;
&lt;br /&gt;
= ohMeida Solutions =&lt;br /&gt;
The ohMedia standard has been designed to solve all the problems described above.&lt;br /&gt;
&lt;br /&gt;
The first three problems are solved through the [[#ohPlaylist|ohPlaylist]] service specification.&lt;br /&gt;
&lt;br /&gt;
Problem 4 is solved through the [[#ohProduct_and_ohTopology|ohProduct service specification and the ohTopology algorithm]].&lt;br /&gt;
&lt;br /&gt;
Problem 5 is solved through the [[#Server|ohMedia server]] specification.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard goes further and adds the [[#ohSongcast|ohSongcast]] standard. [[#ohSongcast|ohSongcast]] provides the ability to synchronise playback between products, commonly referred to as party mode. However in general [[#ohSongcast|ohSongcast]] provides the ability for a product to stream its audio over a standard home network and for any product that supports the [[#ohSongcast|ohSongcast]] receiver specification to receive the audio and play it back.&lt;br /&gt;
&lt;br /&gt;
= How it works =&lt;br /&gt;
&lt;br /&gt;
ohMedia models media in the home through the interaction of 3 types of device, Control Points, Media Players and Media Servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of 3 devices as before, but with arrows labelled with 1. Browse, 2. Tell, 3. Retrieve&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Control Point first browses the Media Server to locate the desired media. The Control Point then tells the Media Player to play the selected media and finally Media Player retrieves the media from the Media Server.&lt;br /&gt;
&lt;br /&gt;
== ohProduct and ohTopology ==&lt;br /&gt;
&lt;br /&gt;
ohMedia models a home as a number Hi-Fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
ohMedia models a Hi-Fi system 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 one output and any number of sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;diagram of a product with multi-in, one out&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the ohProduct 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 ohTopology algorithm. The ohTopology algorithm is as follows,&lt;br /&gt;
&lt;br /&gt;
1.discover all the products in the home that have an ohProduct service&lt;br /&gt;
2.group the discovered products based on the room they are in&lt;br /&gt;
3.create a hierarchical tree structure by matching source names to product names&lt;br /&gt;
4.discover source functionality based on source type&lt;br /&gt;
5.discover additional functionality based on product attributes&lt;br /&gt;
&lt;br /&gt;
e.g. if we had two products, a pre-amp and a media player, which were connected together then both their ohProduct services would return the same room name and one of the source names returned by the pre-amp's ohProduct service would be the same as the product name returned by the media renderer's ohProduct service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of example&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines four source types,&lt;br /&gt;
&lt;br /&gt;
#Playlist – product supports on device playlists&lt;br /&gt;
#Radio – product supports internet radio with presets&lt;br /&gt;
#Receiver – product supports receiving ohSongcast broadcasts&lt;br /&gt;
#UpnpAv – product also implements the UPnP AV media renderer specification&lt;br /&gt;
&lt;br /&gt;
If a source type is not one of the types above an ohMedia control point will be able to switch to the source but will treat the source as a non controllable external input e.g. Analogue, TOS or HDMI.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines three attributes,&lt;br /&gt;
&lt;br /&gt;
#Volume – product supports volume control&lt;br /&gt;
#Info – product supports providing information about the currently playing media&lt;br /&gt;
#Time – product supports providing the current time within the currently playing media&lt;br /&gt;
#Sender – product supports ohSongcast broadcasting&lt;br /&gt;
&lt;br /&gt;
== ohPlaylist ==&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist specification has been designed to allow gap-less audio, playlists to proceed without the intervention of a control point and to function correctly under the manipulation of multiple control points.&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist is a list of media associated with a unique ID. Media is defined by its URI and metadata. A control point is required to keep in memory the current list of playlist IDs. This list of IDs can then be used to list the media in the order of play, obtain the metadata and manipulate the list.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the API that allow control points to manipulate, keep track of playlist changes and control playback.&lt;br /&gt;
&lt;br /&gt;
== ohSongcast ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Developers =&lt;br /&gt;
&lt;br /&gt;
If you are interested in ohMedia development, more information can be found [[Av:Developer|here]]&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia</id>
		<title>OhMedia</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia"/>
				<updated>2011-12-15T21:03:54Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Sources */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ohMedia Overview =&lt;br /&gt;
&lt;br /&gt;
ohMedia is an open standard that allows the seamless interaction of media within your home.&lt;br /&gt;
&lt;br /&gt;
ohMedia's high level design is influenced by the UPnP AV standard (UAV). UAV correctly modelled media in the home as the interaction between 3 types of devices: Control Points, Media Renderers, and Media Servers.&lt;br /&gt;
&amp;lt;&amp;lt;picture&amp;gt;&amp;gt;&lt;br /&gt;
This model correctly identified the potential presence of an arbitrary number of each of these devices. However, the Media Server specification, and in particular the Media Renderer specification is deeply flawed. The next section explains those flaws and outlines how ohMedia fixes them.&lt;br /&gt;
&lt;br /&gt;
= Flaws in the UPnP AV Standard =&lt;br /&gt;
&lt;br /&gt;
== Problem 1: No support for gap-less audio ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification is technically able to support gap-less audio though the AV Transport service actions, setAVTRansportURI and setNextAVTransportURI. However, the UPnP forum chose to make the setNextAVTransportURI action optional. This meant that no, or very few, media renderer manufacturers chose to support the action, which in turn, meant that no control points have added support for gap-less audio. So the real world situation is that UPnP AV has no support for gap-less audio.&lt;br /&gt;
&lt;br /&gt;
== Problem 2: No support for a user's playlist to continue playing when a control point is turned off ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification only allows for a media renderer to store a maximum of two URIs, but, as previously discussed, the real world maximum is in fact only a single URI. This means that in order for a media renderer to play a user created playlist the control point has to be continually monitoring the media renderer. When the media renderer indicates that it has finished playing the current URI the control point then has to set the next URI. If the control point is turned off and not monitoring the media renderer then the media renderer will not be informed of the next URI and playback will stop.&lt;br /&gt;
&lt;br /&gt;
== Problem 3:  No support for multiple control points ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification caters for the case where a user wants multiple control  points to show the metadata that is associated with the currently playing URI. However when it comes to controlling a media renderer from multiple control points the standard quickly shows it inadequacies.&lt;br /&gt;
&lt;br /&gt;
The main problems comes from the fact that the media renderer only holds a URI for the currently playing URI. This means that only the control point that the user used to create a playlist has knowledge about the playlist. As described earlier, because this control point holds the user's playlist it is actually controlling the flow of URIs to the media renderer. What happens if the same user adds tracks to a different control point? At this point two control points are trying to control the flow of different URIs to the media renderer. At this point the whole system fails to operate as the user expects.&lt;br /&gt;
&lt;br /&gt;
When a user creates a playlist on their control point and starts playback on a UPnP AV media renderer the renderer only holds the currently playing URI. When the renderer finishes the current URI the control point provides the renderer with next URI. If the control point is turned off at the point when the renderer finishes playing the current URI the renderer will stop playback.&lt;br /&gt;
&lt;br /&gt;
With the control point controlling the flow of URIs to the media renderer the UPnP AV media renderer specification violates the 3 box model separation where the control point should, without any intervention, enable content to flow between the media server and media renderer.&lt;br /&gt;
&lt;br /&gt;
== Problem 4: No concept of a Hi-Fi system comprising of more than one product or a home comprising of more than one Hi-Fi system ==&lt;br /&gt;
&lt;br /&gt;
A modern home can have one or more Hi-Fi systems of which each Hi-Fi system can comprise of one or more products connected together, e.g. a media player and a pre-amp.&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard assumes a single box which is made up of a single source and possibly a volume control. The standard has no way of representing a system that is made up of several different boxes connected together, e.g. a media renderer connected into a pre-amp. Taking the example of a media renderer connected to a pre-amp, without the ability to represent the different boxes and how they are connected it is impossible, using the UPnP AV standard, to select the input on the pre-amp that the media renderer is connected to when the user selects the media renderer in a control point.&lt;br /&gt;
&lt;br /&gt;
== Problem 5: Media's URI changing when media server rebuilds its database ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media server specification does not have a requirement for media servers to present a piece of media to the network with the same URI. This has resulted in media server implementations that change media URIs when a user changes their media collection. This results in unexpected behaviour for the user. For example, a user plays some media on their renderer. The user then modifies their media collection which results in the media server rebuilding its database. The user then presses play on their renderer to only hear nothing (the URI is now no longer valid) or worse some different piece of media (the URI now represents some different media).&lt;br /&gt;
&lt;br /&gt;
= ohMeida Solutions =&lt;br /&gt;
The ohMedia standard has been designed to solve all the problems described above.&lt;br /&gt;
&lt;br /&gt;
The first three problems are solved through the [[#ohPlaylist|ohPlaylist]] service specification.&lt;br /&gt;
&lt;br /&gt;
Problem 4 is solved through the [[#ohProduct_and_ohTopology|ohProduct service specification and the ohTopology algorithm]].&lt;br /&gt;
&lt;br /&gt;
Problem 5 is solved through the [[#Server|ohMedia server]] specification.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard goes further and adds the [[#ohSongcast|ohSongcast]] standard. [[#ohSongcast|ohSongcast]] provides the ability to synchronise playback between products, commonly referred to as party mode. However in general [[#ohSongcast|ohSongcast]] provides the ability for a product to stream its audio over a standard home network and for any product that supports the [[#ohSongcast|ohSongcast]] receiver specification to receive the audio and play it back.&lt;br /&gt;
&lt;br /&gt;
= How it works =&lt;br /&gt;
&lt;br /&gt;
ohMedia models media in the home through the interaction of 3 types of device, Control Points, Media Players and Media Servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of 3 devices as before, but with arrows labelled with 1. Browse, 2. Tell, 3. Retrieve&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Control Point first browses the Media Server to locate the desired media. The Control Point then tells the Media Player to play the selected media and finally Media Player retrieves the media from the Media Server.&lt;br /&gt;
&lt;br /&gt;
== ohProduct and ohTopology ==&lt;br /&gt;
&lt;br /&gt;
ohMedia models a home as a number Hi-Fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
ohMedia models a Hi-Fi system 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 one output and any number of sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;diagram of a product with multi-in, one out&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the ohProduct 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 ohTopology algorithm. The ohTopology algorithm is as follows,&lt;br /&gt;
&lt;br /&gt;
1.discover all the products in the home that have an ohProduct service&lt;br /&gt;
2.group the discovered products based on the room they are in&lt;br /&gt;
3.create a hierarchical tree structure by matching source names to product names&lt;br /&gt;
4.discover source functionality based on source type&lt;br /&gt;
5.discover additional functionality based on product attributes&lt;br /&gt;
&lt;br /&gt;
e.g. if we had two products, a pre-amp and a media player, which were connected together then both their ohProduct services would return the same room name and one of the source names returned by the pre-amp's ohProduct service would be the same as the product name returned by the media renderer's ohProduct service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of example&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines four source types,&lt;br /&gt;
&lt;br /&gt;
#Playlist – product supports on device playlists&lt;br /&gt;
#Radio – product supports internet radio with presets&lt;br /&gt;
#Receiver – product supports receiving ohSongcast broadcasts&lt;br /&gt;
#UpnpAv – product also implements the UPnP AV media renderer specification&lt;br /&gt;
&lt;br /&gt;
If a source type is not one of the types above an ohMedia control point will be able to switch to the source but will treat the source as a non controllable external input e.g. Analogue, TOS or HDMI.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines three attributes,&lt;br /&gt;
&lt;br /&gt;
1.Volume – product supports volume control&lt;br /&gt;
2.Info – product supports providing information about the currently playing media&lt;br /&gt;
3.Time – product supports providing the current time within the currently playing media&lt;br /&gt;
4.Sender – product supports ohSongcast broadcasting&lt;br /&gt;
&lt;br /&gt;
== ohPlaylist ==&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist specification has been designed to allow gap-less audio, playlists to proceed without the intervention of a control point and to function correctly under the manipulation of multiple control points.&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist is a list of media associated with a unique ID. Media is defined by its URI and metadata. A control point is required to keep in memory the current list of playlist IDs. This list of IDs can then be used to list the media in the order of play, obtain the metadata and manipulate the list.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the API that allow control points to manipulate, keep track of playlist changes and control playback.&lt;br /&gt;
&lt;br /&gt;
== ohSongcast ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Developers =&lt;br /&gt;
&lt;br /&gt;
If you are interested in ohMedia development, more information can be found [[Av:Developer|here]]&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia</id>
		<title>OhMedia</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia"/>
				<updated>2011-12-15T21:03:01Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ohMedia Overview =&lt;br /&gt;
&lt;br /&gt;
ohMedia is an open standard that allows the seamless interaction of media within your home.&lt;br /&gt;
&lt;br /&gt;
ohMedia's high level design is influenced by the UPnP AV standard (UAV). UAV correctly modelled media in the home as the interaction between 3 types of devices: Control Points, Media Renderers, and Media Servers.&lt;br /&gt;
&amp;lt;&amp;lt;picture&amp;gt;&amp;gt;&lt;br /&gt;
This model correctly identified the potential presence of an arbitrary number of each of these devices. However, the Media Server specification, and in particular the Media Renderer specification is deeply flawed. The next section explains those flaws and outlines how ohMedia fixes them.&lt;br /&gt;
&lt;br /&gt;
= Flaws in the UPnP AV Standard =&lt;br /&gt;
&lt;br /&gt;
== Problem 1: No support for gap-less audio ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification is technically able to support gap-less audio though the AV Transport service actions, setAVTRansportURI and setNextAVTransportURI. However, the UPnP forum chose to make the setNextAVTransportURI action optional. This meant that no, or very few, media renderer manufacturers chose to support the action, which in turn, meant that no control points have added support for gap-less audio. So the real world situation is that UPnP AV has no support for gap-less audio.&lt;br /&gt;
&lt;br /&gt;
== Problem 2: No support for a user's playlist to continue playing when a control point is turned off ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification only allows for a media renderer to store a maximum of two URIs, but, as previously discussed, the real world maximum is in fact only a single URI. This means that in order for a media renderer to play a user created playlist the control point has to be continually monitoring the media renderer. When the media renderer indicates that it has finished playing the current URI the control point then has to set the next URI. If the control point is turned off and not monitoring the media renderer then the media renderer will not be informed of the next URI and playback will stop.&lt;br /&gt;
&lt;br /&gt;
== Problem 3:  No support for multiple control points ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification caters for the case where a user wants multiple control  points to show the metadata that is associated with the currently playing URI. However when it comes to controlling a media renderer from multiple control points the standard quickly shows it inadequacies.&lt;br /&gt;
&lt;br /&gt;
The main problems comes from the fact that the media renderer only holds a URI for the currently playing URI. This means that only the control point that the user used to create a playlist has knowledge about the playlist. As described earlier, because this control point holds the user's playlist it is actually controlling the flow of URIs to the media renderer. What happens if the same user adds tracks to a different control point? At this point two control points are trying to control the flow of different URIs to the media renderer. At this point the whole system fails to operate as the user expects.&lt;br /&gt;
&lt;br /&gt;
When a user creates a playlist on their control point and starts playback on a UPnP AV media renderer the renderer only holds the currently playing URI. When the renderer finishes the current URI the control point provides the renderer with next URI. If the control point is turned off at the point when the renderer finishes playing the current URI the renderer will stop playback.&lt;br /&gt;
&lt;br /&gt;
With the control point controlling the flow of URIs to the media renderer the UPnP AV media renderer specification violates the 3 box model separation where the control point should, without any intervention, enable content to flow between the media server and media renderer.&lt;br /&gt;
&lt;br /&gt;
== Problem 4: No concept of a Hi-Fi system comprising of more than one product or a home comprising of more than one Hi-Fi system ==&lt;br /&gt;
&lt;br /&gt;
A modern home can have one or more Hi-Fi systems of which each Hi-Fi system can comprise of one or more products connected together, e.g. a media player and a pre-amp.&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard assumes a single box which is made up of a single source and possibly a volume control. The standard has no way of representing a system that is made up of several different boxes connected together, e.g. a media renderer connected into a pre-amp. Taking the example of a media renderer connected to a pre-amp, without the ability to represent the different boxes and how they are connected it is impossible, using the UPnP AV standard, to select the input on the pre-amp that the media renderer is connected to when the user selects the media renderer in a control point.&lt;br /&gt;
&lt;br /&gt;
== Problem 5: Media's URI changing when media server rebuilds its database ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media server specification does not have a requirement for media servers to present a piece of media to the network with the same URI. This has resulted in media server implementations that change media URIs when a user changes their media collection. This results in unexpected behaviour for the user. For example, a user plays some media on their renderer. The user then modifies their media collection which results in the media server rebuilding its database. The user then presses play on their renderer to only hear nothing (the URI is now no longer valid) or worse some different piece of media (the URI now represents some different media).&lt;br /&gt;
&lt;br /&gt;
= ohMeida Solutions =&lt;br /&gt;
The ohMedia standard has been designed to solve all the problems described above.&lt;br /&gt;
&lt;br /&gt;
The first three problems are solved through the [[#ohPlaylist|ohPlaylist]] service specification.&lt;br /&gt;
&lt;br /&gt;
Problem 4 is solved through the [[#ohProduct_and_ohTopology|ohProduct service specification and the ohTopology algorithm]].&lt;br /&gt;
&lt;br /&gt;
Problem 5 is solved through the [[#Server|ohMedia server]] specification.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard goes further and adds the [[#ohSongcast|ohSongcast]] standard. [[#ohSongcast|ohSongcast]] provides the ability to synchronise playback between products, commonly referred to as party mode. However in general [[#ohSongcast|ohSongcast]] provides the ability for a product to stream its audio over a standard home network and for any product that supports the [[#ohSongcast|ohSongcast]] receiver specification to receive the audio and play it back.&lt;br /&gt;
&lt;br /&gt;
= How it works =&lt;br /&gt;
&lt;br /&gt;
ohMedia models media in the home through the interaction of 3 types of device, Control Points, Media Players and Media Servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of 3 devices as before, but with arrows labelled with 1. Browse, 2. Tell, 3. Retrieve&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Control Point first browses the Media Server to locate the desired media. The Control Point then tells the Media Player to play the selected media and finally Media Player retrieves the media from the Media Server.&lt;br /&gt;
&lt;br /&gt;
== ohProduct and ohTopology ==&lt;br /&gt;
&lt;br /&gt;
ohMedia models a home as a number Hi-Fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
ohMedia models a Hi-Fi system 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 one output and any number of sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;diagram of a product with multi-in, one out&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the ohProduct 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 ohTopology algorithm. The ohTopology algorithm is as follows,&lt;br /&gt;
&lt;br /&gt;
1.discover all the products in the home that have an ohProduct service&lt;br /&gt;
2.group the discovered products based on the room they are in&lt;br /&gt;
3.create a hierarchical tree structure by matching source names to product names&lt;br /&gt;
4.discover source functionality based on source type&lt;br /&gt;
5.discover additional functionality based on product attributes&lt;br /&gt;
&lt;br /&gt;
e.g. if we had two products, a pre-amp and a media player, which were connected together then both their ohProduct services would return the same room name and one of the source names returned by the pre-amp's ohProduct service would be the same as the product name returned by the media renderer's ohProduct service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of example&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines four source types,&lt;br /&gt;
&lt;br /&gt;
1.Playlist – product supports on device playlists&lt;br /&gt;
2.Radio – product supports internet radio with presets&lt;br /&gt;
3.Receiver – product supports receiving ohSongcast broadcasts&lt;br /&gt;
4.UpnpAv – product also implements the UPnP AV media renderer specification&lt;br /&gt;
&lt;br /&gt;
If a source type is not one of the types above an ohMedia control point will be able to switch to the source but will treat the source as a non controllable external input e.g. Analogue, TOS or HDMI.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines three attributes,&lt;br /&gt;
&lt;br /&gt;
1.Volume – product supports volume control&lt;br /&gt;
2.Info – product supports providing information about the currently playing media&lt;br /&gt;
3.Time – product supports providing the current time within the currently playing media&lt;br /&gt;
4.Sender – product supports ohSongcast broadcasting&lt;br /&gt;
&lt;br /&gt;
== ohPlaylist ==&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist specification has been designed to allow gap-less audio, playlists to proceed without the intervention of a control point and to function correctly under the manipulation of multiple control points.&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist is a list of media associated with a unique ID. Media is defined by its URI and metadata. A control point is required to keep in memory the current list of playlist IDs. This list of IDs can then be used to list the media in the order of play, obtain the metadata and manipulate the list.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the API that allow control points to manipulate, keep track of playlist changes and control playback.&lt;br /&gt;
&lt;br /&gt;
== ohSongcast ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Developers =&lt;br /&gt;
&lt;br /&gt;
If you are interested in ohMedia development, more information can be found [[Av:Developer|here]]&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia</id>
		<title>OhMedia</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia"/>
				<updated>2011-12-15T21:01:01Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohMeida Solutions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ohMedia Overview =&lt;br /&gt;
&lt;br /&gt;
ohMedia is an open standard that allows the seamless interaction of media within your home.&lt;br /&gt;
&lt;br /&gt;
ohMedia's high level design is influenced by the UPnP AV standard (UAV). UAV correctly modelled media in the home as the interaction between 3 types of devices: Control Points, Media Renderers, and Media Servers.&lt;br /&gt;
&amp;lt;&amp;lt;picture&amp;gt;&amp;gt;&lt;br /&gt;
This model correctly identified the potential presence of an arbitrary number of each of these devices. However, the Media Server specification, and in particular the Media Renderer specification is deeply flawed. The next section explains those flaws and outlines how ohMedia fixes them.&lt;br /&gt;
&lt;br /&gt;
= Flaws in the UPnP AV Standard =&lt;br /&gt;
&lt;br /&gt;
== Problem 1: No support for gap-less audio ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification is technically able to support gap-less audio though the AV Transport service actions, setAVTRansportURI and setNextAVTransportURI. However, the UPnP forum chose to make the setNextAVTransportURI action optional. This meant that no, or very few, media renderer manufacturers chose to support the action, which in turn, meant that no control points have added support for gap-less audio. So the real world situation is that UPnP AV has no support for gap-less audio.&lt;br /&gt;
&lt;br /&gt;
== Problem 2: No support for a user's playlist to continue playing when a control point is turned off ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification only allows for a media renderer to store a maximum of two URIs, but, as previously discussed, the real world maximum is in fact only a single URI. This means that in order for a media renderer to play a user created playlist the control point has to be continually monitoring the media renderer. When the media renderer indicates that it has finished playing the current URI the control point then has to set the next URI. If the control point is turned off and not monitoring the media renderer then the media renderer will not be informed of the next URI and playback will stop.&lt;br /&gt;
&lt;br /&gt;
== Problem 3:  No support for multiple control points ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification caters for the case where a user wants multiple control  points to show the metadata that is associated with the currently playing URI. However when it comes to controlling a media renderer from multiple control points the standard quickly shows it inadequacies.&lt;br /&gt;
&lt;br /&gt;
The main problems comes from the fact that the media renderer only holds a URI for the currently playing URI. This means that only the control point that the user used to create a playlist has knowledge about the playlist. As described earlier, because this control point holds the user's playlist it is actually controlling the flow of URIs to the media renderer. What happens if the same user adds tracks to a different control point? At this point two control points are trying to control the flow of different URIs to the media renderer. At this point the whole system fails to operate as the user expects.&lt;br /&gt;
&lt;br /&gt;
When a user creates a playlist on their control point and starts playback on a UPnP AV media renderer the renderer only holds the currently playing URI. When the renderer finishes the current URI the control point provides the renderer with next URI. If the control point is turned off at the point when the renderer finishes playing the current URI the renderer will stop playback.&lt;br /&gt;
&lt;br /&gt;
With the control point controlling the flow of URIs to the media renderer the UPnP AV media renderer specification violates the 3 box model separation where the control point should, without any intervention, enable content to flow between the media server and media renderer.&lt;br /&gt;
&lt;br /&gt;
== Problem 4: No concept of a Hi-Fi system comprising of more than one product or a home comprising of more than one Hi-Fi system ==&lt;br /&gt;
&lt;br /&gt;
A modern home can have one or more Hi-Fi systems of which each Hi-Fi system can comprise of one or more products connected together, e.g. a media player and a pre-amp.&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard assumes a single box which is made up of a single source and possibly a volume control. The standard has no way of representing a system that is made up of several different boxes connected together, e.g. a media renderer connected into a pre-amp. Taking the example of a media renderer connected to a pre-amp, without the ability to represent the different boxes and how they are connected it is impossible, using the UPnP AV standard, to select the input on the pre-amp that the media renderer is connected to when the user selects the media renderer in a control point.&lt;br /&gt;
&lt;br /&gt;
== Problem 5: Media's URI changing when media server rebuilds its database ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media server specification does not have a requirement for media servers to present a piece of media to the network with the same URI. This has resulted in media server implementations that change media URIs when a user changes their media collection. This results in unexpected behaviour for the user. For example, a user plays some media on their renderer. The user then modifies their media collection which results in the media server rebuilding its database. The user then presses play on their renderer to only hear nothing (the URI is now no longer valid) or worse some different piece of media (the URI now represents some different media).&lt;br /&gt;
&lt;br /&gt;
= ohMeida Solutions =&lt;br /&gt;
The ohMedia standard has been designed to solve all the problems described above.&lt;br /&gt;
&lt;br /&gt;
The first three problems are solved through the [[#ohPlaylist|ohPlaylist]] service specification.&lt;br /&gt;
&lt;br /&gt;
Problem 4 is solved through the [[#ohProduct_and_ohTopology|ohProduct service specification and the ohTopology algorithm]].&lt;br /&gt;
&lt;br /&gt;
Problem 5 is solved through the [[#Server|ohMedia server]] specification.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard goes further and adds the [[#ohSongcast|ohSongcast]] standard. [[#ohSongcast|ohSongcast]] provides the ability to synchronise playback between products, commonly referred to as party mode. However in general [[#ohSongcast|ohSongcast]] provides the ability for a product to stream its audio over a standard home network and for any product that supports the [[#ohSongcast|ohSongcast]] receiver specification to receive the audio and play it back.&lt;br /&gt;
&lt;br /&gt;
= How it works =&lt;br /&gt;
&lt;br /&gt;
ohMedia models media in the home through the interaction of 3 types of device, Control Points, Media Players and Media Servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of 3 devices as before, but with arrows labelled with 1. Browse, 2. Tell, 3. Retrieve&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Control Point first browses the Media Server to locate the desired media. The Control Point then tells the Media Player to play the selected media and finally Media Player retrieves the media from the Media Server.&lt;br /&gt;
&lt;br /&gt;
== ohProduct and ohTopology ==&lt;br /&gt;
&lt;br /&gt;
ohMedia models a home as a number Hi-Fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
ohMedia models a Hi-Fi system 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 one output and any number of sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;diagram of a product with multi-in, one out&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the ohProduct 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 ohTopology algorithm. The ohTopology algorithm is as follows,&lt;br /&gt;
&lt;br /&gt;
1.discover all the products in the home that have an ohProduct service&lt;br /&gt;
2.group the discovered products based on the room they are in&lt;br /&gt;
3.create a hierarchical tree structure by matching source names to product names&lt;br /&gt;
4.discover source functionality based on source type&lt;br /&gt;
5.discover additional functionality based on product attributes&lt;br /&gt;
&lt;br /&gt;
e.g. if we had two products, a pre-amp and a media player, which were connected together then both their ohProduct services would return the same room name and one of the source names returned by the pre-amp's ohProduct service would be the same as the product name returned by the media renderer's ohProduct service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of example&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines four source types,&lt;br /&gt;
&lt;br /&gt;
1.Playlist – product supports on device playlists&lt;br /&gt;
2.Radio – product supports internet radio with presets&lt;br /&gt;
3.Receiver – product supports receiving ohSongcast broadcasts&lt;br /&gt;
4.UpnpAv – product also implements the UPnP AV media renderer specification&lt;br /&gt;
&lt;br /&gt;
If a source type is not one of the types above an ohMedia control point will be able to switch to the source but will treat the source as a non controllable external input e.g. Analogue, TOS or HDMI.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines three attributes,&lt;br /&gt;
&lt;br /&gt;
1.Volume – product supports volume control&lt;br /&gt;
2.Info – product supports providing information about the currently playing media&lt;br /&gt;
3.Time – product supports providing the current time within the currently playing media&lt;br /&gt;
4.Sender – product supports ohSongcast broadcasting&lt;br /&gt;
&lt;br /&gt;
== ohPlaylist ==&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist specification has been designed to allow gap-less audio, playlists to proceed without the intervention of a control point and to function correctly under the manipulation of multiple control points.&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist is a list of media associated with a unique ID. Media is defined by its URI and metadata. A control point is required to keep in memory the current list of playlist IDs. This list of IDs can then be used to list the media in the order of play, obtain the metadata and manipulate the list.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the API that allow control points to manipulate, keep track of playlist changes and control playback.&lt;br /&gt;
&lt;br /&gt;
== ohSongcast ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia</id>
		<title>OhMedia</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia"/>
				<updated>2011-12-15T21:00:14Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ohMedia Overview =&lt;br /&gt;
&lt;br /&gt;
ohMedia is an open standard that allows the seamless interaction of media within your home.&lt;br /&gt;
&lt;br /&gt;
ohMedia's high level design is influenced by the UPnP AV standard (UAV). UAV correctly modelled media in the home as the interaction between 3 types of devices: Control Points, Media Renderers, and Media Servers.&lt;br /&gt;
&amp;lt;&amp;lt;picture&amp;gt;&amp;gt;&lt;br /&gt;
This model correctly identified the potential presence of an arbitrary number of each of these devices. However, the Media Server specification, and in particular the Media Renderer specification is deeply flawed. The next section explains those flaws and outlines how ohMedia fixes them.&lt;br /&gt;
&lt;br /&gt;
= Flaws in the UPnP AV Standard =&lt;br /&gt;
&lt;br /&gt;
== Problem 1: No support for gap-less audio ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification is technically able to support gap-less audio though the AV Transport service actions, setAVTRansportURI and setNextAVTransportURI. However, the UPnP forum chose to make the setNextAVTransportURI action optional. This meant that no, or very few, media renderer manufacturers chose to support the action, which in turn, meant that no control points have added support for gap-less audio. So the real world situation is that UPnP AV has no support for gap-less audio.&lt;br /&gt;
&lt;br /&gt;
== Problem 2: No support for a user's playlist to continue playing when a control point is turned off ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification only allows for a media renderer to store a maximum of two URIs, but, as previously discussed, the real world maximum is in fact only a single URI. This means that in order for a media renderer to play a user created playlist the control point has to be continually monitoring the media renderer. When the media renderer indicates that it has finished playing the current URI the control point then has to set the next URI. If the control point is turned off and not monitoring the media renderer then the media renderer will not be informed of the next URI and playback will stop.&lt;br /&gt;
&lt;br /&gt;
== Problem 3:  No support for multiple control points ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification caters for the case where a user wants multiple control  points to show the metadata that is associated with the currently playing URI. However when it comes to controlling a media renderer from multiple control points the standard quickly shows it inadequacies.&lt;br /&gt;
&lt;br /&gt;
The main problems comes from the fact that the media renderer only holds a URI for the currently playing URI. This means that only the control point that the user used to create a playlist has knowledge about the playlist. As described earlier, because this control point holds the user's playlist it is actually controlling the flow of URIs to the media renderer. What happens if the same user adds tracks to a different control point? At this point two control points are trying to control the flow of different URIs to the media renderer. At this point the whole system fails to operate as the user expects.&lt;br /&gt;
&lt;br /&gt;
When a user creates a playlist on their control point and starts playback on a UPnP AV media renderer the renderer only holds the currently playing URI. When the renderer finishes the current URI the control point provides the renderer with next URI. If the control point is turned off at the point when the renderer finishes playing the current URI the renderer will stop playback.&lt;br /&gt;
&lt;br /&gt;
With the control point controlling the flow of URIs to the media renderer the UPnP AV media renderer specification violates the 3 box model separation where the control point should, without any intervention, enable content to flow between the media server and media renderer.&lt;br /&gt;
&lt;br /&gt;
== Problem 4: No concept of a Hi-Fi system comprising of more than one product or a home comprising of more than one Hi-Fi system ==&lt;br /&gt;
&lt;br /&gt;
A modern home can have one or more Hi-Fi systems of which each Hi-Fi system can comprise of one or more products connected together, e.g. a media player and a pre-amp.&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard assumes a single box which is made up of a single source and possibly a volume control. The standard has no way of representing a system that is made up of several different boxes connected together, e.g. a media renderer connected into a pre-amp. Taking the example of a media renderer connected to a pre-amp, without the ability to represent the different boxes and how they are connected it is impossible, using the UPnP AV standard, to select the input on the pre-amp that the media renderer is connected to when the user selects the media renderer in a control point.&lt;br /&gt;
&lt;br /&gt;
== Problem 5: Media's URI changing when media server rebuilds its database ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media server specification does not have a requirement for media servers to present a piece of media to the network with the same URI. This has resulted in media server implementations that change media URIs when a user changes their media collection. This results in unexpected behaviour for the user. For example, a user plays some media on their renderer. The user then modifies their media collection which results in the media server rebuilding its database. The user then presses play on their renderer to only hear nothing (the URI is now no longer valid) or worse some different piece of media (the URI now represents some different media).&lt;br /&gt;
&lt;br /&gt;
= ohMeida Solutions =&lt;br /&gt;
The ohMedia standard has been designed to solve all the problems described above.&lt;br /&gt;
&lt;br /&gt;
The first three problems are solved through the [[#ohPlaylist|ohPlaylist]] service specification.&lt;br /&gt;
&lt;br /&gt;
Problem 4 is solved through the [[#ohProduct_and_ohTopology|ohProduct service specification and the ohTopology algorithm]].&lt;br /&gt;
&lt;br /&gt;
Problem 5 is solved through the [[#Server|ohMedia server]] specification.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard goes further and adds the [[#ohSongcast|ohSongcast]] standard. ohSongcast provides the ability to synchronise playback between products, commonly referred to as party mode. However in general ohSongcast provides the ability for a product to stream its audio over a standard home network and for any product that supports the ohSongcast receiver specification to receive the audio and play it back.&lt;br /&gt;
&lt;br /&gt;
= How it works =&lt;br /&gt;
&lt;br /&gt;
ohMedia models media in the home through the interaction of 3 types of device, Control Points, Media Players and Media Servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of 3 devices as before, but with arrows labelled with 1. Browse, 2. Tell, 3. Retrieve&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Control Point first browses the Media Server to locate the desired media. The Control Point then tells the Media Player to play the selected media and finally Media Player retrieves the media from the Media Server.&lt;br /&gt;
&lt;br /&gt;
== ohProduct and ohTopology ==&lt;br /&gt;
&lt;br /&gt;
ohMedia models a home as a number Hi-Fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
ohMedia models a Hi-Fi system 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 one output and any number of sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;diagram of a product with multi-in, one out&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the ohProduct 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 ohTopology algorithm. The ohTopology algorithm is as follows,&lt;br /&gt;
&lt;br /&gt;
1.discover all the products in the home that have an ohProduct service&lt;br /&gt;
2.group the discovered products based on the room they are in&lt;br /&gt;
3.create a hierarchical tree structure by matching source names to product names&lt;br /&gt;
4.discover source functionality based on source type&lt;br /&gt;
5.discover additional functionality based on product attributes&lt;br /&gt;
&lt;br /&gt;
e.g. if we had two products, a pre-amp and a media player, which were connected together then both their ohProduct services would return the same room name and one of the source names returned by the pre-amp's ohProduct service would be the same as the product name returned by the media renderer's ohProduct service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of example&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines four source types,&lt;br /&gt;
&lt;br /&gt;
1.Playlist – product supports on device playlists&lt;br /&gt;
2.Radio – product supports internet radio with presets&lt;br /&gt;
3.Receiver – product supports receiving ohSongcast broadcasts&lt;br /&gt;
4.UpnpAv – product also implements the UPnP AV media renderer specification&lt;br /&gt;
&lt;br /&gt;
If a source type is not one of the types above an ohMedia control point will be able to switch to the source but will treat the source as a non controllable external input e.g. Analogue, TOS or HDMI.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines three attributes,&lt;br /&gt;
&lt;br /&gt;
1.Volume – product supports volume control&lt;br /&gt;
2.Info – product supports providing information about the currently playing media&lt;br /&gt;
3.Time – product supports providing the current time within the currently playing media&lt;br /&gt;
4.Sender – product supports ohSongcast broadcasting&lt;br /&gt;
&lt;br /&gt;
== ohPlaylist ==&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist specification has been designed to allow gap-less audio, playlists to proceed without the intervention of a control point and to function correctly under the manipulation of multiple control points.&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist is a list of media associated with a unique ID. Media is defined by its URI and metadata. A control point is required to keep in memory the current list of playlist IDs. This list of IDs can then be used to list the media in the order of play, obtain the metadata and manipulate the list.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the API that allow control points to manipulate, keep track of playlist changes and control playback.&lt;br /&gt;
&lt;br /&gt;
== ohSongcast ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia</id>
		<title>OhMedia</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia"/>
				<updated>2011-12-15T20:57:32Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohSongcast */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ohMedia Overview =&lt;br /&gt;
&lt;br /&gt;
ohMedia is an open standard that allows the seamless interaction of media within your home.&lt;br /&gt;
&lt;br /&gt;
ohMedia's high level design is influenced by the UPnP AV standard (UAV). UAV correctly modelled media in the home as the interaction between 3 types of devices: Control Points, Media Renderers, and Media Servers.&lt;br /&gt;
&amp;lt;&amp;lt;picture&amp;gt;&amp;gt;&lt;br /&gt;
This model correctly identified the potential presence of an arbitrary number of each of these devices. However, the Media Server specification, and in particular the Media Renderer specification is deeply flawed. The next section explains those flaws and outlines how ohMedia fixes them.&lt;br /&gt;
&lt;br /&gt;
= Flaws in the UPnP AV Standard =&lt;br /&gt;
&lt;br /&gt;
== Problem 1: No support for gap-less audio ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification is technically able to support gap-less audio though the AV Transport service actions, setAVTRansportURI and setNextAVTransportURI. However, the UPnP forum chose to make the setNextAVTransportURI action optional. This meant that no, or very few, media renderer manufacturers chose to support the action, which in turn, meant that no control points have added support for gap-less audio. So the real world situation is that UPnP AV has no support for gap-less audio.&lt;br /&gt;
&lt;br /&gt;
== Problem 2: No support for a user's playlist to continue playing when a control point is turned off ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification only allows for a media renderer to store a maximum of two URIs, but, as previously discussed, the real world maximum is in fact only a single URI. This means that in order for a media renderer to play a user created playlist the control point has to be continually monitoring the media renderer. When the media renderer indicates that it has finished playing the current URI the control point then has to set the next URI. If the control point is turned off and not monitoring the media renderer then the media renderer will not be informed of the next URI and playback will stop.&lt;br /&gt;
&lt;br /&gt;
== Problem 3:  No support for multiple control points ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification caters for the case where a user wants multiple control  points to show the metadata that is associated with the currently playing URI. However when it comes to controlling a media renderer from multiple control points the standard quickly shows it inadequacies.&lt;br /&gt;
&lt;br /&gt;
The main problems comes from the fact that the media renderer only holds a URI for the currently playing URI. This means that only the control point that the user used to create a playlist has knowledge about the playlist. As described earlier, because this control point holds the user's playlist it is actually controlling the flow of URIs to the media renderer. What happens if the same user adds tracks to a different control point? At this point two control points are trying to control the flow of different URIs to the media renderer. At this point the whole system fails to operate as the user expects.&lt;br /&gt;
&lt;br /&gt;
When a user creates a playlist on their control point and starts playback on a UPnP AV media renderer the renderer only holds the currently playing URI. When the renderer finishes the current URI the control point provides the renderer with next URI. If the control point is turned off at the point when the renderer finishes playing the current URI the renderer will stop playback.&lt;br /&gt;
&lt;br /&gt;
With the control point controlling the flow of URIs to the media renderer the UPnP AV media renderer specification violates the 3 box model separation where the control point should, without any intervention, enable content to flow between the media server and media renderer.&lt;br /&gt;
&lt;br /&gt;
== Problem 4: No concept of a Hi-Fi system comprising of more than one product or a home comprising of more than one Hi-Fi system ==&lt;br /&gt;
&lt;br /&gt;
A modern home can have one or more Hi-Fi systems of which each Hi-Fi system can comprise of one or more products connected together, e.g. a media player and a pre-amp.&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard assumes a single box which is made up of a single source and possibly a volume control. The standard has no way of representing a system that is made up of several different boxes connected together, e.g. a media renderer connected into a pre-amp. Taking the example of a media renderer connected to a pre-amp, without the ability to represent the different boxes and how they are connected it is impossible, using the UPnP AV standard, to select the input on the pre-amp that the media renderer is connected to when the user selects the media renderer in a control point.&lt;br /&gt;
&lt;br /&gt;
== Problem 5: Media's URI changing when media server rebuilds its database ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media server specification does not have a requirement for media servers to present a piece of media to the network with the same URI. This has resulted in media server implementations that change media URIs when a user changes their media collection. This results in unexpected behaviour for the user. For example, a user plays some media on their renderer. The user then modifies their media collection which results in the media server rebuilding its database. The user then presses play on their renderer to only hear nothing (the URI is now no longer valid) or worse some different piece of media (the URI now represents some different media).&lt;br /&gt;
&lt;br /&gt;
= ohMeida Solutions =&lt;br /&gt;
The ohMedia standard has been designed to solve all the problems described above.&lt;br /&gt;
&lt;br /&gt;
The first three problems are solved through the [[#ohPlaylist|ohPlaylist]] service specification.&lt;br /&gt;
&lt;br /&gt;
Problem 4 is solved through the [[#ohProduct_and_ohTopology|ohProduct service specification and the ohTopology algorithm]].&lt;br /&gt;
&lt;br /&gt;
Problem 5 is solved through the ohMedia server specification. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard goes further and adds the ohSongcast standard. ohSongcast provides the ability to synchronise playback between products, commonly referred to as party mode. However in general ohSongcast provides the ability for a product to stream its audio over a standard home network and for any product that supports the ohSongcast receiver specification to receive the audio and play it back. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How it works =&lt;br /&gt;
&lt;br /&gt;
ohMedia models media in the home through the interaction of 3 types of device, Control Points, Media Players and Media Servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of 3 devices as before, but with arrows labelled with 1. Browse, 2. Tell, 3. Retrieve&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Control Point first browses the Media Server to locate the desired media. The Control Point then tells the Media Player to play the selected media and finally Media Player retrieves the media from the Media Server.&lt;br /&gt;
&lt;br /&gt;
== ohProduct and ohTopology ==&lt;br /&gt;
&lt;br /&gt;
ohMedia models a home as a number Hi-Fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
ohMedia models a Hi-Fi system 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 one output and any number of sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;diagram of a product with multi-in, one out&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the ohProduct 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 ohTopology algorithm. The ohTopology algorithm is as follows,&lt;br /&gt;
&lt;br /&gt;
1.discover all the products in the home that have an ohProduct service&lt;br /&gt;
2.group the discovered products based on the room they are in&lt;br /&gt;
3.create a hierarchical tree structure by matching source names to product names&lt;br /&gt;
4.discover source functionality based on source type&lt;br /&gt;
5.discover additional functionality based on product attributes&lt;br /&gt;
&lt;br /&gt;
e.g. if we had two products, a pre-amp and a media player, which were connected together then both their ohProduct services would return the same room name and one of the source names returned by the pre-amp's ohProduct service would be the same as the product name returned by the media renderer's ohProduct service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of example&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines four source types,&lt;br /&gt;
&lt;br /&gt;
1.Playlist – product supports on device playlists&lt;br /&gt;
2.Radio – product supports internet radio with presets&lt;br /&gt;
3.Receiver – product supports receiving ohSongcast broadcasts&lt;br /&gt;
4.UpnpAv – product also implements the UPnP AV media renderer specification&lt;br /&gt;
&lt;br /&gt;
If a source type is not one of the types above an ohMedia control point will be able to switch to the source but will treat the source as a non controllable external input e.g. Analogue, TOS or HDMI.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines three attributes,&lt;br /&gt;
&lt;br /&gt;
1.Volume – product supports volume control&lt;br /&gt;
2.Info – product supports providing information about the currently playing media&lt;br /&gt;
3.Time – product supports providing the current time within the currently playing media&lt;br /&gt;
4.Sender – product supports ohSongcast broadcasting&lt;br /&gt;
&lt;br /&gt;
== ohPlaylist ==&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist specification has been designed to allow gap-less audio, playlists to proceed without the intervention of a control point and to function correctly under the manipulation of multiple control points.&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist is a list of media associated with a unique ID. Media is defined by its URI and metadata. A control point is required to keep in memory the current list of playlist IDs. This list of IDs can then be used to list the media in the order of play, obtain the metadata and manipulate the list.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the API that allow control points to manipulate, keep track of playlist changes and control playback.&lt;br /&gt;
&lt;br /&gt;
== ohSongcast ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Server ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
of either of these two concepts so a control point can only provide a user with a flat list of UPnP AV products in the home. Whilst this might work reasonably well for a user with a single UPnP AV product it is far from ideal when they have multiple UPnP AV products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the UPnP AV system architecture the control point holds all the information about the sequence of URIs that a media renderer will play. When there are multiple control points on the network there is no way for them all to have a common understanding of what a media renderer's sequence of URIs is. This results in each control point having its own, conflicting, understanding of a media renderer's state and when the current URI stops playing it becomes a race between the control points to set what they each believe to be the next URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problem 4: No support for synchronised playback across products&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard does not provide any solution to being able to synchronise playback across products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by storing the user created playlist on the media renderer. This means that an ohMedia media renderer can play a user created playlist without the need for a control point to be switched on.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by moving the state of a media renderer from the control point into the media renderer. This means that all control points can now share a common understanding of what a media renderer's current state is.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this problem by storing the playlist on the media renderer. This allows the ohMedia media renderer can start playback of the next URI immediately after the current URI has finished playing.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves the deficiency with ohSongcast. ohSongcast is an open network protocol that allows audio synchronisation between products that implement the ohSongcast protocol.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency through ohTopology. ohTopology defines how products are found on the network, how products are grouped together and how the grouped products are connected together.&lt;br /&gt;
&lt;br /&gt;
How It Works&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard uses the same playback architecture as used in the UPnP AV standard. The architecture is commonly known as the 3 box model. The 3 boxes in the 3 box model are, Media Renderer, Media Server and Control Point. The three components each work together to perform the task of playing back media. The media server contains the content available to a user. The user interacts with the control point's user interface to search and select the desired content on the media server and then to select the media renderer to playback the desired content. Playback of the content is achieved by out of band communication between the media server and media renderer, the control point is no involved.&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia</id>
		<title>OhMedia</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia"/>
				<updated>2011-12-15T20:56:04Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohMeida Solutions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ohMedia Overview =&lt;br /&gt;
&lt;br /&gt;
ohMedia is an open standard that allows the seamless interaction of media within your home.&lt;br /&gt;
&lt;br /&gt;
ohMedia's high level design is influenced by the UPnP AV standard (UAV). UAV correctly modelled media in the home as the interaction between 3 types of devices: Control Points, Media Renderers, and Media Servers.&lt;br /&gt;
&amp;lt;&amp;lt;picture&amp;gt;&amp;gt;&lt;br /&gt;
This model correctly identified the potential presence of an arbitrary number of each of these devices. However, the Media Server specification, and in particular the Media Renderer specification is deeply flawed. The next section explains those flaws and outlines how ohMedia fixes them.&lt;br /&gt;
&lt;br /&gt;
= Flaws in the UPnP AV Standard =&lt;br /&gt;
&lt;br /&gt;
== Problem 1: No support for gap-less audio ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification is technically able to support gap-less audio though the AV Transport service actions, setAVTRansportURI and setNextAVTransportURI. However, the UPnP forum chose to make the setNextAVTransportURI action optional. This meant that no, or very few, media renderer manufacturers chose to support the action, which in turn, meant that no control points have added support for gap-less audio. So the real world situation is that UPnP AV has no support for gap-less audio.&lt;br /&gt;
&lt;br /&gt;
== Problem 2: No support for a user's playlist to continue playing when a control point is turned off ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification only allows for a media renderer to store a maximum of two URIs, but, as previously discussed, the real world maximum is in fact only a single URI. This means that in order for a media renderer to play a user created playlist the control point has to be continually monitoring the media renderer. When the media renderer indicates that it has finished playing the current URI the control point then has to set the next URI. If the control point is turned off and not monitoring the media renderer then the media renderer will not be informed of the next URI and playback will stop.&lt;br /&gt;
&lt;br /&gt;
== Problem 3:  No support for multiple control points ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification caters for the case where a user wants multiple control  points to show the metadata that is associated with the currently playing URI. However when it comes to controlling a media renderer from multiple control points the standard quickly shows it inadequacies.&lt;br /&gt;
&lt;br /&gt;
The main problems comes from the fact that the media renderer only holds a URI for the currently playing URI. This means that only the control point that the user used to create a playlist has knowledge about the playlist. As described earlier, because this control point holds the user's playlist it is actually controlling the flow of URIs to the media renderer. What happens if the same user adds tracks to a different control point? At this point two control points are trying to control the flow of different URIs to the media renderer. At this point the whole system fails to operate as the user expects.&lt;br /&gt;
&lt;br /&gt;
When a user creates a playlist on their control point and starts playback on a UPnP AV media renderer the renderer only holds the currently playing URI. When the renderer finishes the current URI the control point provides the renderer with next URI. If the control point is turned off at the point when the renderer finishes playing the current URI the renderer will stop playback.&lt;br /&gt;
&lt;br /&gt;
With the control point controlling the flow of URIs to the media renderer the UPnP AV media renderer specification violates the 3 box model separation where the control point should, without any intervention, enable content to flow between the media server and media renderer.&lt;br /&gt;
&lt;br /&gt;
== Problem 4: No concept of a Hi-Fi system comprising of more than one product or a home comprising of more than one Hi-Fi system ==&lt;br /&gt;
&lt;br /&gt;
A modern home can have one or more Hi-Fi systems of which each Hi-Fi system can comprise of one or more products connected together, e.g. a media player and a pre-amp.&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard assumes a single box which is made up of a single source and possibly a volume control. The standard has no way of representing a system that is made up of several different boxes connected together, e.g. a media renderer connected into a pre-amp. Taking the example of a media renderer connected to a pre-amp, without the ability to represent the different boxes and how they are connected it is impossible, using the UPnP AV standard, to select the input on the pre-amp that the media renderer is connected to when the user selects the media renderer in a control point.&lt;br /&gt;
&lt;br /&gt;
== Problem 5: Media's URI changing when media server rebuilds its database ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media server specification does not have a requirement for media servers to present a piece of media to the network with the same URI. This has resulted in media server implementations that change media URIs when a user changes their media collection. This results in unexpected behaviour for the user. For example, a user plays some media on their renderer. The user then modifies their media collection which results in the media server rebuilding its database. The user then presses play on their renderer to only hear nothing (the URI is now no longer valid) or worse some different piece of media (the URI now represents some different media).&lt;br /&gt;
&lt;br /&gt;
= ohMeida Solutions =&lt;br /&gt;
The ohMedia standard has been designed to solve all the problems described above.&lt;br /&gt;
&lt;br /&gt;
The first three problems are solved through the [[#ohPlaylist|ohPlaylist]] service specification.&lt;br /&gt;
&lt;br /&gt;
Problem 4 is solved through the [[#ohProduct_and_ohTopology|ohProduct service specification and the ohTopology algorithm]].&lt;br /&gt;
&lt;br /&gt;
Problem 5 is solved through the ohMedia server specification. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard goes further and adds the ohSongcast standard. ohSongcast provides the ability to synchronise playback between products, commonly referred to as party mode. However in general ohSongcast provides the ability for a product to stream its audio over a standard home network and for any product that supports the ohSongcast receiver specification to receive the audio and play it back. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How it works =&lt;br /&gt;
&lt;br /&gt;
ohMedia models media in the home through the interaction of 3 types of device, Control Points, Media Players and Media Servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of 3 devices as before, but with arrows labelled with 1. Browse, 2. Tell, 3. Retrieve&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Control Point first browses the Media Server to locate the desired media. The Control Point then tells the Media Player to play the selected media and finally Media Player retrieves the media from the Media Server.&lt;br /&gt;
&lt;br /&gt;
== ohProduct and ohTopology ==&lt;br /&gt;
&lt;br /&gt;
ohMedia models a home as a number Hi-Fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
ohMedia models a Hi-Fi system 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 one output and any number of sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;diagram of a product with multi-in, one out&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the ohProduct 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 ohTopology algorithm. The ohTopology algorithm is as follows,&lt;br /&gt;
&lt;br /&gt;
1.discover all the products in the home that have an ohProduct service&lt;br /&gt;
2.group the discovered products based on the room they are in&lt;br /&gt;
3.create a hierarchical tree structure by matching source names to product names&lt;br /&gt;
4.discover source functionality based on source type&lt;br /&gt;
5.discover additional functionality based on product attributes&lt;br /&gt;
&lt;br /&gt;
e.g. if we had two products, a pre-amp and a media player, which were connected together then both their ohProduct services would return the same room name and one of the source names returned by the pre-amp's ohProduct service would be the same as the product name returned by the media renderer's ohProduct service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of example&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines four source types,&lt;br /&gt;
&lt;br /&gt;
1.Playlist – product supports on device playlists&lt;br /&gt;
2.Radio – product supports internet radio with presets&lt;br /&gt;
3.Receiver – product supports receiving ohSongcast broadcasts&lt;br /&gt;
4.UpnpAv – product also implements the UPnP AV media renderer specification&lt;br /&gt;
&lt;br /&gt;
If a source type is not one of the types above an ohMedia control point will be able to switch to the source but will treat the source as a non controllable external input e.g. Analogue, TOS or HDMI.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines three attributes,&lt;br /&gt;
&lt;br /&gt;
1.Volume – product supports volume control&lt;br /&gt;
2.Info – product supports providing information about the currently playing media&lt;br /&gt;
3.Time – product supports providing the current time within the currently playing media&lt;br /&gt;
4.Sender – product supports ohSongcast broadcasting&lt;br /&gt;
&lt;br /&gt;
== ohPlaylist ==&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist specification has been designed to allow gap-less audio, playlists to proceed without the intervention of a control point and to function correctly under the manipulation of multiple control points.&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist is a list of media associated with a unique ID. Media is defined by its URI and metadata. A control point is required to keep in memory the current list of playlist IDs. This list of IDs can then be used to list the media in the order of play, obtain the metadata and manipulate the list.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the API that allow control points to manipulate, keep track of playlist changes and control playback.&lt;br /&gt;
&lt;br /&gt;
== ohSongcast ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
of either of these two concepts so a control point can only provide a user with a flat list of UPnP AV products in the home. Whilst this might work reasonably well for a user with a single UPnP AV product it is far from ideal when they have multiple UPnP AV products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the UPnP AV system architecture the control point holds all the information about the sequence of URIs that a media renderer will play. When there are multiple control points on the network there is no way for them all to have a common understanding of what a media renderer's sequence of URIs is. This results in each control point having its own, conflicting, understanding of a media renderer's state and when the current URI stops playing it becomes a race between the control points to set what they each believe to be the next URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problem 4: No support for synchronised playback across products&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard does not provide any solution to being able to synchronise playback across products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by storing the user created playlist on the media renderer. This means that an ohMedia media renderer can play a user created playlist without the need for a control point to be switched on.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by moving the state of a media renderer from the control point into the media renderer. This means that all control points can now share a common understanding of what a media renderer's current state is.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this problem by storing the playlist on the media renderer. This allows the ohMedia media renderer can start playback of the next URI immediately after the current URI has finished playing.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves the deficiency with ohSongcast. ohSongcast is an open network protocol that allows audio synchronisation between products that implement the ohSongcast protocol.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency through ohTopology. ohTopology defines how products are found on the network, how products are grouped together and how the grouped products are connected together.&lt;br /&gt;
&lt;br /&gt;
How It Works&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard uses the same playback architecture as used in the UPnP AV standard. The architecture is commonly known as the 3 box model. The 3 boxes in the 3 box model are, Media Renderer, Media Server and Control Point. The three components each work together to perform the task of playing back media. The media server contains the content available to a user. The user interacts with the control point's user interface to search and select the desired content on the media server and then to select the media renderer to playback the desired content. Playback of the content is achieved by out of band communication between the media server and media renderer, the control point is no involved.&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia</id>
		<title>OhMedia</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia"/>
				<updated>2011-12-15T20:55:02Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohTopology */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ohMedia Overview =&lt;br /&gt;
&lt;br /&gt;
ohMedia is an open standard that allows the seamless interaction of media within your home.&lt;br /&gt;
&lt;br /&gt;
ohMedia's high level design is influenced by the UPnP AV standard (UAV). UAV correctly modelled media in the home as the interaction between 3 types of devices: Control Points, Media Renderers, and Media Servers.&lt;br /&gt;
&amp;lt;&amp;lt;picture&amp;gt;&amp;gt;&lt;br /&gt;
This model correctly identified the potential presence of an arbitrary number of each of these devices. However, the Media Server specification, and in particular the Media Renderer specification is deeply flawed. The next section explains those flaws and outlines how ohMedia fixes them.&lt;br /&gt;
&lt;br /&gt;
= Flaws in the UPnP AV Standard =&lt;br /&gt;
&lt;br /&gt;
== Problem 1: No support for gap-less audio ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification is technically able to support gap-less audio though the AV Transport service actions, setAVTRansportURI and setNextAVTransportURI. However, the UPnP forum chose to make the setNextAVTransportURI action optional. This meant that no, or very few, media renderer manufacturers chose to support the action, which in turn, meant that no control points have added support for gap-less audio. So the real world situation is that UPnP AV has no support for gap-less audio.&lt;br /&gt;
&lt;br /&gt;
== Problem 2: No support for a user's playlist to continue playing when a control point is turned off ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification only allows for a media renderer to store a maximum of two URIs, but, as previously discussed, the real world maximum is in fact only a single URI. This means that in order for a media renderer to play a user created playlist the control point has to be continually monitoring the media renderer. When the media renderer indicates that it has finished playing the current URI the control point then has to set the next URI. If the control point is turned off and not monitoring the media renderer then the media renderer will not be informed of the next URI and playback will stop.&lt;br /&gt;
&lt;br /&gt;
== Problem 3:  No support for multiple control points ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification caters for the case where a user wants multiple control  points to show the metadata that is associated with the currently playing URI. However when it comes to controlling a media renderer from multiple control points the standard quickly shows it inadequacies.&lt;br /&gt;
&lt;br /&gt;
The main problems comes from the fact that the media renderer only holds a URI for the currently playing URI. This means that only the control point that the user used to create a playlist has knowledge about the playlist. As described earlier, because this control point holds the user's playlist it is actually controlling the flow of URIs to the media renderer. What happens if the same user adds tracks to a different control point? At this point two control points are trying to control the flow of different URIs to the media renderer. At this point the whole system fails to operate as the user expects.&lt;br /&gt;
&lt;br /&gt;
When a user creates a playlist on their control point and starts playback on a UPnP AV media renderer the renderer only holds the currently playing URI. When the renderer finishes the current URI the control point provides the renderer with next URI. If the control point is turned off at the point when the renderer finishes playing the current URI the renderer will stop playback.&lt;br /&gt;
&lt;br /&gt;
With the control point controlling the flow of URIs to the media renderer the UPnP AV media renderer specification violates the 3 box model separation where the control point should, without any intervention, enable content to flow between the media server and media renderer.&lt;br /&gt;
&lt;br /&gt;
== Problem 4: No concept of a Hi-Fi system comprising of more than one product or a home comprising of more than one Hi-Fi system ==&lt;br /&gt;
&lt;br /&gt;
A modern home can have one or more Hi-Fi systems of which each Hi-Fi system can comprise of one or more products connected together, e.g. a media player and a pre-amp.&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard assumes a single box which is made up of a single source and possibly a volume control. The standard has no way of representing a system that is made up of several different boxes connected together, e.g. a media renderer connected into a pre-amp. Taking the example of a media renderer connected to a pre-amp, without the ability to represent the different boxes and how they are connected it is impossible, using the UPnP AV standard, to select the input on the pre-amp that the media renderer is connected to when the user selects the media renderer in a control point.&lt;br /&gt;
&lt;br /&gt;
== Problem 5: Media's URI changing when media server rebuilds its database ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media server specification does not have a requirement for media servers to present a piece of media to the network with the same URI. This has resulted in media server implementations that change media URIs when a user changes their media collection. This results in unexpected behaviour for the user. For example, a user plays some media on their renderer. The user then modifies their media collection which results in the media server rebuilding its database. The user then presses play on their renderer to only hear nothing (the URI is now no longer valid) or worse some different piece of media (the URI now represents some different media).&lt;br /&gt;
&lt;br /&gt;
= ohMeida Solutions =&lt;br /&gt;
The ohMedia standard has been designed to solve all the problems described above.&lt;br /&gt;
&lt;br /&gt;
The first three problems are solved through the [[#ohPlaylist|ohPlaylist]] service specification.&lt;br /&gt;
&lt;br /&gt;
Problem 4 is solved through the ohProduct service specification and the ohTopology algorithm. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problem 5 is solved through the ohMedia server specification. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard goes further and adds the ohSongcast standard. ohSongcast provides the ability to synchronise playback between products, commonly referred to as party mode. However in general ohSongcast provides the ability for a product to stream its audio over a standard home network and for any product that supports the ohSongcast receiver specification to receive the audio and play it back. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How it works =&lt;br /&gt;
&lt;br /&gt;
ohMedia models media in the home through the interaction of 3 types of device, Control Points, Media Players and Media Servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of 3 devices as before, but with arrows labelled with 1. Browse, 2. Tell, 3. Retrieve&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Control Point first browses the Media Server to locate the desired media. The Control Point then tells the Media Player to play the selected media and finally Media Player retrieves the media from the Media Server.&lt;br /&gt;
&lt;br /&gt;
== ohProduct and ohTopology ==&lt;br /&gt;
&lt;br /&gt;
ohMedia models a home as a number Hi-Fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
ohMedia models a Hi-Fi system 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 one output and any number of sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;diagram of a product with multi-in, one out&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the ohProduct 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 ohTopology algorithm. The ohTopology algorithm is as follows,&lt;br /&gt;
&lt;br /&gt;
1.discover all the products in the home that have an ohProduct service&lt;br /&gt;
2.group the discovered products based on the room they are in&lt;br /&gt;
3.create a hierarchical tree structure by matching source names to product names&lt;br /&gt;
4.discover source functionality based on source type&lt;br /&gt;
5.discover additional functionality based on product attributes&lt;br /&gt;
&lt;br /&gt;
e.g. if we had two products, a pre-amp and a media player, which were connected together then both their ohProduct services would return the same room name and one of the source names returned by the pre-amp's ohProduct service would be the same as the product name returned by the media renderer's ohProduct service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of example&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines four source types,&lt;br /&gt;
&lt;br /&gt;
1.Playlist – product supports on device playlists&lt;br /&gt;
2.Radio – product supports internet radio with presets&lt;br /&gt;
3.Receiver – product supports receiving ohSongcast broadcasts&lt;br /&gt;
4.UpnpAv – product also implements the UPnP AV media renderer specification&lt;br /&gt;
&lt;br /&gt;
If a source type is not one of the types above an ohMedia control point will be able to switch to the source but will treat the source as a non controllable external input e.g. Analogue, TOS or HDMI.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines three attributes,&lt;br /&gt;
&lt;br /&gt;
1.Volume – product supports volume control&lt;br /&gt;
2.Info – product supports providing information about the currently playing media&lt;br /&gt;
3.Time – product supports providing the current time within the currently playing media&lt;br /&gt;
4.Sender – product supports ohSongcast broadcasting&lt;br /&gt;
&lt;br /&gt;
== ohPlaylist ==&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist specification has been designed to allow gap-less audio, playlists to proceed without the intervention of a control point and to function correctly under the manipulation of multiple control points.&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist is a list of media associated with a unique ID. Media is defined by its URI and metadata. A control point is required to keep in memory the current list of playlist IDs. This list of IDs can then be used to list the media in the order of play, obtain the metadata and manipulate the list.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the API that allow control points to manipulate, keep track of playlist changes and control playback.&lt;br /&gt;
&lt;br /&gt;
== ohSongcast ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
of either of these two concepts so a control point can only provide a user with a flat list of UPnP AV products in the home. Whilst this might work reasonably well for a user with a single UPnP AV product it is far from ideal when they have multiple UPnP AV products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the UPnP AV system architecture the control point holds all the information about the sequence of URIs that a media renderer will play. When there are multiple control points on the network there is no way for them all to have a common understanding of what a media renderer's sequence of URIs is. This results in each control point having its own, conflicting, understanding of a media renderer's state and when the current URI stops playing it becomes a race between the control points to set what they each believe to be the next URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problem 4: No support for synchronised playback across products&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard does not provide any solution to being able to synchronise playback across products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by storing the user created playlist on the media renderer. This means that an ohMedia media renderer can play a user created playlist without the need for a control point to be switched on.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by moving the state of a media renderer from the control point into the media renderer. This means that all control points can now share a common understanding of what a media renderer's current state is.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this problem by storing the playlist on the media renderer. This allows the ohMedia media renderer can start playback of the next URI immediately after the current URI has finished playing.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves the deficiency with ohSongcast. ohSongcast is an open network protocol that allows audio synchronisation between products that implement the ohSongcast protocol.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency through ohTopology. ohTopology defines how products are found on the network, how products are grouped together and how the grouped products are connected together.&lt;br /&gt;
&lt;br /&gt;
How It Works&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard uses the same playback architecture as used in the UPnP AV standard. The architecture is commonly known as the 3 box model. The 3 boxes in the 3 box model are, Media Renderer, Media Server and Control Point. The three components each work together to perform the task of playing back media. The media server contains the content available to a user. The user interacts with the control point's user interface to search and select the desired content on the media server and then to select the media renderer to playback the desired content. Playback of the content is achieved by out of band communication between the media server and media renderer, the control point is no involved.&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia</id>
		<title>OhMedia</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia"/>
				<updated>2011-12-15T20:54:06Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohMeida Solutions */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ohMedia Overview =&lt;br /&gt;
&lt;br /&gt;
ohMedia is an open standard that allows the seamless interaction of media within your home.&lt;br /&gt;
&lt;br /&gt;
ohMedia's high level design is influenced by the UPnP AV standard (UAV). UAV correctly modelled media in the home as the interaction between 3 types of devices: Control Points, Media Renderers, and Media Servers.&lt;br /&gt;
&amp;lt;&amp;lt;picture&amp;gt;&amp;gt;&lt;br /&gt;
This model correctly identified the potential presence of an arbitrary number of each of these devices. However, the Media Server specification, and in particular the Media Renderer specification is deeply flawed. The next section explains those flaws and outlines how ohMedia fixes them.&lt;br /&gt;
&lt;br /&gt;
= Flaws in the UPnP AV Standard =&lt;br /&gt;
&lt;br /&gt;
== Problem 1: No support for gap-less audio ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification is technically able to support gap-less audio though the AV Transport service actions, setAVTRansportURI and setNextAVTransportURI. However, the UPnP forum chose to make the setNextAVTransportURI action optional. This meant that no, or very few, media renderer manufacturers chose to support the action, which in turn, meant that no control points have added support for gap-less audio. So the real world situation is that UPnP AV has no support for gap-less audio.&lt;br /&gt;
&lt;br /&gt;
== Problem 2: No support for a user's playlist to continue playing when a control point is turned off ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification only allows for a media renderer to store a maximum of two URIs, but, as previously discussed, the real world maximum is in fact only a single URI. This means that in order for a media renderer to play a user created playlist the control point has to be continually monitoring the media renderer. When the media renderer indicates that it has finished playing the current URI the control point then has to set the next URI. If the control point is turned off and not monitoring the media renderer then the media renderer will not be informed of the next URI and playback will stop.&lt;br /&gt;
&lt;br /&gt;
== Problem 3:  No support for multiple control points ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification caters for the case where a user wants multiple control  points to show the metadata that is associated with the currently playing URI. However when it comes to controlling a media renderer from multiple control points the standard quickly shows it inadequacies.&lt;br /&gt;
&lt;br /&gt;
The main problems comes from the fact that the media renderer only holds a URI for the currently playing URI. This means that only the control point that the user used to create a playlist has knowledge about the playlist. As described earlier, because this control point holds the user's playlist it is actually controlling the flow of URIs to the media renderer. What happens if the same user adds tracks to a different control point? At this point two control points are trying to control the flow of different URIs to the media renderer. At this point the whole system fails to operate as the user expects.&lt;br /&gt;
&lt;br /&gt;
When a user creates a playlist on their control point and starts playback on a UPnP AV media renderer the renderer only holds the currently playing URI. When the renderer finishes the current URI the control point provides the renderer with next URI. If the control point is turned off at the point when the renderer finishes playing the current URI the renderer will stop playback.&lt;br /&gt;
&lt;br /&gt;
With the control point controlling the flow of URIs to the media renderer the UPnP AV media renderer specification violates the 3 box model separation where the control point should, without any intervention, enable content to flow between the media server and media renderer.&lt;br /&gt;
&lt;br /&gt;
== Problem 4: No concept of a Hi-Fi system comprising of more than one product or a home comprising of more than one Hi-Fi system ==&lt;br /&gt;
&lt;br /&gt;
A modern home can have one or more Hi-Fi systems of which each Hi-Fi system can comprise of one or more products connected together, e.g. a media player and a pre-amp.&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard assumes a single box which is made up of a single source and possibly a volume control. The standard has no way of representing a system that is made up of several different boxes connected together, e.g. a media renderer connected into a pre-amp. Taking the example of a media renderer connected to a pre-amp, without the ability to represent the different boxes and how they are connected it is impossible, using the UPnP AV standard, to select the input on the pre-amp that the media renderer is connected to when the user selects the media renderer in a control point.&lt;br /&gt;
&lt;br /&gt;
== Problem 5: Media's URI changing when media server rebuilds its database ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media server specification does not have a requirement for media servers to present a piece of media to the network with the same URI. This has resulted in media server implementations that change media URIs when a user changes their media collection. This results in unexpected behaviour for the user. For example, a user plays some media on their renderer. The user then modifies their media collection which results in the media server rebuilding its database. The user then presses play on their renderer to only hear nothing (the URI is now no longer valid) or worse some different piece of media (the URI now represents some different media).&lt;br /&gt;
&lt;br /&gt;
= ohMeida Solutions =&lt;br /&gt;
The ohMedia standard has been designed to solve all the problems described above.&lt;br /&gt;
&lt;br /&gt;
The first three problems are solved through the [[#ohPlaylist|ohPlaylist]] service specification.&lt;br /&gt;
&lt;br /&gt;
Problem 4 is solved through the ohProduct service specification and the ohTopology algorithm. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problem 5 is solved through the ohMedia server specification. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard goes further and adds the ohSongcast standard. ohSongcast provides the ability to synchronise playback between products, commonly referred to as party mode. However in general ohSongcast provides the ability for a product to stream its audio over a standard home network and for any product that supports the ohSongcast receiver specification to receive the audio and play it back. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How it works =&lt;br /&gt;
&lt;br /&gt;
ohMedia models media in the home through the interaction of 3 types of device, Control Points, Media Players and Media Servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of 3 devices as before, but with arrows labelled with 1. Browse, 2. Tell, 3. Retrieve&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Control Point first browses the Media Server to locate the desired media. The Control Point then tells the Media Player to play the selected media and finally Media Player retrieves the media from the Media Server.&lt;br /&gt;
&lt;br /&gt;
== ohTopology ==&lt;br /&gt;
&lt;br /&gt;
ohMedia models a home as a number Hi-Fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
ohMedia models a Hi-Fi system 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 one output and any number of sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;diagram of a product with multi-in, one out&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the ohProduct 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 ohTopology algorithm. The ohTopology algorithm is as follows,&lt;br /&gt;
&lt;br /&gt;
1.discover all the products in the home that have an ohProduct service&lt;br /&gt;
2.group the discovered products based on the room they are in&lt;br /&gt;
3.create a hierarchical tree structure by matching source names to product names&lt;br /&gt;
4.discover source functionality based on source type&lt;br /&gt;
5.discover additional functionality based on product attributes&lt;br /&gt;
&lt;br /&gt;
e.g. if we had two products, a pre-amp and a media player, which were connected together then both their ohProduct services would return the same room name and one of the source names returned by the pre-amp's ohProduct service would be the same as the product name returned by the media renderer's ohProduct service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of example&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines four source types,&lt;br /&gt;
&lt;br /&gt;
1.Playlist – product supports on device playlists&lt;br /&gt;
2.Radio – product supports internet radio with presets&lt;br /&gt;
3.Receiver – product supports receiving ohSongcast broadcasts&lt;br /&gt;
4.UpnpAv – product also implements the UPnP AV media renderer specification&lt;br /&gt;
&lt;br /&gt;
If a source type is not one of the types above an ohMedia control point will be able to switch to the source but will treat the source as a non controllable external input e.g. Analogue, TOS or HDMI.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines three attributes,&lt;br /&gt;
&lt;br /&gt;
1.Volume – product supports volume control&lt;br /&gt;
2.Info – product supports providing information about the currently playing media&lt;br /&gt;
3.Time – product supports providing the current time within the currently playing media&lt;br /&gt;
4.Sender – product supports ohSongcast broadcasting&lt;br /&gt;
&lt;br /&gt;
== ohPlaylist ==&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist specification has been designed to allow gap-less audio, playlists to proceed without the intervention of a control point and to function correctly under the manipulation of multiple control points.&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist is a list of media associated with a unique ID. Media is defined by its URI and metadata. A control point is required to keep in memory the current list of playlist IDs. This list of IDs can then be used to list the media in the order of play, obtain the metadata and manipulate the list.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the API that allow control points to manipulate, keep track of playlist changes and control playback.&lt;br /&gt;
&lt;br /&gt;
== ohSongcast ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
of either of these two concepts so a control point can only provide a user with a flat list of UPnP AV products in the home. Whilst this might work reasonably well for a user with a single UPnP AV product it is far from ideal when they have multiple UPnP AV products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the UPnP AV system architecture the control point holds all the information about the sequence of URIs that a media renderer will play. When there are multiple control points on the network there is no way for them all to have a common understanding of what a media renderer's sequence of URIs is. This results in each control point having its own, conflicting, understanding of a media renderer's state and when the current URI stops playing it becomes a race between the control points to set what they each believe to be the next URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problem 4: No support for synchronised playback across products&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard does not provide any solution to being able to synchronise playback across products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by storing the user created playlist on the media renderer. This means that an ohMedia media renderer can play a user created playlist without the need for a control point to be switched on.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by moving the state of a media renderer from the control point into the media renderer. This means that all control points can now share a common understanding of what a media renderer's current state is.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this problem by storing the playlist on the media renderer. This allows the ohMedia media renderer can start playback of the next URI immediately after the current URI has finished playing.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves the deficiency with ohSongcast. ohSongcast is an open network protocol that allows audio synchronisation between products that implement the ohSongcast protocol.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency through ohTopology. ohTopology defines how products are found on the network, how products are grouped together and how the grouped products are connected together.&lt;br /&gt;
&lt;br /&gt;
How It Works&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard uses the same playback architecture as used in the UPnP AV standard. The architecture is commonly known as the 3 box model. The 3 boxes in the 3 box model are, Media Renderer, Media Server and Control Point. The three components each work together to perform the task of playing back media. The media server contains the content available to a user. The user interacts with the control point's user interface to search and select the desired content on the media server and then to select the media renderer to playback the desired content. Playback of the content is achieved by out of band communication between the media server and media renderer, the control point is no involved.&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia</id>
		<title>OhMedia</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia"/>
				<updated>2011-12-15T20:45:01Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* How it works */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ohMedia Overview =&lt;br /&gt;
&lt;br /&gt;
ohMedia is an open standard that allows the seamless interaction of media within your home.&lt;br /&gt;
&lt;br /&gt;
ohMedia's high level design is influenced by the UPnP AV standard (UAV). UAV correctly modelled media in the home as the interaction between 3 types of devices: Control Points, Media Renderers, and Media Servers.&lt;br /&gt;
&amp;lt;&amp;lt;picture&amp;gt;&amp;gt;&lt;br /&gt;
This model correctly identified the potential presence of an arbitrary number of each of these devices. However, the Media Server specification, and in particular the Media Renderer specification is deeply flawed. The next section explains those flaws and outlines how ohMedia fixes them.&lt;br /&gt;
&lt;br /&gt;
= Flaws in the UPnP AV Standard =&lt;br /&gt;
&lt;br /&gt;
== Problem 1: No support for gap-less audio ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification is technically able to support gap-less audio though the AV Transport service actions, setAVTRansportURI and setNextAVTransportURI. However, the UPnP forum chose to make the setNextAVTransportURI action optional. This meant that no, or very few, media renderer manufacturers chose to support the action, which in turn, meant that no control points have added support for gap-less audio. So the real world situation is that UPnP AV has no support for gap-less audio.&lt;br /&gt;
&lt;br /&gt;
== Problem 2: No support for a user's playlist to continue playing when a control point is turned off ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification only allows for a media renderer to store a maximum of two URIs, but, as previously discussed, the real world maximum is in fact only a single URI. This means that in order for a media renderer to play a user created playlist the control point has to be continually monitoring the media renderer. When the media renderer indicates that it has finished playing the current URI the control point then has to set the next URI. If the control point is turned off and not monitoring the media renderer then the media renderer will not be informed of the next URI and playback will stop.&lt;br /&gt;
&lt;br /&gt;
== Problem 3:  No support for multiple control points ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification caters for the case where a user wants multiple control  points to show the metadata that is associated with the currently playing URI. However when it comes to controlling a media renderer from multiple control points the standard quickly shows it inadequacies.&lt;br /&gt;
&lt;br /&gt;
The main problems comes from the fact that the media renderer only holds a URI for the currently playing URI. This means that only the control point that the user used to create a playlist has knowledge about the playlist. As described earlier, because this control point holds the user's playlist it is actually controlling the flow of URIs to the media renderer. What happens if the same user adds tracks to a different control point? At this point two control points are trying to control the flow of different URIs to the media renderer. At this point the whole system fails to operate as the user expects.&lt;br /&gt;
&lt;br /&gt;
When a user creates a playlist on their control point and starts playback on a UPnP AV media renderer the renderer only holds the currently playing URI. When the renderer finishes the current URI the control point provides the renderer with next URI. If the control point is turned off at the point when the renderer finishes playing the current URI the renderer will stop playback.&lt;br /&gt;
&lt;br /&gt;
With the control point controlling the flow of URIs to the media renderer the UPnP AV media renderer specification violates the 3 box model separation where the control point should, without any intervention, enable content to flow between the media server and media renderer.&lt;br /&gt;
&lt;br /&gt;
== Problem 4: No concept of a Hi-Fi system comprising of more than one product or a home comprising of more than one Hi-Fi system ==&lt;br /&gt;
&lt;br /&gt;
A modern home can have one or more Hi-Fi systems of which each Hi-Fi system can comprise of one or more products connected together, e.g. a media player and a pre-amp.&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard assumes a single box which is made up of a single source and possibly a volume control. The standard has no way of representing a system that is made up of several different boxes connected together, e.g. a media renderer connected into a pre-amp. Taking the example of a media renderer connected to a pre-amp, without the ability to represent the different boxes and how they are connected it is impossible, using the UPnP AV standard, to select the input on the pre-amp that the media renderer is connected to when the user selects the media renderer in a control point.&lt;br /&gt;
&lt;br /&gt;
== Problem 5: Media's URI changing when media server rebuilds its database ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media server specification does not have a requirement for media servers to present a piece of media to the network with the same URI. This has resulted in media server implementations that change media URIs when a user changes their media collection. This results in unexpected behaviour for the user. For example, a user plays some media on their renderer. The user then modifies their media collection which results in the media server rebuilding its database. The user then presses play on their renderer to only hear nothing (the URI is now no longer valid) or worse some different piece of media (the URI now represents some different media).&lt;br /&gt;
&lt;br /&gt;
= ohMeida Solutions =&lt;br /&gt;
The ohMedia standard has been designed to solve all the problems described above.&lt;br /&gt;
&lt;br /&gt;
The first three problems are solved through the ohPlaylist service specification. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problem 4 is solved through the ohProduct service specification and the ohTopology algorithm. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problem 5 is solved through the ohMedia server specification. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard goes further and adds the ohSongcast standard. ohSongcast provides the ability to synchronise playback between products, commonly referred to as party mode. However in general ohSongcast provides the ability for a product to stream its audio over a standard home network and for any product that supports the ohSongcast receiver specification to receive the audio and play it back. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How it works =&lt;br /&gt;
&lt;br /&gt;
ohMedia models media in the home through the interaction of 3 types of device, Control Points, Media Players and Media Servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of 3 devices as before, but with arrows labelled with 1. Browse, 2. Tell, 3. Retrieve&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Control Point first browses the Media Server to locate the desired media. The Control Point then tells the Media Player to play the selected media and finally Media Player retrieves the media from the Media Server.&lt;br /&gt;
&lt;br /&gt;
== ohTopology ==&lt;br /&gt;
&lt;br /&gt;
ohMedia models a home as a number Hi-Fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
ohMedia models a Hi-Fi system 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 one output and any number of sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;diagram of a product with multi-in, one out&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the ohProduct 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 ohTopology algorithm. The ohTopology algorithm is as follows,&lt;br /&gt;
&lt;br /&gt;
1.discover all the products in the home that have an ohProduct service&lt;br /&gt;
2.group the discovered products based on the room they are in&lt;br /&gt;
3.create a hierarchical tree structure by matching source names to product names&lt;br /&gt;
4.discover source functionality based on source type&lt;br /&gt;
5.discover additional functionality based on product attributes&lt;br /&gt;
&lt;br /&gt;
e.g. if we had two products, a pre-amp and a media player, which were connected together then both their ohProduct services would return the same room name and one of the source names returned by the pre-amp's ohProduct service would be the same as the product name returned by the media renderer's ohProduct service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of example&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sources ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines four source types,&lt;br /&gt;
&lt;br /&gt;
1.Playlist – product supports on device playlists&lt;br /&gt;
2.Radio – product supports internet radio with presets&lt;br /&gt;
3.Receiver – product supports receiving ohSongcast broadcasts&lt;br /&gt;
4.UpnpAv – product also implements the UPnP AV media renderer specification&lt;br /&gt;
&lt;br /&gt;
If a source type is not one of the types above an ohMedia control point will be able to switch to the source but will treat the source as a non controllable external input e.g. Analogue, TOS or HDMI.&lt;br /&gt;
&lt;br /&gt;
== Attributes ==&lt;br /&gt;
&lt;br /&gt;
ohMedia defines three attributes,&lt;br /&gt;
&lt;br /&gt;
1.Volume – product supports volume control&lt;br /&gt;
2.Info – product supports providing information about the currently playing media&lt;br /&gt;
3.Time – product supports providing the current time within the currently playing media&lt;br /&gt;
4.Sender – product supports ohSongcast broadcasting&lt;br /&gt;
&lt;br /&gt;
== ohPlaylist ==&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist specification has been designed to allow gap-less audio, playlists to proceed without the intervention of a control point and to function correctly under the manipulation of multiple control points.&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist is a list of media associated with a unique ID. Media is defined by its URI and metadata. A control point is required to keep in memory the current list of playlist IDs. This list of IDs can then be used to list the media in the order of play, obtain the metadata and manipulate the list.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the API that allow control points to manipulate, keep track of playlist changes and control playback.&lt;br /&gt;
&lt;br /&gt;
== ohSongcast ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
of either of these two concepts so a control point can only provide a user with a flat list of UPnP AV products in the home. Whilst this might work reasonably well for a user with a single UPnP AV product it is far from ideal when they have multiple UPnP AV products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the UPnP AV system architecture the control point holds all the information about the sequence of URIs that a media renderer will play. When there are multiple control points on the network there is no way for them all to have a common understanding of what a media renderer's sequence of URIs is. This results in each control point having its own, conflicting, understanding of a media renderer's state and when the current URI stops playing it becomes a race between the control points to set what they each believe to be the next URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problem 4: No support for synchronised playback across products&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard does not provide any solution to being able to synchronise playback across products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by storing the user created playlist on the media renderer. This means that an ohMedia media renderer can play a user created playlist without the need for a control point to be switched on.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by moving the state of a media renderer from the control point into the media renderer. This means that all control points can now share a common understanding of what a media renderer's current state is.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this problem by storing the playlist on the media renderer. This allows the ohMedia media renderer can start playback of the next URI immediately after the current URI has finished playing.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves the deficiency with ohSongcast. ohSongcast is an open network protocol that allows audio synchronisation between products that implement the ohSongcast protocol.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency through ohTopology. ohTopology defines how products are found on the network, how products are grouped together and how the grouped products are connected together.&lt;br /&gt;
&lt;br /&gt;
How It Works&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard uses the same playback architecture as used in the UPnP AV standard. The architecture is commonly known as the 3 box model. The 3 boxes in the 3 box model are, Media Renderer, Media Server and Control Point. The three components each work together to perform the task of playing back media. The media server contains the content available to a user. The user interacts with the control point's user interface to search and select the desired content on the media server and then to select the media renderer to playback the desired content. Playback of the content is achieved by out of band communication between the media server and media renderer, the control point is no involved.&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia</id>
		<title>OhMedia</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia"/>
				<updated>2011-12-15T20:43:25Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Overview */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ohMedia Overview =&lt;br /&gt;
&lt;br /&gt;
ohMedia is an open standard that allows the seamless interaction of media within your home.&lt;br /&gt;
&lt;br /&gt;
ohMedia's high level design is influenced by the UPnP AV standard (UAV). UAV correctly modelled media in the home as the interaction between 3 types of devices: Control Points, Media Renderers, and Media Servers.&lt;br /&gt;
&amp;lt;&amp;lt;picture&amp;gt;&amp;gt;&lt;br /&gt;
This model correctly identified the potential presence of an arbitrary number of each of these devices. However, the Media Server specification, and in particular the Media Renderer specification is deeply flawed. The next section explains those flaws and outlines how ohMedia fixes them.&lt;br /&gt;
&lt;br /&gt;
= Flaws in the UPnP AV Standard =&lt;br /&gt;
&lt;br /&gt;
== Problem 1: No support for gap-less audio ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification is technically able to support gap-less audio though the AV Transport service actions, setAVTRansportURI and setNextAVTransportURI. However, the UPnP forum chose to make the setNextAVTransportURI action optional. This meant that no, or very few, media renderer manufacturers chose to support the action, which in turn, meant that no control points have added support for gap-less audio. So the real world situation is that UPnP AV has no support for gap-less audio.&lt;br /&gt;
&lt;br /&gt;
== Problem 2: No support for a user's playlist to continue playing when a control point is turned off ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification only allows for a media renderer to store a maximum of two URIs, but, as previously discussed, the real world maximum is in fact only a single URI. This means that in order for a media renderer to play a user created playlist the control point has to be continually monitoring the media renderer. When the media renderer indicates that it has finished playing the current URI the control point then has to set the next URI. If the control point is turned off and not monitoring the media renderer then the media renderer will not be informed of the next URI and playback will stop.&lt;br /&gt;
&lt;br /&gt;
== Problem 3:  No support for multiple control points ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification caters for the case where a user wants multiple control  points to show the metadata that is associated with the currently playing URI. However when it comes to controlling a media renderer from multiple control points the standard quickly shows it inadequacies.&lt;br /&gt;
&lt;br /&gt;
The main problems comes from the fact that the media renderer only holds a URI for the currently playing URI. This means that only the control point that the user used to create a playlist has knowledge about the playlist. As described earlier, because this control point holds the user's playlist it is actually controlling the flow of URIs to the media renderer. What happens if the same user adds tracks to a different control point? At this point two control points are trying to control the flow of different URIs to the media renderer. At this point the whole system fails to operate as the user expects.&lt;br /&gt;
&lt;br /&gt;
When a user creates a playlist on their control point and starts playback on a UPnP AV media renderer the renderer only holds the currently playing URI. When the renderer finishes the current URI the control point provides the renderer with next URI. If the control point is turned off at the point when the renderer finishes playing the current URI the renderer will stop playback.&lt;br /&gt;
&lt;br /&gt;
With the control point controlling the flow of URIs to the media renderer the UPnP AV media renderer specification violates the 3 box model separation where the control point should, without any intervention, enable content to flow between the media server and media renderer.&lt;br /&gt;
&lt;br /&gt;
== Problem 4: No concept of a Hi-Fi system comprising of more than one product or a home comprising of more than one Hi-Fi system ==&lt;br /&gt;
&lt;br /&gt;
A modern home can have one or more Hi-Fi systems of which each Hi-Fi system can comprise of one or more products connected together, e.g. a media player and a pre-amp.&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard assumes a single box which is made up of a single source and possibly a volume control. The standard has no way of representing a system that is made up of several different boxes connected together, e.g. a media renderer connected into a pre-amp. Taking the example of a media renderer connected to a pre-amp, without the ability to represent the different boxes and how they are connected it is impossible, using the UPnP AV standard, to select the input on the pre-amp that the media renderer is connected to when the user selects the media renderer in a control point.&lt;br /&gt;
&lt;br /&gt;
== Problem 5: Media's URI changing when media server rebuilds its database ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media server specification does not have a requirement for media servers to present a piece of media to the network with the same URI. This has resulted in media server implementations that change media URIs when a user changes their media collection. This results in unexpected behaviour for the user. For example, a user plays some media on their renderer. The user then modifies their media collection which results in the media server rebuilding its database. The user then presses play on their renderer to only hear nothing (the URI is now no longer valid) or worse some different piece of media (the URI now represents some different media).&lt;br /&gt;
&lt;br /&gt;
= ohMeida Solutions =&lt;br /&gt;
The ohMedia standard has been designed to solve all the problems described above.&lt;br /&gt;
&lt;br /&gt;
The first three problems are solved through the ohPlaylist service specification. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problem 4 is solved through the ohProduct service specification and the ohTopology algorithm. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problem 5 is solved through the ohMedia server specification. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard goes further and adds the ohSongcast standard. ohSongcast provides the ability to synchronise playback between products, commonly referred to as party mode. However in general ohSongcast provides the ability for a product to stream its audio over a standard home network and for any product that supports the ohSongcast receiver specification to receive the audio and play it back. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How it works =&lt;br /&gt;
&lt;br /&gt;
ohMedia models media in the home through the interaction of 3 types of device, Control Points, Media Players and Media Servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of 3 devices as before, but with arrows labelled with 1. Browse, 2. Tell, 3. Retrieve&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Control Point first browses the Media Server to locate the desired media. The Control Point then tells the Media Player to play the selected media and finally Media Player retrieves the media from the Media Server.&lt;br /&gt;
&lt;br /&gt;
ohTopology&lt;br /&gt;
&lt;br /&gt;
ohMedia models a home as a number Hi-Fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
ohMedia models a Hi-Fi system 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 one output and any number of sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;diagram of a product with multi-in, one out&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the ohProduct 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 ohTopology algorithm. The ohTopology algorithm is as follows,&lt;br /&gt;
&lt;br /&gt;
1.discover all the products in the home that have an ohProduct service&lt;br /&gt;
2.group the discovered products based on the room they are in&lt;br /&gt;
3.create a hierarchical tree structure by matching source names to product names&lt;br /&gt;
4.discover source functionality based on source type&lt;br /&gt;
5.discover additional functionality based on product attributes&lt;br /&gt;
&lt;br /&gt;
e.g. if we had two products, a pre-amp and a media player, which were connected together then both their ohProduct services would return the same room name and one of the source names returned by the pre-amp's ohProduct service would be the same as the product name returned by the media renderer's ohProduct service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of example&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sources&lt;br /&gt;
&lt;br /&gt;
ohMedia defines four source types,&lt;br /&gt;
&lt;br /&gt;
1.Playlist – product supports on device playlists&lt;br /&gt;
2.Radio – product supports internet radio with presets&lt;br /&gt;
3.Receiver – product supports receiving ohSongcast broadcasts&lt;br /&gt;
4.UpnpAv – product also implements the UPnP AV media renderer specification&lt;br /&gt;
&lt;br /&gt;
If a source type is not one of the types above an ohMedia control point will be able to switch to the source but will treat the source as a non controllable external input e.g. Analogue, TOS or HDMI.&lt;br /&gt;
&lt;br /&gt;
Attributes&lt;br /&gt;
&lt;br /&gt;
ohMedia defines three attributes,&lt;br /&gt;
&lt;br /&gt;
1.Volume – product supports volume control&lt;br /&gt;
2.Info – product supports providing information about the currently playing media&lt;br /&gt;
3.Time – product supports providing the current time within the currently playing media&lt;br /&gt;
4.Sender – product supports ohSongcast broadcasting&lt;br /&gt;
&lt;br /&gt;
ohPlaylist&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist specification has been designed to allow gap-less audio, playlists to proceed without the intervention of a control point and to function correctly under the manipulation of multiple control points.&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist is a list of media associated with a unique ID. Media is defined by its URI and metadata. A control point is required to keep in memory the current list of playlist IDs. This list of IDs can then be used to list the media in the order of play, obtain the metadata and manipulate the list.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the API that allow control points to manipulate, keep track of playlist changes and control playback.&lt;br /&gt;
&lt;br /&gt;
ohSongcast&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
of either of these two concepts so a control point can only provide a user with a flat list of UPnP AV products in the home. Whilst this might work reasonably well for a user with a single UPnP AV product it is far from ideal when they have multiple UPnP AV products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the UPnP AV system architecture the control point holds all the information about the sequence of URIs that a media renderer will play. When there are multiple control points on the network there is no way for them all to have a common understanding of what a media renderer's sequence of URIs is. This results in each control point having its own, conflicting, understanding of a media renderer's state and when the current URI stops playing it becomes a race between the control points to set what they each believe to be the next URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problem 4: No support for synchronised playback across products&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard does not provide any solution to being able to synchronise playback across products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by storing the user created playlist on the media renderer. This means that an ohMedia media renderer can play a user created playlist without the need for a control point to be switched on.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by moving the state of a media renderer from the control point into the media renderer. This means that all control points can now share a common understanding of what a media renderer's current state is.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this problem by storing the playlist on the media renderer. This allows the ohMedia media renderer can start playback of the next URI immediately after the current URI has finished playing.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves the deficiency with ohSongcast. ohSongcast is an open network protocol that allows audio synchronisation between products that implement the ohSongcast protocol.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency through ohTopology. ohTopology defines how products are found on the network, how products are grouped together and how the grouped products are connected together.&lt;br /&gt;
&lt;br /&gt;
How It Works&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard uses the same playback architecture as used in the UPnP AV standard. The architecture is commonly known as the 3 box model. The 3 boxes in the 3 box model are, Media Renderer, Media Server and Control Point. The three components each work together to perform the task of playing back media. The media server contains the content available to a user. The user interacts with the control point's user interface to search and select the desired content on the media server and then to select the media renderer to playback the desired content. Playback of the content is achieved by out of band communication between the media server and media renderer, the control point is no involved.&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia</id>
		<title>OhMedia</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia"/>
				<updated>2011-12-15T20:43:03Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: Created page with &amp;quot;= Overview =  ohMedia is an open standard that allows the seamless interaction of media within your home.  ohMedia's high level design is influenced by the UPnP AV standard (UAV)...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Overview =&lt;br /&gt;
&lt;br /&gt;
ohMedia is an open standard that allows the seamless interaction of media within your home.&lt;br /&gt;
&lt;br /&gt;
ohMedia's high level design is influenced by the UPnP AV standard (UAV). UAV correctly modelled media in the home as the interaction between 3 types of devices: Control Points, Media Renderers, and Media Servers.&lt;br /&gt;
&amp;lt;&amp;lt;picture&amp;gt;&amp;gt;&lt;br /&gt;
This model correctly identified the potential presence of an arbitrary number of each of these devices. However, the Media Server specification, and in particular the Media Renderer specification is deeply flawed. The next section explains those flaws and outlines how ohMedia fixes them.&lt;br /&gt;
&lt;br /&gt;
= Flaws in the UPnP AV Standard =&lt;br /&gt;
&lt;br /&gt;
== Problem 1: No support for gap-less audio ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification is technically able to support gap-less audio though the AV Transport service actions, setAVTRansportURI and setNextAVTransportURI. However, the UPnP forum chose to make the setNextAVTransportURI action optional. This meant that no, or very few, media renderer manufacturers chose to support the action, which in turn, meant that no control points have added support for gap-less audio. So the real world situation is that UPnP AV has no support for gap-less audio.&lt;br /&gt;
&lt;br /&gt;
== Problem 2: No support for a user's playlist to continue playing when a control point is turned off ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification only allows for a media renderer to store a maximum of two URIs, but, as previously discussed, the real world maximum is in fact only a single URI. This means that in order for a media renderer to play a user created playlist the control point has to be continually monitoring the media renderer. When the media renderer indicates that it has finished playing the current URI the control point then has to set the next URI. If the control point is turned off and not monitoring the media renderer then the media renderer will not be informed of the next URI and playback will stop.&lt;br /&gt;
&lt;br /&gt;
== Problem 3:  No support for multiple control points ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media renderer specification caters for the case where a user wants multiple control  points to show the metadata that is associated with the currently playing URI. However when it comes to controlling a media renderer from multiple control points the standard quickly shows it inadequacies.&lt;br /&gt;
&lt;br /&gt;
The main problems comes from the fact that the media renderer only holds a URI for the currently playing URI. This means that only the control point that the user used to create a playlist has knowledge about the playlist. As described earlier, because this control point holds the user's playlist it is actually controlling the flow of URIs to the media renderer. What happens if the same user adds tracks to a different control point? At this point two control points are trying to control the flow of different URIs to the media renderer. At this point the whole system fails to operate as the user expects.&lt;br /&gt;
&lt;br /&gt;
When a user creates a playlist on their control point and starts playback on a UPnP AV media renderer the renderer only holds the currently playing URI. When the renderer finishes the current URI the control point provides the renderer with next URI. If the control point is turned off at the point when the renderer finishes playing the current URI the renderer will stop playback.&lt;br /&gt;
&lt;br /&gt;
With the control point controlling the flow of URIs to the media renderer the UPnP AV media renderer specification violates the 3 box model separation where the control point should, without any intervention, enable content to flow between the media server and media renderer.&lt;br /&gt;
&lt;br /&gt;
== Problem 4: No concept of a Hi-Fi system comprising of more than one product or a home comprising of more than one Hi-Fi system ==&lt;br /&gt;
&lt;br /&gt;
A modern home can have one or more Hi-Fi systems of which each Hi-Fi system can comprise of one or more products connected together, e.g. a media player and a pre-amp.&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard assumes a single box which is made up of a single source and possibly a volume control. The standard has no way of representing a system that is made up of several different boxes connected together, e.g. a media renderer connected into a pre-amp. Taking the example of a media renderer connected to a pre-amp, without the ability to represent the different boxes and how they are connected it is impossible, using the UPnP AV standard, to select the input on the pre-amp that the media renderer is connected to when the user selects the media renderer in a control point.&lt;br /&gt;
&lt;br /&gt;
== Problem 5: Media's URI changing when media server rebuilds its database ==&lt;br /&gt;
&lt;br /&gt;
The UPnP AV media server specification does not have a requirement for media servers to present a piece of media to the network with the same URI. This has resulted in media server implementations that change media URIs when a user changes their media collection. This results in unexpected behaviour for the user. For example, a user plays some media on their renderer. The user then modifies their media collection which results in the media server rebuilding its database. The user then presses play on their renderer to only hear nothing (the URI is now no longer valid) or worse some different piece of media (the URI now represents some different media).&lt;br /&gt;
&lt;br /&gt;
= ohMeida Solutions =&lt;br /&gt;
The ohMedia standard has been designed to solve all the problems described above.&lt;br /&gt;
&lt;br /&gt;
The first three problems are solved through the ohPlaylist service specification. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problem 4 is solved through the ohProduct service specification and the ohTopology algorithm. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Problem 5 is solved through the ohMedia server specification. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard goes further and adds the ohSongcast standard. ohSongcast provides the ability to synchronise playback between products, commonly referred to as party mode. However in general ohSongcast provides the ability for a product to stream its audio over a standard home network and for any product that supports the ohSongcast receiver specification to receive the audio and play it back. &amp;lt;&amp;lt;link to how it works&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= How it works =&lt;br /&gt;
&lt;br /&gt;
ohMedia models media in the home through the interaction of 3 types of device, Control Points, Media Players and Media Servers.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of 3 devices as before, but with arrows labelled with 1. Browse, 2. Tell, 3. Retrieve&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The Control Point first browses the Media Server to locate the desired media. The Control Point then tells the Media Player to play the selected media and finally Media Player retrieves the media from the Media Server.&lt;br /&gt;
&lt;br /&gt;
ohTopology&lt;br /&gt;
&lt;br /&gt;
ohMedia models a home as a number Hi-Fi systems, which are located in rooms.&lt;br /&gt;
&lt;br /&gt;
ohMedia models a Hi-Fi system 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 one output and any number of sources.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;diagram of a product with multi-in, one out&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A product is modelled through the ohProduct 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 ohTopology algorithm. The ohTopology algorithm is as follows,&lt;br /&gt;
&lt;br /&gt;
1.discover all the products in the home that have an ohProduct service&lt;br /&gt;
2.group the discovered products based on the room they are in&lt;br /&gt;
3.create a hierarchical tree structure by matching source names to product names&lt;br /&gt;
4.discover source functionality based on source type&lt;br /&gt;
5.discover additional functionality based on product attributes&lt;br /&gt;
&lt;br /&gt;
e.g. if we had two products, a pre-amp and a media player, which were connected together then both their ohProduct services would return the same room name and one of the source names returned by the pre-amp's ohProduct service would be the same as the product name returned by the media renderer's ohProduct service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;picture of example&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Sources&lt;br /&gt;
&lt;br /&gt;
ohMedia defines four source types,&lt;br /&gt;
&lt;br /&gt;
1.Playlist – product supports on device playlists&lt;br /&gt;
2.Radio – product supports internet radio with presets&lt;br /&gt;
3.Receiver – product supports receiving ohSongcast broadcasts&lt;br /&gt;
4.UpnpAv – product also implements the UPnP AV media renderer specification&lt;br /&gt;
&lt;br /&gt;
If a source type is not one of the types above an ohMedia control point will be able to switch to the source but will treat the source as a non controllable external input e.g. Analogue, TOS or HDMI.&lt;br /&gt;
&lt;br /&gt;
Attributes&lt;br /&gt;
&lt;br /&gt;
ohMedia defines three attributes,&lt;br /&gt;
&lt;br /&gt;
1.Volume – product supports volume control&lt;br /&gt;
2.Info – product supports providing information about the currently playing media&lt;br /&gt;
3.Time – product supports providing the current time within the currently playing media&lt;br /&gt;
4.Sender – product supports ohSongcast broadcasting&lt;br /&gt;
&lt;br /&gt;
ohPlaylist&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist specification has been designed to allow gap-less audio, playlists to proceed without the intervention of a control point and to function correctly under the manipulation of multiple control points.&lt;br /&gt;
&lt;br /&gt;
The ohPlaylist is a list of media associated with a unique ID. Media is defined by its URI and metadata. A control point is required to keep in memory the current list of playlist IDs. This list of IDs can then be used to list the media in the order of play, obtain the metadata and manipulate the list.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the API that allow control points to manipulate, keep track of playlist changes and control playback.&lt;br /&gt;
&lt;br /&gt;
ohSongcast&lt;br /&gt;
&lt;br /&gt;
&amp;lt;&amp;lt;to do&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
of either of these two concepts so a control point can only provide a user with a flat list of UPnP AV products in the home. Whilst this might work reasonably well for a user with a single UPnP AV product it is far from ideal when they have multiple UPnP AV products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In the UPnP AV system architecture the control point holds all the information about the sequence of URIs that a media renderer will play. When there are multiple control points on the network there is no way for them all to have a common understanding of what a media renderer's sequence of URIs is. This results in each control point having its own, conflicting, understanding of a media renderer's state and when the current URI stops playing it becomes a race between the control points to set what they each believe to be the next URI.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Problem 4: No support for synchronised playback across products&lt;br /&gt;
&lt;br /&gt;
The UPnP AV standard does not provide any solution to being able to synchronise playback across products.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by storing the user created playlist on the media renderer. This means that an ohMedia media renderer can play a user created playlist without the need for a control point to be switched on.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency by moving the state of a media renderer from the control point into the media renderer. This means that all control points can now share a common understanding of what a media renderer's current state is.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this problem by storing the playlist on the media renderer. This allows the ohMedia media renderer can start playback of the next URI immediately after the current URI has finished playing.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves the deficiency with ohSongcast. ohSongcast is an open network protocol that allows audio synchronisation between products that implement the ohSongcast protocol.&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard solves this deficiency through ohTopology. ohTopology defines how products are found on the network, how products are grouped together and how the grouped products are connected together.&lt;br /&gt;
&lt;br /&gt;
How It Works&lt;br /&gt;
&lt;br /&gt;
The ohMedia standard uses the same playback architecture as used in the UPnP AV standard. The architecture is commonly known as the 3 box model. The 3 boxes in the 3 box model are, Media Renderer, Media Server and Control Point. The three components each work together to perform the task of playing back media. The media server contains the content available to a user. The user interacts with the control point's user interface to search and select the desired content on the media server and then to select the media renderer to playback the desired content. Playback of the content is achieved by out of band communication between the media server and media renderer, the control point is no involved.&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Oh:Overview</id>
		<title>Oh:Overview</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Oh:Overview"/>
				<updated>2011-12-15T14:56:47Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohDownload */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The adoption of broadband internet and the proliferation of wifi-connected devices such as smartphones, web tablets, and netbooks has resulted in the computer network becoming a standard feature of the modern home. But there are a number of ways in which the modern family is yet to realize the full benefit of this home networking revolution.&lt;br /&gt;
&lt;br /&gt;
OpenHome is an independent body committed to redressing this through the design, implementation, and promotion of open standards. It stimulates innovation by transforming the home network into a rich environment for applications that fit with the way families live.&lt;br /&gt;
&lt;br /&gt;
= [[OhOs|ohOs]] =&lt;br /&gt;
&lt;br /&gt;
Users of personal computers and portable computing devices are familiar with the process of installing applications according to their own personal tastes or needs. But there are a number of applications that do not fit neatly into this pattern of deployment and use.&lt;br /&gt;
&lt;br /&gt;
The OpenHome Operating System, [[OhOs|ohOs]], fills this gap by providing a place to deploy software that is for use not only by a single individual but by all family members. And in doing so [[OhOs|ohOs]] opens the way for applications that:&lt;br /&gt;
&lt;br /&gt;
* Allow the family to access and control a wide range of domestic appliances, such as lights, media players, and security cameras, organized from the perspective of the home as a whole.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone controlling lights using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Allow the family to view, and maintain structured information that is most meaningful in the context of the home, such as shared calendars, family address books, and photo albums.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone putting car servicing appointment into a family calendar using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Provide opportunities for creativity and fun for the family as a whole. &lt;br /&gt;
&lt;br /&gt;
[Illustration of family members each with their own iPad or iPhone jointly doing a crossword?]&lt;br /&gt;
&lt;br /&gt;
* Provide rich, user-friendly control over otherwise technically challenging networking facilities, such as parental control over internet access.&lt;br /&gt;
&lt;br /&gt;
[Illustration of a child unable to access the internet from their bedroom at night with happy care-free parents downstairs?]&lt;br /&gt;
&lt;br /&gt;
* Provide a trusted domain for archiving and messaging that keeps all information safely within the boundary of the domestic network.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone storing the code for a safe using an iPhone-like device?]&lt;br /&gt;
&lt;br /&gt;
[[OhOs|ohOs]] achieves this by providing lightweight, always-on, networked computing for applications that can be installed from a readily accessible app store and used by any web-browser-enabled device.&lt;br /&gt;
&lt;br /&gt;
= [[OhMedia|ohMedia]] =&lt;br /&gt;
&lt;br /&gt;
Networked audio was arguably the first popular application for the networked home. The idea of storing a digital music collection on a central server and playing it on a range of networked audio devices has begun to take hold. Add to this the idea that choosing and controlling that music should be possible from wirelessly networked mobile devices and we have the basic architecture for home audio that was first outlined in the UPnP AV specification.&lt;br /&gt;
&lt;br /&gt;
[Illustration of networked audio home with music being enjoyed in different rooms and being controlled by iPad-like devices]&lt;br /&gt;
&lt;br /&gt;
However, UPnP AV contains serious oversights and flaws that prevent it from delivering an appealing networked music experience throughout the home.&lt;br /&gt;
&lt;br /&gt;
OpenHome addresses this by creating a set of open extensions to UPnP AV that were designed from the ground up from a home-centered perspective. Furthermore, OpenHome goes beyond UPnP AV by developing completely new network standards, such as Songcast, which deliver additional home-centered functionality. More details are avaliable [[OhMedia|here]].&lt;br /&gt;
&lt;br /&gt;
= [[Oh:Downloads|ohDownload]] =&lt;br /&gt;
&lt;br /&gt;
OpenHome maintains that open standards are best developed in parallel with real-world implementations of those standards. This ensures that they are both fit for use and immediately available for use.&lt;br /&gt;
&lt;br /&gt;
[Possible illustration of person in ivory tower dreaming of ridiculous fantastical car, and person on the ground dreaming of really good car]&lt;br /&gt;
&lt;br /&gt;
In pursuit of this principle, OpenHome publishes an ever-growing suite of high quality, open software that is actively maintained and already proven in successful commercial products.&lt;br /&gt;
&lt;br /&gt;
This includes:&lt;br /&gt;
&lt;br /&gt;
* [[OhNet|ohNet]], the OpenHome networking stack, which facilitates the creation of service-oriented, SOAP-based networking software with inherent UPnP support.&lt;br /&gt;
&lt;br /&gt;
* [[OhSongcast|ohSongcast]], which implements OpenHome standards for one-to-many transmission of audio around a home network&lt;br /&gt;
&lt;br /&gt;
* [[OhNetworkMonitor|ohNetworkMonitor]], which provides facilities for troubleshooting home networking problems&lt;br /&gt;
&lt;br /&gt;
OpenHome software may be downloaded [[Oh:Downloads|here]].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Oh:Overview</id>
		<title>Oh:Overview</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Oh:Overview"/>
				<updated>2011-12-15T14:48:38Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohMedia */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The adoption of broadband internet and the proliferation of wifi-connected devices such as smartphones, web tablets, and netbooks has resulted in the computer network becoming a standard feature of the modern home. But there are a number of ways in which the modern family is yet to realize the full benefit of this home networking revolution.&lt;br /&gt;
&lt;br /&gt;
OpenHome is an independent body committed to redressing this through the design, implementation, and promotion of open standards. It stimulates innovation by transforming the home network into a rich environment for applications that fit with the way families live.&lt;br /&gt;
&lt;br /&gt;
= [[OhOs|ohOs]] =&lt;br /&gt;
&lt;br /&gt;
Users of personal computers and portable computing devices are familiar with the process of installing applications according to their own personal tastes or needs. But there are a number of applications that do not fit neatly into this pattern of deployment and use.&lt;br /&gt;
&lt;br /&gt;
The OpenHome Operating System, [[OhOs|ohOs]], fills this gap by providing a place to deploy software that is for use not only by a single individual but by all family members. And in doing so [[OhOs|ohOs]] opens the way for applications that:&lt;br /&gt;
&lt;br /&gt;
* Allow the family to access and control a wide range of domestic appliances, such as lights, media players, and security cameras, organized from the perspective of the home as a whole.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone controlling lights using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Allow the family to view, and maintain structured information that is most meaningful in the context of the home, such as shared calendars, family address books, and photo albums.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone putting car servicing appointment into a family calendar using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Provide opportunities for creativity and fun for the family as a whole. &lt;br /&gt;
&lt;br /&gt;
[Illustration of family members each with their own iPad or iPhone jointly doing a crossword?]&lt;br /&gt;
&lt;br /&gt;
* Provide rich, user-friendly control over otherwise technically challenging networking facilities, such as parental control over internet access.&lt;br /&gt;
&lt;br /&gt;
[Illustration of a child unable to access the internet from their bedroom at night with happy care-free parents downstairs?]&lt;br /&gt;
&lt;br /&gt;
* Provide a trusted domain for archiving and messaging that keeps all information safely within the boundary of the domestic network.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone storing the code for a safe using an iPhone-like device?]&lt;br /&gt;
&lt;br /&gt;
[[OhOs|ohOs]] achieves this by providing lightweight, always-on, networked computing for applications that can be installed from a readily accessible app store and used by any web-browser-enabled device.&lt;br /&gt;
&lt;br /&gt;
= [[OhMedia|ohMedia]] =&lt;br /&gt;
&lt;br /&gt;
Networked audio was arguably the first popular application for the networked home. The idea of storing a digital music collection on a central server and playing it on a range of networked audio devices has begun to take hold. Add to this the idea that choosing and controlling that music should be possible from wirelessly networked mobile devices and we have the basic architecture for home audio that was first outlined in the UPnP AV specification.&lt;br /&gt;
&lt;br /&gt;
[Illustration of networked audio home with music being enjoyed in different rooms and being controlled by iPad-like devices]&lt;br /&gt;
&lt;br /&gt;
However, UPnP AV contains serious oversights and flaws that prevent it from delivering an appealing networked music experience throughout the home.&lt;br /&gt;
&lt;br /&gt;
OpenHome addresses this by creating a set of open extensions to UPnP AV that were designed from the ground up from a home-centered perspective. Furthermore, OpenHome goes beyond UPnP AV by developing completely new network standards, such as Songcast, which deliver additional home-centered functionality. More details are avaliable [[OhMedia|here]].&lt;br /&gt;
&lt;br /&gt;
= [[Oh:Downloads|ohDownload]] =&lt;br /&gt;
&lt;br /&gt;
OpenHome maintains that open standards are best developed in parallel with real-world implementations of those standards. This ensures that they are both fit for use and immediately available for use.&lt;br /&gt;
&lt;br /&gt;
[Possible illustration of person in ivory tower dreaming of ridiculous fantastical car, and person on the ground dreaming of really good car]&lt;br /&gt;
&lt;br /&gt;
In pursuit of this principle, OpenHome publishes an ever-growing suite of high quality, open software that is actively maintained and already proven in successful commercial products.&lt;br /&gt;
&lt;br /&gt;
This includes:&lt;br /&gt;
&lt;br /&gt;
* [[OhNet|ohNet]], the OpenHome networking stack, which facilitates the creation of service-oriented, SOAP-based networking software with inherent UPnP support.&lt;br /&gt;
&lt;br /&gt;
* ohSongcast, which implements OpenHome standards for one-to-many transmission of audio around a home network&lt;br /&gt;
&lt;br /&gt;
* ohNetworkMonitor, which provides facilities for troubleshooting home networking problems&lt;br /&gt;
&lt;br /&gt;
OpenHome software may be downloaded [[Oh:Downloads|here]].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Oh:Overview</id>
		<title>Oh:Overview</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Oh:Overview"/>
				<updated>2011-12-15T14:45:48Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohDownloads */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The adoption of broadband internet and the proliferation of wifi-connected devices such as smartphones, web tablets, and netbooks has resulted in the computer network becoming a standard feature of the modern home. But there are a number of ways in which the modern family is yet to realize the full benefit of this home networking revolution.&lt;br /&gt;
&lt;br /&gt;
OpenHome is an independent body committed to redressing this through the design, implementation, and promotion of open standards. It stimulates innovation by transforming the home network into a rich environment for applications that fit with the way families live.&lt;br /&gt;
&lt;br /&gt;
= [[OhOs|ohOs]] =&lt;br /&gt;
&lt;br /&gt;
Users of personal computers and portable computing devices are familiar with the process of installing applications according to their own personal tastes or needs. But there are a number of applications that do not fit neatly into this pattern of deployment and use.&lt;br /&gt;
&lt;br /&gt;
The OpenHome Operating System, [[OhOs|ohOs]], fills this gap by providing a place to deploy software that is for use not only by a single individual but by all family members. And in doing so [[OhOs|ohOs]] opens the way for applications that:&lt;br /&gt;
&lt;br /&gt;
* Allow the family to access and control a wide range of domestic appliances, such as lights, media players, and security cameras, organized from the perspective of the home as a whole.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone controlling lights using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Allow the family to view, and maintain structured information that is most meaningful in the context of the home, such as shared calendars, family address books, and photo albums.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone putting car servicing appointment into a family calendar using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Provide opportunities for creativity and fun for the family as a whole. &lt;br /&gt;
&lt;br /&gt;
[Illustration of family members each with their own iPad or iPhone jointly doing a crossword?]&lt;br /&gt;
&lt;br /&gt;
* Provide rich, user-friendly control over otherwise technically challenging networking facilities, such as parental control over internet access.&lt;br /&gt;
&lt;br /&gt;
[Illustration of a child unable to access the internet from their bedroom at night with happy care-free parents downstairs?]&lt;br /&gt;
&lt;br /&gt;
* Provide a trusted domain for archiving and messaging that keeps all information safely within the boundary of the domestic network.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone storing the code for a safe using an iPhone-like device?]&lt;br /&gt;
&lt;br /&gt;
[[OhOs|ohOs]] achieves this by providing lightweight, always-on, networked computing for applications that can be installed from a readily accessible app store and used by any web-browser-enabled device.&lt;br /&gt;
&lt;br /&gt;
= ohMedia =&lt;br /&gt;
&lt;br /&gt;
Networked audio was arguably the first popular application for the networked home. The idea of storing a digital music collection on a central server and playing it on a range of networked audio devices has begun to take hold. Add to this the idea that choosing and controlling that music should be possible from wirelessly networked mobile devices and we have the basic architecture for home audio that was first outlined in the UPnP AV specification.&lt;br /&gt;
&lt;br /&gt;
[Illustration of networked audio home with music being enjoyed in different rooms and being controlled by iPad-like devices]&lt;br /&gt;
&lt;br /&gt;
However, UPnP AV contains serious oversights and flaws that prevent it from delivering an appealing networked music experience throughout the home.&lt;br /&gt;
&lt;br /&gt;
OpenHome addresses this by creating a set of open extensions to UPnP AV that were designed from the ground up from a home-centered perspective. Furthermore, OpenHome goes beyond UPnP AV by developing completely new network standards, such as Songcast, which deliver additional home-centered functionality. More details are avaliable here.&lt;br /&gt;
&lt;br /&gt;
= [[Oh:Downloads|ohDownload]] =&lt;br /&gt;
&lt;br /&gt;
OpenHome maintains that open standards are best developed in parallel with real-world implementations of those standards. This ensures that they are both fit for use and immediately available for use.&lt;br /&gt;
&lt;br /&gt;
[Possible illustration of person in ivory tower dreaming of ridiculous fantastical car, and person on the ground dreaming of really good car]&lt;br /&gt;
&lt;br /&gt;
In pursuit of this principle, OpenHome publishes an ever-growing suite of high quality, open software that is actively maintained and already proven in successful commercial products.&lt;br /&gt;
&lt;br /&gt;
This includes:&lt;br /&gt;
&lt;br /&gt;
* [[OhNet|ohNet]], the OpenHome networking stack, which facilitates the creation of service-oriented, SOAP-based networking software with inherent UPnP support.&lt;br /&gt;
&lt;br /&gt;
* ohSongcast, which implements OpenHome standards for one-to-many transmission of audio around a home network&lt;br /&gt;
&lt;br /&gt;
* ohNetworkMonitor, which provides facilities for troubleshooting home networking problems&lt;br /&gt;
&lt;br /&gt;
OpenHome software may be downloaded [[Oh:Downloads|here]].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Oh:Overview</id>
		<title>Oh:Overview</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Oh:Overview"/>
				<updated>2011-12-15T14:45:30Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohDownload */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The adoption of broadband internet and the proliferation of wifi-connected devices such as smartphones, web tablets, and netbooks has resulted in the computer network becoming a standard feature of the modern home. But there are a number of ways in which the modern family is yet to realize the full benefit of this home networking revolution.&lt;br /&gt;
&lt;br /&gt;
OpenHome is an independent body committed to redressing this through the design, implementation, and promotion of open standards. It stimulates innovation by transforming the home network into a rich environment for applications that fit with the way families live.&lt;br /&gt;
&lt;br /&gt;
= [[OhOs|ohOs]] =&lt;br /&gt;
&lt;br /&gt;
Users of personal computers and portable computing devices are familiar with the process of installing applications according to their own personal tastes or needs. But there are a number of applications that do not fit neatly into this pattern of deployment and use.&lt;br /&gt;
&lt;br /&gt;
The OpenHome Operating System, [[OhOs|ohOs]], fills this gap by providing a place to deploy software that is for use not only by a single individual but by all family members. And in doing so [[OhOs|ohOs]] opens the way for applications that:&lt;br /&gt;
&lt;br /&gt;
* Allow the family to access and control a wide range of domestic appliances, such as lights, media players, and security cameras, organized from the perspective of the home as a whole.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone controlling lights using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Allow the family to view, and maintain structured information that is most meaningful in the context of the home, such as shared calendars, family address books, and photo albums.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone putting car servicing appointment into a family calendar using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Provide opportunities for creativity and fun for the family as a whole. &lt;br /&gt;
&lt;br /&gt;
[Illustration of family members each with their own iPad or iPhone jointly doing a crossword?]&lt;br /&gt;
&lt;br /&gt;
* Provide rich, user-friendly control over otherwise technically challenging networking facilities, such as parental control over internet access.&lt;br /&gt;
&lt;br /&gt;
[Illustration of a child unable to access the internet from their bedroom at night with happy care-free parents downstairs?]&lt;br /&gt;
&lt;br /&gt;
* Provide a trusted domain for archiving and messaging that keeps all information safely within the boundary of the domestic network.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone storing the code for a safe using an iPhone-like device?]&lt;br /&gt;
&lt;br /&gt;
[[OhOs|ohOs]] achieves this by providing lightweight, always-on, networked computing for applications that can be installed from a readily accessible app store and used by any web-browser-enabled device.&lt;br /&gt;
&lt;br /&gt;
= ohMedia =&lt;br /&gt;
&lt;br /&gt;
Networked audio was arguably the first popular application for the networked home. The idea of storing a digital music collection on a central server and playing it on a range of networked audio devices has begun to take hold. Add to this the idea that choosing and controlling that music should be possible from wirelessly networked mobile devices and we have the basic architecture for home audio that was first outlined in the UPnP AV specification.&lt;br /&gt;
&lt;br /&gt;
[Illustration of networked audio home with music being enjoyed in different rooms and being controlled by iPad-like devices]&lt;br /&gt;
&lt;br /&gt;
However, UPnP AV contains serious oversights and flaws that prevent it from delivering an appealing networked music experience throughout the home.&lt;br /&gt;
&lt;br /&gt;
OpenHome addresses this by creating a set of open extensions to UPnP AV that were designed from the ground up from a home-centered perspective. Furthermore, OpenHome goes beyond UPnP AV by developing completely new network standards, such as Songcast, which deliver additional home-centered functionality. More details are avaliable here.&lt;br /&gt;
&lt;br /&gt;
= [[Oh:Downloads|ohDownloads]] =&lt;br /&gt;
&lt;br /&gt;
OpenHome maintains that open standards are best developed in parallel with real-world implementations of those standards. This ensures that they are both fit for use and immediately available for use.&lt;br /&gt;
&lt;br /&gt;
[Possible illustration of person in ivory tower dreaming of ridiculous fantastical car, and person on the ground dreaming of really good car]&lt;br /&gt;
&lt;br /&gt;
In pursuit of this principle, OpenHome publishes an ever-growing suite of high quality, open software that is actively maintained and already proven in successful commercial products.&lt;br /&gt;
&lt;br /&gt;
This includes:&lt;br /&gt;
&lt;br /&gt;
* [[OhNet|ohNet]], the OpenHome networking stack, which facilitates the creation of service-oriented, SOAP-based networking software with inherent UPnP support.&lt;br /&gt;
&lt;br /&gt;
* ohSongcast, which implements OpenHome standards for one-to-many transmission of audio around a home network&lt;br /&gt;
&lt;br /&gt;
* ohNetworkMonitor, which provides facilities for troubleshooting home networking problems&lt;br /&gt;
&lt;br /&gt;
OpenHome software may be downloaded [[Oh:Downloads|here]].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Oh:Overview</id>
		<title>Oh:Overview</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Oh:Overview"/>
				<updated>2011-12-15T14:44:59Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohDownload */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The adoption of broadband internet and the proliferation of wifi-connected devices such as smartphones, web tablets, and netbooks has resulted in the computer network becoming a standard feature of the modern home. But there are a number of ways in which the modern family is yet to realize the full benefit of this home networking revolution.&lt;br /&gt;
&lt;br /&gt;
OpenHome is an independent body committed to redressing this through the design, implementation, and promotion of open standards. It stimulates innovation by transforming the home network into a rich environment for applications that fit with the way families live.&lt;br /&gt;
&lt;br /&gt;
= [[OhOs|ohOs]] =&lt;br /&gt;
&lt;br /&gt;
Users of personal computers and portable computing devices are familiar with the process of installing applications according to their own personal tastes or needs. But there are a number of applications that do not fit neatly into this pattern of deployment and use.&lt;br /&gt;
&lt;br /&gt;
The OpenHome Operating System, [[OhOs|ohOs]], fills this gap by providing a place to deploy software that is for use not only by a single individual but by all family members. And in doing so [[OhOs|ohOs]] opens the way for applications that:&lt;br /&gt;
&lt;br /&gt;
* Allow the family to access and control a wide range of domestic appliances, such as lights, media players, and security cameras, organized from the perspective of the home as a whole.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone controlling lights using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Allow the family to view, and maintain structured information that is most meaningful in the context of the home, such as shared calendars, family address books, and photo albums.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone putting car servicing appointment into a family calendar using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Provide opportunities for creativity and fun for the family as a whole. &lt;br /&gt;
&lt;br /&gt;
[Illustration of family members each with their own iPad or iPhone jointly doing a crossword?]&lt;br /&gt;
&lt;br /&gt;
* Provide rich, user-friendly control over otherwise technically challenging networking facilities, such as parental control over internet access.&lt;br /&gt;
&lt;br /&gt;
[Illustration of a child unable to access the internet from their bedroom at night with happy care-free parents downstairs?]&lt;br /&gt;
&lt;br /&gt;
* Provide a trusted domain for archiving and messaging that keeps all information safely within the boundary of the domestic network.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone storing the code for a safe using an iPhone-like device?]&lt;br /&gt;
&lt;br /&gt;
[[OhOs|ohOs]] achieves this by providing lightweight, always-on, networked computing for applications that can be installed from a readily accessible app store and used by any web-browser-enabled device.&lt;br /&gt;
&lt;br /&gt;
= ohMedia =&lt;br /&gt;
&lt;br /&gt;
Networked audio was arguably the first popular application for the networked home. The idea of storing a digital music collection on a central server and playing it on a range of networked audio devices has begun to take hold. Add to this the idea that choosing and controlling that music should be possible from wirelessly networked mobile devices and we have the basic architecture for home audio that was first outlined in the UPnP AV specification.&lt;br /&gt;
&lt;br /&gt;
[Illustration of networked audio home with music being enjoyed in different rooms and being controlled by iPad-like devices]&lt;br /&gt;
&lt;br /&gt;
However, UPnP AV contains serious oversights and flaws that prevent it from delivering an appealing networked music experience throughout the home.&lt;br /&gt;
&lt;br /&gt;
OpenHome addresses this by creating a set of open extensions to UPnP AV that were designed from the ground up from a home-centered perspective. Furthermore, OpenHome goes beyond UPnP AV by developing completely new network standards, such as Songcast, which deliver additional home-centered functionality. More details are avaliable here.&lt;br /&gt;
&lt;br /&gt;
= [[Oh:Download|ohDownload]] =&lt;br /&gt;
&lt;br /&gt;
OpenHome maintains that open standards are best developed in parallel with real-world implementations of those standards. This ensures that they are both fit for use and immediately available for use.&lt;br /&gt;
&lt;br /&gt;
[Possible illustration of person in ivory tower dreaming of ridiculous fantastical car, and person on the ground dreaming of really good car]&lt;br /&gt;
&lt;br /&gt;
In pursuit of this principle, OpenHome publishes an ever-growing suite of high quality, open software that is actively maintained and already proven in successful commercial products.&lt;br /&gt;
&lt;br /&gt;
This includes:&lt;br /&gt;
&lt;br /&gt;
* [[OhNet|ohNet]], the OpenHome networking stack, which facilitates the creation of service-oriented, SOAP-based networking software with inherent UPnP support.&lt;br /&gt;
&lt;br /&gt;
* ohSongcast, which implements OpenHome standards for one-to-many transmission of audio around a home network&lt;br /&gt;
&lt;br /&gt;
* ohNetworkMonitor, which provides facilities for troubleshooting home networking problems&lt;br /&gt;
&lt;br /&gt;
OpenHome software may be downloaded [[Oh:Download|here]].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhOs</id>
		<title>OhOs</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhOs"/>
				<updated>2011-12-15T14:43:13Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ohOs is designed to be deployed onto a modern Operating System.  Deployments are maintained for:&lt;br /&gt;
* Windows x86/x64 desktop&lt;br /&gt;
* Mac x64 desktop&lt;br /&gt;
* Linux x86/x64 desktop&lt;br /&gt;
* Linux ARM&lt;br /&gt;
Linux ARM allows deployment on a [http://en.wikipedia.org/wiki/SheevaPlug plug computer].  The unobtrusive factor and low power requirements of these devices make them very well suited as the hosts for apps which should always be on.&lt;br /&gt;
&lt;br /&gt;
System architecture can be summarised as:&lt;br /&gt;
&lt;br /&gt;
[[File:ohOsOverviewArchDiagram.png|center]]&lt;br /&gt;
&lt;br /&gt;
ohOs hosts a number of applications (apps), each of which is always running.  All code in ohOs is managed.  This has the benefit of making applications portable across all platforms at no cost to the app developer.  All code in ohOs is written in C#.  Apps can be written in C# or other managed languages.&lt;br /&gt;
&lt;br /&gt;
Each ohOs app runs in its own process.  Communication with the app’s user interface or with other apps occurs using service interface calls over the network.  Service interfaces are typically presented as standard classes which internally use [[OhNet|ohNet]] to handle the invocation of a service function or notification of a change in a member variable.&lt;br /&gt;
&lt;br /&gt;
ohOs apps contain a web-based user interface, allowing users to access the apps on any control point without installing extra software.  Each app is automatically supplied with a rudimentary web server which delivers the web UI.  Apps are not required to generate complex html inside ohOs; instead they serve up JavaScript which uses the services exposed by the app to generate its UI client-side.&lt;br /&gt;
&lt;br /&gt;
Web UIs can use HTML5 features to provide an interface as graphically rich as native apps.  While there should be no pressing need to write native control points, ohOs does allow this.  In addition to C#, proxies for an app’s services can be generated in C or C++ (suitable for Apple’s iOS) or Java (suitable for Google’s Android).&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Oh:Overview</id>
		<title>Oh:Overview</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Oh:Overview"/>
				<updated>2011-12-15T14:41:54Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohDownload */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The adoption of broadband internet and the proliferation of wifi-connected devices such as smartphones, web tablets, and netbooks has resulted in the computer network becoming a standard feature of the modern home. But there are a number of ways in which the modern family is yet to realize the full benefit of this home networking revolution.&lt;br /&gt;
&lt;br /&gt;
OpenHome is an independent body committed to redressing this through the design, implementation, and promotion of open standards. It stimulates innovation by transforming the home network into a rich environment for applications that fit with the way families live.&lt;br /&gt;
&lt;br /&gt;
= [[OhOs|ohOs]] =&lt;br /&gt;
&lt;br /&gt;
Users of personal computers and portable computing devices are familiar with the process of installing applications according to their own personal tastes or needs. But there are a number of applications that do not fit neatly into this pattern of deployment and use.&lt;br /&gt;
&lt;br /&gt;
The OpenHome Operating System, [[OhOs|ohOs]], fills this gap by providing a place to deploy software that is for use not only by a single individual but by all family members. And in doing so [[OhOs|ohOs]] opens the way for applications that:&lt;br /&gt;
&lt;br /&gt;
* Allow the family to access and control a wide range of domestic appliances, such as lights, media players, and security cameras, organized from the perspective of the home as a whole.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone controlling lights using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Allow the family to view, and maintain structured information that is most meaningful in the context of the home, such as shared calendars, family address books, and photo albums.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone putting car servicing appointment into a family calendar using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Provide opportunities for creativity and fun for the family as a whole. &lt;br /&gt;
&lt;br /&gt;
[Illustration of family members each with their own iPad or iPhone jointly doing a crossword?]&lt;br /&gt;
&lt;br /&gt;
* Provide rich, user-friendly control over otherwise technically challenging networking facilities, such as parental control over internet access.&lt;br /&gt;
&lt;br /&gt;
[Illustration of a child unable to access the internet from their bedroom at night with happy care-free parents downstairs?]&lt;br /&gt;
&lt;br /&gt;
* Provide a trusted domain for archiving and messaging that keeps all information safely within the boundary of the domestic network.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone storing the code for a safe using an iPhone-like device?]&lt;br /&gt;
&lt;br /&gt;
[[OhOs|ohOs]] achieves this by providing lightweight, always-on, networked computing for applications that can be installed from a readily accessible app store and used by any web-browser-enabled device.&lt;br /&gt;
&lt;br /&gt;
= ohMedia =&lt;br /&gt;
&lt;br /&gt;
Networked audio was arguably the first popular application for the networked home. The idea of storing a digital music collection on a central server and playing it on a range of networked audio devices has begun to take hold. Add to this the idea that choosing and controlling that music should be possible from wirelessly networked mobile devices and we have the basic architecture for home audio that was first outlined in the UPnP AV specification.&lt;br /&gt;
&lt;br /&gt;
[Illustration of networked audio home with music being enjoyed in different rooms and being controlled by iPad-like devices]&lt;br /&gt;
&lt;br /&gt;
However, UPnP AV contains serious oversights and flaws that prevent it from delivering an appealing networked music experience throughout the home.&lt;br /&gt;
&lt;br /&gt;
OpenHome addresses this by creating a set of open extensions to UPnP AV that were designed from the ground up from a home-centered perspective. Furthermore, OpenHome goes beyond UPnP AV by developing completely new network standards, such as Songcast, which deliver additional home-centered functionality. More details are avaliable here.&lt;br /&gt;
&lt;br /&gt;
= [[Oh:Downloads|ohDownload]] =&lt;br /&gt;
&lt;br /&gt;
OpenHome maintains that open standards are best developed in parallel with real-world implementations of those standards. This ensures that they are both fit for use and immediately available for use.&lt;br /&gt;
&lt;br /&gt;
[Possible illustration of person in ivory tower dreaming of ridiculous fantastical car, and person on the ground dreaming of really good car]&lt;br /&gt;
&lt;br /&gt;
In pursuit of this principle, OpenHome publishes an ever-growing suite of high quality, open software that is actively maintained and already proven in successful commercial products.&lt;br /&gt;
&lt;br /&gt;
This includes:&lt;br /&gt;
&lt;br /&gt;
* [[OhNet|ohNet]], the OpenHome networking stack, which facilitates the creation of service-oriented, SOAP-based networking software with inherent UPnP support.&lt;br /&gt;
&lt;br /&gt;
* ohSongcast, which implements OpenHome standards for one-to-many transmission of audio around a home network&lt;br /&gt;
&lt;br /&gt;
* ohNetworkMonitor, which provides facilities for troubleshooting home networking problems&lt;br /&gt;
&lt;br /&gt;
OpenHome software may be downloaded [[Oh:Downloads|here]].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Oh:Overview</id>
		<title>Oh:Overview</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Oh:Overview"/>
				<updated>2011-12-15T14:40:08Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohDownload */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The adoption of broadband internet and the proliferation of wifi-connected devices such as smartphones, web tablets, and netbooks has resulted in the computer network becoming a standard feature of the modern home. But there are a number of ways in which the modern family is yet to realize the full benefit of this home networking revolution.&lt;br /&gt;
&lt;br /&gt;
OpenHome is an independent body committed to redressing this through the design, implementation, and promotion of open standards. It stimulates innovation by transforming the home network into a rich environment for applications that fit with the way families live.&lt;br /&gt;
&lt;br /&gt;
= [[OhOs|ohOs]] =&lt;br /&gt;
&lt;br /&gt;
Users of personal computers and portable computing devices are familiar with the process of installing applications according to their own personal tastes or needs. But there are a number of applications that do not fit neatly into this pattern of deployment and use.&lt;br /&gt;
&lt;br /&gt;
The OpenHome Operating System, [[OhOs|ohOs]], fills this gap by providing a place to deploy software that is for use not only by a single individual but by all family members. And in doing so [[OhOs|ohOs]] opens the way for applications that:&lt;br /&gt;
&lt;br /&gt;
* Allow the family to access and control a wide range of domestic appliances, such as lights, media players, and security cameras, organized from the perspective of the home as a whole.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone controlling lights using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Allow the family to view, and maintain structured information that is most meaningful in the context of the home, such as shared calendars, family address books, and photo albums.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone putting car servicing appointment into a family calendar using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Provide opportunities for creativity and fun for the family as a whole. &lt;br /&gt;
&lt;br /&gt;
[Illustration of family members each with their own iPad or iPhone jointly doing a crossword?]&lt;br /&gt;
&lt;br /&gt;
* Provide rich, user-friendly control over otherwise technically challenging networking facilities, such as parental control over internet access.&lt;br /&gt;
&lt;br /&gt;
[Illustration of a child unable to access the internet from their bedroom at night with happy care-free parents downstairs?]&lt;br /&gt;
&lt;br /&gt;
* Provide a trusted domain for archiving and messaging that keeps all information safely within the boundary of the domestic network.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone storing the code for a safe using an iPhone-like device?]&lt;br /&gt;
&lt;br /&gt;
[[OhOs|ohOs]] achieves this by providing lightweight, always-on, networked computing for applications that can be installed from a readily accessible app store and used by any web-browser-enabled device.&lt;br /&gt;
&lt;br /&gt;
= ohMedia =&lt;br /&gt;
&lt;br /&gt;
Networked audio was arguably the first popular application for the networked home. The idea of storing a digital music collection on a central server and playing it on a range of networked audio devices has begun to take hold. Add to this the idea that choosing and controlling that music should be possible from wirelessly networked mobile devices and we have the basic architecture for home audio that was first outlined in the UPnP AV specification.&lt;br /&gt;
&lt;br /&gt;
[Illustration of networked audio home with music being enjoyed in different rooms and being controlled by iPad-like devices]&lt;br /&gt;
&lt;br /&gt;
However, UPnP AV contains serious oversights and flaws that prevent it from delivering an appealing networked music experience throughout the home.&lt;br /&gt;
&lt;br /&gt;
OpenHome addresses this by creating a set of open extensions to UPnP AV that were designed from the ground up from a home-centered perspective. Furthermore, OpenHome goes beyond UPnP AV by developing completely new network standards, such as Songcast, which deliver additional home-centered functionality. More details are avaliable here.&lt;br /&gt;
&lt;br /&gt;
= ohDownload =&lt;br /&gt;
&lt;br /&gt;
OpenHome maintains that open standards are best developed in parallel with real-world implementations of those standards. This ensures that they are both fit for use and immediately available for use.&lt;br /&gt;
&lt;br /&gt;
[Possible illustration of person in ivory tower dreaming of ridiculous fantastical car, and person on the ground dreaming of really good car]&lt;br /&gt;
&lt;br /&gt;
In pursuit of this principle, OpenHome publishes an ever-growing suite of high quality, open software that is actively maintained and already proven in successful commercial products.&lt;br /&gt;
&lt;br /&gt;
This includes:&lt;br /&gt;
&lt;br /&gt;
* [[OhNet|ohNet]], the OpenHome networking stack, which facilitates the creation of service-oriented, SOAP-based networking software with inherent UPnP support.&lt;br /&gt;
&lt;br /&gt;
* ohSongcast, which implements OpenHome standards for one-to-many transmission of audio around a home network&lt;br /&gt;
&lt;br /&gt;
* ohNetworkMonitor, which provides facilities for troubleshooting home networking problems&lt;br /&gt;
&lt;br /&gt;
OpenHome software may be downloaded [http://www.openhome.org/wiki/Oh:Downloads here].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Oh:Overview</id>
		<title>Oh:Overview</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Oh:Overview"/>
				<updated>2011-12-15T14:38:15Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohOs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The adoption of broadband internet and the proliferation of wifi-connected devices such as smartphones, web tablets, and netbooks has resulted in the computer network becoming a standard feature of the modern home. But there are a number of ways in which the modern family is yet to realize the full benefit of this home networking revolution.&lt;br /&gt;
&lt;br /&gt;
OpenHome is an independent body committed to redressing this through the design, implementation, and promotion of open standards. It stimulates innovation by transforming the home network into a rich environment for applications that fit with the way families live.&lt;br /&gt;
&lt;br /&gt;
= [[OhOs|ohOs]] =&lt;br /&gt;
&lt;br /&gt;
Users of personal computers and portable computing devices are familiar with the process of installing applications according to their own personal tastes or needs. But there are a number of applications that do not fit neatly into this pattern of deployment and use.&lt;br /&gt;
&lt;br /&gt;
The OpenHome Operating System, [[OhOs|ohOs]], fills this gap by providing a place to deploy software that is for use not only by a single individual but by all family members. And in doing so [[OhOs|ohOs]] opens the way for applications that:&lt;br /&gt;
&lt;br /&gt;
* Allow the family to access and control a wide range of domestic appliances, such as lights, media players, and security cameras, organized from the perspective of the home as a whole.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone controlling lights using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Allow the family to view, and maintain structured information that is most meaningful in the context of the home, such as shared calendars, family address books, and photo albums.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone putting car servicing appointment into a family calendar using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Provide opportunities for creativity and fun for the family as a whole. &lt;br /&gt;
&lt;br /&gt;
[Illustration of family members each with their own iPad or iPhone jointly doing a crossword?]&lt;br /&gt;
&lt;br /&gt;
* Provide rich, user-friendly control over otherwise technically challenging networking facilities, such as parental control over internet access.&lt;br /&gt;
&lt;br /&gt;
[Illustration of a child unable to access the internet from their bedroom at night with happy care-free parents downstairs?]&lt;br /&gt;
&lt;br /&gt;
* Provide a trusted domain for archiving and messaging that keeps all information safely within the boundary of the domestic network.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone storing the code for a safe using an iPhone-like device?]&lt;br /&gt;
&lt;br /&gt;
[[OhOs|ohOs]] achieves this by providing lightweight, always-on, networked computing for applications that can be installed from a readily accessible app store and used by any web-browser-enabled device.&lt;br /&gt;
&lt;br /&gt;
= ohMedia =&lt;br /&gt;
&lt;br /&gt;
Networked audio was arguably the first popular application for the networked home. The idea of storing a digital music collection on a central server and playing it on a range of networked audio devices has begun to take hold. Add to this the idea that choosing and controlling that music should be possible from wirelessly networked mobile devices and we have the basic architecture for home audio that was first outlined in the UPnP AV specification.&lt;br /&gt;
&lt;br /&gt;
[Illustration of networked audio home with music being enjoyed in different rooms and being controlled by iPad-like devices]&lt;br /&gt;
&lt;br /&gt;
However, UPnP AV contains serious oversights and flaws that prevent it from delivering an appealing networked music experience throughout the home.&lt;br /&gt;
&lt;br /&gt;
OpenHome addresses this by creating a set of open extensions to UPnP AV that were designed from the ground up from a home-centered perspective. Furthermore, OpenHome goes beyond UPnP AV by developing completely new network standards, such as Songcast, which deliver additional home-centered functionality. More details are avaliable here.&lt;br /&gt;
&lt;br /&gt;
= ohDownload =&lt;br /&gt;
&lt;br /&gt;
OpenHome maintains that open standards are best developed in parallel with real-world implementations of those standards. This ensures that they are both fit for use and immediately available for use.&lt;br /&gt;
&lt;br /&gt;
[Possible illustration of person in ivory tower dreaming of ridiculous fantastical car, and person on the ground dreaming of really good car]&lt;br /&gt;
&lt;br /&gt;
In pursuit of this principle, OpenHome publishes an ever-growing suite of high quality, open software that is actively maintained and already proven in successful commercial products.&lt;br /&gt;
&lt;br /&gt;
This includes:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openhome.org/wiki/OhNet ohNet], the OpenHome networking stack, which facilitates the creation of service-oriented, SOAP-based networking software with inherent UPnP support.&lt;br /&gt;
&lt;br /&gt;
* ohSongcast, which implements OpenHome standards for one-to-many transmission of audio around a home network&lt;br /&gt;
&lt;br /&gt;
* ohNetworkMonitor, which provides facilities for troubleshooting home networking problems&lt;br /&gt;
&lt;br /&gt;
OpenHome software may be downloaded [http://www.openhome.org/wiki/Oh:Downloads here].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Oh:Overview</id>
		<title>Oh:Overview</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Oh:Overview"/>
				<updated>2011-12-15T14:37:50Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohOs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The adoption of broadband internet and the proliferation of wifi-connected devices such as smartphones, web tablets, and netbooks has resulted in the computer network becoming a standard feature of the modern home. But there are a number of ways in which the modern family is yet to realize the full benefit of this home networking revolution.&lt;br /&gt;
&lt;br /&gt;
OpenHome is an independent body committed to redressing this through the design, implementation, and promotion of open standards. It stimulates innovation by transforming the home network into a rich environment for applications that fit with the way families live.&lt;br /&gt;
&lt;br /&gt;
= [[OhOs|ohOs]] =&lt;br /&gt;
&lt;br /&gt;
Users of personal computers and portable computing devices are familiar with the process of installing applications according to their own personal tastes or needs. But there are a number of applications that do not fit neatly into this pattern of deployment and use.&lt;br /&gt;
&lt;br /&gt;
The OpenHome Operating System, [[OhOs|ohOs]], fills this gap by providing a place to deploy software that is for use not only by a single individual but by all family members. And in doing so [[OhOs|ohOs]] opens the way for applications that:&lt;br /&gt;
&lt;br /&gt;
* Allow the family to access and control a wide range of domestic appliances, such as lights, media players, and security cameras, organized from the perspective of the home as a whole.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone controlling lights using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Allow the family to view, and maintain structured information that is most meaningful in the context of the home, such as shared calendars, family address books, and photo albums.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone putting car servicing appointment into a family calendar using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Provide opportunities for creativity and fun for the family as a whole. &lt;br /&gt;
&lt;br /&gt;
[Illustration of family members each with their own iPad or iPhone jointly doing a crossword?]&lt;br /&gt;
&lt;br /&gt;
* Provide rich, user-friendly control over otherwise technically challenging networking facilities, such as parental control over internet access.&lt;br /&gt;
&lt;br /&gt;
[Illustration of a child unable to access the internet from their bedroom at night with happy care-free parents downstairs?]&lt;br /&gt;
&lt;br /&gt;
* Provide a trusted domain for archiving and messaging that keeps all information safely within the boundary of the domestic network.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone storing the code for a safe using an iPhone-like device?]&lt;br /&gt;
&lt;br /&gt;
[http://www.openhome.org/wiki/OhOs ohOs] achieves this by providing lightweight, always-on, networked computing for applications that can be installed from a readily accessible app store and used by any web-browser-enabled device.&lt;br /&gt;
&lt;br /&gt;
= ohMedia =&lt;br /&gt;
&lt;br /&gt;
Networked audio was arguably the first popular application for the networked home. The idea of storing a digital music collection on a central server and playing it on a range of networked audio devices has begun to take hold. Add to this the idea that choosing and controlling that music should be possible from wirelessly networked mobile devices and we have the basic architecture for home audio that was first outlined in the UPnP AV specification.&lt;br /&gt;
&lt;br /&gt;
[Illustration of networked audio home with music being enjoyed in different rooms and being controlled by iPad-like devices]&lt;br /&gt;
&lt;br /&gt;
However, UPnP AV contains serious oversights and flaws that prevent it from delivering an appealing networked music experience throughout the home.&lt;br /&gt;
&lt;br /&gt;
OpenHome addresses this by creating a set of open extensions to UPnP AV that were designed from the ground up from a home-centered perspective. Furthermore, OpenHome goes beyond UPnP AV by developing completely new network standards, such as Songcast, which deliver additional home-centered functionality. More details are avaliable here.&lt;br /&gt;
&lt;br /&gt;
= ohDownload =&lt;br /&gt;
&lt;br /&gt;
OpenHome maintains that open standards are best developed in parallel with real-world implementations of those standards. This ensures that they are both fit for use and immediately available for use.&lt;br /&gt;
&lt;br /&gt;
[Possible illustration of person in ivory tower dreaming of ridiculous fantastical car, and person on the ground dreaming of really good car]&lt;br /&gt;
&lt;br /&gt;
In pursuit of this principle, OpenHome publishes an ever-growing suite of high quality, open software that is actively maintained and already proven in successful commercial products.&lt;br /&gt;
&lt;br /&gt;
This includes:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openhome.org/wiki/OhNet ohNet], the OpenHome networking stack, which facilitates the creation of service-oriented, SOAP-based networking software with inherent UPnP support.&lt;br /&gt;
&lt;br /&gt;
* ohSongcast, which implements OpenHome standards for one-to-many transmission of audio around a home network&lt;br /&gt;
&lt;br /&gt;
* ohNetworkMonitor, which provides facilities for troubleshooting home networking problems&lt;br /&gt;
&lt;br /&gt;
OpenHome software may be downloaded [http://www.openhome.org/wiki/Oh:Downloads here].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Oh:Overview</id>
		<title>Oh:Overview</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Oh:Overview"/>
				<updated>2011-12-15T14:36:57Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* ohOs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The adoption of broadband internet and the proliferation of wifi-connected devices such as smartphones, web tablets, and netbooks has resulted in the computer network becoming a standard feature of the modern home. But there are a number of ways in which the modern family is yet to realize the full benefit of this home networking revolution.&lt;br /&gt;
&lt;br /&gt;
OpenHome is an independent body committed to redressing this through the design, implementation, and promotion of open standards. It stimulates innovation by transforming the home network into a rich environment for applications that fit with the way families live.&lt;br /&gt;
&lt;br /&gt;
= ohOs =&lt;br /&gt;
&lt;br /&gt;
Users of personal computers and portable computing devices are familiar with the process of installing applications according to their own personal tastes or needs. But there are a number of applications that do not fit neatly into this pattern of deployment and use.&lt;br /&gt;
&lt;br /&gt;
The OpenHome Operating System, [[OhOs|ohOs]], fills this gap by providing a place to deploy software that is for use not only by a single individual but by all family members. And in doing so [[OhOs|ohOs]] opens the way for applications that:&lt;br /&gt;
&lt;br /&gt;
* Allow the family to access and control a wide range of domestic appliances, such as lights, media players, and security cameras, organized from the perspective of the home as a whole.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone controlling lights using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Allow the family to view, and maintain structured information that is most meaningful in the context of the home, such as shared calendars, family address books, and photo albums.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone putting car servicing appointment into a family calendar using an iPad-like device]&lt;br /&gt;
&lt;br /&gt;
* Provide opportunities for creativity and fun for the family as a whole. &lt;br /&gt;
&lt;br /&gt;
[Illustration of family members each with their own iPad or iPhone jointly doing a crossword?]&lt;br /&gt;
&lt;br /&gt;
* Provide rich, user-friendly control over otherwise technically challenging networking facilities, such as parental control over internet access.&lt;br /&gt;
&lt;br /&gt;
[Illustration of a child unable to access the internet from their bedroom at night with happy care-free parents downstairs?]&lt;br /&gt;
&lt;br /&gt;
* Provide a trusted domain for archiving and messaging that keeps all information safely within the boundary of the domestic network.&lt;br /&gt;
&lt;br /&gt;
[Illustration of someone storing the code for a safe using an iPhone-like device?]&lt;br /&gt;
&lt;br /&gt;
[http://www.openhome.org/wiki/OhOs ohOs] achieves this by providing lightweight, always-on, networked computing for applications that can be installed from a readily accessible app store and used by any web-browser-enabled device.&lt;br /&gt;
&lt;br /&gt;
= ohMedia =&lt;br /&gt;
&lt;br /&gt;
Networked audio was arguably the first popular application for the networked home. The idea of storing a digital music collection on a central server and playing it on a range of networked audio devices has begun to take hold. Add to this the idea that choosing and controlling that music should be possible from wirelessly networked mobile devices and we have the basic architecture for home audio that was first outlined in the UPnP AV specification.&lt;br /&gt;
&lt;br /&gt;
[Illustration of networked audio home with music being enjoyed in different rooms and being controlled by iPad-like devices]&lt;br /&gt;
&lt;br /&gt;
However, UPnP AV contains serious oversights and flaws that prevent it from delivering an appealing networked music experience throughout the home.&lt;br /&gt;
&lt;br /&gt;
OpenHome addresses this by creating a set of open extensions to UPnP AV that were designed from the ground up from a home-centered perspective. Furthermore, OpenHome goes beyond UPnP AV by developing completely new network standards, such as Songcast, which deliver additional home-centered functionality. More details are avaliable here.&lt;br /&gt;
&lt;br /&gt;
= ohDownload =&lt;br /&gt;
&lt;br /&gt;
OpenHome maintains that open standards are best developed in parallel with real-world implementations of those standards. This ensures that they are both fit for use and immediately available for use.&lt;br /&gt;
&lt;br /&gt;
[Possible illustration of person in ivory tower dreaming of ridiculous fantastical car, and person on the ground dreaming of really good car]&lt;br /&gt;
&lt;br /&gt;
In pursuit of this principle, OpenHome publishes an ever-growing suite of high quality, open software that is actively maintained and already proven in successful commercial products.&lt;br /&gt;
&lt;br /&gt;
This includes:&lt;br /&gt;
&lt;br /&gt;
* [http://www.openhome.org/wiki/OhNet ohNet], the OpenHome networking stack, which facilitates the creation of service-oriented, SOAP-based networking software with inherent UPnP support.&lt;br /&gt;
&lt;br /&gt;
* ohSongcast, which implements OpenHome standards for one-to-many transmission of audio around a home network&lt;br /&gt;
&lt;br /&gt;
* ohNetworkMonitor, which provides facilities for troubleshooting home networking problems&lt;br /&gt;
&lt;br /&gt;
OpenHome software may be downloaded [http://www.openhome.org/wiki/Oh:Downloads here].&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:VolumeService</id>
		<title>Av:Developer:VolumeService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:VolumeService"/>
				<updated>2011-05-05T14:13:56Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Volume Service Description (XML) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architecture Overview =&lt;br /&gt;
The Volume Service provides a means of controlling various settings which affect the product's volume (signal amplitude) measured at the output channels. A product may have one or more output channels. Balance or Fade settings may result in different volumes at each output. In the Mute state, all output channels are reduced to zero volume. &lt;br /&gt;
&lt;br /&gt;
==Volume==&lt;br /&gt;
Volume is an adjustable setting that controls the loudness of the audio at the output channels of the product. Volume can be set to an absolute value or incremented/decremented in single steps. The maximum Volume setting is defined by the current value of '''VolumeLimit'''. The minimum Volume setting is zero. If an attempt is made to set the Volume above VolumeLimit, the Volume will be set to the '''VolumLimit'''. If an attempt is made to set the Volume above '''VolumeMax''', an error will  be reported.&lt;br /&gt;
&lt;br /&gt;
== Volume Limit ==&lt;br /&gt;
VolumeLimit specifies the upper limit of the Volume. Any attempt to set Volume above the VolumeLimit will reset Volume to the value of VolumeLimit. If VolumeLimit is changed, Volume is checked and automatically reduced if necessary. The maximum VolumeLimit setting is defined by the '''VolumeMax''' Characteristic.&lt;br /&gt;
&lt;br /&gt;
==Balance==&lt;br /&gt;
Balance is an adjustable setting that specifies the '''bias''' in volume between the '''left and right''' output channels of the product. Balance can be set to an absolute value or incremented/decremented in single steps. The maximum Balance setting is defined by the '''BalanceMax''' Characteristic. The minimum Balance setting is defined by ('''-BalanceMax''') .&lt;br /&gt;
&lt;br /&gt;
==Fade==&lt;br /&gt;
Fade is an adjustable setting that specifies the '''bias''' in volume between the '''front and rear''' output channels of the products. Fade can be set to an absolute value or incremented/decremented in single steps. The maximum Fade setting is defined by the '''FadeMax''' Characteristic. The minimum Fade setting is defined by ('''-FadeMax''') .&lt;br /&gt;
&lt;br /&gt;
==Mute==&lt;br /&gt;
Mute is an adjustable state that determines if the output channels of the product are muted or not. When muted, all output channels of the product are silent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Characterstics==&lt;br /&gt;
Each product has '''six''' read only values that define its volume Characteristics. &lt;br /&gt;
====VolumeMax====&lt;br /&gt;
VolumeMax defines the absolute maximum Volume setting.&lt;br /&gt;
&lt;br /&gt;
====VolumeUnity====&lt;br /&gt;
VolumeUnity defines the value of Volume that will result in unity system gain (ie ''output amplitude'' = ''input amplitude'').&lt;br /&gt;
&lt;br /&gt;
====VolumeSteps====&lt;br /&gt;
VolumeSteps defines the number of step increments required to increase the Volume from zero to VolumeMax.&lt;br /&gt;
====VolumeMilliDbPerStep====&lt;br /&gt;
VolumeMilliDbPerStep defines the size of each volume step in '''binary milli decibels''' (bmdB). [''1024bmdB = 1dB'']&lt;br /&gt;
&lt;br /&gt;
====BalanceMax====&lt;br /&gt;
BalanceMax defines the maximum Balance setting. The minimum Balance setting is (-BalanceMax)&lt;br /&gt;
====FadeMax====&lt;br /&gt;
FadeMax defines the maximum Fade setting. The minimum Fade setting is (-FadeMax)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Actions=&lt;br /&gt;
&lt;br /&gt;
=== Volume ===&lt;br /&gt;
The Volume action reports the current Volume setting.&lt;br /&gt;
&lt;br /&gt;
=== SetVolume===&lt;br /&gt;
The SetVolume action provides a means of setting the Volume to an absolute value.&lt;br /&gt;
&lt;br /&gt;
=== Volume Inc===&lt;br /&gt;
The VolumeInc action provides a means of increasing the Volume by 1.&lt;br /&gt;
=== Volume Dec ===&lt;br /&gt;
The VolumeDec action provides a means of decreasing the Volume by 1.&lt;br /&gt;
=== VolumeLimit ===&lt;br /&gt;
The VolumeLimit action reports the current VolumeLimit setting.&lt;br /&gt;
=== Balance ===&lt;br /&gt;
The Balance action reports the current Balance setting.&lt;br /&gt;
=== SetBalance ===&lt;br /&gt;
The SetBalance action provides a means of setting the Balance to a specific value.&lt;br /&gt;
&lt;br /&gt;
=== BalanceInc===&lt;br /&gt;
The BalanceInc action provides a means of increasing the Balance by 1.&lt;br /&gt;
=== BalanceDec ===&lt;br /&gt;
The BalanceDec action provides a means of decreasing the Balance by 1.&lt;br /&gt;
=== Fade ===&lt;br /&gt;
The Fade action reports the current Fade setting of the product.&lt;br /&gt;
==== SetFade ====&lt;br /&gt;
The SetFade action provides a means of setting the Fade to a specific value.&lt;br /&gt;
=== FadeInc===&lt;br /&gt;
The FadeInc action provides a means of increasing the Fade by 1.&lt;br /&gt;
&lt;br /&gt;
=== FadeDec ===&lt;br /&gt;
The FadeDec action provides a means of decreasing the Fade by 1.&lt;br /&gt;
=== Mute ===&lt;br /&gt;
The Mute action reports the current Mute state of the product.&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
The SetMute action provides a means of setting the Mute state.&lt;br /&gt;
&lt;br /&gt;
=== Characteristics ===&lt;br /&gt;
The Characteristics action returns all '''six''' characteristic values of the product.&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    : Volume&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Volume Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
   &amp;lt;specVersion&amp;gt;&lt;br /&gt;
      &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
      &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
   &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
   &amp;lt;actionList&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;Characteristics&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;VolumeMax&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;VolumeMax&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;VolumeUnity&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;VolumeUnity&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;VolumeSteps&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;VolumeSteps&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;VolumeMilliDbPerStep&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;VolumeMilliDbPerStep&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;BalanceMax&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;BalanceMax&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;FadeMax&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;FadeMax&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
         &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;SetVolume&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Volume&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
         &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;VolumeInc&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;VolumeDec&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;Volume&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Volume&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
         &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;SetBalance&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Balance&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
         &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;BalanceInc&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;BalanceDec&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;Balance&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Balance&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
         &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;SetFade&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Fade&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
         &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;FadeInc&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;FadeDec&amp;lt;/name&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;Fade&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Fade&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
         &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;SetMute&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Mute&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
         &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;Mute&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Mute&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
         &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
      &amp;lt;action&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;VolumeLimit&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;VolumeLimit&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
         &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
      &amp;lt;/action&amp;gt;&lt;br /&gt;
   &amp;lt;/actionList&amp;gt;&lt;br /&gt;
   &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
      &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;Volume&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
      &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
      &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;Mute&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
      &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
      &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;Balance&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;dataType&amp;gt;i4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
      &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
      &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;Fade&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;dataType&amp;gt;i4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
      &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
      &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;VolumeLimit&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
      &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
      &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;VolumeMax&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
      &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
      &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;VolumeUnity&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
      &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
      &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;VolumeSteps&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
      &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
      &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;VolumeMilliDbPerStep&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;BalanceMax&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
      &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
      &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
         &amp;lt;name&amp;gt;FadeMax&amp;lt;/name&amp;gt;&lt;br /&gt;
         &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
      &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
   &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:TimeService</id>
		<title>Av:Developer:TimeService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:TimeService"/>
				<updated>2011-05-05T14:13:35Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Time Service Description (XML) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Time service reports the duration of the currently playing track and the number of seconds so far played.&lt;br /&gt;
&lt;br /&gt;
This service is intentionally separated from the Info service. When a track is being played, this service delivers an event every second, which can overwhelm some primitive control points. The Time service is kept separate from the Info service so that control points can decide to subscribe to it independently.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
==Time==&lt;br /&gt;
This reports TrackCount, which increments each time a new track is played; Duration, which is the duration of the current track in seconds; and Seconds, which is the number of seconds so far played.&lt;br /&gt;
&lt;br /&gt;
TrackCount corresponds with TrackCount reported in the Info Service, but bears no relation to a Track Id or Preset Id reported from the [[Developer:Davaar:PlaylistService|Playlist Service]] or [[Developer:Davaar:RadioService|Radio Service]].&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    : Time&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Time Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;specVersion&amp;gt;&lt;br /&gt;
        &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
        &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
    &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;actionList&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Time&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TrackCount&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;TrackCount&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Duration&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Duration&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Seconds&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Seconds&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/actionList&amp;gt;&lt;br /&gt;
    &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;TrackCount&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Duration&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Seconds&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:SenderService</id>
		<title>Av:Developer:SenderService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:SenderService"/>
				<updated>2011-05-05T14:13:16Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Sender Service Description (XML) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The Sender service indicates the presence of an OpenHome Av sender and provides information concerning that sender.&lt;br /&gt;
&lt;br /&gt;
An OpenHome Av sender broadcasts music on a network in a way that is playable by an OpenHome Av [[Developer:ReceiverService|receiver]].&lt;br /&gt;
&lt;br /&gt;
OpenHome senders should be discovered independently of the standard algorithm for discovering OpenHome products and sources. An independent search should be made for devices bearing the Sender service.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Attributes ==&lt;br /&gt;
Reports a space separated list of attributes that identify additional functionality that can be found on the same device as this Sender.&lt;br /&gt;
&lt;br /&gt;
Currently defined attributes are:&lt;br /&gt;
&lt;br /&gt;
* Info - this device reports on the current media using the Info service&lt;br /&gt;
* Time - this device reports on the current media using the Time service&lt;br /&gt;
&lt;br /&gt;
== Audio == &lt;br /&gt;
Reports whether audio is currently present on this sender.&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
Provides a representation of this audio item in DIDL-Lite format.&lt;br /&gt;
&lt;br /&gt;
== PresentationUrl ==&lt;br /&gt;
Reports the Url of a presentation page for further information concerning the sender, or for controlling the sender in some application-specific way.&lt;br /&gt;
&lt;br /&gt;
If the sender has no presentation page, the PresentationUrl should be empty.&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
Reports the status of the sender (normally only for debugging purposes):&lt;br /&gt;
&lt;br /&gt;
* Sending - currently sending audio over the network&lt;br /&gt;
* Ready - ready to send audio but no listeners&lt;br /&gt;
* Blocked - audio from another sender detected on the same channel (mis-configuration)&lt;br /&gt;
* Inactive - no audio source currently assigned to this sender&lt;br /&gt;
* Disabled - sender disabled by user configuration&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    : Sender&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sender Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;specVersion&amp;gt;&lt;br /&gt;
        &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
        &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
    &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;actionList&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PresentationUrl&amp;lt;/name&amp;gt;&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;PresentationUrl&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Audio&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Audio&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Status&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Status&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;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;/actionList&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;PresentationUrl&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Audio&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Status&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
            &amp;lt;allowedValueList&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Enabled&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Disabled&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Blocked&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
            &amp;lt;/allowedValueList&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;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;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ReceiverService</id>
		<title>Av:Developer:ReceiverService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ReceiverService"/>
				<updated>2011-05-05T14:12:59Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Receiver Service Description (XML) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The Receiver service provides the means for controlling a Receiver source. If a device's [[Developer:ProductService|Product service]] reports a source of type 'Receiver', then that device is guaranteed to bear the Receiver service.&lt;br /&gt;
&lt;br /&gt;
A receiver plays audio broadcast from a [[Developer:SenderService|sender]].&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Sender ==&lt;br /&gt;
Report the Uri and Metadata of the sender this receiver is currently listening to.&lt;br /&gt;
&lt;br /&gt;
==SetSender==&lt;br /&gt;
Set the Uri and Metadata of the sender to listen to.&lt;br /&gt;
&lt;br /&gt;
The Metadata must have originated from a device bearing the [[Developer:SenderService|Sender service]].&lt;br /&gt;
&lt;br /&gt;
The Uri must be the result of applying this receiver's ProtocolInfo to this Metadata.&lt;br /&gt;
&lt;br /&gt;
==ProtocolInfo==&lt;br /&gt;
Report the receiver's protocol info.&lt;br /&gt;
&lt;br /&gt;
==TransportState==&lt;br /&gt;
&lt;br /&gt;
Report the current transport state, which can be: 'Playing', 'Paused', 'Stopped', or 'Buffering'.&lt;br /&gt;
&lt;br /&gt;
==Play==&lt;br /&gt;
Play audio from the current sender&lt;br /&gt;
&lt;br /&gt;
==Stop==&lt;br /&gt;
Stop playing audio from the current sender&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    : Receiver&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Receiver Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;specVersion&amp;gt;&lt;br /&gt;
        &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
        &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
    &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;actionList&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Play&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Stop&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SetSender&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Uri&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Sender&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Uri&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ProtocolInfo&amp;lt;/name&amp;gt;&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;ProtocolInfo&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;TransportState&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;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;TransportState&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/actionList&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;TransportState&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
            &amp;lt;allowedValueList&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Stopped&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Playing&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Waiting&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Buffering&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
            &amp;lt;/allowedValueList&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ProtocolInfo&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;        &lt;br /&gt;
    &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:RadioService</id>
		<title>Av:Developer:RadioService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:RadioService"/>
				<updated>2011-05-05T14:12:36Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Radio Service Description (XML) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Radio service provides the means for controlling a Radio source. If a product's [[Developer:ProductService|Product Service]] reports a source of type 'Radio', then the device that bears that [[Developer:ProductService|Product Service]] is guaranteed to also bear the Radio service.&lt;br /&gt;
&lt;br /&gt;
The heart of the Radio service is the '''SetChannel''' action. Call '''SetChannel''' with a particular Uri and Metadata, then call '''Play''' and the media at the given Uri is played. If the media is an internet radio stream, it will play forever. If it is of finite length, it will play to the end and then stop.&lt;br /&gt;
&lt;br /&gt;
Call the '''Channel''' action to report the Uri and Metadata of the current Channel.&lt;br /&gt;
&lt;br /&gt;
The Radio Source also stores a list of channel presets. These can be presented to the user as a list of numbered channels that can easily be selected and played.&lt;br /&gt;
&lt;br /&gt;
This array of channel presets is accessed using an id array mechanism similar to that used in the [[Developer:PlaylistService|Playlist Service]]. The only difference is that the Radio service's id array is a constant length and may contain entries that are zero, which represent empty presets.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
==Channel==&lt;br /&gt;
Report the Uri and Metadata of the current Channel.&lt;br /&gt;
&lt;br /&gt;
==SetChannel==&lt;br /&gt;
Set the Uri and Metadata of the current Channel.&lt;br /&gt;
&lt;br /&gt;
==IdArray==&lt;br /&gt;
Report the current id array. The id array contains 100 presets, but this may change (see ChannelsMax).&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered, constant length, array of ids. The first element contains the id for channel preset 1, the second element contains the id for channel Preset 2, etc. If an element is set to zero, then the corresponding channel preset is empty. &lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array has changed since it was last read (see IdArrayChanged).&lt;br /&gt;
&lt;br /&gt;
==IdArrayChanged==&lt;br /&gt;
Check to see if the id array has changed since gathering the specified IdArrayToken.&lt;br /&gt;
This Token must have been previously collected from the IdArray 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;
==ChannelsMax==&lt;br /&gt;
Report the maximum number of entries in the channel preset id array.&lt;br /&gt;
&lt;br /&gt;
==SetId==&lt;br /&gt;
The the current Channel using the channel preset represented by the given Id, and using the provided Uri.&lt;br /&gt;
&lt;br /&gt;
It is usual for a Control Point to inspect the res elements of the Channel Metadata and select the appropriate Uri by matching to the renderer's ProtocolInfo.&lt;br /&gt;
&lt;br /&gt;
==Id==&lt;br /&gt;
Report the Id of the current Channel if it is in the Channel Preset list. If the current Channel is not a channel preset, the Id reported is zero.&lt;br /&gt;
&lt;br /&gt;
==ProtocolInfo==&lt;br /&gt;
Report the Radio Source protocol info.&lt;br /&gt;
&lt;br /&gt;
==Read==&lt;br /&gt;
Given a channel preset Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
==ReadList==&lt;br /&gt;
Given a space separated list of channel preset Ids, report their associated Metadata.&lt;br /&gt;
&lt;br /&gt;
==TransportState==&lt;br /&gt;
&lt;br /&gt;
Report the current transport state, which can be: 'Playing', 'Paused', 'Stopped', or 'Buffering'.&lt;br /&gt;
&lt;br /&gt;
==Play==&lt;br /&gt;
Play the current channel&lt;br /&gt;
&lt;br /&gt;
==Pause==&lt;br /&gt;
Pause the current channel. This will be converted to Stop if the channel cannot be paused e.g. internet radio.&lt;br /&gt;
&lt;br /&gt;
==Stop==&lt;br /&gt;
Stop the current Channel&lt;br /&gt;
&lt;br /&gt;
==SeekSecondsAbsolute==&lt;br /&gt;
Seek to an absolute second within the current media. This is only available if the current media has a finite length.&lt;br /&gt;
&lt;br /&gt;
==SeekSecondsRelative==&lt;br /&gt;
Seek to a relative second within the current media.  This is only available if the current media has a finite length.&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    : Radio&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Radio Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;scpd xmlns=&amp;quot;urn:schemas-upnp-org:service-1-0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;specVersion&amp;gt;&lt;br /&gt;
        &amp;lt;major&amp;gt;1&amp;lt;/major&amp;gt;&lt;br /&gt;
        &amp;lt;minor&amp;gt;0&amp;lt;/minor&amp;gt;&lt;br /&gt;
    &amp;lt;/specVersion&amp;gt;&lt;br /&gt;
    &amp;lt;actionList&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Play&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Pause&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Stop&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SeekSecondAbsolute&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;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;Absolute&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SeekSecondRelative&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;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;Relative&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Channel&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Uri&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SetChannel&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Uri&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;TransportState&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;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;TransportState&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Id&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SetId&amp;lt;/name&amp;gt;&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;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Uri&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Read&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Id&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ReadList&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;IdList&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;IdList&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;ChannelList&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;ChannelList&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;IdArray&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Token&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;IdArrayToken&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Array&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;IdArray&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;IdArrayChanged&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Token&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;IdArrayToken&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;IdArrayChanged&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ChannelsMax&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;ChannelsMax&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ProtocolInfo&amp;lt;/name&amp;gt;&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;ProtocolInfo&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/actionList&amp;gt;&lt;br /&gt;
    &lt;br /&gt;
    &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;TransportState&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
            &amp;lt;allowedValueList&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Stopped&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Playing&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Paused&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Buffering&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
            &amp;lt;/allowedValueList&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;IdArray&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;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;ChannelsMax&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ProtocolInfo&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;        &lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Relative&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;i4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Absolute&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;IdArrayToken&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;IdArrayChanged&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;IdList&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ChannelList&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</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>2011-05-05T14:12:15Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Product Service Description (XML) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The Product service contains basic information concerning a single product. It contains information about what kind of device it is: the model, manufacturer, its name, its room, and details concerning each source within the product. Other basic functionality such as control of the product's standby state are also included.&lt;br /&gt;
&lt;br /&gt;
It should be possible for a control point to create a complete map of the home by subscribing to the Product service of every device.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Every product has one or more attributes indicating additional features offered by that product beyond those provided by its sources&lt;br /&gt;
&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
There are '''four''' Manufacturer parameters; '''Name''', '''Info''', '''Url''' and '''ImageUri'''. They are all text strings.&lt;br /&gt;
&lt;br /&gt;
==== Name ====&lt;br /&gt;
Name contains the Manufacturer name. Name is read only.&lt;br /&gt;
&lt;br /&gt;
==== Info ====&lt;br /&gt;
Info contains more Manufacturer information. Info is read only.&lt;br /&gt;
&lt;br /&gt;
==== Url ====&lt;br /&gt;
Url contains the Manufacturer website address. Url is read only.&lt;br /&gt;
&lt;br /&gt;
==== ImageUri ====&lt;br /&gt;
ImageUri contains a link to the Manufacturer image (i.e. logo). ImageUri is read only.&lt;br /&gt;
&lt;br /&gt;
=== Model ===&lt;br /&gt;
&lt;br /&gt;
There are '''four''' Model parameters; '''Name''', '''Info''', '''Url''' and '''ImageUri'''.&lt;br /&gt;
&lt;br /&gt;
==== Name ====&lt;br /&gt;
Name contains the Model name. Name is read only.&lt;br /&gt;
==== Info ====&lt;br /&gt;
Info contains more Model information. Info is read only. &lt;br /&gt;
==== Url ====&lt;br /&gt;
Url contains the Model website address. Url is read only.&lt;br /&gt;
==== ImageUri ====&lt;br /&gt;
ImageUri contains a link to the Model image (i.e. icon). ImageUri is read only.&lt;br /&gt;
&lt;br /&gt;
=== Product ===&lt;br /&gt;
There are '''five''' Product parameters; '''Room''', '''Name''', '''Info''', '''Url''' and '''ImageUri'''. They are all text strings.&lt;br /&gt;
&lt;br /&gt;
==== Room ====&lt;br /&gt;
This is the name of the room where the Product is located. Room is used to group the Product with other Products in the same physical room. The Upnp '''''Friendly Name''''' is derived by combining Room and Name in the format {'''''Room&amp;amp;nbsp;: Name'''''}. Products which are '''''Linked''''' always share the same Room name. Room is set to '''''Main Room''''' by default.&lt;br /&gt;
&lt;br /&gt;
==== Name ====&lt;br /&gt;
This is the Product name. The Upnp '''''Friendly Name''''' is derived by combining Room and Name in the format {'''''Room&amp;amp;nbsp;: Name'''''}. By default the Name is the same as the Model. &lt;br /&gt;
&lt;br /&gt;
==== Info ====&lt;br /&gt;
Info contains more Product information. Info is read only.&lt;br /&gt;
&lt;br /&gt;
==== Url ====&lt;br /&gt;
Url contains the Product website address (i.e. UPnP presentation page). Url is read only.&lt;br /&gt;
&lt;br /&gt;
==== ImageUri ====&lt;br /&gt;
ImageUri contains a link to the Product image (i.e. icon). ImageUri is read only.&lt;br /&gt;
&lt;br /&gt;
== Standby Control==&lt;br /&gt;
&lt;br /&gt;
=== Standby===&lt;br /&gt;
This is the Standby state of the physical product. Standby can be changed using the SetStandby function. Products which are '''''Linked''''' always share the same Standby state. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source Control ==&lt;br /&gt;
&lt;br /&gt;
=== Source List===&lt;br /&gt;
The Product service maintains a list of all sources within the Product. The size of this list is fixed for each Product and reported by the SourceCount function. Each source can then be referenced by its unique source index* in the list. Only one source, and thus one index, can be active at any given time. When a new source is selected the previous source is automatically deactivated before activating the new source. [* source index is zero based, ie 0,1,2,3,4,5..n, where n=listsize-1]&lt;br /&gt;
&lt;br /&gt;
=== Source Index ===&lt;br /&gt;
&lt;br /&gt;
The current (ie currently active) source can be changed by source index or source name. The function SetSourceIndex is used to change the current source by index. If the index is out of range an error will be reported. SetSourceIndexByName is used to change to the source whose name matches that specified. If a source of the specified name does not exist, the source will not change and no error will be reported.&lt;br /&gt;
&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
&lt;br /&gt;
SourceCount returns the number of sources that exist in the Product (ie the source list size). SourceCount is read only.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Source Specific Parameters ===&lt;br /&gt;
Every source has four fundamental parameters, '''SourceSystemName''', '''SourceName''', '''SourceVisible''' and '''SourceType'''.&lt;br /&gt;
&lt;br /&gt;
==== SourceSystemName ====&lt;br /&gt;
&lt;br /&gt;
SourceSystemName is a unique name string used to identify each source. SourceSystemName is read only. It can only be read via the '''Source''' action.&lt;br /&gt;
&lt;br /&gt;
==== SourceName ====&lt;br /&gt;
&lt;br /&gt;
SourceName is a unique name string assigned to each source. In the default state, for a given source index, SourceName matches SourceSystemName. It can be read via the '''Source''' action, or the '''SourceXml''' action.&lt;br /&gt;
&lt;br /&gt;
==== SourceType ====&lt;br /&gt;
&lt;br /&gt;
SourceType is a unique type string assigned to each source. SourceType is read only. It can be read via the '''Source''' action, or the '''SourceXml''' action.&lt;br /&gt;
&lt;br /&gt;
==== SourceVisible ====&lt;br /&gt;
&lt;br /&gt;
SourceVisible is a unique flag assigned to each source. This flag is used to indicate whether the source is to be displayed (front panel, GUI etc) when browsing through the source list. It can be read via the '''Source''' action, or the '''SourceXml''' action.&lt;br /&gt;
&lt;br /&gt;
Note - ''a source's &amp;quot;visibility&amp;quot; does not affect its ability to be selected/activated via the functions SetSourceIndex and SetCurrentSourceByName.''&lt;br /&gt;
&lt;br /&gt;
= Actions=&lt;br /&gt;
&lt;br /&gt;
== Network Presentation Actions==&lt;br /&gt;
=== Attributes Action ===&lt;br /&gt;
The Attributes action reports a string containing a space separated list of all attributes.&lt;br /&gt;
&lt;br /&gt;
=== Manufacturer Action ===&lt;br /&gt;
The Manufacturer action returns all four Manufacturer parameters.&lt;br /&gt;
&lt;br /&gt;
=== Model Action ===&lt;br /&gt;
The Model action returns all four Model parameters.&lt;br /&gt;
&lt;br /&gt;
=== Product Action ===&lt;br /&gt;
The Product action returns all five Product parameters.&lt;br /&gt;
&lt;br /&gt;
== Standby Actions==&lt;br /&gt;
=== Standby===&lt;br /&gt;
The Standby action reports the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
=== SetStandby===&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
==Source Actions==&lt;br /&gt;
===SourceXml Action===&lt;br /&gt;
The SourceXml action returns a list of all source specific parameters, for every source, in XML format.&lt;br /&gt;
&lt;br /&gt;
===SourceXmlChangeCount Action===&lt;br /&gt;
The SourceXmlChangeCount action returns a count indicating the number of times SourceXml has been updated since power on. This is useful for control points that do not support eventing.&lt;br /&gt;
&lt;br /&gt;
===Source Action===&lt;br /&gt;
The Source action returns all source specific parameters for a given source index.&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    : Product&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Product Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&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;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:InfoService</id>
		<title>Av:Developer:InfoService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:InfoService"/>
				<updated>2011-05-05T14:09:32Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Info Service Description (XML) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The Info service provides information concerning the currently playing media. The information provided is based on the concept of a track, which has a uri and metadata in DIDL-Lite format. Some time after the track changes further information becomes available such as the bit-rate, sample-rate, bit-depth, etc. Optionally a track may contain dynamic textual information (known as metatext) that is updated as the track is played. Metatext is typically used to convey broadcast information from internet radio stations.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
==Counters==&lt;br /&gt;
Counters are used to manage the changing of the Track, Details, and Metatext information.&lt;br /&gt;
&lt;br /&gt;
When a track changes, the Track Count is incremented, the Uri and Metadata are set, the Details Count is set to zero, the Details are defaulted to blank and zero values, the Metatext Count is set to zero, and the Metatext is set to blank.&lt;br /&gt;
&lt;br /&gt;
Subsequent updates to the Details and Metatext are accompanied by increments in their respective Counters.&lt;br /&gt;
&lt;br /&gt;
The Counters action can be used by clients that are unable to partake in UPnP eventing in order to establish changes in the information provided by the Info Service.&lt;br /&gt;
&lt;br /&gt;
==Track==&lt;br /&gt;
Reports current track information concerning the current media:&lt;br /&gt;
*Uri&lt;br /&gt;
*Metadata&lt;br /&gt;
&lt;br /&gt;
==Details==&lt;br /&gt;
Reports details concerning the current media:&lt;br /&gt;
*Duration&lt;br /&gt;
*Bit Rate&lt;br /&gt;
*Bit Depth&lt;br /&gt;
*Sample Rate&lt;br /&gt;
*Lossless&lt;br /&gt;
*Codec Name&lt;br /&gt;
&lt;br /&gt;
==Metatext==&lt;br /&gt;
Reports dynamic textual information concerning the current media.&lt;br /&gt;
&lt;br /&gt;
This currently amounts to broadcast information from internet radio stations, but the same mechanism could be used for other purposes in the future.&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    : Info&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Info Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&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;Counters&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TrackCount&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;TrackCount&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;DetailsCount&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;DetailsCount&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;MetatextCount&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;MetatextCount&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Track&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Uri&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Details&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Duration&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Duration&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;BitRate&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;BitRate&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;BitDepth&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;BitDepth&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;SampleRate&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SampleRate&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Lossless&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Lossless&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;CodecName&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;CodecName&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Metatext&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;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;Metatext&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/actionList&amp;gt;&lt;br /&gt;
    &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;TrackCount&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;DetailsCount&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;MetatextCount&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Duration&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;BitRate&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;BitDepth&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SampleRate&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Lossless&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;CodecName&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Metatext&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
   &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistService</id>
		<title>Av:Developer:PlaylistService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistService"/>
				<updated>2011-05-05T14:09:06Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Playlist Service Description (XML) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the means for controlling a Playlist source. If a device's [[Developer:ProductService|Product service]] reports a source of type 'Playlist', then that device is guaranteed to bear the Playlist service.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides access to a list of tracks, which can be played starting at any point. Unless repeat mode has been engaged, the playlist will play to the end. Shuffle mode causes playback to skip randomly through the playlist. It is possible for Shuffle and Repeat modes to be engaged simultaneously.&lt;br /&gt;
&lt;br /&gt;
Using the Playlist service you can read, insert, and delete entries in the playlist. Each entry in the playlist is given unique id.  This unique id is completely unrelated to the play order of the playlist.&lt;br /&gt;
&lt;br /&gt;
To insert, provide the id you wish to insert 'after' and the associated uri and metadata. The track is inserted into the correct position and the id of the new track is returned.  To insert in the first position in the playlist, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
There are two read actions. One to read a single entry and the other to read a list of entries.&lt;br /&gt;
&lt;br /&gt;
In the first, the uri and metadata of the requested id are returned. This operation can fail if the requested id does not exist in the playlist.&lt;br /&gt;
&lt;br /&gt;
In the second, ReadList, a list of space separated decimal id's is provided and information concerning each of these tracks is returned in xml. ReadList does not fail. Requests for ids that are not in the playlist are silently ignored.&lt;br /&gt;
&lt;br /&gt;
There are two variants of delete allowing the deletion of a single track or the deletion of the entire playlist. The former requires the id of the entry to delete. The latter takes no parameters. Both variants always succeed.&lt;br /&gt;
&lt;br /&gt;
== IdArray ==&lt;br /&gt;
&lt;br /&gt;
The Playlist service has a state variable called IdArray. This IdArray is a [http://en.wikipedia.org/wiki/Base64 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;
For example the IdArray of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x14 0x00 0x00 0x00 0x13&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
indicates a playlist of 3 tracks with the id's of 2, 20, and 19 in that order.&lt;br /&gt;
&lt;br /&gt;
Control point authors are interested in both: &lt;br /&gt;
&lt;br /&gt;
* the order of tracks in the playlist, and&lt;br /&gt;
* the metadata of those tracks&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray via [[Developer:PlaylistService#Events|events]] or [[Developer:PlaylistService#Polling|polling]], you immediately know the 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 playlist 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 DS 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 playlist, the DS will event all subscribers the current IdArray. 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, IdArray, reads the id array directly. This action also returns an IdArrayToken, which should be saved and periodically passed to a second action, IdArrayChanged, which reports whether or not your copy of the IdArray is out of date. If it is, calling IdArray again will ensure you have an up to date version.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== IdArray ==&lt;br /&gt;
Report the current id array.&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;
This action also reports a Token, which can be used to quickly detect if the id array has changed since it was last read (see IdArrayChanged).&lt;br /&gt;
&lt;br /&gt;
== IdArrayChanged ==&lt;br /&gt;
Check to see if the id array has changed since gathering the specified Token.&lt;br /&gt;
This Token must have been previously collected from the IdArray 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;
== TracksMax ==&lt;br /&gt;
Report the maximum number of tracks in the 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.&lt;br /&gt;
&lt;br /&gt;
==Id==&lt;br /&gt;
Report the Id of the current track. If the reported id is zero, the playlist is empty.&lt;br /&gt;
&lt;br /&gt;
==ProtocolInfo==&lt;br /&gt;
Report the Playlist source protocol info.&lt;br /&gt;
&lt;br /&gt;
==Read==&lt;br /&gt;
Given a track Id, report its associated Uri and Metadata.&lt;br /&gt;
&lt;br /&gt;
==ReadList==&lt;br /&gt;
Given a space separated list of track Id's, report their associated Uri and Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&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;Uri&amp;gt;&amp;lt;/Uri&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;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TransportState ==&lt;br /&gt;
&lt;br /&gt;
Report the current transport state, which can be: 'Playing', 'Paused', 'Stopped', or 'Buffering'.&lt;br /&gt;
&lt;br /&gt;
== Play ==&lt;br /&gt;
Begin playback from the current position.&lt;br /&gt;
&lt;br /&gt;
== Pause ==&lt;br /&gt;
Pause the current track. This will be converted to Stop if the track cannot be paused e.g. internet radio.&lt;br /&gt;
&lt;br /&gt;
== Stop ==&lt;br /&gt;
Stop playback and move the current position to the start of the current track.&lt;br /&gt;
&lt;br /&gt;
== Next ==&lt;br /&gt;
Move the current position to the start of the next track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== Previous ==&lt;br /&gt;
Move the current position to the start of the next track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== SeekId ==&lt;br /&gt;
Move the current position to the start of the track represented by the given Id.&lt;br /&gt;
&lt;br /&gt;
== SeekIndex ==&lt;br /&gt;
Move the current position to the start of the track with the given Index into the playlist.&lt;br /&gt;
&lt;br /&gt;
This action should only be used by primitive control points that do not have a rich way of representing the playlist to the user.&lt;br /&gt;
&lt;br /&gt;
== SeekSecondAbsolute ==&lt;br /&gt;
Seek to an absolute second within the current track. This is only available if the current track has a finite length.&lt;br /&gt;
&lt;br /&gt;
== SeekSecondRelative ==&lt;br /&gt;
Seek to a relative second within the current track.  This is only available if the current track has a finite length.&lt;br /&gt;
&lt;br /&gt;
== Repeat ==&lt;br /&gt;
Report the state of repeat mode.&lt;br /&gt;
&lt;br /&gt;
== SetRepeat ==&lt;br /&gt;
Set the state of repeat mode.&lt;br /&gt;
&lt;br /&gt;
== Shuffle ==&lt;br /&gt;
Report the state of shuffle mode.&lt;br /&gt;
&lt;br /&gt;
== SetShuffle ==&lt;br /&gt;
Set the state of shuffle mode.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
Delete from the playlist the track with the speciofied Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
Clear the 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    : Playlist&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Playlist Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&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;
&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;Play&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Pause&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Stop&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Next&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Previous&amp;lt;/name&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SetRepeat&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;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;Repeat&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Repeat&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;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;Repeat&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SetShuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;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;Shuffle&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Shuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;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;Shuffle&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SeekSecondAbsolute&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;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;Absolute&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SeekSecondRelative&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;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;Relative&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SeekId&amp;lt;/name&amp;gt;&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;SeekIndex&amp;lt;/name&amp;gt;&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;Index&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;TransportState&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;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;TransportState&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Id&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Read&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Id&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Uri&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ReadList&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;IdList&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;IdList&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TrackList&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;TrackList&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Insert&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;AfterId&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Id&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Uri&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;NewId&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Id&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;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;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;/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;IdArray&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Token&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;IdArrayToken&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Array&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;IdArray&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;IdArrayChanged&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Token&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;in&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;IdArrayToken&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Value&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;IdArrayChanged&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ProtocolInfo&amp;lt;/name&amp;gt;&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;ProtocolInfo&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/actionList&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;TransportState&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
            &amp;lt;allowedValueList&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Playing&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Paused&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Stopped&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
                &amp;lt;allowedValue&amp;gt;Buffering&amp;lt;/allowedValue&amp;gt;&lt;br /&gt;
            &amp;lt;/allowedValueList&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Repeat&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Shuffle&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Id&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;IdArray&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;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;TracksMax&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;ProtocolInfo&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Index&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;Relative&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;i4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Absolute&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;IdList&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;TrackList&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;IdArrayToken&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;no&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;IdArrayChanged&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
    &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:InfoService</id>
		<title>Av:Developer:InfoService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:InfoService"/>
				<updated>2011-05-05T14:07:56Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Info Service Description (XML) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The Info service provides information concerning the currently playing media. The information provided is based on the concept of a track, which has a uri and metadata in DIDL-Lite format. Some time after the track changes further information becomes available such as the bit-rate, sample-rate, bit-depth, etc. Optionally a track may contain dynamic textual information (known as metatext) that is updated as the track is played. Metatext is typically used to convey broadcast information from internet radio stations.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
==Counters==&lt;br /&gt;
Counters are used to manage the changing of the Track, Details, and Metatext information.&lt;br /&gt;
&lt;br /&gt;
When a track changes, the Track Count is incremented, the Uri and Metadata are set, the Details Count is set to zero, the Details are defaulted to blank and zero values, the Metatext Count is set to zero, and the Metatext is set to blank.&lt;br /&gt;
&lt;br /&gt;
Subsequent updates to the Details and Metatext are accompanied by increments in their respective Counters.&lt;br /&gt;
&lt;br /&gt;
The Counters action can be used by clients that are unable to partake in UPnP eventing in order to establish changes in the information provided by the Info Service.&lt;br /&gt;
&lt;br /&gt;
==Track==&lt;br /&gt;
Reports current track information concerning the current media:&lt;br /&gt;
*Uri&lt;br /&gt;
*Metadata&lt;br /&gt;
&lt;br /&gt;
==Details==&lt;br /&gt;
Reports details concerning the current media:&lt;br /&gt;
*Duration&lt;br /&gt;
*Bit Rate&lt;br /&gt;
*Bit Depth&lt;br /&gt;
*Sample Rate&lt;br /&gt;
*Lossless&lt;br /&gt;
*Codec Name&lt;br /&gt;
&lt;br /&gt;
==Metatext==&lt;br /&gt;
Reports dynamic textual information concerning the current media.&lt;br /&gt;
&lt;br /&gt;
This currently amounts to broadcast information from internet radio stations, but the same mechanism could be used for other purposes in the future.&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    : Info&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Info Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&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;Counters&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;TrackCount&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;TrackCount&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;DetailsCount&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;DetailsCount&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;MetatextCount&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;MetatextCount&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Track&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Uri&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Metadata&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Details&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Duration&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Duration&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;BitRate&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;BitRate&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;BitDepth&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;BitDepth&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;SampleRate&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;SampleRate&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;Lossless&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;Lossless&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;CodecName&amp;lt;/name&amp;gt;&lt;br /&gt;
                    &amp;lt;direction&amp;gt;out&amp;lt;/direction&amp;gt;&lt;br /&gt;
                    &amp;lt;relatedStateVariable&amp;gt;CodecName&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
        &amp;lt;action&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Metatext&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;argumentList&amp;gt;&lt;br /&gt;
                &amp;lt;argument&amp;gt;&lt;br /&gt;
                    &amp;lt;name&amp;gt;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;Metatext&amp;lt;/relatedStateVariable&amp;gt;&lt;br /&gt;
                &amp;lt;/argument&amp;gt;&lt;br /&gt;
            &amp;lt;/argumentList&amp;gt;&lt;br /&gt;
        &amp;lt;/action&amp;gt;&lt;br /&gt;
    &amp;lt;/actionList&amp;gt;&lt;br /&gt;
    &amp;lt;serviceStateTable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;TrackCount&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;DetailsCount&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;MetatextCount&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Uri&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Metadata&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Duration&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;BitRate&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;BitDepth&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;SampleRate&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;ui4&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;Lossless&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;boolean&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;name&amp;gt;CodecName&amp;lt;/name&amp;gt;&lt;br /&gt;
            &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
        &amp;lt;stateVariable sendEvents=&amp;quot;yes&amp;quot;&amp;gt;&lt;br /&gt;
          &amp;lt;name&amp;gt;Metatext&amp;lt;/name&amp;gt;&lt;br /&gt;
          &amp;lt;dataType&amp;gt;string&amp;lt;/dataType&amp;gt;&lt;br /&gt;
        &amp;lt;/stateVariable&amp;gt;&lt;br /&gt;
   &amp;lt;/serviceStateTable&amp;gt;&lt;br /&gt;
&amp;lt;/scpd&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:ReceiverService</id>
		<title>Av:Developer:ReceiverService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:ReceiverService"/>
				<updated>2011-05-05T14:07:30Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Technical Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The Receiver service provides the means for controlling a Receiver source. If a device's [[Developer:ProductService|Product service]] reports a source of type 'Receiver', then that device is guaranteed to bear the Receiver service.&lt;br /&gt;
&lt;br /&gt;
A receiver plays audio broadcast from a [[Developer:SenderService|sender]].&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Sender ==&lt;br /&gt;
Report the Uri and Metadata of the sender this receiver is currently listening to.&lt;br /&gt;
&lt;br /&gt;
==SetSender==&lt;br /&gt;
Set the Uri and Metadata of the sender to listen to.&lt;br /&gt;
&lt;br /&gt;
The Metadata must have originated from a device bearing the [[Developer:SenderService|Sender service]].&lt;br /&gt;
&lt;br /&gt;
The Uri must be the result of applying this receiver's ProtocolInfo to this Metadata.&lt;br /&gt;
&lt;br /&gt;
==ProtocolInfo==&lt;br /&gt;
Report the receiver's protocol info.&lt;br /&gt;
&lt;br /&gt;
==TransportState==&lt;br /&gt;
&lt;br /&gt;
Report the current transport state, which can be: 'Playing', 'Paused', 'Stopped', or 'Buffering'.&lt;br /&gt;
&lt;br /&gt;
==Play==&lt;br /&gt;
Play audio from the current sender&lt;br /&gt;
&lt;br /&gt;
==Stop==&lt;br /&gt;
Stop playing audio from the current sender&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    : Receiver&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Receiver Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:SenderService</id>
		<title>Av:Developer:SenderService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:SenderService"/>
				<updated>2011-05-05T14:07:09Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Technical Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The Sender service indicates the presence of an OpenHome Av sender and provides information concerning that sender.&lt;br /&gt;
&lt;br /&gt;
An OpenHome Av sender broadcasts music on a network in a way that is playable by an OpenHome Av [[Developer:ReceiverService|receiver]].&lt;br /&gt;
&lt;br /&gt;
OpenHome senders should be discovered independently of the standard algorithm for discovering OpenHome products and sources. An independent search should be made for devices bearing the Sender service.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
== Attributes ==&lt;br /&gt;
Reports a space separated list of attributes that identify additional functionality that can be found on the same device as this Sender.&lt;br /&gt;
&lt;br /&gt;
Currently defined attributes are:&lt;br /&gt;
&lt;br /&gt;
* Info - this device reports on the current media using the Info service&lt;br /&gt;
* Time - this device reports on the current media using the Time service&lt;br /&gt;
&lt;br /&gt;
== Audio == &lt;br /&gt;
Reports whether audio is currently present on this sender.&lt;br /&gt;
&lt;br /&gt;
== Metadata ==&lt;br /&gt;
Provides a representation of this audio item in DIDL-Lite format.&lt;br /&gt;
&lt;br /&gt;
== PresentationUrl ==&lt;br /&gt;
Reports the Url of a presentation page for further information concerning the sender, or for controlling the sender in some application-specific way.&lt;br /&gt;
&lt;br /&gt;
If the sender has no presentation page, the PresentationUrl should be empty.&lt;br /&gt;
&lt;br /&gt;
== Status ==&lt;br /&gt;
Reports the status of the sender (normally only for debugging purposes):&lt;br /&gt;
&lt;br /&gt;
* Sending - currently sending audio over the network&lt;br /&gt;
* Ready - ready to send audio but no listeners&lt;br /&gt;
* Blocked - audio from another sender detected on the same channel (mis-configuration)&lt;br /&gt;
* Inactive - no audio source currently assigned to this sender&lt;br /&gt;
* Disabled - sender disabled by user configuration&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    : Sender&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sender Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:VolumeService</id>
		<title>Av:Developer:VolumeService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:VolumeService"/>
				<updated>2011-05-05T14:06:48Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Technical Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architecture Overview =&lt;br /&gt;
The Volume Service provides a means of controlling various settings which affect the product's volume (signal amplitude) measured at the output channels. A product may have one or more output channels. Balance or Fade settings may result in different volumes at each output. In the Mute state, all output channels are reduced to zero volume. &lt;br /&gt;
&lt;br /&gt;
==Volume==&lt;br /&gt;
Volume is an adjustable setting that controls the loudness of the audio at the output channels of the product. Volume can be set to an absolute value or incremented/decremented in single steps. The maximum Volume setting is defined by the current value of '''VolumeLimit'''. The minimum Volume setting is zero. If an attempt is made to set the Volume above VolumeLimit, the Volume will be set to the '''VolumLimit'''. If an attempt is made to set the Volume above '''VolumeMax''', an error will  be reported.&lt;br /&gt;
&lt;br /&gt;
== Volume Limit ==&lt;br /&gt;
VolumeLimit specifies the upper limit of the Volume. Any attempt to set Volume above the VolumeLimit will reset Volume to the value of VolumeLimit. If VolumeLimit is changed, Volume is checked and automatically reduced if necessary. The maximum VolumeLimit setting is defined by the '''VolumeMax''' Characteristic.&lt;br /&gt;
&lt;br /&gt;
==Balance==&lt;br /&gt;
Balance is an adjustable setting that specifies the '''bias''' in volume between the '''left and right''' output channels of the product. Balance can be set to an absolute value or incremented/decremented in single steps. The maximum Balance setting is defined by the '''BalanceMax''' Characteristic. The minimum Balance setting is defined by ('''-BalanceMax''') .&lt;br /&gt;
&lt;br /&gt;
==Fade==&lt;br /&gt;
Fade is an adjustable setting that specifies the '''bias''' in volume between the '''front and rear''' output channels of the products. Fade can be set to an absolute value or incremented/decremented in single steps. The maximum Fade setting is defined by the '''FadeMax''' Characteristic. The minimum Fade setting is defined by ('''-FadeMax''') .&lt;br /&gt;
&lt;br /&gt;
==Mute==&lt;br /&gt;
Mute is an adjustable state that determines if the output channels of the product are muted or not. When muted, all output channels of the product are silent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Characterstics==&lt;br /&gt;
Each product has '''six''' read only values that define its volume Characteristics. &lt;br /&gt;
====VolumeMax====&lt;br /&gt;
VolumeMax defines the absolute maximum Volume setting.&lt;br /&gt;
&lt;br /&gt;
====VolumeUnity====&lt;br /&gt;
VolumeUnity defines the value of Volume that will result in unity system gain (ie ''output amplitude'' = ''input amplitude'').&lt;br /&gt;
&lt;br /&gt;
====VolumeSteps====&lt;br /&gt;
VolumeSteps defines the number of step increments required to increase the Volume from zero to VolumeMax.&lt;br /&gt;
====VolumeMilliDbPerStep====&lt;br /&gt;
VolumeMilliDbPerStep defines the size of each volume step in '''binary milli decibels''' (bmdB). [''1024bmdB = 1dB'']&lt;br /&gt;
&lt;br /&gt;
====BalanceMax====&lt;br /&gt;
BalanceMax defines the maximum Balance setting. The minimum Balance setting is (-BalanceMax)&lt;br /&gt;
====FadeMax====&lt;br /&gt;
FadeMax defines the maximum Fade setting. The minimum Fade setting is (-FadeMax)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=Actions=&lt;br /&gt;
&lt;br /&gt;
=== Volume ===&lt;br /&gt;
The Volume action reports the current Volume setting.&lt;br /&gt;
&lt;br /&gt;
=== SetVolume===&lt;br /&gt;
The SetVolume action provides a means of setting the Volume to an absolute value.&lt;br /&gt;
&lt;br /&gt;
=== Volume Inc===&lt;br /&gt;
The VolumeInc action provides a means of increasing the Volume by 1.&lt;br /&gt;
=== Volume Dec ===&lt;br /&gt;
The VolumeDec action provides a means of decreasing the Volume by 1.&lt;br /&gt;
=== VolumeLimit ===&lt;br /&gt;
The VolumeLimit action reports the current VolumeLimit setting.&lt;br /&gt;
=== Balance ===&lt;br /&gt;
The Balance action reports the current Balance setting.&lt;br /&gt;
=== SetBalance ===&lt;br /&gt;
The SetBalance action provides a means of setting the Balance to a specific value.&lt;br /&gt;
&lt;br /&gt;
=== BalanceInc===&lt;br /&gt;
The BalanceInc action provides a means of increasing the Balance by 1.&lt;br /&gt;
=== BalanceDec ===&lt;br /&gt;
The BalanceDec action provides a means of decreasing the Balance by 1.&lt;br /&gt;
=== Fade ===&lt;br /&gt;
The Fade action reports the current Fade setting of the product.&lt;br /&gt;
==== SetFade ====&lt;br /&gt;
The SetFade action provides a means of setting the Fade to a specific value.&lt;br /&gt;
=== FadeInc===&lt;br /&gt;
The FadeInc action provides a means of increasing the Fade by 1.&lt;br /&gt;
&lt;br /&gt;
=== FadeDec ===&lt;br /&gt;
The FadeDec action provides a means of decreasing the Fade by 1.&lt;br /&gt;
=== Mute ===&lt;br /&gt;
The Mute action reports the current Mute state of the product.&lt;br /&gt;
=== SetMute ===&lt;br /&gt;
The SetMute action provides a means of setting the Mute state.&lt;br /&gt;
&lt;br /&gt;
=== Characteristics ===&lt;br /&gt;
The Characteristics action returns all '''six''' characteristic values of the product.&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    : Volume&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Volume Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:TimeService</id>
		<title>Av:Developer:TimeService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:TimeService"/>
				<updated>2011-05-05T14:05:25Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Technical Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Time service reports the duration of the currently playing track and the number of seconds so far played.&lt;br /&gt;
&lt;br /&gt;
This service is intentionally separated from the Info service. When a track is being played, this service delivers an event every second, which can overwhelm some primitive control points. The Time service is kept separate from the Info service so that control points can decide to subscribe to it independently.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
==Time==&lt;br /&gt;
This reports TrackCount, which increments each time a new track is played; Duration, which is the duration of the current track in seconds; and Seconds, which is the number of seconds so far played.&lt;br /&gt;
&lt;br /&gt;
TrackCount corresponds with TrackCount reported in the Info Service, but bears no relation to a Track Id or Preset Id reported from the [[Developer:Davaar:PlaylistService|Playlist Service]] or [[Developer:Davaar:RadioService|Radio Service]].&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    : Time&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Time Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:InfoService</id>
		<title>Av:Developer:InfoService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:InfoService"/>
				<updated>2011-05-05T14:04:57Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Technical Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The Info service provides information concerning the currently playing media. The information provided is based on the concept of a track, which has a uri and metadata in DIDL-Lite format. Some time after the track changes further information becomes available such as the bit-rate, sample-rate, bit-depth, etc. Optionally a track may contain dynamic textual information (known as metatext) that is updated as the track is played. Metatext is typically used to convey broadcast information from internet radio stations.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
==Counters==&lt;br /&gt;
Counters are used to manage the changing of the Track, Details, and Metatext information.&lt;br /&gt;
&lt;br /&gt;
When a track changes, the Track Count is incremented, the Uri and Metadata are set, the Details Count is set to zero, the Details are defaulted to blank and zero values, the Metatext Count is set to zero, and the Metatext is set to blank.&lt;br /&gt;
&lt;br /&gt;
Subsequent updates to the Details and Metatext are accompanied by increments in their respective Counters.&lt;br /&gt;
&lt;br /&gt;
The Counters action can be used by clients that are unable to partake in UPnP eventing in order to establish changes in the information provided by the Info Service.&lt;br /&gt;
&lt;br /&gt;
==Track==&lt;br /&gt;
Reports current track information concerning the current media:&lt;br /&gt;
*Uri&lt;br /&gt;
*Metadata&lt;br /&gt;
&lt;br /&gt;
==Details==&lt;br /&gt;
Reports details concerning the current media:&lt;br /&gt;
*Duration&lt;br /&gt;
*Bit Rate&lt;br /&gt;
*Bit Depth&lt;br /&gt;
*Sample Rate&lt;br /&gt;
*Lossless&lt;br /&gt;
*Codec Name&lt;br /&gt;
&lt;br /&gt;
==Metatext==&lt;br /&gt;
Reports dynamic textual information concerning the current media.&lt;br /&gt;
&lt;br /&gt;
This currently amounts to broadcast information from internet radio stations, but the same mechanism could be used for other purposes in the future.&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    : Info&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Info Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:RadioService</id>
		<title>Av:Developer:RadioService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:RadioService"/>
				<updated>2011-05-05T14:04:33Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Technical Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
The Radio service provides the means for controlling a Radio source. If a product's [[Developer:ProductService|Product Service]] reports a source of type 'Radio', then the device that bears that [[Developer:ProductService|Product Service]] is guaranteed to also bear the Radio service.&lt;br /&gt;
&lt;br /&gt;
The heart of the Radio service is the '''SetChannel''' action. Call '''SetChannel''' with a particular Uri and Metadata, then call '''Play''' and the media at the given Uri is played. If the media is an internet radio stream, it will play forever. If it is of finite length, it will play to the end and then stop.&lt;br /&gt;
&lt;br /&gt;
Call the '''Channel''' action to report the Uri and Metadata of the current Channel.&lt;br /&gt;
&lt;br /&gt;
The Radio Source also stores a list of channel presets. These can be presented to the user as a list of numbered channels that can easily be selected and played.&lt;br /&gt;
&lt;br /&gt;
This array of channel presets is accessed using an id array mechanism similar to that used in the [[Developer:PlaylistService|Playlist Service]]. The only difference is that the Radio service's id array is a constant length and may contain entries that are zero, which represent empty presets.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
==Channel==&lt;br /&gt;
Report the Uri and Metadata of the current Channel.&lt;br /&gt;
&lt;br /&gt;
==SetChannel==&lt;br /&gt;
Set the Uri and Metadata of the current Channel.&lt;br /&gt;
&lt;br /&gt;
==IdArray==&lt;br /&gt;
Report the current id array. The id array contains 100 presets, but this may change (see ChannelsMax).&lt;br /&gt;
&lt;br /&gt;
The IdArray is an ordered, constant length, array of ids. The first element contains the id for channel preset 1, the second element contains the id for channel Preset 2, etc. If an element is set to zero, then the corresponding channel preset is empty. &lt;br /&gt;
&lt;br /&gt;
This action also reports a Token, which can be used to quickly detect if the id array has changed since it was last read (see IdArrayChanged).&lt;br /&gt;
&lt;br /&gt;
==IdArrayChanged==&lt;br /&gt;
Check to see if the id array has changed since gathering the specified IdArrayToken.&lt;br /&gt;
This Token must have been previously collected from the IdArray 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;
==ChannelsMax==&lt;br /&gt;
Report the maximum number of entries in the channel preset id array.&lt;br /&gt;
&lt;br /&gt;
==SetId==&lt;br /&gt;
The the current Channel using the channel preset represented by the given Id, and using the provided Uri.&lt;br /&gt;
&lt;br /&gt;
It is usual for a Control Point to inspect the res elements of the Channel Metadata and select the appropriate Uri by matching to the renderer's ProtocolInfo.&lt;br /&gt;
&lt;br /&gt;
==Id==&lt;br /&gt;
Report the Id of the current Channel if it is in the Channel Preset list. If the current Channel is not a channel preset, the Id reported is zero.&lt;br /&gt;
&lt;br /&gt;
==ProtocolInfo==&lt;br /&gt;
Report the Radio Source protocol info.&lt;br /&gt;
&lt;br /&gt;
==Read==&lt;br /&gt;
Given a channel preset Id, report its associated Metadata.&lt;br /&gt;
&lt;br /&gt;
==ReadList==&lt;br /&gt;
Given a space separated list of channel preset Ids, report their associated Metadata.&lt;br /&gt;
&lt;br /&gt;
==TransportState==&lt;br /&gt;
&lt;br /&gt;
Report the current transport state, which can be: 'Playing', 'Paused', 'Stopped', or 'Buffering'.&lt;br /&gt;
&lt;br /&gt;
==Play==&lt;br /&gt;
Play the current channel&lt;br /&gt;
&lt;br /&gt;
==Pause==&lt;br /&gt;
Pause the current channel. This will be converted to Stop if the channel cannot be paused e.g. internet radio.&lt;br /&gt;
&lt;br /&gt;
==Stop==&lt;br /&gt;
Stop the current Channel&lt;br /&gt;
&lt;br /&gt;
==SeekSecondsAbsolute==&lt;br /&gt;
Seek to an absolute second within the current media. This is only available if the current media has a finite length.&lt;br /&gt;
&lt;br /&gt;
==SeekSecondsRelative==&lt;br /&gt;
Seek to a relative second within the current media.  This is only available if the current media has a finite length.&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    : Radio&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Radio Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/Av:Developer:PlaylistService</id>
		<title>Av:Developer:PlaylistService</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/Av:Developer:PlaylistService"/>
				<updated>2011-05-05T14:04:03Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Technical Details */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides the means for controlling a Playlist source. If a device's [[Developer:ProductService|Product service]] reports a source of type 'Playlist', then that device is guaranteed to bear the Playlist service.&lt;br /&gt;
&lt;br /&gt;
The Playlist service provides access to a list of tracks, which can be played starting at any point. Unless repeat mode has been engaged, the playlist will play to the end. Shuffle mode causes playback to skip randomly through the playlist. It is possible for Shuffle and Repeat modes to be engaged simultaneously.&lt;br /&gt;
&lt;br /&gt;
Using the Playlist service you can read, insert, and delete entries in the playlist. Each entry in the playlist is given unique id.  This unique id is completely unrelated to the play order of the playlist.&lt;br /&gt;
&lt;br /&gt;
To insert, provide the id you wish to insert 'after' and the associated uri and metadata. The track is inserted into the correct position and the id of the new track is returned.  To insert in the first position in the playlist, insert after the special id of 0.&lt;br /&gt;
&lt;br /&gt;
There are two read actions. One to read a single entry and the other to read a list of entries.&lt;br /&gt;
&lt;br /&gt;
In the first, the uri and metadata of the requested id are returned. This operation can fail if the requested id does not exist in the playlist.&lt;br /&gt;
&lt;br /&gt;
In the second, ReadList, a list of space separated decimal id's is provided and information concerning each of these tracks is returned in xml. ReadList does not fail. Requests for ids that are not in the playlist are silently ignored.&lt;br /&gt;
&lt;br /&gt;
There are two variants of delete allowing the deletion of a single track or the deletion of the entire playlist. The former requires the id of the entry to delete. The latter takes no parameters. Both variants always succeed.&lt;br /&gt;
&lt;br /&gt;
== IdArray ==&lt;br /&gt;
&lt;br /&gt;
The Playlist service has a state variable called IdArray. This IdArray is a [http://en.wikipedia.org/wiki/Base64 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;
For example the IdArray of:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x14 0x00 0x00 0x00 0x13&amp;lt;/pre&amp;gt; &lt;br /&gt;
&lt;br /&gt;
indicates a playlist of 3 tracks with the id's of 2, 20, and 19 in that order.&lt;br /&gt;
&lt;br /&gt;
Control point authors are interested in both: &lt;br /&gt;
&lt;br /&gt;
* the order of tracks in the playlist, and&lt;br /&gt;
* the metadata of those tracks&lt;br /&gt;
&lt;br /&gt;
Whether you acquire the IdArray via [[Developer:PlaylistService#Events|events]] or [[Developer:PlaylistService#Polling|polling]], you immediately know the 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 playlist 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 DS 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 playlist, the DS will event all subscribers the current IdArray. 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, IdArray, reads the id array directly. This action also returns an IdArrayToken, which should be saved and periodically passed to a second action, IdArrayChanged, which reports whether or not your copy of the IdArray is out of date. If it is, calling IdArray again will ensure you have an up to date version.&lt;br /&gt;
&lt;br /&gt;
= Actions =&lt;br /&gt;
&lt;br /&gt;
== IdArray ==&lt;br /&gt;
Report the current id array.&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;
This action also reports a Token, which can be used to quickly detect if the id array has changed since it was last read (see IdArrayChanged).&lt;br /&gt;
&lt;br /&gt;
== IdArrayChanged ==&lt;br /&gt;
Check to see if the id array has changed since gathering the specified Token.&lt;br /&gt;
This Token must have been previously collected from the IdArray 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;
== TracksMax ==&lt;br /&gt;
Report the maximum number of tracks in the 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.&lt;br /&gt;
&lt;br /&gt;
==Id==&lt;br /&gt;
Report the Id of the current track. If the reported id is zero, the playlist is empty.&lt;br /&gt;
&lt;br /&gt;
==ProtocolInfo==&lt;br /&gt;
Report the Playlist source protocol info.&lt;br /&gt;
&lt;br /&gt;
==Read==&lt;br /&gt;
Given a track Id, report its associated Uri and Metadata.&lt;br /&gt;
&lt;br /&gt;
==ReadList==&lt;br /&gt;
Given a space separated list of track Id's, report their associated Uri and Metadata in the following xml form:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&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;Uri&amp;gt;&amp;lt;/Uri&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;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TransportState ==&lt;br /&gt;
&lt;br /&gt;
Report the current transport state, which can be: 'Playing', 'Paused', 'Stopped', or 'Buffering'.&lt;br /&gt;
&lt;br /&gt;
== Play ==&lt;br /&gt;
Begin playback from the current position.&lt;br /&gt;
&lt;br /&gt;
== Pause ==&lt;br /&gt;
Pause the current track. This will be converted to Stop if the track cannot be paused e.g. internet radio.&lt;br /&gt;
&lt;br /&gt;
== Stop ==&lt;br /&gt;
Stop playback and move the current position to the start of the current track.&lt;br /&gt;
&lt;br /&gt;
== Next ==&lt;br /&gt;
Move the current position to the start of the next track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== Previous ==&lt;br /&gt;
Move the current position to the start of the next track in the playlist.&lt;br /&gt;
&lt;br /&gt;
== SeekId ==&lt;br /&gt;
Move the current position to the start of the track represented by the given Id.&lt;br /&gt;
&lt;br /&gt;
== SeekIndex ==&lt;br /&gt;
Move the current position to the start of the track with the given Index into the playlist.&lt;br /&gt;
&lt;br /&gt;
This action should only be used by primitive control points that do not have a rich way of representing the playlist to the user.&lt;br /&gt;
&lt;br /&gt;
== SeekSecondAbsolute ==&lt;br /&gt;
Seek to an absolute second within the current track. This is only available if the current track has a finite length.&lt;br /&gt;
&lt;br /&gt;
== SeekSecondRelative ==&lt;br /&gt;
Seek to a relative second within the current track.  This is only available if the current track has a finite length.&lt;br /&gt;
&lt;br /&gt;
== Repeat ==&lt;br /&gt;
Report the state of repeat mode.&lt;br /&gt;
&lt;br /&gt;
== SetRepeat ==&lt;br /&gt;
Set the state of repeat mode.&lt;br /&gt;
&lt;br /&gt;
== Shuffle ==&lt;br /&gt;
Report the state of shuffle mode.&lt;br /&gt;
&lt;br /&gt;
== SetShuffle ==&lt;br /&gt;
Set the state of shuffle mode.&lt;br /&gt;
&lt;br /&gt;
== DeleteId ==&lt;br /&gt;
Delete from the playlist the track with the speciofied Id.&lt;br /&gt;
&lt;br /&gt;
== DeleteAll ==&lt;br /&gt;
Clear the 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    : Playlist&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Playlist Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</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>2011-05-05T14:03:25Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The Product service contains basic information concerning a single product. It contains information about what kind of device it is: the model, manufacturer, its name, its room, and details concerning each source within the product. Other basic functionality such as control of the product's standby state are also included.&lt;br /&gt;
&lt;br /&gt;
It should be possible for a control point to create a complete map of the home by subscribing to the Product service of every device.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Every product has one or more attributes indicating additional features offered by that product beyond those provided by its sources&lt;br /&gt;
&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
There are '''four''' Manufacturer parameters; '''Name''', '''Info''', '''Url''' and '''ImageUri'''. They are all text strings.&lt;br /&gt;
&lt;br /&gt;
==== Name ====&lt;br /&gt;
Name contains the Manufacturer name. Name is read only.&lt;br /&gt;
&lt;br /&gt;
==== Info ====&lt;br /&gt;
Info contains more Manufacturer information. Info is read only.&lt;br /&gt;
&lt;br /&gt;
==== Url ====&lt;br /&gt;
Url contains the Manufacturer website address. Url is read only.&lt;br /&gt;
&lt;br /&gt;
==== ImageUri ====&lt;br /&gt;
ImageUri contains a link to the Manufacturer image (i.e. logo). ImageUri is read only.&lt;br /&gt;
&lt;br /&gt;
=== Model ===&lt;br /&gt;
&lt;br /&gt;
There are '''four''' Model parameters; '''Name''', '''Info''', '''Url''' and '''ImageUri'''.&lt;br /&gt;
&lt;br /&gt;
==== Name ====&lt;br /&gt;
Name contains the Model name. Name is read only.&lt;br /&gt;
==== Info ====&lt;br /&gt;
Info contains more Model information. Info is read only. &lt;br /&gt;
==== Url ====&lt;br /&gt;
Url contains the Model website address. Url is read only.&lt;br /&gt;
==== ImageUri ====&lt;br /&gt;
ImageUri contains a link to the Model image (i.e. icon). ImageUri is read only.&lt;br /&gt;
&lt;br /&gt;
=== Product ===&lt;br /&gt;
There are '''five''' Product parameters; '''Room''', '''Name''', '''Info''', '''Url''' and '''ImageUri'''. They are all text strings.&lt;br /&gt;
&lt;br /&gt;
==== Room ====&lt;br /&gt;
This is the name of the room where the Product is located. Room is used to group the Product with other Products in the same physical room. The Upnp '''''Friendly Name''''' is derived by combining Room and Name in the format {'''''Room&amp;amp;nbsp;: Name'''''}. Products which are '''''Linked''''' always share the same Room name. Room is set to '''''Main Room''''' by default.&lt;br /&gt;
&lt;br /&gt;
==== Name ====&lt;br /&gt;
This is the Product name. The Upnp '''''Friendly Name''''' is derived by combining Room and Name in the format {'''''Room&amp;amp;nbsp;: Name'''''}. By default the Name is the same as the Model. &lt;br /&gt;
&lt;br /&gt;
==== Info ====&lt;br /&gt;
Info contains more Product information. Info is read only.&lt;br /&gt;
&lt;br /&gt;
==== Url ====&lt;br /&gt;
Url contains the Product website address (i.e. UPnP presentation page). Url is read only.&lt;br /&gt;
&lt;br /&gt;
==== ImageUri ====&lt;br /&gt;
ImageUri contains a link to the Product image (i.e. icon). ImageUri is read only.&lt;br /&gt;
&lt;br /&gt;
== Standby Control==&lt;br /&gt;
&lt;br /&gt;
=== Standby===&lt;br /&gt;
This is the Standby state of the physical product. Standby can be changed using the SetStandby function. Products which are '''''Linked''''' always share the same Standby state. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source Control ==&lt;br /&gt;
&lt;br /&gt;
=== Source List===&lt;br /&gt;
The Product service maintains a list of all sources within the Product. The size of this list is fixed for each Product and reported by the SourceCount function. Each source can then be referenced by its unique source index* in the list. Only one source, and thus one index, can be active at any given time. When a new source is selected the previous source is automatically deactivated before activating the new source. [* source index is zero based, ie 0,1,2,3,4,5..n, where n=listsize-1]&lt;br /&gt;
&lt;br /&gt;
=== Source Index ===&lt;br /&gt;
&lt;br /&gt;
The current (ie currently active) source can be changed by source index or source name. The function SetSourceIndex is used to change the current source by index. If the index is out of range an error will be reported. SetSourceIndexByName is used to change to the source whose name matches that specified. If a source of the specified name does not exist, the source will not change and no error will be reported.&lt;br /&gt;
&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
&lt;br /&gt;
SourceCount returns the number of sources that exist in the Product (ie the source list size). SourceCount is read only.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Source Specific Parameters ===&lt;br /&gt;
Every source has four fundamental parameters, '''SourceSystemName''', '''SourceName''', '''SourceVisible''' and '''SourceType'''.&lt;br /&gt;
&lt;br /&gt;
==== SourceSystemName ====&lt;br /&gt;
&lt;br /&gt;
SourceSystemName is a unique name string used to identify each source. SourceSystemName is read only. It can only be read via the '''Source''' action.&lt;br /&gt;
&lt;br /&gt;
==== SourceName ====&lt;br /&gt;
&lt;br /&gt;
SourceName is a unique name string assigned to each source. In the default state, for a given source index, SourceName matches SourceSystemName. It can be read via the '''Source''' action, or the '''SourceXml''' action.&lt;br /&gt;
&lt;br /&gt;
==== SourceType ====&lt;br /&gt;
&lt;br /&gt;
SourceType is a unique type string assigned to each source. SourceType is read only. It can be read via the '''Source''' action, or the '''SourceXml''' action.&lt;br /&gt;
&lt;br /&gt;
==== SourceVisible ====&lt;br /&gt;
&lt;br /&gt;
SourceVisible is a unique flag assigned to each source. This flag is used to indicate whether the source is to be displayed (front panel, GUI etc) when browsing through the source list. It can be read via the '''Source''' action, or the '''SourceXml''' action.&lt;br /&gt;
&lt;br /&gt;
Note - ''a source's &amp;quot;visibility&amp;quot; does not affect its ability to be selected/activated via the functions SetSourceIndex and SetCurrentSourceByName.''&lt;br /&gt;
&lt;br /&gt;
= Actions=&lt;br /&gt;
&lt;br /&gt;
== Network Presentation Actions==&lt;br /&gt;
=== Attributes Action ===&lt;br /&gt;
The Attributes action reports a string containing a space separated list of all attributes.&lt;br /&gt;
&lt;br /&gt;
=== Manufacturer Action ===&lt;br /&gt;
The Manufacturer action returns all four Manufacturer parameters.&lt;br /&gt;
&lt;br /&gt;
=== Model Action ===&lt;br /&gt;
The Model action returns all four Model parameters.&lt;br /&gt;
&lt;br /&gt;
=== Product Action ===&lt;br /&gt;
The Product action returns all five Product parameters.&lt;br /&gt;
&lt;br /&gt;
== Standby Actions==&lt;br /&gt;
=== Standby===&lt;br /&gt;
The Standby action reports the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
=== SetStandby===&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
==Source Actions==&lt;br /&gt;
===SourceXml Action===&lt;br /&gt;
The SourceXml action returns a list of all source specific parameters, for every source, in XML format.&lt;br /&gt;
&lt;br /&gt;
===SourceXmlChangeCount Action===&lt;br /&gt;
The SourceXmlChangeCount action returns a count indicating the number of times SourceXml has been updated since power on. This is useful for control points that do not support eventing.&lt;br /&gt;
&lt;br /&gt;
===Source Action===&lt;br /&gt;
The Source action returns all source specific parameters for a given source index.&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    : Product&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Product Service Description (XML) ==&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Joshh</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>2011-05-05T13:56:01Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The Product service contains basic information concerning a single product. It contains information about what kind of device it is: the model, manufacturer, its name, its room, and details concerning each source within the product. Other basic functionality such as control of the product's standby state are also included.&lt;br /&gt;
&lt;br /&gt;
It should be possible for a control point to create a complete map of the home by subscribing to the Product service of every device.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Every product has one or more attributes indicating additional features offered by that product beyond those provided by its sources&lt;br /&gt;
&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
There are '''four''' Manufacturer parameters; '''Name''', '''Info''', '''Url''' and '''ImageUri'''. They are all text strings.&lt;br /&gt;
&lt;br /&gt;
==== Name ====&lt;br /&gt;
Name contains the Manufacturer name. Name is read only.&lt;br /&gt;
&lt;br /&gt;
==== Info ====&lt;br /&gt;
Info contains more Manufacturer information. Info is read only.&lt;br /&gt;
&lt;br /&gt;
==== Url ====&lt;br /&gt;
Url contains the Manufacturer website address. Url is read only.&lt;br /&gt;
&lt;br /&gt;
==== ImageUri ====&lt;br /&gt;
ImageUri contains a link to the Manufacturer image (i.e. logo). ImageUri is read only.&lt;br /&gt;
&lt;br /&gt;
=== Model ===&lt;br /&gt;
&lt;br /&gt;
There are '''four''' Model parameters; '''Name''', '''Info''', '''Url''' and '''ImageUri'''.&lt;br /&gt;
&lt;br /&gt;
==== Name ====&lt;br /&gt;
Name contains the Model name. Name is read only.&lt;br /&gt;
==== Info ====&lt;br /&gt;
Info contains more Model information. Info is read only. &lt;br /&gt;
==== Url ====&lt;br /&gt;
Url contains the Model website address. Url is read only.&lt;br /&gt;
==== ImageUri ====&lt;br /&gt;
ImageUri contains a link to the Model image (i.e. icon). ImageUri is read only.&lt;br /&gt;
&lt;br /&gt;
=== Product ===&lt;br /&gt;
There are '''five''' Product parameters; '''Room''', '''Name''', '''Info''', '''Url''' and '''ImageUri'''. They are all text strings.&lt;br /&gt;
&lt;br /&gt;
==== Room ====&lt;br /&gt;
This is the name of the room where the Product is located. Room is used to group the Product with other Products in the same physical room. The Upnp '''''Friendly Name''''' is derived by combining Room and Name in the format {'''''Room&amp;amp;nbsp;: Name'''''}. Products which are '''''Linked''''' always share the same Room name. Room is set to '''''Main Room''''' by default.&lt;br /&gt;
&lt;br /&gt;
==== Name ====&lt;br /&gt;
This is the Product name. The Upnp '''''Friendly Name''''' is derived by combining Room and Name in the format {'''''Room&amp;amp;nbsp;: Name'''''}. By default the Name is the same as the Model. &lt;br /&gt;
&lt;br /&gt;
==== Info ====&lt;br /&gt;
Info contains more Product information. Info is read only.&lt;br /&gt;
&lt;br /&gt;
==== Url ====&lt;br /&gt;
Url contains the Product website address (i.e. UPnP presentation page). Url is read only.&lt;br /&gt;
&lt;br /&gt;
==== ImageUri ====&lt;br /&gt;
ImageUri contains a link to the Product image (i.e. icon). ImageUri is read only.&lt;br /&gt;
&lt;br /&gt;
== Standby Control==&lt;br /&gt;
&lt;br /&gt;
=== Standby===&lt;br /&gt;
This is the Standby state of the physical product. Standby can be changed using the SetStandby function. Products which are '''''Linked''''' always share the same Standby state. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source Control ==&lt;br /&gt;
&lt;br /&gt;
=== Source List===&lt;br /&gt;
The Product service maintains a list of all sources within the Product. The size of this list is fixed for each Product and reported by the SourceCount function. Each source can then be referenced by its unique source index* in the list. Only one source, and thus one index, can be active at any given time. When a new source is selected the previous source is automatically deactivated before activating the new source. [* source index is zero based, ie 0,1,2,3,4,5..n, where n=listsize-1]&lt;br /&gt;
&lt;br /&gt;
=== Source Index ===&lt;br /&gt;
&lt;br /&gt;
The current (ie currently active) source can be changed by source index or source name. The function SetSourceIndex is used to change the current source by index. If the index is out of range an error will be reported. SetSourceIndexByName is used to change to the source whose name matches that specified. If a source of the specified name does not exist, the source will not change and no error will be reported.&lt;br /&gt;
&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
&lt;br /&gt;
SourceCount returns the number of sources that exist in the Product (ie the source list size). SourceCount is read only.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Source Specific Parameters ===&lt;br /&gt;
Every source has four fundamental parameters, '''SourceSystemName''', '''SourceName''', '''SourceVisible''' and '''SourceType'''.&lt;br /&gt;
&lt;br /&gt;
==== SourceSystemName ====&lt;br /&gt;
&lt;br /&gt;
SourceSystemName is a unique name string used to identify each source. SourceSystemName is read only. It can only be read via the '''Source''' action.&lt;br /&gt;
&lt;br /&gt;
==== SourceName ====&lt;br /&gt;
&lt;br /&gt;
SourceName is a unique name string assigned to each source. In the default state, for a given source index, SourceName matches SourceSystemName. It can be read via the '''Source''' action, or the '''SourceXml''' action.&lt;br /&gt;
&lt;br /&gt;
==== SourceType ====&lt;br /&gt;
&lt;br /&gt;
SourceType is a unique type string assigned to each source. SourceType is read only. It can be read via the '''Source''' action, or the '''SourceXml''' action.&lt;br /&gt;
&lt;br /&gt;
==== SourceVisible ====&lt;br /&gt;
&lt;br /&gt;
SourceVisible is a unique flag assigned to each source. This flag is used to indicate whether the source is to be displayed (front panel, GUI etc) when browsing through the source list. It can be read via the '''Source''' action, or the '''SourceXml''' action.&lt;br /&gt;
&lt;br /&gt;
Note - ''a source's &amp;quot;visibility&amp;quot; does not affect its ability to be selected/activated via the functions SetSourceIndex and SetCurrentSourceByName.''&lt;br /&gt;
&lt;br /&gt;
= Actions=&lt;br /&gt;
&lt;br /&gt;
== Network Presentation Actions==&lt;br /&gt;
=== Attributes Action ===&lt;br /&gt;
The Attributes action reports a string containing a space separated list of all attributes.&lt;br /&gt;
&lt;br /&gt;
=== Manufacturer Action ===&lt;br /&gt;
The Manufacturer action returns all four Manufacturer parameters.&lt;br /&gt;
&lt;br /&gt;
=== Model Action ===&lt;br /&gt;
The Model action returns all four Model parameters.&lt;br /&gt;
&lt;br /&gt;
=== Product Action ===&lt;br /&gt;
The Product action returns all five Product parameters.&lt;br /&gt;
&lt;br /&gt;
== Standby Actions==&lt;br /&gt;
=== Standby===&lt;br /&gt;
The Standby action reports the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
=== SetStandby===&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
==Source Actions==&lt;br /&gt;
===SourceXml Action===&lt;br /&gt;
The SourceXml action returns a list of all source specific parameters, for every source, in XML format.&lt;br /&gt;
&lt;br /&gt;
===SourceXmlChangeCount Action===&lt;br /&gt;
The SourceXmlChangeCount action returns a count indicating the number of times SourceXml has been updated since power on. This is useful for control points that do not support eventing.&lt;br /&gt;
&lt;br /&gt;
===Source Action===&lt;br /&gt;
The Source action returns all source specific parameters for a given source index.&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    : Product&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
[http://oss.linn.co.uk/trac/browser/Main/LibUpnpCil/Services/Openhome/Product1.xml Product Service Description (XML)]&lt;/div&gt;</summary>
		<author><name>Joshh</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>2011-05-05T13:53:09Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Architectural Overview =&lt;br /&gt;
&lt;br /&gt;
The Product service contains basic information concerning a single product. It contains information about what kind of device it is: the model, manufacturer, its name, its room, and details concerning each source within the product. Other basic functionality such as control of the product's standby state are also included.&lt;br /&gt;
&lt;br /&gt;
It should be possible for a control point to create a complete map of the home by subscribing to the Product service of every device.&lt;br /&gt;
&lt;br /&gt;
== Network Presentation ==&lt;br /&gt;
&lt;br /&gt;
=== Attributes ===&lt;br /&gt;
Every product has one or more attributes indicating additional features offered by that product beyond those provided by its sources&lt;br /&gt;
&lt;br /&gt;
=== Manufacturer ===&lt;br /&gt;
There are '''four''' Manufacturer parameters; '''Name''', '''Info''', '''Url''' and '''ImageUri'''. They are all text strings.&lt;br /&gt;
&lt;br /&gt;
==== Name ====&lt;br /&gt;
Name contains the Manufacturer name. Name is read only.&lt;br /&gt;
&lt;br /&gt;
==== Info ====&lt;br /&gt;
Info contains more Manufacturer information. Info is read only.&lt;br /&gt;
&lt;br /&gt;
==== Url ====&lt;br /&gt;
Url contains the Manufacturer website address. Url is read only.&lt;br /&gt;
&lt;br /&gt;
==== ImageUri ====&lt;br /&gt;
ImageUri contains a link to the Manufacturer image (i.e. logo). ImageUri is read only.&lt;br /&gt;
&lt;br /&gt;
=== Model ===&lt;br /&gt;
&lt;br /&gt;
There are '''four''' Model parameters; '''Name''', '''Info''', '''Url''' and '''ImageUri'''.&lt;br /&gt;
&lt;br /&gt;
==== Name ====&lt;br /&gt;
Name contains the Model name. Name is read only.&lt;br /&gt;
==== Info ====&lt;br /&gt;
Info contains more Model information. Info is read only. &lt;br /&gt;
==== Url ====&lt;br /&gt;
Url contains the Model website address. Url is read only.&lt;br /&gt;
==== ImageUri ====&lt;br /&gt;
ImageUri contains a link to the Model image (i.e. icon). ImageUri is read only.&lt;br /&gt;
&lt;br /&gt;
=== Product ===&lt;br /&gt;
There are '''five''' Product parameters; '''Room''', '''Name''', '''Info''', '''Url''' and '''ImageUri'''. They are all text strings.&lt;br /&gt;
&lt;br /&gt;
==== Room ====&lt;br /&gt;
This is the name of the room where the Product is located. Room is used to group the Product with other Products in the same physical room. The Upnp '''''Friendly Name''''' is derived by combining Room and Name in the format {'''''Room&amp;amp;nbsp;: Name'''''}. Products which are '''''Linked''''' always share the same Room name. Room is set to '''''Main Room''''' by default.&lt;br /&gt;
&lt;br /&gt;
==== Name ====&lt;br /&gt;
This is the Product name. The Upnp '''''Friendly Name''''' is derived by combining Room and Name in the format {'''''Room&amp;amp;nbsp;: Name'''''}. By default the Name is the same as the Model. &lt;br /&gt;
&lt;br /&gt;
==== Info ====&lt;br /&gt;
Info contains more Product information. Info is read only.&lt;br /&gt;
&lt;br /&gt;
==== Url ====&lt;br /&gt;
Url contains... Url is read only.&lt;br /&gt;
&lt;br /&gt;
==== ImageUri ====&lt;br /&gt;
ImageUri contains... ImageUri is read only.&lt;br /&gt;
&lt;br /&gt;
== Standby Control==&lt;br /&gt;
&lt;br /&gt;
=== Standby===&lt;br /&gt;
This is the Standby state of the physical product. Standby can be changed using the SetStandby function. Products which are '''''Linked''''' always share the same Standby state. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Source Control ==&lt;br /&gt;
&lt;br /&gt;
=== Source List===&lt;br /&gt;
The Product service maintains a list of all sources within the Product. The size of this list is fixed for each Product and reported by the SourceCount function. Each source can then be referenced by its unique source index* in the list. Only one source, and thus one index, can be active at any given time. When a new source is selected the previous source is automatically deactivated before activating the new source. [* source index is zero based, ie 0,1,2,3,4,5..n, where n=listsize-1]&lt;br /&gt;
&lt;br /&gt;
=== Source Index ===&lt;br /&gt;
&lt;br /&gt;
The current (ie currently active) source can be changed by source index or source name. The function SetSourceIndex is used to change the current source by index. If the index is out of range an error will be reported. SetSourceIndexByName is used to change to the source whose name matches that specified. If a source of the specified name does not exist, the source will not change and no error will be reported.&lt;br /&gt;
&lt;br /&gt;
=== SourceCount ===&lt;br /&gt;
&lt;br /&gt;
SourceCount returns the number of sources that exist in the Product (ie the source list size). SourceCount is read only.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Source Specific Parameters ===&lt;br /&gt;
Every source has four fundamental parameters, '''SourceSystemName''', '''SourceName''', '''SourceVisible''' and '''SourceType'''.&lt;br /&gt;
&lt;br /&gt;
==== SourceSystemName ====&lt;br /&gt;
&lt;br /&gt;
SourceSystemName is a unique name string used to identify each source. SourceSystemName is read only. It can only be read via the '''Source''' action.&lt;br /&gt;
&lt;br /&gt;
==== SourceName ====&lt;br /&gt;
&lt;br /&gt;
SourceName is a unique name string assigned to each source. In the default state, for a given source index, SourceName matches SourceSystemName. It can be read via the '''Source''' action, or the '''SourceXml''' action.&lt;br /&gt;
&lt;br /&gt;
==== SourceType ====&lt;br /&gt;
&lt;br /&gt;
SourceType is a unique type string assigned to each source. SourceType is read only. It can be read via the '''Source''' action, or the '''SourceXml''' action.&lt;br /&gt;
&lt;br /&gt;
==== SourceVisible ====&lt;br /&gt;
&lt;br /&gt;
SourceVisible is a unique flag assigned to each source. This flag is used to indicate whether the source is to be displayed (front panel, GUI etc) when browsing through the source list. It can be read via the '''Source''' action, or the '''SourceXml''' action.&lt;br /&gt;
&lt;br /&gt;
Note - ''a source's &amp;quot;visibility&amp;quot; does not affect its ability to be selected/activated via the functions SetSourceIndex and SetCurrentSourceByName.''&lt;br /&gt;
&lt;br /&gt;
= Actions=&lt;br /&gt;
&lt;br /&gt;
== Network Presentation Actions==&lt;br /&gt;
=== Attributes Action ===&lt;br /&gt;
The Attributes action reports a string containing a space separated list of all attributes.&lt;br /&gt;
&lt;br /&gt;
=== Manufacturer Action ===&lt;br /&gt;
The Manufacturer action returns all four Manufacturer parameters.&lt;br /&gt;
&lt;br /&gt;
=== Model Action ===&lt;br /&gt;
The Model action returns all four Model parameters.&lt;br /&gt;
&lt;br /&gt;
=== Product Action ===&lt;br /&gt;
The Product action returns all five Product parameters.&lt;br /&gt;
&lt;br /&gt;
== Standby Actions==&lt;br /&gt;
=== Standby===&lt;br /&gt;
The Standby action reports the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
=== SetStandby===&lt;br /&gt;
The SetStandby action provides a means of setting the current standby state of the product.&lt;br /&gt;
&lt;br /&gt;
==Source Actions==&lt;br /&gt;
===SourceXml Action===&lt;br /&gt;
The SourceXml action returns a list of all source specific parameters, for every source, in XML format.&lt;br /&gt;
&lt;br /&gt;
===SourceXmlChangeCount Action===&lt;br /&gt;
The SourceXmlChangeCount action returns a count indicating the number of times SourceXml has been updated since power on. This is useful for control points that do not support eventing.&lt;br /&gt;
&lt;br /&gt;
===Source Action===&lt;br /&gt;
The Source action returns all source specific parameters for a given source index.&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    : Product&lt;br /&gt;
    Version : 1&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
[http://oss.linn.co.uk/trac/browser/Main/LibUpnpCil/Services/Openhome/Product1.xml Product Service Description (XML)]&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia:Developer</id>
		<title>OhMedia:Developer</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia:Developer"/>
				<updated>2011-05-05T09:10:33Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Multiroom Functionality */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
&lt;br /&gt;
OpenHome Av is an independent standard for networked audio visual devices. OpenHome Av products all have a standard way of presenting themselves to the network. This makes it possible to write generic Control Point software that is able to control those products independent of manufacturer or specific features.&lt;br /&gt;
&lt;br /&gt;
The technologies associated with making this possible are grouped under the term OpenHome Av Topology.&lt;br /&gt;
&lt;br /&gt;
If a developer wishes to write generic software that participates in the aims described above, then they should write that software in a way that conforms to the strategies and algorithms of OpenHome Av Topology, which is described below&lt;br /&gt;
&lt;br /&gt;
= Topology =&lt;br /&gt;
&lt;br /&gt;
== Products ==&lt;br /&gt;
&lt;br /&gt;
An OpenHome installation consists of products from a variety of manufacturers each bearing the [[Developer:ProductService|Product service]].&lt;br /&gt;
&lt;br /&gt;
Amongst other information, each product has:&lt;br /&gt;
&lt;br /&gt;
* Room (user configurable, defaults to 'Main Room')&lt;br /&gt;
&lt;br /&gt;
* Name (user configurable, defaults to the model name)&lt;br /&gt;
&lt;br /&gt;
* Source Count (fixed according to the capabilities of the product)&lt;br /&gt;
&lt;br /&gt;
* List of Sources, each with its own Type, Name, and Visibility&lt;br /&gt;
&lt;br /&gt;
* Attributes, identifying additional functionality offered by the product&lt;br /&gt;
&lt;br /&gt;
== Proper Configuration ==&lt;br /&gt;
&lt;br /&gt;
The name of each product represents its audio output.&lt;br /&gt;
&lt;br /&gt;
The name of each source represents an audio input (either internal or external).&lt;br /&gt;
&lt;br /&gt;
In a properly configured system, if one product is connected to another using an audio cable, then the name of the product sending the audio should match the name of the source receiving the audio. It is by matching these names that a Control Point is able to select the correct input on, for instance, a preamp when a particular source is selected.&lt;br /&gt;
&lt;br /&gt;
== Discovering An OpenHome Av System ==&lt;br /&gt;
&lt;br /&gt;
The correct way to discover an OpenHome Av system is to:&lt;br /&gt;
&lt;br /&gt;
* search for all units bearing the Product service&lt;br /&gt;
&lt;br /&gt;
* subscribe to each Product service&lt;br /&gt;
&lt;br /&gt;
* group these products according to their Room.&lt;br /&gt;
&lt;br /&gt;
* collect the name of all the sources in each product&lt;br /&gt;
&lt;br /&gt;
* match the names of the sources to the names of the products to create a set of tree structures in each room.&lt;br /&gt;
&lt;br /&gt;
== Source Functionality ==&lt;br /&gt;
&lt;br /&gt;
To determine the kind of functionality available on each source, inspect its type.&lt;br /&gt;
&lt;br /&gt;
If it has type Playlist, it additionally contains the [[Av:Developer:PlaylistService|Playlist service]]&lt;br /&gt;
&lt;br /&gt;
If it has type Radio, it additionally contains the [[Av:Developer:RadioService|Radio service]]&lt;br /&gt;
&lt;br /&gt;
If it has type Receiver, it additionally contains the [[Av:Developer:ReceiverService|Receiver service]]&lt;br /&gt;
&lt;br /&gt;
== Volume Control ==&lt;br /&gt;
&lt;br /&gt;
Products that offer volume control include the Volume attribute and the [[Av:Developer:VolumeService|Volume service]]&lt;br /&gt;
&lt;br /&gt;
The primary volume control offered by a control point should be the one situated nearest the root in the tree structure that contains the current source.&lt;br /&gt;
&lt;br /&gt;
Control points may optionally provide the user with control of the volume of each product within the tree.&lt;br /&gt;
&lt;br /&gt;
== Now Playing Information ==&lt;br /&gt;
Products that provide information concerning the currently playing media include the [[Av:Developer:InfoService|Info service]]&lt;br /&gt;
&lt;br /&gt;
Products that report the duration of the currently playing track include the [[Av:Developer:TimeService|Time service]]&lt;br /&gt;
&lt;br /&gt;
== Multiroom Functionality ==&lt;br /&gt;
&lt;br /&gt;
The [[Av:Developer:SenderService|Sender service]] indicates the presence of an OpenHome Av sender and provides information concerning that sender.&lt;br /&gt;
&lt;br /&gt;
An OpenHome Av sender broadcasts music on a network in a way that is playable by an OpenHome Av receiver.&lt;br /&gt;
&lt;br /&gt;
The [[Av:Developer:ReceiverService|Receiver service]] provides the means for controlling a Receiver source. If a device's [[Developer:ProductService|Product service]] reports a source of type 'Receiver', then that device is guaranteed to bear the [[Av:Developer:ReceiverService|Receiver service]].&lt;br /&gt;
&lt;br /&gt;
= Services =&lt;br /&gt;
&lt;br /&gt;
==== Product ====&lt;br /&gt;
[[Av:Developer:ProductService|Product service]]&lt;br /&gt;
&lt;br /&gt;
==== Playlist ====&lt;br /&gt;
[[Av:Developer:PlaylistService|Playlist service]]&lt;br /&gt;
==== Radio ====&lt;br /&gt;
[[Av:Developer:RadioService|Radio service]]&lt;br /&gt;
==== Info ====&lt;br /&gt;
[[Av:Developer:InfoService|Info service]]&lt;br /&gt;
==== Time ====&lt;br /&gt;
[[Av:Developer:TimeService|Time service]]&lt;br /&gt;
==== Volume ====&lt;br /&gt;
[[Av:Developer:VolumeService|Volume service]]&lt;br /&gt;
==== Sender ====&lt;br /&gt;
[[Av:Developer:SenderService|Sender service]]&lt;br /&gt;
==== Receiver ====&lt;br /&gt;
[[Av:Developer:ReceiverService|Receiver service]]&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia:Developer</id>
		<title>OhMedia:Developer</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia:Developer"/>
				<updated>2011-05-05T09:08:36Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Multiroom Functionality */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
&lt;br /&gt;
OpenHome Av is an independent standard for networked audio visual devices. OpenHome Av products all have a standard way of presenting themselves to the network. This makes it possible to write generic Control Point software that is able to control those products independent of manufacturer or specific features.&lt;br /&gt;
&lt;br /&gt;
The technologies associated with making this possible are grouped under the term OpenHome Av Topology.&lt;br /&gt;
&lt;br /&gt;
If a developer wishes to write generic software that participates in the aims described above, then they should write that software in a way that conforms to the strategies and algorithms of OpenHome Av Topology, which is described below&lt;br /&gt;
&lt;br /&gt;
= Topology =&lt;br /&gt;
&lt;br /&gt;
== Products ==&lt;br /&gt;
&lt;br /&gt;
An OpenHome installation consists of products from a variety of manufacturers each bearing the [[Developer:ProductService|Product service]].&lt;br /&gt;
&lt;br /&gt;
Amongst other information, each product has:&lt;br /&gt;
&lt;br /&gt;
* Room (user configurable, defaults to 'Main Room')&lt;br /&gt;
&lt;br /&gt;
* Name (user configurable, defaults to the model name)&lt;br /&gt;
&lt;br /&gt;
* Source Count (fixed according to the capabilities of the product)&lt;br /&gt;
&lt;br /&gt;
* List of Sources, each with its own Type, Name, and Visibility&lt;br /&gt;
&lt;br /&gt;
* Attributes, identifying additional functionality offered by the product&lt;br /&gt;
&lt;br /&gt;
== Proper Configuration ==&lt;br /&gt;
&lt;br /&gt;
The name of each product represents its audio output.&lt;br /&gt;
&lt;br /&gt;
The name of each source represents an audio input (either internal or external).&lt;br /&gt;
&lt;br /&gt;
In a properly configured system, if one product is connected to another using an audio cable, then the name of the product sending the audio should match the name of the source receiving the audio. It is by matching these names that a Control Point is able to select the correct input on, for instance, a preamp when a particular source is selected.&lt;br /&gt;
&lt;br /&gt;
== Discovering An OpenHome Av System ==&lt;br /&gt;
&lt;br /&gt;
The correct way to discover an OpenHome Av system is to:&lt;br /&gt;
&lt;br /&gt;
* search for all units bearing the Product service&lt;br /&gt;
&lt;br /&gt;
* subscribe to each Product service&lt;br /&gt;
&lt;br /&gt;
* group these products according to their Room.&lt;br /&gt;
&lt;br /&gt;
* collect the name of all the sources in each product&lt;br /&gt;
&lt;br /&gt;
* match the names of the sources to the names of the products to create a set of tree structures in each room.&lt;br /&gt;
&lt;br /&gt;
== Source Functionality ==&lt;br /&gt;
&lt;br /&gt;
To determine the kind of functionality available on each source, inspect its type.&lt;br /&gt;
&lt;br /&gt;
If it has type Playlist, it additionally contains the [[Av:Developer:PlaylistService|Playlist service]]&lt;br /&gt;
&lt;br /&gt;
If it has type Radio, it additionally contains the [[Av:Developer:RadioService|Radio service]]&lt;br /&gt;
&lt;br /&gt;
If it has type Receiver, it additionally contains the [[Av:Developer:ReceiverService|Receiver service]]&lt;br /&gt;
&lt;br /&gt;
== Volume Control ==&lt;br /&gt;
&lt;br /&gt;
Products that offer volume control include the Volume attribute and the [[Av:Developer:VolumeService|Volume service]]&lt;br /&gt;
&lt;br /&gt;
The primary volume control offered by a control point should be the one situated nearest the root in the tree structure that contains the current source.&lt;br /&gt;
&lt;br /&gt;
Control points may optionally provide the user with control of the volume of each product within the tree.&lt;br /&gt;
&lt;br /&gt;
== Now Playing Information ==&lt;br /&gt;
Products that provide information concerning the currently playing media include the [[Av:Developer:InfoService|Info service]]&lt;br /&gt;
&lt;br /&gt;
Products that report the duration of the currently playing track include the [[Av:Developer:TimeService|Time service]]&lt;br /&gt;
&lt;br /&gt;
== Multiroom Functionality ==&lt;br /&gt;
&lt;br /&gt;
The [[Av:Developer:SenderService|Sender service]] indicates the presence of an OpenHome Av sender and provides information concerning that sender.&lt;br /&gt;
&lt;br /&gt;
An OpenHome Av sender broadcasts music on a network in a way that is playable by an OpenHome Av receiver.&lt;br /&gt;
&lt;br /&gt;
The [[Av:Developer:ReceiverService|Receiver service]] provides the means for controlling a Receiver source. If a device's [[Developer:ProductService|Product service]] reports a source of type 'Receiver', then that device is guaranteed to bear the Receiver service.&lt;br /&gt;
&lt;br /&gt;
= Services =&lt;br /&gt;
&lt;br /&gt;
==== Product ====&lt;br /&gt;
[[Av:Developer:ProductService|Product service]]&lt;br /&gt;
&lt;br /&gt;
==== Playlist ====&lt;br /&gt;
[[Av:Developer:PlaylistService|Playlist service]]&lt;br /&gt;
==== Radio ====&lt;br /&gt;
[[Av:Developer:RadioService|Radio service]]&lt;br /&gt;
==== Info ====&lt;br /&gt;
[[Av:Developer:InfoService|Info service]]&lt;br /&gt;
==== Time ====&lt;br /&gt;
[[Av:Developer:TimeService|Time service]]&lt;br /&gt;
==== Volume ====&lt;br /&gt;
[[Av:Developer:VolumeService|Volume service]]&lt;br /&gt;
==== Sender ====&lt;br /&gt;
[[Av:Developer:SenderService|Sender service]]&lt;br /&gt;
==== Receiver ====&lt;br /&gt;
[[Av:Developer:ReceiverService|Receiver service]]&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	<entry>
		<id>http://wiki.openhome.org/wiki/OhMedia:Developer</id>
		<title>OhMedia:Developer</title>
		<link rel="alternate" type="text/html" href="http://wiki.openhome.org/wiki/OhMedia:Developer"/>
				<updated>2011-05-05T09:06:17Z</updated>
		
		<summary type="html">&lt;p&gt;Joshh: /* Multiroom Functionality */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Introduction =&lt;br /&gt;
&lt;br /&gt;
OpenHome Av is an independent standard for networked audio visual devices. OpenHome Av products all have a standard way of presenting themselves to the network. This makes it possible to write generic Control Point software that is able to control those products independent of manufacturer or specific features.&lt;br /&gt;
&lt;br /&gt;
The technologies associated with making this possible are grouped under the term OpenHome Av Topology.&lt;br /&gt;
&lt;br /&gt;
If a developer wishes to write generic software that participates in the aims described above, then they should write that software in a way that conforms to the strategies and algorithms of OpenHome Av Topology, which is described below&lt;br /&gt;
&lt;br /&gt;
= Topology =&lt;br /&gt;
&lt;br /&gt;
== Products ==&lt;br /&gt;
&lt;br /&gt;
An OpenHome installation consists of products from a variety of manufacturers each bearing the [[Developer:ProductService|Product service]].&lt;br /&gt;
&lt;br /&gt;
Amongst other information, each product has:&lt;br /&gt;
&lt;br /&gt;
* Room (user configurable, defaults to 'Main Room')&lt;br /&gt;
&lt;br /&gt;
* Name (user configurable, defaults to the model name)&lt;br /&gt;
&lt;br /&gt;
* Source Count (fixed according to the capabilities of the product)&lt;br /&gt;
&lt;br /&gt;
* List of Sources, each with its own Type, Name, and Visibility&lt;br /&gt;
&lt;br /&gt;
* Attributes, identifying additional functionality offered by the product&lt;br /&gt;
&lt;br /&gt;
== Proper Configuration ==&lt;br /&gt;
&lt;br /&gt;
The name of each product represents its audio output.&lt;br /&gt;
&lt;br /&gt;
The name of each source represents an audio input (either internal or external).&lt;br /&gt;
&lt;br /&gt;
In a properly configured system, if one product is connected to another using an audio cable, then the name of the product sending the audio should match the name of the source receiving the audio. It is by matching these names that a Control Point is able to select the correct input on, for instance, a preamp when a particular source is selected.&lt;br /&gt;
&lt;br /&gt;
== Discovering An OpenHome Av System ==&lt;br /&gt;
&lt;br /&gt;
The correct way to discover an OpenHome Av system is to:&lt;br /&gt;
&lt;br /&gt;
* search for all units bearing the Product service&lt;br /&gt;
&lt;br /&gt;
* subscribe to each Product service&lt;br /&gt;
&lt;br /&gt;
* group these products according to their Room.&lt;br /&gt;
&lt;br /&gt;
* collect the name of all the sources in each product&lt;br /&gt;
&lt;br /&gt;
* match the names of the sources to the names of the products to create a set of tree structures in each room.&lt;br /&gt;
&lt;br /&gt;
== Source Functionality ==&lt;br /&gt;
&lt;br /&gt;
To determine the kind of functionality available on each source, inspect its type.&lt;br /&gt;
&lt;br /&gt;
If it has type Playlist, it additionally contains the [[Av:Developer:PlaylistService|Playlist service]]&lt;br /&gt;
&lt;br /&gt;
If it has type Radio, it additionally contains the [[Av:Developer:RadioService|Radio service]]&lt;br /&gt;
&lt;br /&gt;
If it has type Receiver, it additionally contains the [[Av:Developer:ReceiverService|Receiver service]]&lt;br /&gt;
&lt;br /&gt;
== Volume Control ==&lt;br /&gt;
&lt;br /&gt;
Products that offer volume control include the Volume attribute and the [[Av:Developer:VolumeService|Volume service]]&lt;br /&gt;
&lt;br /&gt;
The primary volume control offered by a control point should be the one situated nearest the root in the tree structure that contains the current source.&lt;br /&gt;
&lt;br /&gt;
Control points may optionally provide the user with control of the volume of each product within the tree.&lt;br /&gt;
&lt;br /&gt;
== Now Playing Information ==&lt;br /&gt;
Products that provide information concerning the currently playing media include the [[Av:Developer:InfoService|Info service]]&lt;br /&gt;
&lt;br /&gt;
Products that report the duration of the currently playing track include the [[Av:Developer:TimeService|Time service]]&lt;br /&gt;
&lt;br /&gt;
== Multiroom Functionality ==&lt;br /&gt;
&lt;br /&gt;
The [[Av:Developer:SenderService|Sender service]] indicates the presence of an OpenHome Av sender and provides information concerning that sender.&lt;br /&gt;
&lt;br /&gt;
An OpenHome Av sender broadcasts music on a network in a way that is playable by an OpenHome Av [[Developer:ReceiverService|receiver]].&lt;br /&gt;
&lt;br /&gt;
The [[Av:Developer:ReceiverService|Receiver service]] provides the means for controlling a Receiver source. If a device's [[Developer:ProductService|Product service]] reports a source of type 'Receiver', then that device is guaranteed to bear the Receiver service.&lt;br /&gt;
&lt;br /&gt;
= Services =&lt;br /&gt;
&lt;br /&gt;
==== Product ====&lt;br /&gt;
[[Av:Developer:ProductService|Product service]]&lt;br /&gt;
&lt;br /&gt;
==== Playlist ====&lt;br /&gt;
[[Av:Developer:PlaylistService|Playlist service]]&lt;br /&gt;
==== Radio ====&lt;br /&gt;
[[Av:Developer:RadioService|Radio service]]&lt;br /&gt;
==== Info ====&lt;br /&gt;
[[Av:Developer:InfoService|Info service]]&lt;br /&gt;
==== Time ====&lt;br /&gt;
[[Av:Developer:TimeService|Time service]]&lt;br /&gt;
==== Volume ====&lt;br /&gt;
[[Av:Developer:VolumeService|Volume service]]&lt;br /&gt;
==== Sender ====&lt;br /&gt;
[[Av:Developer:SenderService|Sender service]]&lt;br /&gt;
==== Receiver ====&lt;br /&gt;
[[Av:Developer:ReceiverService|Receiver service]]&lt;/div&gt;</summary>
		<author><name>Joshh</name></author>	</entry>

	</feed>