aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/java/build.xml79
-rw-r--r--src/java/com/jogamp/openal/ALFactory.java4
-rw-r--r--src/java/com/jogamp/openal/impl/ALCImpl.java18
-rw-r--r--src/java/com/jogamp/openal/impl/ALDynamicLibraryBundleInfo.java91
-rwxr-xr-xsrc/java/com/jogamp/openal/impl/ALProcAddressLookup.java179
-rwxr-xr-xsrc/java/com/jogamp/openal/impl/NativeLibLoader.java114
-rw-r--r--src/native/almisc.c71
-rw-r--r--src/test/com/jogamp/openal/test/junit/ALTest.java391
-rw-r--r--src/test/com/jogamp/openal/test/manual/OpenALTest.java122
-rw-r--r--src/test/com/jogamp/openal/test/manual/Sound3DTest.java98
-rw-r--r--src/test/com/jogamp/openal/test/resources/ResourceLocation.java6
-rw-r--r--src/test/com/jogamp/openal/test/resources/lewiscarroll.wavbin0 -> 1025476 bytes
12 files changed, 800 insertions, 373 deletions
diff --git a/src/java/build.xml b/src/java/build.xml
deleted file mode 100644
index 9e11377..0000000
--- a/src/java/build.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?xml version="1.0" encoding="iso-8859-1"?>
-
-<!--
-* Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
-*
-* Redistribution and use in source and binary forms, with or without
-* modification, are permitted provided that the following conditions are met:
-*
-* -Redistribution of source code must retain the above copyright notice,
-* this list of conditions and the following disclaimer.
-*
-* -Redistribution in binary form must reproduce the above copyright notice,
-* this list of conditions and the following disclaimer in the documentation
-* and/or other materials provided with the distribution.
-*
-* Neither the name of Sun Microsystems, Inc. or the names of contributors may
-* be used to endorse or promote products derived from this software without
-* specific prior written permission.
-*
-* This software is provided "AS IS," without a warranty of any kind.
-* ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
-* ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
-* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") AND ITS
-* LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A
-* RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
-* IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
-* OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
-* PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
-* ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS
-* BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-*
-* You acknowledge that this software is not designed or intended for use in the
-* design, construction, operation or maintenance of any nuclear facility.
--->
-
-<project name="Sun Games Initiative Client Technologies" basedir="." default="all">
-
- <target name="init">
- <mkdir dir="../../classes"/>
- </target>
-
- <target name="compile" depends="init">
- <javac srcdir="." destdir="../../classes" debug="${debug}" optimize="${optimize}"/>
- </target>
-
- <target name="all" depends="init,compile">
- </target>
-
- <target name="javadoc" depends="compile">
- <javadoc packagenames="com.jogamp.openal.*"
- sourcepath="."
- additionalparam="-breakiterator"
- windowtitle="Java Bindings for OpenAL / Sound3D Toolkit"
- doctitle="Java Bindings for OpenAL / Sound3D Toolkit"
- destdir="../../apidocs">
- <group title = "Java Bindings for OpenAL">
- <package name="com.jogamp.openal"/>
- <package name="com.jogamp.openal.eax"/>
- <package name="com.jogamp.openal.util"/>
- </group>
- <group title="Sound3D Toolkit">
- <package name="com.jogamp.openal.sound3d"/>
- </group>
- </javadoc>
- </target>
-
- <target name="jar" depends="compile">
- <jar basedir="../../classes" destfile="../../lib/joal.jar" compress="yes" update="yes" index="yes">
-
- </jar>
- </target>
-
- <target name="clean">
- <delete dir="../../apidocs"/>
- <delete dir="../../classes/net"/>
- <delete file="../../lib/joal.jar"/>
- </target>
-
-</project> \ No newline at end of file
diff --git a/src/java/com/jogamp/openal/ALFactory.java b/src/java/com/jogamp/openal/ALFactory.java
index f58fe4b..64da325 100644
--- a/src/java/com/jogamp/openal/ALFactory.java
+++ b/src/java/com/jogamp/openal/ALFactory.java
@@ -53,7 +53,9 @@ public class ALFactory {
private static synchronized void initialize() throws ALException {
try {
if (!initialized) {
- NativeLibLoader.load();
+ if(null == ALImpl.getALProcAddressTable()) {
+ throw new RuntimeException("AL not initialized (ProcAddressTable null)");
+ }
initialized = true;
}
} catch (UnsatisfiedLinkError e) {
diff --git a/src/java/com/jogamp/openal/impl/ALCImpl.java b/src/java/com/jogamp/openal/impl/ALCImpl.java
index 208e64f..75fc47d 100644
--- a/src/java/com/jogamp/openal/impl/ALCImpl.java
+++ b/src/java/com/jogamp/openal/impl/ALCImpl.java
@@ -3,6 +3,7 @@
*/
package com.jogamp.openal.impl;
+import com.jogamp.common.nio.Buffers;
import com.jogamp.openal.ALException;
import com.jogamp.openal.ALCdevice;
import java.io.UnsupportedEncodingException;
@@ -33,6 +34,23 @@ public class ALCImpl extends ALCAbstractImpl {
}
}
+ /** Entry point (through function pointer) to C language function: <br> <code> const ALCchar * alcGetString(ALCdevice * device, ALCenum param); </code> */
+ public ByteBuffer alcGetStringImpl(ALCdevice device, int param) {
+
+ final long __addr_ = getALCProcAddressTable()._addressof_alcGetString;
+ if (__addr_ == 0) {
+ throw new UnsupportedOperationException("Method \"alcGetStringImpl\" not available");
+ }
+ ByteBuffer _res;
+ _res = dispatch_alcGetStringImpl1(((device == null) ? null : device.getBuffer()), param, __addr_);
+ if (_res == null) {
+ return null;
+ }
+ Buffers.nativeOrder(_res);
+ return _res;
+ }
+ 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).
diff --git a/src/java/com/jogamp/openal/impl/ALDynamicLibraryBundleInfo.java b/src/java/com/jogamp/openal/impl/ALDynamicLibraryBundleInfo.java
new file mode 100644
index 0000000..9d41a69
--- /dev/null
+++ b/src/java/com/jogamp/openal/impl/ALDynamicLibraryBundleInfo.java
@@ -0,0 +1,91 @@
+/**
+ * Copyright 2010 JogAmp Community. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification, are
+ * permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this list of
+ * conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright notice, this list
+ * of conditions and the following disclaimer in the documentation and/or other materials
+ * provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+ * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * The views and conclusions contained in the software and documentation are those of the
+ * authors and should not be interpreted as representing official policies, either expressed
+ * or implied, of JogAmp Community.
+ */
+
+package com.jogamp.openal.impl;
+
+import com.jogamp.common.os.DynamicLibraryBundleInfo;
+import java.util.*;
+
+public class ALDynamicLibraryBundleInfo implements DynamicLibraryBundleInfo {
+ private static List/*<String>*/ glueLibNames;
+ static {
+ glueLibNames = new ArrayList();
+
+ glueLibNames.add("joal");
+ }
+
+ protected ALDynamicLibraryBundleInfo() {
+ }
+
+ /** FIXME: not default, maybe local ? **/
+ public boolean shallLinkGlobal() { return true; }
+
+ /** default **/
+ public boolean shallLookupGlobal() { return false; }
+
+ public final List/*<String>*/ getGlueLibNames() {
+ return glueLibNames;
+ }
+
+ public List getToolLibNames() {
+ List/*<List>*/ libNamesList = new ArrayList();
+
+ List/*<String>*/ alLibNames = new ArrayList();
+
+ // this is the default AL lib name, according to the spec
+ alLibNames.add("libopenal.so.1"); // unix
+ alLibNames.add("OpenAL32"); // windows
+ alLibNames.add("OpenAL"); // OSX
+
+ // try this one as well, if spec fails
+ alLibNames.add("libOpenAL.so.1");
+ alLibNames.add("libopenal.so");
+ alLibNames.add("libOpenAL.so");
+
+ // last but not least .. the generic one
+ alLibNames.add("openal");
+ alLibNames.add("OpenAL");
+
+ libNamesList.add(alLibNames);
+
+ return libNamesList;
+ }
+
+ public final List getToolGetProcAddressFuncNameList() {
+ List res = new ArrayList();
+ res.add("alGetProcAddress");
+ return res;
+ }
+
+ public final long toolDynamicLookupFunction(long toolGetProcAddressHandle, String funcName) {
+ return ALImpl.alGetProcAddress(toolGetProcAddressHandle, funcName);
+ }
+
+}
+
+
diff --git a/src/java/com/jogamp/openal/impl/ALProcAddressLookup.java b/src/java/com/jogamp/openal/impl/ALProcAddressLookup.java
deleted file mode 100755
index 45718dd..0000000
--- a/src/java/com/jogamp/openal/impl/ALProcAddressLookup.java
+++ /dev/null
@@ -1,179 +0,0 @@
-/**
- * Copyright (c) 2003-2005 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * -Redistribution of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * -Redistribution in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * Neither the name of Sun Microsystems, Inc. or the names of contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind.
- * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
- * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
- * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS
- * LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A
- * RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
- * IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
- * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
- * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS
- * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use in the
- * design, construction, operation or maintenance of any nuclear facility.
- */
-
-package com.jogamp.openal.impl;
-
-import com.jogamp.common.os.DynamicLookupHelper;
-import com.jogamp.common.os.NativeLibrary;
-import java.lang.reflect.Field;
-
-import com.jogamp.openal.*;
-import com.jogamp.gluegen.runtime.*;
-
-/** Helper class for managing OpenAL-related proc address tables. */
-
-public class ALProcAddressLookup {
-
- private static final ALProcAddressTable alTable;
- private static final ALCProcAddressTable alcTable;
-
- private static volatile boolean alTableInitialized = false;
- private static volatile boolean alcTableInitialized = false;
-
- private static final DynamicLookup lookup;
- private static volatile NativeLibrary openAL;
-
- static {
- //workaround: map renamed fooImpl back to the real function name
- FunctionAddressResolver resolver = new FunctionAddressResolver() {
- public long resolve(String string, DynamicLookupHelper dlh) {
- if (string.endsWith("Impl")) {
- string = string.substring(0, string.length() - 4);
- }
- return dlh.dynamicLookupFunction(string);
- }
- };
- alcTable = new ALCProcAddressTable(resolver);
- alTable = new ALProcAddressTable();
- lookup = new DynamicLookup();
- }
-
- static class DynamicLookup implements DynamicLookupHelper {
- public long dynamicLookupFunction(String functionName) {
- // At some point this may require an OpenAL context to be
- // current as we will actually use alGetProcAddress. Since
- // this routine is currently broken and there are no
- // per-context function pointers anyway we could actually do
- // this work anywhere.
- if (openAL == null) {
- // We choose not to search the system path first because we
- // bundle a very recent version of OpenAL which we would like
- // to override existing installations
- openAL = NativeLibrary.open("OpenAL32", "openal", "OpenAL",
- false,
- ALProcAddressLookup.class.getClassLoader());
- if (openAL == null) {
- throw new RuntimeException("Unable to find and load OpenAL library");
- }
- }
- return openAL.dynamicLookupFunction(functionName);
- }
- }
-
- public static void resetALProcAddressTable() {
- if (!alTableInitialized) {
- synchronized (ALProcAddressLookup.class) {
- if (!alTableInitialized) {
- // At some point this may require an OpenAL context to be
- // current as we will actually use alGetProcAddress. Since
- // this routine is currently broken and there are no
- // per-context function pointers anyway we could actually do
- // this work anywhere. We should also in theory have
- // per-ALcontext ALProcAddressTables and per-ALCdevice
- // ALCProcAddressTables.
- alTable.reset(lookup);
-
- // The above only manages to find addresses for the core OpenAL
- // functions. The below uses alGetProcAddress() to find the addresses
- // of extensions such as EFX, just as in the C++ examples of the
- // OpenAL 1.1 SDK.
- useALGetProcAddress();
-
- alTableInitialized = true;
- }
- }
- }
- }
-
- public static void resetALCProcAddressTable() {
- if (!alcTableInitialized) {
- synchronized (ALProcAddressLookup.class) {
- if (!alcTableInitialized) {
- // At some point this may require an OpenAL device to be
- // created as we will actually use alcGetProcAddress. Since
- // this routine is currently broken and there are no
- // per-device function pointers anyway we could actually do
- // this work anywhere. We should also in theory have
- // per-ALcontext ALProcAddressTables and per-ALCdevice
- // ALCProcAddressTables.
- alcTable.reset(lookup);
- alcTableInitialized = true;
- }
- }
- }
- }
-
- public static ALProcAddressTable getALProcAddressTable() {
- return alTable;
- }
-
- public static ALCProcAddressTable getALCProcAddressTable() {
- return alcTable;
- }
-
-
- /**
- * Retrieves the values of the OpenAL functions using alGetProcAddress().
- */
- private static void useALGetProcAddress() {
- String addrOfPrefix = "_addressof_";
- ALImpl al = (ALImpl) ALFactory.getAL();
-
- Field[] fields = ALProcAddressTable.class.getFields();
- for (int i = 0; i < fields.length; i++) {
- Field field = fields[i];
-
- // Skip non-address fields
- String fieldname = field.getName();
- if (!fieldname.startsWith(addrOfPrefix)) {
- continue;
- }
- try {
- String functionname = fieldname.substring(addrOfPrefix.length());
- long fieldval = field.getLong(alTable);
-
- // Skip fields which have already been valued
- if (fieldval != 0) {
- continue;
- }
-
- // Get the address
- long procAddressVal = al.alGetProcAddress(functionname);
- field.setLong(alTable, procAddressVal);
- }
- catch (Exception ex) {
- throw new RuntimeException("Unable to repopulate ALProcAddressTable values", ex);
- }
- }
- }
-}
diff --git a/src/java/com/jogamp/openal/impl/NativeLibLoader.java b/src/java/com/jogamp/openal/impl/NativeLibLoader.java
deleted file mode 100755
index 38e0e69..0000000
--- a/src/java/com/jogamp/openal/impl/NativeLibLoader.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- * - Redistribution of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistribution in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * Neither the name of Sun Microsystems, Inc. or the names of
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * This software is provided "AS IS," without a warranty of any kind. ALL
- * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
- * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
- * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN
- * MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE FOR
- * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR
- * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR
- * ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR
- * DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
- * DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
- * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF
- * SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
- *
- * You acknowledge that this software is not designed or intended for use
- * in the design, construction, operation or maintenance of any nuclear
- * facility.
- */
-
-package com.jogamp.openal.impl;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.security.*;
-
-import com.jogamp.gluegen.runtime.*;
-
-public class NativeLibLoader {
- private static volatile boolean loadingEnabled = true;
- private static volatile boolean didLoading;
-
- private NativeLibLoader() {}
-
- public static void disableLoading() {
- loadingEnabled = false;
- }
-
- public static void enableLoading() {
- loadingEnabled = true;
- }
-
- public static void load() {
- if (!didLoading && loadingEnabled) {
- synchronized (NativeLibLoader.class) {
- if (!didLoading && loadingEnabled) {
- didLoading = true;
- AccessController.doPrivileged(new PrivilegedAction() {
- public Object run() {
- // Workaround for problem in OpenAL32.dll, which is actually
- // the "wrapper" DLL which looks for real OpenAL
- // implementations like nvopenal.dll and "*oal.dll".
- // joal.dll matches this wildcard and a bug in OpenAL32.dll
- // causes a call through a null function pointer.
- loadLibraryInternal("joal");
-
- // Workaround for 4845371.
- // Make sure the first reference to the JNI GetDirectBufferAddress is done
- // from a privileged context so the VM's internal class lookups will succeed.
- // FIXME: need to figure out an appropriate entry point to call for JOAL
- // JAWT jawt = new JAWT();
- // JAWTFactory.JAWT_GetAWT(jawt);
-
- return null;
- }
- });
- }
- }
- }
- }
-
- private static void loadLibraryInternal(String libraryName) {
- String sunAppletLauncher = System.getProperty("sun.jnlp.applet.launcher");
- boolean usingJNLPAppletLauncher = Boolean.valueOf(sunAppletLauncher).booleanValue();
-
- if (usingJNLPAppletLauncher) {
- try {
- Class jnlpAppletLauncherClass = Class.forName("org.jdesktop.applet.util.JNLPAppletLauncher");
- Method jnlpLoadLibraryMethod = jnlpAppletLauncherClass.getDeclaredMethod("loadLibrary", new Class[] { String.class });
- jnlpLoadLibraryMethod.invoke(null, new Object[] { libraryName });
- } catch (Exception e) {
- Throwable t = e;
- if (t instanceof InvocationTargetException) {
- t = ((InvocationTargetException) t).getTargetException();
- }
- if (t instanceof Error)
- throw (Error) t;
- if (t instanceof RuntimeException) {
- throw (RuntimeException) t;
- }
- // Throw UnsatisfiedLinkError for best compatibility with System.loadLibrary()
- throw (UnsatisfiedLinkError) new UnsatisfiedLinkError().initCause(e);
- }
- } else {
- System.loadLibrary(libraryName);
- }
- }
-}
diff --git a/src/native/almisc.c b/src/native/almisc.c
new file mode 100644
index 0000000..6658f64
--- /dev/null
+++ b/src/native/almisc.c
@@ -0,0 +1,71 @@
+
+#include <jni.h>
+#include <stdlib.h>
+
+#include <assert.h>
+
+ #include "al.h"
+ #include "alc.h"
+ #ifndef _MSC_VER /* Non-Windows platforms */
+ #define __cdecl /* Trim non-standard keyword */
+ #endif
+ #include "efx.h"
+ #ifdef _MSC_VER /* Windows, Microsoft compilers */
+ /* This typedef is apparently needed for compilers before VC8 */
+ #if _MSC_VER < 1400
+ typedef int intptr_t;
+ #endif
+ #else
+ /* This header seems to be available on all other platforms */
+ #include <inttypes.h>
+ #endif
+ #include <string.h>
+
+
+/* Java->C glue code:
+ * Java package: com.jogamp.openal.impl.ALImpl
+ * Java method: long dispatch_alGetProcAddressStatic(java.lang.String fname)
+ * C function: ALproc alGetProcAddress(const ALchar * fname);
+ */
+JNIEXPORT jlong JNICALL
+Java_com_jogamp_openal_impl_ALImpl_dispatch_1alGetProcAddressStatic(JNIEnv *env, jclass _unused, jstring fname, jlong procAddress) {
+ LPALGETPROCADDRESS ptr_alGetProcAddress;
+ const char* _strchars_fname = NULL;
+ ALproc _res;
+ if ( NULL != fname ) {
+ _strchars_fname = (*env)->GetStringUTFChars(env, fname, (jboolean*)NULL);
+ if ( NULL == _strchars_fname ) {
+ (*env)->ThrowNew(env, (*env)->FindClass(env, "java/lang/OutOfMemoryError"),
+ "Failed to get UTF-8 chars for argument \"fname\" in native dispatcher for \"dispatch_alGetProcAddress\"");
+ return 0;
+ }
+ }
+ ptr_alGetProcAddress = (LPALGETPROCADDRESS) (intptr_t) procAddress;
+ assert(ptr_alGetProcAddress != NULL);
+ _res = (* ptr_alGetProcAddress) ((ALchar *) _strchars_fname);
+ if ( NULL != fname ) {
+ (*env)->ReleaseStringUTFChars(env, fname, _strchars_fname);
+ }
+ return (jlong) (intptr_t) _res;
+}
+
+/* Java->C glue code:
+ * Java package: com.jogamp.openal.impl.ALCAbstractImpl
+ * Java method: java.nio.ByteBuffer dispatch_alcGetStringImpl(ALCdevice device, int param)
+ * C function: const ALCchar * alcGetString(ALCdevice * device, ALCenum param);
+ */
+JNIEXPORT jobject JNICALL
+Java_com_jogamp_openal_impl_ALCImpl_dispatch_1alcGetStringImpl1(JNIEnv *env, jobject _unused, jobject device, jint param, jlong procAddress) {
+ LPALCGETSTRING ptr_alcGetString;
+ ALCdevice * _device_ptr = NULL;
+ const ALCchar * _res;
+ 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));
+}
+
diff --git a/src/test/com/jogamp/openal/test/junit/ALTest.java b/src/test/com/jogamp/openal/test/junit/ALTest.java
new file mode 100644
index 0000000..6a465f2
--- /dev/null
+++ b/src/test/com/jogamp/openal/test/junit/ALTest.java
@@ -0,0 +1,391 @@
+/*
+ * Created on Jun 3, 2003
+ *
+ * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
+ * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
+ */
+package com.jogamp.openal.test.junit;
+
+import com.jogamp.openal.AL;
+import com.jogamp.openal.ALC;
+import com.jogamp.openal.ALCcontext;
+import com.jogamp.openal.ALCdevice;
+import com.jogamp.openal.ALFactory;
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.sound.sampled.UnsupportedAudioFileException;
+
+import com.jogamp.openal.test.resources.ResourceLocation;
+import com.jogamp.openal.util.*;
+import java.io.FileNotFoundException;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+/**
+ * @author Athomas Goldberg
+ * @author Michael Bien
+ */
+public class ALTest {
+
+ private static AL al;
+ private static ALC alc;
+ private static ALCcontext context;
+ private static ALCdevice device;
+ private final static String TEST_FILE = "lewiscarroll.wav";
+
+ @BeforeClass
+ public static void setUp() {
+ al = ALFactory.getAL();
+ alc = ALFactory.getALC();
+ device = alc.alcOpenDevice(null);
+ context = alc.alcCreateContext(device, null);
+ alc.alcMakeContextCurrent(context);
+ }
+
+ @AfterClass
+ public static void tearDown() {
+ alc.alcMakeContextCurrent(null);
+ alc.alcDestroyContext(context);
+ alc.alcCloseDevice(device);
+ }
+
+
+ /*
+ * Test for void alGenBuffers(int, IntBuffer)
+ *//*
+ @Test public void testAlGenBuffersintIntBuffer() {
+ System.out.println("begin testAlGenBuffersintintBuffer");
+ // try basic case
+ try {
+ IntBuffer buffers = BufferUtils.newIntBuffer(7);
+ al.alGenBuffers(7,buffers);
+ for(int i = 0; i < 7; i++) {
+ assertFalse(buffers.get(i) == 0);
+ assertTrue(al.alIsBuffer(buffers.get(i)));
+ }
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ Exception ex = null;
+ // buffers == null
+ try {
+ IntBuffer buffers = null;
+ al.alGenBuffers(7,buffers);
+
+
+ } catch(IllegalArgumentException e) {
+ ex = e;
+ }
+ assertNotNull(ex);
+
+ ex = null;
+ // buffer too small
+ try {
+ IntBuffer buffers = BufferUtils.newIntBuffer(5);
+ al.alGenBuffers(7,buffers);
+ } catch(IllegalArgumentException e) {
+ ex = e;
+ }
+ assertNotNull(ex);
+
+ ex = null;
+ // buffer not direct
+ try {
+ IntBuffer buffers = IntBuffer.allocate(7);
+ al.alGenBuffers(7,buffers);
+ } catch(IllegalArgumentException e) {
+ ex = e;
+ }
+ assertNotNull(ex);
+ System.out.println("end testAlGenBuffersintintBuffer");
+ }
+ */
+
+ /*
+ * Test for void alGenBuffers(int, int[])
+ */
+ @Test
+ public void testAlGenBuffersintintArray() {
+
+ System.out.println("begin testAlGenBuffersintintArray");
+ // try basic case
+ int[] buffers = new int[7];
+ al.alGenBuffers(7, buffers, 0);
+ for (int i = 0; i < 7; i++) {
+ assertFalse(buffers[i] == 0);
+ assertTrue(al.alIsBuffer(buffers[i]));
+ }
+
+ Exception ex = null;
+ // try exceptions
+ try {
+ buffers = null;
+ al.alGenBuffers(7, buffers, 0);
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+ assertNotNull(ex);
+
+ ex = null;
+ try {
+ buffers = new int[5];
+ al.alGenBuffers(7, buffers, 0);
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+ assertNotNull(ex);
+
+ System.out.println("end testAlGenBuffersintintArray");
+
+ }
+
+ /*
+ * Test for void alDeleteBuffers(int, IntBuffer)
+ */
+// @Test
+ public void testAlDeleteBuffersintIntBuffer() {
+ System.out.println("begin testAlDeleteBuffersintintArray");
+ // try basic case
+ int[] buffers = new int[7];
+ al.alGenBuffers(7, buffers, 0);
+ for (int i = 0; i < 7; i++) {
+ assertFalse(buffers[i] == 0);
+ assertTrue(al.alIsBuffer(buffers[i]));
+ }
+ al.alDeleteBuffers(7, buffers, 0);
+ for (int i = 0; i < 7; i++) {
+ assertFalse(al.alIsBuffer(buffers[i]));
+ }
+
+ Exception ex = null;
+ // try exceptions
+ try {
+ al.alDeleteBuffers(7, (int[]) null, 0);
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+ assertNotNull(ex);
+
+ ex = null;
+ try {
+ buffers = new int[5];
+ al.alGenBuffers(5, buffers, 0);
+ al.alDeleteBuffers(7, buffers, 0);
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+ assertNotNull(ex);
+
+ try {
+ buffers = new int[7];
+ al.alDeleteBuffers(7, buffers, 0);
+ assertTrue(al.alGetError() != 0);
+ } catch (Exception e) {
+ fail("deleting an unfilled buffer list should generate an ALError but not an exception");
+ }
+
+ System.out.println("end testAlDeleteBuffersintintArray");
+ }
+
+ /*
+ * Test for void alDeleteBuffers(int, int[])
+ */
+// @Test
+ public void testAlDeleteBuffersintintArray() {
+ System.out.println("begin testAlDeleteBuffersintIntBuffer");
+ // try basic case
+ int[] buffers = new int[7];
+ al.alGenBuffers(7, buffers, 0);
+ for (int i = 0; i < 7; i++) {
+ assertFalse(buffers[i] == 0);
+ assertTrue(al.alIsBuffer(buffers[i]));
+ }
+ al.alDeleteBuffers(7, buffers, 0);
+ for (int i = 0; i < 7; i++) {
+ assertFalse(al.alIsBuffer(buffers[i]));
+ }
+
+ Exception ex = null;
+ // try exceptions
+ try {
+ al.alDeleteBuffers(7, (int[]) null, 0);
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+ assertNotNull(ex);
+ ex = null;
+ try {
+ buffers = new int[5];
+ al.alGenBuffers(5, buffers, 0);
+ al.alDeleteBuffers(7, buffers, 0);
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+ assertNotNull(ex);
+
+ ex = null;
+ try {
+ buffers = new int[5];
+ al.alDeleteBuffers(7, buffers, 0);
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+ assertNotNull(ex);
+
+ try {
+ buffers = new int[7];
+ al.alDeleteBuffers(7, buffers, 0);
+ assertTrue(al.alGetError() != 0);
+ } catch (Exception e) {
+ fail("deleting an unfilled buffer list should generate an ALError but not an exception");
+ }
+
+ System.out.println("end testAlDeleteBuffersintintArray");
+ }
+
+ @Test
+ public void testAlIsBuffer() {
+ System.out.println("begin testALIsBuffer");
+ // check a bufferlist with known bad values
+ int[] buffers = new int[7];
+ for (int i = 0; i < 7; i++) {
+ buffers[i] = -1;
+ assertFalse(al.alIsBuffer(buffers[i]));
+ }
+ // created
+ al.alGenBuffers(7, buffers, 0);
+ for (int i = 0; i < 7; i++) {
+ assertTrue(al.alIsBuffer(buffers[i]));
+ }
+ // deleted
+ al.alDeleteBuffers(7, buffers, 0);
+ for (int i = 0; i < 7; i++) {
+ assertFalse(al.alIsBuffer(buffers[i]));
+ }
+ System.out.println("end testALisBuffer");
+ }
+
+ /*
+ * Test for void alBufferData(int, int, Buffer, int, int)
+ */
+ @Test
+ public void testAlBufferDataintintByteBufferintint() throws IOException, UnsupportedAudioFileException {
+ System.out.println("begin testAlBufferDataintintByteBufferintint");
+ int[] buffers = new int[1];
+ al.alGenBuffers(1, buffers, 0);
+ WAVData wd = loadTestWAV();
+
+ al.alBufferData(buffers[0], wd.format, wd.data, wd.size, wd.freq);
+ int[] tmp = new int[1];
+ al.alGetBufferi(buffers[0], AL.AL_SIZE, tmp, 0);
+ assertFalse(tmp[0] == 0);
+
+ Exception ex = null;
+ try {
+ buffers = new int[1];
+ al.alGenBuffers(1, buffers, 0);
+
+ al.alBufferData(buffers[0], AL.AL_FORMAT_STEREO16, null, 0, 0);
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+ assertNotNull(ex);
+
+ System.out.println("end testAlBufferDataintintByteBufferintint");
+ }
+
+ /*
+ * Test for void alGetBufferi(int, int, int[])
+ */
+ @Test
+ public void testAlGetBufferiintintintArray() throws UnsupportedAudioFileException, IOException {
+ System.out.println("begin testAlGetBufferiintintintArray");
+ int[] buffers = new int[1];
+ al.alGenBuffers(1, buffers, 0);
+ WAVData wd = loadTestWAV();
+ al.alBufferData(buffers[0], wd.format, wd.data, wd.size, wd.freq);
+ int[] size = new int[1];
+ int[] freq = new int[1];
+ al.alGetBufferi(buffers[0], AL.AL_SIZE, size, 0);
+ al.alGetBufferi(buffers[0], AL.AL_FREQUENCY, freq, 0);
+// assertEquals(wd.size, size[0]);
+ assertEquals(wd.freq, freq[0]);
+
+ Exception ex = null;
+ try {
+ buffers = new int[1];
+ al.alGenBuffers(1, buffers, 0);
+ wd = loadTestWAV();
+ al.alBufferData(buffers[0], wd.format, wd.data, wd.size, wd.freq);
+ size = null;
+ al.alGetBufferi(buffers[0], AL.AL_SIZE, size, 0);
+
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+
+ assertNotNull(ex);
+
+ System.out.println("end testAlGetBufferiintintintArray");
+ }
+
+ /*
+ * Test for void alGetBufferi(int, int, IntBuffer)
+ */
+ @Test
+ public void testAlGetBufferiintintIntBuffer() throws UnsupportedAudioFileException, IOException {
+ int[] buffers = new int[1];
+ al.alGenBuffers(1, buffers, 0);
+ WAVData wd = loadTestWAV();
+ al.alBufferData(buffers[0], wd.format, wd.data, wd.size, wd.freq);
+
+ int[] size = new int[1];
+ int[] freq = new int[1];
+ al.alGetBufferi(buffers[0], AL.AL_SIZE, size, 0);
+ al.alGetBufferi(buffers[0], AL.AL_FREQUENCY, freq, 0);
+// assertEquals(wd.size, size[0]);
+ assertEquals(wd.freq, freq[0]);
+
+ Exception ex = null;
+ try {
+ buffers = new int[1];
+ al.alGenBuffers(1, buffers, 0);
+ wd = loadTestWAV();
+ al.alBufferData(buffers[0], wd.format, wd.data, wd.size, wd.freq);
+ size = null;
+ al.alGetBufferi(buffers[0], AL.AL_SIZE, size, 0);
+
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+
+ assertNotNull(ex);
+ ex = null;
+ try {
+ buffers = new int[1];
+ al.alGenBuffers(1, buffers, 0);
+ wd = loadTestWAV();
+ al.alBufferData(buffers[0], wd.format, wd.data, wd.size, wd.freq);
+ size = new int[1];
+ al.alGetBufferi(buffers[0], AL.AL_SIZE, size, 0);
+
+ } catch (IllegalArgumentException e) {
+ ex = e;
+ }
+
+// assertNotNull(ex);
+ }
+
+ private WAVData loadTestWAV() throws IOException, UnsupportedAudioFileException {
+ InputStream resource = ResourceLocation.class.getResourceAsStream(TEST_FILE);
+ if(resource == null) {
+ throw new FileNotFoundException(TEST_FILE+" not found");
+ }
+ return WAVLoader.loadFromStream(resource);
+ }
+}
diff --git a/src/test/com/jogamp/openal/test/manual/OpenALTest.java b/src/test/com/jogamp/openal/test/manual/OpenALTest.java
new file mode 100644
index 0000000..98843c7
--- /dev/null
+++ b/src/test/com/jogamp/openal/test/manual/OpenALTest.java
@@ -0,0 +1,122 @@
+package com.jogamp.openal.test.manual;
+
+/**
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * -Redistribution of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind.
+ * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+ * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS
+ * LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A
+ * RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ * IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
+ * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
+ * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS
+ * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use in the
+ * design, construction, operation or maintenance of any nuclear facility.
+ */
+import com.jogamp.common.nio.Buffers;
+import com.jogamp.openal.AL;
+import com.jogamp.openal.ALC;
+import com.jogamp.openal.ALCcontext;
+import com.jogamp.openal.ALCdevice;
+import com.jogamp.openal.ALFactory;
+import java.io.IOException;
+import java.nio.*;
+
+import com.jogamp.openal.eax.*;
+import com.jogamp.openal.util.*;
+import javax.sound.sampled.UnsupportedAudioFileException;
+
+/**
+ * @author Athomas Goldberg
+ * @author Michael Bien
+ */
+public class OpenALTest {
+
+ public static void main(String[] args) throws InterruptedException, UnsupportedAudioFileException, IOException {
+ ALC alc = ALFactory.getALC();
+ ALCdevice device = alc.alcOpenDevice(null);
+ ALCcontext context = alc.alcCreateContext(device, null);
+ alc.alcMakeContextCurrent(context);
+ AL al = ALFactory.getAL();
+
+ System.out.println("devices:");
+ String[] devices = alc.alcGetDeviceSpecifiers();
+ for (String name : devices) {
+ System.out.println(" "+name);
+ }
+ System.out.println("capture devices:");
+ devices = alc.alcGetCaptureDeviceSpecifiers();
+ for (String name : devices) {
+ System.out.println(" "+name);
+ }
+
+
+ boolean eaxPresent = al.alIsExtensionPresent("EAX2.0");
+ System.out.println("EAX present:" + eaxPresent);
+
+ int[] buffers = new int[1];
+ al.alGenBuffers(1, buffers, 0);
+
+ WAVData wd = WAVLoader.loadFromStream(OpenALTest.class.getResourceAsStream("lewiscarroll.wav"));
+ al.alBufferData(buffers[0], wd.format, wd.data, wd.size, wd.freq);
+
+ int[] sources = new int[1];
+ al.alGenSources(1, sources, 0);
+ al.alSourcei(sources[0], AL.AL_BUFFER, buffers[0]);
+
+ int[] loopArray = new int[1];
+ al.alGetSourcei(sources[0], AL.AL_LOOPING, loopArray, 0);
+ System.out.println("Looping 1: " + (loopArray[0] == AL.AL_TRUE));
+
+ int[] loopBuffer = new int[1];
+ al.alGetSourcei(sources[0], AL.AL_LOOPING, loopBuffer, 0);
+ System.out.println("Looping 2: " + (loopBuffer[0] == AL.AL_TRUE));
+
+ if (eaxPresent) {
+ EAX eax = EAXFactory.getEAX();
+ IntBuffer env = Buffers.newDirectIntBuffer(1);
+ env.put(EAX.EAX_ENVIRONMENT_BATHROOM);
+ eax.setListenerProperty(EAX.DSPROPERTY_EAXLISTENER_ENVIRONMENT, env);
+ }
+
+ al.alSourcePlay(sources[0]);
+
+ Thread.sleep(5000);
+
+ al.alSource3f(sources[0], AL.AL_POSITION, 2f, 2f, 2f);
+
+ Thread.sleep(5000);
+
+ al.alListener3f(AL.AL_POSITION, 3f, 3f, 3f);
+
+ Thread.sleep(5000);
+
+ al.alSource3f(sources[0], AL.AL_POSITION, 0, 0, 0);
+
+ Thread.sleep(10000);
+
+ al.alSourceStop(sources[0]);
+ al.alDeleteSources(1, sources, 0);
+ alc.alcDestroyContext(context);
+ alc.alcCloseDevice(device);
+ }
+}
diff --git a/src/test/com/jogamp/openal/test/manual/Sound3DTest.java b/src/test/com/jogamp/openal/test/manual/Sound3DTest.java
new file mode 100644
index 0000000..d91f0ec
--- /dev/null
+++ b/src/test/com/jogamp/openal/test/manual/Sound3DTest.java
@@ -0,0 +1,98 @@
+package com.jogamp.openal;
+
+/**
+ * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * -Redistribution of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ *
+ * -Redistribution in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of Sun Microsystems, Inc. or the names of contributors may
+ * be used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * This software is provided "AS IS," without a warranty of any kind.
+ * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING
+ * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MICROSYSTEMS, INC. ("SUN") AND ITS
+ * LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A
+ * RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.
+ * IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT
+ * OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
+ * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ * ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF SUN HAS
+ * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * You acknowledge that this software is not designed or intended for use in the
+ * design, construction, operation or maintenance of any nuclear facility.
+ */
+import java.io.*;
+import javax.sound.sampled.*;
+import com.jogamp.openal.sound3d.*;
+import com.jogamp.openal.test.resources.ResourceLocation;
+
+/**
+ * @author Athomas Goldberg
+ *
+ */
+public class Sound3DTest {
+
+ public static float lerp(float v1, float v2, float t) {
+ float result = 0;
+ result = v1 + ((v2 - v1) * t);
+ return result;
+ }
+
+ public static void main(String[] args) throws IOException, InterruptedException, UnsupportedAudioFileException {
+
+ AudioSystem3D.init();
+
+ // create the initial context - this can be collapsed into the init.
+ Device device = AudioSystem3D.openDevice(null);
+ Context context = AudioSystem3D.createContext(device);
+ AudioSystem3D.makeContextCurrent(context);
+
+ // get the listener object
+ Listener listener = AudioSystem3D.getListener();
+ listener.setPosition(0, 0, 0);
+
+ // load a source and play it
+ Source source1 = AudioSystem3D.loadSource(ResourceLocation.class.getResourceAsStream("lewiscarroll.wav"));
+ source1.setPosition(0, 0, 0);
+ source1.setLooping(true);
+ source1.play();
+
+ Thread.sleep(10000);
+
+ // move the source
+ source1.setPosition(1, 1, 1);
+
+ // move the listener
+ for (int i = 0; i < 1000; i++) {
+ float t = ((float) i) / 1000f;
+ float lp = lerp(0f, 2f, t);
+ listener.setPosition(lp, lp, lp);
+ Thread.sleep(10);
+ }
+
+ // fade listener out.
+ for (int i = 0; i < 1000; i++) {
+ float t = ((float) i) / 1000f;
+ float lp = lerp(1f, 0f, t);
+ listener.setGain(lp);
+ Thread.sleep(10);
+ }
+
+ source1.stop();
+ source1.delete();
+ context.destroy();
+ device.close();
+
+ }
+}
diff --git a/src/test/com/jogamp/openal/test/resources/ResourceLocation.java b/src/test/com/jogamp/openal/test/resources/ResourceLocation.java
new file mode 100644
index 0000000..74f1356
--- /dev/null
+++ b/src/test/com/jogamp/openal/test/resources/ResourceLocation.java
@@ -0,0 +1,6 @@
+
+package com.jogamp.openal.test.resources;
+
+/** just a tag to locate the resources */
+public class ResourceLocation {
+}
diff --git a/src/test/com/jogamp/openal/test/resources/lewiscarroll.wav b/src/test/com/jogamp/openal/test/resources/lewiscarroll.wav
new file mode 100644
index 0000000..2314d39
--- /dev/null
+++ b/src/test/com/jogamp/openal/test/resources/lewiscarroll.wav
Binary files differ