From 1f2193a2b9cf22727b3fac94f0432c05f6e17e45 Mon Sep 17 00:00:00 2001 From: "rem..om" Date: Thu, 29 Dec 2011 21:41:18 +0000 Subject: [PATCH] Audio : implemented API for seeking capability in streamed ogg files. It doesn't work fine yet git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8967 75d07b2b-3a1a-0410-a2c5-0572b91ccdca --- engine/src/core/com/jme3/audio/AudioNode.java | 7 ++ .../src/core/com/jme3/audio/AudioStream.java | 20 ++++- .../core/com/jme3/audio/SeekableStream.java | 15 ++++ .../com/jme3/audio/plugins/OGGLoader.java | 74 +++++++++++++++---- .../test/jme3test/audio/TestMusicPlayer.java | 18 +++-- 5 files changed, 112 insertions(+), 22 deletions(-) create mode 100644 engine/src/core/com/jme3/audio/SeekableStream.java diff --git a/engine/src/core/com/jme3/audio/AudioNode.java b/engine/src/core/com/jme3/audio/AudioNode.java index fe8d312a0..bc8b8cd12 100644 --- a/engine/src/core/com/jme3/audio/AudioNode.java +++ b/engine/src/core/com/jme3/audio/AudioNode.java @@ -448,6 +448,13 @@ public class AudioNode extends Node { } this.timeOffset = timeOffset; + if (data instanceof AudioStream) { + System.out.println("request setTime"); + ((AudioStream) data).setTime(timeOffset); + }else if(status == Status.Playing){ + stop(); + play(); + } } /** diff --git a/engine/src/core/com/jme3/audio/AudioStream.java b/engine/src/core/com/jme3/audio/AudioStream.java index 658e858a1..6d20d67bc 100644 --- a/engine/src/core/com/jme3/audio/AudioStream.java +++ b/engine/src/core/com/jme3/audio/AudioStream.java @@ -36,6 +36,8 @@ import com.jme3.util.NativeObject; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; +import java.util.logging.Level; +import java.util.logging.Logger; /** * AudioStream is an implementation of AudioData that @@ -47,20 +49,20 @@ import java.io.InputStream; */ public class AudioStream extends AudioData implements Closeable{ + private final static Logger logger = Logger.getLogger(AudioStream.class.getName()); protected InputStream in; protected float duration = -1f; protected boolean open = false; protected int[] ids; - + public AudioStream(){ - super(); + super(); } protected AudioStream(int[] ids){ // Pass some dummy ID so handle // doesn't get created. - super(-1); - + super(-1); // This is what gets destroyed in reality this.ids = ids; } @@ -189,4 +191,14 @@ public class AudioStream extends AudioData implements Closeable{ } } + + public void setTime(float time){ + if(in instanceof SeekableStream){ + ((SeekableStream)in).setTime(time); + }else{ + logger.log(Level.WARNING,"Cannot use setTime on a stream that is not seekable. You must load the file with the streamCache option set to true"); + } + } + + } diff --git a/engine/src/core/com/jme3/audio/SeekableStream.java b/engine/src/core/com/jme3/audio/SeekableStream.java new file mode 100644 index 000000000..bb5b9e45d --- /dev/null +++ b/engine/src/core/com/jme3/audio/SeekableStream.java @@ -0,0 +1,15 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.jme3.audio; + +/** + * + * @author Nehon + */ +public interface SeekableStream{ + + public void setTime(float time); + +} diff --git a/engine/src/jogg/com/jme3/audio/plugins/OGGLoader.java b/engine/src/jogg/com/jme3/audio/plugins/OGGLoader.java index 7128a1932..b342023ca 100644 --- a/engine/src/jogg/com/jme3/audio/plugins/OGGLoader.java +++ b/engine/src/jogg/com/jme3/audio/plugins/OGGLoader.java @@ -38,6 +38,7 @@ import com.jme3.audio.AudioBuffer; import com.jme3.audio.AudioData; import com.jme3.audio.AudioKey; import com.jme3.audio.AudioStream; +import com.jme3.audio.SeekableStream; import com.jme3.util.BufferUtils; import de.jarnbjo.ogg.EndOfOggStreamException; import de.jarnbjo.ogg.LogicalOggStream; @@ -49,6 +50,8 @@ import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.util.Collection; +import java.util.logging.Level; +import java.util.logging.Logger; public class OGGLoader implements AssetLoader { @@ -64,10 +67,10 @@ public class OGGLoader implements AssetLoader { private static class JOggInputStream extends InputStream { private boolean endOfStream = false; - private final VorbisStream vs; + protected final VorbisStream vs; - public JOggInputStream(VorbisStream vs){ - this.vs = vs; + public JOggInputStream(VorbisStream vs){ + this.vs = vs; } @Override @@ -88,14 +91,25 @@ public class OGGLoader implements AssetLoader { int bytesRead = 0, cnt = 0; assert length % 2 == 0; // read buffer should be even - while (bytesRead < buf.length) { - if ((cnt = vs.readPcm(buf, offset + bytesRead, buf.length - bytesRead)) <= 0) { - endOfStream = true; + while (bytesRead