diff options
author | Sven Gothel <[email protected]> | 2023-05-23 02:05:11 +0200 |
---|---|---|
committer | Sven Gothel <[email protected]> | 2023-05-23 02:05:11 +0200 |
commit | afb386e13fd00fde1401d4551ee4790b1f6d5e09 (patch) | |
tree | c9b389c45fe0711a5a89bd37a0b763e217b46c21 /src/java/com/jogamp/openal/sound3d/Device.java | |
parent | 66e79a41f38f5694f953816f1a85a02cee71eb16 (diff) |
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
Diffstat (limited to 'src/java/com/jogamp/openal/sound3d/Device.java')
-rw-r--r-- | src/java/com/jogamp/openal/sound3d/Device.java | 60 |
1 files changed, 44 insertions, 16 deletions
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+"]"; + } + } |