diff options
author | athomas <[email protected]> | 2003-11-23 01:39:59 +0000 |
---|---|---|
committer | athomas <[email protected]> | 2003-11-23 01:39:59 +0000 |
commit | 958b4a62bbfa639ad27756037049c9db3e7d3bf2 (patch) | |
tree | fc2bc580070c584a799c32e4509980e99309fb64 | |
parent | ebe0f9a9ea29dd09332cafe65286f563bb08f6d6 (diff) |
Several changes, uses newest lwjgl extal, throws exceptions from native code if AL doesn't load correctly and creates Context and Device objects in Native code.
git-svn-id: file:///home/mbien/NetBeansProjects/JOGAMP/joal-sync/git-svn/../svn-server-sync/joal/trunk@69 03bf7f67-59de-4072-a415-9a990d468a3f
-rw-r--r-- | build.xml | 3 | ||||
-rw-r--r-- | src/java/build.xml | 2 | ||||
-rw-r--r-- | src/java/net/java/games/joal/ALC.java | 2 | ||||
-rw-r--r-- | src/java/net/java/games/joal/ALCImpl.java | 38 | ||||
-rw-r--r-- | src/java/net/java/games/joal/ALFactory.java | 8 | ||||
-rw-r--r-- | src/java/net/java/games/joal/OpenALException.java | 50 | ||||
-rw-r--r-- | src/java/net/java/games/joal/util/ALut.java | 5 | ||||
-rw-r--r-- | src/java/net/java/games/sound3d/AudioSystem3D.java | 13 | ||||
-rw-r--r-- | src/java/net/java/games/sound3d/Sound3DException.java | 50 | ||||
-rw-r--r-- | src/native/alcbind.c | 78 | ||||
-rw-r--r-- | src/native/alcbind.h | 14 | ||||
-rw-r--r-- | src/native/alfactory.c | 7 | ||||
-rw-r--r-- | src/native/build.xml | 2 | ||||
-rw-r--r-- | src/native/common_tools.c | 106 | ||||
-rw-r--r-- | src/native/common_tools.h | 64 | ||||
-rw-r--r-- | src/native/extal.c | 500 | ||||
-rw-r--r-- | src/native/extal.h | 60 | ||||
-rw-r--r-- | unit_tests/src/OpenALTest.java | 153 | ||||
-rw-r--r-- | unit_tests/src/Sound3DTest.java | 8 | ||||
-rw-r--r-- | unit_tests/src/net/java/games/joal/ALTest.java | 16 |
20 files changed, 792 insertions, 387 deletions
@@ -39,7 +39,8 @@ <target name="init"> <property name="jdk.home" value="c:/j2sdk1.4.2"/> <!-- Edit this to taste --> <property name="openal.home" value="C:/Program Files/Creative Labs/OpenAL 1.0 SDK"/> <!-- Edit this to taste --> - <property name="optimize" value="on"/> <!-- Edit this to taste --> + <property name="optimize" value="off"/> <!-- Edit this to taste --> + <property name="debug" value="on"/> <!-- Edit this to taste --> <mkdir dir="classes"/> <mkdir dir="apidocs"/> <mkdir dir="lib"/> diff --git a/src/java/build.xml b/src/java/build.xml index 9e6eca7..44a11ae 100644 --- a/src/java/build.xml +++ b/src/java/build.xml @@ -40,7 +40,7 @@ </target> <target name="compile" depends="init"> - <javac srcdir="." destdir="../../classes" optimize="${optimize}"/> + <javac srcdir="." destdir="../../classes" debug="${debug}" optimize="${optimize}"/> </target> <target name="all" depends="init,compile"> diff --git a/src/java/net/java/games/joal/ALC.java b/src/java/net/java/games/joal/ALC.java index 36dfee1..f8855c6 100644 --- a/src/java/net/java/games/joal/ALC.java +++ b/src/java/net/java/games/joal/ALC.java @@ -254,6 +254,8 @@ public interface ALC extends ALCConstants { final int pointer; Context(ALC impl, int pointer) { + System.out.println("Pointer = " + pointer); + System.out.println("ALC = " + impl); this.pointer = pointer; this.alcContext = impl; } diff --git a/src/java/net/java/games/joal/ALCImpl.java b/src/java/net/java/games/joal/ALCImpl.java index cca3959..38a1b6e 100644 --- a/src/java/net/java/games/joal/ALCImpl.java +++ b/src/java/net/java/games/joal/ALCImpl.java @@ -48,20 +48,17 @@ final class ALCImpl implements ALC { })); } - - public Device alcOpenDevice(String deviceName) { - System.out.println("Entering alcOpenDevice()"); - Device result = null; - int pointer = openDeviceNative(deviceName); - if(pointer != 0) { - System.out.println("In alcOpenDevice: Device Pointer = " + pointer); - result = new Device(pointer); - } - System.out.println("Exiting alcOpenDevice()"); - return result; - } - + + public Device alcOpenDevice(String deviceName) { + System.out.println("Entering alcOpenDevice2()"); + Device result = openDeviceNative(deviceName); + System.out.println("Exiting alcOpenDevice2()"); + return result; + } + /* private native int openDeviceNative(String deviceName); +*/ + private native Device openDeviceNative(String deviceName); public void alcCloseDevice(Device device) { if(device != null) { @@ -70,7 +67,7 @@ final class ALCImpl implements ALC { } private native void closeDeviceNative(int pointer); - +/* public Context alcCreateContext(Device device, int[] attrs) { Context result = null; if(device != null) { @@ -82,8 +79,19 @@ final class ALCImpl implements ALC { } return result; } - +*/ +/* private native int createContextNative(int pointer, int[] attrs); +*/ + public Context alcCreateContext(Device device, int[] attrs) { + Context result = null; + if(device != null) { + result = createContextNative(device.pointer, attrs); + contextMap.put(new Integer(result.pointer), result); + } + return result; + } + private native Context createContextNative(int pointer, int[] attrs); public int alcMakeContextCurrent(Context context) { int result = 0; diff --git a/src/java/net/java/games/joal/ALFactory.java b/src/java/net/java/games/joal/ALFactory.java index 8d364e4..80d1cdb 100644 --- a/src/java/net/java/games/joal/ALFactory.java +++ b/src/java/net/java/games/joal/ALFactory.java @@ -55,7 +55,7 @@ public class ALFactory { * @return true is OpenAL was able to initialize, * false if OpenAL was not able to intialize */ - public static boolean initialize() { + public static boolean initialize() throws OpenALException { String osProperty = System.getProperty("os.name"); if(osProperty.startsWith("Win")) { isInitialized = init(new String[] { "OpenAL32.dll" }); @@ -67,7 +67,7 @@ public class ALFactory { return isInitialized; } - private static native boolean init(String[] oalPaths); + private static native boolean init(String[] oalPaths) throws OpenALException; /** * Deinitialize the OpenAL environment @@ -83,7 +83,7 @@ public class ALFactory { * * @return the AL object */ - public static AL getAL() { + public static AL getAL() throws OpenALException { if(!isInitialized) { initialize(); } @@ -99,7 +99,7 @@ public class ALFactory { * * @return the ALC object */ - public static ALC getALC() { + public static ALC getALC() throws OpenALException{ if(!isInitialized) { initialize(); } diff --git a/src/java/net/java/games/joal/OpenALException.java b/src/java/net/java/games/joal/OpenALException.java new file mode 100644 index 0000000..f8a7732 --- /dev/null +++ b/src/java/net/java/games/joal/OpenALException.java @@ -0,0 +1,50 @@ +/* + * Created on Nov 22, 2003 + * + * To change the template for this generated file go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +package net.java.games.joal; + +/** + * @author athomas + * + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class OpenALException extends Exception { + + /** + * + */ + public OpenALException() { + super(); + // TODO Auto-generated constructor stub + } + + /** + * @param arg0 + */ + public OpenALException(String arg0) { + super(arg0); + // TODO Auto-generated constructor stub + } + + /** + * @param arg0 + */ + public OpenALException(Throwable arg0) { + super(arg0); + // TODO Auto-generated constructor stub + } + + /** + * @param arg0 + * @param arg1 + */ + public OpenALException(String arg0, Throwable arg1) { + super(arg0, arg1); + // TODO Auto-generated constructor stub + } + +} diff --git a/src/java/net/java/games/joal/util/ALut.java b/src/java/net/java/games/joal/util/ALut.java index 62b04c8..cd89e0c 100644 --- a/src/java/net/java/games/joal/util/ALut.java +++ b/src/java/net/java/games/joal/util/ALut.java @@ -43,6 +43,7 @@ import javax.sound.sampled.UnsupportedAudioFileException; import net.java.games.joal.AL; import net.java.games.joal.ALC; import net.java.games.joal.ALFactory; +import net.java.games.joal.OpenALException; /** * @author Athomas Goldberg @@ -54,13 +55,13 @@ public final class ALut { private ALut() { } - public static void alutInit() { + public static void alutInit() throws OpenALException { System.out.println("Go TEAM!"); System.out.println("Entering alutInit()"); ALFactory.initialize(); alc = ALFactory.getALC(); //String deviceName = null; - String deviceName = "MMSYSTEM"; + String deviceName = null; /* String os = System.getProperty("os.name"); if (os.startsWith("Windows")) { diff --git a/src/java/net/java/games/sound3d/AudioSystem3D.java b/src/java/net/java/games/sound3d/AudioSystem3D.java index b356b6b..8dc4ba3 100644 --- a/src/java/net/java/games/sound3d/AudioSystem3D.java +++ b/src/java/net/java/games/sound3d/AudioSystem3D.java @@ -36,6 +36,7 @@ package net.java.games.sound3d; import net.java.games.joal.AL; import net.java.games.joal.ALC; import net.java.games.joal.ALFactory; +import net.java.games.joal.OpenALException; import net.java.games.joal.util.WAVData; import net.java.games.joal.util.WAVLoader; @@ -59,10 +60,14 @@ public class AudioSystem3D { * Iniitalize the Sound3D environment. This must be called before * other methods in the class can be used. */ - public static void init() { - ALFactory.initialize(); - al = ALFactory.getAL(); - alc = ALFactory.getALC(); + public static void init() throws Sound3DException { + try { + ALFactory.initialize(); + al = ALFactory.getAL(); + alc = ALFactory.getALC(); + } catch (OpenALException e) { + throw new Sound3DException("Could not initialize AudioSystem3D: ",e); + } } /** diff --git a/src/java/net/java/games/sound3d/Sound3DException.java b/src/java/net/java/games/sound3d/Sound3DException.java new file mode 100644 index 0000000..6b927ca --- /dev/null +++ b/src/java/net/java/games/sound3d/Sound3DException.java @@ -0,0 +1,50 @@ +/* + * Created on Nov 22, 2003 + * + * To change the template for this generated file go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +package net.java.games.sound3d; + +/** + * @author athomas + * + * To change the template for this generated type comment go to + * Window>Preferences>Java>Code Generation>Code and Comments + */ +public class Sound3DException extends Exception { + + /** + * + */ + public Sound3DException() { + super(); + // TODO Auto-generated constructor stub + } + + /** + * @param arg0 + */ + public Sound3DException(String arg0) { + super(arg0); + // TODO Auto-generated constructor stub + } + + /** + * @param arg0 + */ + public Sound3DException(Throwable arg0) { + super(arg0); + // TODO Auto-generated constructor stub + } + + /** + * @param arg0 + * @param arg1 + */ + public Sound3DException(String arg0, Throwable arg1) { + super(arg0, arg1); + // TODO Auto-generated constructor stub + } + +} diff --git a/src/native/alcbind.c b/src/native/alcbind.c index 48c1404..0917599 100644 --- a/src/native/alcbind.c +++ b/src/native/alcbind.c @@ -40,7 +40,7 @@ JNIEXPORT jint JNICALL Java_net_java_games_joal_ALCImpl_alcGetErrorNative return alcGetError((ALCdevice*)pointer); } - +/* JNIEXPORT jint JNICALL Java_net_java_games_joal_ALCImpl_openDeviceNative (JNIEnv *env, jobject obj, jstring deviceName) { printf("Entering openDeviceNative()\n"); @@ -65,13 +65,54 @@ JNIEXPORT jint JNICALL Java_net_java_games_joal_ALCImpl_openDeviceNative printf("Exiting openDeviceNative()\n"); return result; } +*/ +JNIEXPORT jobject JNICALL Java_net_java_games_joal_ALCImpl_openDeviceNative + (JNIEnv *env, jobject obj, jstring deviceName) { + const char * tokenstring; + + jboolean isCopy = JNI_FALSE; + if(deviceName != NULL) { + tokenstring = ((*env)->GetStringUTFChars(env, deviceName, &isCopy)); + } else { + tokenstring = NULL; + } + + /* get device */ + ALCdevice* device = alcOpenDevice((ALubyte *) tokenstring); + + /* if error - cleanup and get out */ + if(device == NULL) { + if(tokenstring != NULL) { + (*env)->ReleaseStringUTFChars(env, deviceName, tokenstring); + } + return NULL; + } + + /* get ready to create ALCdevice instance */ + jobject alcDevice_object = NULL; + jclass alcDevice_class = NULL; + jmethodID alcDevice_method = NULL; + + /* find class and constructor */ + alcDevice_class = (*env)->FindClass(env, "net/java/games/joal/ALC$Device"); + alcDevice_method = (*env)->GetMethodID(env, alcDevice_class, "<init>", "(I)V"); + + /* create instance */ + alcDevice_object = (*env)->NewObject(env, alcDevice_class, alcDevice_method, (int) device); + + /* clean up */ + if (tokenstring != NULL) + (*env)->ReleaseStringUTFChars(env, deviceName, tokenstring); + + return alcDevice_object; +} JNIEXPORT void JNICALL Java_net_java_games_joal_ALCImpl_closeDeviceNative (JNIEnv *env, jobject obj, jint pointer) { ALCdevice* device = (ALCdevice*)pointer; alcCloseDevice(device); } - +/* JNIEXPORT jint JNICALL Java_net_java_games_joal_ALCImpl_createContextNative (JNIEnv *env, jobject obj, jint pointer, jintArray attrs) { ALCdevice* device = (ALCdevice*)pointer; @@ -86,6 +127,39 @@ JNIEXPORT jint JNICALL Java_net_java_games_joal_ALCImpl_createContextNative return ctxPtr; } } +*/ + +JNIEXPORT jobject JNICALL Java_net_java_games_joal_ALCImpl_createContextNative + (JNIEnv *env, jobject obj, jint deviceAddress, jintArray attrs) { + ALint* address = NULL; + + if(attrs != NULL) { + address = (ALint*)(*env)->GetPrimitiveArrayCritical(env,attrs,0); + } + ALCcontext* context = alcCreateContext((ALCdevice*)deviceAddress, address); + if(address != NULL) { + (*env)->ReleasePrimitiveArrayCritical(env,attrs,address,0); + } + /* if error - get out */ + if(context == NULL) { + return NULL; + } + + /* get ready to create ALCcontext instance */ + jobject alcContext_object = NULL; + jclass alcContext_class = NULL; + jmethodID alcContext_method = NULL; + + /* find class and constructor */ + alcContext_class = (*env)->FindClass(env, "net/java/games/joal/ALC$Context"); + alcContext_method = (*env)->GetMethodID(env, alcContext_class, "<init>", "(Lnet/java/games/joal/ALC;I)V"); + + /* create instance */ + alcContext_object = (*env)->NewObject(env, alcContext_class, alcContext_method, obj, (int) context); + + return alcContext_object; +} + JNIEXPORT jint JNICALL Java_net_java_games_joal_ALCImpl_makeContextCurrentNative (JNIEnv *env, jobject obj, jint pointer) { diff --git a/src/native/alcbind.h b/src/native/alcbind.h index f4a6212..911940b 100644 --- a/src/native/alcbind.h +++ b/src/native/alcbind.h @@ -43,8 +43,17 @@ extern "C" { * Method: openDeviceNative * Signature: (Ljava/lang/String;)I */ + /* JNIEXPORT jint JNICALL Java_net_java_games_joal_ALCImpl_openDeviceNative (JNIEnv *, jobject, jstring); +*/ +/* + * Class: net_java_games_joal_ALCImpl + * Method: openDeviceNative + * Signature: (Ljava/lang/String;)I + */ +JNIEXPORT jobject JNICALL Java_net_java_games_joal_ALCImpl_openDeviceNative + (JNIEnv *, jobject, jstring); /* * Class: net_java_games_joal_ALCImpl @@ -59,9 +68,12 @@ JNIEXPORT void JNICALL Java_net_java_games_joal_ALCImpl_closeDeviceNative * Method: createContextNative * Signature: (I[I)I */ +/* JNIEXPORT jint JNICALL Java_net_java_games_joal_ALCImpl_createContextNative (JNIEnv *, jobject, jint, jintArray); - +*/ +JNIEXPORT jobject JNICALL Java_net_java_games_joal_ALCImpl_createContextNative + (JNIEnv *, jobject, jint, jintArray); /* * Class: net_java_games_joal_ALCImpl * Method: makeContextCurrentNative diff --git a/src/native/alfactory.c b/src/native/alfactory.c index d989580..a497c0c 100644 --- a/src/native/alfactory.c +++ b/src/native/alfactory.c @@ -33,15 +33,14 @@ #include "alfactory.h" #include "extal.h" -#include <jni.h> +#include "jni.h" JNIEXPORT jboolean JNICALL Java_net_java_games_joal_ALFactory_init (JNIEnv *env , jclass clazz, jobjectArray oalPaths) { printf("ALFactory.init - Native: Enter\n"); - jboolean result = InitializeOpenAL(env,oalPaths); - printf("ALFactory.init - Native: Test 1 result = %i\n",result); + InitializeOpenAL(env,oalPaths); printf("ALFactory.init - Native: Exit\n"); - return result; + return 1; } JNIEXPORT jboolean JNICALL Java_net_java_games_joal_ALFactory_deinitialize diff --git a/src/native/build.xml b/src/native/build.xml index 7f28128..a0c3b3a 100644 --- a/src/native/build.xml +++ b/src/native/build.xml @@ -39,7 +39,7 @@ <target name="init"> <property name="cc" value ="gcc"/> <property name="no_cygwin" value="-mno-cygwin"/> - <property name="sources" value="extal.c eaxfactory.c eaxbind.c alfactory.c alcbind.c albind.c"/> + <property name="sources" value="common_tools.c extal.c eaxfactory.c eaxbind.c alfactory.c alcbind.c albind.c"/> <property name="specs" value="-specs='./specs.new'"/> <condition property="isUnix"> <os family="unix" /> diff --git a/src/native/common_tools.c b/src/native/common_tools.c new file mode 100644 index 0000000..c38b4b3 --- /dev/null +++ b/src/native/common_tools.c @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2002 Light Weight Java Game Library Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of 'Light Weight Java Game Library' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT OWNER 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. + */ + +/** + * $Id$ + * + * @author elias_naur <[email protected]> + * @version $Revision$ + */ + +#include "common_tools.h" + +static void incListStart(event_queue_t *queue) { + queue->list_start = (queue->list_start + 1)%EVENT_BUFFER_SIZE; +} + +void initEventQueue(event_queue_t *event_queue) { + event_queue->list_start = 0; + event_queue->list_end = 0; +} + +void putEventElement(event_queue_t *queue, unsigned char byte) { + int next_index = (queue->list_end + 1)%EVENT_BUFFER_SIZE; + if (next_index == queue->list_start) { +#ifdef _DEBUG + printf("Event buffer overflow!\n"); +#endif + return; + } + queue->input_event_buffer[queue->list_end] = byte; + queue->list_end = next_index; +} + +static int hasMoreEvents(event_queue_t *queue) { + return queue->list_start != queue->list_end; +} + +static void copyEvent(event_queue_t *queue, int event_size, int event_index) { + int output_index = event_index*event_size; + int i; + for (i = 0; i < event_size; i++) { + queue->output_event_buffer[output_index] = queue->input_event_buffer[queue->list_start]; + incListStart(queue); + output_index++; + } +} + +int copyEvents(event_queue_t *event_queue, int event_size) { + int num_events = 0; + while (hasMoreEvents(event_queue)) { + copyEvent(event_queue, event_size, num_events); + num_events++; + } + return num_events; +} + +unsigned char *getOutputList(event_queue_t *queue) { + return queue->output_event_buffer; +} + +int getEventBufferSize(event_queue_t *event_queue) { + return EVENT_BUFFER_SIZE; +} + +static void throwGeneralException(JNIEnv * env, const char *exception_name, const char * err) { + jclass cls = (*env)->FindClass(env,exception_name); + (*env)->ThrowNew(env,cls, err); + (*env)->DeleteLocalRef(env,cls); +} + +void throwOpenALException(JNIEnv * env, const char * err) { + throwGeneralException(env, "net/java/games/joal/OpenALException", err); +} + +void throwException(JNIEnv * env, const char * err) { + throwGeneralException(env, "java/lang/Exception", err); +} diff --git a/src/native/common_tools.h b/src/native/common_tools.h new file mode 100644 index 0000000..2298728 --- /dev/null +++ b/src/native/common_tools.h @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2002 Light Weight Java Game Library Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * 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. + * + * * Neither the name of 'Light Weight Java Game Library' nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "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 THE COPYRIGHT OWNER 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. + */ + +/** + * $Id$ + * + * @author elias_naur <[email protected]> + * @version $Revision$ + */ + +#ifndef _COMMON_TOOLS_H +#define _COMMON_TOOLS_H + +#include <jni.h> + +// Must be x * max_event_size + 1 +#define EVENT_BUFFER_SIZE (25 * 4 + 1) + +typedef struct { + unsigned char input_event_buffer[EVENT_BUFFER_SIZE]; + unsigned char output_event_buffer[EVENT_BUFFER_SIZE]; + + int list_start; + int list_end; +} event_queue_t; + +extern void initEventQueue(event_queue_t *event_queue); +extern int copyEvents(event_queue_t *event_queue, int event_size); +extern void putEventElement(event_queue_t *queue, unsigned char byte); +extern unsigned char *getOutputList(event_queue_t *queue); +extern int getEventBufferSize(event_queue_t *event_queue); +extern void throwException(JNIEnv *env, const char *msg); +extern void throwOpenALException(JNIEnv * env, const char * err); + +#endif diff --git a/src/native/extal.c b/src/native/extal.c index e264db2..45947dc 100644 --- a/src/native/extal.c +++ b/src/native/extal.c @@ -7,15 +7,15 @@ * met: * * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. + * notice, this list of conditions and the following disclaimer. * * * 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. + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * * * Neither the name of 'Light Weight Java Game Library' nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,12 +30,12 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include <stdio.h> -#include <jni.h> +#include "stdio.h" #include "extal.h" +#include "common_tools.h" #ifdef _X11 -#include <dlfcn.h> +#include "dlfcn.h" #endif /** @@ -118,32 +118,60 @@ alcGetProcAddressPROC alcGetProcAddress = NULL; alcGetEnumValuePROC alcGetEnumValue = NULL; #ifdef _WIN32 -EAXSet eaxSet; // EAXSet function, ret$ -EAXGet eaxGet; // EAXGet function, ret$ +EAXSet eaxSet; // EAXSet function, ret$ +EAXGet eaxGet; // EAXGet function, ret$ /* Handle to OpenAL Library */ HMODULE handleOAL; -#else +#endif +#ifdef _X11 void* handleOAL; #endif +#ifdef _AGL +#include "mach-o/dyld.h" +#include "stdlib.h" +#include "string.h" +const struct mach_header* handleOAL; +#endif /* Loads OpenAL */ -void LoadOpenAL(); +static int LoadOpenAL(JNIEnv *env, jobjectArray oalPaths); /* Unloads OpenAL */ -void UnLoadOpenAL(); +static void UnLoadOpenAL(void); /* Gets a pointer to the named function */ -void* GetFunctionPointer(const char* function); +static void* GetFunctionPointer(const char* function); /* Loads OpenAL basic functions */ -int LoadAL(); +static int LoadAL(void); /* Loads OpenAL ALC functions */ -int LoadALC(); +static int LoadALC(void); /* Loads any extensions to OpenAL */ -int LoadALExtensions(); +static int LoadALExtensions(void); + +static void *NativeGetFunctionPointer(const char *function) { +#ifdef _WIN32 + return GetProcAddress(handleOAL, function); +#endif +#ifdef _X11 + return dlsym(handleOAL, function); +#endif +#ifdef _AGL + char *mac_symbol_name = (char *)malloc((strlen(function) + 2)*sizeof(char)); + if (mac_symbol_name == NULL) + return NULL; + mac_symbol_name[0] = '_'; + strcpy(&(mac_symbol_name[1]), function); + NSSymbol symbol = NSLookupSymbolInImage(handleOAL, mac_symbol_name, NSLOOKUPSYMBOLINIMAGE_OPTION_RETURN_ON_ERROR); + free(mac_symbol_name); + if (symbol == NULL) + return NULL; + return NSAddressOfSymbol(symbol); +#endif +} /** * Retrieves a pointer to the named function @@ -151,102 +179,106 @@ int LoadALExtensions(); * @param function Name of function * @return pointer to named function, or NULL if not found */ -void* GetFunctionPointer(const char* function) { -#ifdef _WIN32 - return GetProcAddress(handleOAL, function); -#endif -#ifdef _X11 - return dlsym(handleOAL, function); +static void* GetFunctionPointer(const char* function) { + void *p = NativeGetFunctionPointer(function); + if (p == NULL) { +#ifdef _DEBUG + printf("Could not locate symbol %s\n", function); #endif + } + return p; } /** * Loads the OpenAL Library */ -void LoadOpenAL(JNIEnv *env, jobjectArray oalPaths) { - printf("LoadOpenAL: Enter\n"); - jsize pathcount = (*env)->GetArrayLength(env,oalPaths); -//#ifdef _DEBUG - printf("LoadOpenAL: test 1 Found %d OpenAL paths\n", pathcount); -//#endif - int i; - for(i=0;i<pathcount;i++) { - jstring path = (jstring) (*env)->GetObjectArrayElement(env,oalPaths, i); - const char *path_str = (*env)->GetStringUTFChars(env,path, NULL); -//#ifdef _DEBUG - printf("LoadOpenAL: Test 2 loading '%s'\n", path_str); -//#endif +static int LoadOpenAL(JNIEnv *env, jobjectArray oalPaths) { + + jsize pathcount = (*env)->GetArrayLength(env,oalPaths); +#ifdef _DEBUG + printf("Found %d OpenAL paths\n", (int)pathcount); +#endif + int i; + for(i=0;i<pathcount;i++) { + jstring path = (jstring) (*env)->GetObjectArrayElement(env,oalPaths, i); + const char *path_str = (*env)->GetStringUTFChars(env,path, NULL); +#ifdef _DEBUG + printf("Testing '%s'\n", path_str); +#endif #ifdef _WIN32 - handleOAL = LoadLibrary(path_str); + handleOAL = LoadLibrary(path_str); #endif #ifdef _X11 - handleOAL = dlopen(path_str, RTLD_LAZY); + handleOAL = dlopen(path_str, RTLD_LAZY); #endif - if (handleOAL != NULL) { -//#ifdef _DEBUG - printf("loadOpenAL: Test 3 Found OpenAL at '%s'\n", path_str); -//#endif - break; - } - (*env)->ReleaseStringUTFChars(env, path, path_str); - } +#ifdef _AGL + handleOAL = NSAddImage(path_str, NSADDIMAGE_OPTION_RETURN_ON_ERROR); +#endif + if (handleOAL != NULL) { +#ifdef _DEBUG + printf("Found OpenAL at '%s'\n", path_str); +#endif + return 1; + } + (*env)->ReleaseStringUTFChars(env,path, path_str); + } + throwOpenALException(env, "Could not load openal library."); + return 0; } /** * Unloads the OpenAL Library */ -void UnLoadOpenAL() { +static void UnLoadOpenAL() { #ifdef _WIN32 - FreeLibrary(handleOAL); + FreeLibrary(handleOAL); #endif #ifdef _X11 - dlclose(handleOAL); + dlclose(handleOAL); +#endif +#ifdef _AGL + // Cannot remove the image #endif } /** * Initializes OpenAL by loading the library */ -int InitializeOpenAL(JNIEnv *env, jobjectArray oalPaths) { - printf("InitializeOpenAL: Enter\n"); - if(handleOAL != 0) { - return JNI_TRUE; - } - printf("InitializeOpenAL: test 1\n"); - //load our library - LoadOpenAL(env, oalPaths); - printf("InitializeOpenAL: test 2 handleOAL = %i\n",(int)handleOAL); - // if we couldn't load the library, get out - if(handleOAL == 0) { - return JNI_FALSE; - } - printf("InitializeOpenAL: test 3\n"); - - //load basic OpenAL functions - if(!LoadAL()) { - return JNI_FALSE; - } - printf("InitializeOpenAL: test 4\n"); +void InitializeOpenAL(JNIEnv *env, jobjectArray oalPaths) { + if(handleOAL != NULL) { + return; + } - //load OpenAL context functions - if(!LoadALC()) { - return JNI_FALSE; - } - printf("InitializeOpenAL: test 5\n"); - //load OpenAL extensions - if(!LoadALExtensions()) { - return JNI_FALSE; - } - printf("InitializeOpenAL: Exit\n"); - return JNI_TRUE; + //load our library + if (!LoadOpenAL(env, oalPaths)) { + return; + } + + //load basic OpenAL functions + if(!LoadAL()) { + throwOpenALException(env, "Could not load OpenAL function pointers."); + return; + } + + //load OpenAL context functions + if(!LoadALC()) { + throwOpenALException(env, "Could not load ALC function pointers."); + return; + } + + //load OpenAL extensions + if(!LoadALExtensions()) { + throwOpenALException(env, "Could not load AL extension function pointers."); + return; + } } /** * Called to deinitialize OpenAL */ void DeInitializeOpenAL() { - UnLoadOpenAL(); - handleOAL = 0; + UnLoadOpenAL(); + handleOAL = 0; } /** @@ -254,124 +286,119 @@ void DeInitializeOpenAL() { * * @return true if all methods were loaded, false if one of the methods could not be loaded */ -int LoadAL() { - printf("LoadAL: Enter\n"); - - alEnable = (alEnablePROC) GetFunctionPointer("alEnable"); - alDisable = (alDisablePROC) GetFunctionPointer("alDisable"); - alIsEnabled = (alIsEnabledPROC) GetFunctionPointer("alIsEnabled"); - //alHint = (alHintPROC) GetFunctionPointer("alHint"); - alGetBoolean = (alGetBooleanPROC) GetFunctionPointer("alGetBoolean"); - alGetInteger = (alGetIntegerPROC) GetFunctionPointer("alGetInteger"); - alGetFloat = (alGetFloatPROC) GetFunctionPointer("alGetFloat"); - alGetDouble = (alGetDoublePROC) GetFunctionPointer("alGetDouble"); - alGetBooleanv = (alGetBooleanvPROC) GetFunctionPointer("alGetBooleanv"); - alGetIntegerv = (alGetIntegervPROC) GetFunctionPointer("alGetIntegerv"); - alGetFloatv = (alGetFloatvPROC) GetFunctionPointer("alGetFloatv"); - alGetDoublev = (alGetDoublevPROC) GetFunctionPointer("alGetDoublev"); - alGetString = (alGetStringPROC) GetFunctionPointer("alGetString"); - alGetError = (alGetErrorPROC) GetFunctionPointer("alGetError"); - alIsExtensionPresent = (alIsExtensionPresentPROC) GetFunctionPointer("alIsExtensionPresent"); - alGetProcAddress = (alGetProcAddressPROC) GetFunctionPointer("alGetProcAddress"); - alGetEnumValue = (alGetEnumValuePROC) GetFunctionPointer("alGetEnumValue"); - alListeneri = (alListeneriPROC) GetFunctionPointer("alListeneri"); - alListenerf = (alListenerfPROC) GetFunctionPointer("alListenerf"); - alListener3f = (alListener3fPROC) GetFunctionPointer("alListener3f"); - alListenerfv = (alListenerfvPROC) GetFunctionPointer("alListenerfv"); - alGetListeneri = (alGetListeneriPROC) GetFunctionPointer("alGetListeneri"); - alGetListenerf = (alGetListenerfPROC) GetFunctionPointer("alGetListenerf"); - alGetListener3f = (alGetListener3fPROC) GetFunctionPointer("alGetListener3f"); - alGetListenerfv = (alGetListenerfvPROC) GetFunctionPointer("alGetListenerfv"); - alGenSources = (alGenSourcesPROC) GetFunctionPointer("alGenSources"); - alDeleteSources = (alDeleteSourcesPROC) GetFunctionPointer("alDeleteSources"); - alIsSource = (alIsSourcePROC) GetFunctionPointer("alIsSource"); - alSourcei = (alSourceiPROC) GetFunctionPointer("alSourcei"); - alSourcef = (alSourcefPROC) GetFunctionPointer("alSourcef"); - alSource3f = (alSource3fPROC) GetFunctionPointer("alSource3f"); - alSourcefv = (alSourcefvPROC) GetFunctionPointer("alSourcefv"); - alGetSourcei = (alGetSourceiPROC) GetFunctionPointer("alGetSourcei"); - alGetSourcef = (alGetSourcefPROC) GetFunctionPointer("alGetSourcef"); - alGetSource3f = (alGetSource3fPROC) GetFunctionPointer("alGetSource3f"); - alGetSourcefv = (alGetSourcefvPROC) GetFunctionPointer("alGetSourcefv"); - alSourcePlayv = (alSourcePlayvPROC) GetFunctionPointer("alSourcePlayv"); - alSourcePausev = (alSourcePausevPROC) GetFunctionPointer("alSourcePausev"); - alSourceStopv = (alSourceStopvPROC) GetFunctionPointer("alSourceStopv"); - alSourceRewindv = (alSourceRewindvPROC) GetFunctionPointer("alSourceRewindv"); - alSourcePlay = (alSourcePlayPROC) GetFunctionPointer("alSourcePlay"); - alSourcePause = (alSourcePausePROC) GetFunctionPointer("alSourcePause"); - alSourceStop = (alSourceStopPROC) GetFunctionPointer("alSourceStop"); - alSourceRewind = (alSourceRewindPROC) GetFunctionPointer("alSourceRewind"); - alGenBuffers = (alGenBuffersPROC) GetFunctionPointer("alGenBuffers"); - alDeleteBuffers = (alDeleteBuffersPROC) GetFunctionPointer("alDeleteBuffers"); - alIsBuffer = (alIsBufferPROC) GetFunctionPointer("alIsBuffer"); - alBufferData = (alBufferDataPROC) GetFunctionPointer("alBufferData"); - alGetBufferi = (alGetBufferiPROC) GetFunctionPointer("alGetBufferi"); - alGetBufferf = (alGetBufferfPROC) GetFunctionPointer("alGetBufferf"); - alSourceQueueBuffers = (alSourceQueueBuffersPROC) GetFunctionPointer("alSourceQueueBuffers"); - alSourceUnqueueBuffers = (alSourceUnqueueBuffersPROC) GetFunctionPointer("alSourceUnqueueBuffers"); - alDistanceModel = (alDistanceModelPROC) GetFunctionPointer("alDistanceModel"); - alDopplerFactor = (alDopplerFactorPROC) GetFunctionPointer("alDopplerFactor"); - alDopplerVelocity = (alDopplerVelocityPROC) GetFunctionPointer("alDopplerVelocity"); +static int LoadAL() { + alEnable = (alEnablePROC) GetFunctionPointer("alEnable"); + alDisable = (alDisablePROC) GetFunctionPointer("alDisable"); + alIsEnabled = (alIsEnabledPROC) GetFunctionPointer("alIsEnabled"); + //alHint = (alHintPROC) GetFunctionPointer("alHint"); + //alGetintean = (alGetinteanPROC) GetFunctionPointer("alGetintean"); + alGetInteger = (alGetIntegerPROC) GetFunctionPointer("alGetInteger"); + alGetFloat = (alGetFloatPROC) GetFunctionPointer("alGetFloat"); + alGetDouble = (alGetDoublePROC) GetFunctionPointer("alGetDouble"); + //alGetinteanv = (alGetinteanvPROC) GetFunctionPointer("alGetinteanv"); + alGetIntegerv = (alGetIntegervPROC) GetFunctionPointer("alGetIntegerv"); + alGetFloatv = (alGetFloatvPROC) GetFunctionPointer("alGetFloatv"); + alGetDoublev = (alGetDoublevPROC) GetFunctionPointer("alGetDoublev"); + alGetString = (alGetStringPROC) GetFunctionPointer("alGetString"); + alGetError = (alGetErrorPROC) GetFunctionPointer("alGetError"); + alIsExtensionPresent = (alIsExtensionPresentPROC) GetFunctionPointer("alIsExtensionPresent"); + alGetProcAddress = (alGetProcAddressPROC) GetFunctionPointer("alGetProcAddress"); + alGetEnumValue = (alGetEnumValuePROC) GetFunctionPointer("alGetEnumValue"); + alListeneri = (alListeneriPROC) GetFunctionPointer("alListeneri"); + alListenerf = (alListenerfPROC) GetFunctionPointer("alListenerf"); + alListener3f = (alListener3fPROC) GetFunctionPointer("alListener3f"); + alListenerfv = (alListenerfvPROC) GetFunctionPointer("alListenerfv"); + alGetListeneri = (alGetListeneriPROC) GetFunctionPointer("alGetListeneri"); + alGetListenerf = (alGetListenerfPROC) GetFunctionPointer("alGetListenerf"); + alGetListener3f = (alGetListener3fPROC) GetFunctionPointer("alGetListener3f"); + alGetListenerfv = (alGetListenerfvPROC) GetFunctionPointer("alGetListenerfv"); + alGenSources = (alGenSourcesPROC) GetFunctionPointer("alGenSources"); + alDeleteSources = (alDeleteSourcesPROC) GetFunctionPointer("alDeleteSources"); + alIsSource = (alIsSourcePROC) GetFunctionPointer("alIsSource"); + alSourcei = (alSourceiPROC) GetFunctionPointer("alSourcei"); + alSourcef = (alSourcefPROC) GetFunctionPointer("alSourcef"); + alSource3f = (alSource3fPROC) GetFunctionPointer("alSource3f"); + alSourcefv = (alSourcefvPROC) GetFunctionPointer("alSourcefv"); + alGetSourcei = (alGetSourceiPROC) GetFunctionPointer("alGetSourcei"); + alGetSourcef = (alGetSourcefPROC) GetFunctionPointer("alGetSourcef"); + alGetSource3f = (alGetSource3fPROC) GetFunctionPointer("alGetSource3f"); + alGetSourcefv = (alGetSourcefvPROC) GetFunctionPointer("alGetSourcefv"); + alSourcePlayv = (alSourcePlayvPROC) GetFunctionPointer("alSourcePlayv"); + alSourcePausev = (alSourcePausevPROC) GetFunctionPointer("alSourcePausev"); + alSourceStopv = (alSourceStopvPROC) GetFunctionPointer("alSourceStopv"); + alSourceRewindv = (alSourceRewindvPROC) GetFunctionPointer("alSourceRewindv"); + alSourcePlay = (alSourcePlayPROC) GetFunctionPointer("alSourcePlay"); + alSourcePause = (alSourcePausePROC) GetFunctionPointer("alSourcePause"); + alSourceStop = (alSourceStopPROC) GetFunctionPointer("alSourceStop"); + alSourceRewind = (alSourceRewindPROC) GetFunctionPointer("alSourceRewind"); + alGenBuffers = (alGenBuffersPROC) GetFunctionPointer("alGenBuffers"); + alDeleteBuffers = (alDeleteBuffersPROC) GetFunctionPointer("alDeleteBuffers"); + alIsBuffer = (alIsBufferPROC) GetFunctionPointer("alIsBuffer"); + alBufferData = (alBufferDataPROC) GetFunctionPointer("alBufferData"); + alGetBufferi = (alGetBufferiPROC) GetFunctionPointer("alGetBufferi"); + alGetBufferf = (alGetBufferfPROC) GetFunctionPointer("alGetBufferf"); + alSourceQueueBuffers = (alSourceQueueBuffersPROC) GetFunctionPointer("alSourceQueueBuffers"); + alSourceUnqueueBuffers = (alSourceUnqueueBuffersPROC) GetFunctionPointer("alSourceUnqueueBuffers"); + alDistanceModel = (alDistanceModelPROC) GetFunctionPointer("alDistanceModel"); + alDopplerFactor = (alDopplerFactorPROC) GetFunctionPointer("alDopplerFactor"); + alDopplerVelocity = (alDopplerVelocityPROC) GetFunctionPointer("alDopplerVelocity"); - int result = - alEnable != NULL && - alDisable != NULL && - alIsEnabled != NULL && - //alHint != NULL && - alGetBoolean != NULL && - alGetInteger != NULL && - alGetFloat != NULL && - alGetDouble != NULL && - alGetBooleanv != NULL && - alGetIntegerv != NULL && - alGetFloatv != NULL && - alGetDoublev != NULL && - alGetString != NULL && - alGetError != NULL && - alIsExtensionPresent != NULL && - alGetProcAddress != NULL && - alGetEnumValue != NULL && - alListeneri != NULL && - alListenerf != NULL && - alListener3f != NULL && - alListenerfv != NULL && - alGetListeneri != NULL && - alGetListenerf != NULL && - alGetListener3f != NULL && - alGetListenerfv != NULL && - alGenSources != NULL && - alDeleteSources != NULL && - alIsSource != NULL && - alSourcei != NULL && - alSourcef != NULL && - alSource3f != NULL && - alSourcefv != NULL && - alGetSourcei != NULL && - alGetSourcef != NULL && - alGetSource3f != NULL && - alGetSourcefv != NULL && - alSourcePlayv != NULL && - alSourcePausev != NULL && - alSourceStopv != NULL && - alSourceRewindv != NULL && - alSourcePlay != NULL && - alSourcePause != NULL && - alSourceStop != NULL && - alSourceRewind != NULL && - alGenBuffers != NULL && - alDeleteBuffers != NULL && - alIsBuffer != NULL && - alBufferData != NULL && - alGetBufferi != NULL && - alGetBufferf != NULL && - alSourceQueueBuffers != NULL && - alSourceUnqueueBuffers != NULL && - alDistanceModel != NULL && - alDopplerFactor != NULL && - alDopplerVelocity != NULL; - printf("LoadAL: test 1 result = %i\n",result); - printf("LoadAL: Exit\n"); - return result; + return + alEnable != NULL && + alDisable != NULL && + alIsEnabled != NULL && + //alHint != NULL && + //alGetintean != NULL && + alGetInteger != NULL && + alGetFloat != NULL && + alGetDouble != NULL && + //alGetinteanv != NULL && + alGetIntegerv != NULL && + alGetFloatv != NULL && + alGetDoublev != NULL && + alGetString != NULL && + alGetError != NULL && + alIsExtensionPresent != NULL && + alGetProcAddress != NULL && + alGetEnumValue != NULL && + alListeneri != NULL && + alListenerf != NULL && + alListener3f != NULL && + alListenerfv != NULL && + alGetListeneri != NULL && + alGetListenerf != NULL && + alGetListener3f != NULL && + alGetListenerfv != NULL && + alGenSources != NULL && + alDeleteSources != NULL && + alIsSource != NULL && + alSourcei != NULL && + alSourcef != NULL && + alSource3f != NULL && + alSourcefv != NULL && + alGetSourcei != NULL && + alGetSourcef != NULL && + alGetSource3f != NULL && + alGetSourcefv != NULL && + alSourcePlayv != NULL && + alSourcePausev != NULL && + alSourceStopv != NULL && + alSourceRewindv != NULL && + alSourcePlay != NULL && + alSourcePause != NULL && + alSourceStop != NULL && + alSourceRewind != NULL && + alGenBuffers != NULL && + alDeleteBuffers != NULL && + alIsBuffer != NULL && + alBufferData != NULL && + alGetBufferi != NULL && + alGetBufferf != NULL && + alSourceQueueBuffers != NULL && + alSourceUnqueueBuffers != NULL && + alDistanceModel != NULL && + alDopplerFactor != NULL && + alDopplerVelocity != NULL; } /** @@ -379,45 +406,39 @@ int LoadAL() { * * @return true if all methods were loaded, false if one of the methods could not be loaded */ -int LoadALC() { - printf("LoadALC: Enter\n"); +static int LoadALC() { + alcGetString = (alcGetStringPROC) GetFunctionPointer("alcGetString"); + alcGetIntegerv = (alcGetIntegervPROC) GetFunctionPointer("alcGetIntegerv"); + alcOpenDevice = (alcOpenDevicePROC) GetFunctionPointer("alcOpenDevice"); + alcCloseDevice = (alcCloseDevicePROC) GetFunctionPointer("alcCloseDevice"); + alcCreateContext = (alcCreateContextPROC) GetFunctionPointer("alcCreateContext"); + alcMakeContextCurrent = (alcMakeContextCurrentPROC) GetFunctionPointer("alcMakeContextCurrent"); + alcProcessContext = (alcProcessContextPROC) GetFunctionPointer("alcProcessContext"); + alcGetCurrentContext = (alcGetCurrentContextPROC) GetFunctionPointer("alcGetCurrentContext"); + alcGetContextsDevice = (alcGetContextsDevicePROC) GetFunctionPointer("alcGetContextsDevice"); + alcSuspendContext = (alcSuspendContextPROC) GetFunctionPointer("alcSuspendContext"); + alcDestroyContext = (alcDestroyContextPROC) GetFunctionPointer("alcDestroyContext"); + alcGetError = (alcGetErrorPROC) GetFunctionPointer("alcGetError"); + alcIsExtensionPresent = (alcIsExtensionPresentPROC) GetFunctionPointer("alcIsExtensionPresent"); + alcGetProcAddress = (alcGetProcAddressPROC) GetFunctionPointer("alcGetProcAddress"); + alcGetEnumValue = (alcGetEnumValuePROC) GetFunctionPointer("alcGetEnumValue"); - alcGetString = (alcGetStringPROC) GetFunctionPointer("alcGetString"); - alcGetIntegerv = (alcGetIntegervPROC) GetFunctionPointer("alcGetIntegerv"); - alcOpenDevice = (alcOpenDevicePROC) GetFunctionPointer("alcOpenDevice"); - alcCloseDevice = (alcCloseDevicePROC) GetFunctionPointer("alcCloseDevice"); - alcCreateContext = (alcCreateContextPROC) GetFunctionPointer("alcCreateContext"); - alcMakeContextCurrent = (alcMakeContextCurrentPROC) GetFunctionPointer("alcMakeContextCurrent"); - alcProcessContext = (alcProcessContextPROC) GetFunctionPointer("alcProcessContext"); - alcGetCurrentContext = (alcGetCurrentContextPROC) GetFunctionPointer("alcGetCurrentContext"); - alcGetContextsDevice = (alcGetContextsDevicePROC) GetFunctionPointer("alcGetContextsDevice"); - alcSuspendContext = (alcSuspendContextPROC) GetFunctionPointer("alcSuspendContext"); - alcDestroyContext = (alcDestroyContextPROC) GetFunctionPointer("alcDestroyContext"); - alcGetError = (alcGetErrorPROC) GetFunctionPointer("alcGetError"); - alcIsExtensionPresent = (alcIsExtensionPresentPROC) GetFunctionPointer("alcIsExtensionPresent"); - alcGetProcAddress = (alcGetProcAddressPROC) GetFunctionPointer("alcGetProcAddress"); - alcGetEnumValue = (alcGetEnumValuePROC) GetFunctionPointer("alcGetEnumValue"); - - int result = - alcGetString != NULL && - alcGetIntegerv != NULL && - alcOpenDevice != NULL && - alcCloseDevice != NULL && - alcCreateContext != NULL && - alcMakeContextCurrent != NULL && - alcProcessContext != NULL && - alcGetCurrentContext != NULL && - alcGetContextsDevice != NULL && - alcSuspendContext != NULL && - alcDestroyContext != NULL && - alcGetError != NULL && - alcIsExtensionPresent != NULL && - alcGetProcAddress != NULL && - alcGetEnumValue != NULL; - - printf("LoadALC: test1 result = %i\n",result); - printf("LoadALC: Exit\n"); - return result; + return + alcGetString != NULL && + alcGetIntegerv != NULL && + alcOpenDevice != NULL && + alcCloseDevice != NULL && + alcCreateContext != NULL && + alcMakeContextCurrent != NULL && + alcProcessContext != NULL && + alcGetCurrentContext != NULL && + alcGetContextsDevice != NULL && + alcSuspendContext != NULL && + alcDestroyContext != NULL && + alcGetError != NULL && + alcIsExtensionPresent != NULL && + alcGetProcAddress != NULL && + alcGetEnumValue != NULL; } /** @@ -425,7 +446,6 @@ int LoadALC() { * * @return true if all methods were loaded, false if one of the methods could not be loaded */ -int LoadALExtensions() { - return JNI_TRUE; +static int LoadALExtensions() { + return 1; } - diff --git a/src/native/extal.h b/src/native/extal.h index ae84ac8..361c2d7 100644 --- a/src/native/extal.h +++ b/src/native/extal.h @@ -30,14 +30,26 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef _EXTAL_H -#define _EXTAL_H +#ifndef _AL_TEST_H +#define _AL_TEST_H #ifdef _WIN32 -#include <windows.h> +#include "windows.h" #endif -#include <altypes.h> -#include <alctypes.h> + +#ifdef _X11 +#include "AL/altypes.h" +#include "AL/alctypes.h" +#endif +#ifdef _WIN32 +#include "altypes.h" +#include "alctypes.h" +#endif +#ifdef _AGL +#include "OpenAL/alctypes.h" +#include "OpenAL/altypes.h" +#endif + #include <jni.h> #ifdef __cplusplus @@ -56,10 +68,11 @@ extern "C" { #define ALCAPIENTRY __cdecl #else - #ifdef TARGET_OS_MAC - #if TARGET_OS_MAC + #ifdef _AGL + #if _AGL + typedef struct ALCdevice_struct ALCdevice; + typedef struct ALCcontext_struct ALCcontext; - #pragma export on #endif #endif #define ALCAPI @@ -109,31 +122,12 @@ typedef void ALCvoid; #define ALAPIENTRY __cdecl #define AL_CALLBACK #else - #ifdef TARGET_OS_MAC - #if TARGET_OS_MAC - #pragma export on - #endif - #endif #define ALAPI #define ALAPIENTRY #define AL_CALLBACK #endif -#define INITGUID -#define OPENAL #ifdef _WIN32 -/* -* EAX 2.0 listener property set {0306A6A8-B224-11d2-99E5-0000E8D8C722} -*/ -/* -const GUID DSPROPSETID_EAX20_ListenerProperties - = { 0x306a6a8, 0xb224, 0x11d2, { 0x99, 0xe5, 0x0, 0x0, 0xe8, 0xd8, 0xc7, 0x22 } }; - -const GUID DSPROPSETID_EAX20_BufferProperties - = { 0x306a6a7, 0xb224, 0x11d2, {0x99, 0xe5, 0x0, 0x0, 0xe8, 0xd8, 0xc7, 0x22 } }; -*/ -#endif -/* DEFINE_GUID(DSPROPSETID_EAX20_ListenerProperties, 0x306a6a8, 0xb224, @@ -144,11 +138,14 @@ DEFINE_GUID(DSPROPSETID_EAX20_BufferProperties, 0x306a6a7, 0xb224, 0x11d2, - 0x99, 0xe5, 0x0, 0x0, 0xe8, 0xd8, 0xc7, 0x22); -*/ -void DeInitializeOpenAL(); + 0x99, 0xe5, 0x0, 0x0, 0xe8, 0xd8, 0xc7, 0x22); +#endif -int InitializeOpenAL(JNIEnv *env, jobjectArray oalPaths); +#define INITGUID +#define OPENAL + +void InitializeOpenAL(JNIEnv *env, jobjectArray oalPaths); +void DeInitializeOpenAL(); //alc typedef ALCubyte* (ALCAPIENTRY *alcGetStringPROC)(ALCdevice *device,ALCenum param); @@ -313,3 +310,4 @@ extern EAXGet eaxGet; #endif #endif + diff --git a/unit_tests/src/OpenALTest.java b/unit_tests/src/OpenALTest.java index a64653d..37a982d 100644 --- a/unit_tests/src/OpenALTest.java +++ b/unit_tests/src/OpenALTest.java @@ -35,6 +35,7 @@ import java.nio.IntBuffer; import net.java.games.joal.AL; import net.java.games.joal.ALC; import net.java.games.joal.ALFactory; +import net.java.games.joal.OpenALException; import net.java.games.joal.eax.EAX; import net.java.games.joal.eax.EAXFactory; import net.java.games.joal.util.BufferUtils; @@ -47,79 +48,83 @@ import net.java.games.joal.util.WAVLoader; */ public class OpenALTest { public static void main(String[] args) { - ALFactory.initialize(); - - ALC alc = ALFactory.getALC(); - ALC.Device device = alc.alcOpenDevice("DirectSound3D"); - ALC.Context context = alc.alcCreateContext(device, null); - alc.alcMakeContextCurrent(context); - AL al = ALFactory.getAL(); - boolean eaxPresent = al.alIsExtensionPresent("EAX2.0"); - System.out.println("EAX present:" + eaxPresent); - EAX eax = EAXFactory.getEAX(); - - try { - int[] buffers = new int[1]; - al.alGenBuffers(1, buffers); - - WAVData wd = WAVLoader.loadFromFile("lewiscarroll.wav"); - al.alBufferData(buffers[0], wd.format, wd.data, wd.size, wd.freq); - - int[] sources = new int[1]; - al.alGenSources(1, sources); - al.alSourcei(sources[0], AL.AL_BUFFER, buffers[0]); - System.out.println( - "Looping 1: " - + (al.alGetSourcei(sources[0], AL.AL_LOOPING) == AL.AL_TRUE)); - int[] loopArray = new int[1]; - al.alGetSourcei(sources[0], AL.AL_LOOPING, loopArray); - System.out.println("Looping 2: " + (loopArray[0] == AL.AL_TRUE)); - int[] loopBuffer = new int[1]; - al.alGetSourcei(sources[0], AL.AL_LOOPING, loopBuffer); - System.out.println("Looping 3: " + (loopBuffer[0] == AL.AL_TRUE)); - - if (eaxPresent) { - IntBuffer env = BufferUtils.newIntBuffer(1); - env.put(EAX.EAX_ENVIRONMENT_BATHROOM); - eax.setListenerProperty( - EAX.DSPROPERTY_EAXLISTENER_ENVIRONMENT, - env); - } - - al.alSourcePlay(sources[0]); - - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - } - - al.alSource3f(sources[0], AL.AL_POSITION, 2f, 2f, 2f); - - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - } - - al.alListener3f(AL.AL_POSITION, 3f, 3f, 3f); - - try { - Thread.sleep(5000); - } catch (InterruptedException e) { - } - - al.alSource3f(sources[0], AL.AL_POSITION, 0, 0, 0); - - try { - Thread.sleep(10000); - } catch (InterruptedException e) { - } - - al.alSourceStop(sources[0]); - al.alDeleteSources(1, sources); - alc.alcDestroyContext(context); - alc.alcCloseDevice(device); - } catch (Exception e) { - e.printStackTrace(); - } + try { + ALFactory.initialize(); + + ALC alc = ALFactory.getALC(); + ALC.Device device = alc.alcOpenDevice("DirectSound3D"); + ALC.Context context = alc.alcCreateContext(device, null); + alc.alcMakeContextCurrent(context); + AL al = ALFactory.getAL(); + boolean eaxPresent = al.alIsExtensionPresent("EAX2.0"); + System.out.println("EAX present:" + eaxPresent); + EAX eax = EAXFactory.getEAX(); + + try { + int[] buffers = new int[1]; + al.alGenBuffers(1, buffers); + + WAVData wd = WAVLoader.loadFromFile("lewiscarroll.wav"); + al.alBufferData(buffers[0], wd.format, wd.data, wd.size, wd.freq); + + int[] sources = new int[1]; + al.alGenSources(1, sources); + al.alSourcei(sources[0], AL.AL_BUFFER, buffers[0]); + System.out.println( + "Looping 1: " + + (al.alGetSourcei(sources[0], AL.AL_LOOPING) == AL.AL_TRUE)); + int[] loopArray = new int[1]; + al.alGetSourcei(sources[0], AL.AL_LOOPING, loopArray); + System.out.println("Looping 2: " + (loopArray[0] == AL.AL_TRUE)); + int[] loopBuffer = new int[1]; + al.alGetSourcei(sources[0], AL.AL_LOOPING, loopBuffer); + System.out.println("Looping 3: " + (loopBuffer[0] == AL.AL_TRUE)); + + if (eaxPresent) { + IntBuffer env = BufferUtils.newIntBuffer(1); + env.put(EAX.EAX_ENVIRONMENT_BATHROOM); + eax.setListenerProperty( + EAX.DSPROPERTY_EAXLISTENER_ENVIRONMENT, + env); + } + + al.alSourcePlay(sources[0]); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + + al.alSource3f(sources[0], AL.AL_POSITION, 2f, 2f, 2f); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + + al.alListener3f(AL.AL_POSITION, 3f, 3f, 3f); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + + al.alSource3f(sources[0], AL.AL_POSITION, 0, 0, 0); + + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + } + + al.alSourceStop(sources[0]); + al.alDeleteSources(1, sources); + alc.alcDestroyContext(context); + alc.alcCloseDevice(device); + } catch (Exception e) { + e.printStackTrace(); + } + } catch (OpenALException e) { + e.printStackTrace(); + } } } diff --git a/unit_tests/src/Sound3DTest.java b/unit_tests/src/Sound3DTest.java index df697e0..7adbc50 100644 --- a/unit_tests/src/Sound3DTest.java +++ b/unit_tests/src/Sound3DTest.java @@ -38,6 +38,7 @@ import net.java.games.sound3d.AudioSystem3D; import net.java.games.sound3d.Context; import net.java.games.sound3d.Device; import net.java.games.sound3d.Listener; +import net.java.games.sound3d.Sound3DException; import net.java.games.sound3d.Source; /** @@ -53,7 +54,12 @@ public class Sound3DTest { } public static void main(String[] args) { - AudioSystem3D.init(); + try { + AudioSystem3D.init(); + } catch (Sound3DException e) { + e.printStackTrace(); + return; + } // create the initial context - this can be collapsed into the init. Device device = AudioSystem3D.openDevice("DirectSound3D"); diff --git a/unit_tests/src/net/java/games/joal/ALTest.java b/unit_tests/src/net/java/games/joal/ALTest.java index a30068c..51bdf87 100644 --- a/unit_tests/src/net/java/games/joal/ALTest.java +++ b/unit_tests/src/net/java/games/joal/ALTest.java @@ -36,12 +36,16 @@ public class ALTest extends TestCase { } public void setUp() { - ALFactory.initialize(); - al = ALFactory.getAL(); - alc = ALFactory.getALC(); - device = alc.alcOpenDevice("DirectSound3D"); - context = alc.alcCreateContext(device, null); - alc.alcMakeContextCurrent(context); + try { + ALFactory.initialize(); + al = ALFactory.getAL(); + alc = ALFactory.getALC(); + device = alc.alcOpenDevice("DirectSound3D"); + context = alc.alcCreateContext(device, null); + alc.alcMakeContextCurrent(context); + } catch (OpenALException e) { + e.printStackTrace(); + } } public void tearDown() { |