aboutsummaryrefslogtreecommitdiffstats
path: root/src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2013-07-17 16:18:27 +0200
committerSven Gothel <[email protected]>2013-07-17 16:18:27 +0200
commitf26d591b484c7516e6addaaff0b6b40cb4138da9 (patch)
tree297529ecdb4bd9d7a3d265d2194df6994a635b93 /src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java
parent5a1bd0c70ffce4a0530de4f3902050a87c669343 (diff)
parent5c8699690ac907882615ba8f01eebb9e39699f50 (diff)
Merge remote-tracking branch 'xranby/FFMPEGMediaPlayer'
Diffstat (limited to 'src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java')
-rw-r--r--src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java79
1 files changed, 79 insertions, 0 deletions
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..653a02111
--- /dev/null
+++ b/src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java
@@ -0,0 +1,79 @@
+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;
+ }
+
+ @Override
+ public boolean isAudioSinkAvailable() {
+ return available;
+ }
+
+}