<?xml version="1.0" encoding="us-ascii"?>
<?oxygen SCHSchema="http://myurc.org/ns/uisocketdesc/uisocketdesc.sch"?>
<!--
	This is a UI Socket Description (based on ISO/IEC 24752-2) for streaming content from a set of available UPnP MediaServers 1.0 and a set of 
	available UPnP MediaRenderers 1.0 (see http://www.upnp.org/standardizeddcps/mediaserver.asp).  The Socket builds on state variables and 
	actions of ContentDirectory service (service type urn:schemas-upnp-org:service:ContentDirectory:1), AVTransport Service 
	(service type urn:schemas-upnp-org:service:AVTransport:1), RenderingControl Service (urn:schemas-upnp-org:service:RenderingControl:1) 
	and ConnectionManagerService (urn:schemas-upnp-org:service:ConnectionManager:1).  Note that the AVTransport Service can be either on the 
	server or renderer side, depending on the transfer protocol, but this is transparent to the user.  
	
	The UI Socket follows a task-oriented approach in defining UI Sockets.  It is a cross-device socket, involving functions of the MediaServer and 
	MediaRenderer.  Typically this socket would be exposed by a gateway device such as the Universal Control Hub.  However, it is possible, for 
	example, that a MediaServer device would act as a control point to a MediaRenderer and expose this socket, or vice versa.
	
	Note: This is one of two alternate versions of a MediaServer Socket.  It employs a flat-browsing approach ("Level 1") for the content to be played 
	from the MediaServer.  It contains no XML coding for the content of the socket elements.  Additional Socket elements serve for navigation of the 
	digital media item tree. The other version is play-2.uis which is exposing the directory of digital media as an XML document in the DIDL-LITE 
	namespace.
	
	Note on MIME type: This document should be served with a MIME type of "application/urc-uisocketdesc+xml", if applicable.
	
	Copyright: Access Technologies Group, Germany, 2007-2008.  
	This work is licensed under a Creative Commons Attribution-Share Alike 3.0 United States License.  
	To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/3.0/us/.
-->

<uiSocket about="http://res.myurc.org/upnp/av/play-1.uis" id="level1socket"
	xmlns="http://myurc.org/ns/uisocketdesc" xmlns:uis="http://myurc.org/ns/uisocketdesc"
	xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/"
	xmlns:upnp="urn:schemas-upnp-org:metadata-1-0/upnp/" xmlns:upnp-av="urn:schemas-upnp-org:av:av"
	xmlns:uis-upnp="http://myurc.org/ns/uis-upnp" xmlns:res-types="http://myurc.org/ns/res-types"
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://myurc.org/ns/uisocketdesc http://myurc.org/ns/uisocketdesc 
		http://purl.org/dc/elements/1.1/ http://www.dublincore.org/schemas/xmls/qdc/2003/04/02/dc.xsd 
		http://purl.org/dc/terms/ http://www.dublincore.org/schemas/xmls/qdc/2003/04/02/dcterms.xsd 
		urn:schemas-upnp-org:metadata-1-0/upnp/ http://www.upnp.org/schemas/av/upnp-v2-20060531.xsd 
		urn:schemas-upnp-org:av:av http://www.upnp.org/schemas/av/av-v1-20060531.xsd 
		http://myurc.org/ns/uis-upnp http://myurc.org/ns/uis-upnp
		http://myurc.org/ns/res-types http://myurc.org/ns/res-types">
	<!--Note to namespaces: The URC is expected to recognize types associated with these namespaces, either by look-up or by built-in capabilities.-->
	<dc:creator>Gottfried Zimmermann</dc:creator>
	<dc:publisher>URC Consortium</dc:publisher>
	<dc:rights>Copyright 2007-2008, Access Technologies Group. This work is licensed under a
		Creative Commons Attribution-Share Alike 3.0 United States License. To view a copy of this
		license, visit http://creativecommons.org/licenses/by-sa/3.0/us/.</dc:rights>
	<dcterms:conformsTo>http://myurc.org/iso24752-2/2007</dcterms:conformsTo>
	<dcterms:modified>2008-09-29</dcterms:modified>
	<mapping platform="upnp-av">
		<uis-upnp:annotation>Note: The socket description contains data relevant for the user
			interface only. Other data may be stored internally such as connection manager specific
			instanceIDs, etc.</uis-upnp:annotation>
	</mapping>
	<set id="mediaServers" dim="upnp-av:UDN">
		<!--Ideally, friendly names of the media servers should be made available as dynamic labels for values of uis-upnp:UDN-List.  However, this is not possible since a dimension can only refer to types, not to variables. -->
		<dc:description xml:lang="en">Each instance of this set (i.e. set of subelements) represents
			an available media server. From each server, the user can pick the digital media to play
			(reflected by the variable "selectedBrowseId"). There are two methods for the user to
			select content: browsing or searching.</dc:description>
		<dependency>
			<insert>false()</insert>
		</dependency>

		<variable id="mediaServerFriendlyName" type="xsd:string"><!--Open issue: This variable will not be needed if we can find a way for TAs to deliver dynamic resources for values of external types (in this case values of upnp-av:UDN).-->
			<dc:description xml:lang="en">Friendly name of media server.  This is typically a user-configured string, such as "NAS in kitchen".</dc:description>
			<mapping platform="upnp-av">
				<uis-upnp:annotation>Friendly name from device description.</uis-upnp:annotation>
			</mapping>
			<dependency>
				<relevant>true()</relevant>
				<write>false()</write>
			</dependency>
		</variable>
		<variable id="mediaServerUDN" type="xsd:string" includesRes="true">
		<dependency>
			<relevant>true()</relevant>
			<write>false()</write>
		</dependency>
		</variable>
		<variable id="isMediaServerSelected" type="xsd:boolean">
			<dc:description xml:lang="en">Indicates that this is the currently selected media server
				to be used for establishing a connection. Note that only one media server can be
				selected at a time, i.e. another media server will be automatically deselected.</dc:description>

			<dependency>
				<relevant>true()</relevant>
				<write>true()</write>
			</dependency>
		</variable>
		<variable id="mediaServerProtocols" type="uis:csvlist" includesRes="true" final="true">
		<!--type should be uis:csvlist of upnp-uis:connectionProtocol, but this is not possible to express. -->
		<dc:description xml:lang="en">CSV list of available connection protocols
		(in ProtocolInfo coding) that can be used for playing content from the selected Media Server
		(source) .
		 Comes with resources, such as labels (human-readable description of connection such as "JPEG over HTTP").  
		 </dc:description>
		<dependency>
			<relevant>false()</relevant>
			<write>false()</write>
		</dependency>
		</variable>


		<variable id="searchCapabilities" type="uis:csvlist">
			<dc:description xml:lang="en">Search capabilities of the currently selected media
				server. SearchCapabilities is a CSV list of property names that can be used in
				search queries. An empty string indicates that the CDS does not support any kind of
				searching. A wildcard ('*') indicates that the device supports search queries using
				all tags present in the CDS. Note 1: The "smart" URC may use this variable to tweak
				its user interface for searching. Note 2: Since there is no pertinent type
				definition in the upnp namespace, we are using uis:csvlist here.</dc:description>
			<mapping platform="upnp-av">
				<uis-upnp:annotation>Maps to return value of UPnP action GetSearchCapabilities.
					Should be called at initialization and every time the user changes the selected
					media server.</uis-upnp:annotation>
			</mapping>
			<dependency>
				<relevant>false()</relevant>
				<write>false()</write>
			</dependency>
		</variable>
		<variable id="sortCapabilities" type="uis:csvlist">
			<dc:description xml:lang="en">Sort capabilities of the currently selected media server.
				SortCapabilities is a CSV list of tags that the CDS can use to sort Search() or
				Browse() results. An empty string indicates that the device does not support any
				kind of sorting. A wildcard ('*') indicates that the device supports sorting using
				all tags present in the Content Directory. Note: Since there is no pertinent type
				definition in the upnp namespace, we are using uis:csvlist here.</dc:description>
			<mapping platform="upnp-av">
				<uis-upnp:annotation>Maps to return value of UPnP action GetSortCapabilities. Should
					be called at initialization and every time the user changes the selected media
					server.</uis-upnp:annotation>
			</mapping>
			<dependency>
				<relevant>false()</relevant>
				<write>false()</write>
			</dependency>
		</variable>
		<set id="browsing">
			<command id="browse" type="uis:basicCommand">
				<dc:description xml:lang="en">This command allows the invoker to browse the content
					directory. </dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>Action Browse in CDS.</uis-upnp:annotation>
				</mapping>
				<param id="browseContainerId" dir="in" type="xsd:string">
					<dc:description xml:lang="en"></dc:description>
				</param>
				<param id="browseFilter" type="uis:csvlist" dir="in">
					<dc:description xml:lang="en">browseFilter determines the set of properties of
						digital media items presented in variable "content". Comma-separated list of
						property specifiers (including namespaces); indicates which metadata properties
						are to be returned in the results from browsing. Both properties represented in
						CDS query results as XML elements, as well as properties represented as element
						attributes, may be included in the comma-separated list. If the Filter parameter
						is equal to "*", all properties are returned. As a rule, all required properties
						are returned, but no optional properties will be returned unless explicitly
						requested in the filter. Note: Since there is no pertinent type definition in
						the upnp namespace, we are using uis:csvlist here.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Maps to the parameter Filter of action Browse. If
							browseFilter is changed by the user, variable "content" needs to get
							updated.</uis-upnp:annotation>
					</mapping>
				</param>
				<param id="browseSortCriteria" type="uis:csvlist" dir="in">
					<dc:description xml:lang="en">browseSortCriteria determines how the digital media
						items are sorted in variable "content". Comma-separated list of signed property
						names, where signed means preceded by '+' or '-' sign. The '+' and '-' indicate
						the sort is in ascending or descending order, respectively, with regard to the
						value of its associated property. Properties appear in the list in order of
						descending sort priority. For example, a value of
						"+upnp:artist,-dc:date,+dc:title" would sort first on artist in ascending order,
						then within each artist by date in descending order (most recent first) and
						finally by title in ascending order. Note 1: Possible values of
						browseSortCriteria are constrained by sortCapabilities. Note 2: A "knowledgeable
						URC" could provide a custom-made user interface with lists and checkboxes to
						fill this variable, and based on the possibilities of sorting described in
						sortCapabilities. Note 3: Since there is no pertinent type definition in the
						upnp namespace, we are using uis:csvlist here.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Maps to the parameter SortCriteria of action Browse. If
							browseSortCriteria is changed by the user, variable "content" needs to get
							updated.</uis-upnp:annotation>
					</mapping>
				</param>
				<param idref="browseContent" dir="out">
					<dc:description xml:lang="en">The result of the browse operation is reflected in the socket
						elements of the set "browseContent". </dc:description>
				</param>
			</command>
			
			<set id="browseContent">
				<variable id="selectedBrowseId" type="xsd:string">
					<dc:description xml:lang="en">Id of the node from content that is currently selected for
						playing. This node is in focus for a play operation. </dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Serves as parameter for a play operation.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<write>false()</write>
					</dependency>
				</variable>
				<variable id="isNextNodeAvailable" type="xsd:boolean">
					<dc:description>Is Next Node available or not?</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>
				</variable>
				<variable id="isPrevNodeAvailable" type="xsd:boolean">
					<dc:description>Is Previous Node available or not?</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>
				</variable>
				<variable id="isParentNodeAvailable" type="xsd:boolean">
					<dc:description>Is Parent Node available or not?</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>
				</variable>
				<variable id="isFirstChildNodeAvailable" type="xsd:boolean">
					<dc:description>Is First Child Node available or not?</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>
				</variable>
				<command id="nextNode" type="uis:voidCommand">
					<!--Navigates to the next node on the same level as the current node.-->
					<dependency>
						<!--The execute dependency can probably be specified stricter in dependendance on the fields.-->
						<relevant>true()</relevant>
						<write>true()</write>
					</dependency>
				</command>
				<command id="prevNode" type="uis:voidCommand">
					<!--Navigates to the previous node on the same level as the current node.-->
					<dependency>
						<!--The execute dependency can probably be specified stricter in dependendance on the fields.-->
						<relevant>true()</relevant>
						<write>true()</write>
					</dependency>
				</command>
				<command id="firstChildNode" type="uis:voidCommand">
					<!--Navigates to the first node on the child level of the current node.-->
					<dependency>
						<!--The execute dependency can probably be specified stricter in dependendance on the fields.-->
						<relevant>true()</relevant>
						<write>true()</write>
					</dependency>
				</command>
				<command id="parentNode" type="uis:voidCommand">
					<!--Navigates to the parent node of the current node.-->
					<dependency>
						<!--The execute dependency can probably be specified stricter in dependendance on the fields.-->
						<relevant>true()</relevant>
						<write>true()</write>
					</dependency>
				</command>
				<variable id="selectedNodeTitle" type="xsd:string">
					<!--didl-lite:parentID attribute value of selected node.  Required for nodes of any class.-->
					<dc:description> Name of the currently selected node. </dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>
				</variable>
				<variable id="selectedNodeIndex" type="xsd:unsignedInt">
					<!--Open issue: Is xsd:unsigned the right type?-->
					<!--Binding: Retrieved from Browse results.-->
					<dc:description> Index of currently selected node in the list of its siblings.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>

				</variable>
				<variable id="totalTracks" type="xsd:unsignedInt">
					<dc:description>Total number of tracks in the present container being browsed.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>

				</variable>
				<variable id="parentID" type="xsd:string">
					<!--didl-lite:parentID attribute value of selected node.  Required for nodes of any class.-->
					<dc:description>id property of object's parent. The parentID of the Content
						Directory 'root' container must be set to the reserved value of "-1". No
						other parentID attribute of any other Content Directory object may take this
						value.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>

				</variable>
				<variable id="childCount" type="xsd:integer">
					<!--didl-lite:childCount attribute value of selected node.  Optional for nodes of class object.container.-->
					<dc:description>Child count for the object. Applies to containers only.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>

				</variable>
				<variable id="class" type="upnp:classType">
					<!--Binding: class property of selected node.  Required for nodes of any class.-->
					<dc:description>Type of the currently selected node: folder or item. Note:
						Although this information can be retrieved from xmlContent, this variable is
						defined for expressing dependencies.</dc:description>

				</variable>
				<variable id="searchable" type="xsd:boolean">
					<!--Binding: didl-lite:searchable attribute value of node with selectedBrowseId.  -->
					<dc:description>When true, the ability to perform a Search() action under a
						container is enabled, otherwise a Search() under that container will return
						no results. Note: Although this information can be retrieved from
						xmlContent, this variable is defined for expressing dependencies.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>

				</variable>
				<variable id="restricted" type="xsd:boolean">
					<!--didl-lite:restricted attribute value of selected node.  Required for nodes of any class.-->
					<dc:description>When true, ability to modify a given object is confined to the
						Content Directory Service. Control point metadata write access is disabled.
						Note: Although this information can be retrieved from xmlContent, this
						variable is defined for expressing dependencies.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>

				</variable>
				<variable id="writeStatus" type="upnp:writeStatusType">
					<!--upnp:writeStatus element value of selected node.  Optional for nodes of any class.-->
					<dc:description>When present, controls the modifiability of the resources of a
						given object. Ability of a Control Point to change writeStatus of a given
						resource(s) is implementation dependent. Allowed values are: WRITABLE,
						PROTECTED, NOT_WRITABLE, UNKNOWN, MIXED. Note: Although this information can
						be retrieved from xmlContent, this variable is defined for expressing
						dependencies.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>true()</write>
						<!--Ability of a Control Point to change writeStatus of a given resource(s) is implementation dependent. -->
					</dependency>
				</variable>
				<variable id="res" type="uriListType">
					<!--Binding: DIDL-LITE res element of selected node.-->
					<dc:description>Resource, typically a media file, associated with the object.
						Values must be properly escaped URIs as described in [RFC 2396].
						Space-separated list of didl-lite:res element values of selected node.
						Optional for nodes of any class.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>

				</variable>
				<!--Binding note: searchClass not implemented for this socket.-->
				<variable id="createClasses" type="classListType">
					<!--upnp:createClass element values of selected node.  Optional for nodes of class object.container.-->
					<dc:description>Create class of the associated container object. If restricted =
						false, then * If no createClass elements are specified, then CreateObject
						can create any class of object under the container * If createClass elements
						are specified then, CreateObject can only create classes of objects
						specified in the createClass tags * createClass is optional * createClass
						semantics are per container, there is no parent-child relationship, they
						only apply to CreateObject actions in that container</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>value('class')=='object.container' and not(value('restricted')) and
							value('writeStatus'))!='NOT_WRITABLE' and
							value('writeStatus'))!='PROTECTED')</write>
					</dependency>
				</variable>
				<variable id="refID" type="xsd:string">
					<!--didl-lite:refID attribute value of selected node.  Optional for nodes of class object.item.-->
					<dc:description>id property of the item being referred to.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>

				</variable>
				<variable id="metadata" type="xsd:string" dim="metadataIndexType">
					<!--Binding: Result of action Browse. 1-dimensional array containing the metadata fields pertaining to the currently selected node (container or item).  The fields must be a subset of those given in metadataIndexType.  If updated by the user, this triggers the UPnP action UpdateObject.-->
					<!--Open issue: Initiate user notification before modifying metadata?-->
					<dc:description>Set of human-readable metadata information pertaining to the
						currently selected node (container or item). Each metadata item can be
						modified by the user; which will immediately impact the Note: At least one
						modification can be reversed by the undo command.</dc:description>
					<dependency>
						<relevant>true()</relevant>
						<write>not(value('restricted')) and value('writeStatus'))!='NOT_WRITABLE'
							and value('writeStatus'))!='PROTECTED')</write>
					</dependency>
				</variable>
			</set>

		</set>
		<set id="searching">
			<command id="search" type="uis:basicCommand" optional="true">
				<dc:description xml:lang="en">This command allows the invoker to search the content
					directory for objects that match some search criteria. The search criteria are
					specified as a query string operating on properties with comparison and logical
					operators. Note 1: The search command is independent from browsing, and has its own
					result "variable" as an output parameter. However, a client may show the results of
					the search in the content tree if it wishes so. Note 2: It should be possible for a
					client to provide an incremental search function based on the user's partial input,
					by invoking the search command multiple times (incrementally).</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>Action Search in CDS. Parameters:
						ContainerID=searchContainerId; SearchCriteria=searchCriteria;
						Filter=searchFilter; SortCriteria=searchSortCriteria; StartingIndex and
						RequestedCount implicit. Result is presented as output parameter
						"searchResult".</uis-upnp:annotation>
				</mapping>
				<param id="searchContainerId" type="xsd:string" dir="in">
					<dc:description xml:lang="en">Unique identifier of the container in which to begin
						searching. A ContainerID value of zero corresponds to the root object of the
						Content Directory. Note: Searchable must be true for the 	container.</dc:description>
				</param>
				<param id="searchCriteria" type="uis:csvlist" dir="in">
					<dc:description xml:lang="en">Search string for expert users. The SearchCriteria
						parameter gives one or more search criteria to be used for querying the Content
						Directory. For syntax details refer to CD 1.0 spec, 2.5.5.1. SearchCriteria
						String Syntax. Note 1: Possible values are constrained by searchCapabilities.
						Note 2: A "smart" URC may generate the searchCriteria string from a more
						user-friendly set of widgets. Note 3: Since there is no pertinent type
						definition in the upnp namespace, we are using xsd:string here.</dc:description>
				</param>
				<!--Open issue: Remove searchFilter and SearchSortCriteria, and define defaults for them instead?  Or replace by a simple sort criteria variable of type metadataIndexType? -->
				<param id="searchFilter" type="uis:csvlist" dir="in">
					<dc:description xml:lang="en">Comma-separated list of property specifiers (including
						namespaces); indicates which metadata properties are to be returned in the
						results from searching. Both properties represented in CDS query results as XML
						elements, as well as properties represented as element attributes, may be
						included in the comma-separated list. If the Filter parameter is equal to "*",
						all properties are returned. As a rule, all required properties are returned,
						but no optional properties will be returned unless explicitly requested in the
						filter. Note 1: A "smart" URC may generate the searchFilter list from a more
						user-friendly set of widgets. Note 2: Since there is no pertinent type
						definition in the upnp namespace, we are using uis:csvlist
						here.</dc:description>
				</param>
				<param id="searchSortCriteria"  type="uis:csvlist" dir="in">
					<dc:description xml:lang="en">CSV list of signed property names, where signed means
						preceded by '+' or '-' sign. The '+' and '-' indicate the sort is in ascending
						or descending order, respectively, with regard to the value of its associated
						property. Properties appear in the list in order of descending sort priority.
						For example, a value of "+upnp:artist,-dc:date,+dc:title" would sort first on
						artist in ascending order, then within each artist by date in descending order
						(most recent first) and finally by title in ascending order. Note 1: This value
						is constrained by sortCapabilities. Note 2: A "smart" URC would present this in
						a user-friendly way. Note 3: Since there is no pertinent type definition in the
						upnp namespace, we are using uis:csvlist here.</dc:description>
				</param>
				<param idref="searchContent" dir="out">
					<dc:description xml:lang="en">The result of the search is reflected in the socket
						elements of the set "content". No separate socket elements for the search result
						are available.</dc:description>
					<!--Open issue: Should we have a separate set of variables for displaying the search results?  But in a simple user interface, there will most likely be only one set of components for both the browse result and the search result...-->
				</param>
			</command>
			
			<set id="searchContent">
				<variable id="selectedSearchId" type="xsd:string">
					<dc:description xml:lang="en">Id of the node from search content that is currently selected for
						playing. This node is in focus for a play operation. </dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Serves as parameter for a play operation.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<write>false()</write>
					</dependency>
				</variable>
				<variable id="searchIsNextNodeAvailable" type="xsd:boolean">
					<dc:description>Is Next Node available or not?</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>
				</variable>
				<variable id="searchIsPrevNodeAvailable" type="xsd:boolean">
					<dc:description>Is Previous Node available or not?</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>
				</variable>
				<command id="searchNextNode" type="uis:voidCommand">
					<dependency>
						<relevant>true()</relevant>
						<write>true()</write>
					</dependency>
				</command>
				<command id="searchPrevNode" type="uis:voidCommand">
					<dependency>
						<relevant>true()</relevant>
						<write>true()</write>
					</dependency>
				</command>
				<variable id="searchedNodeTitle" type="xsd:string">
					<dc:description> Name of the currently selected node. </dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>
				</variable>
				<variable id="searchedNodeIndex" type="xsd:unsignedInt">
					<dc:description> Index of currently selected node in the list of its siblings.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>
				</variable>
				<variable id="totalSearchedTracks" type="xsd:unsignedInt">
					<dc:description>Total number of tracks in the present container being browsed.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>
				</variable>
				<variable id="searchClass" type="upnp:classType">
					<dc:description>Type of the currently selected node: folder or item. Note:
						Although this information can be retrieved from xmlContent, this variable is
						defined for expressing dependencies.</dc:description>
				</variable>
				<variable id="searchWriteStatus" type="upnp:writeStatusType">
					<dc:description>When present, controls the modifiability of the resources of a
						given object. Ability of a Control Point to change writeStatus of a given
						resource(s) is implementation dependent. Allowed values are: WRITABLE,
						PROTECTED, NOT_WRITABLE, UNKNOWN, MIXED. Note: Although this information can
						be retrieved from xmlContent, this variable is defined for expressing
						dependencies.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>true()</write>
					</dependency>
				</variable>
				<variable id="searchRes" type="uriListType">
					<dc:description>Resource, typically a media file, associated with the object.
						Values must be properly escaped URIs as described in [RFC 2396].
						Space-separated list of didl-lite:res element values of selected node.
						Optional for nodes of any class.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>
				</variable>
				<variable id="searchRefID" type="xsd:string">
					<dc:description>id property of the item being referred to.</dc:description>
					<dependency>
						<relevant>false()</relevant>
						<write>false()</write>
					</dependency>
				</variable>
				<variable id="searchMetadata" type="xsd:string" dim="metadataIndexType">
					<dc:description>Set of human-readable metadata information pertaining to the
						currently selected node (container or item). Each metadata item can be
						modified by the user; which will immediately impact the Note: At least one
						modification can be reversed by the undo command.</dc:description>
					<dependency>
						<relevant>true()</relevant>
						<write>not(value('restricted')) and value('writeStatus'))!='NOT_WRITABLE'
							and value('writeStatus'))!='PROTECTED')</write>
					</dependency>
				</variable>
			</set>
		</set>
	</set>
	
	<set id="mediaRenderers" dim="upnp-av:UDN">
		<!--Ideally, friendly names of the media players should be made available as dynamic labels for values of uis-upnp:UDN-List.  However, this is not possible since a dimension can only refer to types, not to variables. -->
		<dc:description xml:lang="en">Each instance of this set (i.e. set of subelements) represents
			an available media renderer. For each renderer, the user can set rendering control
			features with the renderer being connected or not connected.</dc:description>
		<dependency>
			<insert>false()</insert>
		</dependency>
		<variable id="mediaRendererFriendlyName" type="xsd:string"><!--Open issue: This variable will not be needed if we can find a way for TAs to deliver dynamic resources for values of external types (in this case values of upnp-av:UDN).-->
			<dc:description xml:lang="en">Friendly name of media renderer.  This is typically a user-configured string, such as "living room TV".</dc:description>
			<mapping platform="upnp-av">
				<uis-upnp:annotation>Friendly name from device description.</uis-upnp:annotation>
			</mapping>
			<dependency>
				<relevant>true()</relevant>
				<write>false()</write>
			</dependency>
		</variable>
		<variable id="mediaRendererUDN" type="xsd:string" includesRes="true">
		<dependency>
			<relevant>true()</relevant>
			<write>false()</write>
		</dependency>
		</variable>
		<variable id="isMediaRendererSelected" type="xsd:boolean">
			<dc:description xml:lang="en">Indicates that this is the currently selected media
				renderer to be used for establishing a connection. Note that only one media renderer
				can be selected at a time, i.e. another media renderer will be automatically
				deselected.</dc:description>

			<dependency>
				<relevant>true()</relevant>
				<write>true()</write>
			</dependency>
		</variable>

		

		<variable id="mediaRendererProtocols" type="uis:csvlist" includesRes="true" final="true">
		<!--type should be uis:csvlist of upnp-uis:connectionProtocol, but this is not possible to express. -->
			<dc:description xml:lang="en">CSV list of available connection protocols
						(in ProtocolInfo coding) that can be used for playing content from the selected Media Renderer
						(sink) .  
						 Comes with resources, such as labels (human-readable description of connection such as "JPEG over HTTP").  
			 </dc:description>
			 
			<dependency>
				<relevant>false()</relevant>
				<write>false()</write>
			</dependency>
		</variable>


		<set id="renderingcontrol">
			<dc:description xml:lang="en">This set contains elements pertaining to the rendering
				settings of the media renderer, applying to its post-mix settings
				(connection-independent).</dc:description>
			<mapping platform="upnp-av">
				<uis-upnp:annotation>***** Elements in this set are based on RenderingControl
					Service ***** Elements of this set bind to the UPnP actions with parameter
					instanceID=0. </uis-upnp:annotation>
			</mapping>
			<variable id="volumeMaxValue" type="xsd:unsignedShort" final="true" optional="true">
				<dc:description xml:lang="en">Upper value limit for variable volume. </dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>For initialization, extract upper limit for state variable
						Volume from XML Service Description for RenderingControl service of Target
						device (same for all channels).</uis-upnp:annotation>
				</mapping>
			</variable>
			<set id="presets">
				<dc:description xml:lang="en">This set contains pre-defined configuration settings
					for the selected media renderer.</dc:description>
				<variable id="presetNameList" type="uis:csvlist">
					<dc:description xml:lang="en">This variable contains a comma-separated list
						(i.e. CSV(string)) of valid preset names currently supported by this device.
						presetNameList must include "FactoryDefaults", and may include
						"InstallationDefaults". Its value changes if/when the device changes the set
						of presets that it supports. This may occur in conjunction with a
						vendor-defined action or some other non-UPnP event. This state variable will
						include any of the predefined presets that are supported by the device.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>UPnP action ListPresets for getting, and state variable
							LastChange for updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<relevant>true()</relevant>
						<write>false()</write>
					</dependency>
				</variable>
				<command id="selectPreset" type="uis:basicCommand">
					<dc:description xml:lang="en">This command restores (a subset) of the state
						variables to the values associated with the specified preset. The specified
						preset name may be one of those in presetNameList. The selected preset
						determines which state variables will be affected.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>UPnP action SelectPreset for setting. Getter method not
							available. No updates.</uis-upnp:annotation>
					</mapping>
					<param id="presetName" type="xsd:string" dir="in">
						<selection closed="true">
							<selectionSetDynamic id="presetNameSelectionId" varRef="presetNameList"
							/>
						</selection>
					</param>
					<param idref="video" dir="out"> </param>
					<param idref="chAudio" dir="out"> </param>
				</command>
			</set>
			<set id="video">
				<dc:description xml:lang="en">This set contains video rendering controls for the
					selected media renderer.</dc:description>
				<variable id="brightnessMaxValue" type="xsd:unsignedShort" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable brightness.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract upper limit for state
							variable Brightness from XML Service Description for RenderingControl
							service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="contrastMaxValue" type="xsd:unsignedShort" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable contrast.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract upper limit for state
							variable Contrast from XML Service Description for RenderingControl
							service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="sharpnessMaxValue" type="xsd:unsignedShort" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable sharpness.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract upper limit for state
							variable Sharpness from XML Service Description for RenderingControl
							service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="redVideoGainMaxValue" type="xsd:unsignedShort" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable redVideoGain.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract upper limit for state
							variable RedVideoGain from XML Service Description for RenderingControl
							service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="greenVideoGainMaxValue" type="xsd:unsignedShort" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable greenVideoGain.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract upper limit for state
							variable GreenVideoGain from XML Service Description for
							RenderingControl service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="blueVideoGainMaxValue" type="xsd:unsignedShort" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable blueVideoGain.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract upper limit for state
							variable BlueVideoGain from XML Service Description for RenderingControl
							service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="redVideoBlackLevelMaxValue" type="xsd:unsignedShort" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable redVideoBlackLevel.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract upper limit for state
							variable RedVideoBlackLevel from XML Service Description for
							RenderingControl service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="greenVideoBlackLevelMaxValue" type="xsd:unsignedShort" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable
						greenVideoBlackLevel.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract upper limit for state
							variable GreenVideoBlackLevel from XML Service Description for
							RenderingControl service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="blueVideoBlackLevelMaxValue" type="xsd:unsignedShort" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable
						blueVideoBlackLevel.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract upper limit for state
							variable BlueVideoBlackLevel from XML Service Description for
							RenderingControl service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="colorTemperatureMaxValue" type="xsd:unsignedShort" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable colorTemperature.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract upper limit for state
							variable ColorTemperature from XML Service Description for
							RenderingControl service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="horizontalKeystoneMinValue" type="xsd:short" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable horizontalKeystone.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract lower limit for state
							variable HorizontalKeystone from XML Service Description for
							RenderingControl service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="horizontalKeystoneMaxValue" type="xsd:short" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable horizontalKeystone.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract upper limit for state
							variable HorizontalKeystone from XML Service Description for
							RenderingControl service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="verticalKeystoneMinValue" type="xsd:short" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable verticalKeystone.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract lower limit for state
							variable VerticalKeystone from XML Service Description for
							RenderingControl service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="verticalKeystoneMaxValue" type="xsd:short" final="true"
					optional="true">
					<dc:description xml:lang="en">Upper value limit for variable verticalKeystone.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, extract upper limit for state
							variable VerticalKeystone from XML Service Description for
							RenderingControl service of Target device.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="brightness" type="xsd:unsignedShort" optional="true">
					<dc:description xml:lang="en">This unsigned integer variable represents the
						current brightness setting of the associated display device. Its value
						ranges from a minimum of 0 to some device specific maximum. A numerical
						change of 1 corresponds to the smallest incremental change that is supported
						by the device.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action GetBrightness for getting, SetBrightness for
							setting. State variable LastChange for updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<maxInclusive>value('brightnessMaxValue')</maxInclusive>
					</dependency>
				</variable>
				<variable id="contrast" type="xsd:unsignedShort" optional="true">
					<dc:description xml:lang="en">This unsigned integer variable represents the
						current contrast setting of the associated display device. Its value ranges
						from a minimum of 0 to some device specific maximum. A numerical change of 1
						corresponds to the smallest incremental change that is supported by the
						device.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action GetContrast for getting, SetContrast for
							setting. State variable LastChange for updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<maxInclusive>value('contrastMaxValue')</maxInclusive>
					</dependency>
				</variable>
				<variable id="sharpness" type="xsd:unsignedShort" optional="true">
					<dc:description xml:lang="en">This unsigned integer variable represents the
						current sharpness setting of the associated display device. Its value ranges
						from a minimum of 0 to some device specific maximum. A numerical change of 1
						corresponds to the smallest incremental change that is supported by the
						device.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action GetSharpness for getting, SetSharpness for
							setting. State variable LastChange for updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<maxInclusive>value('sharpnessMaxValue')</maxInclusive>
					</dependency>
				</variable>
				<variable id="redVideoGain" type="xsd:unsignedShort" optional="true">
					<dc:description xml:lang="en">This unsigned integer variable represents the
						current setting of the red "gain" control for the associated display device.
						Its value ranges from a minimum of 0 to some device specific maximum. A
						numerical change of 1 corresponds to the smallest incremental change that is
						supported by the device.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action GetRedVideoGain for getting, SetRedVideoGain for
							setting. State variable LastChange for updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<maxInclusive>value('redVideoGainMaxValue')</maxInclusive>
					</dependency>
				</variable>
				<variable id="greenVideoGain" type="xsd:unsignedShort" optional="true">
					<dc:description xml:lang="en">This unsigned integer variable represents the
						current setting of the green "gain" control for the associated display
						device. Its value ranges from a minimum of 0 to some device specific
						maximum. A numerical change of 1 corresponds to the smallest incremental
						change that is supported by the device.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action GetGreenVideoGain for getting, SetGreenVideoGain
							for setting. State variable LastChange for
						updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<maxInclusive>value('greenVideoGainMaxValue')</maxInclusive>
					</dependency>
				</variable>
				<variable id="blueVideoGain" type="xsd:unsignedShort" optional="true">
					<dc:description xml:lang="en">This unsigned integer variable represents the
						current setting of the blue "gain" control for the associated display
						device. Its value ranges from a minimum of 0 to some device specific
						maximum. A numerical change of 1 corresponds to the smallest incremental
						change that is supported by the device.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action GetBlueVideoGain for getting, SetBlueVideoGain
							for setting. State variable LastChange for
						updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<maxInclusive>value('blueVideoGainMaxValue')</maxInclusive>
					</dependency>
				</variable>
				<variable id="redVideoBlackLevel" type="xsd:unsignedShort" optional="true">
					<dc:description xml:lang="en">This unsigned integer variable represents the
						current setting for the minimum output intensity of red for the associated
						display device. Its value ranges from a minimum of 0 to some device specific
						maximum. A numerical change of 1 corresponds to the smallest incremental
						change that is supported by the device.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action GetRedVideoBlackLevel for getting,
							SetRedVideoBlackLevel for setting. State variable LastChange for
							updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<maxInclusive>value('redVideoBlackLevelMaxValue')</maxInclusive>
					</dependency>
				</variable>
				<variable id="greenVideoBlackLevel" type="xsd:unsignedShort" optional="true">
					<dc:description xml:lang="en">This unsigned integer variable represents the
						current setting for the minimum output intensity of green for the associated
						display device. Its value ranges from a minimum of 0 to some device specific
						maximum. A numerical change of 1 corresponds to the smallest incremental
						change that is supported by the device.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action GetGreenVideoBlackLevel for getting,
							SetGreenVideoBlackLevel for setting. State variable LastChange for
							updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<maxInclusive>value('greenVideoBlackLevelMaxValue')</maxInclusive>
					</dependency>
				</variable>
				<variable id="blueVideoBlackLevel" type="xsd:unsignedShort" optional="true">
					<dc:description xml:lang="en">This unsigned integer variable represents the
						current setting for the minimum output intensity of blue for the associated
						display device. Its value ranges from a minimum of 0 to some device specific
						maximum. A numerical change of 1 corresponds to the smallest incremental
						change that is supported by the device.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action GetBlueVideoBlackLevel for getting,
							SetBlueVideoBlackLevel for setting. State variable LastChange for
							updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<maxInclusive>value('blueVideoBlackLevelMaxValue')</maxInclusive>
					</dependency>
				</variable>
				<variable id="colorTemperature" type="xsd:unsignedShort" optional="true">
					<dc:description xml:lang="en">This unsigned integer variable represents the
						current setting for the "color quality" of white for the associated display
						device. Its value ranges from a minimum of 0 to some device specific
						maximum. A numerical change of 1 corresponds to the smallest incremental
						change that is supported by the device</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action GetColorTemperature for getting,
							SetColorTemperature for setting. State variable LastChange for
						updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<maxInclusive>value('colorTemperatureMaxValue')</maxInclusive>
					</dependency>
				</variable>
				<variable id="horizontalKeystone" type="xsd:short" optional="true">
					<dc:description xml:lang="en">This signed integer variable represents the
						current level of compensation for horizontal distortion of the associated
						display device. Its value ranges from device-specific negative number to a
						device specific positive number. Zero does not need to be in the middle of
						this range, although it will be for most devices. A numerical change of 1
						corresponds to the smallest incremental change that is supported by the
						device.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action GetHorizontalKeystone for getting,
							SetHorizontalKeystone for setting. State variable LastChange for
							updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<minInclusive>value('horizontalKeystoneMinValue')</minInclusive>
						<maxInclusive>value('horizontalKeystoneMaxValue')</maxInclusive>
					</dependency>
				</variable>
				<variable id="verticalKeystone" type="xsd:short" optional="true">
					<dc:description xml:lang="en">This signed integer variable represents the
						current level of compensation for vertical distortion of the associated
						display device. Its value ranges from device-specific negative number to a
						device specific positive number. Zero does not need to be in the middle of
						this range, although it will be for most devices. A numerical change of 1
						corresponds to the smallest incremental change that is supported by the
						device.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action GetVerticalKeystone for getting,
							SetVerticalKeystone for setting. State variable LastChange for
						updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<minInclusive>value('verticalKeystoneMinValue')</minInclusive>
						<maxInclusive>value('verticalKeystoneMaxValue')</maxInclusive>
					</dependency>
				</variable>
			</set>
			<set id="chAudio" dim="uis-upnp:channelType">
				<!--The set's repeating is based on uis-upnp:channelType, i.e. a subset of channelType will be used as indices.  The labels for the individual entries of channelType should be used to denote the individual group iterations.-->
				<dc:description xml:lang="en">This set contains audio settings per channel, for the
					selected media renderer.</dc:description>
				<variable id="chVolumeDBMinValue" type="xsd:short" final="true" optional="true">
					<dc:description xml:lang="en">Lower value limit for channel-specific variable
						volumeDB.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, call UPnP action
						GetVolumeDBRange.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="chVolumeDBMaxValue" type="xsd:short" final="true" optional="true">
					<dc:description xml:lang="en">Upper value limit for channel-specific variable
						volumeDB.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>For initialization, call UPnP action
						GetVolumeDBRange.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="chMute" type="xsd:boolean" optional="true">
					<dc:description xml:lang="en">"Mute" setting of the corresponding channel</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action SetMute for setting, GetMute for getting. State
							variable LastChange for updates.</uis-upnp:annotation>
					</mapping>
				</variable>
				<variable id="chVolume" type="xsd:unsignedShort" optional="true">
					<dc:description xml:lang="en">Volume of corresponding channel</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>Action SetVolume for setting, GetVolume for getting.
							State variable LastChange for updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<write>not(value('./chMute'))</write>
						<maxInclusive>value('./chVolumeMaxValue')</maxInclusive>
					</dependency>
				</variable>
				<variable id="chVolumeDB" type="xsd:short" optional="true">
					<dc:description xml:lang="en">This signed integer variable represents the
						current volume setting of the associated audio channel. Its value represents
						the current setting in units of "1/256 of a decibel (dB)". This means that a
						numeric change of 1 corresponds to a volume change of 1/256 dB. The value
						range for this variable is a minimum value of -32,767 (800116) (which
						equals -127.9961dB) and a maximum value of +32,767 (7FFF16) (which equals
						+127.9961dB). The value corresponding to 800016 is invalid. If there is any
						chVolumeDB variable, chVolumeDB[Master] must be present. Note that each
						chVolumeDB variable has its own value space (type).</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>UPnP action GetVolumeDB for getting, and SetVolumeDB
							for setting. State variable LastChange for
						updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<write>not(value('./chMute'))</write>
						<minInclusive>value('./chVolumeDBMinValue')</minInclusive>
						<maxInclusive>value('./chVolumeDBMaxValue')</maxInclusive>
					</dependency>
				</variable>
				<variable id="chLoudness" type="xsd:boolean" optional="true">
					<dc:description xml:lang="en">This boolean variable represents the current
						"loudness" setting of the associated audio channel. A value of TRUE
						indicates that the loudness effect is active.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>UPnP action GetLoudness for getting, SetLoudness for
							setting. State variable LastChange for updates.</uis-upnp:annotation>
					</mapping>
					<dependency>
						<write>not(value('./chMute'))</write>
					</dependency>
				</variable>
			</set>
		</set>
	</set>
	
	<command id="connect" type="uis:timedCommand">
		<dc:description xml:lang="en">Open a connection between the selected media server and media
			renderer for playing content. Command state shall reflect success or failure. After
			successful invocation, the "connections" set has a new actual index which specifies the
			newly created connection. Note: A connection may cause an error even after it has been
			successfully set up. In this case any of the notifications in set "conNotifications"
			will be raised.</dc:description>
		<mapping platform="upnp-av">
			<uis-upnp:annotation>The user may choose an appropriate connection protocol as
				parameter. Otherwise the system will pick one.</uis-upnp:annotation>
		</mapping>
		<param idref="isMediaServerSelected" dir="in"/>
		<param idref="isMediaRendererSelected" dir="in"/>
		
		<param id="newConnectionId" type="uis-upnp:connectionIdType" dir="out">
			<dc:description xml:lang="en">Identifier for new connection. This identifier can be used
				as index for the connections set to get access to the newly created connection. Note
				that command state must be "done" or "succeeded" after successful
			creation.</dc:description>
		</param>
		<param id="connectionError" type="uis-upnp:connectionErrorType" dir="out">
			<dc:description xml:lang="en">Must be "noError" if command state is not "failed".
			</dc:description>
		</param>
	</command>
	<set id="connections" dim="uis-upnp:connectionIdType">
		<dc:description xml:lang="en">This set contains the current connections (along the index of
			connection ids). Initially empty (no actual index). The user can create new connections
			by invoking the command "connect". The user can remove a connection by invoking the
			command "removeConnection".</dc:description>
		<mapping platform="upnp-av">
			<uis-upnp:annotation>When populating this set with a new instance, the system is
				responsible for setting up a connection between media server and media renderer
				through the connection services on either end. Only successful connections will
				result in a new actual index.</uis-upnp:annotation>
		</mapping>
		<dependency>
			<insert>false()</insert>
		</dependency>
		<command id="removeConnection" type="uis:timedCommand">
			<dc:description xml:lang="en">Close the connection that this command belongs to.</dc:description>
			<mapping platform="upnp-av">
				<uis-upnp:annotation>UPnP action closeConnection on
				ConnectionService.</uis-upnp:annotation>
			</mapping>
		</command>
		<set id="conSetup">
			<dc:description xml:lang="en">Basic connection properties.</dc:description>
			<variable id="connectedMediaServer" type="upnp-av:UDN" final="true" includesRes="true">
				<dc:description xml:lang="en">Media server of the connection.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UDN of media server.</uis-upnp:annotation>
				</mapping>
			</variable>
			<variable id="connectedMediaServerFriendlyName" type="xsd:string"><!--Open issue: This variable will not be needed if we can find a way for TAs to deliver dynamic resources for values of external types (in this case values of upnp-av:UDN).-->
				<dc:description xml:lang="en">Friendly name of connected media server.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>Friendly name from device description.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="connectedMediaRenderer" type="upnp-av:UDN" final="true" includesRes="true">
				<dc:description xml:lang="en">Media renderer of the connection.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UDN of media renderer.</uis-upnp:annotation>
				</mapping>
			</variable>
			<variable id="connectedMediaRendererFriendlyName" type="xsd:string"><!--Open issue: This variable will not be needed if we can find a way for TAs to deliver dynamic resources for values of external types (in this case values of upnp-av:UDN).-->
				<dc:description xml:lang="en">Friendly name of connected media renderer.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>Friendly name from device description.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>			
			<variable id="connectionProtocol" type="uis-upnp:connectionProtocolType" final="true">
				<dc:description xml:lang="en">This value reflects the details of the protocol used
					for the connection.</dc:description>
			</variable>
		</set>
		<set id="transport">
			<mapping platform="upnp-av">
				<uis-upnp:annotation>***** Elements in this set are based on AVTransport Service
					***** Note: The UPnP commands GetMediaInfo, GetTransportInfo, GetPositionInfo,
					GetDeviceCapabilities and GetTransportSettings have no counterparts in the UI
					Socket since this information is already available through socket
				variables.</uis-upnp:annotation>
			</mapping>
			<variable id="possiblePlaybackStorageMedia" type="uis:csvlist" final="true">
				<dc:description xml:lang="en">Contains a static, comma-separated list of storage
					media that the device can play.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetDeviceCapabilities for getting. No updates
						expected since static. Note: Since XSD has no means of defining the item
						type of a CSV list, we are implicitly using xsd:string here as item type.
						Correct item types are
					upnp-av:storageMedium.wc.values.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>false()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="possibleRecordStorageMedia" type="uis:csvlist" final="true"
				optional="true">
				<dc:description xml:lang="en">Contains a static, comma-separated list of storage
					media onto which the device can record.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetDeviceCapabilities for getting. No updates
						expected since static. Not present if value is "NOT_IMPLEMENTED" (i.e.
						service doesn't support recording). Note: Since XSD has no means of defining
						the item type of a CSV list, we are implicitly using xsd:string here as item
						type. Correct item types are
					upnp-av:storageMedium.wc.values.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>false()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="possibleRecordQualityModes" type="uis:csvlist" final="true"
				optional="true">
				<dc:description xml:lang="en">Contains a static, comma-separated list of recording
					quality modes that the device supports. For example, for an analog VHS recorder,
					the string would be "0:EP,1:LP,2:SP", while for a PVR the string would be
					"0:BASIC,1:MEDIUM,2:HIGH". The string specifics depend on the type of device
					containing the AVTransport. Note that record quality modes are independent of
					the content-format that may be exposed to the network through a
					ConnectionManager service. </dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetDeviceCapabilities for getting. State
						variable LastChange for updates. Not present if value is "NOT_IMPLEMENTED"
						(i.e. service doesn't support recording). Note: Since XSD has no means of
						defining the item type of a CSV list, we are implicitly using xsd:string
						here as item type. Correct item types are
					uis-upnp:recordQualityModeType.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>false()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="isCurrentPlayModeSettable" type="xsd:boolean" final="true">
				<dc:description xml:lang="en">Indicates whether the play mode can be set by the
					user.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>True if UPnP action SetPlayMode is available, otherwise
						false.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>false()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="recordQualityModeSettable" type="xsd:boolean" final="true" optional="true">
				<dc:description xml:lang="en">Indicates that the currentRecordQualityMode can be set
					by the user.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>True if UPnP action SetRecordQualityMode is present,
						otherwise false. Not present if value of UPnP variable
						CurrentRecordQualityMode is "NOT_IMPLEMENTED".</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>false()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="availableTransportPlaySpeeds" type="uis-upnp:transportPlaySpeedListType"
				final="true">
				<dc:description xml:lang="en">Space-separated list of allowed values for variable
					transportPlaySpeed. Note: This cannot be defined as type since it may vary
					between devices.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>Retrieve actually supported speeds from the AVTransport
						service description, AllowedValueList for state variable
					TransportPlaySpeed.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>false()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="transportState" type="uis-upnp:transportStateType">
				<!--Note: Vendor-specific values of the UPnP state variable TransportStatus may give indication for additional notify elements.-->
				<dc:description xml:lang="en">Conceptually 'top-level' state of the transport, e.g.,
					whether it is playing, recording, etc.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetMediaInfo for getting. UPnP state variable
						LastChange for updates.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<notify id="transportStatusError" category="error">
				<dc:description xml:lang="en">This notification is raised when the transport service
					indicates an error.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>Active if TransportStatus is ERROR_OCCURRED. UPnP action
						GetTransportInfo for getting. LastChange for updates.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<explicitAck>false()</explicitAck>
				</dependency>
			</notify>
			<variable id="playbackStorageMedium" type="upnp-av:storageMedium.wc.values">
				<dc:description xml:lang="en">Indicates the storage medium of the resource specified
					by AVTransportURI. If no resource is specified, then the state variable is set
					to "NONE". If AVTransportURI refers to a resource received from the UPnP network
					the state variable is set to "NETWORK". Device vendors may extend the specified
					allowed value list of this variable. For example, various types of solid-state
					media formats may be added in a vendor-specific way.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetMediaInfo for getting. UPnP state variable
						LastChange for updates.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<write>false()</write>
				</dependency>
				<selection>
					<selectionSetDynamic id="selectionPlaybackStorageMedium"
						varRef="possiblePlaybackStorageMedia"/>
				</selection>
				<!--Issue: Because the type definition of upnp-av:storageMedium.wc.values does not have an id attribute, we cannot define labels for the values of this type.  However, we can define labels for the variable playbackStorageMedium.-->
			</variable>
			<variable id="recordStorageMedium" type="upnp-av:storageMedium.wc.values"
				optional="true">
				<dc:description xml:lang="en">Indicates the storage medium where the resource
					specified by AVTransportURI will be recorded when a Record action is issued. If
					no resource is specified, then the state variable is set to "NONE". Device
					vendors may extend the allowed value list of this variable. For example, various
					types of solid-state media formats may be added in a vendor-specific way.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetMediaInfo for getting. UPnP state variable
						LastChange for updates. Not present if value is "NOT_IMPLEMENTED" (i.e.
						service doesn't support recording).</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
				<selection>
					<selectionSetDynamic id="selectionRecordStorageMedium"
						varRef="possibleRecordStorageMedia"/>
				</selection>
			</variable>
			<variable id="currentPlayMode" type="uis-upnp:playModeType">
				<dc:description xml:lang="en">Indicates the current play mode (e.g., random play,
					repeated play, etc.). This notion is typical for CD-based audio media, but is
					generally not supported by tape-based media. Value "DIRECT_1" indicates playing
					a single track and then stop (don't play the next track). Value "INTRO"
					indicates playing a short sample (typically 10 seconds or so) of each track on
					the media. Other play mode values are self explanatory.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetTransportSettings for getting. State
						variable LastChange for updates.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>value('./isCurrentPlayModeSettable')</write>
				</dependency>
			</variable>
			<variable id="transportPlaySpeed" type="uis-upnp:transportPlaySpeedType">
				<dc:description xml:lang="en">String representation of a rational fraction,
					indicates the speed relative to normal speed. Example values are '1', '1/2',
					'2', '-1', '1/10', etc. Actually supported speeds can be retrieved from the
					AllowedValueList of this state variable in the AVTransport service description.
					Value '1' is required, value '0' is not allowed.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetTransportInfo for getting. UPnP state
						variable LastChange for updates.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>true()</write>
				</dependency>
				<selection>
					<selectionSetDynamic id="selectionTransportPlaySpeed"
						varRef="availableTransportPlaySpeeds"/>
				</selection>
			</variable>
			<variable id="recordMediumWriteStatus" type="upnp:status.type" optional="true">
				<dc:description xml:lang="en">Write protection status of currently loaded media.
					NOT_WRITABLE indicates an inherent 'read-only' media (e.g., a DVD-ROM disc) or
					the device doesn't support recording on the current media. PROTECTED indicates a
					writable media that is currently write-protected (e.g., a protected VHS tape).
					If no media is loaded, the write status will be "UNKNOWN". </dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetMediaInfo for getting. UPnP state variable
						LastChange for updates. Not present if value is "NOT_IMPLEMENTED" (i.e.
						service doesn't support recording).</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="currentRecordQualityMode" type="uis-upnp:recordQualityModeType"
				optional="true">
				<dc:description xml:lang="en">Indicates the currently set record quality mode. Such
					a setting takes the form of "Quality Ordinal:label". The Quality Ordinal
					indicates a particular relative quality level available in the device, from 0
					(lowest quality) to n (highest quality). The label associated with the ordinal
					provides a human-readable indication of the ordinal's meaning. </dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetTransportSettings for getting value. State
						variable LastChange for updates. Action SetRecordQualityMode for setting.
						Not present if value is "NOT_IMPLEMENTED" (i.e. service doesn't support
						recording).</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>value('./recordQualityModeSettable')</write>
				</dependency>
				<selection>
					<selectionSetDynamic id="selectionRecordQualityMode"
						varRef="possibleRecordQualityModes"/>
				</selection>
			</variable>
			<variable id="numberOfTracks" type="xsd:unsignedLong">
				<dc:description xml:lang="en">Number of tracks controlled by the AVTransport
					instance. If no resource is associated with the AVTransport instance (via
					SetAVTransportURI), and there is no 'default' resource (for example, a loaded
					disc) then NumberOfTracks shall be 0. Otherwise, it shall be 1 or higher.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetMediaInfo for getting. UPnP state variable
						LastChange for updates.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="currentTrack" type="xsd:unsignedLong">
				<dc:description xml:lang="en">If NumberOfTracks is 0, then CurrentTrack will be 0.
					Otherwise, this state variable will contain the sequence number of the currently
					selected track, starting at value '1', up to and including NumberOfTracks. For
					tape-based media that do not support the notion of tracks, this state variable
					will always be '1'. For LD and DVD media, the notion of track equals the notion
					of chapter number. For Tuners that provide an indexed list of channels, the
					current track is defined as the current index number in such a list.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetPositionInfo for getting. UPnP state
						variable LastChange for updates.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="currentTrackDuration" type="uis-upnp:timeType" optional="true">
				<dc:description xml:lang="en">Duration of the current track, specified as a string
					of the following form: H+:MM:SS[.F+] or H+:MM:SS[.F0/F1]</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetPositionInfo for getting. UPnP state
						variable LastChange for updates. Not present if value is "NOT_IMPLEMENTED"
						(i.e. service doesn't support media duration
					information).</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="currentMediaDuration" type="uis-upnp:timeType" optional="true">
				<dc:description xml:lang="en">Duration of the current track, specified as a string
					of the following form: H+:MM:SS[.F+] or H+:MM:SS[.F0/F1]</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetMediaInfo for getting. UPnP state variable
						LastChange for updates. Not present if value is "NOT_IMPLEMENTED" (i.e.
						service doesn't support media duration information).</uis-upnp:annotation>
				</mapping>
				<dependency>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="nodeNowPlaying" type="xsd:string">
				<dc:description xml:lang="en">Id of the node from content that is currently in focus
					for playing.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>Serves as parameter for a connect and play
					operation.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="currentTrackMetaData" type="xsd:string" dim="metadataIndexType"
				optional="true">
				<dc:description xml:lang="en">Metadata, in the form of a 1-dimensional array
					containing the metadata fields pertaining to the resource pointed to by state
					variable CurrentTrackURI. The meta data may have been extracted from state
					variable AVTransportURIMetaData, or extracted from the resource binary itself
					(e.g., embedded ID3 tags for MP3 audio). This is implementation dependent. Note:
					This variable reflects the content of the item currently being played, whereas
					the variable "metadata" in set "content" contains the metadata of the currently
					selected node. Also, currentTrackMetaData cannot be derived from the selected
					node and metadata, since the current selection may be the containing folder of
					the item currently being played.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetPositionInfo for getting. UPnP state
						variable LastChange for updates. Not present if value is
					"NOT_IMPLEMENTED".</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="currentTrackUri" type="xsd:anyURI">
				<dc:description xml:lang="en">Reference, in the form of a URI, to the current track.
					The URI enables a control point to retrieve any meta data associated with
					current track, such as, for example, title and author information, via the
					ContentDirectory service.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetPositionInfo for getting. UPnP state
						variable LastChange for udates.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>false()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="avTransportUri" type="xsd:anyURI">
				<dc:description xml:lang="en">Reference, in the form of a URI of the resource
					controlled by the AVTransport instance. This URI may refer to a 'single' item
					(e.g., a song) or to a collection of items (e.g., a playlist). In the single
					item case, the AVTransport will have 1 'track' and AVTransportURI is equal to
					CurrentTrackURI. In the 'collection of items' case, the AVTransport will have
					multiple tracks, and AVTransportURI will remain constant during track changes.
					The URI enables a control point to retrieve any meta data associated with the
					AVTransport instance, such as, for example, title and author information, via
					the ContentDirectory service.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetMediaInfo for getting. UPnP state variable
						LastChange for updates. This is read-only since the command play will set
						avTransportUri to the desired URI.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>false()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="avTransportUriMetaData" type="xsd:string" dim="metadataIndexType"
				optional="true">
				<dc:description xml:lang="en">Metadata, in the form of a 1-dimensional array
					containing the metadata fields pertaining to the resource pointed to by state
					variable AVTransportURI. See the ContentDirectory service specification for
					details. If the service implementation doesn't support this feature then this
					state variable must be set to value "NOT_IMPLEMENTED".</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetMediaInfo for getting. UPnP state variable
						LastChange for updates. Not present if value is
					"NOT_IMPLEMENTED".</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="nextAvTransportUri" type="xsd:anyURI" optional="true">
				<dc:description xml:lang="en">AVTransportURI value to be played when the playback of
					the current AVTransportURI finishes. Setting this variable ahead of time (via
					action SetNextAVTransportURI) enables a device to provide seamless transitions
					between resources for certain streaming protocols that need buffering (e.g. HTTP
					GET). </dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetMediaInfo for getting. UPnP state variable
						LastChange for updates. For setting call UPnP action SetNextAVTransportURI.
						Not present if value is "NOT_IMPLEMENTED" (i.e. the service doesn't support
						this feature).</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>false()</relevant>
					<write>true()</write>
				</dependency>
			</variable>
			<variable id="nextAvTransportUriMetaData" type="xsd:string" dim="metadataIndexType"
				optional="true">
				<dc:description xml:lang="en">Metadata, in the form of a 1-dimensional array
					containing the metadata fields pertaining to the resource pointed to by state
					variable NextAVTransportURI. See the ContentDirectory service specification for
					details. If the service implementation doesn't support this feature then this
					state variable must be set to value "NOT_IMPLEMENTED".</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetMediaInfo for getting. UPnP state variable
						LastChange for updates. Not present if value is
					"NOT_IMPLEMENTED".</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="relativeTimePosition" type="uis-upnp:timeType" optional="true">
				<dc:description xml:lang="en">Duration in the following form: H+:MM:SS[.F+] or
					H+:MM:SS[.F0/F1]. This state variable contains the current position, in terms of
					time, from the beginning of the current track. For tape-based media that do not
					support multiple tracks on a single tape, this state variable contains the
					position, in terms of time, from a zero reference point on the tape. The time
					format is the same as for state variable CurrentTrackDuration. </dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetPositionInfo for getting and polling (no
						updates through LastChange). Not present if value is "NOT_IMPLEMENTED" (i.e.
						the service doesn't support relative time based position
					information).</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="absoluteTimePosition" type="uis-upnp:timeType" optional="true">
				<dc:description xml:lang="en">Duration in the following form: H+:MM:SS[.F+] or
					H+:MM:SS[.F0/F1] This state variable contains the current position, in terms of
					a time, from the beginning of the media. The time format is the same as for
					state variable CurrentTrackDuration. </dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetPositionInfo for getting and polling (no
						updates through LastChange). Not present if value is "NOT_IMPLEMENTED" or
						"END_OF_MEDIA" (i.e. the service doesn't support time position information).
						Note: The UPnP spec allows for devices that don't support time position
						information to use the value "END_OF_MEDIA" to indicate the end of the
						current media. This information is lost in the Socket in favor of a more
						rigid approach.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="relativeCounterPosition" type="xsd:long" optional="true">
				<dc:description xml:lang="en">This state variable contains the current position, in
					terms of a dimensionless counter, from the beginning of the current track. For
					tape-based media that do not support multiple tracks on a single tape, this
					state variable contains the position, in terms of a dimensionless counter, from
					a zero reference point on the tape. </dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetPositionInfo for getting and poling (no
						updates through LastChange). Not present if value is maximum value of the i4
						data type (i.e. the service doesn't support relative count-based position
						information).</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="absoluteCounterPosition" type="xsd:long" optional="true">
				<dc:description xml:lang="en">This state variable contains the current position, in
					terms of a dimensionless counter, from the beginning of the loaded media. </dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetPositionInfo for getting and polling (no
						updates through LastChange). Not present if value is maximum value of the i4
						data type (i.e. the service doesn't support absolute count-based position
						information).</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="currentTransportActions" type="uis:csvlist" optional="true">
				<dc:description xml:lang="en">This state variable contains a comma-separated list of
					transport-controlling actions that can be successfully invoked for the current
					resource at this specific point in time. The list will contain a subset of the
					following actions: Play, Stop, Pause, Seek, Next, Previous and Record. For
					example, when a live stream from the Internet is being controlled, the variable
					may be only "Play, Stop". When a local audio CD is being controlled, the
					variable may be "Play, Stop, Pause, Seek, Next, Previous". This information can
					be used, for example, to dynamically enable or disable play, stop, pause
					buttons, etc., on a user interface.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action GetCurrentTransportActions for getting. State
						variable LastChange for updates. Note: We could define a type for valid
						transportActions but that would not help here since XML Schema doesn't allow
						us to define the item type of a CSV list. Note: We could use this variable
						for the execute dependencies of play, stop, etc., but might have the
						following problems: (1) This variable is optional, so may not be present.
						One could check this at runtime, but if not present, all commands would
						always be active. (2) Since this variable isn't directly evented, variable
						changes will arrive with delay through LastChange or with delay through
						polling.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>false()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<command id="stop" type="uis:basicCommand">
				<dc:description xml:lang="en">This action stops the progression of the current
					resource that is associated with the specified instance. Additionally, it is
					recommended that the "output of the device" (defined below) should change to
					something other than the current snippet of resource. Although the exact nature
					of this change varies from device to device, a common behavior is to immediately
					cease all "output" from the device. Nevertheless, the exact behavior is defined
					by the manufacturer of the device. This action is allowed in all transport
					states except in state "NO_MEDIA_PRESENT".</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>Action Stop.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>value('./transportState')!='NO_MEDIA_PRESENT' </write>
					<assert>value('./transportState') eq 'STOPPED'</assert>
				</dependency>
				<param dir="out" idref="transportState"/>
			</command>
			<command id="play" type="uis:basicCommand">
				<dc:description xml:lang="en">Start playing the resource of the specified instance,
					at the specified speed, starting at the current position, according to the
					current play mode. Keep playing until the resource ends or the transport state
					is changed via actions Stop or Pause. The device should do a 'best effort' to
					match the specified play speed. Actually supported speeds can be retrieved from
					the AllowedValueList of the TransportPlaySpeed state variable in the AVTransport
					service description. This action is allowed in the "STOPPED", "PLAYING", and
					"PAUSED_PLAYBACK" transport states.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>If no connection established yet, call UPnP action
						PrepareForConnection. Note that ConnectionComplete should be called when the
						session ends. UPnP action setAVTransportUri with the URI pertaining to the
						selectedBrowseId of xmlContent. Then invoke action Play; the command's state
						should be 'inProgress' as long as transportState has value
					'TRANSITIONING'.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<write>value('./transportState') eq 'STOPPED' or value('./transportState') eq
						'PAUSED_PLAYBACK' or value('./transportState') eq 'PLAYING'</write>
					<assert>value('./transportState') eq 'PLAYING'</assert>
				</dependency>
				<param id="playListMode" type="playSourceType" dir="in">
					<dc:description xml:lang="en">Either one of the following:
						"SingleBrowse" = Play selectedBrowseId item from browse list.
						"SingleSearch" = Play selectedSearchId item from search list.
						"ContinuousBrowse" = Play items from browse list, starting with selectedBrowseId.
						"ContinuousSearch" = Play items from search list, starting with selectedSearchId.
					</dc:description>
				</param>
				<param id="playCurrentPlayMode" type="uis-upnp:playModeType" dir="in">
					<dc:description xml:lang="en">Indicates the desired play mode (e.g., random
						play, repeated play, etc.). Ignored if play mode cannot be set for the media
						renderer.</dc:description>
					<mapping platform="upnp-av">
						<uis-upnp:annotation>This parameter should be ignored if UPnP action
							SetPlayMode is not present (optional).</uis-upnp:annotation>
					</mapping>
				</param>
				<param id="playTransportPlaySpeed" type="uis-upnp:transportPlaySpeedListType" dir="in"/>
				<param idref="avTransportUri" dir="out"/>
				<param idref="currentTrackUri" dir="out"/>
				<param idref="currentPlayMode" dir="out"/>
				<param idref="transportPlaySpeed" dir="out"/>
				<param idref="transportState" dir="out"/>
			</command>
			<command id="pause" type="uis:basicCommand" optional="true">
				<dc:description xml:lang="en">While the device is in a playing state, e.g.
					TransportState is "PLAYING", this action halts the progression of the resource
					that is associated with the specified instance Id. Any visual representation of
					the resource should remain displayed in a static manner (e.g. the last frame of
					video should remain displayed). Any audio representation of the resource should
					be muted. The difference between Pause() and Stop() is that Pause() MUST remain
					at the current position within the resource and the current resource must
					persist as describe above (e.g. the current video resource continues to be
					transmitted/displayed). This action is always allowed while playing or
					recording.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action Pause.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>value('./transportState') eq 'PLAYING' or value('./transportState') eq
						'RECORDING'</write>
					<assert>value('./transportState') eq 'PAUSED_RECORDING' or
						value('./transportState') eq 'PAUSED_PLAYBACK'</assert>
				</dependency>
				<param dir="out" idref="transportState"/>
			</command>

			<variable id="isPlayAvailable" type="xsd:boolean">
				<dc:description>Is play available or not?</dc:description>
				<dependency>
					<relevant>false()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="isStopAvailable" type="xsd:boolean">
				<dc:description>Is stop available or not?</dc:description>
				<dependency>
					<relevant>false()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			<variable id="isPauseAvailable" type="xsd:boolean">
				<dc:description>Is pause available or not?</dc:description>
				<dependency>
					<relevant>false()</relevant>
					<write>false()</write>
				</dependency>
			</variable>
			

			<command id="record" type="uis:basicCommand" optional="true">
				<dc:description xml:lang="en">Start recording on the specified transport instance,
					at the current position on the media, according to the currently specified
					recording quality, and return immediately. If AVTransportURI is set (differs
					from the empty string) then that resource will be recorded. If no AVTransportURI
					is set (equals the empty string), then the source of the content being recording
					is device dependent. In both cases, whether the device outputs the resource to a
					screen or speakers while recording is device dependent. If the device
					implementing the Record action also has a ContentDirectory service, then
					recorded content will be added to this ContentDirectory in a device-dependent
					way. Specifically, there is no UPnP mechanism to specify the location of the
					recorded content in the ContentDirectory hierarchy. This action is allowed in
					the "STOPPED" or "PAUSED_RECORDING" transport states.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action Record.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>value('./transportState') eq 'STOPPED' or value('./transportState') eq
						'PAUSED_RECORDING'</write>
					<assert>value('./transportState') eq 'RECORDING'</assert>
				</dependency>
				<param idref="currentRecordQualityMode" dir="in"/>
				<param idref="avTransportUri" dir="out"/>
				<param idref="currentTrackUri" dir="out"/>
				<param idref="transportState" dir="out"/>
			</command>
			<command id="seek" type="uis:timedCommand">
				<!--If known, the device can inform about how long it will take.-->
				<dc:description xml:lang="en">Start seeking through the resource controlled by the
					specified instance - as fast as possible - to the specified target position.
					Unit value "TRACK_NR" indicates seeking to a particular track number. For
					tape-based media that do not support the notion of track (such as VCRs),
					Seek("TRACK_NR","1") is equivalent to the common "FastReverse" VCR
					functionality. Special track number '0' is used to indicate the end of the
					media, hence, Seek("TRACK_NR","0") is equivalent to the common "FastForward" VCR
					functionality. This action is allowed in the STOPPED and PLAYING transport
					states.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action Seek. If invoked, its state should be
						'inProgress' as long as transportState has value
					'TRANSITIONING'.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>value('./transportState') eq 'STOPPED' or value('./transportState') eq
						'PLAYING'</write>
				</dependency>
				<param id="unit" type="uis-upnp:seekModeType" dir="in">
					<dc:description xml:lang="en">This parameter indicates the allowed units in
						which the amount of seeking to be performed is specified. It can be
						specified as a time (relative or absolute), a count (relative or absolute),
						a track number, a tape-index (e.g., for tapes with a indexing facility) or
						even a video frame. A device vendor is allowed to implement a subset of the
						allowed value list of this state variable. Only value 'TRACK_NR' is
						required.</dc:description>
				</param>
				<param id="target" type="xsd:string" dir="in">
					<dc:description xml:lang="en">This parameter indicates the target position of
						the seek action, in terms of units defined by parameter unit. The data type
						of this variable is 'string'. However, depending on the actual seek mode
						used, it must contains string representations of values of UPnP types 'ui4'
						(ABS_COUNT, REL_COUNT, TRACK_NR, TAPE-INDEX, FRAME), 'time' (ABS_TIME,
						REL_TIME) or 'float' (CHANNEL_FREQ, in Hz). Supported ranges of these
						integer, time or float values are device-dependent.</dc:description>
				</param>
				<param idref="currentTrackUri" dir="out"/>
				<!--Open issue: Describe error return codes as notifications or output parameter?-->
			</command>
			<command id="next" type="uis:basicCommand">
				<dc:description xml:lang="en">Convenient action to advance to the next track. This
					action is functionally equivalent to Seek(TRACK_NR,CurrentTrackNr+1). This
					action does not 'cycle' back to the first track. This action is allowed in the
					STOPPED and PLAYING transport states.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action Next. If invoked, its state should be
						'inProgress' as long as transportState has value
					'TRANSITIONING'.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>value('./transportState') eq 'STOPPED' or value('./transportState') eq
						'PLAYING'</write>
				</dependency>
				<param idref="currentTrackUri" dir="inout"/>
			</command>
			<command id="previous" type="uis:basicCommand">
				<dc:description xml:lang="en">Convenient action to advance to the previous track.
					This action is functionally equivalent to Seek(TRACK_NR,CurrentTrackNr-1) . This
					action does not 'cycle' back to the last track. This action is allowed in the
					STOPPED and PLAYING transport states.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>UPnP action Previous. If invoked, its state should be
						'inProgress' as long as transportState has value
					'TRANSITIONING'.</uis-upnp:annotation>
				</mapping>
				<dependency>
					<relevant>true()</relevant>
					<write>value('./transportState') eq 'STOPPED' or value('./transportState') eq
						'PLAYING'</write>
				</dependency>
				<param idref="currentTrackUri" dir="inout"/>
			</command>



			<variable id="isPlayAvailable" type="xsd:boolean">
			<dc:description>Is play available or not?</dc:description>
			<dependency>
				<relevant>false()</relevant>
				<write>false()</write>
			</dependency>
			</variable>
			<variable id="isStopAvailable" type="xsd:boolean">
			<dc:description>Is stop available or not?</dc:description>
			<dependency>
				<relevant>false()</relevant>
				<write>false()</write>
			</dependency>
			</variable>
			<variable id="isPauseAvailable" type="xsd:boolean">
			<dc:description>Is pause available or not?</dc:description>
			<dependency>
				<relevant>false()</relevant>
				<write>false()</write>
			</dependency>
			</variable>

		</set>

		<set id="conNotifications">
			<dc:description xml:lang="en">This set contains notifications that can occur for a
				running connection.</dc:description>
			<mapping platform="upnp-av">
				<uis-upnp:annotation>***** Elements in this set are based on ConnectionManager
					Service ***** This set defines notifications to be raised after a connection has
					been created. Errors upon creating a connection should be indicated through the
					"connectionError" parameter of the "connect" command.</uis-upnp:annotation>
			</mapping>
			<notify id="conNotifyContentFormatMismatch" category="error" optional="true">
				<dc:description xml:lang="en">This notification is raised when the connection cannot
					be continued because of a protocol/format mismatch.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>Raised when
						GetCurrentConnectionInfo(Status)=="ContentFormatMismatch".</uis-upnp:annotation>
				</mapping>
				<dependency>
					<explicitAck>false()</explicitAck>
				</dependency>
			</notify>
			<notify id="conNotifyInsufficientNetworkResources" category="error" optional="true">
				<dc:description xml:lang="en">This notification is raised when connection cannot be
					continued because of unsufficient network resources (bandwidth, channels, etc.).</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>Raised when
						GetCurrentConnectionInfo(Status)=="InsufficientBandwidth".</uis-upnp:annotation>
				</mapping>
				<dependency>
					<explicitAck>false()</explicitAck>
				</dependency>
			</notify>
			<notify id="conNotifyUnreliableChannel" category="error" optional="true">
				<dc:description xml:lang="en">This notification is raised when connection cannot be
					continued because an unreliable channel has been chosen.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>Raised when
						GetCurrentConnectionInfo(Status)=="UnreliableChannel".</uis-upnp:annotation>
				</mapping>
				<dependency>
					<explicitAck>false()</explicitAck>
				</dependency>
			</notify>
			<notify id="conNotifyUnknownConnectionError" category="error" optional="true">
				<dc:description xml:lang="en">This notification is raised when connection cannot be
					continued because of an unknown error.</dc:description>
				<mapping platform="upnp-av">
					<uis-upnp:annotation>Raised when
					GetCurrentConnectionInfo(Status)=="Unknown".</uis-upnp:annotation>
				</mapping>
				<dependency>
					<explicitAck>false()</explicitAck>
				</dependency>
			</notify>
		</set>
	</set>
	<schema xmlns="http://www.w3.org/2001/XMLSchema">
		<simpleType name="playSourceType" id="idPlaySourceType">
			<restriction base="xsd:string">
				<enumeration value="SingleBrowse"/>
				<enumeration value="SingleSearch"/>
				<enumeration value="MultipleBrowse"/>
				<enumeration value="MultipleSearch"/>
				<enumeration value="Continue"/>
			</restriction>
		</simpleType>
		<simpleType name="metadataIndexType" id="idMetadataIndexType">
			<annotation>
				<documentation>This type defines the possible indices for the metadata variable. The
					indices are strings based on the DIDL-LITE schema file and the metadata
					information it defines. Note that this type does not define the XML elements,
					but rather enumerates their identifiers as strings (in the form of
					"prefix:name"). In the future, other namespaces may be added for additional
					metadata types, e.g. for an EPG.</documentation>
			</annotation>
			<restriction base="xsd:string">
				<!--TODO: Add metadata fields from namespace "urn:schemas-upnp-org:metadata-1-0/upnp/".-->
				<!--Open issue: Do we want to strip this list down to save bandwidth?-->

				<enumeration value="none"><!--Can be used as sort criteria.--></enumeration>
				<enumeration value="title"/>
				<enumeration value="creator"/>
				<enumeration value="subject"/>
				<enumeration value="description"/>
				<enumeration value="publisher"/>
				<enumeration value="contributor"/>
				<enumeration value="date"/>
				<enumeration value="type"/>
				<enumeration value="format"/>
				<enumeration value="identifier"/>
				<enumeration value="source"/>
				<enumeration value="language"/>
				<enumeration value="relation"/>
				<enumeration value="coverage"/>
				<enumeration value="rights"/>
				<enumeration value="upnp:artist"/>
				<enumeration value="upnp:actor"/>
				<enumeration value="upnp:author"/>
				<enumeration value="upnp:producer"/>
				<enumeration value="upnp:director"/>
				<enumeration value="upnp:genre"/>
				<enumeration value="upnp:album"/>
				<enumeration value="upnp:playlist"/>

				<!--Note: Strictly, any of these metadata items could occur multiple times in the DIDL-LITE element structure.  But that should not occur in practice.-->

			</restriction>
		</simpleType>

	</schema>
</uiSocket>
