Le multimédia est devenu un problème majeur dans le développement de logiciels. En effet, un programme doté d’une belle interface, avec des boutons animés, qui font du bruits en réponse aux actions de l’utilisateur, etc…, est devenu un atout pour séduire le gran public. Même si votre logiciel est très puissant, le meilleur dans son domaine, beaucoup (toujours trop) d’utilisateurs lui préfèreront un concurrent si tant est que celui-ci soit plus beau et plus convivial. L’interface graphique n’est donc pas à négliger, loin de là !
Je vous propose donc un petit tutoriel expliquant comment jouer des sons dans un programme Java. Ce tutoriel est cependant particulier: il concerne Java 1.1 en plus ancien, mais il est intéressant tout de même ! Je m’explique: il n’était pas possible à l’époque de jouer un son autre part que dans des applets sans utiliser de classes non documentées et très peu connues. Ce sont ces classes bien pratiques qui sont utilisées ici.
Vous pouvez utiliser cette technique dans vos programmes Java 2 (SDK 1.2, 1.3 & 1.4) si vous ne voulez par avoir recours aux nouvelles techniques.
Les classes non documentées font partie du paquetage sun.audio .
On notera cependant une forte restriction: n’essayez pas de jouer un fichier de 3 GO contentenant l’integrale de la 9ème symphonie de Beethoven, en qualité CD… cela ne fonctionnera pas avec cette méthode. Le format utilisé en Java par défaut est le format AU, plutôt destiné à faire un "ping", "plouf", ou "plaf" lorsque l’utilisateur clique sur un bouton qu’à jouer un morceau de classique…
Passons donc au code commenté:
-
import sun.audio.*;
// Le fichier "xxx.au" à ouvrir
File fichier = null;
// les données audio...
AudioData donnees = null;
// le flux d'entrée pour ces données
InputStream inputStr = null;
/*
* Méthode permettant d'ouvrir un fichier audio
*/
public void open() {
// "this" si la classe dans laquelle se trouve la méthode étend de Jframe ou Frame, ce qui est le cas classique
FileDialog fd = new FileDialog(this, "Sélectionner un fichier AU");
// afficher le FileChooser...
fd.show();
try {
// assigner à notre fichier de départ, qui était "null" jusqu'à présent, un fichier réel
fichier = new File(fd.getDirectory() + "/" + fd.getFile());
// si l'assignation a bien fonctionné, le fichier n'est plus "null", donc:
if (fichier != null) {
// ouvrir notre flux d'entrée sur ce fichier
FileInputStream fis = new FileInputStream(fichier);
// créer un flux d'entrée spécial pour les fichiers audio
AudioStream as = new AudioStream(fis);
// et rediriger ce flux vers notre objet AudioData
donnees = as.getData();
}
}
catch (IOException e) {
System.err.println(e);
}
}
/*
* Cette méthode permet de jouer le son enregistré dans notre fichier
*/
public void play() {
// si une lecture est déjà en cours, l'arrêter
stop();
// s'il n'y a aucun son à jouer, ouvrir un fichier
if (donnees == null) open();
// s'il y a des données à jouer:
if (donnees != null) {
// Créer un flux de données audio, lancer la lecture de ce flux, et le rediriger dans notre flux d'entrée
AudioDataStream ads = new AudioDataStream(donnees);
// lancer la lecture:
AudioPlayer.player.start(ads);
inputStr = ads;
}
}
/*
* Arrete de jouer le son en cours
*/
public void stop() {
if (inputStr != null) {
AudioPlayer.player.stop(inputStr);
inputStr = null;
}
}
/*
* Jouer le son de manière continue (facultatif)
*/
public void loop() {
stop();
if (donnees == null) open();
if (donnees != null) {
// pour jouer un son de manière continue, on a besoin d'un flux spécial:
// le ContinuousAudiodataStream, créé avec notre objet AudioData comme paramètre
ContinuousAudioDataStream cads = new ContinuousAudioDataStream(donnees);
// lancer la lecture:
AudioPlayer.player.start(cads);
inputStr = cads;
}
}
Ecrit par Narcanes pour l’association Java-France/Jgflsoft
www.java-france.com / www.jgflsoft.com
Réédité pour Valhalla GFBLOG.
Montpellier, 18 octobre 2001.