Newsletter sign-up
View all newsletters

Enterprise Java Newsletter
Stay up to date on the latest tutorials and Java community news posted on JavaWorld

Java Tip 24: How to play audio in applications

Here's a step-by-step guide to playing audio files in a Java application

  • Digg
  • Reddit
  • SlashDot
  • Stumble
  • del.icio.us
  • Technorati
  • dzone
Playing audio files in Java applications is not officially supported in the current release of Java. But fear not, there is a way! This tip will show you how -- starting with a description of the basic steps involved in playing audio clips in Java applets and then moving on to Java application support.

Playing audio clips in applets is quite simple and involves the following steps:

  • Create an AudioClip object
  • Load .au sound file into AudioClip
  • Play sounds once or loop continuously
  • Stop playback


Here's how the code for these steps looks:

import java.applet.*;
AudioClip ac = getAudioClip(getCodeBase(), soundFile);
ac.play();   //play once
ac.stop();   //stop playing
ac.loop();   //play continuously


It would seem logical to use this same code to play audio clips in a Java application. Unfortunately, if you do that you will get errors from the compiler. Why? Because the AudioClip object and the getAudioClip() method are part of the java.applet package -- and are not part of applications. The good news is we can dive down and make things work ourselves.

The trick to solving this problem is to use some undocumented features that are provided by Sun in its JDK. Taking a peek inside the classes.zip file from the Sun JDK (using any of the various zipfile utilities), we find not only the standard Java packages such as java.applet but also sun.audio. (These are in the directory sun/audio.)

The sun.audio package contains everything we need to be able to play audio clips! Here's the code:

import  sun.audio.*;    //import the sun.audio package
import  java.io.*;
//** add this into your application code as appropriate
// Open an input stream  to the audio file.
InputStream in = new FileInputStream(Filename);
// Create an AudioStream object from the input stream.
AudioStream as = new AudioStream(in);         
// Use the static class member "player" from class AudioPlayer to play
// clip.
AudioPlayer.player.start(as);            
// Similarly, to stop the audio.
AudioPlayer.player.stop(as); 


To use a URL as the audio stream source, substitute the following for the input stream and audio stream setup:

AudioStream as = new AudioStream (url.openStream());


Playing the audio stream continuously adds a bit more complexity:

// Create audio stream as discussed previously.
// Create AudioData source.
AudioData data = as.getData();
// Create ContinuousAudioDataStream.
ContinuousAudioDataStream cas = new ContinuousAudioDataStream (data);
// Play audio.
AudioPlayer.player.play (cas);
// Similarly, to stop the audio.
AudioPlayer.player.stop (cas);


And there you have it. Remember, this technique uses undocumented features; there are no guarantees that it will work with anything but the current Sun JDK.

About the author

Chong Ser Wah is a consultant at the Competency Centre for Java in Singapore. Check out the center's Java Cup Competition.
  • Digg
  • Reddit
  • SlashDot
  • Stumble
  • del.icio.us
  • Technorati
  • dzone
Comments (16)
Login
Forgot your account info?

Alternative: convert files to native java codeBy Anonymous on January 18, 2010, 1:29 amThere is an alternative to importing the sound files which works in both applets and applications: convert the audio files into .java files and simply use them in...

Reply | Read entire comment

RE: audiodata not workingBy Anonymous on December 5, 2009, 1:36 ampossibly because the format ur trying to load is not a .wav...which is a stream of sound.

Reply | Read entire comment

Holy shitBy Anonymous on December 3, 2009, 3:05 pmthis article is from 97!!

Reply | Read entire comment

javascriptBy Anonymous on November 25, 2009, 1:46 amshuold bring animation on the screen from time to time as specified by the user.

Reply | Read entire comment

Another more standart wayBy Anonymous on November 12, 2009, 3:12 amAlthough you can't use AudioClip you can use the javax.sound.sampled.Clip interface: Clip clickClip = AudioSystem.getClip(); AudioInputStream ais = AudioSystem.getAudioInputStream(waveFile); clickClip.open(ais); clickClip.loop(times...

Reply | Read entire comment

View all comments

Add comment
Anonymous comments subject to approval. Register here for member benefits.
Have a JavaWorld account? Log in here. Register now for a free account.
Resources