<?xml version="1.0" encoding="utf-8"?>
<!-- edited with XMLSpy v2005 sp1 U (http://www.xmlspy.com) by Eric Burger (W3C) -->
<!-- edited with XMLSPY v2004 rel. 3 U (http://www.xmlspy.com) by Eric Burger (Snowshore Networks Inc.) -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd">
<!--
<?xml-stylesheet type='text/xsl'
      href='http://xml.resource.org/authoring/rfc2629.xslt' ?>
!-->
<?xml-stylesheet type='text/xsl'
                 href='C:\Documents and Settings\eburger\My Documents\xml2rfc-1.26\rfc2629xslt\rfc2629.xslt' ?>
<?rfc strict="yes" ?>
<?rfc toc="yes" ?>
<?rfc sortrefs="yes" ?>
<?rfc iprnotified="yes" ?>
<?rfc compact="yes" ?>
<rfc ipr="full3667" docName="draft-vandyke-mscml-06">
	<front>
		<title abbrev="MSCML">Media Server Control Markup Language (MSCML) and Protocol</title>
		<author initials="J." surname="Van Dyke" fullname="Jeff Van Dyke">
			<organization>Brooktrout Technology, Inc.</organization>
			<address>
				<postal>
					<street>18 Keewaydin Dr.</street>
					<city>Salem</city>
					<region>NH</region>
					<code>03079</code>
					<country>USA</country>
				</postal>
				<email>jvandyke@brooktrout.com</email>
			</address>
		</author>
		<author initials="E." surname="Burger" fullname="Eric Burger" role="editor">
			<organization>Brooktrout Technology, Inc.</organization>
			<address>
				<postal>
					<street>18 Keewaydin Dr.</street>
					<city>Salem</city>
					<region>NH</region>
					<code>03079</code>
					<country>USA</country>
				</postal>
				<email>eburger@brooktrout.com</email>
			</address>
		</author>
		<author initials="A." surname="Spitzer" fullname="Andy Spitzer">
			<organization>Brooktrout Technology, Inc.</organization>
			<address>
				<postal>
					<street>18 Keewaydin Dr.</street>
					<city>Salem</city>
					<region>NH</region>
					<code>03079</code>
					<country>USA</country>
				</postal>
				<email>woof@brooktrout.com</email>
			</address>
		</author>
		<date year="2004" month="December" day="25"/>
		<area>Transport</area>
		<workgroup>SIPPING</workgroup>
		<keyword>SIP</keyword>
		<keyword>Media Services</keyword>
		<abstract>
			<t>Media Server Control Markup Language (MSCML) is a markup language used in conjunction with SIP to provide advanced conferencing functions.  MSCML presents an application-level model for conference control, as opposed to device-level conference control models.  One use of this protocol is for communications between a conference focus and mixer in the IETF SIP Conferencing Framework.</t>
		</abstract>
		<note title="Intellectual Property Rights">
			<t>Brooktrout Technology, Inc. is making their intellectual property right interest in MSCML available on a royalty-free basis, per the terms described in the online IETF list of claimed rights at
<eref target="http://www.ietf.org/ietf/IPR/SNOWSHORE-draft-vandyke-mscml.txt">http://www.ietf.org/ietf/IPR/SNOWSHORE-draft-vandyke-mscml.txt</eref>.</t>
		</note>
		<note title="Conventions used in this document">
			<t>
				<xref target="RFC2119">RFC2119</xref> provides the interpretations for the key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;, &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; found in this document.</t>
		</note>
	</front>
	<middle>
		<section title="Introduction">
			<t>This document describes the Media Server Control Markup Language (MSCML).  This document describes payloads that one can send with a standard SIP INVITE to a media server.  <xref target="I-D.burger-sipping-netann">Basic Network Media Services with SIP</xref> describes media server SIP URI formats.</t>
			<t>Prior to MSCML, there was not a standard way to deliver SIP-based enhanced conferencing.  Basic SIP constructs, such as described in <xref target="I-D.burger-sipping-netann">Basic Network Media Services with SIP</xref>, serves simple n-way conferencing well.  The SIP URI provides a natural mechanism for identifying a specific SIP conference, while INVITE and BYE methods elegantly implement conference join and leave semantics.  However, enhanced conferencing applications also require features such as sizing and resizing, in-conference IVR operations (e.g., recording and playing participant names to the full conference) and conference event reporting.  MSCML payloads within standard SIP methods realize these features.</t>
			<t>The structure and approach of MSCML satisfy the requirements set
out in <xref target="I-D.ietf-sipping-cc-conferencing">conferencing-framework</xref>.  In particular, MSCML serves as the interface between the conference factory and a centralized conference mixer.  In this case, a media server has the role of the conference mixer.</t>
			<t>There are two broad classes of MSCML functionality.  The first class includes primitives for advanced conferencing such as conference configuration, participant leg manipulation and conference event reporting.  The second class comprises primitives for interactive voice response (IVR).  These include playing audio, collecting digits, and recording audio.</t>
			<t>The IVR features of MSCML began as an adjunct for conferencing.  In many scenarios it was impractical or inconvenient to establish a dialog with a distinct IVR resource and then re-join the conference.  Over time, many SIP Proxy Servers, Media Gateway Controllers, and SIP-based applications have used MSCML for simple IVR such as prompt-and-collect.  Do note that for complex IVR it may be more appropriate to employ a full IVR markup language such as <xref target="W3C.REC-voicexml20-20040316">VoiceXML</xref>.</t>
			<t>In general, a media server offers services to SIP UAC's such as application servers, feature servers, and media gateway controllers.  See the <xref target="ISC.RefArch">IPCC Reference Architecture</xref> for definitions of these terms.  It is unlikely, but not prohibited, for end user SIP UAC's to have a direct signaling relationship with a media server.</t>
			<t>
			This document describes a working framework and protocol with which there is considerable implementation experience.  Application developers and service providers have created several MSCML-based services since the initial version was made available more than a year ago.  This experience is highly relevant to the ongoing work of the IETF, particularly the <eref target="http://www.ietf.org/html.charters/sip-charter.html">SIP</eref>, <eref target="http://www.ietf.org/html.charters/sippin-charter.html">SIPPING</eref>, <eref target="http://www.ietf.org/html.charters/mmusic.html">MMUSIC</eref>, and <eref target="http://www.ietf.org/html.charters/xcon.html">XCON</eref> work groups, as well as the CCXML work in the Voice Browser Work Group of the W3C.</t>
		</section>
		<section title="MSCML Approach">
			<t>It is critically important to emphasize the goal of MSCML is to provide a development environment that follows the SIP, HTTP, and XML development paradigm.  That is, the mixing resource is a server that operates on application level constructs such as call participants.</t>
			<t>Some developers may desire low-level of control over DSP resources.  Examples of such control include path establishment between DSP blocks such as tone detectors, tone generators, or other speech resources.  For such users, we STRONGLY suggest using a protocol such as <xref target="RFC3525">H.248.1</xref>.  Such control does not fit the SIP model.  It is, of course, possible to transport such low-level instructions in SIP.  However, the programming model moves from the client-server peer paradigm of SIP to the master-slave controller model of H.248.1, in which case H.248.1 is a much more appropriate solution.</t>
			<t>The MSCML paradigm is important to the developer community, in that developers and operators conceptually write applications about calls, conferences, and call legs.  The H.248.1 paradigm is conceptually about resources and plumbing.  That is a whole level of implementation details that, for the majority of developers, adds no value.</t>
		</section>
		<section title="Use of SIP Request Methods">
			<t>As mentioned above, MSCML payloads may be carried in either SIP INVITE or INFO requests.  The initial INVITE, which creates an enhanced conference, MUST include an MSCML payload.  The initial INVITE, which joins a participant leg to an enhanced conference, MAY include an MSCML payload.  All mid-call MSCML payloads are sent via SIP INFO requests.	</t>
			<t>MSCML responses are transported in the final response to the SIP INVITE containing the matching MSCML request or in a SIP INFO message.  The only allowable final response to a SIP INFO containing a message body is a 200 OK, per <xref target="RFC2976">RFC2976</xref>.  Therefore, when the MSCML request is sent via SIP INFO, the MSCML response is carried in a separate INFO request.  In general, these responses are asynchronous in nature and require a separate transaction due to timing considerations.</t>
			<t>There has been considerable debate on the use of the SIP INFO method for any purpose.  Our experience is that MSCML would not have been possible without it.  When MSCML was implemented the first SIP Event Notification draft had just been published.  At that time, use of SUBSCRIBE/NOTIFY within an existing dialog was undefined.  This prevented its use in MSCML since all events occurred in an INVITE established dialog.  And while SUBSCRIBE/NOTIFY was well suited for reporting conference events its semantics seemed inappropriate for modifying a participant leg or conference setting where the only "event" was the success or failure of the request.  Lastly, since SIP INFO was an established RFC it was well supported in all the SIP stack implementations available at that time.  We had few if any interoperability issues as a result.			</t>
			<t>As it turns out, using NOTIFY is not appropriate, as the NOTIFY would be in response to an implicit subscription.  The issues of implicit subscription have been discussed on the SIP and SIPPING lists.</t>
			<t>Using SUBSRCIBE is not appropriate for two reasons.  The first is semantic.  The purpose of SUBSCRIBE is to register interest in User Agent state.  However, using SUBSCRIBE for MSCML results in the SUBSCRIBE modifying the User Agent state.  The second reason SUBSCRIBE is not appropriate is because MSCML is inherently call-based.  The association of a SIP dialog with a call leg means MSCML can be incredibly straightforward.  For example, if one used SUBSCRIBE or other SIP method to send commands about some context, one must identify that context somehow.  Relating commands to the SIP dialog they arrive on defines the context for free.  Moreover, it is conceptually easy for the developer.</t>
			<t>Recently we have re-considered using the NOTIFY method for events, as used in, for example, <xref target="I-D.burger-sipping-kpml">KPML</xref>.  NOTIFY is appropriate for KPML as there is usually only a single response to a given KPML document.  Moreover, mid-call requests can go in both directions, which is not the case for KPML.			</t>
			<t>Because of the multiple response and peer mid-call request nature of MSCML, we also considered <xref target="I-D.ietf-simple-message-sessions">MSRP</xref>.  MSRP may be the appropriate technology.  The main benefit of MSRP is that only proxies interested in seeing MSCML signaling see the MSCML messages.  This is in contrast to the current scheme, where the interested proxies, as well as any other proxies that happen to record-route, see the MSCML messages.  The trade-off here is that many of the interested proxies are border proxies.  In the interest of interoperability, we chose to continue using INFO.	</t>
			<t>In order to guarantee interoperability with this specification, as well as with SIP User Agents that are unaware of MSCML, SIP UACs that wish to use MSCML services MUST Require the "mscml" service in the initial INVITE.  The media server, as a SIP UAS, MUST respond appropriately to the INVITE, as well as advertise its support of MSCML in the response to OPTIONS requests.  This alleviates the major issues with using INFO for the transport of application data, namely the User Agent's proper interpretation of what is, by design, a opaque message request.</t>
			<t>SIP continues to progress incredibly quickly and we will continually reevaluate some of the decisions that resulted in the original design of MSCML.  However, we can confidently say that the availability of a widely supported, flexible request method was very important to the development and adoption MSCML.</t>
		</section>
		<section title="MSCML Design">
			<section title="Transaction Model">
				<t>
To avoid undue complexity two rules were established regarding MSCML usage.  The first is that only one MSCML body may be present in a SIP request.  The second is that each MSCML body may contain only one request or response.  This greatly simplified transaction management.  MSCML syntax does provide for the unique identification of multiple requests in a single body part but this is not currently allowed.
			</t>
				<t>
Per the guidelines of <xref target="RFC3470">RFC3470</xref>, MSCML bodies MUST be well formed and valid.
			</t>
				<t>MSCML is a direct request-response protocol.  There are no provisional responses, only final responses.  A request may result in multiple notifications, as in the case of requesting active talker reports.  This maps to the three major tag trees for MSCML: &lt;request&gt;, &lt;response&gt;, and &lt;notification&gt;.</t>
				<t>
					<xref target="F.req"/> shows a request body.  Depending on the command, one can send the request in an INVITE or an INFO.  <xref target="F.res"/> shows a response body.  The SIP INFO method transports response bodies.  <xref target="F.not"/> shows a notification body.  The SIP INFO method transports notifications.</t>
				<figure title="Request" anchor="F.req">
					<artwork><![CDATA[
<?xml version="1.0" encoding="utf-8"?>
  <MediaServerControl version="1.0">
    <request>
      ... request body ...
    </request>
  </MediaServerControl>
  				]]></artwork>
				</figure>
				<figure title="Response" anchor="F.res">
					<artwork><![CDATA[
<?xml version="1.0" encoding="utf-8"?>
  <MediaServerControl version="1.0">
    <response>
      ... request body ...
    </response>
  </MediaServerControl>
  				]]></artwork>
				</figure>
				<figure title="Notification" anchor="F.not">
					<artwork><![CDATA[
<?xml version="1.0" encoding="utf-8"?>
  <MediaServerControl version="1.0">
    <notification>
      ... notification body ...
    </notification>
  </MediaServerControl>
  				]]></artwork>
				</figure>
			</section>
			<section title="XML Usage">
				<t>In the philosophy of XML as a text-based description language, and not a programing language, MSCML makes the choice of many attribute values for readability by a human.  Thus many attributes that would often be "boolean" instead take "yes" or "no" values.  For example, what does 'report="false"' or 'report="1"' mean?  However, 'report="yes"' is clearer: I want a report.  That said, some programmers prefer the precision of a boolean.  To satisfy both styles, MSCML defines a XML type, "yn", that takes on the values "yes", "no", and the boolean values, normally "true", "false", "1", and "0".</t>
				<t>Many attributes in the MSCML schema have default values.  In order to limit demands on the XML parser, MSCML applies these values at the protocol, not XML, level.  The MSCML schema documents these defaults as XML annotations to the appropriate attribute.</t>
			</section>
		</section>
		<section title="Advanced Conferencing">
			<section title="Conference Model">
				<t>
The advanced conferencing model is a star controller model, with both signaling and media directed to a central location.  <xref target="F.ConfModel"/> depicts a typical signaling relationship between end users' UAC's, a conference application server, and a media server.
			</t>
				<t>The document <xref target="I-D.ietf-sipping-cc-conferencing">cc-conferencing</xref> makes use of this model.  The application server is an instantiation of the conference focus.  The media server is an instantiation of the media mixer.  Note that user-level constructs, such as event notifications, are in the purview of the application server.  This is why, for example, the media server will notify the active talker report using MSCML, while the application server should use the <xref target="I-D.ietf-sipping-conference-package">conference package</xref> for individual notifications to SIP user agents.  Note that the use of the conference package for media server to application server notifications is not recommended because none of the filtering and membership information is available at the media server.</t>
				<figure title="Conference Model" anchor="F.ConfModel">
					<artwork><![CDATA[
  +-------+
  | UAC 1 |---\   Public URI  +-------------+
  +-------+    \ _____________| Application |
                /    /        |   Server    |     Not shown:
  +-------+    /    /         +-------------+     RTP flows directly
  | UAC 2 |---/    /                 | Private    between UAC's and
  +-------+       /                  |   URI      Media Server
      .          /            +--------------+
      :         /             |              |
  +-------+    /              | Media Server |
  | UAC n |---/               |              |
  +-------+                   +--------------+
				]]></artwork>
				</figure>
				<t>
Each UAC sends an INVITE to a Public Conference URI.  Presumably the Application Server publishes this URI, or it is an ad hoc URI.  In any event, the Application Server generates a Private URI, following the rules specified by <xref target="I-D.burger-sipping-netann">Basic Network Media Services with SIP</xref>.  That is, the URI is of the form:
			</t>
				<figure>
					<artwork>sip:conf=UniqueID@ms.example.net</artwork>
				</figure>
				<t>
Where UniqueID is a unique conference identifier, and ms.example.net is the host name or IP address of the media server.  There is nothing to prevent the UAC's from contacting the media server directly.  However, one would expect the owner of the media server to restrict who can use media server resources.
			</t>
				<t>
As for basic conferencing, described by <xref target="I-D.burger-sipping-netann">Basic Network Media Services with SIP</xref>, the first INVITE to the media server with a UniqueID creates a conference.  However, in advanced conferencing, the first INVITE includes a MSCML configure_conference payload.  The MSCML payload conveys extended session parameters (e.g., number of participants) that are not readily expressed in SDP but must be known to allocate the appropriate resources.
			</t>
				<t>
The first dialog established for an enhanced conference has several useful properties and is referred to as the "Conference Control Leg."  The control leg is used for play or record audio operations to/from the entire conference and no RTP is expected on the Conference Control Leg.  Therefore, the application must send either no SDP or hold SDP (c=0.0.0.0) in the initial INVITE request.  In addition, the lifetime of the conference is the same as that of its control leg.  This ensures that the conference remains in existence even if one or more participant legs unintentionally leaves the conference.
			</t>
			</section>
			<section title="Configure Conference Tag">
				<t>The &lt;configure_conference&gt; tag has two attributes that control the resources the media server sets aside for the conference.  The attributes are reservedtalkers and reserveconfmedia.  Reservedtalkers sets the maximum number of talker legs.  Reserveconfmedia, if set to "yes", allocates resources for playing or recording audio to or from the entire conference.  The default for reserveconfmedia is "yes".</t>
				<t>When the reservedtalkers+1st INVITE arrives at the media server, the media server responds with a 486 BUSY HERE.
					<list style="empty">
						<t>NOTE:  It would be symmetric to have a reservedlisteners parameter.  However, the practical limitation on the media server is the number of talkers for a mixer to monitor.  In either case, the application server regulates who gets in to the conference by either proxying the INVITEs from the user agent clients or metering who it gives the conference URI to.</t>
					</list>
				</t>
				<t>
The application server can include any MSCML command in the initial INVITE, with the exception of asynchronous commands, such as &lt;play&gt; or &lt;record&gt;.  The application server must issue asynchronous commands separately (e.g., in INFO messages) to avoid ambiguous responses.
			</t>
				<t>
For example, to create a conference with up to 120 active talkers and the ability to play audio into the conference or record parts or all of the conference, the application server specifies both attributes, as shown in <xref target="F.120"/>.
			</t>
				<figure title="120 Speaker MSCML Example" anchor="F.120">
					<artwork><![CDATA[
     <?xml version="1.0" encoding="utf-8"?>
       <MediaServerControl version="1.0">
         <request>
           <configure_conference reservedtalkers="120"/>
         </request>
       </MediaServerControl>
				]]></artwork>
				</figure>
				<t>
					<xref target="F.5speakers"/> shows a conference with up to five active speakers without the capability to play or record audio into the conference.
			</t>
				<figure title="5 Speaker MSCML Example" anchor="F.5speakers">
					<artwork><![CDATA[
     <?xml version="1.0" encoding="utf-8"?>
       <MediaServerControl version="1.0">
         <request>
           <configure_conference reservedtalkers="5"
                                 reserveconfmedia="no"/>
         </request>
       </MediaServerControl>
				]]></artwork>
				</figure>
				<t>Once the application server has created the Conference Control Leg, the server can join participants to the conference.  The application server directs the INVITE to the Private Conference URI described above.  In the example given, this would be sip:conf=UniqueID@ms.example.net .</t>
				<section title="Conference Leg Attributes">
					<t>Conference legs have a number of parameters the application server can modify.  The defaults are in <xref target="T.legParams"/>.</t>
					<texttable title="Conference Leg Parameters" anchor="T.legParams">
						<ttcol>Parameter</ttcol>
						<ttcol>Default</ttcol>
						<ttcol>Description</ttcol>
						<c>type</c>
						<c>talker</c>
						<c>Consider this leg's audio for mixing in the output mix.  Alternative is "listener".</c>
						<c>dtmfclamp</c>
						<c>yes</c>
						<c>Remove detected DTMF digit from audio</c>
						<c>toneclamp</c>
						<c>yes</c>
						<c>Remove loud single-frequency tone from audio</c>
						<c>mixmode</c>
						<c>full</c>
						<c>Be a candidate for the full mix.  Alternatives are "mute" to not allow audio in the mix, "parked" to remove  any media streams from the leg, and "preferred" to give this stream preferential selection in the mix (i.e., even if not loudest talker, include media, if present, from this leg in the mix).</c>
					</texttable>
					<t>In addition to these attributes, there are two tags defined.  They are inputgain and outputgain.  Values for these tags are &lt;auto/&gt;, to use automatic gain control (AGC) to determine input gain for the leg or &lt;fixed/&gt;.  &lt;auto/&gt; takes the attributes "startlevel", "targetlevel", and "silencethreshold".  All of the parameters are in dB.  &lt;fixed&gt; takes the atribute "level", which is in dB.</t>
					<t>The default for both inputgain and outputgain is &lt;auto/&gt;</t>
					<t>If the default parameters are acceptable for the leg the application server wishes to enter into the conference, then a normal SIP INVITE is sufficient.  However, if the application server wishes to modify one or more of the parameters, the application server can include a MSCML body in addition to the SDP body.</t>
					<t>
The application server can modify the conference leg parameters by issuing a SIP INFO on the selected dialog representing the conference leg.  Of course, the application server cannot modify SDP in an INFO message.
			</t>
				</section>
			</section>
			<section title="Terminating a Conference">
				<t>
To remove a leg from the conference, the application server issues a SIP BYE request on the selected dialog representing the conference leg.
			</t>
				<t>
The application server can terminate all legs in a conference by issuing a SIP BYE request on the Conference Control Leg.  If one or more participants are still in the conference when the media server receives a SIP BYE request on the Conference Control Leg, the media server issues SIP BYE requests on all of the remaining conference legs to ensure clean up of the legs.
			</t>
				<t>
The media server returns a 200 OK to the SIP BYE request as it sends BYE requests to the other legs.  This is because we cannot issue a provisional response to a non-INVITE request, yet the teardown of the other legs may "take a while".
			</t>
			</section>
			<section title="Conference Manipulation">
				<t>
Once the conference has begun, the application server can manipulate the conference as a whole by issuing commands on the Conference Leg.  For example, the application server can request the media server to record the conference, play a prompt to the conference, change the input or output gain for the conference as a whole, and report on events.  The elements for these commands are &lt;playrecord&gt;, &lt;play&gt;, &lt;inputgain&gt;, &lt;outputgain&gt;, and &lt;subscribe&gt;, respectively.
			</t>
				<t>
					<xref target="F.full"/> and <xref target="F.fullrec"/> show two sample commands.  The first plays a prompt into the conference.  The second records the entire conference to the URI specified by recurl.  This file: URI scheme happens to do the write over NFS, per configuration at the media server.
					<list style="empty">
						<t>NOTE:  The provisioning of NFS mount points and their mapping to the file: schema is purely a local matter at the media server.</t>
					</list>
				</t>
				<figure title="Full Conference Audio Command - Play" anchor="F.full">
					<artwork><![CDATA[
     <?xml version="1.0" encoding="utf-8"?>
       <MediaServerControl version="1.0">
         <request>
           <play
 prompturl="http://prompts.example.net/us_EN/welcome.au"/>
         </request>
       </MediaServerControl>
       		]]></artwork>
				</figure>
				<figure title="Full Conference Audio Command - Record" anchor="F.fullrec">
					<artwork><![CDATA[
     <?xml version="1.0" encoding="utf-8"?>
       <MediaServerControl version="1.0">
         <request>
           <playrecord
 recurl="file://archive.example.net/conferences/archives/011208.au"
                         beep="no"
                         initsilence="infinite"
						 endsilence="infinite" />
         </request>
       </MediaServerControl>
				]]></artwork>
				</figure>
				<t>
The response to this last request will be similar to <xref target="F.changeResp"/>.
			</t>
				<figure title="Sample Change Command Response" anchor="F.changeResp">
					<artwork><![CDATA[
  <?xml version="1.0" encoding="utf-8"?>
    <MediaServerControl version="1.0">
     <response request="playrecord" code="200" text="OK"
               reclength="1420374"/>
  </MediaServerControl>
				]]></artwork>
				</figure>
				<t>A request for an active talker report is in <xref target="F.atr"/>.</t>
				<figure title="Active Talker Request" anchor="F.atr">
					<artwork><![CDATA[
<?xml version="1.0" encoding="utf-8"?>
  <MediaServerControl version="1.0">
    	<request>
       <configure_conference>
         <subscribe>
           <events>
             <activetalkers/>
           </events>
         </subscribe>
       </configure_conference> 
     </request>
  </MediaServerControl>
					]]></artwork>
				</figure>
				<t>
Later event reporting comes through SIP INFO messages.  <xref target="F.active"/> shows an example report.
			</t>
				<figure title="Active Talker Event Example" anchor="F.active">
					<artwork><![CDATA[
     <?xml version="1.0" encoding="utf-8"?>
       <MediaServerControl version="1.0">
         <notification>
           <conference uniqueID="ab34h76z" numtalkers="16"
                       numlisteners="1382">
             <activetalkers>
               <talker callID="myhost4sn123"/>
               <talker callID="myhost2sn456"/>
               <talker callID="myhost12sn78"/>
             </activetalkers>
           </conference>
         </notification>
       </MediaServerControl>
				]]></artwork>
				</figure>
				<t>
An application server can modify a leg by issuing an INFO on the dialog associated with the participant leg.  For example, <xref target="F.changeLeg"/> mutes a conference leg.
			</t>
				<figure title="Sample Change Leg Command" anchor="F.changeLeg">
					<artwork><![CDATA[
     <?xml version="1.0" encoding="utf-8"?>
       <MediaServerControl version="1.0">
         <request>
           <configure_leg mixmode="mute"/>
         <request>
       </MediaServerControl>
				]]></artwork>
				</figure>
				<t>
In <xref target="F.full"/> we saw a request to play a prompt to the entire conference.  We can also request to play a prompt to an individual call leg.  If we want to play a prompt or collect digits only on a single leg, we issue the commands within the dialog for the of the desired conference participant.
			</t>
				<t>
					<xref target="S.ivr"/> describes the interactive voice response (IVR) services offered.  If an IVR command arrives on the control channel, it takes effect on the whole conference.  This is a mechanism for playing prompts to the entire conference (e.g., announcing new participants).  If an IVR command arrives on an individual leg, it only affects that leg.  This is a mechanism for interacting with users, such as to create "waiting rooms", allow a user to mute themselves using key presses, allowing a moderator to out-dial, etc.</t>
			</section>
		</section>
		<section title="Interactive Voice Response (IVR)" anchor="S.ivr">
			<t>
In the IVR model, the Media Server acts as a media processing proxy for the UAC.  This is particularly useful when the UAC is a media gateway or other device with limited media processing capability.
			</t>
			<figure title="IVR Model" anchor="F.ivr">
				<artwork><![CDATA[
                     SIP      +--------------+
                 Service URI  | Application  |
              /---------------|    Server    |
             /(e.g., RFC3087) +--------------+
            /                        |  MSCML
           /                     SIP | Session
          /                   +--------------+
  +-----+/       RTP          |              |
  | UAC |=====================| Media Server |
  +-----+                     |              |
                              +--------------+
				]]></artwork>
			</figure>
			<t>
The IVR service supports basic Interactive Voice Response functions, playing announcements, collecting DTMF digits, and recording audio, based on Media Server Control Markup Language (MSCML) directives added to the message body of a SIP request.  <xref target="F.ivr"/> shows the signaling relationship between a client UAC, and Application Server, and a Media Server.
			</t>
			<t>
Multifunction media servers SHOULD use the URI conventions described in <xref target="I-D.burger-sipping-netann">Basic Network Media Services with SIP</xref>.  For review, the MSCML IVR service indicator is "ivr":
			</t>
			<figure>
				<artwork>sip:ivr@ms.example.net</artwork>
			</figure>
			<t>
				<list style="empty">
					<t>NOTE:  The VoiceXML IVR service indicator is dialog.</t>
				</list>
One may carry the request payload for IVR in either the initial SIP INVITE or INFO requests. 
			</t>
			<t>
Mid-call requests must use the INFO method.  The INFO method reduces certain timing issues that occur with re-INVITES and also uses less processing on both the application server and Media Server.
			</t>
			<t>
The Media Server notifies the application that the command has completed through a &lt;response&gt; message containing final status information and data such as collected DTMF digits.
			</t>
			<t>
The media server does not queue IVR requests.  If the media server receives a request while another is in progress, the media server stops the first operation and it carries out the new request.  The Media Server generates a &lt;response&gt; message for the first request and returns any data collected up to that point. If an application wishes to stop a request in progress but does not wish to initiate another operation, it issues a &lt;stop&gt; request.  This also causes the Media Server to generate a &lt;response&gt; message.
			</t>
			<t>
The Media Server treats a SIP re-INVITE with hold media (c=0.0.0.0) as an implicit &lt;stop&gt; request.  The media server immediately terminates the running &lt;play&gt;, &lt;playcollect&gt; or &lt;playrecord&gt; request, and sends a &lt;response&gt;, indicating "reason=stopped".
			</t>
			<section title="Play Audio &lt;play&gt;">
				<t>
The application issues a &lt;play&gt; request to play an announcement without interruption and with no digit collection.  One use, for example, is to announce the name of a new participant to the entire conference.
				</t>
				<t>
The application specifies the announcement to play by the prompt block in the body of the request. 
				</t>
				<t>
Attributes include promptencoding (optional), which explicitly specifies the encoding (mu-law, A-law, MS-GSM, etc.), and id (also optional).  ID is an application-defined request identifier that correlates the asynchronous response with its original request and echoes back to the application in the Media Server's response.
				</t>
				<t>
When the announcement has finished playing, the Media Server sends a &lt;response=&gt; payload to the application in a SIP INFO message. 
				</t>
				<t>
The response may carry the id, the status code (e.g., 200), the status text (e.g., OK), and the reason (EOF or stopped).
				</t>
			</section>
			<section title="Collect Digits &lt;playcollect&gt;">
				<t>
The application issues a &lt;playcollect&gt; request to optionally play an announcement and then collect digits.
				</t>
				<t>
This request has multiple attributes, all of which are optional.
				</t>
				<t>
The presence or absence of the prompt block controls whether there will be an announcement or the result of the request is to be digit collection only.
				</t>
				<t>
Whenever the media server receives a &lt;playcollect&gt; request, it will continuously buffer and examine collected digits.  The media server compares previously buffered digits to the returnkey, escapekey, and maxdigits attributes to determine if any immediate action is required.  This provides the type-ahead behavior for menu traversal and other types of IVR interactions. 
				</t>
				<t>
The application may override type-ahead behavior by setting the cleardigits parameter to "yes", which removes all previously-buffered digits such that the only user input considered is what occurs after the request.
				</t>
				<t>
If cleardigits is set to "no", digits previously buffered will result in the prompt being barged immediately.  Prompt play would never begin, and digit collection would start immediately.
				</t>
				<t>
The default for barge is "yes".  If the barge attribute is set to "no", the cleardigits attribute implicitly has a value of "yes".  This ensures that DTMF input occurring before the current collection is not left in the buffer after the request completes.
				</t>
				<t>
The application can set two special strings to invoke special processing when detected:
				<list style="symbols">
						<t>
The escapekey, which defaults to *, indicates that the user intends to terminate the current operation without saving any input collected to that point.  Detection terminates the request immediately and generates a response. 
					</t>
						<t>
The returnkey, which defaults to #, indicates the user has completed input and wants to return all collected digits to the application.  When the media server detects the returnkey, it immediately terminates collection and returns the collected digits to the application in the &lt;response&gt; message.
					</t>
					</list>
				</t>
				<t>
The media server may also support three additional strings to support VCR controls while playing a prompt.  These strings modify the behavior of the playing of the prompt block.  If the media server does not support VCR controls, it must silently ignore the request.
				<list style="symbols">
						<t>
The skipinterval, which defaults to "6s", indicates how far the media server should skip backwards or forwards in the currently playing object from prompturl.  
					</t>
						<t>
The ffkey indicates the user wishes to skip forward skipinterval in the currently playing object from prompturl.
					</t>
						<t>
The rwkey indicates the user wishes to skip backward skipinterval in the currently playing object form prompturl.
					</t>
					</list>
Note that it is an error to have the digits mapped to ffkey or rwkey in the digitmap.				
				</t>
				<t>
The VCR controls only work within a single &lt;prompt&gt; block.  Skipping-back before the begining of the block results in playback at the beginning of the block.  Skiping-forward past the end of the block results in the media server treating the prompt as played. 
				</t>
				<t>
					<list style="empty">
						<t>NOTE: This is only a very rudimentary implementation of VCR controls.  Application developers are STRONGLY RECOMMENDED to use the interrupt time returned in the digit report to calculate where to skip.  This enables sensible handling of composite voice objects, etc.  If an application developer needs real VCR controls, they are STRONGLY RECOMMENDED to use VoiceXML with VCR extensions.</t>
					</list>
				</t>
				<t>
Several timer attributes control how long the Media Server waits for digits in the input sequence.  All timer settings are in milliseconds.
				<list style="hanging">
						<t hangText="firstdigittimer">
controls how long the Media Server waits for the initial DTMF input before terminating collection.
					</t>
						<t hangText="interdigittimer">
controls how long the Media Server waits between DTMF inputs. 
					</t>
						<t hangText="extradigittimer">
controls how long the Media Server waits for additional user input after the specified number of digits has been collected. 
					</t>
					</list>
				</t>
				<t>
The extradigittimer setting enables the "returnkey" input to be associated with the current collection.  For example, if maxdigits is set to 3 and returnkey is set to #, the user may enter either "x#", "xx#" or "xxx#", where x represents a DTMF digit. 
				</t>
				<t>
If the "returnkey" pattern is detected during the "extradigit" interval, the collected digits are returned to the application and the "returnkey" is removed from the digit buffer. 
				</t>
				<t>
If this were not the case, the example would return "xxx" to the application and leave the terminating "#" in the digit buffer to be processed by the next &lt;playcollect&gt; request.  This might result in the termination of the following prompt; clearly not what the user intended. 
				</t>
				<t>
The extradigittimer has no effect unless returnkey has been set.
				</t>
				<t>
The &lt;regex&gt; element specifies a digit pattern for the media server to look for.  MSCML supports three modes of digit map specification: regular expressions, <xref target="RFC3435">MGCP</xref> digit maps, and <xref target="RFC3525">H.248.1</xref> digit maps.  The type attribute indicates what kind of digit map appears in the expression.
				<list style="hanging">
						<t hangText="regex">The default; use regular expression matching.</t>
						<t hangText="mgcpdigitmap">Use digit maps as specified in <xref target="RFC3435">MGCP</xref>.</t>
						<t hangText="megacodigitmap">Use digit maps as specified in <xref target="RFC3525">H.248.1</xref>.</t>
					</list>
				</t>
				<t>
When the &lt;playcollect&gt; has finished playing, the Media Server sends a &lt;response&gt; payload to the application in a SIP INFO message. 
				</t>
				<t>
The response may carry the id, the code (e.g., 200), the text(e.g., OK), the reason (match, timeout, returnkey, escapekey, or stopped), and the collected digits. 
				</t>
			</section>
			<section title="Recording Audio &lt;playrecord&gt;">
				<t>
The &lt;playrecord&gt; request directs the Media Server to capture the RTP it receives and deliver it to a URI specified by the controlling application in the appropriate codec and content encoding.
				</t>
				<t>
This tag has multiple attributes. The required recurl attribute identifies the URI target for the recorded audio.  All other attributes are optional.
				</t>
				<t>
The presence or absence of the prompt block controls whether or not a prompt plays before recording begins.
				</t>
				<t>
When the application requests the media server to prompt the caller before recording audio, &lt;playrecord&gt; has two stages.  The first is equivalent to a &lt;playcollect&gt; operation.  The application may set the prompt phase to be interruptible by DTMF input (barge) and may also specify an escape key that will terminate the &lt;playrecord&gt; request before the recording phase begins. 
				</t>
				<t>
Detection of the escape key generates a response message, and the operation returns immediately.  If any other keys are pressed and if the prompt has been set as interruptible (barge="yes"), then the play stops immediately and the recording phase begins. 
				</t>
				<t>
Any digits collected in the prompt phase, with the exception of the recstopmask, are buffered and returned in the response. 
				</t>
				<t>
If the request proceeds to the recording phase, any digits from the collect phase are discarded from the buffer to eliminate unintended termination of the recording.
				</t>
				<t>
The media server compares digits detected during the recording phase to the digits specified in the recstopmask to determine if they indicate a recording termination request.
				</t>
				<t>
The media server ignores digits not present in the recstopmask and passes them into the recording.  If the recording is terminated because of a DTMF input, the collected digits are returned to the application in the &lt;response&gt;.
				</t>
				<t>
Once recording has begun, the media server writes the audio to the specified recurl URL no matter what DTMF events are detected.  It is the responsibility of the application to examine the DTMF input returned in the &lt;response&gt; message to determine whether the audio file should be saved or if it should be deleted and potentially re-recorded.
				</t>
				<t>
Two attributes control how long the Media Server waits for the start of speech to begin the recording and the absence of speech to end the recording:
				<list style="hanging">
						<t hangText="initsilence">
determines how long to wait for initial speech input before terminating (canceling) the recording.  This parameter may take an integer value in milliseconds, or may be set to &quot;infinite&quot;, which directs the Media Server to wait indefinitely. The default is 3000 ms (3 seconds).
					</t>
						<t hangText="endsilence">
determines how long the Media Server waits after speech has ended to stop the recording.  This parameter may take an integer value in milliseconds, or may be set to &quot;infinite&quot;. With a value of &quot;infinite&quot;, the recording will continue indefinitely after speech has ended and will only terminate due to a DTMF keypress or because the maximum desired duration has been reached. The default value is 4000 ms (4 seconds).
					</t>
					</list>
				</t>
				<t>
If the endsilence timer expires, the Media Server trims the end of the recorded audio by an amount equal to the endsilence parameter. 
				</t>
				<t>
Additional attributes are:
					<list style="hanging">
						<t hangText="mode">
whether the recording will overwrite or append.
						</t>
						<t hangText="reencoding">
whether encoding is mu-law, A-law, msgsm, etc.
						</t>
						<t hangText="duration">
time in ms for the entire recording.
						</t>
						<t hangText="beep">
whether a beep will signify the start of recording.
						</t>
					</list>
				</t>
				<t>
When the recording is finished, the media server generates a &lt;response&gt; message and sends it to the application in a SIP INFO message.  The response contains the id, the code (e.g., 200, 400, 501), the reason (e.g., digit, end_silence, init_silence, max_duration, escapekey, error, or stopped), collected digits, and the reclength (size of the recorded file in bytes).
				</t>
				<t>
The <xref target="F.record">recording example</xref> plays a prompt ("SayName.g11") and records it to the recurl in MS-GSM format, wave-encoded.
				</t>
				<figure title="Recording Example" anchor="F.record">
					<artwork><![CDATA[
  <playrecord
    prompturl="http://prompts.example.net/us_EN/SayName.g711"
    recurl="file://nfs.example.net/names/greet-joij34923119.wav"
    recencoding="msgsm"
    initsilence="15s"
    endsilence="2s"
    duration="8s">
  </playrecord>
				]]></artwork>
				</figure>
			</section>
			<section title="Stop Request &lt;stop&gt;">
				<t>
The application issues a &lt;stop&gt; request when the objective is to stop a request in progress and not initiate another operation. This request generates a &lt;response&gt; message from the Media Server.
				</t>
				<t>
The only attribute is id, which is optional.
				</t>
				<t>
The application-defined request id correlates the asynchronous response with its original request and echoes back to the application in the Media Server's response.
				</t>
				<t>
The response may carry the id, the code (e.g., 200), and the text (e.g., OK).
				</t>
				<t>
Note that the Media Server treats a SIP re-INVITE with hold media as an implicit &lt;stop&gt; request.  The media server immediately terminates the running &lt;play&gt;, &lt;playcollect&gt; or &lt;playrecord&gt; request, and sends a &lt;response&gt;, indicating "reason=stopped".
				</t>
			</section>
			<section title="Prompt Block &lt;prompt&gt;">
				<t>
This block in the body of the &lt;play&gt;, &lt;playcollect&gt;, or &lt;playrecord&gt; request contains one or more references to physical audio files, provisioned sequences, or variables that are played in the order in which they appear.
				</t>
				<t>
					<xref target="F.event"/> shows a sample prompt block.
				</t>
				<figure title="Active Talker Event Example" anchor="F.event">
					<artwork><![CDATA[
    <prompt baseurl="file:////opt/snowshore/prompts/conf/">
		<audio url="please_enter.wav"/>
		<variable type="silence" value="1"/>
		<audio url="your.raw" encoding="a-law"/>
		<variable type="silence" value="1"/>
		<audio
 		   url="http://prompts.example.net/pin_number.wav"/>
     </prompt>
				]]></artwork>
				</figure>
				<t>
The baseurl attribute is the base URL prepended to the URL attributes within the &lt;prompt&gt; block.
				</t>
				<t>
Each audio element in a &lt;prompt&gt; block refers to an audio file or provisioned sequence for the media server to play.  The media server plays audio files in the order in which they are listed in the block.
				</t>
			</section>
		</section>
		<section title="Fax Processing">
			<section title="Recording Fax &lt;faxrecord&gt;">
				<t>
The &lt;faxrecord&gt; request directs the Media Server to process a fax in answer mode.  The reason for a separate tag from the &lt;playrecord&gt; tag is because the Media Server needs to know to process the <xref target="T.30">T.30</xref> or <xref target="T.38">T.38</xref> fax protocols.
			</t>
				<t>
This tag has multiple attributes.  The lclid attribute is a string that identifies the called station.  The lclid attribute is optional.  The default is null.
			</t>
				<t>
The &lt;faxrecord&gt; request operates in one of three modes: receive, poll, and turnaround poll.
			</t>
				<t>
In receive mode, the Media Server receives the fax and writes the fax data to the URI specified by the recurl attribute.
			</t>
				<t>
In poll mode, the Media Server sends a fax, but as a polled (called) device.
			</t>
				<t>
In turnaround poll mode, the Media Server will record a fax that the remote machine sends.  If the remote machine requests a transmission, then the Media Server will send the fax.
			</t>
				<t>
The recurl attribute is the URI to record the fax to, if specified.
			</t>
				<t>
The prompturl attribute is the URI to fetch the fax to transmit, if specified.
			</t>
				<t>
The rmtid attribute specifies the calling station identifier of the remote terminal.  If specified, the media server MUST reject transactions with the remote terminal if the remote terminal's identifier does not match rmtid.
			</t>
				<t>
The combination of prompturl and recurl define the mode.  See <xref target="fax-rec-modes"/>.
				</t>
				<texttable anchor="fax-rec-modes" title="Fax Receive Modes">
					<ttcol>prompturl</ttcol>
					<ttcol>recurl</ttcol>
					<ttcol>Mode</ttcol>
					<ttcol>Operation</ttcol>
					<c>no</c>
					<c>no</c>
					<c>Invalid</c>
					<c>Request fails.</c>
					<c>no</c>
					<c>yes</c>
					<c>Receive</c>
					<c>Record fax into recurl.</c>
					<c>yes</c>
					<c>no</c>
					<c>Poll</c>
					<c>Send fax from prompturl.  If rmtid is specified, it must match remote terminal's identifier, or the request will fail.</c>
					<c>yes</c>
					<c>yes</c>
					<c>Turnaround Poll</c>
					<c>If the remote terminal wishes to transmit, the Media Server records the fax into recurl.  If the remote terminal wishes to receive, the Media Server sends the fax from prompturl.  If rmtid is specified, it must match remote terminal's identifier, or the send request will fail.  A receive operation will still succeed, however.</c>
				</texttable>
				<t>
The Media Server MUST flush any quarantined digits when it receives a &lt;faxrecord&gt; request.
				</t>
			</section>
			<section title="Sending Fax &lt;faxplay&gt;">
				<t>
The &lt;faxplay&gt; request directs the Media Server to process a fax in originate mode.  The reason for a separate tag from the &lt;play&gt; tag is because the Media Server needs to know to process the <xref target="T.30">T.30</xref> or <xref target="T.38">T.38</xref> fax protocols.
				</t>
				<t>
This tag has multiple attributes.  The lclid attribute is a string that identifies the Media Server as the calling station in the DIS message.  The lclid attribute is optional.  The default is null.
				</t>
				<t>
The &lt;faxplay&gt; request operates in one of three modes: send, remote poll, and turnaround poll.
				</t>
				<t>
In send mode, the Media Server sends the fax.
				</t>
				<t>
In remote poll mode, the Application Server places a call on behalf of the Media Server.  The Media Server requests a fax transmission from the remote fax terminal.
				</t>
				<t>
In turnaround poll mode, the Media Server will record a fax that the remote machine sends.  If the remote machine requests a transmission, then the Media Server will send the fax.
				</t>
				<t>
The recurl attribute is the URI to record the fax to, if specified.  The Media Server will advertise in the 
DIS message it can receive fax transmissions.
				</t>
				<t>
The prompturl attribute is the URI to fetch the fax to transmit, if specified.  The Media Server will advertise in the DIS message it can send fax transmissions.
				</t>
				<t>
The rmtid attribute specifies the calling station identifier of the remote terminal.  If specified, the media server MUST reject transactions with the remote terminal if the remote terminal's identifier does not match rmtid.
				</t>
				<t>
The combination of prompturl and recurl define the mode.  See <xref target="fax-send-modes"/>.
				</t>
				<texttable anchor="fax-send-modes" title="Fax Send Modes">
					<ttcol>prompturl</ttcol>
					<ttcol>recurl</ttcol>
					<ttcol>Mode</ttcol>
					<ttcol>Operation</ttcol>
					<c>no</c>
					<c>no</c>
					<c>Invalid</c>
					<c>Request fails.</c>
					<c>yes</c>
					<c>no</c>
					<c>Send</c>
					<c>Send fax from prompturl.  If rmtid is specified, it must match remote terminal's identifier, or the receive request will fail.</c>
					<c>no</c>
					<c>yes</c>
					<c>Poll</c>
					<c>Send fax from prompturl, assuming the remote terminal specifies it can receive a fax in its DIS message.  It the remote terminal does not support reverse polling, the request will fail.  If rmtid is specified, it must match remote terminal's identifier, or the request will fail.</c>
					<c>yes</c>
					<c>yes</c>
					<c>Turnaround Poll</c>
					<c>If the remote terminal wishes to transmit, the Media Server records the fax into recurl.  If the remote terminal wishes to receive, the Media Server sends the fax from prompturl.  If rmtid is specified, it must match remote terminal's identifier, or the send request will fail.  A receive operation will still succeed, however.</c>
				</texttable>
				<t>
The Media Server MUST flush any quarantined digits when it receives a &lt;faxplay&gt; request.
				</t>
			</section>
		</section>
		<section title="Response Attributes and Return Codes">
			<section title="Mechanism">
				<t>
The Media Server acknowledges receipt of an application request by sending a response of either 200 OK or 415 BAD MEDIA TYPE.  (The latter is sent when the SIP request contains a content type other than "application/sdp" or "application/mediaservercontrol+xml"). 
				</t>
				<t>
The &lt;response&gt; message is transported in a SIP INFO request.
				</t>
				<t>
If there is an error in the request or the request cannot be completed, the &lt;response&gt; message is sent very shortly after receiving the request. If the request is able to proceed, the &lt;response&gt; contains final status information as listed below.
				</t>
			</section>
			<section title="&lt;response&gt; Attributes">
				<t>
If the request specified an ID, the response will echoed the ID.
				</t>
				<t>
The "code" is the result code for the request.  It can take the following values.
					<list style="symbols">
						<t>200 indicates command completed.</t>
						<t>
400 for &lt;playrecord&gt;, &lt;faxrecord&gt;, and &lt;faxplay&gt; indicates command not accepted due to an error. The text attribute describes the cause of the error.
						</t>
						<t>
501 for &lt;playrecord&gt;, &lt;faxrecord&gt;, and &lt;faxplay&gt; indicates an error because the media server does not support the URL type specified.
						</t>
					</list>
				</t>
				<t>
The "digits" are the returned digits for &lt;playcollect&gt; and &lt;playrecord&gt;.  Its value is the collected digits, if any.
				</t>
				<t>
The "reason" is why the command terminated.  For all requests, the reason "stopped" indicates that a &lt;stop&gt; request, another command, or a re-INVITE with hold media stopped the request.
				</t>
				<t>
For the &lt;play&gt; request, the "EOF" reason means the media server played out to the end of the file.
				</t>
				<t>
For the &lt;playcollect&gt; request, a reason of "match" means a match was found; "timeout" means no digit was received before the time-out timer expired; "returnkey" and "escapekey" means the return key or escape key terminated the operation, respectively; and "interrupted" means another request interrupted the &lt;playcollect&gt; request.
				</t>
				<t>
For the &lt;playrecord&gt; request, a reason of "digit" means a digit was detected; "end_silence" means the recording terminated because the trailing silence timer expired; "init_silence" means that no voice was detected; "max_duration" means the recording terminated because the maximum time for recording completed; "escapekey" means the user entered the escape key in either play or record mode, thus terminating the recording; or "error", for a general operation failure.
				</t>
				<t>
For the &lt;faxplay&gt; and &lt;faxrecord&gt; requests, a reason of "complete" means successful completion, even if there were bad lines or minor negotiation problems, i.e., a DCN was received; "disconnect" means the session was disconnected; "notfax" means no DIS or DCS was received on the connection.
				</t>
				<t>
The "reclength" is the length of the recording in bytes for a &lt;playrecord&gt;.
				</t>
				<t>
The "text" is the descriptive text associated with the response code.
				</t>
				<t>
For the &lt;faxplay&gt; and &lt;faxrecord&gt; requests, the faxcode attribute is the binary-or of the following bit patterns.
				</t>
				<texttable title="Faxcode Mask">
					<ttcol>Mask</ttcol>
					<ttcol>description</ttcol>
					<c>0</c>
					<c>Operation Failed</c>
					<c>1</c>
					<c>Operation Succeeded</c>
					<c>2</c>
					<c>Partial Success</c>
					<c>4</c>
					<c>Image received and placed in recurl</c>
					<c>8</c>
					<c>Image sent from prompturl</c>
					<c>16</c>
					<c>rmtid did not match</c>
					<c>32</c>
					<c>Error reading prompturl</c>
					<c>64</c>
					<c>Error writing recurl</c>
					<c>128</c>
					<c>Negotiation failure on send phase</c>
					<c>256</c>
					<c>Negotiation failure on receive phase</c>
					<c>512</c>
					<c>Reserved</c>
					<c>1024</c>
					<c>Irrecoverable IP packet loss</c>
					<c>2048</c>
					<c>Line errors in received image</c>
				</texttable>
			</section>
		</section>
		<section title="Formal Syntax">
			<t>
The following syntax specification uses the augmented Data Type Definition (DTD) as described in <xref target="W3C.REC-xmlschema-1-20010502">XML</xref>.
			</t>
			<section title="Schema">
				<figure>
					<artwork><![CDATA[
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           elementFormDefault="qualified">
 <xs:element name="MediaServerControl">
  <xs:complexType>
   <xs:choice>
    <xs:element name="request">
     <xs:complexType>
      <xs:choice>
       <xs:element name="configure_conference">
        <xs:complexType>
         <xs:sequence>
          <xs:element name="inputgain" type="inputgainType" 
                      minOccurs="0"/>
          <xs:element name="outputgain" type="outputgainType"
                      minOccurs="0"/>
          <xs:element name="subscribe" minOccurs="0">
           <xs:complexType>
            <xs:sequence>
             <xs:element name="events">
              <xs:complexType>
               <xs:sequence>
                <xs:element name="activetalkers"
                            type="activetalkersType"/>
               </xs:sequence>
              </xs:complexType>
             </xs:element>
            </xs:sequence>
           </xs:complexType>
          </xs:element>
         </xs:sequence>
         <xs:attribute name="id" type="xs:string"/>
         <xs:attribute name="reservedtalkers" type="xs:string"/>
         <xs:attribute name="reserveconfmedia">
          <xs:simpleType>
           <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="yes"/>
            <xs:enumeration value="no"/>
           </xs:restriction>
          </xs:simpleType>
         </xs:attribute>
        </xs:complexType>
       </xs:element>
       <xs:element name="configure_leg">
        <xs:complexType>
         <xs:sequence>
          <xs:element name="inputgain" type="inputgainType"
                      minOccurs="0"/>
          <xs:element name="outputgain" type="outputgainType"
                      minOccurs="0"/>
         </xs:sequence>
         <xs:attribute name="id" type="xs:string"/>
         <xs:attribute name="type">
          <xs:simpleType>
           <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="talker"/>
            <xs:enumeration value="listener"/>
           </xs:restriction>
          </xs:simpleType>
         </xs:attribute>
         <xs:attribute name="mixmode">
          <xs:simpleType>
           <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="full"/>
            <xs:enumeration value="mute"/>
            <xs:enumeration value="preferred"/>
            <xs:enumeration value="parked"/>
           </xs:restriction>
          </xs:simpleType>
         </xs:attribute>
         <xs:attribute name="dtmfclamp">
          <xs:simpleType>
           <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="yes"/>
            <xs:enumeration value="no"/>
           </xs:restriction>
          </xs:simpleType>
         </xs:attribute>
         <xs:attribute name="toneclamp">
          <xs:simpleType>
           <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="yes"/>
            <xs:enumeration value="no"/>
           </xs:restriction>
          </xs:simpleType>
         </xs:attribute>
        </xs:complexType>
       </xs:element>
       <xs:element name="play">
        <xs:complexType>
         <xs:sequence minOccurs="0">
          <xs:element name="prompt" type="promptType"/>
         </xs:sequence>
         <xs:attribute name="id" type="xs:string"/>
         <xs:attribute name="prompturl" type="xs:string"/>
         <xs:attribute name="offset" type="xs:string"/>
         <xs:attribute name="promptencoding" type="xs:string"/>
        </xs:complexType>
       </xs:element>
       <xs:element name="playcollect">
        <xs:complexType>
         <xs:sequence>
          <xs:element name="prompt" type="promptType"
                      minOccurs="0"/>
          <xs:element name="regex" minOccurs="0">
           <xs:complexType>
            <xs:attribute name="type" default="regex">
             <xs:simpleType>
              <xs:restriction base="xs:NMTOKEN">
               <xs:enumeration value="regex"/>
               <xs:enumeration value="mgcpdigitmap"/>
              </xs:restriction>
             </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="value" type="xs:string"
                          use="required"/>
            <xs:attribute name="id" type="xs:string"/>
           </xs:complexType>
          </xs:element>
         </xs:sequence>
         <xs:attribute name="id" type="xs:string"/>
         <xs:attribute name="prompturl" type="xs:string"/>
         <xs:attribute name="offset" type="xs:string"/>
         <xs:attribute name="barge" default="yes">
          <xs:simpleType>
           <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="yes"/>
            <xs:enumeration value="no"/>
           </xs:restriction>
          </xs:simpleType>
         </xs:attribute>
         <xs:attribute name="promptencoding" type="xs:string"/>
         <xs:attribute name="cleardigits" type="xs:string"
                       default="yes"/>
         <xs:attribute name="maxdigits" type="xs:string"/>
         <xs:attribute name="firstdigittimer" type="xs:string"/>
         <xs:attribute name="interdigittimer" type="xs:string"/>
         <xs:attribute name="extradigittimer" type="xs:string"/>
         <xs:attribute name="skipinterval" type="xs:string"
                       default="6s"/>
         <xs:attribute name="ffkey" type="xs:string"/>
         <xs:attribute name="rwkey" type="xs:string"/>
         <xs:attribute name="returnkey" type="xs:string"
                       default="#"/>
         <xs:attribute name="escapekey" type="xs:string"
                       default="*"/>
        </xs:complexType>
       </xs:element>
       <xs:element name="playrecord">
        <xs:complexType>
         <xs:sequence minOccurs="0">
          <xs:element name="prompt" type="promptType"/>
         </xs:sequence>
         <xs:attribute name="id" type="xs:string"/>
         <xs:attribute name="prompturl" type="xs:string"/>
         <xs:attribute name="offset" type="xs:string"/>
         <xs:attribute name="barge">
          <xs:simpleType>
           <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="yes"/>
            <xs:enumeration value="no"/>
           </xs:restriction>
          </xs:simpleType>
         </xs:attribute>
         <xs:attribute name="cleardigits">
          <xs:simpleType>
           <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="yes"/>
            <xs:enumeration value="no"/>
           </xs:restriction>
          </xs:simpleType>
         </xs:attribute>
         <xs:attribute name="escapekey" type="xs:string"
                       default="*"/>
         <xs:attribute name="recurl" type="xs:string"
                       use="required"/>
         <xs:attribute name="mode" default="overwrite">
          <xs:simpleType>
           <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="append"/>
            <xs:enumeration value="overwrite"/>
           </xs:restriction>
          </xs:simpleType>
         </xs:attribute>
         <xs:attribute name="recencoding" type="xs:string"/>
         <xs:attribute name="initsilence" type="xs:string"/>
         <xs:attribute name="endsilence" type="xs:string"/>
         <xs:attribute name="duration" type="xs:string"/>
         <xs:attribute name="beep" default="yes">
          <xs:simpleType>
           <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="yes"/>
            <xs:enumeration value="no"/>
           </xs:restriction>
          </xs:simpleType>
         </xs:attribute>
         <xs:attribute name="recstopmask" type="xs:string"
                       default="01234567890*#"/>
        </xs:complexType>
       </xs:element>
       <xs:element name="faxplay">
        <xs:complexType>
         <xs:attribute name="lclid" type="xs:string"/>
         <xs:attribute name="prompturl" type="xs:string"/>
         <xs:attribute name="recurl" type="xs:string"/>
         <xs:attribute name="rmtid" type="xs:string"/>
        </xs:complexType>
       </xs:element>
       <xs:element name="faxrecord">
        <xs:complexType>
         <xs:attribute name="lclid" type="xs:string"/>
         <xs:attribute name="prompturl" type="xs:string"/>
         <xs:attribute name="recurl" type="xs:string"/>
         <xs:attribute name="rmtid" type="xs:string"/>
        </xs:complexType>
       </xs:element>
       <xs:element name="stop">
        <xs:complexType/>
       </xs:element>
       <xs:any namespace="##any"/>
      </xs:choice>
     </xs:complexType>
    </xs:element>
    <xs:element name="response">
     <xs:complexType>
      <xs:attribute name="request" use="required">
       <xs:simpleType>
        <xs:restriction base="xs:NMTOKEN">
         <xs:enumeration value="configure_conference"/>
         <xs:enumeration value="configure_leg"/>
         <xs:enumeration value="play"/>
         <xs:enumeration value="playcollect"/>
         <xs:enumeration value="playrecord"/>
         <xs:enumeration value="faxplay"/>
         <xs:enumeration value="faxrecord"/>
         <xs:enumeration value="stop"/>
        </xs:restriction>
       </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="id" type="xs:string"/>
      <xs:attribute name="code" type="xs:string" use="required"/>
      <xs:attribute name="text" type="xs:string" use="required"/>
      <xs:attribute name="reason" type="xs:string"/>
      <xs:attribute name="reclength" type="xs:string"/>
      <xs:attribute name="digits" type="xs:string"/>
      <xs:attribute name="playduration" type="xs:string"/>
      <xs:attribute name="faxcode" type="xs:string"/>
      <xs:attribute name="pages_sent" type="xs:string"/>
      <xs:attribute name="pages_recv" type="xs:string"/>
     </xs:complexType>
    </xs:element>
    <xs:element name="notification">
     <xs:complexType>
      <xs:sequence>
       <xs:element name="conference">
        <xs:complexType>
         <xs:sequence>
          <xs:element name="activetalkers"
                      type="activetalkersType"/>
         </xs:sequence>
         <xs:attribute name="uniqueid" type="xs:string"
                       use="required"/>
         <xs:attribute name="numtalkers" type="xs:string"
                       use="required"/>
        </xs:complexType>
       </xs:element>
      </xs:sequence>
     </xs:complexType>
    </xs:element>
   </xs:choice>
   <xs:attribute name="version" use="required">
    <xs:simpleType>
     <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="1.0"/>
     </xs:restriction>
    </xs:simpleType>
   </xs:attribute>
  </xs:complexType>
 </xs:element>
 <xs:complexType name="activetalkersType">
  <xs:sequence minOccurs="0">
   <xs:element name="talker" maxOccurs="unbounded">
    <xs:complexType>
     <xs:attribute name="callid" type="xs:string" use="required"/>
    </xs:complexType>
   </xs:element>
  </xs:sequence>
  <xs:attribute name="report" default="no">
   <xs:simpleType>
    <xs:restriction base="xs:NMTOKEN">
     <xs:enumeration value="yes"/>
     <xs:enumeration value="no"/>
    </xs:restriction>
   </xs:simpleType>
  </xs:attribute>
  <xs:attribute name="interval" type="xs:string"/>
 </xs:complexType>
 <xs:complexType name="autoType">
  <xs:attribute name="startlevel" type="xs:string"/>
  <xs:attribute name="targetlevel" type="xs:string"/>
  <xs:attribute name="silencethreshold" type="xs:string"/>
 </xs:complexType>
 <xs:complexType name="fixedType">
  <xs:attribute name="level" type="xs:string"/>
 </xs:complexType>
 <xs:complexType name="inputgainType">
  <xs:choice>
   <xs:element name="auto" type="autoType"/>
   <xs:element name="fixed" type="fixedType"/>
  </xs:choice>
 </xs:complexType>
 <xs:complexType name="outputgainType">
  <xs:choice>
   <xs:element name="auto" type="autoType"/>
   <xs:element name="fixed" type="fixedType"/>
  </xs:choice>
 </xs:complexType>
 <xs:complexType name="promptType">
  <xs:choice maxOccurs="unbounded">
   <xs:element name="audio">
    <xs:complexType>
     <xs:attribute name="url" type="xs:string" use="required"/>
     <xs:attribute name="encoding" type="xs:string"/>
    </xs:complexType>
   </xs:element>
   <xs:element name="variable">
    <xs:complexType>
     <xs:attribute name="type" use="required">
      <xs:simpleType>
       <xs:restriction base="xs:NMTOKEN">
        <xs:enumeration value="date"/>
        <xs:enumeration value="digit"/>
        <xs:enumeration value="duration"/>
        <xs:enumeration value="month"/>
        <xs:enumeration value="money"/>
        <xs:enumeration value="number"/>
        <xs:enumeration value="silence"/>
        <xs:enumeration value="string"/>
        <xs:enumeration value="time"/>
        <xs:enumeration value="weekday"/>
       </xs:restriction>
      </xs:simpleType>
     </xs:attribute>
     <xs:attribute name="subtype">
      <xs:simpleType>
       <xs:restriction base="xs:NMTOKEN">
        <xs:enumeration value="mdy"/>
        <xs:enumeration value="dmy"/>
        <xs:enumeration value="ymd"/>
        <xs:enumeration value="ndn"/>
        <xs:enumeration value="t12"/>
        <xs:enumeration value="t24"/>
        <xs:enumeration value="USD"/>
        <xs:enumeration value="gen"/>
        <xs:enumeration value="ndn"/>
        <xs:enumeration value="crd"/>
        <xs:enumeration value="ord"/>
       </xs:restriction>
      </xs:simpleType>
     </xs:attribute>
     <xs:attribute name="value" type="xs:string" use="required"/>
    </xs:complexType>
   </xs:element>
  </xs:choice>
  <xs:attribute name="locale" type="xs:string"/>
  <xs:attribute name="baseurl" type="xs:string"/>
  <xs:attribute name="gain_level" type="xs:string" default="0"/>
  <xs:attribute name="gain_delta" type="xs:string" default="0"/>
 </xs:complexType>
</xs:schema>
					]]></artwork>
				</figure>
			</section>
		</section>
		<section title="IANA Considerations">
			<section title="IANA Registration of MIME media type application/mediaservercontrol+xml">
				<t>
					<list style="hanging">
						<!-- hangIndent="30" -->
						<t hangText="MIME media type name:">application</t>
						<t hangText="MIME subtype name:">mediaservercontrol+xml</t>
						<t hangText="Required parameters:">none</t>
						<t hangText="Optional parameters:">charset</t>
						<t>
							<list style="hanging">
								<t hangText="charset">This parameter has identical semantics to the charset parameter of the "application/xml" media type as specified in <xref target="RFC3023">XML Media Types</xref>.</t>
							</list>
						</t>
						<t hangText="Encoding considerations:">See <xref target="RFC3023">RFC3023</xref>.</t>
						<t hangText="Interoperability considerations:">See <xref target="RFC3023">RFC2023</xref> and RFC&rfc.number;.</t>
						<t hangText="Published specification:">RFC&rfc.number;</t>
						<t hangText="Applications which use this media type:">Multimedia, enhanced conferencing and interactive applications.</t>
						<t hangText="Personal and email address for further information:">
							<eref target="mailto:eburger@brooktrout.com">eburger@brooktrout.com</eref>
						</t>
						<t hangText="Intended usage:">COMMON</t>
					</list>
				</t>
			</section>
		</section>
		<section title="Security Considerations">
			<t>
Because media flows through a media server in a conference, the media server itself MUST protect the integrity, confidentiality, and security of the sessions.  It should not be possible for a conference participant, on her own behalf, to be able to "tap in" to another conference without proper authorization.
			</t>
			<t>
Because conferencing is a high value application, the media server SHOULD implement appropriate security measures.  This includes, but not limited to, access lists for application servers.  That is, only a select list of application or proxy servers is allowed to create conferences, invite participants to sessions, etc.  Note that the mechanisms for such security, like private networks, shared certificates, MAC white/black lists, are beyond the scope of this document. 
			</t>
			<t>
As an XML markup, all of the security considerations of <xref target="RFC3023">RFC3023</xref> apply.
			</t>
		</section>
	</middle>
	<back>
		<references title="Normative References">
			<reference anchor="RFC2119">
				<front>
					<title abbrev="RFC Key Words">Key words for use in RFCs to Indicate Requirement Levels</title>
					<author initials="S." surname="Bradner" fullname="Scott Bradner">
						<organization>Harvard University</organization>
						<address>
							<postal>
								<street>1350 Mass. Ave.</street>
								<street>Cambridge</street>
								<street>MA 02138</street>
							</postal>
							<phone>- +1 617 495 3864</phone>
							<email>-</email>
						</address>
					</author>
					<date month="March" year="1997"/>
					<area>General</area>
					<keyword>keyword</keyword>
					<abstract>
						<t>
   In many standards track documents several words are used to signify
   the requirements in the specification.  These words are often
   capitalized.  This document defines these words as they should be
   interpreted in IETF documents.  Authors who follow these guidelines
   should incorporate this phrase near the beginning of their document:

<list>
								<t>
      The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL
      NOT&quot;, &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;,  &quot;MAY&quot;, and
      &quot;OPTIONAL&quot; in this document are to be interpreted as described in
      RFC 2119.
</t>
							</list>
						</t>
						<t>
   Note that the force of these words is modified by the requirement
   level of the document in which they are used.
</t>
					</abstract>
				</front>
				<seriesInfo name="BCP" value="14"/>
				<seriesInfo name="RFC" value="2119"/>
				<format type="TXT" octets="4723" target="ftp://ftp.isi.edu/in-notes/rfc2119.txt"/>
				<format type="HTML" octets="15902" target="http://xml.resource.org/public/rfc/html/rfc2119.html"/>
				<format type="XML" octets="5647" target="http://xml.resource.org/public/rfc/xml/rfc2119.xml"/>
			</reference>
			<reference anchor="RFC2976">
				<front>
					<title>The SIP INFO Method</title>
					<author initials="S." surname="Donovan" fullname="S. Donovan">
						<organization/>
					</author>
					<date month="October" year="2000"/>
				</front>
				<seriesInfo name="RFC" value="2976"/>
				<format type="TXT" octets="17736" target="ftp://ftp.isi.edu/in-notes/rfc2976.txt"/>
			</reference>
			<reference anchor="RFC3023">
				<front>
					<title>XML Media Types</title>
					<author initials="M." surname="Murata" fullname="M. Murata">
						<organization/>
					</author>
					<author initials="S." surname="St. Laurent" fullname="S. St. Laurent">
						<organization/>
					</author>
					<author initials="D." surname="Kohn" fullname="D. Kohn">
						<organization/>
					</author>
					<date month="January" year="2001"/>
				</front>
				<seriesInfo name="RFC" value="3023"/>
				<format type="TXT" octets="86011" target="ftp://ftp.isi.edu/in-notes/rfc3023.txt"/>
			</reference>
			<reference anchor="RFC3435">
				<front>
					<title>Network call signalling protocol for the delivery of time-critical services over cable television networks using cable modems</title>
					<author>
						<organization/>
					</author>
					<date month="March" year="2001"/>
				</front>
				<seriesInfo name="ITU-T" value="J.162"/>
			</reference>
			<reference anchor="RFC3525">
				<front>
					<title>Gateway Control Protocol Version 1</title>
					<author initials="C." surname="Groves" fullname="C. Groves">
						<organization/>
					</author>
					<author initials="M." surname="Pantaleo" fullname="M. Pantaleo">
						<organization/>
					</author>
					<author initials="T." surname="Anderson" fullname="T. Anderson">
						<organization/>
					</author>
					<author initials="T." surname="Taylor" fullname="T. Taylor">
						<organization/>
					</author>
					<date month="June" year="2003"/>
				</front>
				<seriesInfo name="RFC" value="3525"/>
				<format type="TXT" octets="439674" target="ftp://ftp.isi.edu/in-notes/rfc3525.txt"/>
			</reference>
			<reference anchor="W3C.REC-xmlschema-1-20010502">
				<front>
					<title>XML Schema Part 1: Structures</title>
					<author initials="H" surname="Thompson" fullname="Henry S. Thompson">
						<organization/>
					</author>
					<author initials="D" surname="Beech" fullname="David Beech">
						<organization/>
					</author>
					<author initials="M" surname="Maloney" fullname="Murray Maloney">
						<organization/>
					</author>
					<author initials="N" surname="Mendelsohn" fullname="Noah Mendelsohn">
						<organization/>
					</author>
					<date month="May" day="2" year="2001"/>
				</front>
				<seriesInfo name="W3C REC" value="REC-xmlschema-1-20010502"/>
				<format type="HTML" target="http://www.w3.org/TR/2001/REC-xmlschema-1-20010502"/>
			</reference>
		</references>
		<references title="Informative References">
			<reference anchor="RFC2821">
				<front>
					<title>Simple Mail Transfer Protocol</title>
					<author initials="J." surname="Klensin" fullname="J. Klensin">
						<organization/>
					</author>
					<date month="April" year="2001"/>
				</front>
				<seriesInfo name="RFC" value="2821"/>
				<format type="TXT" octets="192504" target="ftp://ftp.isi.edu/in-notes/rfc2821.txt"/>
			</reference>
			<reference anchor="RFC3470">
				<front>
					<title>Guidelines for the Use of Extensible Markup Lanugage (XML) within IETF Protocols</title>
					<author initials="S." surname="Hollenbeck" fullname="S. Hollenbeck">
						<organization>VeriSign, Inc.</organization>
					</author>
					<author initials="M." surname="Rose" fullname="M. Rose">
						<organization>Dovoer Beach Consulting, Inc.</organization>
					</author>
					<author initials="L." surname="Masinter" fullname="L. Masinter">
						<organization>Adobe Systems Incorporated</organization>
					</author>
					<date year="2003" month="January"/>
				</front>
				<seriesInfo name="BCP" value="70"/>
				<seriesInfo name="RFC" value="3470"/>
				<format type="TXT" target="ftp://ftp.isi.edu/in-notes/rfc3470.txt"/>
			</reference>
			<reference anchor="T.30">
				<front>
					<title>Procedures for document facsimile transmission in the general switched telephone network</title>
					<author>
						<organization/>
					</author>
					<date year="1999" month="April"/>
				</front>
				<seriesInfo name="Recommendation" value="T.30"/>
			</reference>
			<reference anchor="T.38">
				<front>
					<title>Procedures for real-time Group 3 facsimile communication over IP networks</title>
					<author>
						<organization/>
					</author>
					<date year="2002" month="March"/>
				</front>
				<seriesInfo name="Recommendation" value="T.38"/>
			</reference>
			<reference anchor="W3C.REC-voicexml20-20040316">
				<front>
					<title>Voice Extensible Markup Language (VoiceXML) Version 2.0</title>
					<author initials="J" surname="Carter" fullname="Jerry Carter">
						<organization/>
					</author>
					<author initials="P" surname="Danielsen" fullname="Peter Danielsen">
						<organization/>
					</author>
					<author initials="A" surname="Hunt" fullname="Andrew Hunt">
						<organization/>
					</author>
					<author initials="J" surname="Ferrans" fullname="Jim Ferrans">
						<organization/>
					</author>
					<author initials="B" surname="Lucas" fullname="Bruce Lucas">
						<organization/>
					</author>
					<author initials="B" surname="Porter" fullname="Brad Porter">
						<organization/>
					</author>
					<author initials="K" surname="Rehor" fullname="Ken Rehor">
						<organization/>
					</author>
					<author initials="S" surname="Tryphonas" fullname="Steph Tryphonas">
						<organization/>
					</author>
					<author initials="S" surname="McGlashan" fullname="Scott McGlashan">
						<organization/>
					</author>
					<author initials="D" surname="Burnett" fullname="Daniel C. Burnett">
						<organization/>
					</author>
					<date month="March" day="16" year="2004"/>
				</front>
				<seriesInfo name="W3C REC" value="REC-voicexml20-20040316"/>
				<format type="HTML" target="http://www.w3.org/TR/2004/REC-voicexml20-20040316"/>
			</reference>
			<reference anchor="I-D.burger-sipping-netann">
				<front>
					<title>Basic Network Media Services with SIP</title>
					<author initials="E" surname="Burger" fullname="Eric Burger">
						<organization/>
					</author>
					<date month="October" day="28" year="2004"/>
					<abstract>
						<t>In SIP-based networks, there is a need to provide basic network media services. Such services include network announcements, user interaction, and conferencing services. These services are basic building blocks, from which one can construct interesting applications. In order to have interoperability between servers offering these building blocks (also known as Media Servers) and application developers, one needs to be able to locate and invoke such services in a well-defined manner. This document describes a mechanism for providing an interoperable protocol interface between Application Servers, which provide application services to SIP-based networks, and Media Servers, which provide the basic media processing building blocks.</t>
					</abstract>
				</front>
				<seriesInfo name="Internet-Draft" value="draft-burger-sipping-netann-10"/>
				<format type="TXT" target="http://www.ietf.org/internet-drafts/draft-burger-sipping-netann-10.txt"/>
			</reference>
			<reference anchor="I-D.ietf-sipping-cc-conferencing">
				<front>
					<title>Session Initiation Protocol Call Control - Conferencing for User Agents</title>
					<author initials="A" surname="Johnston" fullname="Alan Johnston">
						<organization/>
					</author>
					<author initials="O" surname="Levin" fullname="Orit Levin">
						<organization/>
					</author>
					<date month="November" day="30" year="2004"/>
					<abstract>
						<t>This specification defines conferencing call control features for the Session Initiation Protocol (SIP). This document builds on the Conferencing Requirements and Framework documents to define how a tightly coupled SIP conference works. The approach is explored from different user agent (UA) types perspective: conference-unaware, conference-aware and focus UAs. The use of URIs in conferencing, OPTIONS for capabilities discovery, and call control using REFER are covered in detail with example call flow diagrams. The usage of the isfocus feature tag is defined.</t>
					</abstract>
				</front>
				<seriesInfo name="Internet-Draft" value="draft-ietf-sipping-cc-conferencing-06"/>
				<format type="TXT" target="http://www.ietf.org/internet-drafts/draft-ietf-sipping-cc-conferencing-06.txt"/>
			</reference>
			<reference anchor="I-D.ietf-simple-message-sessions">
				<front>
					<title>The Message Session Relay Protocol</title>
					<author initials="B" surname="Campbell" fullname="Ben Campbell">
						<organization/>
					</author>
					<date month="October" day="26" year="2004"/>
					<abstract>
						<t>This document describes the Message Session Relay Protocol (MSRP), a protocol for transmitting a series of related instant messages in the context of a session. Message sessions are treated like any other media stream when setup via a rendezvous or session setup protocol such as the Session Initiation Protocol (SIP).</t>
					</abstract>
				</front>
				<seriesInfo name="Internet-Draft" value="draft-ietf-simple-message-sessions-09"/>
				<format type="TXT" target="http://www.ietf.org/internet-drafts/draft-ietf-simple-message-sessions-09.txt"/>
			</reference>
			<reference anchor="I-D.ietf-sipping-conference-package">
				<front>
					<title>A Session Initiation Protocol (SIP) Event Package for Conference State</title>
					<author initials="J" surname="Rosenberg" fullname="Jonathan Rosenberg">
						<organization/>
					</author>
					<date month="December" day="8" year="2004"/>
					<abstract>
						<t>This document defines a conference event package for the Session Initiation Protocol (SIP) Events framework, along with a data format used in notifications for this package. The conference package allows users to subscribe to a conference URI. Notifications are sent about changes in the membership of this conference and optionally about changes in the state of additional conference components.</t>
					</abstract>
				</front>
				<seriesInfo name="Internet-Draft" value="draft-ietf-sipping-conference-package-08"/>
				<format type="TXT" target="http://www.ietf.org/internet-drafts/draft-ietf-sipping-conference-package-08.txt"/>
			</reference>
			<reference anchor="I-D.burger-sipping-kpml">
				<front>
					<title abbrev="KPML">
			Keypad Stimulus Protocol (KPML)
		</title>
					<author initials="E." surname="Burger" fullname="Eric Burger">
						<organization>Brooktrout Technology, Inc.</organization>
						<address>
							<postal>
								<street>285 Billerica Rd.</street>
								<city>Chelmsford</city>
								<region>MA</region>
								<code>01824-4120</code>
								<country>USA</country>
							</postal>
							<email>eburger@brooktrout.com</email>
						</address>
					</author>
					<author initials="M." surname="Dolly" fullname="Martin Dolly">
						<organization>AT&amp;T Labs</organization>
						<address>
							<email>mdolly@att.com</email>
						</address>
					</author>
					<date year="2004" month="December" day="25"/>
					<area>Transport</area>
					<workgroup>SIPPING</workgroup>
					<keyword>SIP</keyword>
					<keyword>Media Services</keyword>
					<abstract>
						<t>
The Key Press Stimulus Protocol uses the SIP SUBSCRIBE/NOTIFY mechanism and Keypad Markup Language (KPML) to provide instructions to SIP User Agents for the reporting of user key presses.
			</t>
					</abstract>
					<note title="Conventions used in this document">
						<t>
							<xref target="RFC2119">RFC2119</xref> provides the
interpretations for the key words &quot;MUST&quot;, 
&quot;MUST NOT&quot;, 
&quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;,
&quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;,
&quot;MAY&quot;, and &quot;OPTIONAL&quot; found in this document.
			</t>
						<t>
In the narrative discussion, the "user device" is a User Agent that will report stimulus.  it could be, for example, a SIP phone, edge media processor, or media gateway.  An "application" is a User Agent requesting the user device to report stimulus.  The "user" is an entity that stimulates the user device.  In English, the user device is a phone, the application is an application server or proxy server, and the user presses keys to generate stimulus.
			</t>
					</note>
				</front>
				<seriesInfo name="Internet-Draft" value="draft-IETF-sipping-kpml-07"/>
				<format type="TXT" target="http://www.ietf.org/internet-drafts/draft-ietf-sipping-kpml-07.txt"/>
			</reference>
			<reference anchor="ISC.RefArch">
				<front>
					<title>IPCC Reference Architecture V2</title>
					<author>
						<organization>International Packet Communicaitons Consortium</organization>
					</author>
					<date year="2002" month="June"/>
				</front>
				<format type="PDF" target="http://www.packetcomm.org"/>
			</reference>
		</references>
		<section title="Contributors">
			<t>Jeff Van Dyke, Andy Spitzer, and Terence Lobo at SnowShore Networks, Inc. did the concept, development, documentation, and execution for MSCML.  The IVR implementation was influenced by original work by Andy Spitzer while he was at The Telephone Connection, Inc.</t>
			<t>Cliff Schornak of Commetrex and Jeff Van Dyke developed the facsimile service.</t>
			<t>Terence Lobo, Srinivas Motamarri, Haj Elfadil, and Edwina Nowicki contributed in being the first to eat what got cooked up.</t>
		</section>
		<section title="Acknowledgements">
			<t>
The following individuals significantly assisted in the development, direction, or, most importantly, debugging of MSCML:
				<list style="symbols">
					<t>Gaurav Srivastva and Subhash Verma from BayPackets</t>
					<t>Jon Hinckley from SkyWave/Sestro</t>
					<t>Wesley Hicks, Ravindra Kabre, Kevin Summers from Sonus Networks</t>
					<t>Diana Rawlins and Sharadha Vijay from WorldCom</t>
					<t>Tim Wong from Z-Tel</t>
					<t>Stephane Bastien from BroadSoft</t>
					<t>Kevin Flemming for his feedback on the semantics of creation versus configuration for conferencing.</t>
				</list>
			</t>
			<t>The authors would like to thank Scotty Farber, technical writer extraordinaire, who turned our techno-geek into English.</t>
		</section>
	</back>
</rfc>
