Comment jouer un son dans une application Java ?

jeudi 18 octobre 2001

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é:

  1. import sun.audio.*;
  2. // Le fichier "xxx.au" à ouvrir
  3. File fichier = null;
  4. // les données audio...
  5. AudioData donnees = null;
  6. // le flux d'entrée pour ces données
  7. InputStream inputStr = null;
  8. /*
  9. * Méthode permettant d'ouvrir un fichier audio
  10. */
  11. public void open() {
  12. // "this" si la classe dans laquelle se trouve la méthode étend de Jframe ou Frame, ce qui est le cas classique
  13. FileDialog fd = new FileDialog(this, "Sélectionner un fichier AU");
  14. // afficher le FileChooser...
  15. fd.show();
  16. try {
  17. // assigner à notre fichier de départ, qui était "null" jusqu'à présent, un fichier réel
  18. fichier = new File(fd.getDirectory() + "/" + fd.getFile());
  19. // si l'assignation a bien fonctionné, le fichier n'est plus "null", donc:
  20. if (fichier != null) {
  21. // ouvrir notre flux d'entrée sur ce fichier
  22. FileInputStream fis = new FileInputStream(fichier);
  23. // créer un flux d'entrée spécial pour les fichiers audio
  24. AudioStream as = new AudioStream(fis);
  25. // et rediriger ce flux vers notre objet AudioData
  26. donnees = as.getData();
  27. }
  28. }
  29. catch (IOException e) {
  30. System.err.println(e);
  31. }
  32. }
  33. /*
  34. * Cette méthode permet de jouer le son enregistré dans notre fichier
  35. */
  36. public void play() {
  37. // si une lecture est déjà en cours, l'arrêter
  38. stop();
  39. // s'il n'y a aucun son à jouer, ouvrir un fichier
  40. if (donnees == null) open();
  41. // s'il y a des données à jouer:
  42. if (donnees != null) {
  43. // Créer un flux de données audio, lancer la lecture de ce flux, et le rediriger dans notre flux d'entrée
  44. AudioDataStream ads = new AudioDataStream(donnees);
  45. // lancer la lecture:
  46. AudioPlayer.player.start(ads);
  47. inputStr = ads;
  48. }
  49. }
  50. /*
  51. * Arrete de jouer le son en cours
  52. */
  53. public void stop() {
  54. if (inputStr != null) {
  55. AudioPlayer.player.stop(inputStr);
  56. inputStr = null;
  57. }
  58. }
  59. /*
  60. * Jouer le son de manière continue (facultatif)
  61. */
  62. public void loop() {
  63. stop();
  64. if (donnees == null) open();
  65. if (donnees != null) {
  66. // pour jouer un son de manière continue, on a besoin d'un flux spécial:
  67. // le ContinuousAudiodataStream, créé avec notre objet AudioData comme paramètre
  68. ContinuousAudioDataStream cads = new ContinuousAudioDataStream(donnees);
  69. // lancer la lecture:
  70. AudioPlayer.player.start(cads);
  71. inputStr = cads;
  72. }
  73. }

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.

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é:

  1. import sun.audio.*;
  2. // Le fichier "xxx.au" à ouvrir
  3. File fichier = null;
  4. // les données audio...
  5. AudioData donnees = null;
  6. // le flux d'entrée pour ces données
  7. InputStream inputStr = null;
  8. /*
  9. * Méthode permettant d'ouvrir un fichier audio
  10. */
  11. public void open() {
  12. // "this" si la classe dans laquelle se trouve la méthode étend de Jframe ou Frame, ce qui est le cas classique
  13. FileDialog fd = new FileDialog(this, "Sélectionner un fichier AU");
  14. // afficher le FileChooser...
  15. fd.show();
  16. try {
  17. // assigner à notre fichier de départ, qui était "null" jusqu'à présent, un fichier réel
  18. fichier = new File(fd.getDirectory() + "/" + fd.getFile());
  19. // si l'assignation a bien fonctionné, le fichier n'est plus "null", donc:
  20. if (fichier != null) {
  21. // ouvrir notre flux d'entrée sur ce fichier
  22. FileInputStream fis = new FileInputStream(fichier);
  23. // créer un flux d'entrée spécial pour les fichiers audio
  24. AudioStream as = new AudioStream(fis);
  25. // et rediriger ce flux vers notre objet AudioData
  26. donnees = as.getData();
  27. }
  28. }
  29. catch (IOException e) {
  30. System.err.println(e);
  31. }
  32. }
  33. /*
  34. * Cette méthode permet de jouer le son enregistré dans notre fichier
  35. */
  36. public void play() {
  37. // si une lecture est déjà en cours, l'arrêter
  38. stop();
  39. // s'il n'y a aucun son à jouer, ouvrir un fichier
  40. if (donnees == null) open();
  41. // s'il y a des données à jouer:
  42. if (donnees != null) {
  43. // Créer un flux de données audio, lancer la lecture de ce flux, et le rediriger dans notre flux d'entrée
  44. AudioDataStream ads = new AudioDataStream(donnees);
  45. // lancer la lecture:
  46. AudioPlayer.player.start(ads);
  47. inputStr = ads;
  48. }
  49. }
  50. /*
  51. * Arrete de jouer le son en cours
  52. */
  53. public void stop() {
  54. if (inputStr != null) {
  55. AudioPlayer.player.stop(inputStr);
  56. inputStr = null;
  57. }
  58. }
  59. /*
  60. * Jouer le son de manière continue (facultatif)
  61. */
  62. public void loop() {
  63. stop();
  64. if (donnees == null) open();
  65. if (donnees != null) {
  66. // pour jouer un son de manière continue, on a besoin d'un flux spécial:
  67. // le ContinuousAudiodataStream, créé avec notre objet AudioData comme paramètre
  68. ContinuousAudioDataStream cads = new ContinuousAudioDataStream(donnees);
  69. // lancer la lecture:
  70. AudioPlayer.player.start(cads);
  71. inputStr = cads;
  72. }
  73. }

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.