* Fixed bug with OGG audio having incorrect length

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@7198 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
sha..rd 14 years ago
parent c3b060be6d
commit bb238c3c99
  1. 3
      engine/src/jogg/com/jme3/audio/plugins/CachedOggStream.java
  2. 23
      engine/src/jogg/com/jme3/audio/plugins/OGGLoader.java
  3. 6
      engine/src/jogg/com/jme3/audio/plugins/UncachedOggStream.java

@ -41,6 +41,7 @@ import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Collection;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
@ -72,7 +73,7 @@ public class CachedOggStream implements PhysicalOggStream {
* file is not automatically deleted when this class is disposed.
*/
public CachedOggStream(InputStream stream, int length, int numPages) throws IOException {
logger.info("Creating memory cache of size "+length);
logger.log(Level.INFO, "Creating memory cache of size {0}", length);
memoryCache = new byte[length];
sourceStream = stream;

@ -38,10 +38,9 @@ import com.jme3.audio.AudioStream;
import com.jme3.asset.AssetLoader;
import com.jme3.audio.AudioKey;
import com.jme3.util.BufferUtils;
import com.jme3.util.TempVars;
import de.jarnbjo.ogg.EndOfOggStreamException;
import de.jarnbjo.ogg.LogicalOggStream;
import de.jarnbjo.ogg.PhysicalOggStream;
import de.jarnbjo.ogg.OggPage;
import de.jarnbjo.vorbis.IdentificationHeader;
import de.jarnbjo.vorbis.VorbisStream;
import java.io.ByteArrayOutputStream;
@ -54,7 +53,7 @@ public class OGGLoader implements AssetLoader {
// private static int BLOCK_SIZE = 4096*64;
private PhysicalOggStream oggStream;
private UncachedOggStream oggStream;
private LogicalOggStream loStream;
private VorbisStream vorbisStream;
@ -121,10 +120,24 @@ public class OGGLoader implements AssetLoader {
} catch (EndOfOggStreamException ex){
}
byte[] dataBytes = baos.toByteArray();
swapBytes(dataBytes, 0, dataBytes.length);
ByteBuffer data = BufferUtils.createByteBuffer(dataBytes.length);
data.put(dataBytes).flip();
// Vorbis stream could have more samples than than the duration of the sound
// Must truncate.
int numSamples = (int) oggStream.getLastOggPage().getAbsoluteGranulePosition();
// Number of Samples * Number of Channels * Bytes Per Sample
int totalBytes = numSamples * streamHdr.getChannels() * 2;
// System.out.println("Sample Rate: " + streamHdr.getSampleRate());
// System.out.println("Channels: " + streamHdr.getChannels());
// System.out.println("Stream Length: " + numSamples);
// System.out.println("Bytes Calculated: " + totalBytes);
// System.out.println("Bytes Available: " + dataBytes.length);
ByteBuffer data = BufferUtils.createByteBuffer(totalBytes);
data.put(dataBytes, 0, totalBytes).flip();
vorbisStream.close();
loStream.close();

@ -55,6 +55,7 @@ public class UncachedOggStream implements PhysicalOggStream {
private InputStream sourceStream;
private LinkedList<OggPage> pageCache = new LinkedList<OggPage>();
private HashMap<Integer, LogicalOggStream> logicalStreams = new HashMap();
private OggPage lastPage = null;
public UncachedOggStream(InputStream in) throws OggFormatException, IOException {
this.sourceStream = in;
@ -65,6 +66,10 @@ public class UncachedOggStream implements PhysicalOggStream {
}
}
public OggPage getLastOggPage() {
return lastPage;
}
private void readNextOggPage() throws IOException {
OggPage op = OggPage.create(sourceStream);
if (!op.isBos()){
@ -72,6 +77,7 @@ public class UncachedOggStream implements PhysicalOggStream {
}
if (op.isEos()){
eos = true;
lastPage = op;
}
LogicalOggStreamImpl los = (LogicalOggStreamImpl) getLogicalStream(op.getStreamSerialNumber());

Loading…
Cancel
Save