package jass.generators;
import jass.engine.*;
import jass.render.*;
import javax.sound.sampled.*;
import java.io.*;
import java.net.*;
/**
A buffer loaded from an audio file or URL.
@author Kees van den Doel (kvdoel@cs.ubc.ca)
*/
public class AudioFileBuffer {
/** 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. */
public int bufsz;
/** Buffer. */
public float[] buf;
/** Construct buffer from named file.
@param fn Audio file name.
*/
public AudioFileBuffer(String fn) {
loadAudio(fn);
}
/** Construct buffer from url.
@param url Audiofile url.
*/
public AudioFileBuffer(URL url) {
loadAudio(url);
}
/** Load audio file.
@param fn Audio file name.
*/
public void loadAudio(String fn) {
int totalFramesRead = 0;
File fileIn = new File(fn);
byte[] audioBytes = null;
try {
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(fileIn);
bytesPerFrame = audioInputStream.getFormat().getFrameSize();
bitsPerSample = audioInputStream.getFormat().getSampleSizeInBits();
nChannels = audioInputStream.getFormat().getChannels();
srate = (float)audioInputStream.getFormat().getSampleRate();
nFrames = audioInputStream.getFrameLength();
numBytes = (int)nFrames * bytesPerFrame;
audioBytes = new byte[numBytes];
try {
int numBytesRead = 0;
int numFramesRead = 0;
while ((numBytesRead = audioInputStream.read(audioBytes)) != -1);
audioInputStream.close();
} catch (Exception ex) {
System.out.println("Error loading audio file " + fn);
}
} catch (Exception e) {
System.out.println("Error reading audio file " + fn);
}
bufsz = numBytes/2;
buf = new float[bufsz];
FormatUtils.byteToFloat(buf,audioBytes,bufsz);
}
/** Load audio url.
@param url Audiofile url.
*/
public void loadAudio(URL url) {
int totalFramesRead = 0;
byte[] audioBytes = null;
try {
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(url);
bytesPerFrame = audioInputStream.getFormat().getFrameSize();
bitsPerSample = audioInputStream.getFormat().getSampleSizeInBits();
nChannels = audioInputStream.getFormat().getChannels();
srate = (float)audioInputStream.getFormat().getSampleRate();
nFrames = audioInputStream.getFrameLength();
numBytes = (int)nFrames * bytesPerFrame;
audioBytes = new byte[numBytes];
try {
int totalBytesRead = 0;
int bytesRead;
int offset = 0;
int bytesToRead=0;
do {
bytesToRead = audioInputStream.available();
bytesRead = audioInputStream.read(audioBytes,offset,bytesToRead);
offset += bytesRead;
totalBytesRead += bytesRead;
} while(totalBytesRead < numBytes);
audioInputStream.close();
} catch (Exception ex) {
System.out.println("Error loading audio url " + url);
}
} catch (Exception e) {
System.out.println(e+" Error reading audio url " + url);
}
bufsz = numBytes/2;
buf = new float[bufsz];
FormatUtils.byteToFloat(buf,audioBytes,bufsz);
}
}