* Fixed bug with WAV audio getting truncated on import

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7197 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
sha..rd 14 years ago
parent b24b3f78d4
commit c3b060be6d
  1. 17
      engine/src/core/com/jme3/audio/plugins/WAVLoader.java
  2. 117
      engine/src/core/com/jme3/util/LittleEndien.java
  3. 2
      engine/src/lwjgl-oal/com/jme3/audio/lwjgl/LwjglAudioRenderer.java

@ -38,13 +38,13 @@ import com.jme3.audio.AudioStream;
import com.jme3.asset.AssetInfo; import com.jme3.asset.AssetInfo;
import com.jme3.asset.AssetLoader; import com.jme3.asset.AssetLoader;
import com.jme3.audio.AudioKey; import com.jme3.audio.AudioKey;
import com.jme3.asset.TextureKey;
import com.jme3.util.BufferUtils; import com.jme3.util.BufferUtils;
import com.jme3.util.LittleEndien; import com.jme3.util.LittleEndien;
import java.io.DataInput; import java.io.DataInput;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
public class WAVLoader implements AssetLoader { public class WAVLoader implements AssetLoader {
@ -84,8 +84,7 @@ public class WAVLoader implements AssetLoader {
private int dataLength; private int dataLength;
private float duration; private float duration;
private DataInput in; private LittleEndien in;
private InputStream stream;
private boolean adpcm = false; private boolean adpcm = false;
private int predictor; private int predictor;
@ -116,7 +115,8 @@ public class WAVLoader implements AssetLoader {
int expectedBytesPerSec = (bitsPerSample * channels * sampleRate) / 8; int expectedBytesPerSec = (bitsPerSample * channels * sampleRate) / 8;
if (expectedBytesPerSec != bytesPerSec){ if (expectedBytesPerSec != bytesPerSec){
logger.warning("Expected "+expectedBytesPerSec+" bytes per second, got "+bytesPerSec); logger.log(Level.WARNING, "Expected {0} bytes per second, got {1}",
new Object[]{expectedBytesPerSec, bytesPerSec});
} }
duration = dataLength / bytesPerSec; duration = dataLength / bytesPerSec;
@ -178,17 +178,16 @@ public class WAVLoader implements AssetLoader {
ByteBuffer data = BufferUtils.createByteBuffer(dataLength); ByteBuffer data = BufferUtils.createByteBuffer(dataLength);
byte[] buf = new byte[512]; byte[] buf = new byte[512];
int read = 0; int read = 0;
while ( (read = stream.read(buf)) > 0){ while ( (read = in.read(buf)) > 0){
data.put(buf, 0, read); data.put(buf, 0, read);
} }
data.flip(); data.flip();
audioBuffer.updateData(data); audioBuffer.updateData(data);
stream.close(); in.close();
} }
public Object load(AssetInfo info) throws IOException { public Object load(AssetInfo info) throws IOException {
this.stream = info.openStream(); this.in = new LittleEndien(info.openStream());
in = new LittleEndien(stream);
int sig = in.readInt(); int sig = in.readInt();
if (sig != i_RIFF) if (sig != i_RIFF)
@ -219,7 +218,7 @@ public class WAVLoader implements AssetLoader {
break; break;
case i_data: case i_data:
if (readStream){ if (readStream){
audioStream.updateData(stream, duration); audioStream.updateData(in, duration);
}else{ }else{
readDataChunkForBuffer(len); readDataChunkForBuffer(len);
} }

@ -29,7 +29,6 @@
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/ */
package com.jme3.util; package com.jme3.util;
import java.io.BufferedInputStream; import java.io.BufferedInputStream;
@ -45,7 +44,7 @@ import java.io.InputStreamReader;
* assume they come from a LittleEndien input stream. Currently used to read .ms3d and .3ds files. * assume they come from a LittleEndien input stream. Currently used to read .ms3d and .3ds files.
* @author Jack Lindamood * @author Jack Lindamood
*/ */
public class LittleEndien implements DataInput{ public class LittleEndien extends InputStream implements DataInput {
private BufferedInputStream in; private BufferedInputStream in;
private BufferedReader inRead; private BufferedReader inRead;
@ -55,100 +54,112 @@ public class LittleEndien implements DataInput{
* stream is wrapped in a BufferedReader automatically. * stream is wrapped in a BufferedReader automatically.
* @param in The input stream to read from. * @param in The input stream to read from.
*/ */
public LittleEndien(InputStream in){ public LittleEndien(InputStream in) {
this.in = new BufferedInputStream(in); this.in = new BufferedInputStream(in);
inRead=new BufferedReader(new InputStreamReader(in)); inRead = new BufferedReader(new InputStreamReader(in));
}
public int read() throws IOException {
return in.read();
}
@Override
public int read(byte[] buf) throws IOException {
return in.read(buf);
}
@Override
public int read(byte[] buf, int off, int len) throws IOException {
return in.read(buf, off, len);
} }
public final int readUnsignedShort() throws IOException{ public int readUnsignedShort() throws IOException {
return (in.read()&0xff) | ((in.read()&0xff) << 8); return (in.read() & 0xff) | ((in.read() & 0xff) << 8);
} }
/** /**
* read an unsigned int as a long * read an unsigned int as a long
*/ */
public final long readUInt() throws IOException{ public long readUInt() throws IOException {
return ((in.read()&0xff) | return ((in.read() & 0xff)
((in.read()&0xff) << 8) | | ((in.read() & 0xff) << 8)
((in.read()&0xff) << 16) | | ((in.read() & 0xff) << 16)
(((long)(in.read()&0xff)) << 24) | (((long) (in.read() & 0xff)) << 24));
);
} }
public final boolean readBoolean() throws IOException{ public boolean readBoolean() throws IOException {
return (in.read()!=0); return (in.read() != 0);
} }
public final byte readByte() throws IOException{ public byte readByte() throws IOException {
return (byte) in.read(); return (byte) in.read();
} }
public final int readUnsignedByte() throws IOException{ public int readUnsignedByte() throws IOException {
return in.read(); return in.read();
} }
public final short readShort() throws IOException{ public short readShort() throws IOException {
return (short) this.readUnsignedShort(); return (short) this.readUnsignedShort();
} }
public final char readChar() throws IOException{ public char readChar() throws IOException {
return (char) this.readUnsignedShort(); return (char) this.readUnsignedShort();
} }
public final int readInt() throws IOException{
return ( public int readInt() throws IOException {
(in.read()&0xff) | return ((in.read() & 0xff)
((in.read()&0xff) << 8) | | ((in.read() & 0xff) << 8)
((in.read()&0xff) << 16) | | ((in.read() & 0xff) << 16)
((in.read()&0xff) << 24) | ((in.read() & 0xff) << 24));
); }
}
public long readLong() throws IOException {
public final long readLong() throws IOException{ return ((in.read() & 0xff)
return ( | ((long) (in.read() & 0xff) << 8)
(in.read()&0xff) | | ((long) (in.read() & 0xff) << 16)
((long)(in.read()&0xff) << 8) | | ((long) (in.read() & 0xff) << 24)
((long)(in.read()&0xff) << 16) | | ((long) (in.read() & 0xff) << 32)
((long)(in.read()&0xff) << 24) | | ((long) (in.read() & 0xff) << 40)
((long)(in.read()&0xff) << 32) | | ((long) (in.read() & 0xff) << 48)
((long)(in.read()&0xff) << 40) | | ((long) (in.read() & 0xff) << 56));
((long)(in.read()&0xff) << 48) | }
((long)(in.read()&0xff) << 56)
); public float readFloat() throws IOException {
}
public final float readFloat() throws IOException{
return Float.intBitsToFloat(readInt()); return Float.intBitsToFloat(readInt());
} }
public final double readDouble() throws IOException{ public double readDouble() throws IOException {
return Double.longBitsToDouble(readLong()); return Double.longBitsToDouble(readLong());
} }
public final void readFully(byte b[]) throws IOException{ public void readFully(byte b[]) throws IOException {
in.read(b, 0, b.length); in.read(b, 0, b.length);
} }
public final void readFully(byte b[], int off, int len) throws IOException{ public void readFully(byte b[], int off, int len) throws IOException {
in.read(b, off, len); in.read(b, off, len);
} }
public final int skipBytes(int n) throws IOException{ public int skipBytes(int n) throws IOException {
return (int) in.skip(n); return (int) in.skip(n);
} }
public final String readLine() throws IOException{ public String readLine() throws IOException {
return inRead.readLine(); return inRead.readLine();
} }
public final String readUTF() throws IOException{ public String readUTF() throws IOException {
throw new IOException("Unsupported operation"); throw new IOException("Unsupported operation");
} }
public final void close() throws IOException{ @Override
public void close() throws IOException {
in.close(); in.close();
} }
public final int available() throws IOException{ @Override
public int available() throws IOException {
return in.available(); return in.available();
} }
} }

@ -841,7 +841,7 @@ public class LwjglAudioRenderer implements AudioRenderer, Runnable {
// allocate channel to this source // allocate channel to this source
int index = newChannel(); int index = newChannel();
if (index == -1) { if (index == -1) {
logger.log(Level.WARNING, "No channel available to play " + src); logger.log(Level.WARNING, "No channel available to play {0}", src);
return; return;
} }
clearChannel(index); clearChannel(index);

Loading…
Cancel
Save