AudioPlaylist
Une instance de AudioPlaylist gère une liste de pistes audio qui sont jouées par une instance de AudioPlayer.
- Responder
- View
- AudioPlaylist
- View
Cliquez sur le nom d'une piste pour la charger dans le lecteur.
Appuyez sur le bouton lecture pour démarrer la lecture de l'audio. Appuyez sur le bouton pause pour la mettre en pause. Déplacez le glisseur ou cliquez dans la barre de progression pour avancer ou reculer dans l'audio. Activez ou désactivez la lecture en boucle. NOTE : Le lecteur passe automatiquement à la piste suivante si la lecture en boucle est désactivée.
Dans la console du navigateur, chargez une piste dans le lecteur :
audioplaylist.currentTrack=4
Ajoutez un temps d'attente en millisecondes entre les pistes :
audioplaylist.gap=2000
Désactivez la lecture en boucle :
audioplayer.loop=false
Démarrez le lecteur :
audioplayer.play()
- function AudioPlaylist(player, tracks) {
- View.call(this);
- player.addListener(this);
- this._player = player;
- this._tracks = tracks;
- this._currentTrack = 1;
- this._gap = 0;
- this._timer = null;
- }
- AudioPlaylist.prototype = Object.create(View.prototype);
- Object.defineProperty(AudioPlaylist.prototype, 'constructor', { value: AudioPlaylist, enumerable: false, writable: true });
La classe AudioPlaylist hérite de la classe View.
player
est une instance de AudioPlayer.
tracks
est un tableau qui liste les pistes audio gérées par l'instance.
Chaque piste est décrite par un objet avec un champ title
, une chaîne de caractères, le titre de la piste, et un champ url
, une chaîne de caractères, une URL qui pointe vers le fichier audio.
- Object.defineProperty(AudioPlaylist.prototype, 'currentTrack', {
- get: function() {
- return this._currentTrack;
- },
- set: function(n) {
- if (!Number.isInteger(n))
- throw new TypeError();
- if (n < 1 || n > this._tracks.length)
- n = this._tracks.length;
- if (this._tracks[this._currentTrack-1].widget)
- this._tracks[this._currentTrack-1].widget.classList.remove('selected');
- this._currentTrack = n;
- if (this._tracks[this._currentTrack-1].widget)
- this._tracks[this._currentTrack-1].widget.classList.add('selected');
- this._player.src = this._tracks[n-1].url;
- }
- });
currentTrack
est un accesseur qui retourne ou change la piste chargée dans le lecteur audio géré par this
. currentTrack
retourne ou accepte en argument un numéro de piste.
Un numéro de piste commence à 1.
Si le numéro de piste en argument est inférieur à 1 ou supérieur au nombre de piste gérée par this
, currentTrack
charge la dernière piste.
- Object.defineProperty(AudioPlaylist.prototype, 'gap', {
- get: function() {
- return this._gap;
- },
- set: function(ms) {
- if (!Number.isInteger(ms))
- throw new TypeError();
- if (ms < 0)
- throw new RangeError();
- this._gap = ms;
- }
- });
- AudioPlaylist.prototype.audioEnded = function(sender) {
- if (this._currentTrack == this._tracks.length)
- this.currentTrack = 1;
- else {
- this.nextTrack();
- if (this._gap > 0)
- this._timer = setTimeout(() => { this._timer = null; this._player.play(); }, this._gap);
- else
- this._player.play();
- }
- };
- AudioPlaylist.prototype.audioPlayed = function(sender) {
- if (this._timer) {
- clearTimeout(this._timer);
- this._timer = null;
- }
- };
- AudioPlaylist.prototype.nextTrack = function() {
- return this.currentTrack = this._currentTrack == this._tracks.length ? 1 : this._currentTrack + 1;
- };
- AudioPlaylist.prototype.previousTrack = function() {
- return this.currentTrack = this._currentTrack == 1 ? this._tracks.length : this._currentTrack - 1;
- };
- AudioPlaylist.prototype.setWidget = function(w) {
- if (! (w.tagName == 'OL' || w.tagName == 'UL'))
- throw new TypeError();
- w.querySelectorAll('li > span').forEach((e, i) => {
- this._tracks[i].widget = e;
- e.onclick = () => this.currentTrack = i + 1;
- });
- View.prototype.setWidget.call(this, w);
- return this;
- };
- AudioPlaylist.prototype.createWidget = function() {
- const playlist = [];
- for (let trackdata of this._tracks)
- playlist.push(`<li><span>${trackdata.title}</span></li>`);
- const html = '<ol class="ojs_playlist">' + '\n' + playlist.join('\n') + '\n' + '</ol>';
- let template = document.createElement('template');
- template.innerHTML = html;
- let widget = template.content.children[0];
- this.setWidget(widget);
- return this;
- };
- AudioPlaylist.prototype.destroyWidget = function() {
- View.prototype.destroyWidget.call(this);
- for (let trackdata of this._tracks)
- delete trackdata.widget;
- return this;
- };
Test
Les pistes audio par djduppy sont disponibles sur Freesound.
- <?php $debug=true; ?>
Mettre $debug
à true
permet d'accéder dans la console du navigateur aux variables audioplayer
, l'instance de AudioPlayer, et audioplaylist
, l'instance de AudioPlaylist.
Si $debug
vaut false
, tout le code en JavaScript est protégé par une fonction de fermeture.
- <?php $ojs_audiolistdir='/files/sounds/djduppy'; ?>
- <?php $ojs_audiolist=array('bigbeat', 'electro', 'garage', 'hardtrance', 'hipfunk', 'ragga'); ?>
Définit la liste des pistes audio jouées par le lecteur, i. e. leurs noms de fichier et le dossier sur le serveur qui les contient. Selon le type de fichier audio que le navigateur peut lire, le code ajoute l'extension .ogg ou .mp3 au nom d'une piste.
- <?php $id=uniqid('id'); ?>
Définit l'identifiant de la <div>
qui encadre le HTML du lecteur audio.
- .ojs_playlist {
- columns: 2;
- }
- .ojs_playlist li span:hover, .ojs_playlist li span.selected {
- color: #3bc;
- }
Affiche la liste des pistes audio sur 2 colonnes. Change la couleur du titre sélectionné.
- <div id="<?php echo $id; ?>" class="noprint">
- <div class="ojs_audio">
- <span class="audiocontrols">
- <span class="audioplay"><i class="fas fa-3x fa-play-circle"></i></span>
- <span class="audiopause"><i class="fas fa-3x fa-pause-circle"></i></span>
- <input class="audiobar" type="range" min="0" max="100" step="1" value="0"/>
- <span class="audiotime">00:00:00</span>
- <span class="audioloop"><i class="fas fa-sm fa-sync-alt"></i></span>
- </span>
- </div>
- </div>
Crée les widgets de l'interface.
- <?php head('javascript', '/objectivejs/Objective.js'); ?>
- <?php head('javascript', '/objectivejs/Responder.js'); ?>
- <?php head('javascript', '/objectivejs/View.js'); ?>
- <?php head('javascript', '/objectivejs/AudioPlayer.js'); ?>
- <?php head('javascript', '/objectivejs/AudioPlaylist.js'); ?>
Inclut le code de toutes les classes nécessaires.
RAPPEL : La fonction head
de la librairie iZend ajoute une balise telle que <script src="/objectivejs/Objective.js"></script>
à la section <head>
du document HTML. Adaptez le code à votre environnement de développement.
- <?php if (!$debug): ?>
- (function() {
- <?php endif; ?>
Isole tout le code en JavaScript dans une fonction de fermeture si $debug
vaut false
.
- const audioplayer = new AudioPlayer();
- const container = document.querySelector('#<?php echo $id; ?>');
- audioplayer.setManagedWidget(container.querySelector('.ojs_audio'));
- audioplayer.loop = true;
- const dirname = '<?php echo $ojs_audiolistdir; ?>';
- const filelist = [<?php echo implode(',', array_map(function($s) { return "'$s'"; }, $ojs_audiolist)); ?>];
- const filetype = audioplayer.canPlayType('audio/ogg') ? '.ogg' : '.mp3';
- const audiotracks = [];
- for (let filename of filelist)
- audiotracks.push({title: filename, url: `${dirname}/${filename}${filetype}`});
- const audioplaylist = new AudioPlaylist(audioplayer, audiotracks);
- audioplaylist.createManagedWidget(container);
- audioplaylist.currentTrack = 1;
- <?php if (!$debug): ?>
- })();
- <?php endif; ?>
Ferme la fonction qui isole le code en JavaScript si $debug
vaut false
.
Commentaires