From 3bf564210e7dca2f5d6b47898c554f5762ac5282 Mon Sep 17 00:00:00 2001 From: Xerxes Rånby Date: Wed, 19 Jun 2013 18:52:38 +0200 Subject: FFMPEGMediaPlayer: Add AudioSink interface. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use ALAudioSink when available and fallback to JavaSoundAudioSink when JOAL are not found on classpath. Java Sound playback moved from FFMPEGMediaPlayer into JavaSoundAudioSink. Signed-off-by: Xerxes Rånby --- .../jogamp/opengl/util/av/JavaSoundAudioSink.java | 78 ++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java (limited to 'src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java') diff --git a/src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java b/src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java new file mode 100644 index 000000000..0e2806322 --- /dev/null +++ b/src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java @@ -0,0 +1,78 @@ +package jogamp.opengl.util.av; + +import java.util.Arrays; + +import javax.sound.sampled.AudioFormat; +import javax.sound.sampled.AudioSystem; +import javax.sound.sampled.DataLine; +import javax.sound.sampled.SourceDataLine; + +public class JavaSoundAudioSink implements AudioSink { + + // AudioFormat parameters + public static final int SAMPLE_RATE = 44100; + private static final int SAMPLE_SIZE = 16; + private static final int CHANNELS = 2; + private static final boolean SIGNED = true; + private static final boolean BIG_ENDIAN = false; + + // Chunk of audio processed at one time + public static final int BUFFER_SIZE = 1000; + public static final int SAMPLES_PER_BUFFER = BUFFER_SIZE / 2; + + // Sample time values + public static final double SAMPLE_TIME_IN_SECS = 1.0 / SAMPLE_RATE; + public static final double BUFFER_TIME_IN_SECS = SAMPLE_TIME_IN_SECS * SAMPLES_PER_BUFFER; + + private static AudioFormat format; + private static DataLine.Info info; + private static SourceDataLine auline; + private static int bufferCount; + private static byte [] sampleData = new byte[BUFFER_SIZE]; + + private static boolean available; + + static { + // Create the audio format we wish to use + format = new AudioFormat(SAMPLE_RATE, SAMPLE_SIZE, CHANNELS, SIGNED, BIG_ENDIAN); + + // Create dataline info object describing line format + info = new DataLine.Info(SourceDataLine.class, format); + + // Clear buffer initially + Arrays.fill(sampleData, (byte) 0); + try{ + // Get line to write data to + auline = (SourceDataLine) AudioSystem.getLine(info); + auline.open(format); + auline.start(); + System.out.println("JavaSound audio sink"); + available=true; + } catch (Exception e) { + available=false; + } + } + + public void writeData(byte[] sampleData, int data_size) { + int written = 0; + int len; + while (data_size > 0) { + len = auline.write(sampleData, written, data_size); + data_size -= len; + written += len; + } + } + + public int getDataAvailable() { + return auline.available(); + } + + public boolean isDataAvailable(int data_size) { + return auline.available()>=data_size; + } + + public static boolean isAvailable() { + return available; + } + +} -- cgit v1.2.3 From 6509c313dec8947723a932e7d1646a78dd6ac49a Mon Sep 17 00:00:00 2001 From: Xerxes Rånby Date: Mon, 24 Jun 2013 19:39:56 +0200 Subject: AudioSink: interface add isAudioSinkAvailable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Xerxes Rånby --- src/jogl/classes/jogamp/opengl/openal/av/ALAudioSink.java | 3 ++- src/jogl/classes/jogamp/opengl/util/av/AudioSink.java | 2 ++ src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java | 3 ++- src/jogl/classes/jogamp/opengl/util/av/NullAudioSink.java | 5 +++++ .../classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java | 9 +++++---- 5 files changed, 16 insertions(+), 6 deletions(-) (limited to 'src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java') diff --git a/src/jogl/classes/jogamp/opengl/openal/av/ALAudioSink.java b/src/jogl/classes/jogamp/opengl/openal/av/ALAudioSink.java index db01d3a38..c8004d6b3 100644 --- a/src/jogl/classes/jogamp/opengl/openal/av/ALAudioSink.java +++ b/src/jogl/classes/jogamp/opengl/openal/av/ALAudioSink.java @@ -161,7 +161,8 @@ public class ALAudioSink implements AudioSink { return (NUM_BUFFERS-val[0])*4096; } - public static boolean isAvailable() { + @Override + public boolean isAudioSinkAvailable() { return available; } } diff --git a/src/jogl/classes/jogamp/opengl/util/av/AudioSink.java b/src/jogl/classes/jogamp/opengl/util/av/AudioSink.java index fedead713..504e4b2db 100644 --- a/src/jogl/classes/jogamp/opengl/util/av/AudioSink.java +++ b/src/jogl/classes/jogamp/opengl/util/av/AudioSink.java @@ -2,6 +2,8 @@ package jogamp.opengl.util.av; public interface AudioSink { + boolean isAudioSinkAvailable(); + int getDataAvailable(); boolean isDataAvailable(int data_size); diff --git a/src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java b/src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java index 0e2806322..653a02111 100644 --- a/src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java +++ b/src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java @@ -71,7 +71,8 @@ public class JavaSoundAudioSink implements AudioSink { return auline.available()>=data_size; } - public static boolean isAvailable() { + @Override + public boolean isAudioSinkAvailable() { return available; } diff --git a/src/jogl/classes/jogamp/opengl/util/av/NullAudioSink.java b/src/jogl/classes/jogamp/opengl/util/av/NullAudioSink.java index 81259f4c5..d92967849 100644 --- a/src/jogl/classes/jogamp/opengl/util/av/NullAudioSink.java +++ b/src/jogl/classes/jogamp/opengl/util/av/NullAudioSink.java @@ -15,4 +15,9 @@ public class NullAudioSink implements AudioSink { @Override public void writeData(byte[] sampleData, int data_size) { } + + @Override + public boolean isAudioSinkAvailable() { + return true; + } } diff --git a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java index 9ae1541f9..9c0c9bd94 100644 --- a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java +++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java @@ -130,11 +130,12 @@ public class FFMPEGMediaPlayer extends EGLMediaPlayerImpl { System.err.println("LIB_AV Codec : "+avCodecVersion); initIDs0(); available = true; - audioSink = new NullAudioSink(); - if(ALAudioSink.isAvailable()) { - audioSink = new ALAudioSink(); - } else if(JavaSoundAudioSink.isAvailable()) { + audioSink = new ALAudioSink(); + if(!audioSink.isAudioSinkAvailable()) { audioSink = new JavaSoundAudioSink(); + if(!audioSink.isAudioSinkAvailable()) { + audioSink = new NullAudioSink(); + } } maxAvailableAudio = audioSink.getDataAvailable(); -- cgit v1.2.3