Jeg har en mistanke om at det kun kan lade sig gøre med Java Sound API'en, så jeg rodede lidt med den og fik nedenstående (Der er et par uklarheder - hvilken mixer skal man vælge - og på hvilket grundlag? Kan Clip ikke oprettes lidt nemmere? Er listen af ikke-understøttede formater endeløs?). Men følgende virker da:
public class Sound
{
public static void main( String[] args ) throws Exception
{
//hent fil som skal afspilles
java.net.URL url
= new java.net.URL("
http://www.jokes.thefunnybone.com/waves/Darth.wav");
java.io.DataInputStream stream
= new java.io.DataInputStream(url.openConnection().getInputStream());
byte[] data = new byte[18000];//ahem!
stream.readFully( data );
stream.close();
// find formatet
javax.sound.sampled.AudioFormat format
= javax.sound.sampled.AudioSystem.getAudioFileFormat(url).getFormat();
// En mixer skal man have, så vi kan sende lyd ud gennem
// en af dens kanaler
javax.sound.sampled.Mixer.Info[] mixerInfos
= javax.sound.sampled.AudioSystem.getMixerInfo();
// vi skriver lige mixerne ud
for( int i = 0; i < mixerInfos.length; i++ )
{
System.out.println( "mixer " + i + "=" + mixerInfos[i]);
}
//whatever, vi prøver med den første mixer (og håber en sådan findes..)
javax.sound.sampled.Mixer mixer
= javax.sound.sampled.AudioSystem.getMixer(mixerInfos[0]);
// opret et clip som kan spille lyd gennem mixeren (en kanal)
javax.sound.sampled.Clip clip
= (javax.sound.sampled.Clip)mixer.getLine(
new javax.sound.sampled.Line.Info(
Class.forName("javax.sound.sampled.Clip")) );
// clip initialiseres med data fra filen
clip.open( format, data, 0, data.length);
// vi vil gerne vide, hvornår afspilning stopper
clip.addLineListener
(
new javax.sound.sampled.LineListener()
{
public void update( javax.sound.sampled.LineEvent e )
{
if( e.getType() == javax.sound.sampled.LineEvent.Type.STOP )
{
System.out.println("Sound has stopped");
}
}
}
);
// play it, sam
clip.start();
}
}