package jass.generators;
import jass.engine.*;
import jass.render.*;
import javax.sound.sampled.*;
import java.io.*;
import java.net.*;
/**
A buffer from an audio file or URL, streamed off the source.
Assumes 16 bit audio format.
@author Kees van den Doel (kvdoel@cs.ubc.ca)
*/
public class StreamingAudioFileBuffer {
/** Sampling rate in Hertz. */
public float srate;
/** Bytes per frame (2 for mono, 4 stereo, etc.) */
public int bytesPerFrame;
/** # frames */
public long nFrames;
/** bytes */
public int numBytes;
/** Bits per sample */
public int bitsPerSample;
/** Number of channels */
public int nChannels;
/** Length of buffer as floats, should be numBytes/2. */
public int bufsz;
// to get audio data
public AudioInputStream audioInputStream = null;
// temp buffer
private byte[] audioBytes = null;
/** Construct buffer from named file.
@param fn Audio file name.
*/
public StreamingAudioFileBuffer(String fn) throws UnsupportedAudioFileFormatException {
loadAudio(fn);
}
/** Construct buffer from url.
@param url Audiofile url.
*/
public StreamingAudioFileBuffer(URL url) throws UnsupportedAudioFileFormatException {
loadAudio(url);
}
/** Close stream */
public void close() {
try {
audioInputStream.close();
} catch(Exception e) {
System.out.println(e);
}
audioInputStream = null;
}
/** Open and read audio file properties and prepare for streaming
@param fn Audio file name.
*/
protected void loadAudio(String fn) throws UnsupportedAudioFileFormatException {
File fileIn = new File(fn);
try {
audioInputStream = AudioSystem.getAudioInputStream(fileIn);
} catch (Exception e) {
System.out.println("Error reading audio file " + fn);
}
doRestOfLoad();
}
/** Open and read audio URL properties and prepare for streaming
@param url Audiofile url.
*/
protected void loadAudio(URL url) throws UnsupportedAudioFileFormatException {
try {
audioInputStream = AudioSystem.getAudioInputStream(url);
} catch (Exception e) {
System.out.println(e+" Error reading audio url " + url);
}
doRestOfLoad();
}
private void doRestOfLoad() throws UnsupportedAudioFileFormatException {
bytesPerFrame = audioInputStream.getFormat().getFrameSize();
System.out.println("marksupported="+audioInputStream.markSupported());
bitsPerSample = audioInputStream.getFormat().getSampleSizeInBits();
if(bitsPerSample != 16) {
throw new UnsupportedAudioFileFormatException("not 16 bits audio");
}
nChannels = audioInputStream.getFormat().getChannels();
if(nChannels != 1) {
throw new UnsupportedAudioFileFormatException("not 1 channel audio");
}
srate = (float)audioInputStream.getFormat().getSampleRate();
nFrames = audioInputStream.getFrameLength();
numBytes = (int)nFrames * bytesPerFrame;
bufsz = numBytes/2;
int readLimit = numBytes;
audioInputStream.mark(readLimit);
}
}