126 lines
3.2 KiB
Java
Executable File
126 lines
3.2 KiB
Java
Executable File
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);
|
|
}
|
|
}
|