diff options
author | Sven Gothel <[email protected]> | 2023-05-17 08:15:43 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2023-05-17 08:15:43 +0200 |
commit | 5f72e750d6650059f9a5ce028e95984bb8f34c81 (patch) | |
tree | 30b77f7b91ba7678e6768eb8c203bcff29d9ff5a /src/jogl/classes/jogamp/opengl/util/av | |
parent | 900c35c6a49e0d53e38dd07da709bf81e28abd3e (diff) |
Common av classes (*AudioSink, ..) are promoted to gluegen (commit 270172bcbd91f96d4a38a3d73e23d744f57a25b8) and joal (commit 03f4bb63ce8a358b1c2ef303480e1887d72ecb2e)
Diffstat (limited to 'src/jogl/classes/jogamp/opengl/util/av')
5 files changed, 8 insertions, 420 deletions
diff --git a/src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java b/src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java index cffd8426c..e9a154bbb 100644 --- a/src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java +++ b/src/jogl/classes/jogamp/opengl/util/av/GLMediaPlayerImpl.java @@ -51,6 +51,8 @@ import jogamp.opengl.Debug; import com.jogamp.common.net.UriQueryProps; import com.jogamp.common.nio.Buffers; import com.jogamp.common.ExceptionUtils; +import com.jogamp.common.av.AudioSink; +import com.jogamp.common.av.TimeFrameI; import com.jogamp.common.net.Uri; import com.jogamp.common.os.Platform; import com.jogamp.common.util.IOUtil; @@ -60,8 +62,6 @@ import com.jogamp.common.util.LFRingbuffer; import com.jogamp.common.util.Ringbuffer; import com.jogamp.common.util.SourcedInterruptedException; import com.jogamp.opengl.GLExtensions; -import com.jogamp.opengl.util.TimeFrameI; -import com.jogamp.opengl.util.av.AudioSink; import com.jogamp.opengl.util.av.GLMediaPlayer; import com.jogamp.opengl.util.glsl.ShaderCode; import com.jogamp.opengl.util.texture.Texture; @@ -511,7 +511,7 @@ public abstract class GLMediaPlayerImpl implements GLMediaPlayer { * Override if not using AudioSink, or AudioSink's {@link AudioSink#setPlaySpeed(float)} is not sufficient! * <p> * AudioSink shall respect <code>!audioSinkPlaySpeedSet</code> to determine data_size - * at {@link AudioSink#enqueueData(com.jogamp.opengl.util.av.AudioSink.AudioFrame)}. + * at {@link AudioSink#enqueueData(int, ByteBuffer, int)} * </p> */ protected boolean setPlaySpeedImpl(final float rate) { diff --git a/src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java b/src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java deleted file mode 100644 index 117be5489..000000000 --- a/src/jogl/classes/jogamp/opengl/util/av/JavaSoundAudioSink.java +++ /dev/null @@ -1,228 +0,0 @@ -package jogamp.opengl.util.av; - -import java.nio.ByteBuffer; -import java.util.Arrays; - -import javax.sound.sampled.AudioSystem; -import javax.sound.sampled.DataLine; -import javax.sound.sampled.SourceDataLine; - -import com.jogamp.opengl.util.av.AudioSink; - -/*** - * JavaSound Audio Sink - * <p> - * FIXME: Parameterize .. all configs .. best via an init-method, passing requested - * audio capabilities - * </p> - */ -public class JavaSoundAudioSink implements AudioSink { - - // Chunk of audio processed at one time - public static final int BUFFER_SIZE = 1000; - public static final int SAMPLES_PER_BUFFER = BUFFER_SIZE / 2; - private static final boolean staticAvailable; - - // Sample time values - // public static final double SAMPLE_TIME_IN_SECS = 1.0 / DEFAULT_SAMPLE_RATE; - // public static final double BUFFER_TIME_IN_SECS = SAMPLE_TIME_IN_SECS * SAMPLES_PER_BUFFER; - - private javax.sound.sampled.AudioFormat format; - private DataLine.Info info; - private SourceDataLine auline; - private int bufferCount; - private final byte [] sampleData = new byte[BUFFER_SIZE]; - private boolean initialized = false; - private AudioSink.AudioFormat chosenFormat = null; - - private volatile boolean playRequested = false; - private float volume = 1.0f; - - static { - boolean ok = false; - try { - AudioSystem.getAudioFileTypes(); - ok = true; - } catch (final Throwable t) { - - } - staticAvailable=ok; - } - - @Override - public String toString() { - return "JavaSoundSink[init "+initialized+", dataLine "+info+", source "+auline+", bufferCount "+bufferCount+ - ", chosen "+chosenFormat+", jsFormat "+format; - } - - @Override - public final float getPlaySpeed() { return 1.0f; } // FIXME - - @Override - public final boolean setPlaySpeed(final float rate) { - return false; // FIXME - } - - @Override - public final float getVolume() { - // FIXME - return volume; - } - - @Override - public final boolean setVolume(final float v) { - // FIXME - volume = v; - return true; - } - - @Override - public AudioSink.AudioFormat getPreferredFormat() { - return DefaultFormat; - } - - @Override - public final int getMaxSupportedChannels() { - return 2; - } - - @Override - public final boolean isSupported(final AudioSink.AudioFormat format) { - return true; - } - - @Override - public boolean init(final AudioSink.AudioFormat requestedFormat, final float frameDuration, final int initialQueueSize, final int queueGrowAmount, final int queueLimit) { - if( !staticAvailable ) { - return false; - } - // Create the audio format we wish to use - format = new javax.sound.sampled.AudioFormat(requestedFormat.sampleRate, requestedFormat.sampleSize, requestedFormat.channelCount, requestedFormat.signed, !requestedFormat.littleEndian); - - // 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"); - initialized=true; - chosenFormat = requestedFormat; - } catch (final Exception e) { - initialized=false; - } - return true; - } - - @Override - public final AudioFormat getChosenFormat() { - return chosenFormat; - } - - @Override - public boolean isPlaying() { - return playRequested && auline.isRunning(); - } - - @Override - public void play() { - if( null != auline ) { - playRequested = true; - playImpl(); - } - } - private void playImpl() { - if( playRequested && !auline.isRunning() ) { - auline.start(); - } - } - - @Override - public void pause() { - if( null != auline ) { - playRequested = false; - auline.stop(); - } - } - - @Override - public void flush() { - if( null != auline ) { - playRequested = false; - auline.stop(); - auline.flush(); - } - } - - @Override - public final int getEnqueuedFrameCount() { - return 0; // FIXME - } - - @Override - public int getFrameCount() { - return 1; - } - - @Override - public int getQueuedFrameCount() { - return 0; - } - - @Override - public boolean isInitialized() { - return initialized; - } - - @Override - public void destroy() { - initialized = false; - chosenFormat = null; - // FIXEM: complete code! - } - - @Override - public AudioFrame enqueueData(final int pts, final ByteBuffer byteBuffer, final int byteCount) { - final byte[] bytes = new byte[byteCount]; - final int p = byteBuffer.position(); - byteBuffer.get(bytes, 0, byteCount); - byteBuffer.position(p); - - int written = 0; - int len; - int bytesLeft = byteCount; - while (bytesLeft > 0) { - len = auline.write(bytes, written, byteCount); - bytesLeft -= len; - written += len; - } - playImpl(); - return new AudioDataFrame(pts, chosenFormat.getBytesDuration(byteCount), byteBuffer, byteCount); - } - - @Override - public int getQueuedByteCount() { - return auline.getBufferSize() - auline.available(); - } - - @Override - public int getFreeFrameCount() { - return auline.available(); - } - - @Override - public int getQueuedTime() { - return getQueuedTimeImpl( getQueuedByteCount() ); - } - private final int getQueuedTimeImpl(final int byteCount) { - final int bytesPerSample = chosenFormat.sampleSize >>> 3; // /8 - return byteCount / ( chosenFormat.channelCount * bytesPerSample * ( chosenFormat.sampleRate / 1000 ) ); - } - - @Override - public final int getPTS() { return 0; } // FIXME -} diff --git a/src/jogl/classes/jogamp/opengl/util/av/NullAudioSink.java b/src/jogl/classes/jogamp/opengl/util/av/NullAudioSink.java deleted file mode 100644 index 7e27f17c3..000000000 --- a/src/jogl/classes/jogamp/opengl/util/av/NullAudioSink.java +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Copyright 2013 JogAmp Community. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, are - * permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, this list of - * conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, this list - * of conditions and the following disclaimer in the documentation and/or other materials - * provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * The views and conclusions contained in the software and documentation are those of the - * authors and should not be interpreted as representing official policies, either expressed - * or implied, of JogAmp Community. - */ -package jogamp.opengl.util.av; - -import java.nio.ByteBuffer; - -import com.jogamp.opengl.util.av.AudioSink; - -public class NullAudioSink implements AudioSink { - - private volatile float playSpeed = 1.0f; - private volatile boolean playRequested = false; - private volatile int playingPTS = AudioFrame.INVALID_PTS; - private float volume = 1.0f; - - private AudioFormat chosenFormat; - private boolean initialized; - - public NullAudioSink() { - initialized = true; - chosenFormat = null; - } - - @Override - public boolean isInitialized() { - return initialized; - } - - @Override - public final float getPlaySpeed() { return playSpeed; } - - @Override - public final boolean setPlaySpeed(float rate) { - if( Math.abs(1.0f - rate) < 0.01f ) { - rate = 1.0f; - } - playSpeed = rate; - return true; - } - - @Override - public final float getVolume() { - // FIXME - return volume; - } - - @Override - public final boolean setVolume(final float v) { - // FIXME - volume = v; - return true; - } - - @Override - public AudioFormat getPreferredFormat() { - return DefaultFormat; - } - - @Override - public final int getMaxSupportedChannels() { - return 8; - } - - @Override - public final boolean isSupported(final AudioFormat format) { - /** - * If we like to emulate constraints .. - * - if( format.planar || !format.littleEndian ) { - return false; - } - if( format.sampleRate != DefaultFormat.sampleRate ) { - return false; - } - */ - return true; - } - - @Override - public boolean init(final AudioFormat requestedFormat, final float frameDuration, final int initialQueueSize, final int queueGrowAmount, final int queueLimit) { - chosenFormat = requestedFormat; - return true; - } - - @Override - public final AudioFormat getChosenFormat() { - return chosenFormat; - } - - @Override - public boolean isPlaying() { - return playRequested; - } - - @Override - public void play() { - playRequested = true; - } - - @Override - public void pause() { - playRequested = false; - } - - @Override - public void flush() { - } - - @Override - public void destroy() { - initialized = false; - chosenFormat = null; - } - - @Override - public final int getEnqueuedFrameCount() { - return 0; - } - - @Override - public int getFrameCount() { - return 0; - } - - @Override - public int getQueuedFrameCount() { - return 0; - } - - @Override - public int getQueuedByteCount() { - return 0; - } - - @Override - public int getQueuedTime() { - return 0; - } - - @Override - public final int getPTS() { return playingPTS; } - - @Override - public int getFreeFrameCount() { - return 1; - } - - @Override - public AudioFrame enqueueData(final int pts, final ByteBuffer bytes, final int byteCount) { - if( !initialized || null == chosenFormat ) { - return null; - } - playingPTS = pts; - return null; - } -} diff --git a/src/jogl/classes/jogamp/opengl/util/av/NullGLMediaPlayer.java b/src/jogl/classes/jogamp/opengl/util/av/NullGLMediaPlayer.java index 528b62db6..be440adaf 100644 --- a/src/jogl/classes/jogamp/opengl/util/av/NullGLMediaPlayer.java +++ b/src/jogl/classes/jogamp/opengl/util/av/NullGLMediaPlayer.java @@ -35,8 +35,6 @@ import com.jogamp.opengl.GL; import com.jogamp.opengl.GLException; import com.jogamp.opengl.GLProfile; -import jogamp.opengl.util.av.GLMediaPlayerImpl; - import com.jogamp.common.nio.Buffers; import com.jogamp.common.os.Platform; import com.jogamp.common.util.IOUtil; 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 232796f1f..13c698486 100644 --- a/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java +++ b/src/jogl/classes/jogamp/opengl/util/av/impl/FFMPEGMediaPlayer.java @@ -35,17 +35,16 @@ import java.security.PrivilegedAction; import com.jogamp.opengl.GL; import com.jogamp.opengl.GL2ES2; import com.jogamp.opengl.GLException; - +import com.jogamp.common.av.AudioSink; +import com.jogamp.common.av.AudioSink.AudioFormat; +import com.jogamp.common.av.AudioSinkFactory; +import com.jogamp.common.av.TimeFrameI; import com.jogamp.common.util.IOUtil; import com.jogamp.common.util.PropertyAccess; import com.jogamp.common.util.SecurityUtil; import com.jogamp.common.util.VersionNumber; import com.jogamp.gluegen.runtime.ProcAddressTable; -import com.jogamp.opengl.util.TimeFrameI; import com.jogamp.opengl.util.GLPixelStorageModes; -import com.jogamp.opengl.util.av.AudioSink; -import com.jogamp.opengl.util.av.AudioSink.AudioFormat; -import com.jogamp.opengl.util.av.AudioSinkFactory; import com.jogamp.opengl.util.av.GLMediaPlayer; import com.jogamp.opengl.util.texture.Texture; @@ -345,7 +344,7 @@ public class FFMPEGMediaPlayer extends GLMediaPlayerImpl { if( GLMediaPlayer.STREAM_ID_NONE == aid ) { audioSink = AudioSinkFactory.createNull(); } else { - audioSink = AudioSinkFactory.createDefault(); + audioSink = AudioSinkFactory.createDefault(FFMPEGMediaPlayer.class.getClassLoader()); } final AudioFormat preferredAudioFormat = audioSink.getPreferredFormat(); if(DEBUG) { |