package zero1hd.wavedecoder; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.security.InvalidParameterException; import com.badlogic.gdx.Gdx; public class WavInfo { private int channels; private double sampleRate; private int dataSize; private int byteRate; private FileInputStream audioFile; private DataInputStream readStream; private String fileName; public WavInfo(File file) throws InvalidParameterException { try { fileName = file.getName(); audioFile = new FileInputStream(file); initDataStream(); getHeaderInfo(); closeStreams(); } catch (IOException e) { e.printStackTrace(); } } protected void getHeaderInfo() throws IOException { if (!readBytesToString(4).equals("RIFF")) { //4 for RIFF tag throw new InvalidParameterException("RIFF tag not found in header."); } dataSize = littleEndianIntBytes(); //4 for Chunk size if (!readBytesToString(4).equals("WAVE")) { //4 for WAVE tag throw new InvalidParameterException("WAVE format tag not found."); } if (!readBytesToString(4).equals("fmt ")) { //4 for 'fmt ' throw new InvalidParameterException("fmt header not found."); } if (littleEndianIntBytes() != 16) { //subchunk1size (4 bytes) throw new InvalidParameterException("Data not pcm?"); } if (readStream.readByte() != 1) { //1 pcm throw new InvalidParameterException("Data not pcm?"); } readStream.skip(1); //1 channels = readStream.readByte(); //1 channel count readStream.skip(1); //1 sampleRate = littleEndianIntBytes(); //4 sample rate byteRate = littleEndianIntBytes(); //4 readStream.skip(4); //38 // System.out.println(readBytesToString(4).equals("data")); if (!readBytesToString(4).equals("data")) { // 4 Gdx.app.debug("Audio", "sample rate: " + sampleRate); Gdx.app.debug("Audio", "Data chunk size: " + dataSize); Gdx.app.debug("Audio", "Channel count: " + channels); throw new InvalidParameterException("initial data section tag not found on wav: " + fileName); } readStream.skip(4); } protected void initDataStream() { readStream = new DataInputStream(audioFile); } protected void closeStreams() throws IOException { readStream.close(); audioFile.close(); } private String readBytesToString(int bytesToRead) throws IOException { byte byteString[] = new byte[bytesToRead]; readStream.read(byteString); return new String(byteString); } private int littleEndianIntBytes() throws IOException { int data = readStream.readInt(); return Integer.reverseBytes(data); } protected short readLittleEndianShort() throws IOException { short data = readStream.readShort(); return Short.reverseBytes(data); } protected DataInputStream getReadStream() { return readStream; } public int getChannels() { return channels; } public int getByteRate() { return byteRate; } public int getDataSize() { return dataSize; } public double getSampleRate() { return sampleRate; } public long getDurationInSeconds() { return (long) (dataSize/byteRate); } }