From afb386e13fd00fde1401d4551ee4790b1f6d5e09 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Tue, 23 May 2023 02:05:11 +0200 Subject: Sound3D: Further OO wrapper to be used in ALAudioSink: Context locking, ALCcontext recreation, .. Context - Recursive context locking (only 1st shall do native makeCurrent, only last shall do native release) - Access to the current Context instance (thread local storage) - Obey "One context can only be current on one thread, and one thread can only have one context current!" - ALCcontext recreation within lock, allowing to change native OpenAL specifics via attr list - ALCcontext creation (initial) w/ attr list Device - Retrieve name if default name null has been given - Expose device name - Allow to open() again Source - Allow lazy creation w/ invalid ID - Allow create() post instantiation (for a single source) - Throw ALException in all queued buffer methods as they are crucial in multithreading streaming. - Add queue buffer with OpenAL buffer-id int[] arrays variant to be used w/o Buffer Listener - Fix (get|set)Orientation() API doc: It's 'at' vector, then 'up' vector. General: - Have toString() - Added versatile AudioSystem3D.check*Error(..) Earlier Sound3D changes - 7f73d50c90d05cf7388f23977ca956a4933019ad - 64b40bd4359cad46ebf62751ea342d80205bd98b --- src/java/com/jogamp/openal/sound3d/Device.java | 60 +++++++++++++++++++------- 1 file changed, 44 insertions(+), 16 deletions(-) (limited to 'src/java/com/jogamp/openal/sound3d/Device.java') diff --git a/src/java/com/jogamp/openal/sound3d/Device.java b/src/java/com/jogamp/openal/sound3d/Device.java index 749d606..052d6a2 100644 --- a/src/java/com/jogamp/openal/sound3d/Device.java +++ b/src/java/com/jogamp/openal/sound3d/Device.java @@ -40,39 +40,67 @@ import com.jogamp.openal.*; /** * This class provides a handle to a specific audio device. * - * @author Athomas Goldberg + * @author Athomas Goldberg, Sven Gothel, et al. */ -public class Device { +public final class Device { + private String name; private ALCdevice alDev; - public Device(final ALCdevice realDevice) { - this.alDev = realDevice; - } - /** - * Create a new device by opening the named audio device. + * Create a new device by {@link #open()}'ing the named audio device. * * @param deviceName The specified device name, null for default. */ public Device(final String deviceName) { - this.alDev = AudioSystem3D.alc.alcOpenDevice(deviceName); + this.name = deviceName; + this.alDev = null; + open(); } - /** - * Returns the OpenAL context. - */ - public ALCdevice getALDevice() { - return alDev; + /** Returns the device name. */ + public String getName() { return name; } + + /** Returns the OpenAL {@link ALCdevice}. */ + public ALCdevice getALDevice() { return alDev; } + + /** Return {@link ALC#alcGetError(ALCdevice)} */ + public int getALCError() { + return AudioSystem3D.alc.alcGetError(alDev); } - /** Returns whether {@link #getALDevice()} is valid, i.e. not null, e.g. not {@link #close()}. */ + /** Returns whether {@link #getALDevice()} is open and valid, i.e. not null, e.g. not {@link #close()}. */ public boolean isValid() { return null != alDev; } + /** + * Opens the device if not yet opened + * @return true if already open or newly opened + * @see #isValid() + * @see #clone() + */ + public boolean open() { + if( null == alDev ) { + alDev = AudioSystem3D.alc.alcOpenDevice(name); + if( null != alDev && null == name ) { + name = AudioSystem3D.alc.alcGetString(alDev, ALCConstants.ALC_DEVICE_SPECIFIER); + } + } + return isValid(); + } + /** * closes the device, freeing its resources. */ public void close() { - AudioSystem3D.alc.alcCloseDevice(alDev); - alDev = null; + if( null != alDev ) { + AudioSystem3D.alc.alcCloseDevice(alDev); + alDev = null; + } } + + @Override + public String toString() { + final String alStr = null != alDev ? "0x"+Integer.toHexString(alDev.hashCode()) : "null"; + return "ALDevice[this 0x"+Integer.toHexString(hashCode())+", name '"+name+"', alDev "+alStr+"]"; + } + } -- cgit v1.2.3