aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--make/config/joal-alc-CustomJavaCode.java19
-rw-r--r--make/config/joal-alc-impl-CustomCCode.c11
-rw-r--r--make/config/joal-alext.cfg7
-rw-r--r--make/config/joal-common-CustomCCode.c2
-rw-r--r--make/config/joal-common.cfg1
-rwxr-xr-xmake/scripts/cmpOld2New.sh22
-rwxr-xr-xmake/scripts/strip-c-comments.awk59
-rwxr-xr-xmake/scripts/tests.sh4
-rw-r--r--make/stub_includes/openal/al-types.h100
-rw-r--r--make/stub_includes/openal/al.h308
-rw-r--r--make/stub_includes/openal/alc-types.h99
-rw-r--r--make/stub_includes/openal/alc.h175
-rw-r--r--make/stub_includes/openal/alext.h346
-rw-r--r--make/stub_includes/openal/efx-creative.h2
-rw-r--r--make/stub_includes/openal/efx-presets.h4
-rw-r--r--make/stub_includes/openal/efx.h68
-rw-r--r--src/java/com/jogamp/openal/JoalVersion.java123
-rw-r--r--src/java/com/jogamp/openal/sound3d/Context.java72
-rw-r--r--src/java/com/jogamp/openal/util/ALHelpers.java3
-rw-r--r--src/java/jogamp/openal/ALCImpl.java50
-rw-r--r--src/java/jogamp/openal/ALDynamicLibraryBundleInfo.java3
-rw-r--r--src/native/almisc.c21
-rw-r--r--src/test/com/jogamp/openal/test/junit/ALVersionTest.java44
-rw-r--r--src/test/com/jogamp/openal/test/manual/Synth01AL.java9
24 files changed, 1063 insertions, 489 deletions
diff --git a/make/config/joal-alc-CustomJavaCode.java b/make/config/joal-alc-CustomJavaCode.java
index be28d8c..6615c01 100644
--- a/make/config/joal-alc-CustomJavaCode.java
+++ b/make/config/joal-alc-CustomJavaCode.java
@@ -1,3 +1,18 @@
+/** Specify if ALC_ENUMERATION_EXT is present */
+public boolean aclEnumerationExtIsPresent();
+
+/** Specify if ALC_ENUMERATE_ALL_EXT is present */
+public boolean aclEnumerateAllExtIsPresent();
+
+/** Specify if call of alGetString(device, param) must
+ must retrun a double null terminted string */
+public boolean alcIsDoubleNullTerminatedString(final com.jogamp.openal.ALCdevice device, final int param);
+
+/** Fetches all values of device and param supplied from result of call to alcGetString
+ Each value is extracted from string because is a string double null terminated
+ Equivalent to the C call alcGetString(device, param). */
+public java.lang.String[] alcGetStringAsDoubleNullTerminatedString(final com.jogamp.openal.ALCdevice device, final int param);
+
/** Fetches the names of the available ALC device specifiers.
Equivalent to the C call alcGetString(NULL, ALC_DEVICE_SPECIFIER). */
public java.lang.String[] alcGetDeviceSpecifiers();
@@ -5,3 +20,7 @@ public java.lang.String[] alcGetDeviceSpecifiers();
/** Fetches the names of the available ALC capture device specifiers.
Equivalent to the C call alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER). */
public java.lang.String[] alcGetCaptureDeviceSpecifiers();
+
+/** Fetches the names of the available ALC all capture device specifiers.
+ Equivalent to the C call alcGetString(NULL, ALC_ALL_DEVICES_SPECIFIER). */
+public java.lang.String[] alcGetAllDeviceSpecifiers();
diff --git a/make/config/joal-alc-impl-CustomCCode.c b/make/config/joal-alc-impl-CustomCCode.c
index 9207210..bb36ff1 100644
--- a/make/config/joal-alc-impl-CustomCCode.c
+++ b/make/config/joal-alc-impl-CustomCCode.c
@@ -1,6 +1,15 @@
+
+static int alc_is_double_null_terminated_string(ALCdevice *device, int param) {
+ return device == NULL && (
+ param == ALC_DEVICE_SPECIFIER ||
+ param == ALC_CAPTURE_DEVICE_SPECIFIER ||
+ param == ALC_ALL_DEVICES_SPECIFIER
+ );
+}
+
int strlen_alc(ALCdevice *device, int param, const char* str) {
int len = 0;
- if ((device == NULL) && (param == ALC_DEVICE_SPECIFIER)) {
+ if ( alc_is_double_null_terminated_string(device, param) ) {
while (*str != 0) {
while (*str != 0) {
++str;
diff --git a/make/config/joal-alext.cfg b/make/config/joal-alext.cfg
index 84baf22..2d3116d 100644
--- a/make/config/joal-alext.cfg
+++ b/make/config/joal-alext.cfg
@@ -31,6 +31,9 @@ ArgumentIsPascalString ALEVENTPROCSOFT 3 4
JavaCallbackDef alEventCallbackSOFT 1 ALEVENTPROCSOFT 5 ALCcontext ALContextKey
JavaCallbackKey alEventCallbackSOFT 1 ALEVENTPROCSOFT 5
+JavaCallbackDef alBufferCallbackSOFT 4 ALBUFFERCALLBACKTYPESOFT 0 ALCcontext ALContextKey
+JavaCallbackKey alBufferCallbackSOFT 4 ALBUFFERCALLBACKTYPESOFT 0
+
Import java.io.UnsupportedEncodingException
Import java.util.*
Import com.jogamp.openal.*
@@ -57,3 +60,7 @@ ReturnValueCapacity alcLoopbackOpenDeviceSOFT 0
IncludeAs CustomCCode joal-common-CustomCCode.c
+ReturnsString alcGetStringiSOFT
+ReturnsString alGetStringiSOFT
+
+ArgumentIsString alcReopenDeviceSOFT 1 \ No newline at end of file
diff --git a/make/config/joal-common-CustomCCode.c b/make/config/joal-common-CustomCCode.c
index e620735..3b2f590 100644
--- a/make/config/joal-common-CustomCCode.c
+++ b/make/config/joal-common-CustomCCode.c
@@ -1,3 +1 @@
-#include <al-types.h>
-#include <alc-types.h>
#include <string.h>
diff --git a/make/config/joal-common.cfg b/make/config/joal-common.cfg
index 36a8e8b..94a4402 100644
--- a/make/config/joal-common.cfg
+++ b/make/config/joal-common.cfg
@@ -59,3 +59,4 @@ ArgumentIsString alcLoopbackOpenDeviceSOFT 0
## Specify the return length of this function with our own custom strlen
##ReturnValueCapacity alcGetStringImpl strlen_alc(_device_ptr, {1}, _res)
+Ignore HAS_STDDEF
diff --git a/make/scripts/cmpOld2New.sh b/make/scripts/cmpOld2New.sh
new file mode 100755
index 0000000..76f7216
--- /dev/null
+++ b/make/scripts/cmpOld2New.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+
+dirscript=`dirname $0`
+
+dirold=../build-old/gensrc/classes/com/jogamp/openal
+dirnew=../build/gensrc/classes/com/jogamp/openal
+dircmp=cmp-old2new
+
+rm -rf $dircmp
+mkdir -p $dircmp
+
+for i in AL ALC ALCConstants ALCcontext ALCdevice ALConstants ALExt ALExtConstants ; do
+ echo
+ echo processing $i
+ awk -f $dirscript/strip-c-comments.awk $dirold/$i.java | sort -u > $dircmp/$i-old.java
+ echo created $dircmp/$i-old.java
+ awk -f $dirscript/strip-c-comments.awk $dirnew/$i.java | sort -u > $dircmp/$i-new.java
+ echo created $dircmp/$i-new.java
+ diff -Nurdw $dircmp/$i-old.java $dircmp/$i-new.java > $dircmp/$i-diff.txt
+ echo created $dircmp/$i-diff.txt
+done
+
diff --git a/make/scripts/strip-c-comments.awk b/make/scripts/strip-c-comments.awk
new file mode 100755
index 0000000..4f35452
--- /dev/null
+++ b/make/scripts/strip-c-comments.awk
@@ -0,0 +1,59 @@
+#!/usr/bin/awk
+
+BEGIN { ORS = "" ; C99=1 }
+
+{ code = code $0 "\n" }
+
+END {
+ while ( length(code) )
+ code = process( code )
+}
+
+function process( text )
+{
+ if ( C99 ) {
+ if ( match( text, /"|'|\/\*|\/\// ) ) {
+ return span( text )
+ }
+ } else if ( match( text, /"|'|\/\*/ ) ) {
+ return span( text )
+ }
+ print text
+ return ""
+}
+
+function span( text , starter )
+{
+ print substr( text, 1, RSTART - 1 )
+ starter = substr( text, RSTART, RLENGTH )
+ text = substr( text, RSTART + RLENGTH )
+
+ if ( "\"" == starter || "'" == starter ) {
+ return quoted( text, starter )
+ }
+ if ( "//" == starter ) {
+ return remove( text, "\n", "\n" )
+ }
+ ## Allow for
+ ## /* foo *\
+ ## /
+ return remove( text, "\\*(\\\\\n)?/", " " )
+}
+
+function remove( text, ender, replacement )
+{
+ print replacement
+ return substr( text, match(text, ender) + RLENGTH )
+}
+
+function quoted( text, starter )
+{
+ if ( "'" == starter ) {
+ match( text, /^(\\.|[^'])*'/ )
+ } else {
+ match( text, /^(\\.|\?\?\/.|[^"])*"/ )
+ }
+ print starter substr( text, 1, RLENGTH )
+ return substr( text, RSTART + RLENGTH )
+}
+
diff --git a/make/scripts/tests.sh b/make/scripts/tests.sh
index b015604..fbb39bf 100755
--- a/make/scripts/tests.sh
+++ b/make/scripts/tests.sh
@@ -103,11 +103,11 @@ function testnormal() {
}
-#testnormal com.jogamp.openal.JoalVersion $*
+testnormal com.jogamp.openal.JoalVersion $*
#testnormal com.jogamp.openal.test.manual.OpenALTest $*
#testnormal com.jogamp.openal.test.manual.Sound3DTest $*
#testnormal com.jogamp.openal.test.manual.Synth01AL $*
-testnormal com.jogamp.openal.test.manual.Synth02AL $*
+#testnormal com.jogamp.openal.test.manual.Synth02AL $*
#testnormal com.jogamp.openal.test.manual.Synth02bAL $*
#testnormal com.jogamp.openal.test.junit.ALVersionTest $*
#testnormal com.jogamp.openal.test.junit.ALutWAVLoaderTest $*
diff --git a/make/stub_includes/openal/al-types.h b/make/stub_includes/openal/al-types.h
deleted file mode 100644
index 86c952d..0000000
--- a/make/stub_includes/openal/al-types.h
+++ /dev/null
@@ -1,100 +0,0 @@
-#ifndef AL_AL_TYPES_H
-#define AL_AL_TYPES_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#ifndef AL_API
- #if defined(AL_LIBTYPE_STATIC)
- #define AL_API
- #elif defined(_WIN32)
- #define AL_API __declspec(dllimport)
- #else
- #define AL_API extern
- #endif
-#endif
-
-#if defined(_WIN32)
- #define AL_APIENTRY __cdecl
-#else
- #define AL_APIENTRY
-#endif
-
-#if defined(TARGET_OS_MAC) && TARGET_OS_MAC
- #pragma export on
-#endif
-
-/*
- * The OPENAL, ALAPI, ALAPIENTRY, AL_INVALID, AL_ILLEGAL_ENUM, and
- * AL_ILLEGAL_COMMAND macros are deprecated, but are included for
- * applications porting code from AL 1.0
- */
-#define OPENAL
-#define ALAPI AL_API
-#define ALAPIENTRY AL_APIENTRY
-#define AL_INVALID (-1)
-#define AL_ILLEGAL_ENUM AL_INVALID_ENUM
-#define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION
-
-/** Supported AL version. */
-#define AL_VERSION_1_0
-#define AL_VERSION_1_1
-
-
-/** 8-bit boolean */
-typedef char ALboolean;
-
-/** character */
-typedef char ALchar;
-
-/** signed 8-bit 2's complement integer */
-typedef signed char ALbyte;
-
-/** unsigned 8-bit integer */
-typedef unsigned char ALubyte;
-
-/** signed 16-bit 2's complement integer */
-typedef short ALshort;
-
-/** unsigned 16-bit integer */
-typedef unsigned short ALushort;
-
-/** signed 32-bit 2's complement integer */
-typedef int ALint;
-
-/** unsigned 32-bit integer */
-typedef unsigned int ALuint;
-
-/** non-negative 32-bit binary integer size */
-typedef int ALsizei;
-
-/** enumerated 32-bit value */
-typedef int ALenum;
-
-/** 32-bit IEEE754 floating-point */
-typedef float ALfloat;
-
-/** 64-bit IEEE754 floating-point */
-typedef double ALdouble;
-
-/**
- * uint64_t:
- * Using <gluegen_stddef.h>
- * Using <gluegen_stdint.h>
- */
-#include <gluegen_stddef.h>
-#define HAS_STDDEF 1
-#include <gluegen_stdint.h>
-
-/** void type (for opaque pointers only) */
-typedef void ALvoid;
-
-/** void* function pointer type for all al*GetProcAddress (By JOAL/GlueGen) */
-typedef void* ALproc;
-
-#if defined(__cplusplus)
-} /* extern "C" */
-#endif
-
-#endif /* AL_AL_TYPES_H */
diff --git a/make/stub_includes/openal/al.h b/make/stub_includes/openal/al.h
index 49ed277..9ecbec7 100644
--- a/make/stub_includes/openal/al.h
+++ b/make/stub_includes/openal/al.h
@@ -1,18 +1,87 @@
+// Based on headers in submodule openal-soft/include/al.h
+
#ifndef AL_AL_H
#define AL_AL_H
-// joal: define prototypes, and disable ext_foldback (requires custom callback code)
+// [GLUEGEN] Because gluegen expose all ext_prototypes
#define AL_ALEXT_PROTOTYPES
-#define AL_EXT_FOLDBACK
-#include "al-types.h"
-#if defined(__cplusplus)
+#ifdef __cplusplus
extern "C" {
#endif
-/* Enumerant values begin at column 50. No tabs. */
+#ifndef AL_API
+ #if defined(AL_LIBTYPE_STATIC)
+ #define AL_API
+ #elif defined(_WIN32)
+ #define AL_API __declspec(dllimport)
+ #else
+ #define AL_API extern
+ #endif
+#endif
+
+#ifdef _WIN32
+ #define AL_APIENTRY __cdecl
+#else
+ #define AL_APIENTRY
+#endif
+
+
+/* Deprecated macros. */
+#define OPENAL
+#define ALAPI AL_API
+#define ALAPIENTRY AL_APIENTRY
+#define AL_INVALID (-1)
+#define AL_ILLEGAL_ENUM AL_INVALID_ENUM
+#define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION
+
+/* Supported AL versions. */
+#define AL_VERSION_1_0
+#define AL_VERSION_1_1
+
+/** 8-bit boolean */
+typedef char ALboolean;
+
+/** character */
+typedef char ALchar;
+
+/** signed 8-bit integer */
+typedef signed char ALbyte;
+
+/** unsigned 8-bit integer */
+typedef unsigned char ALubyte;
+
+/** signed 16-bit integer */
+typedef short ALshort;
+
+/** unsigned 16-bit integer */
+typedef unsigned short ALushort;
+
+/** signed 32-bit integer */
+typedef int ALint;
+
+/** unsigned 32-bit integer */
+typedef unsigned int ALuint;
-/** "no distance model" or "no buffer" */
+/** non-negative 32-bit integer size */
+typedef int ALsizei;
+
+/** 32-bit enumeration value */
+typedef int ALenum;
+
+/** 32-bit IEEE-754 floating-point */
+typedef float ALfloat;
+
+/** 64-bit IEEE-754 floating-point */
+typedef double ALdouble;
+
+/** void type (opaque pointers only) */
+typedef void ALvoid;
+
+
+/* Enumeration values begin at column 50. Do not use tabs. */
+
+/** No distance model or no buffer */
#define AL_NONE 0
/** Boolean False. */
@@ -21,13 +90,14 @@ extern "C" {
/** Boolean True. */
#define AL_TRUE 1
+
/**
* Relative source.
* Type: ALboolean
- * Range: [AL_TRUE, AL_FALSE]
+ * Range: [AL_FALSE, AL_TRUE]
* Default: AL_FALSE
*
- * Specifies if the Source has relative coordinates.
+ * Specifies if the source uses relative coordinates.
*/
#define AL_SOURCE_RELATIVE 0x202
@@ -38,7 +108,8 @@ extern "C" {
* Range: [0 - 360]
* Default: 360
*
- * The angle covered by the inner cone, where the source will not attenuate.
+ * The angle covered by the inner cone, the area within which the source will
+ * not be attenuated by direction.
*/
#define AL_CONE_INNER_ANGLE 0x1001
@@ -47,8 +118,8 @@ extern "C" {
* Range: [0 - 360]
* Default: 360
*
- * The angle covered by the outer cone, where the source will be fully
- * attenuated.
+ * The angle covered by the outer cone, the area outside of which the source
+ * will be fully attenuated by direction.
*/
#define AL_CONE_OUTER_ANGLE 0x1002
@@ -58,7 +129,7 @@ extern "C" {
* Range: [0.5 - 2.0]
* Default: 1.0
*
- * A multiplier for the frequency (sample rate) of the source's buffer.
+ * A multiplier for the sample rate of the source's buffer.
*/
#define AL_PITCH 0x1003
@@ -69,12 +140,12 @@ extern "C" {
*
* The source or listener location in three dimensional space.
*
- * OpenAL, like OpenGL, uses a right handed coordinate system, where in a
- * frontal default view X (thumb) points right, Y points up (index finger), and
- * Z points towards the viewer/camera (middle finger).
+ * OpenAL uses a right handed coordinate system, like OpenGL, where with a
+ * default view, X points right (thumb), Y points up (index finger), and Z
+ * points towards the viewer/camera (middle finger).
*
- * To switch from a left handed coordinate system, flip the sign on the Z
- * coordinate.
+ * To change from or to a left handed coordinate system, negate the Z
+ * component.
*/
#define AL_POSITION 0x1004
@@ -83,8 +154,11 @@ extern "C" {
* Type: ALfloat[3], ALint[3]
* Default: {0, 0, 0}
*
- * Specifies the current direction in local space.
- * A zero-length vector specifies an omni-directional source (cone is ignored).
+ * Specifies the current direction in local space. A zero-length vector
+ * specifies an omni-directional source (cone is ignored).
+ *
+ * To change from or to a left handed coordinate system, negate the Z
+ * component.
*/
#define AL_DIRECTION 0x1005
@@ -93,26 +167,30 @@ extern "C" {
* Type: ALfloat[3], ALint[3]
* Default: {0, 0, 0}
*
- * Specifies the current velocity in local space.
+ * Specifies the current velocity, relative to the position.
+ *
+ * To change from or to a left handed coordinate system, negate the Z
+ * component.
*/
#define AL_VELOCITY 0x1006
/**
* Source looping.
* Type: ALboolean
- * Range: [AL_TRUE, AL_FALSE]
+ * Range: [AL_FALSE, AL_TRUE]
* Default: AL_FALSE
*
- * Specifies whether source is looping.
+ * Specifies whether source playback loops.
*/
#define AL_LOOPING 0x1007
/**
* Source buffer.
- * Type: ALuint
- * Range: any valid Buffer.
+ * Type: ALuint
+ * Range: any valid Buffer ID
+ * Default: AL_NONE
*
- * Specifies the buffer to provide sound samples.
+ * Specifies the buffer to provide sound samples for a source.
*/
#define AL_BUFFER 0x1009
@@ -121,12 +199,12 @@ extern "C" {
* Type: ALfloat
* Range: [0.0 - ]
*
+ * For sources, an initial linear gain value (before attenuation is applied).
+ * For the listener, an output linear gain adjustment.
+ *
* A value of 1.0 means unattenuated. Each division by 2 equals an attenuation
- * of about -6dB. Each multiplicaton by 2 equals an amplification of about
+ * of about -6dB. Each multiplication by 2 equals an amplification of about
* +6dB.
- *
- * A value of 0.0 is meaningless with respect to a logarithmic scale; it is
- * silent.
*/
#define AL_GAIN 0x100A
@@ -135,8 +213,8 @@ extern "C" {
* Type: ALfloat
* Range: [0.0 - 1.0]
*
- * The minimum gain allowed for a source, after distance and cone attenation is
- * applied (if applicable).
+ * The minimum gain allowed for a source, after distance and cone attenuation
+ * are applied (if applicable).
*/
#define AL_MIN_GAIN 0x100D
@@ -145,31 +223,33 @@ extern "C" {
* Type: ALfloat
* Range: [0.0 - 1.0]
*
- * The maximum gain allowed for a source, after distance and cone attenation is
- * applied (if applicable).
+ * The maximum gain allowed for a source, after distance and cone attenuation
+ * are applied (if applicable).
*/
#define AL_MAX_GAIN 0x100E
/**
* Listener orientation.
- * Type: ALfloat[6]
+ * Type: ALfloat[6]
* Default: {0.0, 0.0, -1.0, 0.0, 1.0, 0.0}
*
* Effectively two three dimensional vectors. The first vector is the front (or
- * "at") and the second is the top (or "up").
+ * "at") and the second is the top (or "up"). Both vectors are relative to the
+ * listener position.
*
- * Both vectors are in local space.
+ * To change from or to a left handed coordinate system, negate the Z
+ * component of both vectors.
*/
#define AL_ORIENTATION 0x100F
/**
* Source state (query only).
- * Type: ALint
+ * Type: ALenum
* Range: [AL_INITIAL, AL_PLAYING, AL_PAUSED, AL_STOPPED]
*/
#define AL_SOURCE_STATE 0x1010
-/** Source state value. */
+/* Source state values. */
#define AL_INITIAL 0x1011
#define AL_PLAYING 0x1012
#define AL_PAUSED 0x1013
@@ -202,9 +282,9 @@ extern "C" {
* Range: [0.0 - ]
* Default: 1.0
*
- * The distance in units that no attenuation occurs.
+ * The distance in units that no distance attenuation occurs.
*
- * At 0.0, no distance attenuation ever occurs on non-linear attenuation models.
+ * At 0.0, no distance attenuation occurs with non-linear attenuation models.
*/
#define AL_REFERENCE_DISTANCE 0x1020
@@ -227,7 +307,7 @@ extern "C" {
* Default: 0.0
*
* The gain attenuation applied when the listener is outside of the source's
- * outer cone.
+ * outer cone angle.
*/
#define AL_CONE_OUTER_GAIN 0x1022
@@ -235,7 +315,7 @@ extern "C" {
* Source maximum distance.
* Type: ALfloat
* Range: [0.0 - ]
- * Default: +inf
+ * Default: FLT_MAX
*
* The distance above which the source is not attenuated any further with a
* clamped distance model, or where attenuation reaches 0.0 gain for linear
@@ -243,16 +323,16 @@ extern "C" {
*/
#define AL_MAX_DISTANCE 0x1023
-/** Source buffer position, in seconds */
+/** Source buffer offset, in seconds */
#define AL_SEC_OFFSET 0x1024
-/** Source buffer position, in sample frames */
+/** Source buffer offset, in sample frames */
#define AL_SAMPLE_OFFSET 0x1025
-/** Source buffer position, in bytes */
+/** Source buffer offset, in bytes */
#define AL_BYTE_OFFSET 0x1026
/**
* Source type (query only).
- * Type: ALint
+ * Type: ALenum
* Range: [AL_STATIC, AL_STREAMING, AL_UNDETERMINED]
*
* A Source is Static if a Buffer has been attached using AL_BUFFER.
@@ -265,31 +345,30 @@ extern "C" {
*/
#define AL_SOURCE_TYPE 0x1027
-/** Source type value. */
+/* Source type values. */
#define AL_STATIC 0x1028
#define AL_STREAMING 0x1029
#define AL_UNDETERMINED 0x1030
-/** Buffer format specifier. */
+/** Unsigned 8-bit mono buffer format. */
#define AL_FORMAT_MONO8 0x1100
+/** Signed 16-bit mono buffer format. */
#define AL_FORMAT_MONO16 0x1101
+/** Unsigned 8-bit stereo buffer format. */
#define AL_FORMAT_STEREO8 0x1102
+/** Signed 16-bit stereo buffer format. */
#define AL_FORMAT_STEREO16 0x1103
-/** Buffer frequency (query only). */
+/** Buffer frequency/sample rate (query only). */
#define AL_FREQUENCY 0x2001
/** Buffer bits per sample (query only). */
#define AL_BITS 0x2002
/** Buffer channel count (query only). */
#define AL_CHANNELS 0x2003
-/** Buffer data size (query only). */
+/** Buffer data size in bytes (query only). */
#define AL_SIZE 0x2004
-/**
- * Buffer state.
- *
- * Not for public use.
- */
+/* Buffer state. Not for public use. */
#define AL_UNUSED 0x2010
#define AL_PENDING 0x2011
#define AL_PROCESSED 0x2012
@@ -298,32 +377,31 @@ extern "C" {
/** No error. */
#define AL_NO_ERROR 0
-/** Invalid name paramater passed to AL call. */
+/** Invalid name (ID) passed to an AL call. */
#define AL_INVALID_NAME 0xA001
-/** Invalid enum parameter passed to AL call. */
+/** Invalid enumeration passed to AL call. */
#define AL_INVALID_ENUM 0xA002
-/** Invalid value parameter passed to AL call. */
+/** Invalid value passed to AL call. */
#define AL_INVALID_VALUE 0xA003
/** Illegal AL call. */
#define AL_INVALID_OPERATION 0xA004
-/** Not enough memory. */
+/** Not enough memory to execute the AL call. */
#define AL_OUT_OF_MEMORY 0xA005
-/** Context string: Vendor ID. */
+/** Context string: Vendor name. */
#define AL_VENDOR 0xB001
/** Context string: Version. */
#define AL_VERSION 0xB002
-/** Context string: Renderer ID. */
+/** Context string: Renderer name. */
#define AL_RENDERER 0xB003
/** Context string: Space-separated extension list. */
#define AL_EXTENSIONS 0xB004
-
/**
* Doppler scale.
* Type: ALfloat
@@ -333,7 +411,6 @@ extern "C" {
* Scale for source and listener velocities.
*/
#define AL_DOPPLER_FACTOR 0xC000
-AL_API void AL_APIENTRY alDopplerFactor(ALfloat value);
/**
* Doppler velocity (deprecated).
@@ -341,7 +418,6 @@ AL_API void AL_APIENTRY alDopplerFactor(ALfloat value);
* A multiplier applied to the Speed of Sound.
*/
#define AL_DOPPLER_VELOCITY 0xC001
-AL_API void AL_APIENTRY alDopplerVelocity(ALfloat value);
/**
* Speed of Sound, in units per second.
@@ -350,14 +426,13 @@ AL_API void AL_APIENTRY alDopplerVelocity(ALfloat value);
* Default: 343.3
*
* The speed at which sound waves are assumed to travel, when calculating the
- * doppler effect.
+ * doppler effect from source and listener velocities.
*/
#define AL_SPEED_OF_SOUND 0xC003
-AL_API void AL_APIENTRY alSpeedOfSound(ALfloat value);
/**
* Distance attenuation model.
- * Type: ALint
+ * Type: ALenum
* Range: [AL_NONE, AL_INVERSE_DISTANCE, AL_INVERSE_DISTANCE_CLAMPED,
* AL_LINEAR_DISTANCE, AL_LINEAR_DISTANCE_CLAMPED,
* AL_EXPONENT_DISTANCE, AL_EXPONENT_DISTANCE_CLAMPED]
@@ -374,9 +449,8 @@ AL_API void AL_APIENTRY alSpeedOfSound(ALfloat value);
* distance calculated is clamped between the reference and max distances.
*/
#define AL_DISTANCE_MODEL 0xD000
-AL_API void AL_APIENTRY alDistanceModel(ALenum distanceModel);
-/** Distance model value. */
+/* Distance model values. */
#define AL_INVERSE_DISTANCE 0xD001
#define AL_INVERSE_DISTANCE_CLAMPED 0xD002
#define AL_LINEAR_DISTANCE 0xD003
@@ -384,12 +458,19 @@ AL_API void AL_APIENTRY alDistanceModel(ALenum distanceModel);
#define AL_EXPONENT_DISTANCE 0xD005
#define AL_EXPONENT_DISTANCE_CLAMPED 0xD006
-/** Renderer State management. */
+#ifndef AL_NO_PROTOTYPES
+/* Renderer State management. */
AL_API void AL_APIENTRY alEnable(ALenum capability);
AL_API void AL_APIENTRY alDisable(ALenum capability);
AL_API ALboolean AL_APIENTRY alIsEnabled(ALenum capability);
-/** State retrieval. */
+/* Context state setting. */
+AL_API void AL_APIENTRY alDopplerFactor(ALfloat value);
+AL_API void AL_APIENTRY alDopplerVelocity(ALfloat value);
+AL_API void AL_APIENTRY alSpeedOfSound(ALfloat value);
+AL_API void AL_APIENTRY alDistanceModel(ALenum distanceModel);
+
+/* Context state retrieval. */
AL_API const ALchar* AL_APIENTRY alGetString(ALenum param);
AL_API void AL_APIENTRY alGetBooleanv(ALenum param, ALboolean *values);
AL_API void AL_APIENTRY alGetIntegerv(ALenum param, ALint *values);
@@ -401,24 +482,25 @@ AL_API ALfloat AL_APIENTRY alGetFloat(ALenum param);
AL_API ALdouble AL_APIENTRY alGetDouble(ALenum param);
/**
- * Error retrieval.
- *
- * Obtain the first error generated in the AL context since the last check.
+ * Obtain the first error generated in the AL context since the last call to
+ * this function.
*/
AL_API ALenum AL_APIENTRY alGetError(void);
+/** Query for the presence of an extension on the AL context. */
+AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extname);
/**
- * Extension support.
- *
- * Query for the presence of an extension, and obtain any appropriate function
- * pointers and enum values.
+ * Retrieve the address of a function. The returned function may be context-
+ * specific.
+ */
+AL_API void* AL_APIENTRY alGetProcAddress(const ALchar *fname);
+/**
+ * Retrieve the value of an enum. The returned value may be context-specific.
*/
-AL_API ALboolean AL_APIENTRY alIsExtensionPresent(const ALchar *extname);
-AL_API ALproc AL_APIENTRY alGetProcAddress(const ALchar *fname);
AL_API ALenum AL_APIENTRY alGetEnumValue(const ALchar *ename);
-/** Set Listener parameters */
+/* Set listener parameters. */
AL_API void AL_APIENTRY alListenerf(ALenum param, ALfloat value);
AL_API void AL_APIENTRY alListener3f(ALenum param, ALfloat value1, ALfloat value2, ALfloat value3);
AL_API void AL_APIENTRY alListenerfv(ALenum param, const ALfloat *values);
@@ -426,7 +508,7 @@ AL_API void AL_APIENTRY alListeneri(ALenum param, ALint value);
AL_API void AL_APIENTRY alListener3i(ALenum param, ALint value1, ALint value2, ALint value3);
AL_API void AL_APIENTRY alListeneriv(ALenum param, const ALint *values);
-/** Get Listener parameters */
+/* Get listener parameters. */
AL_API void AL_APIENTRY alGetListenerf(ALenum param, ALfloat *value);
AL_API void AL_APIENTRY alGetListener3f(ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3);
AL_API void AL_APIENTRY alGetListenerfv(ALenum param, ALfloat *values);
@@ -435,14 +517,14 @@ AL_API void AL_APIENTRY alGetListener3i(ALenum param, ALint *value1, ALint *valu
AL_API void AL_APIENTRY alGetListeneriv(ALenum param, ALint *values);
-/** Create Source objects. */
+/** Create source objects. */
AL_API void AL_APIENTRY alGenSources(ALsizei n, ALuint *sources);
-/** Delete Source objects. */
+/** Delete source objects. */
AL_API void AL_APIENTRY alDeleteSources(ALsizei n, const ALuint *sources);
-/** Verify a handle is a valid Source. */
+/** Verify an ID is for a valid source. */
AL_API ALboolean AL_APIENTRY alIsSource(ALuint source);
-/** Set Source parameters. */
+/* Set source parameters. */
AL_API void AL_APIENTRY alSourcef(ALuint source, ALenum param, ALfloat value);
AL_API void AL_APIENTRY alSource3f(ALuint source, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3);
AL_API void AL_APIENTRY alSourcefv(ALuint source, ALenum param, const ALfloat *values);
@@ -450,7 +532,7 @@ AL_API void AL_APIENTRY alSourcei(ALuint source, ALenum param, ALint value);
AL_API void AL_APIENTRY alSource3i(ALuint source, ALenum param, ALint value1, ALint value2, ALint value3);
AL_API void AL_APIENTRY alSourceiv(ALuint source, ALenum param, const ALint *values);
-/** Get Source parameters. */
+/* Get source parameters. */
AL_API void AL_APIENTRY alGetSourcef(ALuint source, ALenum param, ALfloat *value);
AL_API void AL_APIENTRY alGetSource3f(ALuint source, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3);
AL_API void AL_APIENTRY alGetSourcefv(ALuint source, ALenum param, ALfloat *values);
@@ -459,41 +541,44 @@ AL_API void AL_APIENTRY alGetSource3i(ALuint source, ALenum param, ALint *value1
AL_API void AL_APIENTRY alGetSourceiv(ALuint source, ALenum param, ALint *values);
-/** Play, replay, or resume (if paused) a list of Sources */
-AL_API void AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources);
-/** Stop a list of Sources */
-AL_API void AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources);
-/** Rewind a list of Sources */
-AL_API void AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources);
-/** Pause a list of Sources */
-AL_API void AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources);
-
-/** Play, replay, or resume a Source */
+/** Play, restart, or resume a source, setting its state to AL_PLAYING. */
AL_API void AL_APIENTRY alSourcePlay(ALuint source);
-/** Stop a Source */
+/** Stop a source, setting its state to AL_STOPPED if playing or paused. */
AL_API void AL_APIENTRY alSourceStop(ALuint source);
-/** Rewind a Source (set playback postiton to beginning) */
+/** Rewind a source, setting its state to AL_INITIAL. */
AL_API void AL_APIENTRY alSourceRewind(ALuint source);
-/** Pause a Source */
+/** Pause a source, setting its state to AL_PAUSED if playing. */
AL_API void AL_APIENTRY alSourcePause(ALuint source);
+/** Play, restart, or resume a list of sources atomically. */
+AL_API void AL_APIENTRY alSourcePlayv(ALsizei n, const ALuint *sources);
+/** Stop a list of sources atomically. */
+AL_API void AL_APIENTRY alSourceStopv(ALsizei n, const ALuint *sources);
+/** Rewind a list of sources atomically. */
+AL_API void AL_APIENTRY alSourceRewindv(ALsizei n, const ALuint *sources);
+/** Pause a list of sources atomically. */
+AL_API void AL_APIENTRY alSourcePausev(ALsizei n, const ALuint *sources);
+
/** Queue buffers onto a source */
AL_API void AL_APIENTRY alSourceQueueBuffers(ALuint source, ALsizei nb, const ALuint *buffers);
/** Unqueue processed buffers from a source */
AL_API void AL_APIENTRY alSourceUnqueueBuffers(ALuint source, ALsizei nb, ALuint *buffers);
-/** Create Buffer objects */
+/** Create buffer objects */
AL_API void AL_APIENTRY alGenBuffers(ALsizei n, ALuint *buffers);
-/** Delete Buffer objects */
+/** Delete buffer objects */
AL_API void AL_APIENTRY alDeleteBuffers(ALsizei n, const ALuint *buffers);
-/** Verify a handle is a valid Buffer */
+/** Verify an ID is a valid buffer (including the NULL buffer) */
AL_API ALboolean AL_APIENTRY alIsBuffer(ALuint buffer);
-/** Specifies the data to be copied into a buffer */
-AL_API void AL_APIENTRY alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq);
+/**
+ * Copies data into the buffer, interpreting it using the specified format and
+ * samplerate.
+ */
+AL_API void AL_APIENTRY alBufferData(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei samplerate);
-/** Set Buffer parameters, */
+/* Set buffer parameters. */
AL_API void AL_APIENTRY alBufferf(ALuint buffer, ALenum param, ALfloat value);
AL_API void AL_APIENTRY alBuffer3f(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3);
AL_API void AL_APIENTRY alBufferfv(ALuint buffer, ALenum param, const ALfloat *values);
@@ -501,15 +586,18 @@ AL_API void AL_APIENTRY alBufferi(ALuint buffer, ALenum param, ALint value);
AL_API void AL_APIENTRY alBuffer3i(ALuint buffer, ALenum param, ALint value1, ALint value2, ALint value3);
AL_API void AL_APIENTRY alBufferiv(ALuint buffer, ALenum param, const ALint *values);
-/** Get Buffer parameters. */
+/* Get buffer parameters. */
AL_API void AL_APIENTRY alGetBufferf(ALuint buffer, ALenum param, ALfloat *value);
AL_API void AL_APIENTRY alGetBuffer3f(ALuint buffer, ALenum param, ALfloat *value1, ALfloat *value2, ALfloat *value3);
AL_API void AL_APIENTRY alGetBufferfv(ALuint buffer, ALenum param, ALfloat *values);
AL_API void AL_APIENTRY alGetBufferi(ALuint buffer, ALenum param, ALint *value);
AL_API void AL_APIENTRY alGetBuffer3i(ALuint buffer, ALenum param, ALint *value1, ALint *value2, ALint *value3);
AL_API void AL_APIENTRY alGetBufferiv(ALuint buffer, ALenum param, ALint *values);
+#endif /* AL_NO_PROTOTYPES */
-/** Pointer-to-function type, useful for dynamically getting AL entry points. */
+/* Pointer-to-function types, useful for storing dynamically loaded AL entry
+ * points.
+ */
typedef void (AL_APIENTRY *LPALENABLE)(ALenum capability);
typedef void (AL_APIENTRY *LPALDISABLE)(ALenum capability);
typedef ALboolean (AL_APIENTRY *LPALISENABLED)(ALenum capability);
@@ -566,7 +654,7 @@ typedef void (AL_APIENTRY *LPALSOURCEUNQUEUEBUFFERS)(ALuint source, ALs
typedef void (AL_APIENTRY *LPALGENBUFFERS)(ALsizei n, ALuint *buffers);
typedef void (AL_APIENTRY *LPALDELETEBUFFERS)(ALsizei n, const ALuint *buffers);
typedef ALboolean (AL_APIENTRY *LPALISBUFFER)(ALuint buffer);
-typedef void (AL_APIENTRY *LPALBUFFERDATA)(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei freq);
+typedef void (AL_APIENTRY *LPALBUFFERDATA)(ALuint buffer, ALenum format, const ALvoid *data, ALsizei size, ALsizei samplerate);
typedef void (AL_APIENTRY *LPALBUFFERF)(ALuint buffer, ALenum param, ALfloat value);
typedef void (AL_APIENTRY *LPALBUFFER3F)(ALuint buffer, ALenum param, ALfloat value1, ALfloat value2, ALfloat value3);
typedef void (AL_APIENTRY *LPALBUFFERFV)(ALuint buffer, ALenum param, const ALfloat *values);
@@ -584,7 +672,7 @@ typedef void (AL_APIENTRY *LPALDOPPLERVELOCITY)(ALfloat value);
typedef void (AL_APIENTRY *LPALSPEEDOFSOUND)(ALfloat value);
typedef void (AL_APIENTRY *LPALDISTANCEMODEL)(ALenum distanceModel);
-#if defined(__cplusplus)
+#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/make/stub_includes/openal/alc-types.h b/make/stub_includes/openal/alc-types.h
deleted file mode 100644
index 2616af8..0000000
--- a/make/stub_includes/openal/alc-types.h
+++ /dev/null
@@ -1,99 +0,0 @@
-#ifndef AL_ALC_TYPES_H
-#define AL_ALC_TYPES_H
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-#ifndef ALC_API
- #if defined(AL_LIBTYPE_STATIC)
- #define ALC_API
- #elif defined(_WIN32)
- #define ALC_API __declspec(dllimport)
- #else
- #define ALC_API extern
- #endif
-#endif
-
-#if defined(_WIN32)
- #define ALC_APIENTRY __cdecl
-#else
- #define ALC_APIENTRY
-#endif
-
-#if defined(TARGET_OS_MAC) && TARGET_OS_MAC
- #pragma export on
-#endif
-
-/*
- * The ALCAPI, ALCAPIENTRY, and ALC_INVALID macros are deprecated, but are
- * included for applications porting code from AL 1.0
- */
-#define ALCAPI ALC_API
-#define ALCAPIENTRY ALC_APIENTRY
-#define ALC_INVALID 0
-
-/** ALC Version */
-#define ALC_VERSION_0_1 1
-
-/** Opaque device handle */
-typedef struct ALCdevice_struct ALCdevice;
-/** Opaque context handle */
-typedef struct ALCcontext_struct ALCcontext;
-
-/** 8-bit boolean */
-typedef char ALCboolean;
-
-/** character */
-typedef char ALCchar;
-
-/** signed 8-bit 2's complement integer */
-typedef signed char ALCbyte;
-
-/** unsigned 8-bit integer */
-typedef unsigned char ALCubyte;
-
-/** signed 16-bit 2's complement integer */
-typedef short ALCshort;
-
-/** unsigned 16-bit integer */
-typedef unsigned short ALCushort;
-
-/** signed 32-bit 2's complement integer */
-typedef int ALCint;
-
-/** unsigned 32-bit integer */
-typedef unsigned int ALCuint;
-
-/** non-negative 32-bit binary integer size */
-typedef int ALCsizei;
-
-/** enumerated 32-bit value */
-typedef int ALCenum;
-
-/** 32-bit IEEE754 floating-point */
-typedef float ALCfloat;
-
-/** 64-bit IEEE754 floating-point */
-typedef double ALCdouble;
-
-/** void type (for opaque pointers only) */
-typedef void ALCvoid;
-
-/** void* function pointer type for all al*GetProcAddress (By JOAL/GlueGen) */
-typedef void* ALCproc;
-
-/**
- * intptr_t:
- * Using <gluegen_stddef.h>
- * Using <gluegen_stdint.h>
- */
-#include <gluegen_stddef.h>
-#define HAS_STDDEF 1
-#include <gluegen_stdint.h>
-
-#if defined(__cplusplus)
-} /* extern "C" */
-#endif
-
-#endif /* AL_ALC_TYPES_H */
diff --git a/make/stub_includes/openal/alc.h b/make/stub_includes/openal/alc.h
index 4170b62..f463a0e 100644
--- a/make/stub_includes/openal/alc.h
+++ b/make/stub_includes/openal/alc.h
@@ -1,13 +1,83 @@
+// Based on headers in submodule openal-soft/include/alc.h
+
#ifndef AL_ALC_H
#define AL_ALC_H
-#include "alc-types.h"
-
-#if defined(__cplusplus)
+#ifdef __cplusplus
extern "C" {
#endif
-/* Enumerant values begin at column 50. No tabs. */
+#ifndef ALC_API
+ #if defined(AL_LIBTYPE_STATIC)
+ #define ALC_API
+ #elif defined(_WIN32)
+ #define ALC_API __declspec(dllimport)
+ #else
+ #define ALC_API extern
+ #endif
+#endif
+
+#ifdef _WIN32
+ #define ALC_APIENTRY __cdecl
+#else
+ #define ALC_APIENTRY
+#endif
+
+
+/* Deprecated macros. */
+#define ALCAPI ALC_API
+#define ALCAPIENTRY ALC_APIENTRY
+#define ALC_INVALID 0
+
+/** Supported ALC version? */
+#define ALC_VERSION_0_1 1
+
+/** Opaque device handle */
+typedef struct ALCdevice ALCdevice;
+/** Opaque context handle */
+typedef struct ALCcontext ALCcontext;
+
+/** 8-bit boolean */
+typedef char ALCboolean;
+
+/** character */
+typedef char ALCchar;
+
+/** signed 8-bit integer */
+typedef signed char ALCbyte;
+
+/** unsigned 8-bit integer */
+typedef unsigned char ALCubyte;
+
+/** signed 16-bit integer */
+typedef short ALCshort;
+
+/** unsigned 16-bit integer */
+typedef unsigned short ALCushort;
+
+/** signed 32-bit integer */
+typedef int ALCint;
+
+/** unsigned 32-bit integer */
+typedef unsigned int ALCuint;
+
+/** non-negative 32-bit integer size */
+typedef int ALCsizei;
+
+/** 32-bit enumeration value */
+typedef int ALCenum;
+
+/** 32-bit IEEE-754 floating-point */
+typedef float ALCfloat;
+
+/** 64-bit IEEE-754 floating-point */
+typedef double ALCdouble;
+
+/** void type (for opaque pointers only) */
+typedef void ALCvoid;
+
+
+/* Enumeration values begin at column 50. Do not use tabs. */
/** Boolean False. */
#define ALC_FALSE 0
@@ -21,7 +91,7 @@ extern "C" {
/** Context attribute: <int> Hz. */
#define ALC_REFRESH 0x1008
-/** Context attribute: AL_TRUE or AL_FALSE. */
+/** Context attribute: AL_TRUE or AL_FALSE synchronous context? */
#define ALC_SYNC 0x1009
/** Context attribute: <int> requested Mono (3D) Sources. */
@@ -39,30 +109,32 @@ extern "C" {
/** Invalid context handle. */
#define ALC_INVALID_CONTEXT 0xA002
-/** Invalid enum parameter passed to an ALC call. */
+/** Invalid enumeration passed to an ALC call. */
#define ALC_INVALID_ENUM 0xA003
-/** Invalid value parameter passed to an ALC call. */
+/** Invalid value passed to an ALC call. */
#define ALC_INVALID_VALUE 0xA004
/** Out of memory. */
#define ALC_OUT_OF_MEMORY 0xA005
-/** Runtime ALC version. */
+/** Runtime ALC major version. */
#define ALC_MAJOR_VERSION 0x1000
+/** Runtime ALC minor version. */
#define ALC_MINOR_VERSION 0x1001
-/** Context attribute list properties. */
+/** Context attribute list size. */
#define ALC_ATTRIBUTES_SIZE 0x1002
+/** Context attribute list properties. */
#define ALC_ALL_ATTRIBUTES 0x1003
/** String for the default device specifier. */
#define ALC_DEFAULT_DEVICE_SPECIFIER 0x1004
/**
- * String for the given device's specifier.
+ * Device specifier string.
*
- * If device handle is NULL, it is instead a null-char separated list of
+ * If device handle is NULL, it is instead a null-character separated list of
* strings of known device specifiers (list ends with an empty string).
*/
#define ALC_DEVICE_SPECIFIER 0x1005
@@ -73,9 +145,9 @@ extern "C" {
/** Capture extension */
#define ALC_EXT_CAPTURE 1
/**
- * String for the given capture device's specifier.
+ * Capture device specifier string.
*
- * If device handle is NULL, it is instead a null-char separated list of
+ * If device handle is NULL, it is instead a null-character separated list of
* strings of known capture device specifiers (list ends with an empty string).
*/
#define ALC_CAPTURE_DEVICE_SPECIFIER 0x310
@@ -90,57 +162,92 @@ extern "C" {
/** String for the default extended device specifier. */
#define ALC_DEFAULT_ALL_DEVICES_SPECIFIER 0x1012
/**
- * String for the given extended device's specifier.
+ * Device's extended specifier string.
*
- * If device handle is NULL, it is instead a null-char separated list of
+ * If device handle is NULL, it is instead a null-character separated list of
* strings of known extended device specifiers (list ends with an empty string).
*/
#define ALC_ALL_DEVICES_SPECIFIER 0x1013
-/** Context management. */
-ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint* attrlist);
+#ifndef ALC_NO_PROTOTYPES
+/* Context management. */
+
+/** Create and attach a context to the given device. */
+ALC_API ALCcontext* ALC_APIENTRY alcCreateContext(ALCdevice *device, const ALCint *attrlist);
+/**
+ * Makes the given context the active process-wide context. Passing NULL clears
+ * the active context.
+ */
ALC_API ALCboolean ALC_APIENTRY alcMakeContextCurrent(ALCcontext *context);
+/** Resumes processing updates for the given context. */
ALC_API void ALC_APIENTRY alcProcessContext(ALCcontext *context);
+/** Suspends updates for the given context. */
ALC_API void ALC_APIENTRY alcSuspendContext(ALCcontext *context);
+/** Remove a context from its device and destroys it. */
ALC_API void ALC_APIENTRY alcDestroyContext(ALCcontext *context);
+/** Returns the currently active context. */
ALC_API ALCcontext* ALC_APIENTRY alcGetCurrentContext(void);
+/** Returns the device that a particular context is attached to. */
ALC_API ALCdevice* ALC_APIENTRY alcGetContextsDevice(ALCcontext *context);
-/** Device management. */
+/* Device management. */
+
+/** Opens the named playback device. */
ALC_API ALCdevice* ALC_APIENTRY alcOpenDevice(const ALCchar *devicename);
+/** Closes the given playback device. */
ALC_API ALCboolean ALC_APIENTRY alcCloseDevice(ALCdevice *device);
+/* Error support. */
-/**
- * Error support.
- *
- * Obtain the most recent Device error.
- */
+/** Obtain the most recent Device error. */
ALC_API ALCenum ALC_APIENTRY alcGetError(ALCdevice *device);
+/* Extension support. */
+
/**
- * Extension support.
- *
- * Query for the presence of an extension, and obtain any appropriate
- * function pointers and enum values.
+ * Query for the presence of an extension on the device. Pass a NULL device to
+ * query a device-inspecific extension.
*/
ALC_API ALCboolean ALC_APIENTRY alcIsExtensionPresent(ALCdevice *device, const ALCchar *extname);
-ALC_API ALCproc ALC_APIENTRY alcGetProcAddress(ALCdevice *device, const ALCchar *funcname);
+/**
+ * Retrieve the address of a function. Given a non-NULL device, the returned
+ * function may be device-specific.
+ */
+ALC_API ALCvoid* ALC_APIENTRY alcGetProcAddress(ALCdevice *device, const ALCchar *funcname);
+/**
+ * Retrieve the value of an enum. Given a non-NULL device, the returned value
+ * may be device-specific.
+ */
ALC_API ALCenum ALC_APIENTRY alcGetEnumValue(ALCdevice *device, const ALCchar *enumname);
-/** Query function. */
+/* Query functions. */
+
+/** Returns information about the device, and error strings. */
ALC_API const ALCchar* ALC_APIENTRY alcGetString(ALCdevice *device, ALCenum param);
+/** Returns information about the device and the version of OpenAL. */
ALC_API void ALC_APIENTRY alcGetIntegerv(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values);
-/** Capture function. */
+/* Capture functions. */
+
+/**
+ * Opens the named capture device with the given frequency, format, and buffer
+ * size.
+ */
ALC_API ALCdevice* ALC_APIENTRY alcCaptureOpenDevice(const ALCchar *devicename, ALCuint frequency, ALCenum format, ALCsizei buffersize);
+/** Closes the given capture device. */
ALC_API ALCboolean ALC_APIENTRY alcCaptureCloseDevice(ALCdevice *device);
+/** Starts capturing samples into the device buffer. */
ALC_API void ALC_APIENTRY alcCaptureStart(ALCdevice *device);
+/** Stops capturing samples. Samples in the device buffer remain available. */
ALC_API void ALC_APIENTRY alcCaptureStop(ALCdevice *device);
+/** Reads samples from the device buffer. */
ALC_API void ALC_APIENTRY alcCaptureSamples(ALCdevice *device, ALCvoid *buffer, ALCsizei samples);
+#endif /* ALC_NO_PROTOTYPES */
-/** Pointer-to-function type, useful for dynamically getting ALC entry points. */
+/* Pointer-to-function types, useful for storing dynamically loaded ALC entry
+ * points.
+ */
typedef ALCcontext* (ALC_APIENTRY *LPALCCREATECONTEXT)(ALCdevice *device, const ALCint *attrlist);
typedef ALCboolean (ALC_APIENTRY *LPALCMAKECONTEXTCURRENT)(ALCcontext *context);
typedef void (ALC_APIENTRY *LPALCPROCESSCONTEXT)(ALCcontext *context);
@@ -152,7 +259,7 @@ typedef ALCdevice* (ALC_APIENTRY *LPALCOPENDEVICE)(const ALCchar *devicename
typedef ALCboolean (ALC_APIENTRY *LPALCCLOSEDEVICE)(ALCdevice *device);
typedef ALCenum (ALC_APIENTRY *LPALCGETERROR)(ALCdevice *device);
typedef ALCboolean (ALC_APIENTRY *LPALCISEXTENSIONPRESENT)(ALCdevice *device, const ALCchar *extname);
-typedef void* (ALC_APIENTRY *LPALCGETPROCADDRESS)(ALCdevice *device, const ALCchar *funcname);
+typedef ALCvoid* (ALC_APIENTRY *LPALCGETPROCADDRESS)(ALCdevice *device, const ALCchar *funcname);
typedef ALCenum (ALC_APIENTRY *LPALCGETENUMVALUE)(ALCdevice *device, const ALCchar *enumname);
typedef const ALCchar* (ALC_APIENTRY *LPALCGETSTRING)(ALCdevice *device, ALCenum param);
typedef void (ALC_APIENTRY *LPALCGETINTEGERV)(ALCdevice *device, ALCenum param, ALCsizei size, ALCint *values);
@@ -162,8 +269,8 @@ typedef void (ALC_APIENTRY *LPALCCAPTURESTART)(ALCdevice *device);
typedef void (ALC_APIENTRY *LPALCCAPTURESTOP)(ALCdevice *device);
typedef void (ALC_APIENTRY *LPALCCAPTURESAMPLES)(ALCdevice *device, ALCvoid *buffer, ALCsizei samples);
-#if defined(__cplusplus)
-}
+#ifdef __cplusplus
+} /* extern "C" */
#endif
#endif /* AL_ALC_H */
diff --git a/make/stub_includes/openal/alext.h b/make/stub_includes/openal/alext.h
index 3c53033..3a5918c 100644
--- a/make/stub_includes/openal/alext.h
+++ b/make/stub_includes/openal/alext.h
@@ -1,29 +1,24 @@
-/**
- * OpenAL cross platform audio library
- * Copyright (C) 2008 by authors.
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- * Or go to http://www.gnu.org/copyleft/lgpl.html
- */
+// Based on headers in submodule openal-soft/include/alext.h
#ifndef AL_ALEXT_H
#define AL_ALEXT_H
-// JOAL removed include of
-// stddef.h, inttypes.h, stdint.h or inttypes.h
-// tese headers confuse gluegen if in use.
+#include <stddef.h>
+/* Define int64 and uint64 types */
+#if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L) || \
+ (defined(__cplusplus) && __cplusplus >= 201103L)
+#include <stdint.h>
+typedef int64_t _alsoft_int64_t;
+typedef uint64_t _alsoft_uint64_t;
+#elif defined(_WIN32)
+typedef __int64 _alsoft_int64_t;
+typedef unsigned __int64 _alsoft_uint64_t;
+#else
+/* Fallback if nothing above works */
+#include <stdint.h>
+typedef int64_t _alsoft_int64_t;
+typedef uint64_t _alsoft_uint64_t;
+#endif
#include "alc.h"
#include "al.h"
@@ -87,6 +82,31 @@ extern "C" {
#ifndef AL_EXT_MCFORMATS
#define AL_EXT_MCFORMATS 1
+/* Provides support for surround sound buffer formats with 8, 16, and 32-bit
+ * samples.
+ *
+ * QUAD8: Unsigned 8-bit, Quadraphonic (Front Left, Front Right, Rear Left,
+ * Rear Right).
+ * QUAD16: Signed 16-bit, Quadraphonic.
+ * QUAD32: 32-bit float, Quadraphonic.
+ * REAR8: Unsigned 8-bit, Rear Stereo (Rear Left, Rear Right).
+ * REAR16: Signed 16-bit, Rear Stereo.
+ * REAR32: 32-bit float, Rear Stereo.
+ * 51CHN8: Unsigned 8-bit, 5.1 Surround (Front Left, Front Right, Front Center,
+ * LFE, Side Left, Side Right). Note that some audio systems may label
+ * 5.1's Side channels as Rear or Surround; they are equivalent for the
+ * purposes of this extension.
+ * 51CHN16: Signed 16-bit, 5.1 Surround.
+ * 51CHN32: 32-bit float, 5.1 Surround.
+ * 61CHN8: Unsigned 8-bit, 6.1 Surround (Front Left, Front Right, Front Center,
+ * LFE, Rear Center, Side Left, Side Right).
+ * 61CHN16: Signed 16-bit, 6.1 Surround.
+ * 61CHN32: 32-bit float, 6.1 Surround.
+ * 71CHN8: Unsigned 8-bit, 7.1 Surround (Front Left, Front Right, Front Center,
+ * LFE, Rear Left, Rear Right, Side Left, Side Right).
+ * 71CHN16: Signed 16-bit, 7.1 Surround.
+ * 71CHN32: 32-bit float, 7.1 Surround.
+ */
#define AL_FORMAT_QUAD8 0x1204
#define AL_FORMAT_QUAD16 0x1205
#define AL_FORMAT_QUAD32 0x1206
@@ -123,9 +143,9 @@ extern "C" {
#ifndef AL_EXT_STATIC_BUFFER
#define AL_EXT_STATIC_BUFFER 1
-typedef ALvoid (AL_APIENTRY*PFNALBUFFERDATASTATICPROC)(const ALint,ALenum,ALvoid*,ALsizei,ALsizei);
+typedef void (AL_APIENTRY*PFNALBUFFERDATASTATICPROC)(const ALuint,ALenum,ALvoid*,ALsizei,ALsizei);
#ifdef AL_ALEXT_PROTOTYPES
-AL_API ALvoid AL_APIENTRY alBufferDataStatic(const ALint buffer, ALenum format, ALvoid *data, ALsizei len, ALsizei freq);
+void AL_APIENTRY alBufferDataStatic(const ALuint buffer, ALenum format, ALvoid *data, ALsizei size, ALsizei freq);
#endif
#endif
@@ -158,9 +178,9 @@ ALC_API ALCcontext* ALC_APIENTRY alcGetThreadContext(void);
#define AL_SOFT_buffer_sub_data 1
#define AL_BYTE_RW_OFFSETS_SOFT 0x1031
#define AL_SAMPLE_RW_OFFSETS_SOFT 0x1032
-typedef ALvoid (AL_APIENTRY*PFNALBUFFERSUBDATASOFTPROC)(ALuint,ALenum,const ALvoid*,ALsizei,ALsizei);
+typedef void (AL_APIENTRY*PFNALBUFFERSUBDATASOFTPROC)(ALuint,ALenum,const ALvoid*,ALsizei,ALsizei);
#ifdef AL_ALEXT_PROTOTYPES
-AL_API ALvoid AL_APIENTRY alBufferSubDataSOFT(ALuint buffer,ALenum format,const ALvoid *data,ALsizei offset,ALsizei length);
+AL_API void AL_APIENTRY alBufferSubDataSOFT(ALuint buffer,ALenum format,const ALvoid *data,ALsizei offset,ALsizei length);
#endif
#endif
@@ -308,8 +328,8 @@ ALC_API void ALC_APIENTRY alcRenderSamplesSOFT(ALCdevice *device, ALCvoid *buffe
#define AL_SOFT_source_latency 1
#define AL_SAMPLE_OFFSET_LATENCY_SOFT 0x1200
#define AL_SEC_OFFSET_LATENCY_SOFT 0x1201
-typedef int64_t ALint64SOFT;
-typedef uint64_t ALuint64SOFT;
+typedef _alsoft_int64_t ALint64SOFT;
+typedef _alsoft_uint64_t ALuint64SOFT;
typedef void (AL_APIENTRY*LPALSOURCEDSOFT)(ALuint,ALenum,ALdouble);
typedef void (AL_APIENTRY*LPALSOURCE3DSOFT)(ALuint,ALenum,ALdouble,ALdouble,ALdouble);
typedef void (AL_APIENTRY*LPALSOURCEDVSOFT)(ALuint,ALenum,const ALdouble*);
@@ -338,6 +358,194 @@ AL_API void AL_APIENTRY alGetSourcei64vSOFT(ALuint source, ALenum param, ALint64
#endif
#endif
+#ifndef ALC_EXT_DEFAULT_FILTER_ORDER
+#define ALC_EXT_DEFAULT_FILTER_ORDER 1
+#define ALC_DEFAULT_FILTER_ORDER 0x1100
+#endif
+
+#ifndef AL_SOFT_deferred_updates
+#define AL_SOFT_deferred_updates 1
+#define AL_DEFERRED_UPDATES_SOFT 0xC002
+typedef void (AL_APIENTRY*LPALDEFERUPDATESSOFT)(void);
+typedef void (AL_APIENTRY*LPALPROCESSUPDATESSOFT)(void);
+#ifdef AL_ALEXT_PROTOTYPES
+AL_API void AL_APIENTRY alDeferUpdatesSOFT(void);
+AL_API void AL_APIENTRY alProcessUpdatesSOFT(void);
+#endif
+#endif
+
+#ifndef AL_SOFT_block_alignment
+#define AL_SOFT_block_alignment 1
+#define AL_UNPACK_BLOCK_ALIGNMENT_SOFT 0x200C
+#define AL_PACK_BLOCK_ALIGNMENT_SOFT 0x200D
+#endif
+
+#ifndef AL_SOFT_MSADPCM
+#define AL_SOFT_MSADPCM 1
+#define AL_FORMAT_MONO_MSADPCM_SOFT 0x1302
+#define AL_FORMAT_STEREO_MSADPCM_SOFT 0x1303
+#endif
+
+#ifndef AL_SOFT_source_length
+#define AL_SOFT_source_length 1
+/*#define AL_BYTE_LENGTH_SOFT 0x2009*/
+/*#define AL_SAMPLE_LENGTH_SOFT 0x200A*/
+/*#define AL_SEC_LENGTH_SOFT 0x200B*/
+#endif
+
+#ifndef AL_SOFT_buffer_length_query
+#define AL_SOFT_buffer_length_query 1
+/*#define AL_BYTE_LENGTH_SOFT 0x2009*/
+/*#define AL_SAMPLE_LENGTH_SOFT 0x200A*/
+/*#define AL_SEC_LENGTH_SOFT 0x200B*/
+#endif
+
+#ifndef ALC_SOFT_pause_device
+#define ALC_SOFT_pause_device 1
+typedef void (ALC_APIENTRY*LPALCDEVICEPAUSESOFT)(ALCdevice *device);
+typedef void (ALC_APIENTRY*LPALCDEVICERESUMESOFT)(ALCdevice *device);
+#ifdef AL_ALEXT_PROTOTYPES
+ALC_API void ALC_APIENTRY alcDevicePauseSOFT(ALCdevice *device);
+ALC_API void ALC_APIENTRY alcDeviceResumeSOFT(ALCdevice *device);
+#endif
+#endif
+
+#ifndef AL_EXT_BFORMAT
+#define AL_EXT_BFORMAT 1
+/* Provides support for B-Format ambisonic buffers (first-order, FuMa scaling
+ * and layout).
+ *
+ * BFORMAT2D_8: Unsigned 8-bit, 3-channel non-periphonic (WXY).
+ * BFORMAT2D_16: Signed 16-bit, 3-channel non-periphonic (WXY).
+ * BFORMAT2D_FLOAT32: 32-bit float, 3-channel non-periphonic (WXY).
+ * BFORMAT3D_8: Unsigned 8-bit, 4-channel periphonic (WXYZ).
+ * BFORMAT3D_16: Signed 16-bit, 4-channel periphonic (WXYZ).
+ * BFORMAT3D_FLOAT32: 32-bit float, 4-channel periphonic (WXYZ).
+ */
+#define AL_FORMAT_BFORMAT2D_8 0x20021
+#define AL_FORMAT_BFORMAT2D_16 0x20022
+#define AL_FORMAT_BFORMAT2D_FLOAT32 0x20023
+#define AL_FORMAT_BFORMAT3D_8 0x20031
+#define AL_FORMAT_BFORMAT3D_16 0x20032
+#define AL_FORMAT_BFORMAT3D_FLOAT32 0x20033
+#endif
+
+#ifndef AL_EXT_MULAW_BFORMAT
+#define AL_EXT_MULAW_BFORMAT 1
+#define AL_FORMAT_BFORMAT2D_MULAW 0x10031
+#define AL_FORMAT_BFORMAT3D_MULAW 0x10032
+#endif
+
+#ifndef ALC_SOFT_HRTF
+#define ALC_SOFT_HRTF 1
+#define ALC_HRTF_SOFT 0x1992
+#define ALC_DONT_CARE_SOFT 0x0002
+#define ALC_HRTF_STATUS_SOFT 0x1993
+#define ALC_HRTF_DISABLED_SOFT 0x0000
+#define ALC_HRTF_ENABLED_SOFT 0x0001
+#define ALC_HRTF_DENIED_SOFT 0x0002
+#define ALC_HRTF_REQUIRED_SOFT 0x0003
+#define ALC_HRTF_HEADPHONES_DETECTED_SOFT 0x0004
+#define ALC_HRTF_UNSUPPORTED_FORMAT_SOFT 0x0005
+#define ALC_NUM_HRTF_SPECIFIERS_SOFT 0x1994
+#define ALC_HRTF_SPECIFIER_SOFT 0x1995
+#define ALC_HRTF_ID_SOFT 0x1996
+typedef const ALCchar* (ALC_APIENTRY*LPALCGETSTRINGISOFT)(ALCdevice *device, ALCenum paramName, ALCsizei index);
+typedef ALCboolean (ALC_APIENTRY*LPALCRESETDEVICESOFT)(ALCdevice *device, const ALCint *attribs);
+#ifdef AL_ALEXT_PROTOTYPES
+ALC_API const ALCchar* ALC_APIENTRY alcGetStringiSOFT(ALCdevice *device, ALCenum paramName, ALCsizei index);
+ALC_API ALCboolean ALC_APIENTRY alcResetDeviceSOFT(ALCdevice *device, const ALCint *attribs);
+#endif
+#endif
+
+#ifndef AL_SOFT_gain_clamp_ex
+#define AL_SOFT_gain_clamp_ex 1
+#define AL_GAIN_LIMIT_SOFT 0x200E
+#endif
+
+#ifndef AL_SOFT_source_resampler
+#define AL_SOFT_source_resampler
+#define AL_NUM_RESAMPLERS_SOFT 0x1210
+#define AL_DEFAULT_RESAMPLER_SOFT 0x1211
+#define AL_SOURCE_RESAMPLER_SOFT 0x1212
+#define AL_RESAMPLER_NAME_SOFT 0x1213
+typedef const ALchar* (AL_APIENTRY*LPALGETSTRINGISOFT)(ALenum pname, ALsizei index);
+#ifdef AL_ALEXT_PROTOTYPES
+AL_API const ALchar* AL_APIENTRY alGetStringiSOFT(ALenum pname, ALsizei index);
+#endif
+#endif
+
+#ifndef AL_SOFT_source_spatialize
+#define AL_SOFT_source_spatialize
+#define AL_SOURCE_SPATIALIZE_SOFT 0x1214
+#define AL_AUTO_SOFT 0x0002
+#endif
+
+#ifndef ALC_SOFT_output_limiter
+#define ALC_SOFT_output_limiter
+#define ALC_OUTPUT_LIMITER_SOFT 0x199A
+#endif
+
+#ifndef ALC_SOFT_device_clock
+#define ALC_SOFT_device_clock 1
+typedef _alsoft_int64_t ALCint64SOFT;
+typedef _alsoft_uint64_t ALCuint64SOFT;
+#define ALC_DEVICE_CLOCK_SOFT 0x1600
+#define ALC_DEVICE_LATENCY_SOFT 0x1601
+#define ALC_DEVICE_CLOCK_LATENCY_SOFT 0x1602
+#define AL_SAMPLE_OFFSET_CLOCK_SOFT 0x1202
+#define AL_SEC_OFFSET_CLOCK_SOFT 0x1203
+typedef void (ALC_APIENTRY*LPALCGETINTEGER64VSOFT)(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values);
+#ifdef AL_ALEXT_PROTOTYPES
+ALC_API void ALC_APIENTRY alcGetInteger64vSOFT(ALCdevice *device, ALCenum pname, ALsizei size, ALCint64SOFT *values);
+#endif
+#endif
+
+#ifndef AL_SOFT_direct_channels_remix
+#define AL_SOFT_direct_channels_remix 1
+#define AL_DROP_UNMATCHED_SOFT 0x0001
+#define AL_REMIX_UNMATCHED_SOFT 0x0002
+#endif
+
+#ifndef AL_SOFT_bformat_ex
+#define AL_SOFT_bformat_ex 1
+#define AL_AMBISONIC_LAYOUT_SOFT 0x1997
+#define AL_AMBISONIC_SCALING_SOFT 0x1998
+
+/* Ambisonic layouts */
+#define AL_FUMA_SOFT 0x0000
+#define AL_ACN_SOFT 0x0001
+
+/* Ambisonic scalings (normalization) */
+/*#define AL_FUMA_SOFT*/
+#define AL_SN3D_SOFT 0x0001
+#define AL_N3D_SOFT 0x0002
+#endif
+
+#ifndef ALC_SOFT_loopback_bformat
+#define ALC_SOFT_loopback_bformat 1
+#define ALC_AMBISONIC_LAYOUT_SOFT 0x1997
+#define ALC_AMBISONIC_SCALING_SOFT 0x1998
+#define ALC_AMBISONIC_ORDER_SOFT 0x1999
+#define ALC_MAX_AMBISONIC_ORDER_SOFT 0x199B
+
+#define ALC_BFORMAT3D_SOFT 0x1507
+
+/* Ambisonic layouts */
+#define ALC_FUMA_SOFT 0x0000
+#define ALC_ACN_SOFT 0x0001
+
+/* Ambisonic scalings (normalization) */
+/*#define ALC_FUMA_SOFT*/
+#define ALC_SN3D_SOFT 0x0001
+#define ALC_N3D_SOFT 0x0002
+#endif
+
+#ifndef AL_SOFT_effect_target
+#define AL_SOFT_effect_target
+#define AL_EFFECTSLOT_TARGET_SOFT 0x199C
+#endif
+
#ifndef AL_SOFT_events
#define AL_SOFT_events 1
#define AL_EVENT_CALLBACK_FUNCTION_SOFT 0x19A2
@@ -360,6 +568,88 @@ AL_API void AL_APIENTRY alGetPointervSOFT(ALenum pname, void **values);
#endif
#endif
+#ifndef ALC_SOFT_reopen_device
+#define ALC_SOFT_reopen_device
+typedef ALCboolean (ALC_APIENTRY*LPALCREOPENDEVICESOFT)(ALCdevice *device,
+ const ALCchar *deviceName, const ALCint *attribs);
+#ifdef AL_ALEXT_PROTOTYPES
+ALCboolean ALC_APIENTRY alcReopenDeviceSOFT(ALCdevice *device, const ALCchar *deviceName,
+ const ALCint *attribs);
+#endif
+#endif
+
+#ifndef AL_SOFT_callback_buffer
+#define AL_SOFT_callback_buffer
+#define AL_BUFFER_CALLBACK_FUNCTION_SOFT 0x19A0
+#define AL_BUFFER_CALLBACK_USER_PARAM_SOFT 0x19A1
+typedef ALsizei (AL_APIENTRY*ALBUFFERCALLBACKTYPESOFT)(ALvoid *userptr, ALvoid *sampledata, ALsizei numbytes);
+typedef void (AL_APIENTRY*LPALBUFFERCALLBACKSOFT)(ALuint buffer, ALenum format, ALsizei freq, ALBUFFERCALLBACKTYPESOFT callback, ALvoid *userptr);
+typedef void (AL_APIENTRY*LPALGETBUFFERPTRSOFT)(ALuint buffer, ALenum param, ALvoid **value);
+typedef void (AL_APIENTRY*LPALGETBUFFER3PTRSOFT)(ALuint buffer, ALenum param, ALvoid **value1, ALvoid **value2, ALvoid **value3);
+typedef void (AL_APIENTRY*LPALGETBUFFERPTRVSOFT)(ALuint buffer, ALenum param, ALvoid **values);
+#ifdef AL_ALEXT_PROTOTYPES
+AL_API void AL_APIENTRY alBufferCallbackSOFT(ALuint buffer, ALenum format, ALsizei freq, ALBUFFERCALLBACKTYPESOFT callback, ALvoid *userptr);
+AL_API void AL_APIENTRY alGetBufferPtrSOFT(ALuint buffer, ALenum param, ALvoid **ptr);
+AL_API void AL_APIENTRY alGetBuffer3PtrSOFT(ALuint buffer, ALenum param, ALvoid **ptr0, ALvoid **ptr1, ALvoid **ptr2);
+AL_API void AL_APIENTRY alGetBufferPtrvSOFT(ALuint buffer, ALenum param, ALvoid **ptr);
+#endif
+#endif
+
+#ifndef AL_SOFT_UHJ
+#define AL_SOFT_UHJ
+#define AL_FORMAT_UHJ2CHN8_SOFT 0x19A2
+#define AL_FORMAT_UHJ2CHN16_SOFT 0x19A3
+#define AL_FORMAT_UHJ2CHN_FLOAT32_SOFT 0x19A4
+#define AL_FORMAT_UHJ3CHN8_SOFT 0x19A5
+#define AL_FORMAT_UHJ3CHN16_SOFT 0x19A6
+#define AL_FORMAT_UHJ3CHN_FLOAT32_SOFT 0x19A7
+#define AL_FORMAT_UHJ4CHN8_SOFT 0x19A8
+#define AL_FORMAT_UHJ4CHN16_SOFT 0x19A9
+#define AL_FORMAT_UHJ4CHN_FLOAT32_SOFT 0x19AA
+
+#define AL_STEREO_MODE_SOFT 0x19B0
+#define AL_NORMAL_SOFT 0x0000
+#define AL_SUPER_STEREO_SOFT 0x0001
+#define AL_SUPER_STEREO_WIDTH_SOFT 0x19B1
+#endif
+
+#ifndef AL_SOFT_UHJ_ex
+#define AL_SOFT_UHJ_ex
+#define AL_FORMAT_UHJ2CHN_MULAW_SOFT 0x19B3
+#define AL_FORMAT_UHJ2CHN_ALAW_SOFT 0x19B4
+#define AL_FORMAT_UHJ2CHN_IMA4_SOFT 0x19B5
+#define AL_FORMAT_UHJ2CHN_MSADPCM_SOFT 0x19B6
+#define AL_FORMAT_UHJ3CHN_MULAW_SOFT 0x19B7
+#define AL_FORMAT_UHJ3CHN_ALAW_SOFT 0x19B8
+#define AL_FORMAT_UHJ4CHN_MULAW_SOFT 0x19B9
+#define AL_FORMAT_UHJ4CHN_ALAW_SOFT 0x19BA
+#endif
+
+#ifndef ALC_SOFT_output_mode
+#define ALC_SOFT_output_mode
+#define ALC_OUTPUT_MODE_SOFT 0x19AC
+#define ALC_ANY_SOFT 0x19AD
+/*#define ALC_MONO_SOFT 0x1500*/
+/*#define ALC_STEREO_SOFT 0x1501*/
+#define ALC_STEREO_BASIC_SOFT 0x19AE
+#define ALC_STEREO_UHJ_SOFT 0x19AF
+#define ALC_STEREO_HRTF_SOFT 0x19B2
+/*#define ALC_QUAD_SOFT 0x1503*/
+#define ALC_SURROUND_5_1_SOFT 0x1504
+#define ALC_SURROUND_6_1_SOFT 0x1505
+#define ALC_SURROUND_7_1_SOFT 0x1506
+#endif
+
+#ifndef AL_SOFT_source_start_delay
+#define AL_SOFT_source_start_delay
+typedef void (AL_APIENTRY*LPALSOURCEPLAYATTIMESOFT)(ALuint source, ALint64SOFT start_time);
+typedef void (AL_APIENTRY*LPALSOURCEPLAYATTIMEVSOFT)(ALsizei n, const ALuint *sources, ALint64SOFT start_time);
+#ifdef AL_ALEXT_PROTOTYPES
+void AL_APIENTRY alSourcePlayAtTimeSOFT(ALuint source, ALint64SOFT start_time);
+void AL_APIENTRY alSourcePlayAtTimevSOFT(ALsizei n, const ALuint *sources, ALint64SOFT start_time);
+#endif
+#endif
+
#ifdef __cplusplus
}
#endif
diff --git a/make/stub_includes/openal/efx-creative.h b/make/stub_includes/openal/efx-creative.h
index 0a04c98..d413792 100644
--- a/make/stub_includes/openal/efx-creative.h
+++ b/make/stub_includes/openal/efx-creative.h
@@ -1,3 +1,5 @@
+// Based on headers in submodule openal-soft/include/efx-creative.h
+
/* The tokens that would be defined here are already defined in efx.h. This
* empty file is here to provide compatibility with Windows-based projects
* that would include it. */
diff --git a/make/stub_includes/openal/efx-presets.h b/make/stub_includes/openal/efx-presets.h
index 86dcbda..fde336a 100644
--- a/make/stub_includes/openal/efx-presets.h
+++ b/make/stub_includes/openal/efx-presets.h
@@ -1,3 +1,5 @@
+// Based on headers in submodule openal-soft/include/efx-presets.h
+
/* Reverb presets for EFX */
#ifndef EFX_PRESETS_H
@@ -345,7 +347,7 @@ typedef struct {
/* Driving Presets */
#define EFX_REVERB_PRESET_DRIVING_COMMENTATOR \
- { 1.0000f, 0.0000f, 3.1623f, 0.5623f, 0.5012f, 2.4200f, 0.8800f, 0.6800f, 0.1995f, 0.0930f, { 0.0000f, 0.0000f, 0.0000f }, 0.2512f, 0.0170f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9886f, 5000.0000f, 250.0000f, 0.0000f, 0x1 }
+ { 1.0000f, 0.0000f, 0.3162f, 0.5623f, 0.5012f, 2.4200f, 0.8800f, 0.6800f, 0.1995f, 0.0930f, { 0.0000f, 0.0000f, 0.0000f }, 0.2512f, 0.0170f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 1.0000f, 0.2500f, 0.0000f, 0.9886f, 5000.0000f, 250.0000f, 0.0000f, 0x1 }
#define EFX_REVERB_PRESET_DRIVING_PITGARAGE \
{ 0.4287f, 0.5900f, 0.3162f, 0.7079f, 0.5623f, 1.7200f, 0.9300f, 0.8700f, 0.5623f, 0.0000f, { 0.0000f, 0.0000f, 0.0000f }, 1.2589f, 0.0160f, { 0.0000f, 0.0000f, 0.0000f }, 0.2500f, 0.1100f, 0.2500f, 0.0000f, 0.9943f, 5000.0000f, 250.0000f, 0.0000f, 0x0 }
diff --git a/make/stub_includes/openal/efx.h b/make/stub_includes/openal/efx.h
index 5776698..22f7019 100644
--- a/make/stub_includes/openal/efx.h
+++ b/make/stub_includes/openal/efx.h
@@ -1,6 +1,10 @@
+// Based on headers in submodule openal-soft/include/efx.h
+
#ifndef AL_EFX_H
#define AL_EFX_H
+// [GLUEGEN] Not needed by gluegen
+// #include <float.h>
#include "alc.h"
#include "al.h"
@@ -242,41 +246,41 @@ typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTF)(ALuint, ALenum, ALfloat*
typedef void (AL_APIENTRY *LPALGETAUXILIARYEFFECTSLOTFV)(ALuint, ALenum, ALfloat*);
#ifdef AL_ALEXT_PROTOTYPES
-AL_API ALvoid AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects);
-AL_API ALvoid AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects);
+AL_API void AL_APIENTRY alGenEffects(ALsizei n, ALuint *effects);
+AL_API void AL_APIENTRY alDeleteEffects(ALsizei n, const ALuint *effects);
AL_API ALboolean AL_APIENTRY alIsEffect(ALuint effect);
-AL_API ALvoid AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint iValue);
-AL_API ALvoid AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *piValues);
-AL_API ALvoid AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat flValue);
-AL_API ALvoid AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *pflValues);
-AL_API ALvoid AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *piValue);
-AL_API ALvoid AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *piValues);
-AL_API ALvoid AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *pflValue);
-AL_API ALvoid AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *pflValues);
-
-AL_API ALvoid AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters);
-AL_API ALvoid AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters);
+AL_API void AL_APIENTRY alEffecti(ALuint effect, ALenum param, ALint iValue);
+AL_API void AL_APIENTRY alEffectiv(ALuint effect, ALenum param, const ALint *piValues);
+AL_API void AL_APIENTRY alEffectf(ALuint effect, ALenum param, ALfloat flValue);
+AL_API void AL_APIENTRY alEffectfv(ALuint effect, ALenum param, const ALfloat *pflValues);
+AL_API void AL_APIENTRY alGetEffecti(ALuint effect, ALenum param, ALint *piValue);
+AL_API void AL_APIENTRY alGetEffectiv(ALuint effect, ALenum param, ALint *piValues);
+AL_API void AL_APIENTRY alGetEffectf(ALuint effect, ALenum param, ALfloat *pflValue);
+AL_API void AL_APIENTRY alGetEffectfv(ALuint effect, ALenum param, ALfloat *pflValues);
+
+AL_API void AL_APIENTRY alGenFilters(ALsizei n, ALuint *filters);
+AL_API void AL_APIENTRY alDeleteFilters(ALsizei n, const ALuint *filters);
AL_API ALboolean AL_APIENTRY alIsFilter(ALuint filter);
-AL_API ALvoid AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint iValue);
-AL_API ALvoid AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *piValues);
-AL_API ALvoid AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat flValue);
-AL_API ALvoid AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *pflValues);
-AL_API ALvoid AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *piValue);
-AL_API ALvoid AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *piValues);
-AL_API ALvoid AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *pflValue);
-AL_API ALvoid AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *pflValues);
-
-AL_API ALvoid AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots);
-AL_API ALvoid AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint *effectslots);
+AL_API void AL_APIENTRY alFilteri(ALuint filter, ALenum param, ALint iValue);
+AL_API void AL_APIENTRY alFilteriv(ALuint filter, ALenum param, const ALint *piValues);
+AL_API void AL_APIENTRY alFilterf(ALuint filter, ALenum param, ALfloat flValue);
+AL_API void AL_APIENTRY alFilterfv(ALuint filter, ALenum param, const ALfloat *pflValues);
+AL_API void AL_APIENTRY alGetFilteri(ALuint filter, ALenum param, ALint *piValue);
+AL_API void AL_APIENTRY alGetFilteriv(ALuint filter, ALenum param, ALint *piValues);
+AL_API void AL_APIENTRY alGetFilterf(ALuint filter, ALenum param, ALfloat *pflValue);
+AL_API void AL_APIENTRY alGetFilterfv(ALuint filter, ALenum param, ALfloat *pflValues);
+
+AL_API void AL_APIENTRY alGenAuxiliaryEffectSlots(ALsizei n, ALuint *effectslots);
+AL_API void AL_APIENTRY alDeleteAuxiliaryEffectSlots(ALsizei n, const ALuint *effectslots);
AL_API ALboolean AL_APIENTRY alIsAuxiliaryEffectSlot(ALuint effectslot);
-AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint iValue);
-AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, const ALint *piValues);
-AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat flValue);
-AL_API ALvoid AL_APIENTRY alAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, const ALfloat *pflValues);
-AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint *piValue);
-AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, ALint *piValues);
-AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat *pflValue);
-AL_API ALvoid AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, ALfloat *pflValues);
+AL_API void AL_APIENTRY alAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint iValue);
+AL_API void AL_APIENTRY alAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, const ALint *piValues);
+AL_API void AL_APIENTRY alAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat flValue);
+AL_API void AL_APIENTRY alAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, const ALfloat *pflValues);
+AL_API void AL_APIENTRY alGetAuxiliaryEffectSloti(ALuint effectslot, ALenum param, ALint *piValue);
+AL_API void AL_APIENTRY alGetAuxiliaryEffectSlotiv(ALuint effectslot, ALenum param, ALint *piValues);
+AL_API void AL_APIENTRY alGetAuxiliaryEffectSlotf(ALuint effectslot, ALenum param, ALfloat *pflValue);
+AL_API void AL_APIENTRY alGetAuxiliaryEffectSlotfv(ALuint effectslot, ALenum param, ALfloat *pflValues);
#endif
/* Filter ranges and defaults. */
diff --git a/src/java/com/jogamp/openal/JoalVersion.java b/src/java/com/jogamp/openal/JoalVersion.java
index f2ffc48..77dcabf 100644
--- a/src/java/com/jogamp/openal/JoalVersion.java
+++ b/src/java/com/jogamp/openal/JoalVersion.java
@@ -33,6 +33,7 @@ import com.jogamp.common.GlueGenVersion;
import com.jogamp.common.os.Platform;
import com.jogamp.common.util.VersionUtil;
import com.jogamp.common.util.JogampVersion;
+import com.jogamp.openal.util.ALHelpers;
import java.util.jar.Manifest;
@@ -110,29 +111,62 @@ public class JoalVersion extends JogampVersion {
sb.append("ALC null");
return sb;
}
- final ALCdevice device = alc.alcOpenDevice(null);
- final ALCcontext context = alc.alcCreateContext(device, null);
- alc.alcMakeContextCurrent(context);
+ final ALCcontext initialContext = alc.alcGetCurrentContext();
+
+ final ALCcontext context;
+ final ALCdevice device;
+ if( null == initialContext) {
+ device = alc.alcOpenDevice(null);
+ context = alc.alcCreateContext(device, null);
+ alc.alcMakeContextCurrent(context);
+ } else {
+ context = initialContext;
+ device = alc.alcGetContextsDevice(initialContext);
+ }
final AL al = ALFactory.getAL(); // valid after makeContextCurrent(..)
final ALVersion alv = new ALVersion(al);
alv.toString(true, sb);
sb.append("AL_EXTENSIONS ").append(al.alGetString(ALConstants.AL_EXTENSIONS));
sb.append(Platform.getNewline());
+ final boolean enumerationExtIsPresent = alc.aclEnumerationExtIsPresent();
+ final boolean enumerateAllExtIsPresent = alc.aclEnumerateAllExtIsPresent();
+ final String enumExtAvailInfo = "(enumExt[def "+enumerationExtIsPresent+", all "+enumerateAllExtIsPresent+"])";
{
final int[] iversion = { 0, 0 };
alc.alcGetIntegerv(device, ALCConstants.ALC_MAJOR_VERSION, 1, iversion, 0);
alc.alcGetIntegerv(device, ALCConstants.ALC_MINOR_VERSION, 1, iversion, 1);
sb.append("ALC_VERSION ").append(iversion[0]).append(".").append(iversion[1]);
sb.append(Platform.getNewline());
- sb.append("ALC_DEF_OUTPUT ").append(alc.alcGetString(device, ALCConstants.ALC_DEFAULT_DEVICE_SPECIFIER));
- sb.append(Platform.getNewline());
- sb.append("ALC_DEF_CAPTURE ").append(alc.alcGetString(device, ALCConstants.ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER));
+ if (!enumerationExtIsPresent && !enumerateAllExtIsPresent) {
+ sb.append("ALC_DEF_OUTPUT Unknown ").append(enumExtAvailInfo);
+ sb.append(Platform.getNewline());
+ } else {
+ if (enumerationExtIsPresent) {
+ sb.append("ALC_DEF_OUTPUT (With " + ALHelpers.ALC_ENUMERATION_EXT + ") ")
+ .append(alc.alcGetString(device, ALCConstants.ALC_DEFAULT_DEVICE_SPECIFIER));
+ sb.append(Platform.getNewline());
+ }
+ if (enumerateAllExtIsPresent) {
+ sb.append("ALC_DEF_OUTPUT (With " + ALHelpers.ALC_ENUMERATE_ALL_EXT + ") ")
+ .append(alc.alcGetString(device, ALCConstants.ALC_DEFAULT_ALL_DEVICES_SPECIFIER));
+ sb.append(Platform.getNewline());
+ }
+ }
+ if (enumerationExtIsPresent) {
+ sb.append("ALC_DEF_CAPTURE ").append(alc.alcGetString(device, ALCConstants.ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER));
+ } else {
+ sb.append("ALC_DEF_CAPTURE Unknown ").append(enumExtAvailInfo);
+ }
sb.append(Platform.getNewline());
}
- alc.alcMakeContextCurrent(null);
- alc.alcDestroyContext(context);
- alc.alcCloseDevice(device);
+
+ if( null == initialContext ) {
+ alc.alcMakeContextCurrent(null);
+ alc.alcDestroyContext(context);
+ alc.alcCloseDevice(device);
+ }
+
devicesToString(sb, alc);
return sb;
}
@@ -157,6 +191,8 @@ public class JoalVersion extends JogampVersion {
final String inOutStr = "output";
final int mixerFrequency, mixerRefresh, monoSourceCount, stereoSourceCount;
final int[] val = { 0 };
+ final ALCcontext initialContext = alc.alcGetCurrentContext();
+ final ALCdevice initialDevice = initialContext != null ? alc.alcGetContextsDevice(initialContext) : null;
final ALCdevice d = alc.alcOpenDevice(devName);
if( null == d ) {
System.err.println("Error: Failed to open "+defStr+inOutStr+" device "+devName);
@@ -216,30 +252,65 @@ public class JoalVersion extends JogampVersion {
" (min latency "+(1000f/mixerRefresh)+" ms)], sources[mono "+monoSourceCount+", stereo "+stereoSourceCount+"]"+
System.lineSeparator());
- alc.alcMakeContextCurrent(null);
- alc.alcDestroyContext(c);
- alc.alcCloseDevice(d);
+ if( null != initialContext ) {
+ alc.alcMakeContextCurrent(initialContext);
+ if( initialContext.getDirectBufferAddress() != c.getDirectBufferAddress() ) {
+ alc.alcDestroyContext(c);
+ }
+ } else {
+ alc.alcMakeContextCurrent(null);
+ alc.alcDestroyContext(c);
+ }
+ if( initialDevice == null || initialDevice.getDirectBufferAddress() != d.getDirectBufferAddress() ) {
+ alc.alcCloseDevice(d);
+ }
}
}
public static void devicesToString(final StringBuilder sb, final ALC alc) {
- final String defOutDeviceName = alc.alcGetString(null, ALCConstants.ALC_DEFAULT_DEVICE_SPECIFIER);
- final String defInDeviceName = alc.alcGetString(null, ALCConstants.ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER);
- sb.append("Output devices:"+System.lineSeparator());
- {
- final String[] outDevices = alc.alcGetDeviceSpecifiers();
- if( null != outDevices ) {
- for (final String devName : outDevices) {
- deviceToString(sb, alc, devName, false, defOutDeviceName, defInDeviceName);
+ final boolean enumerationExtIsPresent = alc.aclEnumerationExtIsPresent();
+ final boolean enumerateAllExtIsPresent = alc.aclEnumerateAllExtIsPresent();
+ final String enumExtAvailInfo = "(enumExt[def "+enumerationExtIsPresent+", all "+enumerateAllExtIsPresent+"])";
+
+ if (!enumerationExtIsPresent && !enumerateAllExtIsPresent) {
+ sb.append("No output devices infos available ").append(enumExtAvailInfo);
+ } else {
+ if (enumerateAllExtIsPresent) {
+ final String defOutAllDeviceName = alc.alcGetString(null, ALCConstants.ALC_DEFAULT_ALL_DEVICES_SPECIFIER);
+ sb.append("Output devices (With " + ALHelpers.ALC_ENUMERATE_ALL_EXT + "):" + System.lineSeparator());
+ {
+ final String[] outDevices = alc.alcGetAllDeviceSpecifiers();
+ if (null != outDevices) {
+ for (final String devName : outDevices) {
+ deviceToString(sb, alc, devName, false, defOutAllDeviceName, null);
+ }
+ }
+ }
+ }
+ if (enumerationExtIsPresent) {
+ final String defOutDeviceName = alc.alcGetString(null, ALCConstants.ALC_DEFAULT_DEVICE_SPECIFIER);
+ sb.append("Output devices (With " + ALHelpers.ALC_ENUMERATION_EXT + "):" + System.lineSeparator());
+ {
+ final String[] outDevices = alc.alcGetDeviceSpecifiers();
+ if (null != outDevices) {
+ for (final String devName : outDevices) {
+ deviceToString(sb, alc, devName, false, defOutDeviceName, null);
+ }
+ }
}
}
}
- sb.append("Capture devices:"+System.lineSeparator());
- {
- final String[] inDevices = alc.alcGetCaptureDeviceSpecifiers();
- if( null != inDevices ) {
- for (final String devName : inDevices) {
- deviceToString(sb, alc, devName, true, defOutDeviceName, defInDeviceName);
+ if (!enumerationExtIsPresent) {
+ sb.append("No capture devices infos available ").append(enumExtAvailInfo);
+ } else {
+ final String defInDeviceName = alc.alcGetString(null, ALCConstants.ALC_CAPTURE_DEFAULT_DEVICE_SPECIFIER);
+ sb.append("Capture devices:" + System.lineSeparator());
+ {
+ final String[] inDevices = alc.alcGetCaptureDeviceSpecifiers();
+ if (null != inDevices) {
+ for (final String devName : inDevices) {
+ deviceToString(sb, alc, devName, true, null, defInDeviceName);
+ }
}
}
}
diff --git a/src/java/com/jogamp/openal/sound3d/Context.java b/src/java/com/jogamp/openal/sound3d/Context.java
index e42f9dc..7e20263 100644
--- a/src/java/com/jogamp/openal/sound3d/Context.java
+++ b/src/java/com/jogamp/openal/sound3d/Context.java
@@ -34,6 +34,7 @@
package com.jogamp.openal.sound3d;
+import com.jogamp.common.util.locks.Lock;
import com.jogamp.common.util.locks.LockFactory;
import com.jogamp.common.util.locks.RecursiveLock;
import com.jogamp.openal.*;
@@ -203,6 +204,9 @@ public final class Context {
return lock.getHoldCount();
}
+ public boolean tryMakeCurrent(final boolean throwException, final long timeoutMS) throws RuntimeException {
+ return makeCurrentImpl(false /* throwTryLockException */, throwException, timeoutMS);
+ }
/**
* Makes the audio context current on the calling thread.
* <p>
@@ -217,40 +221,52 @@ public final class Context {
* @see #release()
*/
public boolean makeCurrent(final boolean throwException) throws ALException {
- lock.lock();
-
- if( null == alCtx ) {
- lock.unlock();
- if( throwException ) {
- throw new ALException("Invalid "+this);
- }
- return false;
- }
+ return makeCurrentImpl(true /* throwTryLockException */, throwException, Lock.TIMEOUT);
+ }
+ private boolean makeCurrentImpl(final boolean throwTryLockException, final boolean throwException, final long timeoutMS) throws RuntimeException {
+ try {
+ if( lock.tryLock(timeoutMS) ) {
+ if( null == alCtx ) {
+ lock.unlock();
+ if( throwException ) {
+ throw new ALException("Invalid "+this);
+ }
+ return false;
+ }
- // One context can only be current on one thread,
- // and one thread can only have one context current!
- final Context current = getCurrentContext();
- if (current != null) {
- if (current == this) { // implicit recursive locking, lock.getHoldCount() > 1
- return true;
+ // One context can only be current on one thread,
+ // and one thread can only have one context current!
+ final Context current = getCurrentContext();
+ if (current != null) {
+ if (current == this) { // implicit recursive locking, lock.getHoldCount() > 1
+ return true;
+ } else {
+ lock.unlock();
+ if( throwException ) {
+ throw new ALException("Current thread "+Thread.currentThread()+" holds another "+current+" while claiming this "+this);
+ }
+ return false;
+ }
+ }
+ final boolean r = makeCurrentImpl();
+ if( r ) {
+ currentContext.set(this);
+ } else {
+ lock.unlock();
+ if( throwException ) {
+ throw new ALException("Context make current failed "+this);
+ }
+ }
+ return r;
} else {
- lock.unlock();
- if( throwException ) {
- throw new ALException("Current thread "+Thread.currentThread()+" holds another "+current+" while claiming this "+this);
+ if( throwTryLockException ) {
+ throw new RuntimeException("Waited "+timeoutMS+"ms for: "+lock.toString()+" - "+Thread.currentThread().getName());
}
return false;
}
+ } catch (final InterruptedException ie) {
+ throw new RuntimeException(ie);
}
- final boolean r = makeCurrentImpl();
- if( r ) {
- currentContext.set(this);
- } else {
- lock.unlock();
- if( throwException ) {
- throw new ALException("Context make current failed "+this);
- }
- }
- return r;
}
private boolean makeCurrentImpl() {
if( hasALC_thread_local_context ) {
diff --git a/src/java/com/jogamp/openal/util/ALHelpers.java b/src/java/com/jogamp/openal/util/ALHelpers.java
index 93dfa6e..fda3167 100644
--- a/src/java/com/jogamp/openal/util/ALHelpers.java
+++ b/src/java/com/jogamp/openal/util/ALHelpers.java
@@ -52,6 +52,9 @@ public class ALHelpers {
public static final String ALC_EXT_thread_local_context = "ALC_EXT_thread_local_context";
+ public static final String ALC_ENUMERATION_EXT = "ALC_ENUMERATION_EXT";
+ public static final String ALC_ENUMERATE_ALL_EXT = "ALC_ENUMERATE_ALL_EXT";
+
/**
* Returns a compatible {@link AudioFormat} based on given OpenAL channel-layout, sample-type and format,
* as well as the generic sample-rate and sample-size.
diff --git a/src/java/jogamp/openal/ALCImpl.java b/src/java/jogamp/openal/ALCImpl.java
index 99494ca..cdde31b 100644
--- a/src/java/jogamp/openal/ALCImpl.java
+++ b/src/java/jogamp/openal/ALCImpl.java
@@ -4,21 +4,39 @@
package jogamp.openal;
import com.jogamp.common.nio.Buffers;
+import com.jogamp.openal.ALCConstants;
import com.jogamp.openal.ALException;
import com.jogamp.openal.ALCdevice;
+import com.jogamp.openal.util.ALHelpers;
+
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.ArrayList;
/**
* ALC implementation.
- * @author Michael Bien
*/
public class ALCImpl extends ALCAbstractImpl {
+ public boolean aclEnumerationExtIsPresent() {
+ return alcIsExtensionPresent(null, ALHelpers.ALC_ENUMERATION_EXT);
+ }
+
+ public boolean aclEnumerateAllExtIsPresent() {
+ return alcIsExtensionPresent(null, ALHelpers.ALC_ENUMERATE_ALL_EXT);
+ }
+
+ public boolean alcIsDoubleNullTerminatedString(final ALCdevice device, final int param) {
+ return ( null == device || 0 == device.getDirectBufferAddress() ) &&
+ ( param == ALC_DEVICE_SPECIFIER ||
+ param == ALC_CAPTURE_DEVICE_SPECIFIER ||
+ param == ALC_ALL_DEVICES_SPECIFIER
+ );
+ }
+ @Override
public String alcGetString(final ALCdevice device, final int param) {
- if (device == null && param == ALC_DEVICE_SPECIFIER) {
- throw new ALException("Call alcGetDeviceSpecifiers to fetch all available device names");
+ if (alcIsDoubleNullTerminatedString(device, param)) {
+ throw new ALException("Call alcGetString to get double null terminated string");
}
final ByteBuffer buf = alcGetStringImpl(device, param);
@@ -51,24 +69,26 @@ public class ALCImpl extends ALCAbstractImpl {
}
private native java.nio.ByteBuffer dispatch_alcGetStringImpl1(ByteBuffer deviceBuffer, int param, long addr);
- /**
- * Fetches the names of the available ALC device specifiers.
- * Equivalent to the C call alcGetString(NULL, ALC_DEVICE_SPECIFIER).
- */
+ @Override
public String[] alcGetDeviceSpecifiers() {
- return getDoubleNullTerminatedString(ALC_DEVICE_SPECIFIER);
+ return alcGetStringAsDoubleNullTerminatedString(null, ALC_DEVICE_SPECIFIER);
}
- /**
- * Fetches the names of the available ALC capture device specifiers.
- * Equivalent to the C call alcGetString(NULL, ALC_CAPTURE_DEVICE_SPECIFIER).
- */
+ @Override
public String[] alcGetCaptureDeviceSpecifiers() {
- return getDoubleNullTerminatedString(ALC_CAPTURE_DEVICE_SPECIFIER);
+ return alcGetStringAsDoubleNullTerminatedString(null, ALC_CAPTURE_DEVICE_SPECIFIER);
}
- private String[] getDoubleNullTerminatedString(final int which) {
- final ByteBuffer buf = alcGetStringImpl(null, which);
+ public String[] alcGetAllDeviceSpecifiers() {
+ return alcGetStringAsDoubleNullTerminatedString(null, ALC_ALL_DEVICES_SPECIFIER);
+ }
+
+ public String[] alcGetStringAsDoubleNullTerminatedString(final ALCdevice device, final int param) {
+ if (!alcIsDoubleNullTerminatedString(device, param)) {
+ throw new ALException("Call alcGetString to get string");
+ }
+
+ final ByteBuffer buf = alcGetStringImpl(device, param);
if (buf == null) {
return null;
}
diff --git a/src/java/jogamp/openal/ALDynamicLibraryBundleInfo.java b/src/java/jogamp/openal/ALDynamicLibraryBundleInfo.java
index e58e34c..1a2ed3f 100644
--- a/src/java/jogamp/openal/ALDynamicLibraryBundleInfo.java
+++ b/src/java/jogamp/openal/ALDynamicLibraryBundleInfo.java
@@ -44,6 +44,7 @@ public final class ALDynamicLibraryBundleInfo implements DynamicLibraryBundleInf
private static final List<String> glueLibNames;
static {
SecurityUtil.doPrivileged(new PrivilegedAction<Object>() {
+ @Override
public Object run() {
Platform.initSingleton();
@@ -140,6 +141,8 @@ public final class ALDynamicLibraryBundleInfo implements DynamicLibraryBundleInf
return libNamesList;
}
+ @Override
+ public List<String> getSymbolForToolLibPath() { return Arrays.asList("alGetString"); }
@Override
public final List<String> getToolGetProcAddressFuncNameList() {
diff --git a/src/native/almisc.c b/src/native/almisc.c
index ca638d9..22689b6 100644
--- a/src/native/almisc.c
+++ b/src/native/almisc.c
@@ -1,16 +1,15 @@
-
#include <jni.h>
#include <stdlib.h>
#include <assert.h>
- #include "al.h"
- #include "alc.h"
- #ifndef _MSC_VER /* Non-Windows platforms */
+#include "al.h"
+#include "alc.h"
+#ifndef _MSC_VER /* Non-Windows platforms */
#define __cdecl /* Trim non-standard keyword */
- #endif
- #include "efx.h"
- #include <string.h>
+#endif
+#include "efx.h"
+#include <string.h>
extern int strlen_alc(ALCdevice *device, int param, const char* str);
@@ -51,13 +50,13 @@ Java_jogamp_openal_ALCImpl_dispatch_1alcGetStringImpl1(JNIEnv *env, jobject _unu
LPALCGETSTRING ptr_alcGetString;
ALCdevice * _device_ptr = NULL;
const ALCchar * _res;
- if ( NULL != device ) {
- _device_ptr = (ALCdevice *) (((char*) (*env)->GetDirectBufferAddress(env, device)) + 0);
- }
+ if ( NULL != device ) {
+ _device_ptr = (ALCdevice *) (((char*) (*env)->GetDirectBufferAddress(env, device)) + 0);
+ }
ptr_alcGetString = (LPALCGETSTRING) (intptr_t) procAddress;
assert(ptr_alcGetString != NULL);
_res = (* ptr_alcGetString) ((ALCdevice *) _device_ptr, (ALCenum) param);
if (NULL == _res) return NULL;
- return (*env)->NewDirectByteBuffer(env, _res, strlen_alc(_device_ptr, param, _res));
+ return (*env)->NewDirectByteBuffer(env, (void*)_res, strlen_alc(_device_ptr, param, _res));
}
diff --git a/src/test/com/jogamp/openal/test/junit/ALVersionTest.java b/src/test/com/jogamp/openal/test/junit/ALVersionTest.java
index cb24e95..55535ed 100644
--- a/src/test/com/jogamp/openal/test/junit/ALVersionTest.java
+++ b/src/test/com/jogamp/openal/test/junit/ALVersionTest.java
@@ -31,10 +31,14 @@ import java.io.IOException;
import org.junit.FixMethodOrder;
import org.junit.Test;
+import org.junit.After;
import org.junit.Assert;
import org.junit.runners.MethodSorters;
import com.jogamp.common.util.VersionNumber;
+import com.jogamp.openal.ALC;
+import com.jogamp.openal.ALCcontext;
+import com.jogamp.openal.ALCdevice;
import com.jogamp.openal.ALFactory;
import com.jogamp.openal.ALVersion;
import com.jogamp.openal.JoalVersion;
@@ -70,6 +74,46 @@ public class ALVersionTest extends UITestCase {
System.err.println(jv.toString(ALFactory.getALC()));
}
+ @Test
+ public void test03JoalVersionMustNoChangeContextAndDeviceUsed() {
+ final ALC alc = ALFactory.getALC();
+ final ALCdevice intialDevice = alc.alcOpenDevice(null);
+ final ALCcontext initialContext = alc.alcCreateContext(intialDevice, null);
+ alc.alcMakeContextCurrent(initialContext);
+ final JoalVersion jv = JoalVersion.getInstance();
+ System.err.println(jv.toString(alc));
+ final ALCcontext currentContext = alc.alcGetCurrentContext();
+ Assert.assertNotNull(currentContext);
+ Assert.assertEquals(initialContext.getDirectBufferAddress(), currentContext.getDirectBufferAddress());
+ final ALCdevice currentDevice = alc.alcGetContextsDevice(currentContext);
+ Assert.assertNotNull(currentDevice);
+ Assert.assertEquals(intialDevice.getDirectBufferAddress(), currentDevice.getDirectBufferAddress());
+ }
+
+ @Test
+ public void test04JoalVersionMustNotSetAdditionalContext() {
+ final ALC alc = ALFactory.getALC();
+ final JoalVersion jv = JoalVersion.getInstance();
+ System.err.println(jv.toString(alc));
+ final ALCcontext currentContext = alc.alcGetCurrentContext();
+ Assert.assertNull(currentContext);
+ }
+
+ @After
+ @Override
+ public void tearDown() {
+ super.tearDown();
+ final ALC alc = ALFactory.getALC();
+ final ALCcontext context = alc.alcGetCurrentContext();
+ if(null != context) {
+ alc.alcDestroyContext(context);
+ final ALCdevice device = alc.alcGetContextsDevice(context);
+ if(null != device) {
+ alc.alcCloseDevice(device);
+ }
+ }
+ }
+
public static void main(final String args[]) throws IOException {
org.junit.runner.JUnitCore.main(ALVersionTest.class.getName());
}
diff --git a/src/test/com/jogamp/openal/test/manual/Synth01AL.java b/src/test/com/jogamp/openal/test/manual/Synth01AL.java
index 64da9fa..7bd60c8 100644
--- a/src/test/com/jogamp/openal/test/manual/Synth01AL.java
+++ b/src/test/com/jogamp/openal/test/manual/Synth01AL.java
@@ -101,6 +101,15 @@ public class Synth01AL {
}
}
}
+ System.out.println("Output all devices:");
+ {
+ final String[] outDevices = alc.alcGetAllDeviceSpecifiers();
+ if( null != outDevices ) {
+ for (final String name : outDevices) {
+ System.out.println(" "+name);
+ }
+ }
+ }
alCheckError("setup", true);
al.alGenBuffers(1, buffers, 0);