12. MSML Conference Examples
These examples focus on the MSML Conference Core Package used by a control agent (CA) to control services on a media server (MS). They show the relationship between SIP signaling to establish media sessions and MSML service control commands. For brevity, only the content of MSML messages is shown. The examples assumes that the CA and MS use the IPv4 address and UDP port number of the audio stream (on the MS) to identify the MSML connection.12.1. Establishing a Dial-In Conference
UA Control Agent Media Server | | | | | INVITE F1 | | |-------------------------->| | | 200 F2 | | |<--------------------------| | | ACK F3 | | |-------------------------->| | | | | | createconference> F4 | | |-------------------------->| | | 200 F5 | | |<--------------------------| | INVITE (SDP UA) F6 | | |------------------------>| | | | INVITE (SDP UA) F7 | | |-------------------------->| | | 200 (SDP MS) F8 | | |<--------------------------| | | ACK F9 | | |-------------------------->| | 200 (SDP MS) F10 | | |<------------------------| | | ACK F11 | |
|------------------------>| | | | <dialogstart> F12 | | |-------------------------->| | | 200 F13 | | |<--------------------------| | | HTTP interactions F14 | | |<------------------------->| | | <event>(dialog.exit) F15 | | |<--------------------------| | | <join> F16 | | |-------------------------->| | | 200 F17 | | |<--------------------------| | ... | ... | | | | | | <dialogstart> F18 | | |-------------------------->| | | 200 F19 | | |-------------------------->| | | HTTP interactions F20 | | |<--------------------------| | | <event>(dialog.exit) F21 | | |-------------------------->| | ... | ... | | | | Steps 1-3: establish an MSML control channel for the conference. Alternatively, a control channel could already have been established that was used for all CA/MS interactions. A control channel per conference is only one possible model. Currently, MSML uses SIP INFO requests and responses on this SIP dialog. There is a proposal to use this message exchange to establish a TCP channel for MSML similar to the approach used for the Media Resource Control Protocol v2 (MRCPv2). This approach would require that a request identifier be added to the <msml> element to correlate requests and responses. This currently relies on the SIP INFO request and response for this property. MSML messages are shown without specifying the transport in this example, but it assumes a request/response correlation based on transport messages. Step 4: create a conference that will mix the loudest two speakers and report those speakers to the control agent every 10 seconds. The media server will automatically terminate remaining media sessions and delete the conference and associated resources and when the control channel is terminated.
<msml version="1.1"> <createconference name="exampleConf" deletewhen="nocontrol"> <audiomix> <n-loudest n="3"/> <asn ri="10s"/> </audiomix> </createconference> </msml> Step 5: conference created successfully <msml version="1.1"> <result response="200"/> </msml> Steps 6-11: standard 3PCC establishment of a user-initiated media session to a media server. This is the equivalent of a dial-in conference participant. The "To:" header returned by the MS in the 200 response of Step F8 was: To: <sip:msml@ms.example.com>;tag=jd87dfg4h Step 12: request an initial dialog with the participant to prompt for their name, desired conference, etc. The dialog completes by informing the participant that they are joining the conference. If this was not the first participant, the dialog could also announce the other participants. <msml version="1.1"> <dialogstart target="conn:jd87dfg4h" name="12345" type="application/vxml+xml" src="http://server.example.com/scripts/initial.vxml"/> </msml> Step 13: dialog started successfully. The dialog identifier is returned. <msml version="1.1"> <result response="200"/> <dialogid>conn:jd87dfg4h/dialog:12345</dialogid> </msml> Step 14: sequence of HTTP VoiceXML dialog interactions. Step 15: the VoiceXML browser exits (but does not disconnect). If a namelist had been specified within the VoiceXML <exit> element, it would have been included in the <event> sent to the CA.
<msml version="1.1">
<event name="msml.dialog.exit"
id="conn:jd87dfg4h/dialog:12345"/>
</msml>
Step 16: join the participant to the conference and have the volume
of their contributing audio automatically adjusted to a target level
of -20 dBm0.
<msml version="1.1">
<join id1="conn:jd87dfg4h" id2="conf:exampleConf">
<stream media="audio" dir="from-id1">
<gain agc="true" tgtlvl="-20"/>
</stream>
<stream media="audio" dir="to-id1"/>
</msml>
Step 17: successfully joined to conference
<msml version="1.1">
<result response="200"/>
</msml>
Steps 6 through 17 are repeated for the second participant.
Step 18: play a join tone or message announcing the new participant
to the conference.
<msml version="1.1">
<dialogstart target="conf:exampleConf"
type="application/vxml+xml"
src="http://server.example.com/scripts/joinmsg.vxml"/>
</msml>
Step 19: dialog started successfully. The dialog identifier is
returned. The media server assigned a unique identifier since name
attribute was not specified in <dialogstart>.
<msml version="1.1">
<result response="200"/>
<dialogid>conf:ExampleConf/dialog:j6fs8745</dialogid>
</msml>
Step 20: HTTP VoiceXML dialog interaction(s).
Step 21: the VoiceXML browser exits. <msml version="1.1"> <event name="msml.dialog.exit" id="conf:ExampleConf/dialog:j6fs8745"/> </msml> Steps 6 through 21 are repeated for the third and subsequent participants.12.2. Example of a Sidebar Audio Conference
This example assumes that a conference has already been established as in the previous example. It creates a sidebar conference that hears the main conference as a whisper. Three participants are moved to the sidebar. After some period of time, the sidebar participants are returned to the main conference and the sidebar is deleted. Step 1: the sidebar conference is created. It is joined half-duplex to the main conference and a manual gain object is inserted in the media stream. Three participants are then moved from the main conference to the sidebar. Although not shown, a CA could include the "mark" attribute in each element to allow recovery in the event of a mid- transaction error. <msml version="1.1"> <createconference name="sidebarConf" deletewhen="nomedia"> <audiomix/> </createconference> <join id1="conf:sidebarConf" id2="conf:exampleConf"> <stream media="audio" dir="to-id1"> <gain amt="-20"/> </stream> </join> <unjoin id1="conn:gs5s4-1" id2="conf:exampleConf"/> <join id1="conn:gs5s4-1" id2="conf:sidebarConf"/> <unjoin id1="conn:hd764gr9-2" id2="conf:exampleConf"/> <join id1="conn:hd764gr9-2" id2="conf:sidebarConf"/> <unjoin id1="conn:h37frdvgs65-3" id2="conf:exampleConf"/> <join id1="conn:h37frdvgs65-3" id2="conf:sidebarConf"/> </msml>
Step 2: sidebar conference created successfully and participants joined. <msml version="1.1"> <result response="200"/> </msml> Step 3: once the sidebar conference has completed, the participants are rejoined to the main conference. The sidebar is destroyed automatically by the MS when the last media stream is removed as specified when the sidebar conference was created. <msml version="1.1"> <unjoin id1="conn:gs5s4-1" id2="conf:sidebarConf"/> <join id1="conn:gs5s4-1" id2="conf:exampleConf"/> <unjoin id1="conn:hd764gr9-2" id2="conf:sidebarConf"/> <join id1="conn:hd764gr9-2" id2="conf:exampleConf"/> <unjoin id1="conn:h37frdvgs65-3" id2="conf:sidebarConf"/> <join id1="conn:h37frdvgs65-3" id2="conf:exampleConf"/> </msml> Step 4: participants successfully moved to main conference and sidebar destroyed. <msml version="1.1"> <result response="200"/> </msml>12.3. Example of Removing a Conference
This example assumes a conference created similar to the first example where there is an MSML control channel specific to the conference and the conference has been configured to be deleted when that channel is removed (using SIP). Steps 1-2: the CA signals BYE for the SIP dialog used to establish the conference control channel. Steps 3-6: the MS initiates terminating the media sessions for each participant remaining in the conference. The MS deletes the conference and removes all resources when the last participant has been removed.12.4. Example of Modifying Video Layout
Assume that a conference named "example" is created using the following mixer descriptions.
+---+---+ | 1 | 2 | +---+---+ | 3 | 4 | +---+---+ <createconference name="quad-split"> <audiomix> <n-loudest n="3"/> <asn ri="10s"/> </audiomix> <videolayout> <root size="CIF" background="white" /> <selector id="default" method="vas" si="500ms"> <region id="1" left="0" top="0" relativesize="1/4"/> </selector> <region id="2" left="50%" top="0" relativesize="1/4"/> <region id="3" left="0%" top="50%" relativesize="1/4"> <region id="4" left="50%" top="50%" relativesize="1/4"/> </videolayout> </createconference> The following would change the size of the video window to QCIF and the background color to the default "black". <modifyconference id="conf:example"> <videolayout> <root size="4CIF"/> </videolayout> </modifyconference> The relative location of the regions does not change. However, the sizes of the regions do change because they are relative to the size of the root window. The result is a layout that looks identical but half the size. The following would freeze the video displayed in region "2" without affecting any other attributes of that region. <modifyconference id="conf:example"> <videolayout> <region id="2" left="50%" top="0" relativesize="1/4" freeze="true"/> </videolayout> </modifyconference>
13. MSML Dialog Examples
These examples focus on the MSML Dialog Base Package and the MSML Dialog Group Package.13.1. Announcement
The following is a simple announcement scenario. Two recorded audio files are played in sequence followed by generated speech followed by a variable. The results are reported once media generation completes. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <dialogstart target="conn:12345" name="12345"> <play> <audio uri="file://clip1.wav"/> <audio uri="http://host1/clip2.wav"/> <tts uri="http://host2/text.ssml"/> <var type="date" subtype="mdy" value="20030601"/> </play> <send target="source" event="done" namelist="play.amt play.end"/> </dialogstart> </msml>13.2. Voice Mail Retrieval
Below is an example that shows a simple voice mail retrieval operation consisting of playing a message and allowing the user to pause and resume play using '5' to toggle the state. The operation would terminate when the play completed or the user entered '#'. During the play, the user can advance forward and backward through the message as well as rewinding to the beginning.
<?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <dialogstart target="conn:12345" name="12345"> <group topology="parallel"> <play> <audio uri="file://message.wav"/> <playexit> <send target="group" event="terminate"/> </playexit> </play> <dtmf iterate="forever"> <pattern digits="5"> <send target="play" event="toggle-state"/> </pattern> <pattern digits="6"> <send target="play" event="forward"/> </pattern> <pattern digits="7"> <send target="play" event="backward"/> </pattern> <pattern digits="8"> <send target="play" event="restart"/> </pattern> <pattern digits="#"> <send target="play" event="terminate"/> </pattern> </dtmf> </group> </dialogstart> </msml>
13.3. Play and Record
A more complex example is a play and record operation. This sources and sinks media and uses voice activity DTMF detection and recognition to influence behavior. Any DTMF input or voice activity will barge the play and cause the record to begin. However, if the prompt was barged with a DTMF digit of '#', the record terminates without starting. When the play terminates, it send a starttimer event to the VAD to allow it to recognize an initial silence condition. The recording will be terminated (without starting) when the VAD detects an initial 3 seconds of silence. Once resumed (based upon voice detection), the recording may be terminated under several conditions. It will terminate after 5 seconds of silence or after 60 seconds elapses. It will also terminate if a '#' key is recognized. Every aspect of this behavior can be modified by changing what is recognized and the events that are sent. The following example uses the MSML Dialog Group Package.
<?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <dialogstart target="conn:12345" name="12345"> <group topology="parallel"> <play> <audio uri="file://prompt.wav"/> <playexit> <send target="vad" event="starttimer"/> </playexit> </play> <dtmf> <pattern digits="#"> <send target="record" event="terminate.termkey"/> </pattern> <detect> <send target="play" event="terminate"/> </detect> </dtmf> <vad> <voice len="10ms"> <send target="play" event="terminate"/> <send target="record" event="resume"/> </voice> <silence len="3s"> <send target="record" event="nospeech"/> </silence> <tsilence len="5s"> <send target="record" event="terminate.finalsilence"/> </tsilence> </vad> <record initial="suspend" maxtime="60s" dest="file://record.wav" format="g729"> <recordexit> <send target="group" event="terminate"/> </recordexit> </record> <groupexit> <send target="source" event="done" namelist="record.len record.end"/> </groupexit> </group> </dialogstart> </msml>
The following implements the same functionality, as described above, in using the MSML Dialog Base Package, using the <record> composite mechanism for the play and record operation. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <dialogstart target="conn:12345" name="12345"> <record prespeech="3s" postspeech="5s" maxtime="60s" termkey="#" dest="file://record.wav" format="g729"> <play barge="true"> <audio uri="file://prompt.wav"/> </play> <recordexit> <send target="source" event="done" namelist="record.len record.end"/> </recordexit> </record> </dialogstart> </msml>
13.4. Speech Recognition
The following simple example requests that a user speak the name of a city and returns the result. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <dialogstart target="conn:12345" name="12345"> <group topology="parallel"> <play> <audio uri="file://prompt.wav"/> </play> <speech> <grammar version="1.0"> <rule id="city" scope="public"> <item> <one-of> <item>vancouver</item> <item>new york</item> <item>london</item> </one-of> </item> </rule> <match> <send target="group" event="terminate"/> </match> </grammar> <noinput> <send target="group" event="terminate"/> </noinput> <nomatch> <send target="group" event="terminate"/> </nomatch> </speech> <groupexit> <send target="source" event="done" namelist="speech.end speech.results"/> </groupexit> </group> </dialogstart> </msml>13.5. Play and Collect
This example prompts a user to enter 4 DTMF digits terminated by the '#' key (represented by "xxxx#" below). The prompt will be barged and the user has 10 seconds to begin entering input or no input will be indicated.
<?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <dialogstart target="conn:12345" name="12345"> <group topology="parallel"> <play> <audio uri="file://prompt.wav"/> <playexit> <send target="dtmf" event="starttimer"/> </playexit> </play> <dtmf fdt="10s" idt="16s"> <pattern digits="xxxx#"> <send target="group" event="terminate"/> </pattern> <detect> <send target="play" event="terminate"/> </detect> <noinput> <send target="group" event="terminate"/> </noinput> <nomatch> <send target="group" event="terminate"/> </nomatch> </dtmf> <groupexit> <send target="source" event="done" namelist="dtmf.digits dtmf.end"/> </groupexit> </group> </dialogstart> </msml>
The following implements the same functionality, as described above, using the MSML Dialog Base Package, using the <collect> composite mechanism for the play and collect operation. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <dialogstart target="conn:12345" name="12345"> <collect fdt="10s" idt="16s"> <play barge="true"> <audio uri="file://prompt.wav"/> </play> <pattern digits="xxxx#"> <send target="source" event="done" namelist="dtmf.digits dtmf.end"/> </pattern> <noinput> <send target="source" event="done" namelist="dtmf.end"/> </noinput> <nomatch> <send target="source" event="done" namelist="dtmf.end"/> </nomatch> </collect> </dialogstart> </msml>
13.6. User Controlled Gain
This shows an example of nesting groups to create an arbitrary full- duplex media control. DTMF is detected on media flowing in one direction and used to adjust the gain applied to media flowing in the opposite direction. Additionally, the stream that is used to detect DTMF has DTMF removed and its gain automatically adjusted before leaving the group. This widget could be used between a conference participant and a conference mixer. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.0"> <dialogstart target="conn:12345" name="12345"> <group topology="fullduplex"> <group topology="parallel"> <dtmf> <pattern digits="1" iterate="forever"> <send target="gain" event="louder"/> </pattern> <pattern digits="2" iterate="forever"> <send target="gain" event="softer"/> </pattern> </dtmf> <group topology="serial"> <clamp/> <agc tgtlvl="0"/> </group> </group> <gain amt="0" incr="5"/> </group> </dialogstart> </msml>14. MSML Audit Examples
The following examples describe the MSML Audit Conference Package and the MSML Audit Connection Package, and their use together with the MSML Audit Dialog Package or/and the MSML Audit Stream Package.14.1. Audit All Conferences
This example describes an audit of all active conferences on the media server, querying the conference configurations. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <audit queryid="conf:*" statelist="audit.conf.confconfig.*"/> </msml>
The following result assumes two conferences currently allocated by the media server. Conference "conf:1" contains both an audio mixer (with ASN enabled) and a video layout (vas) created, while conference "conf:2" contains only an audio mixer created with ASN disabled. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <result response="200"> <auditresult targetid="conf:1"> <confconfig deletewhen="nocontrol" term="true"> <audiomix id="audiomix1"> <asn ri="5s"/> <n-loudest n="16"/> </audiomix> <videolayout id="videolayout1" type="text/msml-basic-layout"> <selector id="selector1" method="vas" si="5s" speakersees="current"> <root size="CIF"/> </selector> </videolayout> <controller>conn:1234</controller> </confconfig> </auditresult> <auditresult targetid="conf:2"> <confconfig deletewhen="nomedia" term="true"> <audiomix id="audiomix2"> <n-loudest n="1"/> </audiomix> <controller>conn:1234</controller> </confconfig> </auditresult> </result> </msml>14.2. Audit Conference Dialogs
This example describes an audit of active dialogs on a specific conference. The request queries all available dialog states. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <audit queryid="conf:1" statelist="audit.conf.dialog.*"/> </msml> The example result assumes a single dialog running on conference "conf:1", which has been running for 60 seconds, and the dialog is currently executing a record operation.
<?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <result response="200"> <auditresult targetid="conf:1"> <dialog name="sample"> <duration>60</duration> <primitive>record</primitive> <controller>conn:1234</controller> </dialog> </auditresult> </result> </msml>14.3. Audit Conference Streams
This example request describes an audit of active streams on a specific conference. The request queries all available stream states. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <audit queryid="conf:1" statelist="audit.conf.stream.*"/> </msml> The example result assumes three audio participants in the conference. Connection "conn:1234" is a talk-listen participant with both clamp and gain control enabled. Connection "conn:1235" is a talk-only participant. Connection "conn:1236" is a listen-only participant with automatic gain control enabled.
<?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <result response="200"> <auditresult targetid="conf:1"> <stream joinwith="conn:1234" media="audio" dir="to"> <clamp dtmf="true" tone="false"/> <gain amt="-10"/> </stream> <stream joinwith="conn:1234" media="audio" dir="from"> <gain amt="10"/> </stream> <stream joinwith="conn:1235" media="audio" dir="to"> </stream> <stream joinwith="conn:1236" media="audio" dir="from"> <gain agc="true" tgtlvl="0" maxgain="10"/> </stream> </auditresult> </result> </msml>14.4. Audit All Connections
This example request describes an audit of all active connections on the media server. No additional state is queried. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <audit queryid="conn:*"/> </msml> The example result assumes five connections currently allocated by the media server. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <result response="200"> <auditresult targetid="conn:1230"/> <auditresult targetid="conn:1231"/> <auditresult targetid="conn:1232"/> <auditresult targetid="conn:1233"/> <auditresult targetid="conn:1234"/> </result> </msml>14.5. Audit Connection Dialogs
This example request describes an audit of active dialogs on a specific connection. No additional dialog state is queried.
<?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <audit queryid="conn:1234" statelist="audit.conn.dialog"/> </msml> The example result assumes three dialogs running on the connection. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <result response="200"> <auditresult targetid="conn:1234"> <dialog name="sample1"/> <dialog name="sample2"/> <dialog name="sample3"/> </auditresult> </result> </msml>14.6. Audit Connection Streams
This example request describes an audit of active streams on a specific connection. No additional stream state is queried. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <audit queryid="conn:1234" statelist="audit.conn.stream"/> </msml> The example result assumes three audio streams created between target connection and other MSML objects, one of which is a bidirectional stream between target connection and a conference, and two are unidirectional streams between two other connections. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <result response="200"> <auditresult targetid="conn:1234"> <stream joinwith="conf:1" media="audio" dir="to"/> <stream joinwith="conf:1" media="audio" dir="from"/> <stream joinwith="conn:1235" media="audio" dir="to"/> <stream joinwith="conn:1236" media="audio" dir="from"/> </auditresult> </result> </msml>
14.7. Audit Connection with Selective States
This example describes an audit of a specific connection, querying associated SIP dialog ID and SDP info. <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <audit queryid="conn:1234" statelist="audit.conn.sipdialog audit.conn.localsdp audit.conn.remotesdp"/> </msml> <?xml version="1.0" encoding="UTF-8"?> <msml version="1.1"> <result response="200"> <auditresult targetid="conn:1234"> <sipdialog callid="ABCD@10.0.0.10:5060" localtag="sdfjsiodf" remotetag="zvnmviuhd8"/> <localsdp> v=0 o=- 31691 31691 IN IP4 ms5mpc11.lab.radisys.com s=media server session t=0 0 m=audio 33794 RTP/AVP 0 c=IN IP4 10.3.5.111 a=rtpmap:0 PCMU/8000 a=sendrecv m=video 32770 RTP/AVP 34 c=IN IP4 10.3.5.11 b=AS:48 a=rtpmap:34 H263/90000 a=fmtp:34 CIF=1 a=sendrecv </localsdp> <remotesdp> v=0 o=- 12345 12345 IN IP4 10.0.0.88 s=RadiSys SIP Media Server session t=0 0 c=IN IP4 10.0.0.126 b=AS:128 m=audio 10000 RTP/AVP 0 a=rtpmap:0 PCMU/8000 a=ptime:20 a=sendrecv m=video 10002 RTP/AVP 34 a=rtpmap:34 H263/90000 a=fmtp:34 CIF=1
a=sendrecv </remotesdp> </auditresult> </result> </msml>15. Future Work
The following capabilities may be added in future versions of this document: o Ability for MSML clients to audit or query the media server for supported set of MSML packages and profiles. o Ability to version MSML packages and profiles and naming scheme for MSML extension packages.16. XML Schema
MSML specification consists of a set of XML schemas, all of which may be used together or any sub-set of the schemas may be used for each MSML package. The following sections define a complete set of schemas covering all MSML packages. Each package contains a single schema file, <package-name>- datatypes.xsd. This schema file can be included by its extended package(s). Every package optionally contains another schema file, <package_name>.xsd, which can be used directly to build or validate MSML scripts for a given package. The complete MSML schema (msml.xsd) includes all the individual MSML packages. <?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:include schemaLocation="msml-core-datatypes.xsd"/> <xs:include schemaLocation="msml-conf-core-datatypes.xsd"/> <xs:include schemaLocation="msml-dialog-core-datatypes.xsd"/> <xs:include schemaLocation="msml-dialog-base-datatypes.xsd"/> <xs:include schemaLocation="msml-dialog-transform-datatypes.xsd"/> <xs:include schemaLocation="msml-dialog-group-datatypes.xsd"/> <xs:include schemaLocation="msml-dialog-speech-datatypes.xsd"/> <xs:include schemaLocation="msml-dialog-fax-detect-datatypes.xsd"/> <xs:include schemaLocation="msml-dialog-fax-sendrecv- datatypes.xsd"/> <xs:include schemaLocation="msml-audit-core-datatypes.xsd"/>
<xs:include schemaLocation="msml-audit-conf-datatypes.xsd"/> <xs:include schemaLocation="msml-audit-conn-datatypes.xsd"/> <xs:include schemaLocation="msml-audit-dialog-datatypes.xsd"/> <xs:include schemaLocation="msml-audit-stream-datatypes.xsd"/> <xs:element name="msml"> <xs:complexType> <xs:choice> <xs:group ref="msmlRequestType" maxOccurs="unbounded"/> <xs:element name="event"> <xs:complexType> <xs:choice maxOccurs="unbounded"> <xs:sequence> <xs:element name="name" type="msmlEventNameValue.datatype"/> <xs:element name="value"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z0-9.]+"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:choice> <xs:attribute name="name" type="msmlEventName.datatype" use="required"/> <xs:attribute name="id" type="msmlEventSource.datatype" use="required"/> </xs:complexType> </xs:element> <xs:element name="result"> <xs:complexType> <xs:choice> <xs:element ref="description" minOccurs="0"/> <xs:sequence> <xs:element ref="msmlResultSimple" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="msmlResultComplex" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:choice> <xs:attribute name="response"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="\d{3}"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="mark" type="mark.datatype"/> </xs:complexType>
</xs:element> </xs:choice> <xs:attribute name="version" type="xs:string" use="required" fixed="1.1"/> </xs:complexType> </xs:element> </xs:schema>16.1. MSML Core
16.1.1. msml-core.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:include schemaLocation="msml-core-datatypes.xsd"/> <xs:element name="msml"> <xs:complexType> <xs:choice> <xs:group ref="msmlRequestType" maxOccurs="unbounded"/> <xs:element name="event"> <xs:complexType> <xs:choice maxOccurs="unbounded"> <xs:sequence> <xs:element name="name" type="msmlEventNameValue.datatype"/> <xs:element name="value"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z0-9.]+"/> </xs:restriction> </xs:simpleType> </xs:element> </xs:sequence> </xs:choice> <xs:attribute name="name" type="msmlEventName.datatype" use="required"/> <xs:attribute name="id" type="msmlEventSource.datatype" use="required"/> </xs:complexType> </xs:element> <xs:element name="result"> <xs:complexType> <xs:choice> <xs:element ref="description" minOccurs="0"/> <xs:sequence> <xs:element ref="msmlResultSimple" minOccurs="0" maxOccurs="unbounded"/> <xs:element ref="msmlResultComplex" minOccurs="0"
maxOccurs="unbounded"/> </xs:sequence> </xs:choice> <xs:attribute name="response"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:pattern value="\d{3}"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="mark" type="mark.datatype"/> </xs:complexType> </xs:element> </xs:choice> <xs:attribute name="version" type="xs:string" use="required" fixed="1.1"/> </xs:complexType> </xs:element> </xs:schema>16.1.2. msml-core-datatypes.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:group name="msmlRequestType"> <xs:choice> <xs:element ref="msmlRequest"/> <xs:element name="send"> <xs:complexType> <xs:complexContent> <xs:extension base="msmlRequestType"> <xs:attribute name="event" type="msmlEvent.datatype" use="required"/> <xs:attribute name="target" type="msmlTarget.datatype" use="required"/> <xs:attribute name="valuelist" type="xs:string"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> </xs:choice> </xs:group> <xs:element name="msmlRequest" type="msmlRequestType" abstract="true"/> <xs:complexType name="msmlRequestType"> <xs:attribute ref="mark"/>
</xs:complexType> <xs:element name="msmlResultSimple" type="msmlResultSimpleType" abstract="true"/> <xs:element name="msmlResultComplex" type="msmlResultComplexType" abstract="true"/> <xs:simpleType name="msmlResultSimpleType"> <xs:restriction base="xs:string"/> </xs:simpleType> <xs:complexType name="msmlResultComplexType"/> <xs:element name="description" type="xs:string"/> <xs:attribute name="mark" type="mark.datatype"/> <xs:simpleType name="msmlInstanceID.datatype"> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z0-9.:\-_]+"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="connID.datatype"> <xs:restriction base="xs:string"> <xs:pattern value="conn:[a-zA-Z0-9.:\-_]+"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="confID.datatype"> <xs:restriction base="xs:string"> <xs:pattern value="conf:[a-zA-Z0-9.:\-_]+"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="dialogID.datatype"> <xs:restriction base="xs:string"> <xs:pattern value="conf:[a-zA-Z0-9.:\-_]+/dialog:[a-zA-Z0-9.:\-_]+"/> <xs:pattern value="conn:[a-zA-Z0-9.:\-_]+/dialog:[a-zA-Z0-9.:\-_]+"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="independentID.datatype"> <xs:restriction base="xs:string"> <xs:pattern value="conf:[a-zA-Z0-9.:\-_]+"/> <xs:pattern value="conn:[a-zA-Z0-9.:\-_]+"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="dialogLanguage.datatype"> <xs:restriction base="xs:string"> <xs:enumeration value="application/moml+xml"/> <xs:enumeration value="application/voicexml+xml"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="msmlEvent.datatype"> <xs:restriction base="xs:string"/> </xs:simpleType> <xs:simpleType name="msmlSend.datatype">
<xs:restriction base="xs:string"/> </xs:simpleType> <xs:simpleType name="msmlEventName.datatype"> <xs:restriction base="xs:string"> <xs:pattern value="msml.dialog.exit"/> <xs:pattern value="msml.conf.asn"/> <xs:pattern value="msml.conf.nomedia"/> <xs:pattern value="msml.dialog.exit"/> <xs:pattern value="[a-zA-Z0-9.:_\-]+"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="msmlTarget.datatype"> <xs:restriction base="xs:string"> <xs:pattern value="conf:[a-zA-Z0-9.:_\-]+(/oper:[a-zA-Z0-9.:_\-]+|\*)*"/> <xs:pattern value="conn:[a-zA-Z0-9.:_\-]+(/oper:[a-zA-Z0-9.:_\-]+|\*)+"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="msmlEventSource.datatype"> <xs:restriction base="xs:string"> <xs:pattern value="conf:[a-zA-Z0-9.:_\-]+"/> <xs:pattern value="(conf:[a-zA-Z0-9.:_\-]+|conn:[a-zA-Z0-9.:_\- ]+)/dialog:[a-zA-Z0-9.:_\-]+"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="msmlEventNameValue.datatype"> <xs:restriction base="xs:string"/> </xs:simpleType> <xs:simpleType name="mark.datatype"> <xs:restriction base="xs:string"> <xs:pattern value="[a-zA-Z0-9.:\-_]+"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="boolean.datatype"> <xs:restriction base="xs:string"> <xs:enumeration value="true"/> <xs:enumeration value="false"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="posDuration.datatype"> <xs:restriction base="xs:string"> <xs:pattern value="(\+)?([0-9]*\.)?[0-9]+(ms|s)"/> </xs:restriction> </xs:simpleType> </xs:schema>
16.2. MSML Conference Core Package
16.2.1. msml-conf-core.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:include schemaLocation="msml-core.xsd"/> <xs:include schemaLocation="msml-conf-core-datatypes.xsd"/> </xs:schema>16.2.2. msml-conf-core-datatypes.xsd
<?xml version="1.0" encoding="UTF-8"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> <xs:include schemaLocation="msml-core-datatypes.xsd"/> <xs:element name="createconference" substitutionGroup="msmlRequest"> <xs:complexType> <xs:complexContent> <xs:extension base="msmlRequestType"> <xs:all> <xs:element name="audiomix" type="audioMixType" minOccurs="0"/> <xs:element name="videolayout" type="videoLayoutType" minOccurs="0"/> <xs:element name="reserve" minOccurs="0"> <xs:complexType> <xs:sequence> <xs:element name="resource" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> <xs:attribute name="n" type="xs:positiveInteger" default="1"/> <xs:anyAttribute namespace="##any"/> </xs:complexType> </xs:element> </xs:sequence> <xs:attribute name="required" type="boolean.datatype" default="true"/> </xs:complexType> </xs:element> </xs:all> <xs:attribute name="name" type="msmlInstanceID.datatype"/>
<xs:attribute name="deletewhen" default="never"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="nomedia"/> <xs:enumeration value="nocontrol"/> <xs:enumeration value="never"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="term" type="boolean.datatype" default="true"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <xs:element name="modifyconference" substitutionGroup="msmlRequest"> <xs:complexType> <xs:complexContent> <xs:extension base="msmlRequestType"> <xs:all> <xs:element name="audiomix" type="audioMixType" minOccurs="0"/> <xs:element name="videolayout" type="videoLayoutType" minOccurs="0"/> </xs:all> <xs:attribute name="id" type="confID.datatype" use="required"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <xs:element name="destroyconference" substitutionGroup="msmlRequest"> <xs:complexType> <xs:complexContent> <xs:extension base="msmlRequestType"> <xs:all> <xs:element name="audiomix" type="basicAudioMixType" minOccurs="0"/> <xs:element name="videolayout" type="basicVideoLayoutType" minOccurs="0"/> </xs:all> <xs:attribute name="id" type="confID.datatype" use="required"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <xs:element name="join" substitutionGroup="msmlRequest"> <xs:complexType> <xs:complexContent> <xs:extension base="msmlRequestType"> <xs:sequence>
<xs:element name="stream" type="streamType" minOccurs="0" maxOccurs="4"/> </xs:sequence> <xs:attribute name="id1" type="independentID.datatype" use="required"/> <xs:attribute name="id2" type="independentID.datatype" use="required"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <xs:element name="modifystream" substitutionGroup="msmlRequest"> <xs:complexType> <xs:complexContent> <xs:extension base="msmlRequestType"> <xs:sequence> <xs:element name="stream" type="streamType" maxOccurs="4"/> </xs:sequence> <xs:attribute name="id1" type="independentID.datatype" use="required"/> <xs:attribute name="id2" type="independentID.datatype" use="required"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <xs:element name="unjoin" substitutionGroup="msmlRequest"> <xs:complexType> <xs:complexContent> <xs:extension base="msmlRequestType"> <xs:sequence> <xs:element name="stream" type="basicStreamType" minOccurs="0" maxOccurs="4"/> </xs:sequence> <xs:attribute name="id1" type="independentID.datatype" use="required"/> <xs:attribute name="id2" type="independentID.datatype" use="required"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <xs:element name="monitor" substitutionGroup="msmlRequest"> <xs:complexType> <xs:complexContent> <xs:extension base="msmlRequestType"> <xs:attribute name="id1" type="connID.datatype" use="required"/> <xs:attribute name="id2" type="independentID.datatype"
use="required"/> <xs:attribute name="compressed" type="boolean.datatype" default="false"/> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <xs:element name="confid" type="msmlResultSimpleType" substitutionGroup="msmlResultSimple"/> <xs:complexType name="basicStreamType"> <xs:attribute name="dir"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="to-id1"/> <xs:enumeration value="from-id1"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="media"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="audio"/> <xs:enumeration value="video"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="compressed" type="boolean.datatype"/> </xs:complexType> <xs:complexType name="streamType"> <xs:complexContent> <xs:extension base="basicStreamType"> <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="gain"> <xs:complexType> <xs:attribute name="amt" use="optional"> <xs:simpleType> <xs:restriction base="xs:integer"> <xs:minInclusive value="-96"/> <xs:maxInclusive value="96"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="agc" type="boolean.datatype"/> <xs:attribute name="tgtlvl" use="optional"> <xs:simpleType> <xs:restriction base="xs:nonPositiveInteger"> <xs:minInclusive value="-40"/> <xs:maxInclusive value="0"/>
</xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="maxgain" default="10"> <xs:simpleType> <xs:restriction base="xs:nonNegativeInteger"> <xs:minInclusive value="0"/> <xs:maxInclusive value="40"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> </xs:element> <xs:element name="clamp"> <xs:complexType> <xs:attribute name="dtmf" type="boolean.datatype"/> <xs:attribute name="tones" type="boolean.datatype"/> </xs:complexType> </xs:element> <xs:element name="visual"/> </xs:choice> <xs:attribute name="preferred" type="boolean.datatype" default="false"/> <xs:attribute name="display" type="xs:string"/> <xs:attribute name="override" type="boolean.datatype" default="false"/> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="basicAudioMixType"> <xs:attribute name="id" type="xs:string" use="optional"/> <xs:attribute name="samplerate" type="xs:positiveInteger" use="optional" default="8000"/> </xs:complexType> <xs:complexType name="audioMixType"> <xs:complexContent> <xs:extension base="basicAudioMixType"> <xs:all> <xs:element name="asn" minOccurs="0"> <xs:complexType> <xs:attribute name="ri" type="posDuration.datatype"/> <xs:attribute name="asth" default="-96"> <xs:simpleType> <xs:restriction base="xs:nonPositiveInteger"> <xs:minInclusive value="-96"/> <xs:maxInclusive value="0"/> </xs:restriction> </xs:simpleType>
</xs:attribute> </xs:complexType> </xs:element> <xs:element name="n-loudest" minOccurs="0"> <xs:complexType> <xs:attribute name="n" type="xs:positiveInteger" use="required"/> </xs:complexType> </xs:element> </xs:all> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="basicVideoLayoutType"> <xs:attribute name="id" type="xs:string" use="required"/> <xs:attribute name="type" type="xs:string" use="required" fixed="text/msml-basic-layout"/> </xs:complexType> <xs:complexType name="videoLayoutType"> <xs:complexContent> <xs:extension base="basicVideoLayoutType"> <xs:choice> <xs:element name="selector"> <xs:complexType> <xs:complexContent> <xs:extension base="selectorType"> <xs:choice> <xs:element name="root" type="rootType" minOccurs="0"/> <xs:element name="region" minOccurs="0"> <xs:complexType> <xs:attribute name="id" type="xs:string" use="required"/> <xs:attribute name="left" type="xs:positiveInteger"/> <xs:attribute name="top" type="xs:positiveInteger"/> <xs:attribute name="relativeSize"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="1/4"/> <xs:enumeration value="1/3"/> <xs:enumeration value="2/3"/> <xs:enumeration value="3/4"/> <xs:enumeration value="1"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="priority"> <xs:simpleType> <xs:restriction base="xs:float"> <xs:minInclusive value="0"/> <xs:maxExclusive value="1"/>
</xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="title" type="xs:string"/> <xs:attribute name="titleTextColor" type="xs:string"/> <xs:attribute name="titleBackgroundColor" type="xs:string"/> <xs:attribute name="borderColor" type="xs:string"/> <xs:attribute name="borderWidth" type="xs:positiveInteger"/> <xs:attribute name="logo" type="xs:anyURI"/> </xs:complexType> </xs:element> </xs:choice> </xs:extension> </xs:complexContent> </xs:complexType> </xs:element> <xs:element name="root" type="rootType"/> <xs:element name="region" minOccurs="0" maxOccurs="unbounded"> <xs:complexType> <xs:complexContent> <xs:extension base="regionType"/> </xs:complexContent> </xs:complexType> </xs:element> </xs:choice> </xs:extension> </xs:complexContent> </xs:complexType> <xs:complexType name="regionType"> <xs:attribute name="id" type="xs:string" use="required"/> <xs:attribute name="left" type="xs:positiveInteger"/> <xs:attribute name="top" type="xs:positiveInteger"/> <xs:attribute name="relativeSize"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="1/4"/> <xs:enumeration value="1/3"/> <xs:enumeration value="2/3"/> <xs:enumeration value="3/4"/> <xs:enumeration value="1"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="priority"> <xs:simpleType> <xs:restriction base="xs:float"> <xs:minInclusive value="0"/> <xs:maxExclusive value="1"/>
</xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="title" type="xs:string"/> <xs:attribute name="titleTextColor" type="xs:string"/> <xs:attribute name="titleBackgroundColor" type="xs:string"/> <xs:attribute name="borderColor" type="xs:string"/> <xs:attribute name="borderWidth" type="xs:positiveInteger"/> <xs:attribute name="logo" type="xs:anyURI"/> </xs:complexType> <xs:complexType name="selectorType"> <xs:attribute name="id" type="xs:string" use="required"/> <xs:attribute name="method" use="required"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="vas"/> <xs:enumeration value="sequence"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="status" default="active"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="active"/> <xs:enumeration value="disabled"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="si" type="posDuration.datatype" default="1s"/> <xs:attribute name="blankothers" type="xs:boolean" default="false"/> <xs:attribute name="speakersees" default="current"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="current"/> <xs:enumeration value="previous"/> </xs:restriction> </xs:simpleType> </xs:attribute> </xs:complexType> <xs:complexType name="rootType"> <xs:attribute name="size" default="CIF"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:enumeration value="16CIF"/> <xs:enumeration value="4CIF"/> <xs:enumeration value="CIF"/> <xs:enumeration value="QCIF"/> </xs:restriction>
</xs:simpleType> </xs:attribute> <xs:attribute name="backgroundcolor" type="xs:string" default="black"/> <xs:attribute name="backgroundimage" type="xs:anyURI"/> </xs:complexType> <xs:simpleType name="confclass.datatype"> <xs:restriction base="xs:string"> <xs:enumeration value="standard"/> <xs:enumeration value="preferred"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="conferenceType.datatype"> <xs:restriction base="xs:string"> <xs:enumeration value="audio.basic"/> <xs:enumeration value="audio.advanced"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="duplex.datatype"> <xs:restriction base="xs:string"> <xs:enumeration value="half"/> <xs:enumeration value="full"/> </xs:restriction> </xs:simpleType> </xs:schema>