From a6e063300e3696b4ca4678351b876dd671cc08b2 Mon Sep 17 00:00:00 2001 From: maroy Date: Sun, 25 Jul 2004 16:48:33 +0000 Subject: [PATCH] added design model --- livesupport/doc/model/Architecture.svg | 179 + .../Authenticateuser_SequenceDiagram.svg | 139 + .../doc/model/Authentication/Concepts.svg | 259 + .../Authentication/EssentialUseCases.svg | 63 + .../model/Authentication/Systembehaviour.svg | 145 + .../doc/model/Authentication/index.html | 500 ++ livesupport/doc/model/LiveSupport.zuml | Bin 0 -> 273173 bytes .../Accessrawaudiodata_SequenceDiagram.svg | 239 + .../doc/model/LocalStorage/Concepts.svg | 536 +++ .../Deleteaudioclip_SequenceDiagram.svg | 183 + .../model/LocalStorage/EssentialUseCases.svg | 142 + .../Searchinmetadata_SequenceDiagram.svg | 195 + ...Storeorupdateaudioclip_SequenceDiagram.svg | 195 + .../model/LocalStorage/Systembehaviour.svg | 553 +++ ...pdateAudioclipmetadata_SequenceDiagram.svg | 195 + livesupport/doc/model/LocalStorage/index.html | 1908 ++++++++ .../doc/model/MediaArchive/Concepts.svg | 476 ++ .../DeleteAudioclip_SequenceDiagram.svg | 183 + .../Downloadrawaudiodata_SequenceDiagram.svg | 207 + .../model/MediaArchive/EssentialUseCases.svg | 143 + .../Searchinmetadata_SequenceDiagram.svg | 195 + ...StoreorupdateAudioclip_SequenceDiagram.svg | 195 + .../model/MediaArchive/Systembehaviour.svg | 469 ++ ...pdateAudioclipmetadata_SequenceDiagram.svg | 195 + livesupport/doc/model/MediaArchive/index.html | 1678 +++++++ ...udiocliptoLocalstorage_SequenceDiagram.svg | 388 ++ ...anAudiocliptoaPlaylist_SequenceDiagram.svg | 444 ++ ...udiocliptoMediaarchive_SequenceDiagram.svg | 488 ++ .../doc/model/PlaylistEditor/Concepts.svg | 1032 ++++ .../CreateaPlaylist_SequenceDiagram.svg | 189 + ...ioclipfromLocalstorage_SequenceDiagram.svg | 327 ++ ...ransitionofanAudioclip_SequenceDiagram.svg | 207 + .../PlaylistEditor/EssentialUseCases.svg | 344 ++ .../ListentoaPlaylist_SequenceDiagram.svg | 559 +++ ...nfigurationinformation_SequenceDiagram.svg | 271 ++ ...aarchiveinLocalstorage_SequenceDiagram.svg | 488 ++ ...anAudioclipinaPlaylist_SequenceDiagram.svg | 275 ++ .../SearchforAudioclips_SequenceDiagram.svg | 532 ++ .../model/PlaylistEditor/Systembehaviour.svg | 1291 +++++ ...udioclipinLocalstorage_SequenceDiagram.svg | 363 ++ ...listtoaSchedulerdaemon_SequenceDiagram.svg | 351 ++ .../doc/model/PlaylistEditor/index.html | 4277 +++++++++++++++++ livesupport/doc/model/Scheduler/Concepts.svg | 1438 ++++++ .../Createplaylist_SequenceDiagram.svg | 199 + .../Editplaylist_SequenceDiagram.svg | 779 +++ .../doc/model/Scheduler/EssentialUseCases.svg | 218 + .../Manageplaylists_SequenceDiagram.svg | 289 ++ .../Manageschedule_SequenceDiagram.svg | 455 ++ .../Retrieveremotefiles_SequenceDiagram.svg | 388 ++ .../Reviewplaylog_SequenceDiagram.svg | 257 + .../Startstopscheduler_SequenceDiagram.svg | 222 + .../doc/model/Scheduler/Systembehaviour.svg | 1355 ++++++ .../Uploadplaylists_SequenceDiagram.svg | 195 + livesupport/doc/model/Scheduler/index.html | 4201 ++++++++++++++++ .../PlaylistEditorArchitecture.svg | 144 + .../SchedulerArchitecture.svg | 137 + .../SoftwareArchitecture.zuml | Bin 0 -> 5066 bytes .../doc/model/SoftwareArchitecture/index.html | 104 + livesupport/doc/model/index.html | 200 + 59 files changed, 31579 insertions(+) create mode 100644 livesupport/doc/model/Architecture.svg create mode 100644 livesupport/doc/model/Authentication/Authenticateuser_SequenceDiagram.svg create mode 100644 livesupport/doc/model/Authentication/Concepts.svg create mode 100644 livesupport/doc/model/Authentication/EssentialUseCases.svg create mode 100644 livesupport/doc/model/Authentication/Systembehaviour.svg create mode 100644 livesupport/doc/model/Authentication/index.html create mode 100644 livesupport/doc/model/LiveSupport.zuml create mode 100644 livesupport/doc/model/LocalStorage/Accessrawaudiodata_SequenceDiagram.svg create mode 100644 livesupport/doc/model/LocalStorage/Concepts.svg create mode 100644 livesupport/doc/model/LocalStorage/Deleteaudioclip_SequenceDiagram.svg create mode 100644 livesupport/doc/model/LocalStorage/EssentialUseCases.svg create mode 100644 livesupport/doc/model/LocalStorage/Searchinmetadata_SequenceDiagram.svg create mode 100644 livesupport/doc/model/LocalStorage/Storeorupdateaudioclip_SequenceDiagram.svg create mode 100644 livesupport/doc/model/LocalStorage/Systembehaviour.svg create mode 100644 livesupport/doc/model/LocalStorage/UpdateAudioclipmetadata_SequenceDiagram.svg create mode 100644 livesupport/doc/model/LocalStorage/index.html create mode 100644 livesupport/doc/model/MediaArchive/Concepts.svg create mode 100644 livesupport/doc/model/MediaArchive/DeleteAudioclip_SequenceDiagram.svg create mode 100644 livesupport/doc/model/MediaArchive/Downloadrawaudiodata_SequenceDiagram.svg create mode 100644 livesupport/doc/model/MediaArchive/EssentialUseCases.svg create mode 100644 livesupport/doc/model/MediaArchive/Searchinmetadata_SequenceDiagram.svg create mode 100644 livesupport/doc/model/MediaArchive/StoreorupdateAudioclip_SequenceDiagram.svg create mode 100644 livesupport/doc/model/MediaArchive/Systembehaviour.svg create mode 100644 livesupport/doc/model/MediaArchive/UpdateAudioclipmetadata_SequenceDiagram.svg create mode 100644 livesupport/doc/model/MediaArchive/index.html create mode 100644 livesupport/doc/model/PlaylistEditor/AddanAudiocliptoLocalstorage_SequenceDiagram.svg create mode 100644 livesupport/doc/model/PlaylistEditor/AddanAudiocliptoaPlaylist_SequenceDiagram.svg create mode 100644 livesupport/doc/model/PlaylistEditor/AddorupdateanAudiocliptoMediaarchive_SequenceDiagram.svg create mode 100644 livesupport/doc/model/PlaylistEditor/Concepts.svg create mode 100644 livesupport/doc/model/PlaylistEditor/CreateaPlaylist_SequenceDiagram.svg create mode 100644 livesupport/doc/model/PlaylistEditor/DeleteanAudioclipfromLocalstorage_SequenceDiagram.svg create mode 100644 livesupport/doc/model/PlaylistEditor/EditthetransitionofanAudioclip_SequenceDiagram.svg create mode 100644 livesupport/doc/model/PlaylistEditor/EssentialUseCases.svg create mode 100644 livesupport/doc/model/PlaylistEditor/ListentoaPlaylist_SequenceDiagram.svg create mode 100644 livesupport/doc/model/PlaylistEditor/Maintainconfigurationinformation_SequenceDiagram.svg create mode 100644 livesupport/doc/model/PlaylistEditor/MirroranAudioclipfromaremoteMediaarchiveinLocalstorage_SequenceDiagram.svg create mode 100644 livesupport/doc/model/PlaylistEditor/MovethepositionofanAudioclipinaPlaylist_SequenceDiagram.svg create mode 100644 livesupport/doc/model/PlaylistEditor/SearchforAudioclips_SequenceDiagram.svg create mode 100644 livesupport/doc/model/PlaylistEditor/Systembehaviour.svg create mode 100644 livesupport/doc/model/PlaylistEditor/UpdateanAudioclipinLocalstorage_SequenceDiagram.svg create mode 100644 livesupport/doc/model/PlaylistEditor/UploadaPlaylisttoaSchedulerdaemon_SequenceDiagram.svg create mode 100644 livesupport/doc/model/PlaylistEditor/index.html create mode 100644 livesupport/doc/model/Scheduler/Concepts.svg create mode 100644 livesupport/doc/model/Scheduler/Createplaylist_SequenceDiagram.svg create mode 100644 livesupport/doc/model/Scheduler/Editplaylist_SequenceDiagram.svg create mode 100644 livesupport/doc/model/Scheduler/EssentialUseCases.svg create mode 100644 livesupport/doc/model/Scheduler/Manageplaylists_SequenceDiagram.svg create mode 100644 livesupport/doc/model/Scheduler/Manageschedule_SequenceDiagram.svg create mode 100644 livesupport/doc/model/Scheduler/Retrieveremotefiles_SequenceDiagram.svg create mode 100644 livesupport/doc/model/Scheduler/Reviewplaylog_SequenceDiagram.svg create mode 100644 livesupport/doc/model/Scheduler/Startstopscheduler_SequenceDiagram.svg create mode 100644 livesupport/doc/model/Scheduler/Systembehaviour.svg create mode 100644 livesupport/doc/model/Scheduler/Uploadplaylists_SequenceDiagram.svg create mode 100644 livesupport/doc/model/Scheduler/index.html create mode 100644 livesupport/doc/model/SoftwareArchitecture/PlaylistEditorArchitecture.svg create mode 100644 livesupport/doc/model/SoftwareArchitecture/SchedulerArchitecture.svg create mode 100644 livesupport/doc/model/SoftwareArchitecture/SoftwareArchitecture.zuml create mode 100644 livesupport/doc/model/SoftwareArchitecture/index.html create mode 100644 livesupport/doc/model/index.html diff --git a/livesupport/doc/model/Architecture.svg b/livesupport/doc/model/Architecture.svg new file mode 100644 index 000000000..9bacf14e6 --- /dev/null +++ b/livesupport/doc/model/Architecture.svg @@ -0,0 +1,179 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Scheduler + + + + + + + + + + + Local storage + + + + + + + + + + + Media archive + + + + + + + + + + + Authentication + + + + + + + + + + + Playlist editor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/livesupport/doc/model/Authentication/Authenticateuser_SequenceDiagram.svg b/livesupport/doc/model/Authentication/Authenticateuser_SequenceDiagram.svg new file mode 100644 index 000000000..f0749190e --- /dev/null +++ b/livesupport/doc/model/Authentication/Authenticateuser_SequenceDiagram.svg @@ -0,0 +1,139 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + user + + + + : + + + + User + + + + + + + + + + system + + + + : + + + + Authentication + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + diff --git a/livesupport/doc/model/Authentication/Concepts.svg b/livesupport/doc/model/Authentication/Concepts.svg new file mode 100644 index 000000000..40419681f --- /dev/null +++ b/livesupport/doc/model/Authentication/Concepts.svg @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + << + + + component + + + >> + + + Authentication + + + + + + + AuthenticationInfo + + + + + + + + + + + + + + + AuthenticationInterface + + + + + + + AuthenticationDatabase + + + + + + + + + + + + + + + Authentication + + + + + + + + + + + + + + + + + + + + + + + + + + + * + + + Stores + + + + + + + + + + + + Checks authentication info in + + + + + + + User + + + + + + + + + + + + + + + + + + + + Authenticates by + + + + + + + + + + + + Contains + + + diff --git a/livesupport/doc/model/Authentication/EssentialUseCases.svg b/livesupport/doc/model/Authentication/EssentialUseCases.svg new file mode 100644 index 000000000..e9d9969d2 --- /dev/null +++ b/livesupport/doc/model/Authentication/EssentialUseCases.svg @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Authentication + + + + + + + + + UC-1 Authenticate user + + + + + + + User + + + + + + diff --git a/livesupport/doc/model/Authentication/Systembehaviour.svg b/livesupport/doc/model/Authentication/Systembehaviour.svg new file mode 100644 index 000000000..db94174e9 --- /dev/null +++ b/livesupport/doc/model/Authentication/Systembehaviour.svg @@ -0,0 +1,145 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Authentication + + + + + + + + + + + + + + + AuthenticationInterface + + + + + + + + + + + authenticate + + + ( + + + authInfo + + + : + + + AuthenticationInfo + + + ) + + + : + + + boolean + + + + << + + + realize + + + >> + + + + + + + + + diff --git a/livesupport/doc/model/Authentication/index.html b/livesupport/doc/model/Authentication/index.html new file mode 100644 index 000000000..38ba10327 --- /dev/null +++ b/livesupport/doc/model/Authentication/index.html @@ -0,0 +1,500 @@ + + + + + LiveSupport Authentication specification + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+ +

Scope

+This document contains the specification of the LiveSupport +Authentication component.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Requirements

+

Overview
+

+The purpose of the Authentication component is to provide +authentication services by receiving authentication information and +checking these against an authentication database. +

Goals

+The authentication component is a re-usable component, which provides +both local and remote interfaces. Different authentication methods may +be supported, with username / password authentication being the most +trivial.
+

System functions

+The main system functions are described below. There are three +categories for these functions:
+ + + + + + + + + + + + + + + + + + + +
function category
+
meaning
+
evident
+
Should perform, and the user should be cognizant +that it is performed
+
hidden
+
Should perform, but not visible to the users.
+
frill
+
Optional
+
+
+
+ + + + + + + + + + + + + + + + + + +
ref#
+
function
+
category
+
F1.1
+
Authenticate users
+
evident
+

+

+

+
+
+

System attributes

+Generic attributes
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
attribute
+
details and constraints
+
category
+
A1.1
+
operating system platform
+
Linux
+
must
+
A1.2
+
local interface
+
locally callable API
+
must
+
A1.3
+
remote interface
+
remote interface via some RPC method like +XML-RPC or SOAP
+
want
+

+

+

+

+
+
+Attributes related to system functions
+
+ + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
ref#
+
attribute
+
details and constraints
+
category
+

+

+

+

+

+

+
+
+

Essential use cases

+This section lists generic (essential) uses cases, that do not contain +architecture-specific considerations.
+
+ +

UC-1 Authenticate user
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-1
use case Authenticate user
type primary, essential
actors User
purpose Authenticate a user
overview The user contacts the Authentication module with +the intention of verifying his integrity.
references F1.1
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. User connects to the authentication component +with the intention of authenticating
+

+

+
2. The User provides authentication +information 3. The system checks the authentication information +againts its internal database, and informs the user if the provided +information was correct.

+

+

+

+
+
+

Alternate courses

+none
+
+

Conceptual model

+The following figure displays the semantic concepts identified for the +Scheduler daemon, and the main associations between the concepts.
+
+ +
+

Concepts

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
concept
+
description
+
Authentication database
+
A database containing authentication +information, against which user-sent authentication information can be +checked.
+
Authentication
+
Component responsible for doing the +authentications
+
Authentication info
+
The information a user sends during +authentication, provides the basis for authentication
+
User
+
The party that wants to authenticate
+
Authentication interface
+
The local or remote interface for authentications
+

+

+
+
+

Associations

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
source
+
association
+
target
+
description
+
Authentication
+
Checks authentication info in
+
Authentication database
+

+
Authentication database
+
Stores
+
Authentication info
+

+
User
+
Contains
+
Authentication info
+

+
User
+
Authenticates by
+
Authentication interface
+

+

+

+

+

+
+
+

System behavior

+The behavior of the system as a whole as experienced from the outside +is discussed in this section.
+

System sequence diagrams

+System diagrams are presented for each use case below.
+

UC-1 Authenticate user
+

+ +
+

System objects

+The following figures shows the system objects and their functions, as +derived from the system sequence diagrams.
+ +

Contracts

+For all operations exposed in the system sequence diagrams, the +following contracts are defined.
+

Contract for AuthenticationInterface : authenticate

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
authenticate
+(authInfo : AuthenticationInfo)
+: boolean
+
Responsibilities
+
Check if the the +provided authentication info is recognized.
+
Type
+
system
+
Cross-reference
+
UC-1
+
Notes
+

+
Exceptions
+
none
Output
+
true if the provided +authentication is recognized, false otherwise
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+
+ + diff --git a/livesupport/doc/model/LiveSupport.zuml b/livesupport/doc/model/LiveSupport.zuml new file mode 100644 index 0000000000000000000000000000000000000000..50913c609f151b2bac7967172e2adb401b385fb4 GIT binary patch literal 273173 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 cyg2@oK-TaZD526uONhu{$0 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 literal 0 HcmV?d00001 diff --git a/livesupport/doc/model/LocalStorage/Accessrawaudiodata_SequenceDiagram.svg b/livesupport/doc/model/LocalStorage/Accessrawaudiodata_SequenceDiagram.svg new file mode 100644 index 000000000..22cd1d9c3 --- /dev/null +++ b/livesupport/doc/model/LocalStorage/Accessrawaudiodata_SequenceDiagram.svg @@ -0,0 +1,239 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + audio player + + + + : + + + + Audio player + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authId + + + ) + + + + + + + + + + + : + + + rawAudioData + + + := + + + accessRawAudioData + + + ( + + + audioClipId + + + ) + + + + + + + : + + + releaseRawAudioData + + + ( + + + rawAudioData + + + ) + + + + + + + diff --git a/livesupport/doc/model/LocalStorage/Concepts.svg b/livesupport/doc/model/LocalStorage/Concepts.svg new file mode 100644 index 000000000..d21149446 --- /dev/null +++ b/livesupport/doc/model/LocalStorage/Concepts.svg @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + << + + + component + + + >> + + + Local storage + + + + + + + AudioClip + + + + + + + - + + + id + + + : + + + UniqueId + + + - + + + duration + + + : + + + Time + + + + + + + + + + + Authentication + + + + + + + + + + + + + + + RawAudioData + + + + + + + - + + + currentlyAccessing + + + : + + + int + + + + + + + + + + + isAccessed + + + ( + + + ) + + + : + + + boolean + + + + + + + MetaData + + + + + + + + + + + + + + + UniqueId + + + + + + + + + + + + + + + + + + + + Contains + + + + + + + + + + + + Is described by + + + + + + + + + + + + Is identified by + + + + + + + SearchCriteria + + + + + + + + + + + + + + + Audio player + + + + + + + + + + + + + + + Storage maintainer + + + + + + + + + + + + + + + + + + + + Manages + + + + + + + + + + + + Is authenticated by + + + + + + + + + + + + Is authenticated by + + + + + + + + + + + + Accesses + + + + + + + + + + + + Searches in + + + + + + + + + + + + Searches by + + + diff --git a/livesupport/doc/model/LocalStorage/Deleteaudioclip_SequenceDiagram.svg b/livesupport/doc/model/LocalStorage/Deleteaudioclip_SequenceDiagram.svg new file mode 100644 index 000000000..a959af855 --- /dev/null +++ b/livesupport/doc/model/LocalStorage/Deleteaudioclip_SequenceDiagram.svg @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + storage maintainer + + + + : + + + + Storage maintainer + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + deleteAudioClip + + + ( + + + audioClipId + + + ) + + + diff --git a/livesupport/doc/model/LocalStorage/EssentialUseCases.svg b/livesupport/doc/model/LocalStorage/EssentialUseCases.svg new file mode 100644 index 000000000..d7b96602b --- /dev/null +++ b/livesupport/doc/model/LocalStorage/EssentialUseCases.svg @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Local storage + + + + + + + + + UC-1 Store or update + Audio clip + + + + + + + UC-2 Delete Audio clip + + + + + + + UC-3 Update Audio clip + metadata + + + + + + + UC-4 Access raw audio data + + + + + + + UC-5 Search in metadata + + + + + + + Storage maintainer + + + + + + + Audio player + + + + + + + + + + + + + + + + + + diff --git a/livesupport/doc/model/LocalStorage/Searchinmetadata_SequenceDiagram.svg b/livesupport/doc/model/LocalStorage/Searchinmetadata_SequenceDiagram.svg new file mode 100644 index 000000000..787e602c0 --- /dev/null +++ b/livesupport/doc/model/LocalStorage/Searchinmetadata_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + storage maintainer + + + + : + + + + Storage maintainer + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authId + + + ) + + + + + + + + + + + : + + + matchingUniqueIds + + + := + + + searchMetadata + + + ( + + + criteria + + + ) + + + diff --git a/livesupport/doc/model/LocalStorage/Storeorupdateaudioclip_SequenceDiagram.svg b/livesupport/doc/model/LocalStorage/Storeorupdateaudioclip_SequenceDiagram.svg new file mode 100644 index 000000000..f83d68b99 --- /dev/null +++ b/livesupport/doc/model/LocalStorage/Storeorupdateaudioclip_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + storage maintainer + + + + : + + + + Storage maintainer + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/livesupport/doc/model/LocalStorage/Systembehaviour.svg b/livesupport/doc/model/LocalStorage/Systembehaviour.svg new file mode 100644 index 000000000..6254fefa9 --- /dev/null +++ b/livesupport/doc/model/LocalStorage/Systembehaviour.svg @@ -0,0 +1,553 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Local storage + + + + + + + + + + + + + + + authenticate + + + ( + + + authenticationInfo + + + : + + + AuthenticationInfo + + + ) + + + : + + + boolean + + + + + + + existsAudioClip + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + boolean + + + + + + + storeAudioClip + + + ( + + + audioClip + + + : + + + AudioClip + + + ) + + + : + + + UniqueId + + + + + + + deleteAudioClip + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + void + + + + + + + updateAudioClipMetadata + + + ( + + + audioClipId + + + : + + + UniqueId + + + , + + + newMetadata + + + : + + + MetaData + + + ) + + + : + + + void + + + + + + + accessRawAudioData + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + RawAudioData + + + + + + + releaseRawAudioData + + + ( + + + rawAudioData + + + : + + + RawAudioData + + + ) + + + : + + + void + + + + + + + searchMetadata + + + ( + + + criteria + + + : + + + SearchCriteria + + + ) + + + : + + + UniqueId + + + + + + + getAudioClip + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + AudioClip + + + diff --git a/livesupport/doc/model/LocalStorage/UpdateAudioclipmetadata_SequenceDiagram.svg b/livesupport/doc/model/LocalStorage/UpdateAudioclipmetadata_SequenceDiagram.svg new file mode 100644 index 000000000..9e1e07c15 --- /dev/null +++ b/livesupport/doc/model/LocalStorage/UpdateAudioclipmetadata_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Local storage + + + + + + + + + + + + + + storage maintainer + + + + : + + + + Storage maintainer + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + updateAudioClipMetadata + + + ( + + + audioClipId + + + , + + + newMetadata + + + ) + + + diff --git a/livesupport/doc/model/LocalStorage/index.html b/livesupport/doc/model/LocalStorage/index.html new file mode 100644 index 000000000..8c7f9e79d --- /dev/null +++ b/livesupport/doc/model/LocalStorage/index.html @@ -0,0 +1,1908 @@ + + + + + LiveSupport Local storage specification + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author: maroy $
  • +
  • Version: $Revision: 1.1 $
  • +
  • Location: $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/doc/model/LocalStorage/index.html,v $
  • +
+

Scope

+This document contains the specification of the LiveSupport Local +storage component.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Requirements

+

Overview
+

+The purpose of the Local storage component is to store Audio Clips +locally.
+

Goals

+The goal of the local storage system is to store Audio Clips locally. +Audio Clips contain audio data bundled with metadata describing it. +Storing locally means that the binary audio data is available not just +as a stream, but also as random seekable file.
+

System functions

+The main system functions are described below. There are three +categories for these functions:
+ + + + + + + + + + + + + + + + + + + +
function category
+
meaning
+
evident
+
Should perform, and the user should be cognizant +that it is performed
+
hidden
+
Should perform, but not visible to the users.
+
frill
+
Optional
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
category
+
F1.1
+
Store audio clips
+
evident
+
F1.2
+
Provide seekable access to audio data
+
evident
+
F1.3
+
Delete stored clips
+
evident
+
F1.4
+
Update stored clips
+
evident
+
F1.5
+
Search Audio clips by querying metadata
+
evident
+

+

+

+
+
+

System attributes

+Generic attributes
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
attribute
+
details and constraints
+
category
+
A1.1
+
operating system platform
+
Linux
+
must
+
A1.2
+
local interface
+
locally callable API
+
must
+
A1.4
+
supported audio formats
+
Ogg Vorbis, MP3, wav
+
must
+
A1.5
+
file system level interface
+
adding, updated and delete from the local +storage can be done by moving files within the file system by legacy +tools
+
frill
+
A1.6
+
uniquely identifiable Audio clips
+
all audio clips should be uniquely identifiable, +even when moved among Local storage systems
+
must
+

+

+

+

+
+
+Attributes related to system functions
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
ref#
+
attribute
+
details and constraints
+
category
+
F1.2
+
Provide seekable access to audio data
+
A1.3
+
provide file handle
+
provide randomly seekable file level access to +raw +audio data
+
must
+

+

+

+

+

+

+
+
+

Essential use cases

+This section lists generic (essential) uses cases, that do not contain +architecture-specific considerations.
+
+ +

UC-1 Store or update Audio clip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-1
use case Store or update Audio clip
+
type primary, essential
actors Storage maintainer
purpose To store a new Audio clip in the local storage, +or update (replace) an already stored Audio clip
+
overview The Storage maintainer contacts the Local +storage with the aim +of uploading and storing a new Audio Clip. If the uploaded Audio clip +is already stored in Local storage (with respect of having the same +unique id), the stored one is replaced with the uploaded one.
+
references F1.1, F1.4, A1.6
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Storage maintainer connects to the Local storage +with the +intention of storing an Audio clip
+

+

+
2. The Storage maintainer provides authentication +information 3. The system authenticates the Storage maintainer +and grants +access.
+
4.
+
The Storage maintainer presents the new Audio +clip data, +including raw audio data and metadata
+
5.
+
The system verifies the received data
+

+

+
6.1
+
If the presented Audio clip does not contain a +unique id, one is generated.
+

+

+
6.2
+
If the presented Audio clip contains a unique +id, and there already is an Audio clip stored with the same id, the +stored one is replaced with the uploaded Audio clip.
+

+

+
7.
+
The system stores the received Audio clip and +notifies the Storage maintainer of the actions taken and the unique id +of the stored clip.
+
8.
+
The Storage maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Storage maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 6.2: if the raw audio data of the Audio clip is +currently +being accessed (see UC-4), it can not be deleted. the user is notified +and the use case ends.
  • +
+
+

UC-2 Delete Audio clip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-2
use case Delete Audio clip
+
type primary, essential
actors Storage maintainer
purpose To delete an existing Audio clip in the local +storage
+
overview The Storage maintainer contacts the Local +storage with the aim +of deleting an existing Audio Clip
+
references F1.3
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Storage maintainer connects to the Local storage +with the +intention of deleting an Audio clip
+

+

+
2. The Storage maintainer provides authentication +information 3. The system authenticates the Storage maintainer +and grants +access.
+
4.
+
The Storage maintainer presents the unique id of +an Audio clip stored in Local storage for deletion
+
5.
+
The system deletes the Audio clip corresponding +to the presented unique id.
+
6.
+
The Storage maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Storage maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if no Audio clip is stored with the presented +id, the Storage maintainer is notified. the use case ends.
  • +
  • action 5: if the raw audio data of the Audio clip is +currently being accessed (see UC-4), it can not be deleted. the user is +notified and the use case ends.
    +
  • +
+
+

UC-3 Update Audio clip metadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-3
use case Update Audio clip metadata
+
type primary, essential
actors Storage maintainer
purpose To update the metadata of an Audio clip, without +uploading raw audio data again.
+
overview The Storage maintainer contacts the Local +storage with the aim +of updating the metadata for an already stored Audio clip
+
references F1.4
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Storage maintainer connects to the Local storage +with the +intention of updating the metadata for an Audio clip
+

+

+
2. The Storage maintainer provides authentication +information 3. The system authenticates the Storage maintainer +and grants +access.
+
4.
+
The Storage maintainer presents the unique id of +an Audio clip stored in Local storage and the new metadata for that +Audio clip
+
5.
+
The system verifies the clip id and the metadata
+

+

+
6.
+
The system replaces the metadata of the Audio +clip with the presented one
+
7.
+
The Storage maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Storage maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if no Audio clip is stored with the presented +id, the Storage maintainer is notified. the use case ends.
    +
  • +
+
+

UC-4 Access raw audio data
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-4
use case Access raw audio data
+
type primary, essential
actors Audio player
+
purpose To access raw audio of Audio clips stored in the +Local storage.
+
overview The Audio player accesses the raw audio data +with the ability of randomly seeking in it.
+
references F1.2, A1.3
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Audio player connects to the Local storage with +the +intention of accessing raw audio data
+

+

+
2. The Audio player provides authentication +information 3. The system authenticates the Audio player and +grants +access.
+
4.
+
The Audio player presents the unique id of an +Audio clip stored in Local storage that he wants to access
+
5.
+
The systems looks up the Audio clip, and +provides a seekable handle to the Audio player
+
6.
+
The Audio player accesses the raw audio data, +including seeking in it.
+

+

+
7.
+
The Audio player closes it's access and +disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Audio player can not be authenticated, he +is notified, and the use case ends.
  • +
  • action 5: if no Audio clip is stored with the presented +id, the Audio player is notified. the use case ends.
  • +
+
+

UC-5 Search in metadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-5
use case Search in metadata
+
type primary, essential
actors Storage maintainer
+
purpose To search in the metadata of audio clips
+
overview The Storage maintainer searches through the +stored Audio clips by specifying search criteria for the metadata of +the clips
+
references F1.5
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Storage maintainer connects to the Local storage +with the +intention of searching.
+

+

+
2. The Storage maintainer provides authentication +information 3. The system authenticates the Storage maintainer +and grants +access.
+

+

+
4.
+
The system provides a way of specifying search +criteria with respect to the existing metadata structures
+
5.
+
The Storage maintainer specifies a search +criteria
+
6.
+
The system searches through the metadata of +contained Audio clips, and presents a list of matches
+
7.
+
The Storage maintainer refines his search and +searches again
+
8.
+
The system does a new search according to the +refined criteria, and presents the results to the Storage maintainer
+
9.
+
The storage maintainer reviews the results
+

+

+
10.
+
The storage maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Storage maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
+

+

+
+

Conceptual model

+The following figure displays the semantic concepts identified for the +Scheduler daemon, and the main associations between the concepts.
+
+ +
+

Concepts

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
concept
+
description
+
Authentication
+
Component responsible for doing the +authentications
+
Unique Id
+
A globally unique identifier used to to +differentiate between objects that might even be created on different +systems. Even though the whole space of Id is not known, the Ids must +be unique.
+
MetaData
+
Data about the AudioClip
+
SearchCriteria
+
Describes the search parameters when doing a +search on the MetaData
+
AudioClip
+
The basic unit of audio handled by Local storage
+
RawAudioData
+
The binary audio data contained in an Audio clip
+
Storage maintainer
+
The actor that maintains the contents of the +Local storage
+
Audio player
+
The actor that accesses the raw audio contained +in the Local storage
+

+

+
+
+

Associations

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
source
+
association
+
target
+
description
+
AudioClip
+
Is identified by
+
UniqueId
+
This is a globally unique id for each Audio clip
+
AudioClip
+
Is described by
+
MetaData
+

+
AudioClip
+
Contains
+
RawAudioData
+

+
Storage maintainer
+
Is Authenticated by
+
Authentication
+

+
Storage maintainer
+
Searches in
+
MetaData
+

+
Storage maintainer
+
Searches by
+
SearchCriteria
+
The storage maintainer specifies such a +SearchCriteria when doing a search on MetaData
+
Storage maintainer
+
Manages
+
AudioClip
+
This includes uploading, updating and deleting +AudioClips
+
Audio player
+
Is Authenticated by
+
Authentication
+

+
Audio player
+
Accesses
+
RawAudioData
+
This is a seekable access to raw audio data.
+

+

+

+

+
+
+

System behavior

+The behavior of the system as a whole as experienced from the outside +is discussed in this section.
+

System sequence diagrams

+System diagrams are presented for each use case below.
+

UC-1 Store or update Audio clip

+ +
+

UC-2 Delete Audio clip

+ +
+

UC-3 Update Audio clip metadata

+ +
+

UC-4 Access raw audio data

+ +
+

UC-5 Search in metadata

+ +

System objects

+The following figure shows the system objects and their functions, as +derived from the system sequence diagrams.
+ +

Contracts

+For all operations exposed in the system sequence diagrams, the +following contracts are defined.
+

Contract for Local storage : authenticate

+see Authentication : Authenticate
+

Contract for Local storage : existsAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
existsAudioClip
+(audioClipId : UniqueId)
+: boolean
+
Responsibilities
+
Check if an Audio clip +with the specified id is stored in local storage
+
Type
+
system
+
Cross-reference
+
none
+
Notes
+
none
+
Exceptions
+
none
Output
+
true if an Audio clip +with the specified id is stored in Local storage, false otherwise
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Local storage : storeAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
storeAudioClip
+(audioClip : AudioClip)
+: UniqueId
+
Responsibilities
+
Store a new audio clip +or replace an existing one.
+
Type
+
system
+
Cross-reference
+
UC-1
+
Notes
+
none
+
Exceptions
+
if this is an AudioClip +update, and the RawAudioData of the already existing AudioClip is is +being accessed (see UC-4), report as an error.
+
Output
+
the unique id of the +stored audio clip
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+
if this is a new audio clip:an AudioClip object is createdinstance creation
+

+
a UniqueId is generated for the new clip
+
instance creation
+

+
the UniqueId is associated with the AudioClip
+
association formed
+

+
a MetaData object is created and filled with the +presented contents
+
instance creation
+

+
the MetaData is associated with the AudioClip
+
association formed
+

+
a RawAudioData object is created and filled with +the presented contents
+
instance creation
+

+
the RawAudioData is associated with the AudioClip
+
association formed
+
if the clip already existed:
+
the contents of MetaData for the AudioClip are +replaced by the presented contents
+
attribute modification
+

+
the contents of RawAudioData for the AudioClip +are replaced by the presented contents
+
attribute modification
+

+

+

+
+
+

Contract for Local storage : deleteAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
deleteAudioClip
+(audioClipId : UniqueId)
+: void
+
Responsibilities
+
Delete an existing Audio +clip
+
Type
+
system
+
Cross-reference
+
UC-2
+
Notes
+
none
+
Exceptions
+
if no Audio clip with +the specified id exists, report as an error.
+if the RawAudioData for AudioClip is being accessed (see UC-4), report +as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the UniqueId for the AudioClip is deleted
+
instance deletion
+

+
the MetaData for the AudioClip is deleted
+
instance deletion
+

+
the RawAudioData for the AudioClip is deleted
+
instance deletion
+

+
the AudioClip is deleted
+
instance deletion
+

+

+

+
+
+

Contract for Local storage : updateAudioClipMetadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateAudioClipMetadata
+(audioClipId : UniqueId,
+newMetadata : MetaData)
+: void
+
Responsibilities
+
Update the metadata of +an Audio clip stored in Local storage
+
Type
+
system
+
Cross-reference
+
UC-3
+
Notes
+
none
+
Exceptions
+
if no Audio clip with +the specified id exists, report as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the contents of MetaData for the AudioClip are +replaced with the presented contents
+
attribute modification
+

+

+

+
+
+

Contract for Local storage : accessRawAudioData
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
accessRawAudioData
+(audioClipId : UniqueId)
+: RawAudioData
+
Responsibilities
+
Get access to raw audio +data of an AudioClip
+
Type
+
system
+
Cross-reference
+
UC-4
+
Notes
+
none
+
Exceptions
+
if no Audio clip with +the specified id exists, report as an error.
+
Output
+
the RawAudioData for the +AudioClip identified with the supplied UniqueId
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the currentlyAccessing attribute for +RawAudioData for AudioClip is increased by one
+
attribute modification
+

+

+

+
+
+

Contract for Local storage : releaseRawAudioData
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
releaseRawAudioData
+(rawAudioData : RawAudioData)
+: void
+
Responsibilities
+
Release access for raw +audio data
+
Type
+
system
+
Cross-reference
+
UC-4
+
Notes
+
none
+
Exceptions
+
if the specified +RrawAudioData is not stored in Local storage, indicate as an error
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the currentlyAccessing attribute for +RawAudioData for AudioClip is decreased by one
+
attribute modification
+

+

+

+
+
+

Contract for Local storage : searchMetadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
searchMetadata
+(criteria : SearchCriteria)
+: UniqueId
+
Responsibilities
+
Search through the +metadata of stored AudioClips, and return all matching clip ids
+
Type
+
system
+
Cross-reference
+
UC-5
+
Notes
+
none
+
Exceptions
+
none
+
Output
+
A range of Audio clip +ids, for which MetaData matches the supplied search criteria
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Local storage : getAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
getAudioClip
+(audioClipId : UniqueId)
+: AudioClip
+
Responsibilities
+
Return the contents of +an Audio clip.
+
Type
+
system
+
Cross-reference
+
see Playlist editor
+
Notes
+
none
+
Exceptions
+
if no Audio clip by the +specified id exists, report as an error.
+
Output
+
The Audio clip, +specified by the supplied id.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+
+ + diff --git a/livesupport/doc/model/MediaArchive/Concepts.svg b/livesupport/doc/model/MediaArchive/Concepts.svg new file mode 100644 index 000000000..ecdc23162 --- /dev/null +++ b/livesupport/doc/model/MediaArchive/Concepts.svg @@ -0,0 +1,476 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + << + + + component + + + >> + + + Media archive + + + + + + + Authentication + + + + + + + + + + + + + + + AudioClip + + + + + + + - + + + id + + + : + + + UniqueId + + + - + + + duration + + + : + + + Time + + + + + + + + + + + MetaData + + + + + + + + + + + + + + + SearchCriteria + + + + + + + + + + + + + + + RawAudioData + + + + + + + + + + + + + + + + + + + + Is described by + + + + + + + + + + + + Contains + + + + + + + UniqueId + + + + + + + + + + + + + + + + + + + + Is identified by + + + + + + + Archive maintainer + + + + + + + + + + + + + + + Archive client + + + + + + + + + + + + + + + + + + + + Is authenticated by + + + + + + + + + + + + Is authenticated by + + + + + + + + + + + + Searches in + + + + + + + + + + + + Searches by + + + + + + + + + + + + Downloads + + + + + + + + + + + + Manages + + + diff --git a/livesupport/doc/model/MediaArchive/DeleteAudioclip_SequenceDiagram.svg b/livesupport/doc/model/MediaArchive/DeleteAudioclip_SequenceDiagram.svg new file mode 100644 index 000000000..cb21fd1aa --- /dev/null +++ b/livesupport/doc/model/MediaArchive/DeleteAudioclip_SequenceDiagram.svg @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + archive maintainer + + + + : + + + + Archive maintainer + + + + + + + + + + system + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + deleteAudioClip + + + ( + + + audioClipId + + + ) + + + diff --git a/livesupport/doc/model/MediaArchive/Downloadrawaudiodata_SequenceDiagram.svg b/livesupport/doc/model/MediaArchive/Downloadrawaudiodata_SequenceDiagram.svg new file mode 100644 index 000000000..f5009664d --- /dev/null +++ b/livesupport/doc/model/MediaArchive/Downloadrawaudiodata_SequenceDiagram.svg @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Media archive + + + + + + + + + + + + + + archive client + + + + : + + + + Archive client + + + + + + + + + + + + : + + + authneticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + rawAudioData + + + := + + + downloadAudioData + + + ( + + + audioClipId + + + , + + + offset + + + ) + + + diff --git a/livesupport/doc/model/MediaArchive/EssentialUseCases.svg b/livesupport/doc/model/MediaArchive/EssentialUseCases.svg new file mode 100644 index 000000000..fd67a1ed1 --- /dev/null +++ b/livesupport/doc/model/MediaArchive/EssentialUseCases.svg @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Archive maintainer + + + + + + + LiveSupport Media archive + + + + + + + + + UC-3 Update Audio + clip metadata + + + + + + + UC-5 Search in metadata + + + + + + + UC-2 Delete Audio clip + + + + + + + UC-4 Download raw + audio data + + + + + + + UC-1 Store or update + Audio clip + + + + + + + + + + + + + + + + Archive client + + + + + + + + + diff --git a/livesupport/doc/model/MediaArchive/Searchinmetadata_SequenceDiagram.svg b/livesupport/doc/model/MediaArchive/Searchinmetadata_SequenceDiagram.svg new file mode 100644 index 000000000..3b2e45569 --- /dev/null +++ b/livesupport/doc/model/MediaArchive/Searchinmetadata_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Media archive + + + + + + + + + + + + + + archive client + + + + : + + + + Archive client + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipIds + + + := + + + searchMetadata + + + ( + + + criteria + + + ) + + + diff --git a/livesupport/doc/model/MediaArchive/StoreorupdateAudioclip_SequenceDiagram.svg b/livesupport/doc/model/MediaArchive/StoreorupdateAudioclip_SequenceDiagram.svg new file mode 100644 index 000000000..ac0c96dc5 --- /dev/null +++ b/livesupport/doc/model/MediaArchive/StoreorupdateAudioclip_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + archive maintainer + + + + : + + + + Archive maintainer + + + + + + + + + + system + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authId + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/livesupport/doc/model/MediaArchive/Systembehaviour.svg b/livesupport/doc/model/MediaArchive/Systembehaviour.svg new file mode 100644 index 000000000..97cf502bb --- /dev/null +++ b/livesupport/doc/model/MediaArchive/Systembehaviour.svg @@ -0,0 +1,469 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Media archive + + + + + + + + + + + + + + + authenticate + + + ( + + + authenticationInfo + + + : + + + AuthenticationInfo + + + ) + + + : + + + boolean + + + + + + + retrieveAudioClip + + + ( + + + audioClipId + + + : + + + + + + ) + + + : + + + + + + + + + + storeAudioClip + + + ( + + + audioClip + + + : + + + AudioClip + + + ) + + + : + + + UniqueId + + + + + + + deleteAudioClip + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + void + + + + + + + updateAudioClipMetadata + + + ( + + + audioClipId + + + : + + + UniqueId + + + , + + + newMetadata + + + : + + + MetaData + + + ) + + + : + + + void + + + + + + + downloadAudioData + + + ( + + + audioClipId + + + : + + + UniqueId + + + , + + + offset + + + : + + + int + + + ) + + + : + + + RawAudioData + + + + + + + searchMetadata + + + ( + + + criteria + + + : + + + SearchCriteria + + + ) + + + : + + + UniqueId + + + diff --git a/livesupport/doc/model/MediaArchive/UpdateAudioclipmetadata_SequenceDiagram.svg b/livesupport/doc/model/MediaArchive/UpdateAudioclipmetadata_SequenceDiagram.svg new file mode 100644 index 000000000..6b07cb22c --- /dev/null +++ b/livesupport/doc/model/MediaArchive/UpdateAudioclipmetadata_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Media archive + + + + + + + + + + + + + + archive maintainer + + + + : + + + + Archive maintainer + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + AuthInfo + + + ) + + + + + + + + + + + : + + + updateAudioClipMetadata + + + ( + + + audioClipId + + + , + + + newMetadata + + + ) + + + diff --git a/livesupport/doc/model/MediaArchive/index.html b/livesupport/doc/model/MediaArchive/index.html new file mode 100644 index 000000000..7dda615e3 --- /dev/null +++ b/livesupport/doc/model/MediaArchive/index.html @@ -0,0 +1,1678 @@ + + + + + LiveSupport Media archive specification + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author: maroy $
  • +
  • Version: $Revision: 1.1 $
  • +
  • Location: $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/doc/model/MediaArchive/index.html,v $
  • +
+

Scope

+This document contains the specification of the LiveSupport Media +archive component.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Requirements

+

Overview
+

+The purpose of the Media archive is to store Audio clips with metadata +information, and offer remote access to these clips.
+

Goals

+The goal of the Media storage system is to store Audio Clips and share +them over the network. Another aim is to provide extensive search +possibilities based on the metadata bundled with the audio clips.
+

System functions

+The main system functions are described below. There are three +categories for these functions:
+ + + + + + + + + + + + + + + + + + + +
function category
+
meaning
+
evident
+
Should perform, and the user should be cognizant +that it is performed
+
hidden
+
Should perform, but not visible to the users.
+
frill
+
Optional
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
category
+
F1.1
+
Store audio clips
+
evident
+
F1.2
+
Provide remote access to audio data
+
evident
+
F1.3
+
Delete stored clips
+
evident
+
F1.4
+
Update stored clips
+
evident
+
F1.5
+
Search Audio clips by querying metadata
+
evident
+

+

+

+
+
+

System attributes

+Generic attributes
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
attribute
+
details and constraints
+
category
+
A1.1
+
operating system platform
+
Linux
+
must
+
A1.2
+
remote interface
+
the Media archive is remotely accessible
+
must
+
A1.3
+
supported audio formats
+
Ogg Vorbis, MP3, wav
+
must
+
A1.4
+
uniquely identifiable Audio clips
+
all audio clips should be uniquely identifiable, +even when moved among Media archive systems
+
must
+
A1.6
+
consistent downloads during updates
+
when an audio clip is being updated while also +being downloaded, make sure that the downloads can continue with the +original content
+
frill
+

+

+

+

+
+
+Attributes related to system functions
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
ref#
+
attribute
+
details and constraints
+
category
+
F1.2
+
Provide remote access to audio data A1.5
+
partial downloads
+
provide the possibility of interrupted (partial) +downloads of raw audio data
+
must
+

+

+

+

+

+

+
+
+

Essential use cases

+This section lists generic (essential) uses cases, that do not contain +architecture-specific considerations.
+
+ +

UC-1 Store or update Audio clip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-1
use case Store or update Audio clip
+
type primary, essential
actors Archive maintainer
purpose To store a new Audio clip in the media archive, +or update (replace) an already stored Audio clip
+
overview The Archive maintainer contacts the Media +archive with the aim +of uploading and storing a new Audio Clip. If the uploaded Audio clip +is already stored in Media archive (with respect of having the same +unique id), the stored one is replaced with the uploaded one.
+
references F1.1, F1.4, A1.4
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Archive maintainer connects to the Media archive +with the +intention of storing an Audio clip
+

+

+
2. The Archive maintainer provides authentication +information 3. The system authenticates the Archive maintainer +and grants +access.
+
4.
+
The Archive maintainer presents the new Audio +clip data, +including raw audio data and metadata
+
5.
+
The system verifies the received data
+

+

+
6.1
+
If the presented Audio clip does not contain a +unique id, one is generated.
+

+

+
6.2
+
If the presented Audio clip contains a unique +id, and there already is an Audio clip stored with the same id, the +stored one is replaced with the uploaded Audio clip.
+

+

+
7.
+
The system stores the received Audio clip and +notifies the Archive maintainer of the actions taken and the unique id +of the stored clip.
+
8.
+
The Archive maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Archive maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 6.2: TODO: handle the case of the raw audio data of +the Audio clip is +currently +being downloaded (see UC-4, A1.6)
    +
  • +
+
+

UC-2 Delete Audio clip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-2
use case Delete Audio clip
+
type primary, essential
actors Archive maintainer
purpose To delete an existing Audio clip in the media +archive
+
overview The Archive maintainer contacts the Media +archive with the aim +of deleting an existing Audio Clip
+
references F1.3
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Archive maintainer connects to the Media archive +with the +intention of deleting an Audio clip
+

+

+
2. The Archive maintainer provides authentication +information 3. The system authenticates the Archive maintainer +and grants +access.
+
4.
+
The Archive maintainer presents the unique id of +an Audio clip stored in Media archive for deletion
+
5.
+
The system deletes the Audio clip corresponding +to the presented unique id.
+
6.
+
The Archive maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Archive maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if no Audio clip is stored with the presented +id, the Archive maintainer is notified. the use case ends.
  • +
  • action 5: TODO: handle the case of the raw audio data of +the Audio clip is +currently +being downloaded (see UC-4, A1.6)
    +
  • +
+
+

UC-3 Update Audio clip metadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-3
use case Update Audio clip metadata
+
type primary, essential
actors Archive maintainer
purpose To update the metadata of an Audio clip, without +uploading raw audio data again.
+
overview The Archive maintainer contacts the Media +archive with the aim +of updating the metadata for an already stored Audio clip
+
references F1.4
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Archive maintainer connects to the Media archive +with the +intention of updating the metadata for an Audio clip
+

+

+
2. The Archive maintainer provides authentication +information 3. The system authenticates the Archive maintainer +and grants +access.
+
4.
+
The Archive maintainer presents the unique id of +an Audio clip stored in Media archive and the new metadata for that +Audio clip
+
5.
+
The system verifies the clip id and the metadata
+

+

+
6.
+
The system replaces the metadata of the Audio +clip with the presented one
+
7.
+
The Archive maintainer disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Archive maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if no Audio clip is stored with the presented +id, the Archive maintainer is notified. the use case ends.
    +
  • +
+
+

UC-4 Download raw audio data
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-4
use case Download audio data
+
type primary, essential
actors Archive client
+
purpose To download raw audio data stored in the Media +archive
+
overview The Archive client downloads the raw audio data.
+
references F1.2, A1.3
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Archive client connects to the Media archive +with +the +intention of downloading raw audio data
+

+

+
2. The Archive client provides authentication +information 3. The system authenticates the Archive client and +grants +access.
+
4.
+
The Archive client presents the unique id of an +Audio clip stored in Media archive that he wants to download
+
5.
+
The systems looks up the Audio clip, and starts +to send the raw audio content as a stream
+
6.
+
The Archive client receives the stream of raw +audio data and saves it.
+

+

+
7.
+
The Archive client closes it's access and +disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Archive client can not be authenticated, +he +is notified, and the use case ends.
  • +
  • action 4: the Archive client specifies an offset from +which he wants to start a partial download. the system starts to send +raw audio data from this offset in action 5.
    +
  • +
  • action 5: if no Audio clip is stored with the presented +id, the Archive client is notified. the use case ends.
  • +
+
+

UC-5 Search in metadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-5
use case Search in metadata
+
type primary, essential
actors Archive client
+
purpose To search in the metadata of audio clips
+
overview The Archive client searches through the +stored Audio clips by specifying search criteria for the metadata of +the clips
+
references F1.5
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Archive client connects to the Media archive +with the +intention of searching.
+

+

+
2. The Archive cleint provides authentication +information 3. The system authenticates the Archive client +and grants +access.
+

+

+
4.
+
The system provides a way of specifying search +criteria with respect to the existing metadata structures
+
5.
+
The Archive client specifies a search +criteria
+
6.
+
The system searches through the metadata of +contained Audio clips, and presents a list of matches
+
7.
+
The Archive client refines his search and +searches again
+
8.
+
The system does a new search according to the +refined criteria, and presents the results to the Archive client
+
9.
+
The Archive client reviews the results
+

+

+
10.
+
The Archive client disconnects
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Archive client can not be +authenticated, he is notified, and the use case ends.
  • +
+

+

+
+

Conceptual model

+The following figure displays the semantic concepts identified for the +Scheduler daemon, and the main associations between the concepts.
+
+ +
+

Concepts

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
concept
+
description
+
Authentication
+
Component responsible for doing the +authentications
+
Unique Id
+
A globally unique identifier used to to +differentiate between objects that might even be created on different +systems. Even though the whole space of Id is not known, the Ids must +be unique.
+
MetaData
+
Data about the AudioClip
+
SearchCriteria
+
Describes the search parameters when doing a +search on the MetaData
+
AudioClip
+
The basic unit of audio handled by Media archive
+
RawAudioData
+
The binary audio data contained in an Audio clip
+
Archive maintainer
+
The actor that maintains the contents of the +Media archive
+
Archive client
+
The actor that accesses the data stored in the +Media archive
+

+

+
+
+

Associations

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
source
+
association
+
target
+
description
+
AudioClip
+
Is identified by
+
UniqueId
+
This is a globally unique id for each Audio clip
+
AudioClip
+
Is described by
+
MetaData
+

+
AudioClip
+
Contains
+
RawAudioData
+

+
Archive maintainer
+
Is Authenticated by
+
Authentication
+

+
Archive client
+
Searches in
+
MetaData
+

+
Archive client
+
Searches by
+
SearchCriteria
+
The Archive client specifies such a +SearchCriteria when doing a search on MetaData
+
Archive maintainer
+
Manages
+
AudioClip
+
This includes uploading, updating and deleting +AudioClips
+
Archive client
+
Is Authenticated by
+
Authentication
+

+
Archice client
+
Downloads
+
RawAudioData
+
Download RawAudioData as a binary stream.
+

+

+

+

+
+
+

System behavior

+The behavior of the system as a whole as experienced from the outside +is discussed in this section.
+

System sequence diagrams

+System diagrams are presented for each use case below.
+

UC-1 Store or update Audio clip

+ +
+

UC-2 Delete Audio clip

+ +
+

UC-3 Update Audio clip metadata

+ +
+

UC-4 Download raw audio data

+ +
+

UC-5 Search in metadata

+ +

System objects

+The following figures shows the system objects and their functions, as +derived from the system sequence diagrams.
+ +

Contracts

+For all operations exposed in the system sequence diagrams, the +following contracts are defined.
+

Contract for Media archive : authenticate

+see Authentication : Authenticate
+

Contract for Media archive : storeAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
storeAudioClip
+(audioClip : AudioClip)
+: UniqueId
+
Responsibilities
+
Store a new audio clip +or replace an existing one.
+
Type
+
system
+
Cross-reference
+
UC-1
+
Notes
+
none
+
Exceptions
+
if this is an AudioClip +update, and the RawAudioData of the already existing TODO: handle the +case of the raw audio data of the Audio clip is +currently +being downloaded (see UC-4, A1.6)
Output
+
the unique id of the +stored audio clip
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+
if this is a new audio clip:an AudioClip object is createdinstance creation
+

+
a UniqueId is generated for the new clip
+
instance creation
+

+
the UniqueId is associated with the AudioClip
+
association formed
+

+
a MetaData object is created and filled with the +presented contents
+
instance creation
+

+
the MetaData is associated with the AudioClip
+
association formed
+

+
a RawAudioData object is created and filled with +the presented contents
+
instance creation
+

+
the RawAudioData is associated with the AudioClip
+
association formed
+
if the clip already existed:
+
the contents of MetaData for the AudioClip are +replaced by the presented contents
+
attribute modification
+

+
the contents of RawAudioData for the AudioClip +are replaced by the presented contents
+
attribute modification
+

+

+

+
+
+

Contract for Media archive : deleteAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
deleteAudioClip
+(audioClipId : UniqueId)
+: void
+
Responsibilities
+
Delete an existing Audio +clip
+
Type
+
system
+
Cross-reference
+
UC-2
+
Notes
+
none
+
Exceptions
+
if no Audio clip with +the specified id exists, report as an error.
+TODO: handle the case of the raw audio data of the Audio clip is +currently +being downloaded (see UC-4, A1.6)
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the UniqueId for the AudioClip is deleted
+
instance deletion
+

+
the MetaData for the AudioClip is deleted
+
instance deletion
+

+
the RawAudioData for the AudioClip is deleted
+
instance deletion
+

+
the AudioClip is deleted
+
instance deletion
+

+

+

+
+
+

Contract for Media archive : updateAudioClipMetadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateAudioClipMetadata
+(audioClipId : UniqueId,
+newMetadata : MetaData)
+: void
+
Responsibilities
+
Update the metadata of +an Audio clip stored in Media archive
+
Type
+
system
+
Cross-reference
+
UC-3
+
Notes
+
none
+
Exceptions
+
if no Audio clip with +the specified id exists, report as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
the contents of MetaData for the AudioClip are +replaced with the presented contents
+
attribute modification
+

+

+

+
+
+

Contract for Media archive : accessRawAudioData
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
downloadRawAudioData
+(audioClipId : UniqueId,
+offset : int)
+: RawAudioData
+
Responsibilities
+
Get access to raw audio +data of an AudioClip as a data stream.
+
Type
+
system
+
Cross-reference
+
UC-4
+
Notes
+
none
+
Exceptions
+
if no Audio clip with +the specified id exists, report as an error.
+
Output
+
the RawAudioData as a +stream for the +AudioClip identified with the supplied UniqueId, started at the +specified offset.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Media archive : searchMetadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
searchMetadata
+(criteria : SearchCriteria)
+: UniqueId
+
Responsibilities
+
Search through the +metadata of stored AudioClips, and return all matching clip ids
+
Type
+
system
+
Cross-reference
+
UC-5
+
Notes
+
none
+
Exceptions
+
none
+
Output
+
A range of Audio clip +ids, for which MetaData matches the supplied search criteria
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+
+ + diff --git a/livesupport/doc/model/PlaylistEditor/AddanAudiocliptoLocalstorage_SequenceDiagram.svg b/livesupport/doc/model/PlaylistEditor/AddanAudiocliptoLocalstorage_SequenceDiagram.svg new file mode 100644 index 000000000..473c2a24e --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/AddanAudiocliptoLocalstorage_SequenceDiagram.svg @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + + : + + + retrun audioClipId + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + addAudioClip + + + ( + + + rawAudioData + + + , + + + metaData + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/livesupport/doc/model/PlaylistEditor/AddanAudiocliptoaPlaylist_SequenceDiagram.svg b/livesupport/doc/model/PlaylistEditor/AddanAudiocliptoaPlaylist_SequenceDiagram.svg new file mode 100644 index 000000000..1990d6b18 --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/AddanAudiocliptoaPlaylist_SequenceDiagram.svg @@ -0,0 +1,444 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + media archive + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + addAudioClipToPlaylist + + + ( + + + playlist + + + , + + + audioClipId + + + , + + + offset + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + [if requested] + + + : + + + mirrorAudioClipInLocalStorage + + + ( + + + audioClipId + + + ) + + + + + + + diff --git a/livesupport/doc/model/PlaylistEditor/AddorupdateanAudiocliptoMediaarchive_SequenceDiagram.svg b/livesupport/doc/model/PlaylistEditor/AddorupdateanAudiocliptoMediaarchive_SequenceDiagram.svg new file mode 100644 index 000000000..fd1151849 --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/AddorupdateanAudiocliptoMediaarchive_SequenceDiagram.svg @@ -0,0 +1,488 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + media archive + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + addAudioClipToMediaArchive + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClip + + + := + + + getAudioClip + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/livesupport/doc/model/PlaylistEditor/Concepts.svg b/livesupport/doc/model/PlaylistEditor/Concepts.svg new file mode 100644 index 000000000..159cdea14 --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/Concepts.svg @@ -0,0 +1,1032 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Local storage + + + (from + + + Local storage + + + ) + + + + + + + Scheduler + + + (from + + + Scheduler + + + ) + + + + + + + Media archive + + + (from + + + Media archive + + + ) + + + + + + + Playlist maintainer + + + + + + + + + + + + + + + << + + + component + + + >> + + + Playlist editor + + + + + + + Authentication + + + + + + + + + + + + + + + MetaData + + + + + + + + + + + + + + + SearchCriteria + + + + + + + + + + + + + + + Audio layer + + + + + + + + + + + + + + + FadeInfo + + + + + + + + + + + + + + + Configuration + + + + + + + + + + + + + + + AudioClip + + + + + + + - + + + id + + + : + + + UniqueId + + + - + + + duration + + + : + + + Time + + + + + + + + + + + Playlist player + + + + + + + + + + + + + + + Playlist uploader + + + + + + + + + + + + + + + Clip retriever + + + + + + + Playlist + + + + + + + - + + + duration + + + : + + + Time + + + - + + + lockedForEditing + + + : + + + boolean + + + + + + + + + + + isValid + + + ( + + + ) + + + : + + + boolean + + + + + + + + + + + + Is described by + + + + + + + + + + PlaylistElement + + + + + + + - + + + relativeOffset + + + : + + + Time + + + + + + + + + + + + + + + + + + + Plays + + + + + + + + + + + + Uploads + + + + + + + + + + + + Fades out with + + + + + + + + + + + + * + + + Contains + + + + + + + + + + + + References + + + + + + + + + + + + Is authenticated by + + + + + + + + + + + + Searches by + + + + + + + + + + + + Edits + + + + + + + + + + + + Maintains + + + + + + + + + + + + * + + + Contains + + + + + + + + + + + + * + + + Contains + + + + + + + + + + + + Accesses audio data from + + + + + + + + + + + + Uploads to + + + + + + + + + + + + Retrieves clips from + + + + + + + + + + + + Stores clips in + + + + + + + + + + + + Stores clips in + + + + + + + + + + + + Creates and edits + + + + + + + + + + + + Listens to + + + + + + + + + + + + Fades in with + + + diff --git a/livesupport/doc/model/PlaylistEditor/CreateaPlaylist_SequenceDiagram.svg b/livesupport/doc/model/PlaylistEditor/CreateaPlaylist_SequenceDiagram.svg new file mode 100644 index 000000000..45c0ce55e --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/CreateaPlaylist_SequenceDiagram.svg @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + playlist + + + := + + + createPlaylist + + + ( + + + ) + + + diff --git a/livesupport/doc/model/PlaylistEditor/DeleteanAudioclipfromLocalstorage_SequenceDiagram.svg b/livesupport/doc/model/PlaylistEditor/DeleteanAudioclipfromLocalstorage_SequenceDiagram.svg new file mode 100644 index 000000000..647d9cef2 --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/DeleteanAudioclipfromLocalstorage_SequenceDiagram.svg @@ -0,0 +1,327 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + deleteAudiClipFromLocalStorage + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + deleteAudioClip + + + ( + + + audioClipId + + + ) + + + diff --git a/livesupport/doc/model/PlaylistEditor/EditthetransitionofanAudioclip_SequenceDiagram.svg b/livesupport/doc/model/PlaylistEditor/EditthetransitionofanAudioclip_SequenceDiagram.svg new file mode 100644 index 000000000..d48aabac1 --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/EditthetransitionofanAudioclip_SequenceDiagram.svg @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + updateFadeParameters + + + ( + + + playlistElement + + + , + + + newFadeInInfo + + + , + + + newFadeOutInfo + + + ) + + + diff --git a/livesupport/doc/model/PlaylistEditor/EssentialUseCases.svg b/livesupport/doc/model/PlaylistEditor/EssentialUseCases.svg new file mode 100644 index 000000000..48e5b9567 --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/EssentialUseCases.svg @@ -0,0 +1,344 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Playlist editor + + + + + + + + + UC-1 Create a Playlist + + + + + + + UC-10 Edit the transition + of an Audio clip + + + + + + + UC-12 Upload a Playlist + to a Scheduler daemon + + + + + + + UC-13 Maintain + configuration information + + + + + + + UC-2 Add an Audio clip + to Local storage + + + + + + + UC-3 Delete an Audio clip + from Local storage + + + + + + + UC-4 Update an Audio clip + in Local storage + + + + + + + UC-11 Listen to a Playlist + + + + + + + UC-8 Add an Audio clip + to a Playlist + + + + + + + UC-6 Search for Audio clips + + + + + + + UC-7 Mirror an Audio clip + from a remote Media archive + in Local storage + + + + + + + UC-5 Add or update an Audio clip + to Media archive + + + + + + + UC-9 Move the position + of an Audio clip in a Playlist + + + + + + + Playlist maintainer + + + + + + + Local storage + + + + + + + Media archive + + + + + + + Scheduler + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/livesupport/doc/model/PlaylistEditor/ListentoaPlaylist_SequenceDiagram.svg b/livesupport/doc/model/PlaylistEditor/ListentoaPlaylist_SequenceDiagram.svg new file mode 100644 index 000000000..19e5b45db --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/ListentoaPlaylist_SequenceDiagram.svg @@ -0,0 +1,559 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + playPlaylist + + + ( + + + playlist + + + , + + + 0 + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + rawAudioData + + + := + + + accessRawAudioData + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + playPlaylist + + + ( + + + playlist + + + , + + + seekOffset + + + ) + + + + + + + + + + + : + + + rawAudioData + + + := + + + accessRawAudioData + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + stopPlaying + + + ( + + + ) + + + + + + + + + + + : + + + releaseRawAudioData + + + ( + + + rawAudioData + + + ) + + + diff --git a/livesupport/doc/model/PlaylistEditor/Maintainconfigurationinformation_SequenceDiagram.svg b/livesupport/doc/model/PlaylistEditor/Maintainconfigurationinformation_SequenceDiagram.svg new file mode 100644 index 000000000..f03e85462 --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/Maintainconfigurationinformation_SequenceDiagram.svg @@ -0,0 +1,271 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + addConfiguration + + + ( + + + configuration + + + ) + + + + + + + + + + + : + + + updateConfiguration + + + ( + + + configuration + + + ) + + + + + + + + + + + : + + + deleteConfiguration + + + ( + + + configuration + + + ) + + + diff --git a/livesupport/doc/model/PlaylistEditor/MirroranAudioclipfromaremoteMediaarchiveinLocalstorage_SequenceDiagram.svg b/livesupport/doc/model/PlaylistEditor/MirroranAudioclipfromaremoteMediaarchiveinLocalstorage_SequenceDiagram.svg new file mode 100644 index 000000000..5b0609e73 --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/MirroranAudioclipfromaremoteMediaarchiveinLocalstorage_SequenceDiagram.svg @@ -0,0 +1,488 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + media archive + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + mirrorAudioClipInLocalStorage + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClip + + + := + + + retrieveAudioClip + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/livesupport/doc/model/PlaylistEditor/MovethepositionofanAudioclipinaPlaylist_SequenceDiagram.svg b/livesupport/doc/model/PlaylistEditor/MovethepositionofanAudioclipinaPlaylist_SequenceDiagram.svg new file mode 100644 index 000000000..c8f964c9c --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/MovethepositionofanAudioclipinaPlaylist_SequenceDiagram.svg @@ -0,0 +1,275 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + updateAudioClipPositionInPlaylist + + + ( + + + playlist + + + , + + + playlistElement + + + , + + + newOffset + + + ) + + + + + + + + + + + : + + + moveAudioClipToOtherLayer + + + ( + + + playlist + + + , + + + playlistElement + + + , + + + newLayer + + + ) + + + diff --git a/livesupport/doc/model/PlaylistEditor/SearchforAudioclips_SequenceDiagram.svg b/livesupport/doc/model/PlaylistEditor/SearchforAudioclips_SequenceDiagram.svg new file mode 100644 index 000000000..79bf08cdf --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/SearchforAudioclips_SequenceDiagram.svg @@ -0,0 +1,532 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + media archive + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipIds + + + := + + + searchMetadata + + + ( + + + criteria + + + ) + + + + + + + + + + + : + + + audioClipIds + + + := + + + searchMetadata + + + ( + + + criteria + + + ) + + + + + + + + + + + : + + + audioClipIds + + + := + + + searchMetadata + + + ( + + + criteria + + + ) + + + + + + + : + + + return matching AudioClipIds + + + + + + diff --git a/livesupport/doc/model/PlaylistEditor/Systembehaviour.svg b/livesupport/doc/model/PlaylistEditor/Systembehaviour.svg new file mode 100644 index 000000000..17a9deb0f --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/Systembehaviour.svg @@ -0,0 +1,1291 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Playlist editor + + + + + + + + + + + + + + + authenticate + + + ( + + + authInfo + + + : + + + AuthenticationInfo + + + ) + + + : + + + boolean + + + + + + + createPlaylist + + + ( + + + ) + + + : + + + Playlist + + + + + + + addAudioClip + + + ( + + + rawAudioData + + + : + + + RawAudioData + + + , + + + metaData + + + : + + + MetaData + + + ) + + + : + + + UniqueId + + + + + + + deleteAudiClipFromLocalStorage + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + void + + + + + + + updateAudioClipInLocalStorage + + + ( + + + audioClipId + + + : + + + UniqueId + + + , + + + rawAudioData + + + : + + + RawAudioData + + + , + + + metaData + + + : + + + MetaData + + + ) + + + : + + + void + + + + + + + addAudioClipToMediaArchive + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + void + + + + + + + searchMetadata + + + ( + + + criteria + + + : + + + SearchCriteria + + + ) + + + : + + + UniqueId + + + + + + + mirrorAudioClipInLocalStorage + + + ( + + + audioClipId + + + : + + + UniqueId + + + ) + + + : + + + void + + + + + + + addAudioClipToPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + audioClipId + + + : + + + UniqueId + + + , + + + offset + + + : + + + Time + + + ) + + + : + + + void + + + + + + + updateAudioClipPositionInPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + playlistElement + + + : + + + PlaylistElement + + + , + + + newOffset + + + : + + + Time + + + ) + + + : + + + void + + + + + + + moveAudioClipToOtherLayer + + + ( + + + playlist + + + : + + + Playlist + + + , + + + playlistElement + + + : + + + PlaylistElement + + + , + + + newLayer + + + : + + + Audio layer + + + ) + + + : + + + void + + + + + + + updateFadeParameters + + + ( + + + playlistElement + + + : + + + PlaylistElement + + + , + + + newFadeInInfo + + + : + + + FadeInfo + + + , + + + newFadeOutInfo + + + : + + + FadeInfo + + + ) + + + : + + + void + + + + + + + playPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + offset + + + : + + + Time + + + ) + + + : + + + void + + + + + + + stopPlaying + + + ( + + + ) + + + : + + + void + + + + + + + schedulePlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + schedule + + + : + + + Schedule + + + ) + + + : + + + void + + + + + + + addConfiguration + + + ( + + + configuration + + + : + + + Configuration + + + ) + + + : + + + void + + + + + + + updateConfiguration + + + ( + + + configuration + + + : + + + Configuration + + + ) + + + : + + + void + + + + + + + deleteConfiguration + + + ( + + + configuration + + + : + + + Configuration + + + ) + + + : + + + void + + + diff --git a/livesupport/doc/model/PlaylistEditor/UpdateanAudioclipinLocalstorage_SequenceDiagram.svg b/livesupport/doc/model/PlaylistEditor/UpdateanAudioclipinLocalstorage_SequenceDiagram.svg new file mode 100644 index 000000000..2818a3789 --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/UpdateanAudioclipinLocalstorage_SequenceDiagram.svg @@ -0,0 +1,363 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + local storage + + + + : + + + + Local storage + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + updateAudioClipInLocalStorage + + + ( + + + audioClipId + + + , + + + rawAudioData + + + , + + + metaData + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + audioClipId + + + := + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/livesupport/doc/model/PlaylistEditor/UploadaPlaylisttoaSchedulerdaemon_SequenceDiagram.svg b/livesupport/doc/model/PlaylistEditor/UploadaPlaylisttoaSchedulerdaemon_SequenceDiagram.svg new file mode 100644 index 000000000..040fa803c --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/UploadaPlaylisttoaSchedulerdaemon_SequenceDiagram.svg @@ -0,0 +1,351 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlist Maintainer + + + + : + + + + Playlist maintainer + + + + + + + + + + system + + + + : + + + + Playlist editor + + + + + + + + + + + + + + + + + + scheduler + + + + : + + + + Scheduler + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + schedulePlaylist + + + ( + + + playlist + + + , + + + schedule + + + ) + + + + + + + + + + + : + + + authInfo + + + := + + + authenticate + + + ( + + + authenticated + + + ) + + + + + + + + + + + : + + + uploadPlaylist + + + ( + + + playlist + + + , + + + schedule + + + ) + + + diff --git a/livesupport/doc/model/PlaylistEditor/index.html b/livesupport/doc/model/PlaylistEditor/index.html new file mode 100644 index 000000000..ca838b4e6 --- /dev/null +++ b/livesupport/doc/model/PlaylistEditor/index.html @@ -0,0 +1,4277 @@ + + + + + LiveSupport Playlist editor specification + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author: maroy $
  • +
  • Version: $Revision: 1.1 $
  • +
  • Location: $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/doc/model/PlaylistEditor/index.html,v $
  • +
+

Scope

+This document contains the specification of the LiveSupport Playlist +editor component.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Requirements

+

Overview
+

+The purpose of the Playlist editor component is to provide a user +interface enabling creation, editing and publishing playlists.
+

Goals

+The playlist editor is an easy to use user interface tool. It provides +the possibility to create and edit playlists, made up of a sequence of +audio clips store in Local storage or in a remote Media archive. The +created playlist then can be uploaded to a Scheduler daemon for +execution.
+
+The transition between audio clips can be visually specified though the +user interface. The playlist editor provides an easy to use user +interface to search the audio clips stored in Local storage or a remote +Media archive, based on metadata criteria. The playlist editor provides +the possibility to listen to the whole or any part of the created +playlist.
+

System functions

+The main system functions are described below. There are three +categories for these functions:
+ + + + + + + + + + + + + + + + + + + +
function category
+
meaning
+
evident
+
Should perform, and the user should be cognizant +that it is performed
+
hidden
+
Should perform, but not visible to the users.
+
frill
+
Optional
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
category
+
F1.1
+
Create and edit playlists
+
evident
+
F1.2
+
Access to Local storage
+
hidden
+
F1.3
+
Access to Media archive
+
hidden
+
F1.4
+
Search in Local storage or Media archive
+
evident
+
F1.5
+
Upload playlist to Scheduler daemon
+
evident
+
F1.6
+
Smooth transitions between Audio clips
+
evident
+
F1.7
+
Play back created playlist
+
evident
+
F1.8
+
Maintain configuration information
+
evident
+

+

+

+
+
+

System attributes

+Generic attributes
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
attribute
+
details and constraints
+
category
+
A1.1
+
operating system platform
+
Linux
+
must
+
A1.2
+
easy to use user interface
+
intuitive user interface
+
must
+
A1.3
+
supported audio formats
+
Ogg Vorbis, wav, possibly MP3
+
must
+
A1.4
+
Playlist support for Audio clips from Local +storage Created playlists may include audio sources from +Local storage must
+
A1.5
+
Playlist support for Audio clips from Media +archive
+
Created playlists may include audio sources from +a remote Media archive
+
must
+
A1.6
+
Playlist support for remotely accessible audio +files
+
Created playlists may include remotely +accessible audio sources, e.g. audio files downloadable via HTTP
+
must
+
A1.7
+
Playlist support for audio streams
+
Created playlists may include remotely +accessible audio streams, e.g. icecast or shoutcast streams
+
must
+
A1.12
+
Playlist format
+
SMIL 2.0
+
frill
+
A1.13
+
Standalone GUI application
+
The Playlist editor is a standalone graphical +user interface application
+
must
+
A1.14
+
Supported audio interfaces
+
ALSA (maybe also OSS?)
+
must
+

+

+

+

+
+
+Attributes related to system functions
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
ref#
+
attribute
+
details and constraints
+
category
+
F1.6
+
Smooth transitions between Audio clips
+
A1.8
+
Fade-in / fade-out support
+
Support for fade-in / fade-out as a transitions, +with customizable fade curve
+
must
+
F1.2
+
Access to Local storage
+
A1.9
+
Full access to Local storage
+
The Playlist editor is a user interface to Local +storage, enabling uploading, deletion and updating of Audio clips in +Local storage
+
must
+
F1.3
+
Access to Media archive
+
A1.10
+
Full access to Media archive
+
The Playlist editor is a user interface to Media +archive, enabling +uploading, deletion and updating of Audio clips in Media archive
+
must
+
F1.7
+
Play back created playlist
+
A1.11
+
Complete and partial playback
+
The Playlist editor provides the possibility of +complete playback, and random seeks for the whole of the playlist +duration
+
must
+

+

+

+

+

+

+
+
+

Essential use cases

+This section lists generic (essential) uses cases, that do not contain +architecture-specific considerations.
+
+ +

UC-1 Create a Playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-1
use case Create a Playlist
+
type primary, essential
actors Playlist maintainer
+
purpose To create a new, empty Playlist
+
overview The Playlist maintainer accesses the Playlist +editor application with the purpose of creating a new, empty Playlist.
+
references F1.1
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+
4.
+
The Playlist maintainer creates a new, empty +playlist
+
5.
+
The system creates a new, empty playlist.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
    +
  • +
+
+

UC-2 Add an Audio clip to Local storage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-2
use case Add an Audio clip to Local storage
+
type primary, essential
actors Playlist maintainer, Local storage
+
purpose To add a new Audio clip to local storage.
+
overview The Playlist maintainer accesses the Playlist +editor application with the purpose of adding a new audio file to the +Local storage associated with the Playlist editor.
+
references F1.2, A1.9
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+
4.
+
The Playlist maintainer provides an audio file +and corresponding metadata description.
+
5.
+
The system receives the data, and contacts +Local storage with the purpose of storing it.
+

+

+
6.
+
The system provides authentication information +to Local storage
+
7.
+
The Local storage checks for the provided +authentication information, and grants access.
+
8.
+
The system presents the audio data and metadata +to the Local storage
+
9.
+
The Local storage receives the provided audio +file and metadata, and stores it, returning the unique id for the +newly created Audio clip
+
10.
+
The system receives the new unique id from Local +storage, and presents it to the Playlist maintainer.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 7: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 10: if the system receives an error indication from +the Local storage, it displays the error to the Playlist maintainer, +and the use case ends.
    +
  • +
+
+

UC-3 Delete an Audio clip from Local storage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-3
use case Delete an Audio clip from Local storage
+
type primary, essential
actors Playlist maintainer, Local storage
+
purpose To delete an Audio clip from local storage.
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of deleting an Audio clip stored in Local storage
+
references F1.2, A1.9
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to Local storage
+
5.
+
The Local storage checks for the provided +authentication information, and grants access.
+

+

+
6.
+
The Playlist maintainer selects an Audio clip +from the Local storage through the Playlist manager
+

+

+
7.
+
The Playlist maintainer indicates the selected +Audio clip to be deleted.
+
8.
+
The system contacts Local storage with the +selected Audio clip to be deleted.
+
9.
+
Local storage deletes the specified Audio clip
+
10.
+
The system notifies the Playlist maintainer of +the deletion of the selected Audio clip
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 9: if the Audio clip is being accessed, Local +storage indicates an error. The system presents this error to the +Playlist maintainer, and the use case ends.
    +
  • +
+
+

UC-4 Update an Audio clip in Local storage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-4
use case Update an Audio clip in Local storage
+
type primary, essential
actors Playlist maintainer, Local storage
+
purpose To update an already existing Audio clip in +local storage.
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of replacing the data for an Audio clip in Local storage
+
references F1.2, A1.9
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to Local storage
+
5.
+
The Local storage checks for the provided +authentication information, and grants access.
+

+

+
6.
+
The Playlist maintainer selects an Audio clip +from the Local storage through the Playlist editor.
+

+

+
7.
+
The Playlist maintainer presents the new audio +data and metadata for the selected Audio clip.
+
8.
+
The system receives the audio data and metadata +for the new Audio clip.
+

+

+
9.
+
The system presents the new audio data and +metadata for the specified Audio Clip to Local storage.
+
10.
+
The Local storage updates the specified Audio +clips contents with the presented content, and notifies the system of +this.
+
11.
+
The system notifies the Playlist maintainer of +the changes made.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 10: if the system receives an error indication from +the Local storage, it displays the error to the Playlist maintainer, +and the use case ends.
    +
  • +
+
+

UC-5 Add or update an Audio clip to Media archive
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-5
use case Add or update an Audio clip to Media archive
+
type primary, essential
actors Playlist maintainer, Local storage, Media archive
+
purpose To add or update an Audio clip to Media archive
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of adding or updating an Audio clip already in Local storage to +the remote Media archive
+
references F1.2, F1.3, A1.9, A1.10
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to the Local storage
5.
+
The Local storage checks for the provided +authentication information, and grants access.
+

+
6.
+
The Playlist maintainer selects an Audio clip +from Local storage through the Playlist editor.
+

+

+
7.
+
The Playlist maintainer indicates the selected +Audio clip to be added to the Media archive.
+
8.
+
The system provides authentication information +to the Media archive
9.
+
The Media archive checks for the provided +authentication information, and grants access. 10.
+
The system transfers the Audio clip from Local +storage to the Media archive, adding it to the Media archive
+
11.
+
The Local storage provides the contents of the +requested Audio clip to the system.
+

+

+
12.
+
Media archive receives the Audio clip
+

+
13.1
+
If no Audio clip with the unique id of the +supplied clip exists in Media archive, it is stored as a new Audio +clip. The Media archive notifies the system of the acceptance of the +Audio clip.
+

+

+
13.2
+
If an Audio clip with the unique id of the +supplied clip already exists in +Media archive, its contens are updated with that of the supplied Audio +clip. The Media archive +notifies the system of the acceptance of the Audio clip.
+

+

+

+
14.
+
The system notifies the Playlist maintainer +about the result of adding the Audio clip to the Media archive
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 9: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 11: if the specified Audio clip does not exist, the +Playlist maintainer is notified.
  • +
+
+

UC-6 Search for Audio clips
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-6
use case Search for Audio clips
+
type primary, essential
actors Playlist maintainer, Local storage, Media archive
+
purpose To search for Audio clips by metadata search +criteria in both Local storage and Media archive
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of searching for Audio clips based on some metadata search +criteria. The list if matching Audio clips is presented, both from +Local storage and Media archive.
+
references F1.2, F1.3, F1.4, A1.9, A1.10
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to the Local storage
5.
+
The Local storage checks for the provided +authentication information, and grants access.
+

+

+

+
6.
+
The system provides authentication information +to the Media archive
7.
+
The Media archive checks for the provided +authentication information, and grants access. 8.
+
The system provides an interface to enter search +criteria
+
9.
+
The Playlist maintainer enters a search criteria.
+
10.
+
The system executes a search with the search +criteria on Local storage
+
11.
+
Local storage returns a list of marching Audio +clips.
+
12.
+
If the Media archive is accessible, the system +executes a search on it with the search criteria
+
13.
+
The Media archive returns a list of matching +Audio clips.
+
14.
+
The system displays the list of matching Audio +clips to the Playlist maintainer.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 7: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
+
+

UC-7 Mirror an Audio clip from a remote Media archive in Local +storage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-7
use case Mirror an Audio clip from a remote Media archive +in Local storage
+
type primary, essential
actors Playlist maintainer, Local storage, Media archive
+
purpose To mirror an Audio clip stored in Media archive +in Local storage
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of downloading and mirroring an Audio clip from the Media +archive into Local storage.
+
references F1.1, F1.2, F1.3
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to the Media archive
+
5.
+
The Media archive checks that the provided +authentication information is correct, and grants access.
+
6.
+
The system provides authentication information +to Local storage
+
7.
+
Local storage checks that the provided +authentication information is correct, and grants access.
+

+
8.
+
The Playlist maintainer selects an Audio clip +from the Media archive, via the Playlist editor, for mirroring.
+
9.
+
The system accesses the Media archive, +downloading the requested Audio clip.
+
10.
+
The Media archive presents the requested Audio +clip
+
11.
+
The system stores the downloaded Audio clip in +Local storage
+
12.
+
Local storage stores the Audio clip
+
13.
+
The system notifies the Playlist maintainer of +the success of the operation.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 7: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
+
+

UC-8 Add an Audio clip to a Playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-8
use case Add an Audio clip to a Playlist
+
type primary, essential
actors Playlist maintainer, Local storage, Media archive
+
purpose To add an Audio clip to a Playlist, either from +Local storage or the Media archive
+
overview The Playlist maintainer accesses the Playlist +editor application with the purpose of adding an Audio clip to a +Playlist. The Audio clip may reside in Local storage or a Media archive.
+The details of the added Audio clip are stored locally, even if it's +from a remote Media archive. When adding a remote Audio clip (from +Media archive), the possibility is given to mirror the clip in Local +storage (see UC-7).
+
references F1.1, F1.2, F1.3
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+
4.
+
The Playlist maintainer selects a Playlist.
+

+

+

+

+
5.
+
The system provides authentication information +to Local storage
+
6.
+
Local storage checks that the provided +authentication information is correct, and grants access.7.
+
The system provides authentication information +to the Media archive
8.
+
The Media archive checks that the provided +authentication information is correct, and grants access.
+

+
9.
+
The Playlist maintainer selects an Audio clip, +to be added to the Playlist. The Playlist manager also provides an +offset in the playlist where he wants the Audio clip to be.
+
10.
+
The system adds the selected Audio clip at the +specified offset to the playlist. If this is overlapping with existing +clips on all audio layers, the clip is added to an additional audio +layer.
+

+

+
11.
+
If the added clip is from a remote Media +archive, the Playlist editor is presented with a choice of downloading +it to Local storage.
+
12.
+
The Playlist editor specifies if he wants the +clip to be downloaded to Local storage.
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 6: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
  • action 8: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
+
+

UC-9 Move the position of an Audio clip in a Playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-9
use case Move the position of an Audio clip in a Playlist
+
type primary, essential
actors Playlist maintainer
+
purpose To change the offset of when an Audio clip is +played in a Playlist
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of changing the offset of an Audio clip in a Playlist.
+
references F1.1
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+
4.
+
The Playlist maintainer selects a Playlist.
+

+

+
5.
+
The Playlist maintainer selects an Audio clip in +the Playlist
+

+

+
6.
+
The Playlist maintainer moves the selected Audio +clip to a new offset.
+
7.
+
The system updates the offset information for +the selected Audio clip.
+
8.
+
The Playlist maintainer moves the Audio clip to +another layer.
+
9.
+
The system moves the Audio clip to the new layer.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 9: if the Audio clip is overlapping with other +clips on the new layer, the clip is not moved..
  • +
+
+

UC-10 Edit the transition of an Audio clip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-10
use case Edit the transition of an Audio clip
+
type primary, essential
actors Playlist maintainer
+
purpose To change the fade-in / fade-out of an Audio clip
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of changing the fade-in / fade-out of an Audio clip
+
references F1.1
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+
4.
+
The Playlist maintainer selects a Playlist.
+

+

+
5.
+
The Playlist maintainer selects an Audio clip in +the Playlist
+

+

+
6.
+
The Playlist maintainer edits the fade-in +parameters of the Audio clip
+
7.
+
The system updates the fade-in parameters of the +Audio clip.
+
8.
+
The Playlist maintainer edits the fade-out +parameters of the Audio clip
+
9.
+
The system updated the fade-out parameters of +the Audio clip.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
+
+

UC-11 Listen to a Playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-11
use case Listen to a Playlist
+
type primary, essential
actors Playlist maintainer, Local storage
+
purpose To preview a Playlist
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of listening to a Playlist, to verify that when it is played, +it will have the desired effect.
+
references F1.7, A1.11, A1.14
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to Local storage
+
5.
+
Local storage checks that the provided +authentication information is correct, and grants access.
+

+

+
6.
+
The Playlist maintainer selects a Playlist.
+

+

+
7.
+
The Playlist maintainer starts to play the +Playlist.
+
8.
+
The system looks up the Audio clips to be played +in the immediate future, and accesses them from Local storage.
+
9.1
+
If the requested Audio clip is contained in +Local storage, seekable access to the raw audio data of the requested +Audio clips is provided
+

+

+
9.2
+
If the requested Audio clip is not in Local +storage, the system is notified.
+

+

+

+

+
10.
+
The system plays the raw audio data on the local +audio interface if available, silence otherwise.
+
11.
+
The Playlist maintainer seeks into the Playlist
+
12.
+
The system updates the offset where the audio +clips are to be played from, and continues playing from there.
+
13.
+
The Playlist maintainer ends playing
+
14.
+
The system release access to all accessed Audio +clips from Local storage
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
+
+

UC-12 Upload a Playlist to a Scheduler daemon
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-12
use case Upload a Playlist to a Scheduler daemon
+
type primary, essential
actors Playlist maintainer, Scheduler
+
purpose To publish a Playlist
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of uploading a Playlist to a Scheduler daemon, so that it would +be executed at a specified time.
+
references F1.5
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+

+

+
4.
+
The system provides authentication information +to the Scheduler
+
5.
+
The Scheduler checks that the provided +authentication information is correct, and grants access.
+

+

+
6.
+
The Playlist maintainer selects a Playlist.
+

+

+
7.
+
The Playlist maintainer indicates the selected +Playlist to be uploaded to a Scheduler daemon, to be played at a +specified time.
+
8.
+
The system connects to the Scheduler with the +specified Audio clip and time, and uploads the Playlist.
+
9.
+
The Scheduler receives the playlist, and +schedules it for playing. The system is notified of this.
+
10.
+
The system notifies the Playlist maintainer of +the success of the operation.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
  • action 5: if the system can not be authenticated, the +Playlist maintainer is notified, and the use case ends.
  • +
+
+

UC-13 Maintain configuration information
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-13
use case Maintain configuration information
+
type primary, essential
actors Playlist maintainer
+
purpose To add, update or delete the systems that the +Playlist editor knows about.
+
overview The +Playlist maintainer accesses the Playlist editor application with the +purpose of reviewing and possibly changing the registered system the +Playlist editor connects to. These include Local storage, Media archive +and Scheduler, but also other details, like the local audio interface.
+
references F1.8
+
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist maintainer starts the Playlist editor +application.
+

+

+
2. The Playlist maintainer provides authentication +information 3. The system checks that the provided +authentication information is correct, and grants access.
+
4.
+
The Playlist maintainer selects to to view the +configuration information
+
5.
+
The system displays the configuration +information to the Playlist maintainer
+
6.
+
The Playlist maintainer selects to add a new +registered external system.
+
7.
+
The system verifies the new registry entry, and +adds it to the configuration
+
8.
+
The Playlist maintainer selects to update a +registered external system.
+
9.
+
The system verifies the new values for the +registry entry, and updates the configuration
+
10.
+
The Playlist maintainer deletes a registered +external system.
+
11.
+
The system deletes the external system, if there +remain a minimum required of such system.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: if the Playlist maintainer can not be +authenticated, he is notified, and the use case ends.
  • +
+
+

+

+

+

+

Conceptual model

+The following figure displays the semantic concepts identified for the +Scheduler daemon, and the main associations between the concepts.
+
+ +
+

Concepts

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
concept
+
description
+
Scheduler
+
The Scheduler daemon, executing playlists.
+
Local storage
+
The Local storage, holding Audio clips locally.
+
Media archive
+
The remote Media archive, holding Audio clips +remotely
+
Playlist uploader
+
The component responsible for uploading +Playlists to the Scheduler
+
Playlist player
+
Plays Playlists for preview locally.
+
Clip retriever
+
Responsible for the transfer of Audio clips to +and from Local storage and Media archive
+
Playlist
+
A series of Audio clips, and information on how +they come one after the other.
+
Playlist element
+
A connection object about a specific appearance +of an Audio clip in a Playlist
+
Audio clip
+
The basic unit of audio data handled by the +system.
+
Audio layer
+
An audio layer in the playlist, a sequence of +non-overlapping Audio clips
+
FadeInfo
+
The details of the transition of the specific +instance of the Audio clip on a Playlist. Basically a fade-in and +fade-out info
+
MetaData
+
The metadata associated with an Audio clip
+
SearchCriteria
+
Criteria for searching Metadata
+
Configuration
+
The configuration parameters of the Playlist +editor
+
Authentication
+
Component providing authentication services
+

+

+
+
+

Associations

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
source
+
association
+
target
+
description
+
Playlist uploader
+
Uploads to
+
Scheduler
+
The Playlist uploader uploads Playlists to the +Scheduler
+
Playlist player
+
Accesses audio data from
+
Local storage
+
For playing on the local audio interface
+
Clip retriever
+
Stores clips in
+
Local storage
+

+
Clip retriever
+
Stores clips in
+
Media archive
+

+
Clip retriever
+
Retrievers clips from
+
Media archive
+

+
Local storage
+
Contains
+
Audio clip
+

+
Media archive
+
Contains
+
Audio clip
+

+
Playlist uploader
+
Uploads
+
Playlist
+

+
Playlist player
+
Plays
+
Playlist
+

+
Playlist
+
Contains
+
Audio layer
+

+
Playlist element
+
References
+
Audio layer
+
Shows which layer the given Audio clip is on
+
Playlist element
+
Fades in with
+
FadeInfo
+

+
Playlist element
+
Fades out with
+
FadeInfo
+

+
Audio clip
+
Is described by
+
MetaData
+

+
Playlist maintainer
+
Searches by
+
SearchCriteria
+

+
Playlist maintainerCreates and edits
+
Playlist
+

+
Playlist maintainerListens to
+
Playlist
+

+
Playlist maintainerEdits
+
FadeInfo
+

+
Playlist maintainerMaintains
+
Configuration
+

+
Playlist maintainerIs authenticated by
+
Authentication
+

+

+

+

+

+
+
+

System behavior

+The behavior of the system as a whole as experienced from the outside +is discussed in this section.
+

System sequence diagrams

+System diagrams are presented for each use case below.
+

UC-1 Create a Playlist

+ +
+

UC-2 Add an Audio clip to Local storage

+ +
+

UC-3 Delete an Audio clip from Local storage

+ +
+

UC-4 Update an Audio clip in Local storage

+ +
+

UC-5 Add or update an Audio clip to Media archive

+ +
+

UC-6 Search for Audio clips

+ +
+

UC-7 Mirror an Audio clip from a remote Media archive in Local +storage

+ +
+

UC-8 Add an Audio clip to a Playlist

+ +
+

UC-9 Move the position of an Audio clip in a Playlist

+ +
+

UC-10 Edit the transition of an Audio clip

+ +
+

UC-11 Listen to a Playlist

+ +
+

UC-12 Upload a Playlist to a Scheduler daemon

+ +
+

UC-13 Maintain configuration information

+ +
+

System objects

+The following figures shows the system objects and their functions, as +derived from the system sequence diagrams.
+ +
+
+

Contracts

+For all operations exposed in the system sequence diagrams, the +following contracts are defined.
+

Contract for Playlist editor : authenticate

+See Authentication : authenticate
+

Contract for Playlist editor : createPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
createPlaylist
+()
+: Playlist
+
Responsibilities
+
Create a new, empty +Playlist
+
Type
+
system
+
Cross-reference
+
UC-1
+
Notes
+
none
+
Exceptions
+
none
Output
+
a new, empty Playlist
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
a Playlist is created
+
instance creation
+

+

+

+
+
+

Contract for Playlist editor : addAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
addAudioClip
+(rawAudioData : RawAudioData,
+metaData : MetaData)
+: UniqueId
+
Responsibilities
+
add an Audio Clip to +Local storage through the Playlist editor
+
Type
+
system
+
Cross-reference
+
UC-2
+
Notes
+
All the relevant work is +done in Local storage
+
Exceptions
+
none
Output
+
the unique id of the +added audio clip
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : deleteAudioClipFromLocalStorage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
deleteAudioClipFromLocalStorage
+(audioClipId : UniqueId)
+: void
+
Responsibilities
+
delete an Audio Clip +from Local storage through the Playlist editor
+
Type
+
system
+
Cross-reference
+
UC-3
+
Notes
+
All the relevant work is +done in Local storage
+
Exceptions
+
if no Audio clip exists +in Local storage with the specified id, indicate as an error.
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : updateAudioClipInLocalStorage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateAudioClipInLocalStorage
+(audioClipId : UniqueId,
+rawAudioData : RawAudioData,
+metaData : MetaData)
+: void
+
Responsibilities
+
update the contents of +an Audio Clip in Local storage through the Playlist editor
+
Type
+
system
+
Cross-reference
+
UC-4
+
Notes
+
All the relevant work is +done in Local storage
+
Exceptions
+
if no Audio clip exists +in Local storage with the specified id, indicate as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : addAudioClipToMediaArchive
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
addAudioClipToMediaArchive
+(audioClipId : UniqueId)
+: void
+
Responsibilities
+
add an Audio clip stored +in Local storage to the Media archive
+
Type
+
system
+
Cross-reference
+
UC-5
+
Notes
+
All the relevant work is +done in Local storage and Media archive.
+
Exceptions
+
if no Audio clip exists +in Local storage with the specified id, indicate as an error.
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : searchMetadata
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
searchMetadata
+(criteria : SearchCriteria)
+: audioClipIds
+
Responsibilities
+
to search the Local +storage and remote Media archive accessible through the Playlist editor.
+
Type
+
system
+
Cross-reference
+
UC-6
+
Notes
+
All the relevant work is +done in Local storage and Media archive.
+
Exceptions
+
none
Output
+
a list of Audio clip +ids, which have metadata matching the search criteria.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : mirrorAudioClipInLocalStorage
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
mirrorAudioClipInLocalStorage
+(audioClipId : UniqueId)
+: void
+
Responsibilities
+
to download and store an +Audio clip in Local storage, which is available in the remote Media +archive.
+
Type
+
system
+
Cross-reference
+
UC-7
+
Notes
+
All the relevant work is +done in Local storage and Media archive.
+
Exceptions
+
if no Audio clip exists +in Media archive with the specified id, indicate as an error.
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : addAudioClipToPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
addAudioClipToPlaylist
+(playlist : Playlist,
+audioClipId : UniqueId,
+offset : Time)
+: void
+
Responsibilities
+
to add an Audio clip to +a Playlist, with the specified offset
+
Type
+
system
+
Cross-reference
+
UC-8
+
Notes
+
none
+
Exceptions
+
if no Audio clip exists +in either Local storage or Media archive with the specified id, +indicate as an error.
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
create a new PlaylistElement instance
+
instance creation
+

+
associate the PlaylistElement with the specified +Playlist
+
association formed
+

+
associate the PlaylistElement with the specified +Audio clip
+
association formed
+

+
set the relativeOffset value of PlaylistElement +to the supplied offset
+
attribute modification
+
find an Audio layer in the Playlist in which the +new clip at specified offset does not overlap other clips
+
associate the found Audio layer with the created +PlaylistElement
+
association formed
+
if the Audio clip is overlapping other clips in +all Audio layers in the Playlist
+
create a new Audio layer
+
instance creation
+

+
associate the Audio layer with the Playlist
+
association formed
+

+
associate the Audio layer with the +PlaylistElement
+
association formed
+

+

+

+
+
+

Contract for Playlist editor : updateAudioClipPositionInPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateAudioClipPositionInPlaylist
+(playlist : Playlist,
+playlistElement : PlaylistElement,
+newOffset : Time)
+: void
+
Responsibilities
+
to move an Audio clip +within a playlist to an other offset
+
Type
+
system
+
Cross-reference
+
UC-9
+
Notes
+
none
+
Exceptions
+
if the new position of +the Audio clip in its present Audio layer overlaps with other clips, +indicate as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
set the relativeOffset value of PlaylistElement +to the supplied offset
+
attribute modification
+

+

+

+
+
+

Contract for Playlist editor : moveAudioClipToOtherLayer
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
moveAudioClipToOtherLayer
+(playlist : Playlist,
+playlistElement : PlaylistElement,
+newLayer : Audio layer)
+: void
+
Responsibilities
+
to move an Audio clip +within a playlist to another Audio layer
+
Type
+
system
+
Cross-reference
+
UC-9
+
Notes
+
none
+
Exceptions
+
if the specified Audio +layer is not associated with the specified Playlist, indicate as an +error.
+if the Audio clip overlaps other clips in the new Audio layer, indicate +as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
remove association between the PlaylistElement +and its current Audio layer
+
association broken
+

+
associate PlaylistElement with the supplied +Audio layer
+
association formed
+

+

+

+
+
+

Contract for Playlist editor : updateFadeParameters
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateFadeParameters
+(playlistElement : PlaylistElement,
+newFadeInInfo : fadeInfo,
+newFadeOutInfo : fadeInfo)
+: void
+
Responsibilities
+
to update the fade-in +and fade-out of an Audio clip in a Playlist
+
Type
+
system
+
Cross-reference
+
UC-10
+
Notes
+
none
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
replace the contents of the fadeInInfo +associated with the playlistElement with that of the supplied fadeInInfo
+
attribute modification
+

+
replace the contents of the fadeOutInfo +associated with the playlistElement with that of the supplied +fadeOutInfo attribute modification

+

+

+
+
+

Contract for Playlist editor : playPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
playPlaylist
+(playlist : Playlist,
+offset : Time)
+: void
+
Responsibilities
+
to play a playlist on +the local audio interface
+
Type
+
system
+
Cross-reference
+
UC-11
+
Notes
+
none
+
Exceptions
+
if offset points outside +of playlist, report as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : stopPlaying
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
stopPlaying
+()
+: void
+
Responsibilities
+
to stop playing whatever +is played.
+
Type
+
system
+
Cross-reference
+
UC-11
+
Notes
+
none
+
Exceptions
+
if there is no Playlist +currently playing, indicate as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : schedulePlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
schedulePlaylist
+(playlist : Playlist,
+schedule : Schedule)
+: void
+
Responsibilities
+
to upload a Playlist to +a Scheduler daemon for later execution
+
Type
+
system
+
Cross-reference
+
UC-12
+
Notes
+
All the relevant work is +done in the Scheduler daemon.
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Playlist editor : addConfiguration
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
addConfiguration
+(configuration : Configuration)
+: void
+
Responsibilities
+
to add a new +Configuration item
+
Type
+
system
+
Cross-reference
+
UC-13
+
Notes
+
none
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
create a new Configuration instance
+
instance creation
+

+
fill the created configuration instance with the +supplied information
+
attribute modification
+

+

+

+
+
+

Contract for Playlist editor : updateConfiguration
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateConfiguration
+(configuration : Configuration)
+: void
Responsibilities
+
to update a +Configuration item
+
Type
+
system
+
Cross-reference
+
UC-13
+
Notes
+
none
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
fill the corresponding configuration instance +with the supplied information
+
attribute modification
+

+

+

+
+
+

Contract for Playlist editor : deleteConfiguration
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
deleteConfiguration
+(configuration : Configuration)
+: void
Responsibilities
+
to delete a +Configuration item
+
Type
+
system
+
Cross-reference
+
UC-13
+
Notes
+
none
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
delete the corresponding configuration item
+
instance deletion
+

+

+

+
+
+
+ + diff --git a/livesupport/doc/model/Scheduler/Concepts.svg b/livesupport/doc/model/Scheduler/Concepts.svg new file mode 100644 index 000000000..b6f2b73d7 --- /dev/null +++ b/livesupport/doc/model/Scheduler/Concepts.svg @@ -0,0 +1,1438 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + << + + + component + + + >> + + + Scheduler + + + + + + + Authentication + + + + + + + + + + + + + + + + + + + FadeInfo + + + + + + + + + + + + + + + + + + + AudioClip + + + + + + + + + - + + + id + + + : + + + UniqueId + + + - + + + duration + + + : + + + Time + + + + + + + + + + + + + Media archive + + + (from + + + Media archive + + + ) + + + + + + + + + + Retrieves clips from + + + + + + + + + + * + + + Contains + + + + + + + Broadcast auditor + + + + + + + + + - + + + authenticationInfo + + + : + + + AuthenticationInfo + + + + + + + + + + + + + + + + Browses entries from + + + + + + + + + + Is authentitcated by + + + + + + + Playlist editor + + + + + + + + + - + + + authenticationInfo + + + : + + + AuthenticationInfo + + + + + + + + + + + + + + + + Uploads playlists to + + + + + + + + + + Manages schedule in + + + + + + + + + + Is authenticated by + + + + + + + + + + Requests + + + + + + + Local storage + + + (from + + + Local storage + + + ) + + + + + + + + + + * + + + Contains + + + + + + + + + + Stores clips in + + + + + + + Scheduler daemon + + + + + + + + + + + + + + + + + + + start + + + ( + + + ) + + + : + + + void + + + + + + + stop + + + ( + + + ) + + + : + + + void + + + + + + + isRunning + + + ( + + + ) + + + : + + + boolean + + + + + + + Play log entry + + + + + + + + + - + + + time + + + : + + + TimeStamp + + + + + + + + + + + + + Playlist store + + + + + + + + + + + + + + + + + + + Schedule entry + + + + + + + + + - + + + time + + + : + + + TimeStamp + + + + + + + + + + + + + Playlist + + + + + + + + + - + + + duration + + + : + + + Time + + + - + + + lockedForEditing + + + : + + + boolean + + + + + + + + + + + + + isValid + + + ( + + + ) + + + : + + + boolean + + + + + + + Play log + + + + + + + + + + + + + + + + + + + Play report + + + + + + + + + - + + + from + + + : + + + TimeStamp + + + - + + + to + + + : + + + TimeStamp + + + + + + + + + + + + + Schedule + + + + + + + + + + + + + + + + + + + Clip retriever + + + + + + + + + - + + + authenticationInfo + + + : + + + + + + + + + + + + + + + + * + + + Contains + + + + * + + + + + + + References + + + + + + + + + + Executes + + + + + + + + + + Logs into + + + + + + + + + + References + + + + + + + + + + * + + + Contains + + + + + + + + + + Generates + + + + + + + + + + * + + + Contains + + + + + + + + + + PlaylistElement + + + + + + + + + - + + + relativeOffset + + + : + + + Time + + + + + + + + + + + + + + + + + + + Fades in with + + + + + + + + + + Fades out with + + + + + + + + + + Stores clips in + + + + + + + Administrator + + + + + + + + + + + + + + + + + + + + + + Manages + + + diff --git a/livesupport/doc/model/Scheduler/Createplaylist_SequenceDiagram.svg b/livesupport/doc/model/Scheduler/Createplaylist_SequenceDiagram.svg new file mode 100644 index 000000000..131eba7f2 --- /dev/null +++ b/livesupport/doc/model/Scheduler/Createplaylist_SequenceDiagram.svg @@ -0,0 +1,199 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlistEditor + + + + : + + + + Playlist editor + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + playlist + + + := + + + createPlaylist + + + ( + + + ) + + + + + + + For editing the playlist see UC-7 Edit playlist + + + diff --git a/livesupport/doc/model/Scheduler/Editplaylist_SequenceDiagram.svg b/livesupport/doc/model/Scheduler/Editplaylist_SequenceDiagram.svg new file mode 100644 index 000000000..c22ae16c6 --- /dev/null +++ b/livesupport/doc/model/Scheduler/Editplaylist_SequenceDiagram.svg @@ -0,0 +1,779 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + playlistEditor + + + + : + + + + Playlist editor + + + + + + + + These three constitute + selecting and adding an + audio clip to the playlist, + use case actions 7-12 + + + + + + + Selecting and removing + an aduio clip from the + playlist, actions 13-14 + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + playlists + + + := + + + displayPlaylists + + + ( + + + ) + + + + + + + + + + + : + + + openPlaylistForEditing + + + ( + + + playlist + + + ) + + + + + + + + + + + + + + : + + + addAudioClipToPlaylist + + + ( + + + audioClip + + + , + + + playlist + + + , + + + relativeOffset + + + ) + + + + + + + + + + + : + + + audioClips + + + := + + + displayAudioClips + + + ( + + + ) + + + + + + + + + + + + + + : + + + audioClip + + + := + + + displayAudioClip + + + ( + + + audioClipId + + + ) + + + + + + + + + + + + + + : + + + playlist + + + := + + + displayPlaylist + + + ( + + + playlistId + + + ) + + + + + + + + + + + + + + : + + + removeAudioClipFromPlaylist + + + ( + + + playlist + + + , + + + audioClip + + + ) + + + + + + + + + + + + + + : + + + updateFadeInOut + + + ( + + + playlist + + + , + + + audioClip + + + ) + + + + [save playlist] + + + : + + + playlistValid + + + := + + + validatePlaylist + + + ( + + + playlist + + + ) + + + + + + + + + + + + + + + : + + + savePlaylist + + + ( + + + playlist + + + ) + + + + [revert to old version] + + + : + + + revertEditedPlaylist + + + ( + + + playlist + + + ) + + + + + + + + + + + either + save, or + revert to + the old + version + + + + + + + + + diff --git a/livesupport/doc/model/Scheduler/EssentialUseCases.svg b/livesupport/doc/model/Scheduler/EssentialUseCases.svg new file mode 100644 index 000000000..4ab353d17 --- /dev/null +++ b/livesupport/doc/model/Scheduler/EssentialUseCases.svg @@ -0,0 +1,218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LiveSupport Scheduler + + + + + + + + + + + + + UC-5 Review play log + + + + + + + UC-4 Retrieve remote files + + + + + + + UC-3 Manage playlists + + + + + + + UC-1 Upload playlist + + + + + + + UC-2 Manage schedule + + + + + + + UC-6 Create playlist + + + + + + + UC-7 Edit playlist + + + + + + + UC-8 Start/stop scheduler + + + + + + + Playlist editor + + + + + + + Broadcast auditor + + + + + + + + + + + + + Local storage + + + + + + + + + + + + + + + + + + + + + + Administrator + + + + + + diff --git a/livesupport/doc/model/Scheduler/Manageplaylists_SequenceDiagram.svg b/livesupport/doc/model/Scheduler/Manageplaylists_SequenceDiagram.svg new file mode 100644 index 000000000..5351b1e96 --- /dev/null +++ b/livesupport/doc/model/Scheduler/Manageplaylists_SequenceDiagram.svg @@ -0,0 +1,289 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlistEditor + + + + : + + + + Playlist editor + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + playlists + + + := + + + displayPlaylists + + + ( + + + ) + + + + + + + + + + + : + + + playlist + + + := + + + displayPlaylist + + + ( + + + playlistId + + + ) + + + + + + + + + + + : + + + deletePlaylist + + + ( + + + playlist + + + ) + + + diff --git a/livesupport/doc/model/Scheduler/Manageschedule_SequenceDiagram.svg b/livesupport/doc/model/Scheduler/Manageschedule_SequenceDiagram.svg new file mode 100644 index 000000000..93518cf85 --- /dev/null +++ b/livesupport/doc/model/Scheduler/Manageschedule_SequenceDiagram.svg @@ -0,0 +1,455 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + playlistEditor + + + + : + + + + Playlist editor + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + schedulEntries + + + := + + + displaySchedule + + + ( + + + from + + + , + + + to + + + ) + + + + + + + + + + + : + + + playlist + + + := + + + displayPlaylist + + + ( + + + playlistId + + + ) + + + + + + + + + + + : + + + removeFromSchedule + + + ( + + + scheduleEntry + + + , + + + playlist + + + ) + + + + + + + + + + + : + + + reschedule + + + ( + + + scheduleEntry + + + , + + + playlist + + + , + + + newPlaytime + + + ) + + + + + + + + + + + : + + + scheduleEntries + + + := + + + displaySchedule + + + ( + + + from + + + , + + + to + + + ) + + + diff --git a/livesupport/doc/model/Scheduler/Retrieveremotefiles_SequenceDiagram.svg b/livesupport/doc/model/Scheduler/Retrieveremotefiles_SequenceDiagram.svg new file mode 100644 index 000000000..27649a6cd --- /dev/null +++ b/livesupport/doc/model/Scheduler/Retrieveremotefiles_SequenceDiagram.svg @@ -0,0 +1,388 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + localStorage + + + + : + + + + Local storage + + + + + + + + + + + + + + mediaArchive + + + + : + + + + Media archive + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + clipExists + + + := + + + existsAudioClip + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authId + + + ) + + + + + + + + + + + : + + + audioClip + + + := + + + retrieveAudioClip + + + ( + + + audioClipId + + + ) + + + + + + + + + + + : + + + storeAudioClip + + + ( + + + audioClip + + + ) + + + diff --git a/livesupport/doc/model/Scheduler/Reviewplaylog_SequenceDiagram.svg b/livesupport/doc/model/Scheduler/Reviewplaylog_SequenceDiagram.svg new file mode 100644 index 000000000..f50bc15cc --- /dev/null +++ b/livesupport/doc/model/Scheduler/Reviewplaylog_SequenceDiagram.svg @@ -0,0 +1,257 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + broadcastAuditor + + + + : + + + + Broadcast auditor + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + playLog + + + := + + + displayPlayLog + + + ( + + + ) + + + + + + + + + + + : + + + report + + + := + + + generatePlayReport + + + ( + + + from + + + , + + + to + + + ) + + + diff --git a/livesupport/doc/model/Scheduler/Startstopscheduler_SequenceDiagram.svg b/livesupport/doc/model/Scheduler/Startstopscheduler_SequenceDiagram.svg new file mode 100644 index 000000000..59800118a --- /dev/null +++ b/livesupport/doc/model/Scheduler/Startstopscheduler_SequenceDiagram.svg @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + + + + + + + administrator + + + + : + + + + Administrator + + + + + + + + : + + + start + + + ( + + + ) + + + + + + + + + + + : + + + stop + + + ( + + + ) + + + + + + + + + + + + + + + : + + + isRunning + + + := + + + isRunning + + + ( + + + ) + + + diff --git a/livesupport/doc/model/Scheduler/Systembehaviour.svg b/livesupport/doc/model/Scheduler/Systembehaviour.svg new file mode 100644 index 000000000..7a59ce0d5 --- /dev/null +++ b/livesupport/doc/model/Scheduler/Systembehaviour.svg @@ -0,0 +1,1355 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Scheduler + + + + + + + + + + + + + + + + + + + authenticate + + + ( + + + authenticationInfo + + + : + + + ) + + + : + + + boolean + + + + + + + uploadPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + playtime + + + : + + + Schedule + + + ) + + + : + + + void + + + + + + + displaySchedule + + + ( + + + from + + + : + + + TimeStamp + + + , + + + to + + + : + + + TimeStamp + + + ) + + + : + + + Schedule entry + + + + + + + displayPlaylist + + + ( + + + playlistId + + + : + + + ) + + + : + + + Playlist + + + + + + + deletePlaylist + + + ( + + + playlist + + + : + + + Playlist + + + ) + + + : + + + void + + + + + + + removeFromSchedule + + + ( + + + scheduleEntry + + + : + + + Schedule entry + + + , + + + playlist + + + : + + + Playlist + + + ) + + + : + + + void + + + + + + + reschedule + + + ( + + + scheduleEntry + + + : + + + Schedule entry + + + , + + + playlist + + + : + + + Playlist + + + , + + + playtime + + + : + + + TimeStamp + + + ) + + + : + + + void + + + + + + + displayPlaylists + + + ( + + + ) + + + : + + + Playlist + + + + + + + displayPlayLog + + + ( + + + ) + + + : + + + Play log + + + + + + + generatePlayReport + + + ( + + + from + + + : + + + TimeStamp + + + , + + + to + + + : + + + TimeStamp + + + ) + + + : + + + Play report + + + + + + + createPlaylist + + + ( + + + ) + + + : + + + Playlist + + + + + + + openPlaylistForEditing + + + ( + + + playlist + + + : + + + Playlist + + + ) + + + : + + + void + + + + + + + addAudioClipToPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + audioClip + + + : + + + , + + + relativeOffset + + + : + + + Time + + + ) + + + : + + + void + + + + + + + displayAudioClips + + + ( + + + ) + + + : + + + + + + + displayAudioClip + + + ( + + + audioClipId + + + : + + + ) + + + : + + + + + + + removeAudioClipFromPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + , + + + audioClip + + + : + + + ) + + + : + + + void + + + + + + + updateFadeInOut + + + ( + + + playlist + + + : + + + Playlist + + + , + + + audioClip + + + : + + + ) + + + : + + + void + + + + + + + validatePlaylist + + + ( + + + playlist + + + : + + + Playlist + + + ) + + + : + + + boolean + + + + + + + savePlaylist + + + ( + + + playlist + + + : + + + Playlist + + + ) + + + : + + + void + + + + + + + revertEditedPlaylist + + + ( + + + playlist + + + : + + + Playlist + + + ) + + + : + + + void + + + + + + + start + + + ( + + + ) + + + : + + + void + + + + + + + isRunning + + + ( + + + ) + + + : + + + boolean + + + + + + + stop + + + ( + + + ) + + + : + + + void + + + diff --git a/livesupport/doc/model/Scheduler/Uploadplaylists_SequenceDiagram.svg b/livesupport/doc/model/Scheduler/Uploadplaylists_SequenceDiagram.svg new file mode 100644 index 000000000..de1a57982 --- /dev/null +++ b/livesupport/doc/model/Scheduler/Uploadplaylists_SequenceDiagram.svg @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + playlistEditor + + + + : + + + + Playlist editor + + + + + + + + + + system + + + + : + + + + Scheduler + + + + + + + + + + + + + + + + : + + + authenticated + + + := + + + authenticate + + + ( + + + authInfo + + + ) + + + + + + + + + + + : + + + uploadPlaylist + + + ( + + + playlist + + + , + + + playtime + + + ) + + + diff --git a/livesupport/doc/model/Scheduler/index.html b/livesupport/doc/model/Scheduler/index.html new file mode 100644 index 000000000..503bf61f3 --- /dev/null +++ b/livesupport/doc/model/Scheduler/index.html @@ -0,0 +1,4201 @@ + + + + + LiveSupport Scheduler specifications + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author: maroy $
  • +
  • Version: $Revision: 1.1 $
  • +
  • Location: $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/doc/model/Scheduler/index.html,v $
  • +
+

Scope

+This document contains the specification of the LiveSupport Scheduler +daemon.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Requirements

+

Overview
+

+The purpose of the LiveSupport Scheduler daemon is to execute +playlists.
+

Goals
+

+The scheduler daemon is a remotely accessible service accepting +playlists on a local audio interface. Specific goals include:
+
    +
  • remote manageability
  • +
  • handling remote audio clips referenced by playlists
  • +
  • low-latency playback
  • +
+

System functions

+The main system functions are described below. There are three +categories for these functions:
+ + + + + + + + + + + + + + + + + + + +
function category
+
meaning
+
evident
+
Should perform, and the user should be cognizant +that it is performed
+
hidden
+
Should perform, but not visible to the users.
+
frill
+
Optional
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
category
+
F1.1
+
Accept uploaded playlists
+
evident
+
F1.2
+
Retrieve remote files referenced by playlists
+
hidden
+
F1.3
+
Access local files
+
hidden
+
F1.4
+
Provide status information
+
evident
+
F1.5
+
Log playlist execution for proof of broadcast +reasons
+
evident
+
F1.6
+
Purge local file storage of unused audio clips
+
hidden
+
F1.7
+
Execute playlists
+
evident
+
F1.8
+
Play live streams as part of the playlist
+
hidden
+
F1.9
+
Remove playists from the schedule
+
evident
+
F1.10
+
Re-schedule playlsits
+
evident
+
F1.11
+
Delete playlists
+
evident
+
F1.12
+
Create playlists
+
evident
+
F1.13
+
Edit playlists
+
evident
+
F1.14
+
Start the scheduler daemon
+
evident
+
F1.15
+
Stop the scheduler daemon
+
evident
+

+

+

+
+
+

System attributes

+Generic attributes
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
attribute
+
details and constraints
+
category
+
A1.1
+
operating system platform
+
Linux
+
must
+
A1.2
+
supported audio interfaces
+
ALSA (maybe also OSS?)
+
must
+
A1.3
+
supported playlist format
+
SMIL 2.0. only partial support is required, +which focuses only on audio aspects of SMIL.
+
must
+
A1.4
+
supported audio clip formats
+
Ogg Vorbis, mp3, wav
+
must
+

+

+

+

+
+
+Attributes related to system functions
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
function
+
ref#
+
attribute
+
details and constraints
+
category
+
F1.7
+
Execute playlists
+
A1.5
+
low latency
+
when executing playlists, very low latency +should be achieved
+
must
+

+

+
A1.6
+
handle time skew
+
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.
+
must
+
F1.8
+
Play live streams as part of the playlist A1.7
+
supported audio stream formats
+
Ogg Vorbis via HTTP, mp3 via HTTP
+
must
+
F1.14
+F1.15
+
Start / stop the scheduler daemon
+
A1.8
+
provide System V init style services
+
Provide a System V init interface to starting +and stopping the scheduler daemon
+
must
+

+

+

+

+

+

+
+
+

Essential use cases

+This section lists generic (essential) uses cases, that do not contain +architecture-specific considerations.
+
+ +

UC-1 Upload playlist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-1
use case Upload playlist
type primary, essential
actors Playlist editor
purpose Upload a playlist
overview The Playlist editor uploads a new playlist.
references F1.1
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist editor connects to the scheduler daemon +with the intent of uploading a new playlist.
+

+

+
2. The Playlist editor provides authentication +information 3. The system authenticates the Playlist editor and +grants access.
4. The Playlist editor presents the new playlist +and the intended schedule for the playlist.
+
5. The system validates the new playlist, and sees +that it does not conflict with existing schedule.

+

+
6. The system stores the new playlist, adds it to +the schedule, and sends confirmation to the Playlist editor.
7. The Playlist editor receives confirmation and +disconnects.
+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: the system finds that the user can not be +authenticated. the user is notified and the use case ends.
    +
  • +
  • action 5: the system finds that the uploaded playlist is +invalid, or it conflicts the existing schedule. the user is +notified and the use case ends.
    +
    +
  • +
+

UC-2 Manage schedule
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
UC-2
use case Manage schedule
type
+
primary, essential
actors
+
Playlist editor
purpose
+
View the schedule and remove or re-schedule +playlists
+
overview
+
The Playlist editor reviews the schedule. If he +decides to, he might remove or re-schedule some of these playlists.
references
+
F1.4, F1.9, F1.10
+
+
+

Typical course of events
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist editor connects to the scheduler daemon +with the intent of viewing and editing the schedule.
+

+

+
2. The Playlist editor provides authentication +information 3. The system authenticates the Playlist editor and +grants access.

+

+
4.
+
The system shows the Schedule to the Playlist +editor
+
5.
+
The Playlist editor browses the Schedule, +selects a playlist for detailed viewing.
+
6.
+
The system shows the details of the selected +Playlist.
+
7.
+
The playlist editor removes a playlist from the +schedule.
+
8.
+
The system removes the playlist from the +schedule, than re-displays the updated schedle.
+
9.
+
The Playlist editor re-schedules a playlist
+
10.
+
The system removes the selected playlist from +the schedule, and re-enters it at a new timepoint
+
11.
+
The Playlist editor browses the Schedule
+
12.
+
The system shows the Schedule to the playlist +editor
+
13.
+
The Playlist editor disconnects.
+

+

+
+
+

Alternate courses

+
    +
  • action 3: the system finds that the user can not be +authenticated. the user is notified and the use case ends.
  • +
  • action 8: +the user tries to remove a non-existent playlist from the schedule. the +user is notified, and the schedule is displayed to the user.
  • +
  • action 10: +the new playtime for the schedule conflicts with already scheduled +playlist playtimes. the user is notified, and the schedule is displayed +again
    +
  • +
+

UC-3 Manage playlists
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref#
+
UC-3
use case Manage playlists
type
+
primary, essential
actors
+
Playlist editor
purpose
+
View and delete playlists
overview
+
The Playlist editor reviews the uploaded +playlists. If he decides so, he might delete some of these playlists.
references
+
F1.4, F1.11
+
+
+

Typical course of events
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist editor connects to the scheduler daemon +with the intent of viewing and deleting playlists.
+

+

+
2. The Playlist editor provides authentication +information 3. The system authenticates the Playlist editor and +grants access.

+

+
4.
+
The system lists the available Playlists
+
5.
+
The Playlist editor browses the playlists, and +selects one for detailed viewing.
+
6.
+
The system shows the details of the selected +Playlist.
+
7.
+
The playlist editor deletes a playlist.
+
8.
+
The system deletes the playlist, than +re-displays the list of available Playlists.
+
9.
+
The Playlist editor disconnects.
+

+

+
+
+

Alternate courses

+
    +
  • action 3: the system finds that the user can not be +authenticated. the user is notified and the use case ends.
  • +
  • action 8: +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.
    +
  • +
+

UC-4 Retrieve remote files
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-4
use case Retrieve remote files
type
+
primary, essential
actors
+
(internal actor, initiator), Media archive, +Local storage
+
purpose
+
Retrieve remote files referenced by active +playlists and store them in the local storage
+
overview
+
The +daemon contacts the remote media archive and retrieves audio clips +referenced by active playlists. The clips are stored locally for +playing.
references
+
F1.2
+
+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).
+

Typical course of events

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. An Internal actor triggers the retrieval of some +remote files.
+
2. The system looks up the URN of the remote file, +and determines the Media archive to contact regarding the file.

+

+
3.
+
The system contacts the Local storage and sends +authorization information
+
4.
+
Local storage authenticates the system and +grants access
+
5.
+
The system iniquires the local storage about the +availability of the file to download in the Local storage by presenting +its unique ID
+
6.
+
Local storage tells if the required file is +already stored or not.
+
7.
+
If the file is available in the local storage, +the use case ends. Otherwise, it continues.
+

+

+
8.
+
The system contacts the Media archive and sends +authorization information
9. Media archive authenticates the system and +grants access 10. The system requests an audio clip by presenting +its unique ID
11. Media archive looks up the file, and presents it +to the system 12. The system retrieves the file and closes the +connection to the Media archive
+

+

+
13.
+
The system presents the file to Local storage
+
14.
+
Local storage stores the file under the +specified unique ID
+
15.
+
The system closes the connection to Local +storage.
+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 4: the Local storage finds that the system can not +be authenticated. the system is notified and the use case ends.
  • +
  • action 9: the Media archive finds that the system can not +be authenticated. the system is notified and the use case ends.
  • +
  • action 11: the Media archive does not hold the requested +audio clip. the system is notified and the use case ends.
    +
    +
  • +
+

UC-5 Review play log
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-5
use case Review play log
type secondary, essential
actors Broadcast auditor
purpose Review what has been played
overview 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.
references F1.4
+

Typical course of events
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Broadcast auditor connects to the scheduler +daemon with the intent of reviewing what has been played.
+

+

+
2. The Broadcast auditor provides authentication +information 3. The system authenticates the Broadcast auditor +and grants access.
3.
+
The Broadcast auditor browses through the play +log in a time-ordered manner.
+
4.
+
The system displays the play log entries.
+
5.
+
The Broadcast auditor requests a play report for +a given time period.
+
6.
+
The system displays the requested report.
+
7.
+
The Broadcast auditor disconnects.
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: the system finds that the user can not be +authenticated. the user is notified and the use case ends.
  • +
+
+

UC-6 Create playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-6
use case Create playlist
+
type secondary, essential
actors Playlist editor
+
purpose Create a new playlist, and then edit it.
+
overview 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.
+
references F1.12, F1.13
+
+

Typical course of events
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist editor connects to the scheduler with +the intent of creating a new playlist.
+

+

+
2. The Playlist editor provides authentication +information 3. The system authenticates the Playlist editor and +grants access.
4.
+
The Playlist editor signals that he whishes for +a new playlist
+
5.
+
The system creates a new, empty playlist, and +opens it for editing.
+
6.
+
The Playlist editor edits the new playlist. See +UC-7 actions 7-15 for details.
+

+

+
7.
+
The Playlist editor disconnects.
+

+

+

+

+

+

+
+
+

Alternate courses

+
    +
  • action 3: the system finds that the user can not be +authenticated. the user is notified and the use case ends.
  • +
+
+

UC-7 Edit playlist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-7
use case Edit playlist
+
type secondary, essential
actors Playlist editor
+
purpose Edit a previoulsy uploaded playlist
+
overview 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.
+
references F1.12
+

Typical course of events
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. Playlist editor connects to the scheduler with +the intent of editing a playlist.
+

+

+
2. The Playlist editor provides authentication +information 3. The system authenticates the Playlist editor and +grants access.

+

+
4.
+
The system lists the available playlists.
+
5.
+
The Playlist editor selects a playlist for +editing.
+
6.
+
The system opens the playlist in editing mode.
+
7.
+
The Playlist editor browses the available Audio +clips
+
8.
+
The system shows the list of available audio +clips
+
9.
+
The Playlist editor selects an Audio clip
+
10.
+
The system displays details on the audio clip.
+
11.
+
The Playlist editor ads a new audio clip to the +playlist, at a certain timepoint in the playlist.
+
12.
+
The new audio clip is added to the playlist.
+
13.
+
The Playlist editor removes an audio clip from +the playlist.
+
14.
+
The audio clip is removed from the playlist.
+
15.
+
The Playlist editor edits the fade-in or +fade-out of a clip in the playlist.
+
16.
+
The fade-in or fade-out is edited.
+
17.
+
The Playlist editor saves the playlist.
+
18.
+
The playlist is validated.
+

+

+
19.
+
The playlist is saved.
+
20.
+
The Playlist editor disconnects.
+

+

+
+
+

Alternate courses

+
    +
  • action 3: the system finds that the user can not be +authenticated. the user is notified and the use case ends.
  • +
  • action 6: the selected playlist is currently being +executed. the user is notified that executing playlists can not be +edited and the use case ends.
  • +
  • action 17: 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.
    +
  • +
  • action 18: 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.
  • +
+
+

UC-8 Start/stop scheduler
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ref# UC-8
use case Start/stop scheduler
+
type primary, essential
actors Administrator
+
purpose Start and stop the scheduler daemon
+
overview 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.
+
references F1.14, F1.15, A1.8
+
+

Typical course of events
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
actor action
+
system response
+
1. The Administrator invokes the scheduler's System +V init script with the start parameter
+

+

+

+

+
2. The scheduler daemon starts up.
+
3.
+
The Administrator checks to see if the scheduler +daemon is running
+
4.
+
The scheduler daemon reports that it is running.
+
5.
+
The Administrator stops the scheduler deamon.
+
6.
+
The scheduler daemon stops.
+
+
+

Alternate courses

+
    +
  • action 2: if the scheduler is already running, indicate +the starting attempt as an error.
    +
  • +
  • action 4: if the scheduler daemon is not running, it is +reported that it is not running.
    +
  • +
  • action 6: if the scheduler daemon is not running, it is +not stopped.
    +
  • +
+

Conceptual model

+The following figure displays the semantic concepts identified for the +Scheduler daemon, and the main associations between the concepts.
+
+ +
+

Concepts

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
concept
+
description
+
Media archive
+
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.
+
Clip retriever
+
Retrieves Audio clips from the Media archive and +stores them in local storage.
+
Local storage
+
A local store of Audio clips. Provides access to +each clip based on the clips' unique id. Allows random access to the +clip files.
+
Audio clip
+
A uniquely identified audio file.
+
Playlist
+
A metafile, containing references to Audio +clips, and information on how the clips should be played.
+
PlaylistElement
+
An association class describing the specifics of +an instance of an Audio clip in a playlist.
+
FadeInfo
+
A class describing fade in or fade out +characteristics for an Audio clip in a Playlist
+
Playlist store
+
A container holding a range of playlists.
+
Schedule
+
Contains Schedule entries
+
Schedule entry
+
Contains the time and details of when a playlist +should be played.
+
Scheduler daemon
+
Executes playlists at timepoints specified by +the schedule.
+
Play log
+
A logging facility, holding Play log entries.
+
Play log entry
+
A record of when an Audio clip was played.
+
Play report
+
An audit report of what Audio clips have been +played in a certain time period
+
Authentication
+
Provides authentication services
+
Playlist editor
+
An external editor, managing playlists.
+
Broadcast auditor
+
An external auditor, browsing the Play log.
+
Administrator
+
The administrator responsible for starting and +stopping the scheduler daemon.
+

+

+
+
+

Associations

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
source
+
association
+
target
+
description
+
Clip retriever
+
Retrieves clips from
+
Media archive
+

+
Media archive
+
Contains
+
Audio clip
+

+
Clip retriever
+
Stores clips in
+
Local storage
+

+
Local storage
+
Contains
+
Audio clip
+

+
Playlist
+
References by PlaylistElement
+
Audio clip
+

+
PlaylistElement
+
Fades in with
+
FadeInfo
+

+
PlaylistElement
+
Fades out with
+
FadeInfo
+

+
Playlist store
+
Contains
+
Play list
+

+
Playlist editor
+
Uploads playlist to
+
Playlist store
+

+
Playlist editor
+
Manages schedule in
+
Schedule
+
The Playlist editor schedules playlists.
+
Schedule
+
Contains
+
Schedule entry
+

+
Schedule entry
+
References
+
Playlist
+

+
Scheduler daemon
+
Executes
+
Schedule
+
The Scheduler daemon plays the scheduled +playlists.
+
Scheduler daemon
+
Logs into
+
Play log
+
The Scheduler daemon logs all the played audio +clips into the Play log for proof of broadcast purposes.
+
Play log
+
Contains
+
Play log entry
+

+
Play log
+
Generated
+
Play report
+
The play log generates reports based on Play log +entries.
+
Play log entry
+
References
+
Audio clip
+

+
Broadcast auditor
+
Browses entries from
+
Play log
+

+
Broadcast auditor
+
Requests
+
Play report
+

+
Playlist editor
+
Is authenticated by
+
Authentication
+

+
Broadcast auditor
+
Is authenticated by
+
Authentication
+

+
Administrator
+
Manages
+
Scheduler daemon
+

+

+

+

+

+
+
+

System behavior

+The behavior of the system as a whole as experienced from the outside +is discussed in this section.
+

System sequence diagrams

+System diagrams are presented for each use case below.
+

UC-1 Upload playlists

+ +
+

UC-2 Manage schedule

+ +
+

UC-3 Manage playlists

+ +
+

UC-4 Retrieve remote files
+

+ +
+

UC-5 Review play log

+ +

UC-6 Create playlist

+ +

UC-7 Edit playlist
+ +

+

UC-8 Start/stop scheduler

+ +
+
+

System objects

+The following figures shows the system objects and their functions, as +derived from the system sequence diagrams.
+ +

Contracts

+For all operations exposed in the system sequence diagrams, the +following contracts are defined.
+

Contract for Scheduler : authenticate

+See Authentication : authenticate
+
+

Contract for Scheduler : uploadPlaylist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
uploadPlaylist
+(playlist : Playlist,
+playtime: Schedule)
+: void
+
Responsibilities
+
Upload a playlist and +put it into the schedule.
+
Type
+
system
+
Cross-reference
+
F1.1, UC-1
+
Notes
+

+
Exceptions
+
If the uploaded playlist +is not valid, indicate as an error
+If the proposed schedule conflicts with existing schedules, indicate as +an error
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
A new Playlist is created, storing the uploaded +playlist
+
instance creation

+
Playlist is entered into the Playlist store
+
association formed
+

+
A new Schedule is created, according to the +supplied schedule
+
instance creation
+

+
Schedule is associated with the Playlist
+
association formed
+

+

+

+
+
+

Contract for Scheduler : displaySchedule

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displaySchedule
+(from : TimeStamp,
+to : TimeStamp)
+: Schedule
+
Responsibilities
+
Display Schedule entries +for a time period.
+
Type
+
system
+
Cross-reference
+
F1.4, UC-2
+
Notes
+

+
Exceptions
+
none
+
Output
+
The Schedule entries for +the specified time period.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : displayPlaylist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displayPlaylist
+(playlistId : UniqueId)
+: Playlist
+
Responsibilities
+
Display a specific +playlist
+
Type
+
system
+
Cross-reference
+
F1.4, UC-3
+
Notes
+

+
Exceptions
+
If no playlist exists +for the specified playlistId, indicate as an error.
+
Output
+
The requested playlist.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : deletePlaylist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displayPlaylist
+(playlist : Playlist)
+: void
+
Responsibilities
+
Delete a specific +playlist
+
Type
+
system
+
Cross-reference
+
F1.11, UC-3
+
Notes
+

+
Exceptions
+
If no playlist exists +for the specified playlistId, indicate as an error.
+If the playlist is referenced by any Schedule entry, indicate as an +error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
The playlist is removed from the Playlist store.
+
association broken
+

+
References by the playlist to Audio clips removed
+
association broken
+

+
The playlist is deleted
+
instance deletion
+

+

+

+
+
+

Contract for Scheduler : removeFromSchedule
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
removeFromSchedule
+(scheduleEntry : Schedule entry,
+playlist : Playlist)
+: void
+
Responsibilities
+
Remove a specific +playlist from a schedule entry
+
Type
+
system
+
Cross-reference
+
F1.9, UC-2
+
Notes
+

+
Exceptions
+
If the specified +scheduleEntry does not exist, indicate as an error.
+If the specified playlist does not exist, indicate as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
Reference to the playlist by the scheduleEntry +is removed.
+
association broken
+

+

+

+
+
+

Contract for Scheduler : reschedule
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
reschedule
+(scheduleEntry : Schedule entry,
+playlist : Playlist,
+playtime : TimeStamp)
+: void
+
Responsibilities
+
Change when a certain +playlist is scheduled to play.
+
Type
+
system
+
Cross-reference
+
F1.10, UC-2
+
Notes
+

+
Exceptions
+
If the specified +scheduleEntry does not exist, indicate as an error.
+If the specified playlist does not exist, indicate as an error.
+If the new playtime conflicts with other schedule entries, indicate as +an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
The time attribute of scheduleEntry is updated +to the supplied playtime.
+
attribute modification
+

+

+

+
+
+

Contract for Scheduler : displayPlaylists

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displayPlaylists
+()
+: Playlist
+
Responsibilities
+
Display Playlists +contained in the Playlist store
+
Type
+
system
+
Cross-reference
+
F1.4, UC-3
+
Notes
+

+
Exceptions
+
none
+
Output
+
The playlists contained +in the Playlist store.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : displayPlayLog

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displayPlaylists
+()
+: Play log
+
Responsibilities
+
Display Play log entries +contained in the Play log
+
Type
+
system
+
Cross-reference
+
F1.4, UC-5
+
Notes
+

+
Exceptions
+
none
+
Output
+
The play log entries +contained in the Play log.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : generatePlayReport
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
generatePlayReport
+(from : TimeStamp,
+to : TimeStamp)
+: Play report
+
Responsibilities
+
Present a report on what +Audio clips have been played to the Broadcast auditor.
+
Type
+
system
+
Cross-reference
+
F1.4, UC-5
+
Notes
+

+
Exceptions
+
none
+
Output
+
A report on the played +Audio clips played in the specified time period.
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : createPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
createPlaylist
+()
+: Playlist
+
Responsibilities
+
Create a new playlist
+
Type
+
system
+
Cross-reference
+
F1.12, UC-6
+
Notes
+
A new playlist is +created, and is immediately locked for editing.
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
A new Playlist is created
+
instance creation
+

+
The lockedForEditing attribute is set to true +for the playlist
+
attribute modification
+

+
The playlist is added to the Playlist store
+
association formed
+

+

+

+
+
+

Contract for Scheduler : openPlaylistForEditing
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
openPlaylistForEditing
+(playlist : Playlist)
+: void
+
Responsibilities
+
Open a playlist for +editing
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
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.
+
Exceptions
+
if the playlist is +currently being executed, indicate as an error.
+
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
The current version of the playlist is stored, +in case the user wants to revert to the last saved version (see +revertEditedPlaylist)
+
instance creation
+

+
The lockedForEditing attribute is set to true +for the playlist
+
attribute modification
+

+

+

+
+
+

Contract for Scheduler : addAudioClipToPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
addAutioClipToPlaylist
+(playlist : Playlist,
+audioClip : AudioClip,
+relativeOffset : Time)
+: void
+
Responsibilities
+
Add an Audio clip to a +Playlist
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
The Audio clip is added +to the playlist with the specified relativeOffset from the beginning of +the Playlist.
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
the Playlist is +currently opened for editing
+
Post-conditions
+
condition
+
type
+

+
The new PlaylistElement is created associating +the playlist with the audio clip, with the specified relativeOffset
+
association formed, instnace creation
+

+

+

+
+
+

Contract for Scheduler : displayAudioClips
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displayAudioClips
+()
+: AudioClip
+
Responsibilities
+
Display the audio clips +known to the Scheduler
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
none
+
Exceptions
+
none
+
Output
+
The Audio clips kown to +the Scheduler
+
Pre-conditions
+
none
+
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : displayAudioClip
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
displayAudioClip
+(audioClipId : UniqueId)
+: AudioClip
+
Responsibilities
+
Display the audio clip +specified by the audioClipId
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
none
+
Exceptions
+
if no audio clip by the +specified id exists, indicate as an error
+
Output
+
The Audio clip specified +by the audioClipId
+
Pre-conditions
+
none
+
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : removeAudioClipFromPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
removeAutioClipFromPlaylist
+(playlist : Playlist,
+audioClip : AudioClip)
+: void
+
Responsibilities
+
Remove an Audio clip +from a Playlist
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
The Audio clip is +removed from the Playlist.
+
Exceptions
+
If the Audio clip is not +in the playlist, indicate as an error.
+
Output
+
none
+
Pre-conditions
+
the Playlist is +currently opened for editing
+
Post-conditions
+
condition
+
type
+

+
The PlaylistElement associating the AudioClip +with the Playlist is removed, with the related FadeInfo instances
+
instance deletion, association broken
+

+

+

+
+
+

Contract for Scheduler : updateFadeInFadeOut
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
updateFadeInFadeOut
+(audioClip : AudioClip,
+playlist : Playlist)
+: void
+
Responsibilities
+
Update the fade-in and +fade-out parameters for an audio clip playing in a playlist.
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
none
+
Exceptions
+
If the Audio clip is not +in the playlist, indicate as an error.
+
Output
+
none
+
Pre-conditions
+
the Playlist is +currently opened for editing
+
Post-conditions
+
condition
+
type
+

+
The fade-in and fade-out parameters for the +audio clip in the playlist are updated
+
attribute modification
+

+

+

+
+
+

Contract for Scheduler : validatePlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
validatePlaylist
+(playlist : Playlist)
+: boolean
+
Responsibilities
+
Validate a playlist for +being complete.
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
The playlist is checked +for being complete (not containing silence) and other sanity criteria.
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
none
+
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : savePlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
savePlaylist
+(playlist : Playlist)
+: void
+
Responsibilities
+
The playlist is saved.
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
none
+
Exceptions
+
If the playlist is not +valid, indicate as an error.
+
Output
+
none
+
Pre-conditions
+
the Playlist is +currently opened for editing
+
Post-conditions
+
condition
+
type
+

+
The lockedForEditing attriubute is set to false +for the playlist
+
attribute modification
+

+
The old version of the Playlist that could have +been used for reverting is deleted (see revertEditedPlaylist)
+
instance deletion
+

+

+

+
+
+

Contract for Scheduler : revertEditedPlaylist
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
revertEditedPlaylist
+(playlist : Playlist)
+: void
+
Responsibilities
+
Changes are discarded +for a Playlist that is being edited.
+
Type
+
system
+
Cross-reference
+
F1.13, UC-7
+
Notes
+
The contents of the +playlist are reverted to the state prior to when editing began on it.
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
the Playlist is +currently opened for editing
+
Post-conditions
+
condition
+
type
+

+
The contents of the Playlist are reverted to the +last saved version. This includes deleting all created PlaylistElement +and FadeInfo instances.
+
attribute modification, instance deletion
+

+
The lockedForEditing attriubute is set to false +for the playlist
+
attribute modification
+

+

+

+
+
+

Contract for Scheduler : start
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
start
+()
+: void
+
Responsibilities
+
Starts the scheduler +daemon
+
Type
+
system
+
Cross-reference
+
F1.14, UC-8
+
Notes
+
A System V init-style +daemon starting entry point
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
The scheduler daemon is +currently not running
+
Post-conditions
+
condition
+
type
+

+
The scheduler daemon object is created
+
instance creation
+

+
All the necessary structures are created for the +deamon to run
+
instance creation
+

+

+

+
+
+

Contract for Scheduler : isRunning
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
isRunning
+()
+: boolean
+
Responsibilities
+
Tells if the scheduler +daemon is running
+
Type
+
system
+
Cross-reference
+
UC-8
+
Notes
+
A System V init-style +daemon status entry point
+
Exceptions
+
none
+
Output
+
true of the daemon is +running, false otherwise
+
Pre-conditions
+
none
+
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Scheduler : stop
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
stop
+()
+: void
+
Responsibilities
+
Stops the scheduler +daemon
+
Type
+
system
+
Cross-reference
+
F1.15, UC-8
+
Notes
+
A System V init-style +daemon stopping entry point
+
Exceptions
+
none
+
Output
+
none
+
Pre-conditions
+
The scheduler daemon is +currently running
+
Post-conditions
+
condition
+
type
+

+
The scheduler daemon object is deleted
+
instance deletion
+

+

+

+
+
+

Contract for Media archive : authenticate

+TODO: move to Media archive spec
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
authenticate
+(authenticationInfo : AuthenticationInfo)
+: boolean
+
Responsibilities
+
Check if the provided +authentication info is recognized.
+
Type
+
interface
+
Cross-reference
+
UC-4
+
Notes
+

+
Exceptions
+
none
Output
+
true if the provided +authentication is recognized, false otherwise
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Media archive : retrieveAudioClip

+TODO: move to Media archive spec
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
retrieveAudioClip
+(clipId : UniqueId)
+: AudioClip
+
Responsibilities
+
Retrieve an AudioClip +specified by the supplied audio clip id.
+
Type
+
interface
+
Cross-reference
+
F1.2, UC-4
+
Notes
+

+
Exceptions
+
if no audio clip exists +with the supplied id, indicate as an error
+
Output
+
the requested audio clip
+
Pre-conditions
+
none
Post-conditions
+
condition
+
type
+

+
A new Audio clip is created and filled with the +contents of the retrieved audio clip
+
instance creation

+
Audio clip is entered into Local storage
+
association formed
+

+

+

+
+
+

Contract for Local storage : authenticate

+TODO: move to Local storage spec
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
authenticate
+(authenticationInfo : AuthenticationInfo)
+: boolean
+
Responsibilities
+
Check if the provided +authentication info is recognized.
+
Type
+
interface
+
Cross-reference
+
UC-4
+
Notes
+

+
Exceptions
+
none
Output
+
true if the provided +authentication is recognized, false otherwise
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Local storage : existsAudioClip

+TODO: move to Local storage spec
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
existsAudioClip
+(audioClipId : UniqueId)
+: boolean
+
Responsibilities
+
Tell if an audio clip by +the provided unique id is stored in the Local storage
+
Type
+
interface
+
Cross-reference
+
UC-4
+
Notes
+

+
Exceptions
+
none
Output
+
true if an audio clip +with the provided id exists, false otherwise
+
Pre-conditions
+
none
Post-conditions
+
none
+

+

+

+

+
+
+

Contract for Local storage : storeAudioClip

+TODO: move to Local storage spec
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Name
+
storeAudioClip
+(audioClip : AudioClip)
+: void
+
Responsibilities
+
Store an audio clip.
+
Type
+
interface
+
Cross-reference
+
UC-4
+
Notes
+

+
Exceptions
+
none
Output
+
none
+
Pre-conditions
+
none
Post-conditions
+
The supplied audio clip is stored in the storage.
+

+

+

+

+
+
+

Glossary

+playlist
+The playlist is a metafile, containing references to audio clips that +should be played, and details on how they should be played.
+
+ + diff --git a/livesupport/doc/model/SoftwareArchitecture/PlaylistEditorArchitecture.svg b/livesupport/doc/model/SoftwareArchitecture/PlaylistEditorArchitecture.svg new file mode 100644 index 000000000..dc612e579 --- /dev/null +++ b/livesupport/doc/model/SoftwareArchitecture/PlaylistEditorArchitecture.svg @@ -0,0 +1,144 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + OSS + + + + + + + ALSA + + + + + + + Helix Client Library + + + + + + + Playlist editor + + + + + + + GTK+ + + + + + + + + + + + Local storage + + + + + + + + + + + + + Media Archive + + + + + + + + + + + + Scheduler + + + + + + diff --git a/livesupport/doc/model/SoftwareArchitecture/SchedulerArchitecture.svg b/livesupport/doc/model/SoftwareArchitecture/SchedulerArchitecture.svg new file mode 100644 index 000000000..349806bd9 --- /dev/null +++ b/livesupport/doc/model/SoftwareArchitecture/SchedulerArchitecture.svg @@ -0,0 +1,137 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Local storage + + + + + + + Helix Client Library + + + + + + + OSS + + + + + + + ALSA + + + SMIL, MP3, Ogg Vorbis + + + + + + + Media Archive + + + + + + + Scheduler + + + + + + + + + + + + + + + + + + Playlist editor + + + + + + diff --git a/livesupport/doc/model/SoftwareArchitecture/SoftwareArchitecture.zuml b/livesupport/doc/model/SoftwareArchitecture/SoftwareArchitecture.zuml new file mode 100644 index 0000000000000000000000000000000000000000..bccf75488f30bb5e38b2b753b091e909635d3c74 GIT binary patch literal 5066 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 Ctelnr literal 0 HcmV?d00001 diff --git a/livesupport/doc/model/SoftwareArchitecture/index.html b/livesupport/doc/model/SoftwareArchitecture/index.html new file mode 100644 index 000000000..92d3c3398 --- /dev/null +++ b/livesupport/doc/model/SoftwareArchitecture/index.html @@ -0,0 +1,104 @@ + + + + + LiveSupport Software Architecture + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author: maroy $
  • +
  • Version: $Revision: 1.1 $
  • +
  • Location: $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/doc/model/SoftwareArchitecture/index.html,v $
  • +
+

Scope

+This document describes the software architecture of LiveSupport.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Software Architecture

+The software architecture is contained +in Poseidon +2 format.
+

Scheduler

+The software architecture for the Scheduler component:
+ +
+

Playlist editor

+The software architecture for the Playlist Editor:
+ +
+

Components

+A brief summary of the software components appearing in the figures +above:
+

Scheduler

+The LiveSupport Scheduler, responsible for executing playlists.
+

Playlist editor

+The LiveSupport Playlist editor, a graphical user interface component.
+

Media Archive

+The LiveSupport Media Archive component.
+

Local storage

+The LiveSupport Local Storage component.
+

Helix Client Library

+A media library developed by the Helix +Community and Real Networks. +This library provides support for the SMIL playlist format and Ogg Vorbis and MP3 audio +formats.
+

OSS

+Open Sound System, a +cross-platform low level audio API for accessing analog audio devices. +This is the de-facto standard audio API for Linux until kernel 2.4.
+

ALSA

+Advanced Linux Sound Architecture, +a more advanced low level audio API. This is the de-facto standard +audio API for Linux since kernel 2.6.
+

GTK+

+The GIMP Toolkit, a cross-platform +graphical user interface API.
+

Discussion
+

+Among the software components listed above, OSS, ALSA and GTK+ are +industry standard, and are straightforward to use. But the Helix Client +Library is a special library, the open sourced version of Real +Network's streaming libraries.
+
+Tests were made to make sure Helix indeed compiles and runs fine on the +target platform. All libraries where successfully compiled and SMIL +playlists were successfully played. For this, the splay command line +sample program was used, which is part of the Helix codebase. For +compiling helix client libraries, refer to the Getting +Started with the Helix Sources pages. The settings used for +successful compilation:
+
+[0] Set BIF branch (hxclient_1_3_0_neptunex)
+[1] Set Target(s) (splay)
+[2] Set Profile (helix-client-all-defines)
+[3] run: build
+[4] Toggle make depend & makefiles (-e -n)
+[5] Toggle release (-trelease)
+[6] Toggle 'make clean'  (-c)
+[7] Toggle clobber (Dangerous!) (-C)
+[8] Toggle halt-on-error (-p green)
+[9] Toggle verbose mode (-v)
+[10] Toggle static build (-tnodll)
+[11] Checkout source for selected target now
+[12] Set Tag/Branch/Timestamp
+[13] Help Page (full help in build/doc/index.html)
+[14] run history: build
+[Q] Quit

+
+ + diff --git a/livesupport/doc/model/index.html b/livesupport/doc/model/index.html new file mode 100644 index 000000000..69c99b662 --- /dev/null +++ b/livesupport/doc/model/index.html @@ -0,0 +1,200 @@ + + + + + LiveSupport Architecture + + + +

Preface

+This document is part of the LiveSupport +project, Copyright © 2004 Media +Development Loan Fund, under the GNU GPL.
+
    +
  • Author: $Author: maroy $
  • +
  • Version: $Revision: 1.1 $
  • +
  • Location: $Source: /home/paul/cvs2svn-livesupport/newcvsrepo/livesupport/doc/model/index.html,v $
  • +
+

Scope

+This document describes the architecture of LiveSupport.
+
+This document contains embedded SVG figures, thus an SVG +capable browser is needed to view it, or an SVG plugin like Adobe's SVG Viewer.
+

Architecture

+
+ +
+UML diagrams in Poseidon +2 format are available in a Poseidon +project file.
+
+The Software architecture is discribed on a different page.
+

Scheduler

+The scheduler is responsible to +execute playlists.
+

Local storage

+The local storage holds locally +available audio clips
+

Media archive

+The media archive is a +centralized media archive holding audio clips +and storing metadata.
+

Authentication

+The authentication component +provides basic authentication functionality.
+

Playlist editor

+The Playlist editor component +is the user interface tool to create playlists.
+

Feature - component mapping

+This section contains a mapping from the features listed in section 3.3 +the original LiveSupport proposal to the components that fulfill these +features.
+

LiveSupport Feature List

+For convenience the features listed in section 3.3 of the LiveSupport +proposal are quoted below, with their original section numbers.
+

3.3.1 Intuitive User Interface

+

LiveSupport will feature an +easily-localizable and intuitive user interface that draws on the +applicants’ extensive previous project experience.

+

3.3.2 Storing Metadata

+

Most audio formats allow the storage of +some information inside the media file itself. However, this feature +was developed primarily to handle music tracks, storing information +on artist, title, record, genre, track number and so on. It is +impossible to store essential information like the language of an +audio file – essential for spoken word productions, such as +educational or news material.

+

LiveSupport will use existing open +standards, such as RSS feed standards in XML format, to store all +information needed to describe a file sufficiently. Additionally, +this metadata information will fully support the Unicode format, +making the database of metadata available to all character sets and +fully searchable.

+

3.3.3 Automation and Scheduling

+

LiveSupport will provide a scheduler, +allowing stations to fill parts of the radio schedule with automated +broadcasts. Throughout automated broadcasting times, the station will +still be able to deliver advertisement, generating income while +minimizing the running costs. Longer times of daily broadcasts via +automation also help the station to make its frequency known in the +community.

+

3.3.4 Playlist Management

+

Small radio stations in the developing +world mainly use playlists generated by audio player software such as +MusicMatch, Windows MediaPlayer or WinAMP. Such simple playlists +provide no more information than a list of file names, and are +inaccessible for full text search. As mentioned above, LiveSupport +will use the potential of XML metadata in Unicode to manage and +archive playlists.

+

3.3.5 Proof of Broadcast

+

Proof of broadcast is essential to +establish serious business relationships with advertisers. +LiveSupport will provide accurate and detailed log files stating the +precise time each item was broadcast over the system. In a +radio-network context, the proof of broadcast tool developed by MDLF +in conjunction with Radio 68H in Indonesia will be used to aggregate +and analyze logs created by individual LiveSupport installations.

+

3.3.6 Mixing Local Audio Sources

+

A producer running LiveSupport in a +studio will be able to mix audio files (e.g. reports, music, +jingles), phone calls and the microphone into a live broadcast.

+

3.3.7 Mixing Local and Remote Sources

+

If connected to the Internet, and given +enough available bandwidth, LiveSupport will be able to play local +files (stored on the system’s hard disk), remote files (stored +anywhere on the Internet) or include audio streams from the Internet +as part of the local transmission – all of which could also become +part of a playlist.

+

3.3.8 Remote Control of Transmitter Locations

+

A radio reporter/producer will be able +to remotely access all of LiveSupport’s scheduling features over +the Internet using a standard web browser. She will be able to upload +audio programs as well as create playlists and schedule transmission.

+

Feature - component mapping

+The following table associates features with components.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
feature
+
component
+
3.3.1
+
Intuitive User Interface
+
Playlist editor
+
3.3.2
+
Storing Metadata
+
Media archive
+
3.3.3
+
Automation and Scheduling
+
Scheduler
+
3.3.4
+
Playlist Management
+
Scheduler, Playlist editor
+
3.3.5
+
Proof of Broadcast
+
Scheduler
+
3.3.6
+
Mixing Local Audio Sources
+

+
3.3.7
+
Mixing Local and Remote Sources
+
Local storage, Media archive, Scheduler, +Playlist editor
+
3.3.8
+
Remote Control of Transmitter Locations
+
Scheduler, Playlist editor
+
+
+
+ +