站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题播放一个目录下的所有声音

播放一个目录下的所有声音

摘要: 播放一个目录下的所有声音

</td> </tr> <tr> <td height="35" valign="top" class="ArticleTeitle"> <table width="667" border="0"> <tr> <td width="382">import javax.sound.midi.*;
import javax.sound.sampled.*;
import java.io.File;
import java.io.InputStream;
import java.io.FileInputStream;
import java.io.BufferedInputStream;
import java.util.Vector;
import java.net.URL;


/**
* A simple player for sampled sound files.
*
*
* @author Steve Potts
*/ </td> <td width="275"> </td> </tr> </table>
public class SimpleSoundPlayer implements Runnable, LineListener, MetaEventListener
{

final int bufSize = 16384;

Vector sounds = new Vector();
Thread thread;
Sequencer sequencer;
boolean midiEOM, audioEOM;
Synthesizer synthesizer;
MidiChannel channels[];
Object currentSound;
String currentName;
double duration;
int num;
boolean bump;
boolean paused = false;

String errStr;


public void open()
{
try
{
sequencer = MidiSystem.getSequencer();

if (sequencer instanceof Synthesizer)
{
synthesizer = (Synthesizer)sequencer;
channels = synthesizer.getChannels();
}

} catch (Exception ex)
{ ex.printStackTrace(); return; }
sequencer.addMetaEventListener(this);

}


public void close()
{
if (sequencer != null)
{
sequencer.close();
}
}

private void addSound(File file)
{
sounds.add(file);
}


public boolean loadSound(Object object)
{
duration = 0.0;

currentName = ((File) object).getName();
try
{
currentSound = AudioSystem.getAudioInputStream((File) object);
} catch(Exception e1)
{
try
{
FileInputStream is = new FileInputStream((File) object);
currentSound = new BufferedInputStream(is, 1024);
} catch (Exception e3)
{
e3.printStackTrace();
currentSound = null;
return false;
}
//}
}

// user pressed stop or changed tabs while loading
if (sequencer == null)
{
currentSound = null;
return false;
}

if (currentSound instanceof AudioInputStream)
{
try
{
AudioInputStream stream = (AudioInputStream) currentSound;
AudioFormat format = stream.getFormat();

/**
* we can't yet open the device for ALAW/ULAW playback,
* convert ALAW/ULAW to PCM
*/

if ((format.getEncoding() == AudioFormat.Encoding.ULAW) ||
(format.getEncoding() == AudioFormat.Encoding.ALAW))
{
AudioFormat tmp = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
format.getSampleRate(),
format.getSampleSizeInBits() * 2,
format.getChannels(),
format.getFrameSize() * 2,
format.getFrameRate(),
true);
stream = AudioSystem.getAudioInputStream(tmp, stream);
format = tmp;
}
DataLine.Info info = new DataLine.Info(
Clip.class,
stream.getFormat(),
((int) stream.getFrameLength() *
format.getFrameSize()));

Clip clip = (Clip) AudioSystem.getLine(info);
clip.addLineListener(this);
clip.open(stream);
currentSound = clip;
//seekSlider.setMaximum((int) stream.getFrameLength());
} catch (Exception ex)
{
ex.printStackTrace();
currentSound = null;
return false;
}
} else if (currentSound instanceof Sequence || currentSound instanceof BufferedInputStream)
{
try
{
sequencer.open();
if (currentSound instanceof Sequence)
{
sequencer.setSequence((Sequence) currentSound);
} else
{
sequencer.setSequence((BufferedInputStream) currentSound);
}

} catch (InvalidMidiDataException imde)
{
System.out.println("Unsupported audio file.");
currentSound = null;
return false;
} catch (Exception ex)
{
ex.printStackTrace();
currentSound = null;
return false;
}
}

duration = getDuration();

return true;
}


public void playSound()
{
midiEOM = audioEOM = bump = false;
if (currentSound instanceof Sequence || currentSound instanceof BufferedInputStream && thread != null)
{
sequencer.start();
while (!midiEOM && thread != null && !bump)
{
try
{ thread.sleep(99); } catch (Exception e)
{break;}
}
sequencer.stop();
sequencer.close();
} else if (currentSound instanceof Clip)
{
Clip clip = (Clip) currentSound;
clip.start();
try
{ thread.sleep(99); } catch (Exception e)
{ }
while ((paused || clip.isActive()) && thread != null && !bump)
{
try
{ thread.sleep(99); } catch (Exception e)
{break;}
}
clip.stop();
clip.close();
}
currentSound = null;
}


public double getDuration()
{
double duration = 0.0;
if (currentSound instanceof Sequence)
{
duration = ((Sequence) currentSound).getMicrosecondLength() / 1000000.0;
} else if (currentSound instanceof BufferedInputStream)
{
duration = sequencer.getMicrosecondLength() / 1000000.0;
} else if (currentSound instanceof Clip)
{
Clip clip = (Clip) currentSound;
duration = clip.getBufferSize() /
(clip.getFormat().getFrameSize() * clip.getFormat().getFrameRate());
}
return duration;
}


public void update(LineEvent event)
{
if (event.getType() == LineEvent.Type.STOP && !paused)
{
audioEOM = true;
}
}


public void meta(MetaMessage message)
{
if (message.getType() == 47)
{ // 47 is end of track
midiEOM = true;
}
}


private void reportStatus(String msg)
{
if ((errStr = msg) != null)
{
System.out.println(errStr);
}
}


public Thread getThread()
{
return thread;
}

public void start()
{
thread = new Thread(this);
thread.setName("SimpleSamplePlayer");
thread.start();
}

public void stop()
{
if (thread != null)
{
thread.interrupt();
}
thread = null;
}

public void run()
{
for (; num < sounds.size() && thread != null; num++)
{
if( loadSound(sounds.get(num)) == true )
{
playSound();
}
// take a little break between sounds
try
{ thread.sleep(222); } catch (Exception e)
{break;}
}
num = 0;

thread = null;
currentName = null;
currentSound = null;
System.out.println("Press to exit");
}

public void loadSounds(String name)
{
try
{
File file = new File(name);
if (file != null && file.isDirectory())
{
String files[] = file.list();
for (int i = 0; i < files.length; i++)
{
File leafFile = new File(file.getAbsolutePath(), files[i]);
addSound(leafFile);
}
}
} catch (Exception e)
{
System.out.println("Exception " + e);
}
}

public static void main(String args[])
{
//every file in this directory will be played
String media = "sounds";

final SimpleSoundPlayer ssp = new SimpleSoundPlayer();
ssp.open();

//we first load the sound file names in a vector
ssp.loadSounds(media);


//Then we start a thread to play the sounds
ssp.start();

//We have to wait for a while so that the process doesn't
//terminate, killing the playing thread
try
{ Thread.sleep(500000); } catch (Exception e)
{System.out.println("Interrupted");}

//close and exit
ssp.close();
System.exit(0);
}

}</td> </tr> <tr>


↑返回目录
前一篇: 圆周率的计算
后一篇: 移动背景图像