aboutsummaryrefslogtreecommitdiffstats
path: root/src/java/com/jogamp/openal/sound3d/Device.java
diff options
context:
space:
mode:
authorSven Gothel <[email protected]>2023-05-23 02:05:11 +0200
committerSven Gothel <[email protected]>2023-05-23 02:05:11 +0200
commitafb386e13fd00fde1401d4551ee4790b1f6d5e09 (patch)
treec9b389c45fe0711a5a89bd37a0b763e217b46c21 /src/java/com/jogamp/openal/sound3d/Device.java
parent66e79a41f38f5694f953816f1a85a02cee71eb16 (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.java60
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+"]";
+ }
+
}