Jouer un son                  

Jouer un son

alt : l'applet n'est pas visible par votre navigateur ; pour voir l'application, vous devez télécharger le code, le compiler et l'exécuter
Essayez d'appuyer sur le bouton de l'applet, si elle est visible, vous devriez entendre un son. Notre exemple correspond à cette applet.

On peut souhaiter que certaines applications produisent des sons. Il faut alors construire, pour le son qu'on souhaite jouer, une instance de la classe java.applet.AudioClip ; un tel objet possède la méthode play qui joue le son correspondant. Pour construire l'instance de AudioClip, on peut utiliser la méthode statique newAudioClip de la classe java.applet.Applet qui reçoit en argument une instance de la classe URL correspondant au fichier du son.

Nous proposons ci-dessous une petite application où une interface graphique se présente comme ci-contre. Quand on appuie sur le bouton jouer, un son se fait entendre.

Deux techniques sont proposées pour obtenir l'instance de type URL correspondant au fichier du son.

La première technique utilise la méthode getResource de la class Class ; notons rep le répertoire du bytecode de la classe invoquée (dans notre exemple, la classe JouerSon) ou, si la classe appartient à un paquetage, le répertoire qui contient le répertoire racine du paquetage ; le fichier du son doit être dans rep ou dans un sous répertoire de rep ; on donne à la méthode getResource le chemin relatif du fichier du son par rapport à rep ; la méthode renvoie un objet de type URL correspondant au fichier de son.

La seconde technique construit directement l'URL correspondant au fichier de son. On utilise pour cela un constructeur de la classe URL recevant en argument un chemin d'accès au fichier (soit par « file », soit par « http », comme on le voit à partir de l'exemple). Si on utilise la localisation par « file » et un chemin relatif, ce chemin relatif doit être indiqué par rapport au répertoire où on exécute l'application.

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.event.ActionListener;

@SuppressWarnings("serial")
class IHMSon extends JPanel implements ActionListener {
	private JButton jouer = new JButton("jouer");
	private java.applet.AudioClip son;

	IHMSon() {
		// Premiere possibilite
		java.net.URL url =
			JouerSon.class.getResource("sons/oiseau.au");

		/* Seconde possibilite
			java.net.URL url = null; 
			try {	
			url = new java.net.URL("http://www.infres.enst.fr/~hudry/coursjava/images/sons/oiseau.au");
			} 
			catch (java.net.MalformedURLException exc) {
			exc.printStackTrace();
		}  */

		son = java.applet.Applet.newAudioClip(url);

		add(jouer);
		jouer.addActionListener(this);
	} 

	public void actionPerformed(java.awt.event.ActionEvent e) {
		son.play();
	}
}

class JouerSon {
	public static void main(String[] argv) {
		JFrame fenetre = new JFrame();
		fenetre.setContentPane(new IHMSon());
		fenetre.pack();
		fenetre.setLocation(100, 100);
		fenetre.setVisible(true);
		fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

JouerSon.class.getResource("sons/oiseau.au"); : Son.class est l'objet de type Class correspondant à la classe Son ; , la classe Son n'étant pas ici dans un paquetage, le nom du fichier doit être indiqué relativement au répertoire contenant le bytecode de la classe Son.
url = new java.net.URL(http://www.infres.enst.fr/" + "~charon/coursJava/images/sons/oiseau.au"); : cette instruction peut aussi être remplacée par une instruction de la forme :
    url = new java.net.URL("file:///D:/coursjava/oiseau.au");
java.applet.Applet.newAudioClip(url); : la méthode statique newAudioClip renvoie un objet qui permet de jouer le son.
son.play(); : cette instruction permet d'entendre le son.

© Irène Charon, Télecom ParisTech, 2011