Sound Application
/* From http://java.sun.com/docs/books/tutorial/index.html */ /* * Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * -Redistribution of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * -Redistribution in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * * Neither the name of Sun Microsystems, Inc. or the names of contributors may * be used to endorse or promote products derived from this software without * specific prior written permission. * * This software is provided "AS IS," without a warranty of any kind. ALL * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. */ import java.applet.Applet; import java.applet.AudioClip; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.net.MalformedURLException; import java.net.URL; import javax.swing.JApplet; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class SoundApplication extends JPanel implements ActionListener, ItemListener { SoundList soundList; String auFile = "spacemusic.au"; String aiffFile = "flute+hrn+mrmba.aif"; String midiFile = "trippygaia1.mid"; String rmfFile = "jungle.rmf"; String wavFile = "bottle-open.wav"; String chosenFile; AudioClip onceClip, loopClip; URL codeBase; JComboBox formats; JButton playButton, loopButton, stopButton; JLabel status; boolean looping = false; public SoundApplication() { String[] fileTypes = { auFile, aiffFile, midiFile, rmfFile, wavFile }; formats = new JComboBox(fileTypes); formats.setSelectedIndex(0); chosenFile = (String) formats.getSelectedItem(); formats.addItemListener(this); playButton = new JButton("Play"); playButton.addActionListener(this); loopButton = new JButton("Loop"); loopButton.addActionListener(this); stopButton = new JButton("Stop"); stopButton.addActionListener(this); stopButton.setEnabled(false); status = new JLabel( "Click Play or Loop to play the selected sound file."); JPanel controlPanel = new JPanel(); controlPanel.add(formats); controlPanel.add(playButton); controlPanel.add(loopButton); controlPanel.add(stopButton); JPanel statusPanel = new JPanel(); statusPanel.add(status); add(controlPanel); add(statusPanel); startLoadingSounds(); } public void itemStateChanged(ItemEvent e) { chosenFile = (String) formats.getSelectedItem(); soundList.startLoading(chosenFile); } void startLoadingSounds() { //Start asynchronous sound loading. try { codeBase = new URL("file:" + System.getProperty("user.dir") + "/"); } catch (MalformedURLException e) { System.err.println(e.getMessage()); } soundList = new SoundList(codeBase); soundList.startLoading(auFile); soundList.startLoading(aiffFile); soundList.startLoading(midiFile); soundList.startLoading(rmfFile); soundList.startLoading(wavFile); } public void stop() { onceClip.stop(); //Cut short the one-time sound. if (looping) { loopClip.stop(); //Stop the sound loop. } } public void start() { if (looping) { loopClip.loop(); //Restart the sound loop. } } public void actionPerformed(ActionEvent event) { //PLAY BUTTON Object source = event.getSource(); if (source == playButton) { //Try to get the AudioClip. onceClip = soundList.getClip(chosenFile); stopButton.setEnabled(true); onceClip.play(); //Play it once. status.setText("Playing sound " + chosenFile + "."); if (onceClip == null) { status.setText("Sound " + chosenFile + " not loaded yet."); } return; } //START LOOP BUTTON if (source == loopButton) { loopClip = soundList.getClip(chosenFile); looping = true; loopClip.loop(); //Start the sound loop. loopButton.setEnabled(false); //Disable start button. stopButton.setEnabled(true); status.setText("Playing sound " + chosenFile + " continuously."); if (loopClip == null) { status.setText("Sound " + chosenFile + " not loaded yet."); } return; } //STOP LOOP BUTTON if (source == stopButton) { if (looping) { looping = false; loopClip.stop(); //Stop the sound loop. loopButton.setEnabled(true); //Enable start button. } else if (onceClip != null) { onceClip.stop(); } stopButton.setEnabled(false); status.setText("Stopped playing " + chosenFile + "."); return; } } public static void main(String s[]) { WindowListener l = new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }; JFrame f = new JFrame("SoundApplication"); f.addWindowListener(l); f.getContentPane().add(new SoundApplication()); f.setSize(new Dimension(400, 100)); f.show(); } } /** * Loads and holds a bunch of audio files whose locations are specified relative * to a fixed base URL. */ class SoundList extends java.util.Hashtable { JApplet applet; URL baseURL; public SoundList(URL baseURL) { super(5); //Initialize Hashtable with capacity of 5 entries. this.baseURL = baseURL; } public void startLoading(String relativeURL) { new SoundLoader(this, baseURL, relativeURL); } public AudioClip getClip(String relativeURL) { return (AudioClip) get(relativeURL); } public void putClip(AudioClip clip, String relativeURL) { put(relativeURL, clip); } } class SoundLoader extends Thread { SoundList soundList; URL completeURL; String relativeURL; public SoundLoader(SoundList soundList, URL baseURL, String relativeURL) { this.soundList = soundList; try { completeURL = new URL(baseURL, relativeURL); } catch (MalformedURLException e) { System.err.println(e.getMessage()); } this.relativeURL = relativeURL; setPriority(MIN_PRIORITY); start(); } public void run() { AudioClip audioClip = Applet.newAudioClip(completeURL); soundList.putClip(audioClip, relativeURL); } }