/******************************************************************************
* Compilation: javac StdAudio.java
* Execution: java StdAudio
* Dependencies: none
*
* Simple library for reading, writing, and manipulating .wav files.
*
*
* Limitations
* -----------
* - Assumes the audio is monaural, little endian, with sampling rate
* of 44,100
* - check when reading .wav files from a .jar file ?
*
******************************************************************************/
importjavax.sound.sampled.AudioFileFormat;importjavax.sound.sampled.AudioFormat;importjavax.sound.sampled.AudioInputStream;importjavax.sound.sampled.AudioSystem;importjavax.sound.sampled.Clip;importjavax.sound.sampled.DataLine;importjavax.sound.sampled.LineUnavailableException;importjavax.sound.sampled.SourceDataLine;importjavax.sound.sampled.UnsupportedAudioFileException;importjava.io.ByteArrayInputStream;importjava.io.File;importjava.io.IOException;importjava.io.InputStream;/*** Standard audio. This class provides a basic capability for
* creating, reading, and saving audio.
*
* The audio format uses a sampling rate of 44,100 Hz, 16-bit, monaural.
*
*
* For additional documentation, see Section 1.5 of
* Computer Science: An Interdisciplinary Approach by Robert Sedgewick and Kevin Wayne.
*
*@authorRobert Sedgewick
*@authorKevin Wayne*/
public final classStdAudio {/*** The sample rate: 44,100 Hz for CD quality audio.*/
public static final int SAMPLE_RATE = 16000;//44100;
private static final int BYTES_PER_SAMPLE = 2; //16-bit audio
private static final int BITS_PER_SAMPLE = 16; //16-bit audio
private static final double MAX_16_BIT = 32768;private static final int SAMPLE_BUFFER_SIZE = 4096;private static final int MONO = 1;private static final int STEREO = 2;private static final boolean LITTLE_ENDIAN = false;private static final boolean BIG_ENDIAN = true;private static final boolean SIGNED = true;private static final boolean UNSIGNED = false;private static SourceDataLine line; //to play the sound
private static byte[] buffer; //our internal buffer
private static int bufferSize = 0; //number of samples currently in internal buffer
privateStdAudio() {//can not instantiate
}//static initializer
static{
init();
}//open up an audio stream
private static voidinit() {try{//44,100 Hz, 16-bit audio, mono, signed PCM, little endian
AudioFormat format = new AudioFormat((float) SAMPLE_RATE, BITS_PER_SAMPLE, MONO, SIGNED, LITTLE_ENDIAN);
DataLine.Info info= new DataLine.Info(SourceDataLine.class, format);
line=(SourceDataLine) AudioSystem.getLine(info);
line.open(format, SAMPLE_BUFFER_SIZE*BYTES_PER_SAMPLE);//the internal buffer is a fraction of the actual buffer size, this choice is arbitrary//it gets divided because we can't expect the buffered data to line up exactly with when//the s