TUTORIEL FLASH 
Flash MX : un lecteur MP3 utilisant XML (2)
Transformation de notre simple lecteur MP3 en un petit juke-box intéractif. (04/06/2004)
Retour sur notre lecteur MP3 en Flash/XML, afin de lui ajouter quelques fonctionnalités qui nous ont été demandées par les lecteurs.
Ces fonctionnalités n'ont rien de complexe mais rapprochent grandement notre lecteur d'un véritable juke-box en ligne.
Les modifications tiennent surtout dans l'ajout de quelques boutons, et du code qui va avec...

Les boutons

Reprenez le code source de notre première version. Une fois chargé dans l'outil Flash MX, ajoutez-y les boutons playback-xxx que l'on peut trouver dans "Fenêtre/Bibliothèque commune/Boutons/Playback"; vous devez maintenant avoir sur l'interface, idéalement côte à côte, des occurrences de playback - go to end, playback - loop, playback - play, playback - rewind, playback - step back, playback - step forward et playback - stop. Nommez-les respectivement "boutonSuivant", "boutonRelance", "boutonJouer", "boutonPrecedent", "boutonRecule", "boutonAvance" et "boutonPause". Comme vous l'aurez compris, nous gardons notre gros bouton Stop de l'ancienne interface (et sa fonction) pour faire du bouton playback - stop un bouton de pause, nous permettant de relancer la lecture avec playback - play. De même, nous ne définirons pas de boucle avec playback - loop, mais redémarrons le son.
Voici pour les seules modifications de l'interface...

Le coeur du code
Ce coeur, à savoir la gestion du fichier XML (le bloc playlist_xml.onLoad) et la gestion du son (le bloc chanson.onLoad), reste globalement inchangé. Nous ne modifierons qu'une chose dans la gestion du son : l'affichage. Dans le bloc chanson.onLoad, modifiez la ligne
_root.ecranTitre = "Lecture de "+liste.getSelectedItem().data;
en
_root.ecranTitre = "[0%]:" + liste.getSelectedItem().label;
Deux choses sont donc modifiées (hors le texte) : nous affichons maintenant le pourcentage de son lu (et non chargé...), et nous affichons le nom de la chanson tel que défini dans le fichier XML (et affiché dans la liste), plutôt que le nom du fichier, ce qui est tout de même plus propre...

Le timer
Cet affichage du pourcentage se fera avec un "timer", créé grâce aux propriétés duration et position du son, dans la fonction suivante :

function afficheTimer() {
  if (chanson.duration > 0) {
    chansonPourcent = Math.round((chanson.position * 100) / chanson.duration);
    _root.ecranTitre = "[" + chansonPourcent + "%]:" + liste.getSelectedItem().label;
    }
  }


Mais le pourcentage resterait constamment à zéro : il nous faut le mettre à jour à intervalle régulier, et pour cela, rien de mieux que le couple de fonctions setInterval() et clearInterval() - la première nous permet de créer cet intervalle (quand on (re)lance la lecture d'une chanson), la seconde de l'annuler (quand la chanson se termine).
La première utilisation de notre intervalle se fait dans la gestion de la ListBox, avec les fonctions userClic() et deselection() (en gras, les changements/ajouts par rapport à la version précédente):

liste.setSelectMultiple(false);
liste.setChangeHandler("userClic");
function userClic() {
  fichierEnCours = liste.getSelectedItem().data;
  chanson.loadSound(fichierEnCours, true);
  chansonIntervale = setInterval(afficheTimer, 1000);
  }
function deselection() {
  clearInterval(chansonIntervale);
  _root.ecranTitre = "Musique stoppée.";
  liste.setSelectedIndices(null);
  }

La mise à jour se fait ici toute les secondes (tous les 1000 millièmes de secondes), mais rien n'empêche de raccourcir l'intervalle pour être au plus proche de la réalité.

Les boutons
Le code attaché au bouton Stop (la fonction arreterTout()) est modifié de manière mineure (la ligne _root.ecranTitre... a été bougée dans deselection()).

Les boutons Jouer et Pause doivent agir de concert. Pour pouvoir reprendre le son à l'endroit où nous l'avons arrêté, il nous faut utiliser la fonction start() avec son argument indiquant le nombre de secondes de décalage (en secondes, et non en millièmes de seconde cette fois - mais les nombres à virgule sont acceptés, donc on ne perd pas en précision). Ce décalage est créé par le bouton Pause, à l'aide de la propriété position...

boutonPause.onRelease = function() {
  chansonPosition = Math.round(chanson.position / 1000);
  clearInterval(chansonIntervale);
  _root.ecranTitre = "[pause]:" + liste.getSelectedItem().label;
  chanson.stop();
  };
boutonJouer.onRelease = function() {
  chanson.start(chansonPosition, 1);
  chansonIntervale = setInterval(afficheTimer, 1000);
  };

Les boutons Suivant et Précédent ne sont guère plus compliqués : à partir du moment où l'on est assuré que le son en cours n'est pas au tout début ou à la toute fin de la liste, on peut sans problème passer au son précédent/suivant, en utilisant les méthode appropriées de ListBox, à savoir getSelectedIndex(), setSelectedIndex() (qui lance automatiquement la lecture du son grâce à notre évènement setChangeHandler(userClic) décrit plus haut) et getLength() (qui nous renvoi le nombre d'éléments dans la liste, le premier étant à 0 et le dernier à getLength() - 1).

boutonPrecedent.onRelease = function() {
  if (liste.getSelectedIndex() > 0) {
    liste.setSelectedIndex(liste.getSelectedIndex() - 1);
    }
  };
boutonSuivant.onRelease = function() {
  if (liste.getSelectedIndex() < liste.getLength() - 1) {
    liste.setSelectedIndex(liste.getSelectedIndex() + 1);
    }
  };

Les boutons Recule et Avance sont eux aussi simples à implémenter, en utilisant start() avec une modification de la dernier valeur de position connue :

boutonRecule.onRelease = function() {
  chansonPosition = Math.round(chanson.position / 1000) - 5;
  if (chansonPosition > 0) {
    chanson.start(chansonPosition, 1);
    }
  };
boutonAvance.onRelease = function() {
  chansonPosition = Math.round(chanson.position / 1000) + 5;
  if (chansonPosition < chanson.duration) {
    chanson.start(chansonPosition, 1);
    }
  };


Nous décalons ici le son de 5 secondes...

Enfin, le bouton Relance est des plus triviaux : on utilise simplement start(0). On prendra soin néanmoins de mettre également à zéro notre intervalle et, pour la forme, le contenu de l'affichage...

boutonRelance.onRelease = function() {
  clearInterval(chansonIntervale);
  _root.ecranTitre = "[0%]:" + liste.getSelectedItem().label;
  chanson.start(0, 1);
  chansonIntervale = setInterval(afficheTimer, 1000);
  };



  Forum

Réagissez dans les forums de JDN Développeurs

Voici donc une version de notre lecteur plus complète que celle que nous vous avions donné en décembre dernier. Manquent encore quelques aspects cosmétiques, comme un indicateur de chargement de MP3 ou même un équaliseur. Nous laissons cela pour le moment à vos bons soins. Voici déjà notre code source.
 
Xavier Borderie, JDN Développeurs
 
Accueil | Haut de page