sintonia/livesupport/doc/model/Scheduler/index.html

5785 lines
89 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=iso-8859-1">
<TITLE>LiveSupport Scheduler specifications</TITLE>
<META NAME="GENERATOR" CONTENT="OpenOffice.org 1.1.2 (Linux)">
<META NAME="AUTHOR" CONTENT="&Aacute;kos Mar&oacute;y">
<META NAME="CREATED" CONTENT="20041015;13061300">
<META NAME="CHANGED" CONTENT="20041015;13093000">
</HEAD>
<BODY LANG="en-US" DIR="LTR">
<H1>Preface</H1>
<P>This document is part of the <A HREF="http://livesupport.campware.org/">LiveSupport</A>
project, Copyright &Scaron; 2004 <A HREF="http://www.mdlf.org/">Media
Development Loan Fund</A>, under the GNU <A HREF="http://www.gnu.org/licenses/gpl.html">GPL</A>.</P>
<UL>
<LI><P STYLE="margin-bottom: 0in">Author: $Author: fgerlits $
</P>
<LI><P STYLE="margin-bottom: 0in">Version: $Revision: 1.4 $
</P>
<LI><P>Location: $Source:
/home/cvs/livesupport/doc/model/Scheduler/index.html,v $
</P>
</UL>
<H1>Scope</H1>
<P>This document contains the specification of the LiveSupport
Scheduler daemon.<BR><BR>This document contains embedded <A HREF="http://www.w3.org/Graphics/SVG/">SVG</A>
figures, thus an SVG capable browser is needed to view it, or an SVG
plugin like <A HREF="http://www.adobe.com/svg/">Adobe's SVG Viewer</A>.</P>
<H1>Requirements</H1>
<H2>Overview</H2>
<P>The purpose of the LiveSupport Scheduler daemon is to execute
playlists.</P>
<H2>Goals</H2>
<P>The scheduler daemon is a remotely accessible service accepting
playlists on a local audio interface. Specific goals include:</P>
<UL>
<LI><P STYLE="margin-bottom: 0in">remote manageability
</P>
<LI><P STYLE="margin-bottom: 0in">handling remote audio clips
referenced by playlists
</P>
<LI><P>low-latency playback
</P>
</UL>
<H2>System functions</H2>
<P STYLE="margin-bottom: 0in">The main system functions are described
below. There are three categories for these functions:</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH>
<P>function category</P>
</TH>
<TH>
<P>meaning</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P>evident</P>
</TD>
<TD>
<P>Should perform, and the user should be cognizant that it is
performed</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>hidden</P>
</TD>
<TD>
<P>Should perform, but not visible to the users.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>frill</P>
</TD>
<TD>
<P>Optional</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH>
<P>ref#</P>
</TH>
<TH>
<P>function</P>
</TH>
<TH>
<P>category</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.1</P>
</TD>
<TD>
<P>Accept uploaded playlists</P>
</TD>
<TD>
<P>evident</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.2</P>
</TD>
<TD>
<P>Retrieve remote files referenced by playlists</P>
</TD>
<TD>
<P>hidden</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.3</P>
</TD>
<TD>
<P>Access local files</P>
</TD>
<TD>
<P>hidden</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.4</P>
</TD>
<TD>
<P>Provide status information</P>
</TD>
<TD>
<P>evident</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.5</P>
</TD>
<TD>
<P>Log playlist execution for proof of broadcast reasons</P>
</TD>
<TD>
<P>evident</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.6</P>
</TD>
<TD>
<P>Purge local file storage of unused audio clips</P>
</TD>
<TD>
<P>hidden</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.7</P>
</TD>
<TD>
<P>Execute playlists</P>
</TD>
<TD>
<P>evident</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.8</P>
</TD>
<TD>
<P>Play live streams as part of the playlist</P>
</TD>
<TD>
<P>hidden</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.9</P>
</TD>
<TD>
<P>Remove playists from the schedule</P>
</TD>
<TD>
<P>evident</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.10</P>
</TD>
<TD>
<P>Re-schedule playlsits</P>
</TD>
<TD>
<P>evident</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.11</P>
</TD>
<TD>
<P>Delete playlists</P>
</TD>
<TD>
<P>evident</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.12</P>
</TD>
<TD>
<P>Create playlists</P>
</TD>
<TD>
<P>evident</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.13</P>
</TD>
<TD>
<P>Edit playlists</P>
</TD>
<TD>
<P>evident</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.14</P>
</TD>
<TD>
<P>Start the scheduler daemon</P>
</TD>
<TD>
<P>evident</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.15</P>
</TD>
<TD>
<P>Stop the scheduler daemon</P>
</TD>
<TD>
<P>evident</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H2>System attributes</H2>
<P>Generic attributes</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH>
<P>ref#</P>
</TH>
<TH>
<P>attribute</P>
</TH>
<TH>
<P>details and constraints</P>
</TH>
<TH>
<P>category</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P>A1.1</P>
</TD>
<TD>
<P>operating system platform</P>
</TD>
<TD>
<P>Linux</P>
</TD>
<TD>
<P>must</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>A1.2</P>
</TD>
<TD>
<P>supported audio interfaces</P>
</TD>
<TD>
<P>ALSA (maybe also OSS?)</P>
</TD>
<TD>
<P>must</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>A1.3</P>
</TD>
<TD>
<P>supported playlist format</P>
</TD>
<TD>
<P>SMIL 2.0. only partial support is required, which focuses only
on audio aspects of SMIL.</P>
</TD>
<TD>
<P>must</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>A1.4</P>
</TD>
<TD>
<P>supported audio clip formats</P>
</TD>
<TD>
<P>Ogg Vorbis, mp3, wav</P>
</TD>
<TD>
<P>must</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR>Attributes related to system functions</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH>
<P>ref#</P>
</TH>
<TH>
<P>function</P>
</TH>
<TH>
<P>ref#</P>
</TH>
<TH>
<P>attribute</P>
</TH>
<TH>
<P>details and constraints</P>
</TH>
<TH>
<P>category</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.7</P>
</TD>
<TD>
<P>Execute playlists</P>
</TD>
<TD>
<P>A1.5</P>
</TD>
<TD>
<P>low latency</P>
</TD>
<TD>
<P>when executing playlists, very low latency should be achieved</P>
</TD>
<TD>
<P>must</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>A1.6</P>
</TD>
<TD>
<P>handle time skew</P>
</TD>
<TD>
<P>the daemon has to take into account that the system's clock is
not accurate. the clock is synchronized to an external regularly,
but the resulting time-jump must be handled.</P>
</TD>
<TD>
<P>must</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.8</P>
</TD>
<TD>
<P>Play live streams as part of the playlist
</P>
</TD>
<TD>
<P>A1.7</P>
</TD>
<TD>
<P>supported audio stream formats</P>
</TD>
<TD>
<P>Ogg Vorbis via HTTP, mp3 via HTTP</P>
</TD>
<TD>
<P>must</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>F1.14<BR>F1.15</P>
</TD>
<TD>
<P>Start / stop the scheduler daemon</P>
</TD>
<TD>
<P>A1.8</P>
</TD>
<TD>
<P>provide System V init style services</P>
</TD>
<TD>
<P>Provide a System V init interface to starting and stopping the
scheduler daemon</P>
</TD>
<TD>
<P>must</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H2>Essential use cases</H2>
<P>This section lists generic (essential) uses cases, that do not
contain architecture-specific considerations.</P>
<H3>UC-1 Upload playlist</H3>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>ref#</B>
</P>
</TD>
<TD>
<P>UC-1
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>use case</B>
</P>
</TD>
<TD>
<P>Upload playlist
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>type</B>
</P>
</TD>
<TD>
<P>primary, essential
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>actors</B>
</P>
</TD>
<TD>
<P>Playlist editor
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>purpose</B>
</P>
</TD>
<TD>
<P>Upload a playlist
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>overview</B>
</P>
</TD>
<TD>
<P>The Playlist editor uploads a new playlist.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>references</B>
</P>
</TD>
<TD>
<P>F1.1
</P>
</TD>
</TR>
</TABLE>
<H4>Typical course of events</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH COLSPAN=2>
<P>actor action
</P>
</TH>
<TH COLSPAN=2>
<P>system response
</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>1.</B>
</P>
</TD>
<TD>
<P>Playlist editor connects to the scheduler daemon with the
intent of uploading a new playlist.
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>2.</B>
</P>
</TD>
<TD>
<P>The Playlist editor provides authentication information
</P>
</TD>
<TD>
<P><B>3.</B>
</P>
</TD>
<TD>
<P>The system authenticates the Playlist editor and grants access.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>4.</B>
</P>
</TD>
<TD>
<P>The Playlist editor presents the new playlist and the intended
schedule for the playlist.</P>
</TD>
<TD>
<P><B>5.</B>
</P>
</TD>
<TD>
<P>The system validates the new playlist, and sees that it does
not conflict with existing schedule.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><B>6.</B>
</P>
</TD>
<TD>
<P>The system stores the new playlist, adds it to the schedule,
and sends confirmation to the Playlist editor.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>7.</B>
</P>
</TD>
<TD>
<P>The Playlist editor receives confirmation and disconnects.
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Alternate courses</H4>
<UL>
<LI><P STYLE="margin-bottom: 0in"><B>action 3:</B> the system finds
that the user can not be authenticated. the user is notified and the
use case ends.</P>
<LI><P><B>action 5:</B> the system finds that the uploaded playlist
is invalid, or it conflicts the existing schedule. the user is
notified and the use case ends.</P>
</UL>
<H3>UC-2 Manage schedule</H3>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>ref#</B></P>
</TD>
<TD>
<P>UC-2
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>use case</B>
</P>
</TD>
<TD>
<P>Manage schedule
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>type</B></P>
</TD>
<TD>
<P>primary, essential
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>actors</B></P>
</TD>
<TD>
<P>Playlist editor
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>purpose</B></P>
</TD>
<TD>
<P>View the schedule and remove or re-schedule playlists</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>overview</B></P>
</TD>
<TD>
<P>The Playlist editor reviews the schedule. If he decides to, he
might remove or re-schedule some of these playlists.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>references</B></P>
</TD>
<TD>
<P>F1.4, F1.9, F1.10</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Typical course of events</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH COLSPAN=2>
<P>actor action
</P>
</TH>
<TH COLSPAN=2>
<P>system response
</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>1.</B>
</P>
</TD>
<TD>
<P>Playlist editor connects to the scheduler daemon with the
intent of viewing and editing the schedule.</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>2.</B>
</P>
</TD>
<TD>
<P>The Playlist editor provides authentication information
</P>
</TD>
<TD>
<P><B>3.</B>
</P>
</TD>
<TD>
<P>The system authenticates the Playlist editor and grants access.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><B>4.</B></P>
</TD>
<TD>
<P>The system shows the Schedule to the Playlist editor</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>5.</B></P>
</TD>
<TD>
<P>The Playlist editor browses the Schedule, selects a playlist
for detailed viewing.</P>
</TD>
<TD>
<P><B>6.</B></P>
</TD>
<TD>
<P>The system shows the details of the selected Playlist.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>7.</B></P>
</TD>
<TD>
<P>The playlist editor removes a playlist from the schedule.</P>
</TD>
<TD>
<P><B>8.</B></P>
</TD>
<TD>
<P>The system removes the playlist from the schedule, than
re-displays the updated schedle.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>9.</B></P>
</TD>
<TD>
<P>The Playlist editor re-schedules a playlist</P>
</TD>
<TD>
<P><B>10.</B></P>
</TD>
<TD>
<P>The system removes the selected playlist from the schedule, and
re-enters it at a new timepoint</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>11.</B></P>
</TD>
<TD>
<P>The Playlist editor browses the Schedule</P>
</TD>
<TD>
<P><B>12.</B></P>
</TD>
<TD>
<P>The system shows the Schedule to the playlist editor</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>13.</B></P>
</TD>
<TD>
<P>The Playlist editor disconnects.</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Alternate courses</H4>
<UL>
<LI><P STYLE="margin-bottom: 0in"><B>action 3:</B> the system finds
that the user can not be authenticated. the user is notified and the
use case ends.
</P>
<LI><P STYLE="margin-bottom: 0in"><B>action 8:</B> the user tries to
remove a non-existent playlist from the schedule. the user is
notified, and the schedule is displayed to the user.
</P>
<LI><P><B>action 10:</B> the new playtime for the schedule conflicts
with already scheduled playlist playtimes. the user is notified, and
the schedule is displayed again</P>
</UL>
<H3>UC-3 Manage playlists</H3>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>ref#</B></P>
</TD>
<TD>
<P>UC-3
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>use case</B>
</P>
</TD>
<TD>
<P>Manage playlists
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>type</B></P>
</TD>
<TD>
<P>primary, essential
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>actors</B></P>
</TD>
<TD>
<P>Playlist editor
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>purpose</B></P>
</TD>
<TD>
<P>View and delete playlists
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>overview</B></P>
</TD>
<TD>
<P>The Playlist editor reviews the uploaded playlists. If he
decides so, he might delete some of these playlists.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>references</B></P>
</TD>
<TD>
<P>F1.4, F1.11</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Typical course of events</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH COLSPAN=2>
<P>actor action
</P>
</TH>
<TH COLSPAN=2>
<P>system response
</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>1.</B>
</P>
</TD>
<TD>
<P>Playlist editor connects to the scheduler daemon with the
intent of viewing and deleting playlists.</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>2.</B>
</P>
</TD>
<TD>
<P>The Playlist editor provides authentication information
</P>
</TD>
<TD>
<P><B>3.</B>
</P>
</TD>
<TD>
<P>The system authenticates the Playlist editor and grants access.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><B>4.</B></P>
</TD>
<TD>
<P>The system lists the available Playlists</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>5.</B></P>
</TD>
<TD>
<P>The Playlist editor browses the playlists, and selects one for
detailed viewing.</P>
</TD>
<TD>
<P><B>6.</B></P>
</TD>
<TD>
<P>The system shows the details of the selected Playlist.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>7.</B></P>
</TD>
<TD>
<P>The playlist editor deletes a playlist.</P>
</TD>
<TD>
<P><B>8.</B></P>
</TD>
<TD>
<P>The system deletes the playlist, than re-displays the list of
available Playlists.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>9.</B></P>
</TD>
<TD>
<P>The Playlist editor disconnects.</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Alternate courses</H4>
<UL>
<LI><P STYLE="margin-bottom: 0in"><B>action 3:</B> the system finds
that the user can not be authenticated. the user is notified and the
use case ends.
</P>
<LI><P><B>action 8:</B> the user tries to delete a non-existent or a
scheduled playlist. the user is notified, and the list of playlists
is displayed to the user.</P>
</UL>
<H3>UC-4 Retrieve remote files</H3>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>ref#</B>
</P>
</TD>
<TD>
<P>UC-4
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>use case</B>
</P>
</TD>
<TD>
<P>Retrieve remote files
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>type</B></P>
</TD>
<TD>
<P>primary, essential
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>actors</B></P>
</TD>
<TD>
<P>(internal actor, initiator), Media archive, Local storage</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>purpose</B></P>
</TD>
<TD>
<P>Retrieve remote files referenced by active playlists and store
them in the local storage</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>overview</B></P>
</TD>
<TD>
<P>The daemon contacts the remote media archive and retrieves
audio clips referenced by active playlists. The clips are stored
locally for playing.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>references</B></P>
</TD>
<TD>
<P>F1.2
</P>
</TD>
</TR>
</TABLE>
<P><BR>Note that this use case is somewhat reversed, as it is
initiated by the system (not an actor), and the main tasks are done
by an external actor (the Media archive).</P>
<H4>Typical course of events</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH COLSPAN=2>
<P>actor action
</P>
</TH>
<TH COLSPAN=2>
<P>system response
</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>1.</B>
</P>
</TD>
<TD>
<P>An Internal actor triggers the retrieval of some remote files.
</P>
</TD>
<TD>
<P><B>2.</B>
</P>
</TD>
<TD>
<P>The system looks up the URN of the remote file, and determines
the Media archive to contact regarding the file.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><B>3.</B></P>
</TD>
<TD>
<P>The system contacts the Local storage and sends authorization
information</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>4.</B></P>
</TD>
<TD>
<P>Local storage authenticates the system and grants access</P>
</TD>
<TD>
<P><B>5.</B></P>
</TD>
<TD>
<P>The system iniquires the local storage about the availability
of the file to download in the Local storage by presenting its
unique ID</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>6.</B></P>
</TD>
<TD>
<P>Local storage tells if the required file is already stored or
not.</P>
</TD>
<TD>
<P><B>7.</B></P>
</TD>
<TD>
<P>If the file is available in the local storage, the use case
ends. Otherwise, it continues.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><B>8.</B></P>
</TD>
<TD>
<P>The system contacts the Media archive and sends authorization
information
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>9.</B>
</P>
</TD>
<TD>
<P>Media archive authenticates the system and grants access
</P>
</TD>
<TD>
<P><B>10.</B>
</P>
</TD>
<TD>
<P>The system requests an audio clip by presenting its unique ID
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>11.</B>
</P>
</TD>
<TD>
<P>Media archive looks up the file, and presents it to the system
</P>
</TD>
<TD>
<P><B>12.</B>
</P>
</TD>
<TD>
<P>The system retrieves the file and closes the connection to the
Media archive</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><B>13.</B></P>
</TD>
<TD>
<P>The system presents the file to Local storage</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>14.</B></P>
</TD>
<TD>
<P>Local storage stores the file under the specified unique ID</P>
</TD>
<TD>
<P><B>15.</B></P>
</TD>
<TD>
<P>The system closes the connection to Local storage.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Alternate courses</H4>
<UL>
<LI><P STYLE="margin-bottom: 0in"><B>action 4:</B> the Local storage
finds that the system can not be authenticated. the system is
notified and the use case ends.
</P>
<LI><P STYLE="margin-bottom: 0in"><B>action 9:</B> the Media archive
finds that the system can not be authenticated. the system is
notified and the use case ends.
</P>
<LI><P><B>action 11:</B> the Media archive does not hold the
requested audio clip. the system is notified and the use case ends.</P>
</UL>
<H3>UC-5 Review play log</H3>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>ref#</B>
</P>
</TD>
<TD>
<P>UC-5
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>use case</B>
</P>
</TD>
<TD>
<P>Review play log
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>type</B>
</P>
</TD>
<TD>
<P>secondary, essential
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>actors</B>
</P>
</TD>
<TD>
<P>Broadcast auditor
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>purpose</B>
</P>
</TD>
<TD>
<P>Review what has been played
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>overview</B>
</P>
</TD>
<TD>
<P>The Broadcast auditor reviews the audio clips that have been
played in a selected time interval. He may generate reports for
proof of broadcast reasons.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>references</B>
</P>
</TD>
<TD>
<P>F1.4
</P>
</TD>
</TR>
</TABLE>
<H4>Typical course of events</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH COLSPAN=2>
<P>actor action
</P>
</TH>
<TH COLSPAN=2>
<P>system response
</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>1.</B>
</P>
</TD>
<TD>
<P>Broadcast auditor connects to the scheduler daemon with the
intent of reviewing what has been played.</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>2.</B>
</P>
</TD>
<TD>
<P>The Broadcast auditor provides authentication information
</P>
</TD>
<TD>
<P><B>3.</B>
</P>
</TD>
<TD>
<P>The system authenticates the Broadcast auditor and grants
access.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>3.</B></P>
</TD>
<TD>
<P>The Broadcast auditor browses through the play log in a
time-ordered manner.</P>
</TD>
<TD>
<P><B>4.</B></P>
</TD>
<TD>
<P>The system displays the play log entries.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>5.</B></P>
</TD>
<TD>
<P>The Broadcast auditor requests a play report for a given time
period.</P>
</TD>
<TD>
<P><B>6.</B></P>
</TD>
<TD>
<P>The system displays the requested report.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>7.</B></P>
</TD>
<TD>
<P>The Broadcast auditor disconnects.</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Alternate courses</H4>
<UL>
<LI><P><B>action 3:</B> the system finds that the user can not be
authenticated. the user is notified and the use case ends.
</P>
</UL>
<P><BR><BR>
</P>
<H3>UC-6 Create playlist</H3>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>ref#</B>
</P>
</TD>
<TD>
<P>UC-6
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>use case</B>
</P>
</TD>
<TD>
<P>Create playlist</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>type</B>
</P>
</TD>
<TD>
<P>secondary, essential
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>actors</B>
</P>
</TD>
<TD>
<P>Playlist editor</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>purpose</B>
</P>
</TD>
<TD>
<P>Create a new playlist, and then edit it.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>overview</B>
</P>
</TD>
<TD>
<P>The Playlist editor connects to the Scheduler with the aim of
creating a new playlist. A basic user interface is provided, which
allows professionals to create and edit the playlsits on the
system.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>references</B>
</P>
</TD>
<TD>
<P>F1.12, F1.13</P>
</TD>
</TR>
</TABLE>
<H4>Typical course of events</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH COLSPAN=2>
<P>actor action
</P>
</TH>
<TH COLSPAN=2>
<P>system response
</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>1.</B>
</P>
</TD>
<TD>
<P>Playlist editor connects to the scheduler with the intent of
creating a new playlist.</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>2.</B>
</P>
</TD>
<TD>
<P>The Playlist editor provides authentication information
</P>
</TD>
<TD>
<P><B>3.</B>
</P>
</TD>
<TD>
<P>The system authenticates the Playlist editor and grants access.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>4.</B></P>
</TD>
<TD>
<P>The Playlist editor signals that he whishes for a new playlist</P>
</TD>
<TD>
<P><B>5.</B></P>
</TD>
<TD>
<P>The system creates a new, empty playlist, and opens it for
editing.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>6.</B></P>
</TD>
<TD>
<P>The Playlist editor edits the new playlist. See UC-7 actions
7-15 for details.</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>7.</B></P>
</TD>
<TD>
<P>The Playlist editor disconnects.</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Alternate courses</H4>
<UL>
<LI><P><B>action 3:</B> the system finds that the user can not be
authenticated. the user is notified and the use case ends.
</P>
</UL>
<P><BR><BR>
</P>
<H3>UC-7 Edit playlist</H3>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>ref#</B>
</P>
</TD>
<TD>
<P>UC-7
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>use case</B>
</P>
</TD>
<TD>
<P>Edit playlist</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>type</B>
</P>
</TD>
<TD>
<P>secondary, essential
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>actors</B>
</P>
</TD>
<TD>
<P>Playlist editor</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>purpose</B>
</P>
</TD>
<TD>
<P>Edit a previoulsy uploaded playlist</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>overview</B>
</P>
</TD>
<TD>
<P>The Playlist editor connects to the Scheduler with the aim of
either editing an existing playlist. A basic user interface is
provided, which allows professionals to edit the playlsits on the
system.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>references</B>
</P>
</TD>
<TD>
<P>F1.12
</P>
</TD>
</TR>
</TABLE>
<H4>Typical course of events</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH COLSPAN=2>
<P>actor action
</P>
</TH>
<TH COLSPAN=2>
<P>system response
</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>1.</B>
</P>
</TD>
<TD>
<P>Playlist editor connects to the scheduler with the intent of
editing a playlist.</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>2.</B>
</P>
</TD>
<TD>
<P>The Playlist editor provides authentication information
</P>
</TD>
<TD>
<P><B>3.</B>
</P>
</TD>
<TD>
<P>The system authenticates the Playlist editor and grants access.
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><B>4.</B></P>
</TD>
<TD>
<P>The system lists the available playlists.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>5.</B></P>
</TD>
<TD>
<P>The Playlist editor selects a playlist for editing.</P>
</TD>
<TD>
<P><B>6.</B></P>
</TD>
<TD>
<P>The system opens the playlist in editing mode.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>7.</B></P>
</TD>
<TD>
<P>The Playlist editor browses the available Audio clips</P>
</TD>
<TD>
<P><B>8.</B></P>
</TD>
<TD>
<P>The system shows the list of available audio clips</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>9.</B></P>
</TD>
<TD>
<P>The Playlist editor selects an Audio clip</P>
</TD>
<TD>
<P><B>10.</B></P>
</TD>
<TD>
<P>The system displays details on the audio clip.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>11.</B></P>
</TD>
<TD>
<P>The Playlist editor ads a new audio clip to the playlist, at a
certain timepoint in the playlist.</P>
</TD>
<TD>
<P><B>12.</B></P>
</TD>
<TD>
<P>The new audio clip is added to the playlist.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>13.</B></P>
</TD>
<TD>
<P>The Playlist editor removes an audio clip from the playlist.</P>
</TD>
<TD>
<P><B>14.</B></P>
</TD>
<TD>
<P>The audio clip is removed from the playlist.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>15.</B></P>
</TD>
<TD>
<P>The Playlist editor edits the fade-in or fade-out of a clip in
the playlist.</P>
</TD>
<TD>
<P><B>16.</B></P>
</TD>
<TD>
<P>The fade-in or fade-out is edited.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>17.</B></P>
</TD>
<TD>
<P>The Playlist editor saves the playlist.</P>
</TD>
<TD>
<P><B>18.</B></P>
</TD>
<TD>
<P>The playlist is validated.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><B>19.</B></P>
</TD>
<TD>
<P>The playlist is saved.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>20.</B></P>
</TD>
<TD>
<P>The Playlist editor disconnects.</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Alternate courses</H4>
<UL>
<LI><P STYLE="margin-bottom: 0in"><B>action 3:</B> the system finds
that the user can not be authenticated. the user is notified and the
use case ends.
</P>
<LI><P STYLE="margin-bottom: 0in"><B>action 6:</B> the selected
playlist is currently being executed. the user is notified that
executing playlists can not be edited and the use case ends.
</P>
<LI><P STYLE="margin-bottom: 0in"><B>action 17:</B> the user decides
not to save the playlist, but to revert to the version prior to
editing. the playlist is reverted, and is shown to the user in
non-edit mode.</P>
<LI><P><B>action 18:</B> the playlist turns out not be valid. the
user is notified that such a playlist can not be saved, and is given
an opportunity to further edit the playlist. validation errors are
also shown.
</P>
</UL>
<P><BR><BR>
</P>
<H3>UC-8 Start/stop scheduler</H3>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>ref#</B>
</P>
</TD>
<TD>
<P>UC-8
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>use case</B>
</P>
</TD>
<TD>
<P>Start/stop scheduler</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>type</B>
</P>
</TD>
<TD>
<P>primary, essential
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>actors</B>
</P>
</TD>
<TD>
<P>Administrator</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>purpose</B>
</P>
</TD>
<TD>
<P>Start and stop the scheduler daemon</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>overview</B>
</P>
</TD>
<TD>
<P>The adminisitrator starts the scheduler deamon by invoking a
System V init-style startup script. He may also stop the deamon
with the same script.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>references</B>
</P>
</TD>
<TD>
<P>F1.14, F1.15, A1.8</P>
</TD>
</TR>
</TABLE>
<H4>Typical course of events</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH COLSPAN=2>
<P>actor action
</P>
</TH>
<TH COLSPAN=2>
<P>system response
</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>1.</B>
</P>
</TD>
<TD>
<P>The Administrator invokes the scheduler's System V init script
with the start parameter</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><B>2.</B>
</P>
</TD>
<TD>
<P>The scheduler daemon starts up.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>3.</B></P>
</TD>
<TD>
<P>The Administrator checks to see if the scheduler daemon is
running</P>
</TD>
<TD>
<P><B>4.</B></P>
</TD>
<TD>
<P>The scheduler daemon reports that it is running.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>5.</B></P>
</TD>
<TD>
<P>The Administrator stops the scheduler deamon.</P>
</TD>
<TD>
<P><B>6.</B></P>
</TD>
<TD>
<P>The scheduler daemon stops.</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Alternate courses</H4>
<UL>
<LI><P STYLE="margin-bottom: 0in"><B>action 2:</B> if the scheduler
is already running, indicate the starting attempt as an error.</P>
<LI><P STYLE="margin-bottom: 0in"><B>action 4:</B> if the scheduler
daemon is not running, it is reported that it is not running.</P>
<LI><P><B>action 6:</B> if the scheduler daemon is not running, it
is not stopped.</P>
</UL>
<H2>Conceptual model</H2>
<P>The following figure displays the semantic concepts identified for
the Scheduler daemon, and the main associations between the
concepts.<BR><BR><BR>
</P>
<H3>Concepts</H3>
<P STYLE="margin-bottom: 0in"><BR>
</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH>
<P>concept</P>
</TH>
<TH>
<P>description</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Media archive</B></P>
</TD>
<TD>
<P>An archive external to the system, which holds Audio clips. The
archive offers its clips for download by requesting clips based on
their unique ids.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Clip retriever</B></P>
</TD>
<TD>
<P>Retrieves Audio clips from the Media archive and stores them in
local storage.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Local storage</B></P>
</TD>
<TD>
<P>A local store of Audio clips. Provides access to each clip
based on the clips' unique id. Allows random access to the clip
files.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Audio clip</B></P>
</TD>
<TD>
<P>A uniquely identified audio file.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Playlist</B></P>
</TD>
<TD>
<P>A metafile, containing references to Audio clips, and
information on how the clips should be played.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>PlaylistElement</B></P>
</TD>
<TD>
<P>An association class describing the specifics of an instance of
an Audio clip in a playlist.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>FadeInfo</B></P>
</TD>
<TD>
<P>A class describing fade in or fade out characteristics for an
Audio clip in a Playlist</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Playlist store</B></P>
</TD>
<TD>
<P>A container holding a range of playlists.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Schedule</B></P>
</TD>
<TD>
<P>Contains Schedule entries</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Schedule entry</B></P>
</TD>
<TD>
<P>Contains the time and details of when a playlist should be
played.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Scheduler daemon</B></P>
</TD>
<TD>
<P>Executes playlists at timepoints specified by the schedule.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Play log</B></P>
</TD>
<TD>
<P>A logging facility, holding Play log entries.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Play log entry</B></P>
</TD>
<TD>
<P>A record of when an Audio clip was played.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Play report</B></P>
</TD>
<TD>
<P>An audit report of what Audio clips have been played in a
certain time period</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Authentication</B></P>
</TD>
<TD>
<P>Provides authentication services</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Playlist editor</B></P>
</TD>
<TD>
<P>An external editor, managing playlists.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Broadcast auditor</B></P>
</TD>
<TD>
<P>An external auditor, browsing the Play log.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Administrator</B></P>
</TD>
<TD>
<P>The administrator responsible for starting and stopping the
scheduler daemon.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H3>Associations</H3>
<P STYLE="margin-bottom: 0in"><BR>
</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TH>
<P>source</P>
</TH>
<TH>
<P>association</P>
</TH>
<TH>
<P>target</P>
</TH>
<TH>
<P>description</P>
</TH>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Clip retriever</P>
</TD>
<TD>
<P>Retrieves clips from</P>
</TD>
<TD>
<P>Media archive</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Media archive</P>
</TD>
<TD>
<P>Contains</P>
</TD>
<TD>
<P>Audio clip</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Clip retriever</P>
</TD>
<TD>
<P>Stores clips in</P>
</TD>
<TD>
<P>Local storage</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Local storage</P>
</TD>
<TD>
<P>Contains</P>
</TD>
<TD>
<P>Audio clip</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Playlist</P>
</TD>
<TD>
<P>References by PlaylistElement</P>
</TD>
<TD>
<P>Audio clip</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>PlaylistElement</P>
</TD>
<TD>
<P>Fades in with</P>
</TD>
<TD>
<P>FadeInfo</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>PlaylistElement</P>
</TD>
<TD>
<P>Fades out with</P>
</TD>
<TD>
<P>FadeInfo</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Playlist store</P>
</TD>
<TD>
<P>Contains</P>
</TD>
<TD>
<P>Play list</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Playlist editor</P>
</TD>
<TD>
<P>Uploads playlist to</P>
</TD>
<TD>
<P>Playlist store</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Playlist editor</P>
</TD>
<TD>
<P>Manages schedule in</P>
</TD>
<TD>
<P>Schedule</P>
</TD>
<TD>
<P>The Playlist editor schedules playlists.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Schedule</P>
</TD>
<TD>
<P>Contains</P>
</TD>
<TD>
<P>Schedule entry</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Schedule entry</P>
</TD>
<TD>
<P>References</P>
</TD>
<TD>
<P>Playlist</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Scheduler daemon</P>
</TD>
<TD>
<P>Executes</P>
</TD>
<TD>
<P>Schedule</P>
</TD>
<TD>
<P>The Scheduler daemon plays the scheduled playlists.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Scheduler daemon</P>
</TD>
<TD>
<P>Logs into</P>
</TD>
<TD>
<P>Play log</P>
</TD>
<TD>
<P>The Scheduler daemon logs all the played audio clips into the
Play log for proof of broadcast purposes.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Play log</P>
</TD>
<TD>
<P>Contains</P>
</TD>
<TD>
<P>Play log entry</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Play log</P>
</TD>
<TD>
<P>Generated</P>
</TD>
<TD>
<P>Play report</P>
</TD>
<TD>
<P>The play log generates reports based on Play log entries.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Play log entry</P>
</TD>
<TD>
<P>References</P>
</TD>
<TD>
<P>Audio clip</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Broadcast auditor</P>
</TD>
<TD>
<P>Browses entries from</P>
</TD>
<TD>
<P>Play log</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Broadcast auditor</P>
</TD>
<TD>
<P>Requests</P>
</TD>
<TD>
<P>Play report</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Playlist editor</P>
</TD>
<TD>
<P>Is authenticated by</P>
</TD>
<TD>
<P>Authentication</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Broadcast auditor</P>
</TD>
<TD>
<P>Is authenticated by</P>
</TD>
<TD>
<P>Authentication</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P>Administrator</P>
</TD>
<TD>
<P>Manages</P>
</TD>
<TD>
<P>Scheduler daemon</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H2>System behavior</H2>
<P>The behavior of the system as a whole as experienced from the
outside is discussed in this section.</P>
<H3>System sequence diagrams</H3>
<P>System diagrams are presented for each use case below.</P>
<H4>UC-1 Upload playlists</H4>
<P><BR><BR>
</P>
<H4>UC-2 Manage schedule</H4>
<P><BR><BR>
</P>
<H4>UC-3 Manage playlists</H4>
<P><BR><BR>
</P>
<H4>UC-4 Retrieve remote files</H4>
<P><BR><BR>
</P>
<H4>UC-5 Review play log</H4>
<H4>UC-6 Create playlist</H4>
<H4>UC-7 Edit playlist</H4>
<H4>UC-8 Start/stop scheduler</H4>
<P><BR><BR>
</P>
<H3>System objects</H3>
<P>The following figures shows the system objects and their
functions, as derived from the system sequence diagrams.</P>
<H3>Contracts</H3>
<P>For all operations exposed in the system sequence diagrams, the
following contracts are defined.</P>
<H4>Contract for Scheduler : authenticate</H4>
<P>See Authentication : authenticate</P>
<H4>Contract for Scheduler : uploadPlaylist</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>uploadPlaylist<BR>(playlist : Playlist,<BR>playtime:
Schedule)<BR>: UniqueId</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Upload a playlist and put it into the schedule.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.1, UC-1</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>If the uploaded playlist is not valid, indicate as an error<BR>If
the proposed schedule conflicts with existing schedules, indicate
as an error</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>the unique id of the ScheduleEntry created with this upload</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>A new Playlist is created, storing the uploaded playlist</P>
</TD>
<TD>
<P>instance creation
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>Playlist is entered into the Playlist store</P>
</TD>
<TD>
<P>association formed</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>A new Schedule is created, according to the supplied schedule</P>
</TD>
<TD>
<P>instance creation</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>Schedule is associated with the Playlist</P>
</TD>
<TD>
<P>association formed</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : displaySchedule</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>displaySchedule<BR>(from : TimeStamp,<BR>to : TimeStamp)<BR>:
Schedule</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Display Schedule entries for a time period.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.4, UC-2</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>The Schedule entries for the specified time period.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=LEFT>none</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : displayPlaylist</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>displayPlaylist<BR>(playlistId : UniqueId)<BR>: Playlist</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Display a specific playlist</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.4, UC-3</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>If no playlist exists for the specified playlistId, indicate as
an error.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>The requested playlist.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=LEFT>none</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : deletePlaylist</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>deletePlaylist<BR>(playlist : Playlist)<BR>: void</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Delete a specific playlist</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.11, UC-3</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>If no playlist exists for the specified playlistId, indicate as
an error.<BR>If the playlist is referenced by any Schedule entry,
indicate as an error.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The playlist is removed from the Playlist store.</P>
</TD>
<TD>
<P>association broken</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>References by the playlist to Audio clips removed</P>
</TD>
<TD>
<P>association broken</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The playlist is deleted</P>
</TD>
<TD>
<P>instance deletion</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : removeFromSchedule</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>removeFromSchedule<BR>(scheduleEntryId : UniqueId)<BR>: bool</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Remove a specific playlist from a schedule entry</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.9, UC-2</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>If no ScheduleEntry by the specified scheduleEntryId exist,
indicate as an error.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>true if the specified entry was removed, false if it did not
exist.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>Reference to the playlist by the scheduleEntry is removed.</P>
</TD>
<TD>
<P>association broken</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The ScheduleEntry specified by the scheduleEntryId is deleted</P>
</TD>
<TD>
<P>instance deletion</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : reschedule</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>reschedule<BR>(scheduleEntryId : UniqueId,<BR>playtime :
TimeStamp)<BR>: bool</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Change when a certain playlist is scheduled to play.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.10, UC-2</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>If no ScheduleEntry by the specified scheduleEntryId exist,
indicate as an error.<BR>If the new playtime conflicts with other
schedule entries, indicate as an error.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>false on errors</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The time attribute of scheduleEntry is updated to the supplied
playtime.</P>
</TD>
<TD>
<P>attribute modification</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : displayPlaylists</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>displayPlaylists<BR>()<BR>: Playlist</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Display Playlists contained in the Playlist store</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.4, UC-3</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>The playlists contained in the Playlist store.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=LEFT>none</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : displayPlayLog</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>displayPlayLog<BR>()<BR>: Play log</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Display Play log entries contained in the Play log</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.4, UC-5</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>The play log entries contained in the Play log.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=LEFT>none</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : generatePlayReport</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>generatePlayReport<BR>(from : TimeStamp,<BR>to : TimeStamp)<BR>:
Play report</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Present a report on what Audio clips have been played to the
Broadcast auditor.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.4, UC-5</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>A report on the played Audio clips played in the specified time
period.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=LEFT>none</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : createPlaylist</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>createPlaylist<BR>()<BR>: Playlist</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Create a new playlist</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.12, UC-6</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P>A new playlist is created, and is immediately locked for
editing.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>A new Playlist is created</P>
</TD>
<TD>
<P>instance creation</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The lockedForEditing attribute is set to true for the playlist</P>
</TD>
<TD>
<P>attribute modification</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The playlist is added to the Playlist store</P>
</TD>
<TD>
<P>association formed</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : openPlaylistForEditing</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>openPlaylistForEditing<BR>(playlist : Playlist)<BR>: void</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Open a playlist for editing</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.13, UC-7</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P>A playlist is opened for editing. The playlist may not be
played when being edited. Also, active (currently executing)
playlists may not be opened for editing. This is in effect a lock,
which is released by saving the playlist.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>if the playlist is currently being executed, indicate as an
error.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The current version of the playlist is stored, in case the user
wants to revert to the last saved version (see
revertEditedPlaylist)</P>
</TD>
<TD>
<P>instance creation</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The lockedForEditing attribute is set to true for the playlist</P>
</TD>
<TD>
<P>attribute modification</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : addAudioClipToPlaylist</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>addAutioClipToPlaylist<BR>(playlist : Playlist,<BR>audioClip :
AudioClip,<BR>relativeOffset : Time)<BR>: void</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Add an Audio clip to a Playlist</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.13, UC-7</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P>The Audio clip is added to the playlist with the specified
relativeOffset from the beginning of the Playlist.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>the Playlist is currently opened for editing</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The new PlaylistElement is created associating the playlist
with the audio clip, with the specified relativeOffset</P>
</TD>
<TD>
<P>association formed, instnace creation</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : displayAudioClips</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>displayAudioClips<BR>()<BR>: AudioClip</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Display the audio clips known to the Scheduler</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.13, UC-7</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>The Audio clips kown to the Scheduler</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=LEFT>none</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : displayAudioClip</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>displayAudioClip<BR>(audioClipId : UniqueId)<BR>: AudioClip</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Display the audio clip specified by the audioClipId</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.13, UC-7</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>if no audio clip by the specified id exists, indicate as an
error</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>The Audio clip specified by the audioClipId</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=LEFT>none</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : removeAudioClipFromPlaylist</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>removeAutioClipFromPlaylist<BR>(playlist :
Playlist,<BR>relativeOffset: Time)<BR>: void</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Remove an Audio clip at the given relative offset from a
Playlist</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.13, UC-7</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P>The Audio clip is removed from the Playlist.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>If there is no Audio clip at the specified relative offset in
the playlist, indicate as an error.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>the Playlist is currently opened for editing</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The PlaylistElement associating the AudioClip with the Playlist
is removed, with the related FadeInfo instances</P>
</TD>
<TD>
<P>instance deletion, association broken</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : updateFadeInFadeOut</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>updateFadeInFadeOut<BR>(audioClip : AudioClip,<BR>playlist :
Playlist)<BR>: void</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Update the fade-in and fade-out parameters for an audio clip
playing in a playlist.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.13, UC-7</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>If the Audio clip is not in the playlist, indicate as an error.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>the Playlist is currently opened for editing</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The fade-in and fade-out parameters for the audio clip in the
playlist are updated</P>
</TD>
<TD>
<P>attribute modification</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : validatePlaylist</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>validatePlaylist<BR>(playlist : Playlist)<BR>: boolean</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Validate a playlist for being complete.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.13, UC-7</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P>The playlist is checked for being complete (not containing
silence) and other sanity criteria.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=LEFT>none</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : savePlaylist</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>savePlaylist<BR>(playlist : Playlist)<BR>: void</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>The playlist is saved.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.13, UC-7</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>If the playlist is not valid, indicate as an error.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>the Playlist is currently opened for editing</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The lockedForEditing attriubute is set to false for the
playlist</P>
</TD>
<TD>
<P>attribute modification</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The old version of the Playlist that could have been used for
reverting is deleted (see revertEditedPlaylist)</P>
</TD>
<TD>
<P>instance deletion</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : revertEditedPlaylist</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>revertEditedPlaylist<BR>(playlist : Playlist)<BR>: void</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Changes are discarded for a Playlist that is being edited.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.13, UC-7</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P>The contents of the playlist are reverted to the state prior to
when editing began on it.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>the Playlist is currently opened for editing</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The contents of the Playlist are reverted to the last saved
version. This includes deleting all created PlaylistElement and
FadeInfo instances.</P>
</TD>
<TD>
<P>attribute modification, instance deletion</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The lockedForEditing attriubute is set to false for the
playlist</P>
</TD>
<TD>
<P>attribute modification</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : start</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>start<BR>()<BR>: void</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Starts the scheduler daemon</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.14, UC-8</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P>A System V init-style daemon starting entry point</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>The scheduler daemon is currently not running</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The scheduler daemon object is created</P>
</TD>
<TD>
<P>instance creation</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>All the necessary structures are created for the deamon to run</P>
</TD>
<TD>
<P>instance creation</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : isRunning</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>isRunning<BR>()<BR>: boolean</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Tells if the scheduler daemon is running</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>UC-8</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P>A System V init-style daemon status entry point</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>true of the daemon is running, false otherwise</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=LEFT>none</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Scheduler : stop</H4>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>stop<BR>()<BR>: void</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Stops the scheduler daemon</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>system</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.15, UC-8</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P>A System V init-style daemon stopping entry point</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>The scheduler daemon is currently running</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>The scheduler daemon object is deleted</P>
</TD>
<TD>
<P>instance deletion</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Media archive : authenticate</H4>
<P STYLE="margin-bottom: 0in">TODO: move to Media archive spec</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>authenticate<BR>(authenticationInfo : AuthenticationInfo)<BR>:
boolean</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Check if the provided authentication info is recognized.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>interface</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>UC-4</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>true if the provided authentication is recognized, false
otherwise</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P>none</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Media archive : retrieveAudioClip</H4>
<P STYLE="margin-bottom: 0in">TODO: move to Media archive spec</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>retrieveAudioClip<BR>(clipId : UniqueId)<BR>: AudioClip</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Retrieve an AudioClip specified by the supplied audio clip id.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>interface</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>F1.2, UC-4</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>if no audio clip exists with the supplied id, indicate as an
error</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>the requested audio clip</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>condition</B></P>
</TD>
<TD>
<P ALIGN=CENTER><B>type</B></P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>A new Audio clip is created and filled with the contents of the
retrieved audio clip</P>
</TD>
<TD>
<P>instance creation
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P>Audio clip is entered into Local storage</P>
</TD>
<TD>
<P>association formed</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Local storage : authenticate</H4>
<P STYLE="margin-bottom: 0in">TODO: move to Local storage spec</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>authenticate<BR>(authenticationInfo : AuthenticationInfo)<BR>:
boolean</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Check if the provided authentication info is recognized.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>interface</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>UC-4</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>true if the provided authentication is recognized, false
otherwise</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P>none</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Local storage : existsAudioClip</H4>
<P STYLE="margin-bottom: 0in">TODO: move to Local storage spec</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>existsAudioClip<BR>(audioClipId : UniqueId)<BR>: boolean</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Tell if an audio clip by the provided unique id is stored in
the Local storage</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>interface</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>UC-4</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>true if an audio clip with the provided id exists, false
otherwise</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P>none</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H4>Contract for Local storage : storeAudioClip</H4>
<P STYLE="margin-bottom: 0in">TODO: move to Local storage spec</P>
<TABLE WIDTH=100% BORDER=0 CELLPADDING=2 CELLSPACING=2>
<TR VALIGN=TOP>
<TD>
<P><B>Name</B></P>
</TD>
<TD COLSPAN=2>
<P>storeAudioClip<BR>(audioClip : AudioClip)<BR>: void</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Responsibilities</B></P>
</TD>
<TD COLSPAN=2>
<P>Store an audio clip.</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Type</B></P>
</TD>
<TD COLSPAN=2>
<P>interface</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Cross-reference</B></P>
</TD>
<TD COLSPAN=2>
<P>UC-4</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Notes</B></P>
</TD>
<TD COLSPAN=2>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Exceptions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Output</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Pre-conditions</B></P>
</TD>
<TD COLSPAN=2>
<P>none</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><B>Post-conditions</B></P>
</TD>
<TD>
<P>The supplied audio clip is stored in the storage.</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
<TR VALIGN=TOP>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
<TD>
<P><BR>
</P>
</TD>
</TR>
</TABLE>
<P><BR><BR>
</P>
<H1>Glossary</H1>
<P><B>playlist</B><BR>The playlist is a metafile, containing
references to audio clips that should be played, and details on how
they should be played.</P>
</BODY>
</HTML>