diff --git a/src/native/win32/org_lwjgl_openal_ALUT.c b/src/native/win32/org_lwjgl_openal_ALUT.c new file mode 100644 index 00000000..db6251b7 --- /dev/null +++ b/src/native/win32/org_lwjgl_openal_ALUT.c @@ -0,0 +1,114 @@ +/** + * $ID$ + * + * This is the actual JNI implementation of the OpenAL utility library. + * It handles whatever is needed for proper OpenAL support via using Java. + * + * @author Brian Matzon + * @version $Revision$ + */ +#include "org_lwjgl_openal_ALUT.h" + +/* OpenAL includes */ +#include + +/** + * This function initializes OpenAL. + * + * C Specification: + * void alutInit(int *argc, char *argv[]); + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_ALUT_alutInit (JNIEnv *env, jobject obj, jobjectArray jargv) { + /* obtain the size the array */ + jsize argc = (*env)->GetArrayLength(env, jargv); + + /* Declare a char array for argv */ + const char* argv[128]; + int i; + + for (i=0;iGetObjectArrayElement(env, jargv, i); + + /* Convert the object just obtained into a String */ + const char *str = (*env)->GetStringUTFChars(env, string, 0); + + /* Build the argv array */ + argv[i] = str; + + /* Free up memory to prevent memory leaks */ + (*env)->ReleaseStringUTFChars(env, string, str); + } + + /* Increment argc to adjust the difference between Java and C arguments */ + argc++; + + /* call the actual implementation */ + alutInit(&((int)argc),(char**) argv); +} +/* + * This function loads a WAV file into memory from a file. + * + * C Specification: + * ALboolean alutLoadWAVFile(const char *fname, ALsizei *format, ALsizei *size, ALsizei *bits, + * ALsizei *freq, ALboolean *loop ); + */ +JNIEXPORT jobject JNICALL Java_org_lwjgl_openal_ALUT_alutLoadWAVFile (JNIEnv *env, jobject obj, jstring file) { + + /* + * NOTE: Since Java doesn't support modification of supplied + * variables (pass by value). We will return a class that + * holds what is needed to unload the file again. + * The data field contains the offset at whcih the data + * segment begins (ie. a pointer). This will *not* work + * on 64 bit platforms, since we use an jint for this. + */ + + /* actual file info object */ + jobject alutLoadWAVFile_object = NULL; + + /* class type to find */ + jclass alutLoadWAVFile_class = NULL; + + /* method id - will be set to constructor of alutLoadWAVFile */ + jmethodID methodID = NULL; + + /* sound data vars */ + jint format, size, freq; + jboolean loop; + void* data; + ALbyte* filename = (ALbyte*) ((*env)->GetStringUTFChars(env, file, 0)); + + /* load wave file */ + alutLoadWAVFile(filename, &format, (void**) &data, &size, &freq, &loop); + + /* get class */ + alutLoadWAVFile_class = (*env)->FindClass(env, "org/lwjgl/openal/ALUTLoadWAVFile"); + + /* get constructor */ + methodID = (*env)->GetMethodID(env, alutLoadWAVFile_class, "", "(IIIIZ)V"); + + /* create object */ + alutLoadWAVFile_object = (*env)->NewObject(env, alutLoadWAVFile_class, methodID, format, (int) data, size, freq, loop); + + return alutLoadWAVFile_object; +} +/** + * This function loads a WAV file into memory from another memory location. + * + * C Specification: + * ALvoid alutLoadWAVMemory(ALbyte *memory,ALenum *format,ALvoid **data,ALsizei + * *size,ALsizei *freq,ALboolean *loop) + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_ALUT_alutUnloadWAV (JNIEnv *env, jobject obj, jint format, jint data, jint size, jint freq) { + alutUnloadWAV(format, (void**) data, size, freq); +} +/** + * This function exits OpenAL. + * + * C Specification: + * void alutExit(ALvoid); + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_ALUT_alutExit (JNIEnv *env, jobject obj) { + alutExit(); +} \ No newline at end of file diff --git a/src/native/win32/org_lwjgl_openal_CoreAL10.c b/src/native/win32/org_lwjgl_openal_CoreAL10.c new file mode 100644 index 00000000..73193639 --- /dev/null +++ b/src/native/win32/org_lwjgl_openal_CoreAL10.c @@ -0,0 +1,119 @@ +/** + * $ID$ + * + * This is the actual JNI implementation of the OpenAL core. It handles + * whatever is needed for proper OpenAL support via using Java. + * + * @author Brian Matzon + * @version $Revision$ + */ +#include "org_lwjgl_openal_CoreAL10.h" + +/* OpenAL includes */ +#include + +/** + * This function returns the current error state and then clears the error state. + * + * C Specification: + * ALenum alGetError(ALvoid); + */ +JNIEXPORT jint JNICALL Java_org_lwjgl_openal_CoreAL10_alGetError (JNIEnv *env, jobject obj) { + return alGetError(); +} +/** + * This function retrieves an OpenAL string property. + * + * C Specification: + * ALubyte * alGetString(ALenum pname); + */ +JNIEXPORT jstring JNICALL Java_org_lwjgl_openal_CoreAL10_alGetString (JNIEnv *env, jobject obj, jint param) { + return (*env)->NewStringUTF(env, alGetString(param)); +} + +/** + * This function generates one or more buffers. + * + * C Specification: + * ALvoid alGenBuffers(ALsizei n,ALuint *buffers); + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_CoreAL10_alGenBuffers (JNIEnv *env, jobject obj, jint n, jintArray buffers) { + int* array = (*env)->GetIntArrayElements(env, buffers, 0); + alGenBuffers(n, array); + (*env)->ReleaseIntArrayElements(env, buffers, array, 0); +} +/** + * This function generates one or more sources. + * + * C Specification: + * ALvoid alGenSources(ALsizei n,ALuint *sources); + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_CoreAL10_alGenSources (JNIEnv *env, jobject obj, jint n, jintArray sources) { + int* array = (*env)->GetIntArrayElements(env, sources, 0); + alGenSources(n, array); + (*env)->ReleaseIntArrayElements(env, sources, array, 0); +} + +/** + * This function fills a buffer with audio data. + * + * C Specification: + * ALvoid alBufferData(ALuint buffer,ALenum format,ALvoid *data,ALsizei size,ALsizei freq); + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_CoreAL10_alBufferData (JNIEnv *env, jobject obj, jint buffer, jint format, jint data, jint size, jint freq) { + alBufferData(buffer, format, (void**) data, size, freq); +} + +/** + * This function sets an integer property of a source. + * + * C Specification: + * ALvoid alSourcei(ALuint source,ALenum pname,ALint value); + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_CoreAL10_alSourcei (JNIEnv *env, jobject obj, jint source, jint param, jint value) { + alSourcei(source, param, value); +} + +/** + * This function plays a source. + * + * C Specification: + * ALvoid alSourcePlay(ALuint source); + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_CoreAL10_alSourcePlay (JNIEnv *env, jobject obj, jint source) { + alSourcePlay(source); +} + +/** + * This function stops a source. + * + * C Specification: + * ALvoid alSourceStop(ALuint source); + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_CoreAL10_alSourceStop (JNIEnv *env, jobject obj, jint source) { + alSourceStop(source); +} + +/** + * This function deletes one or more sources. + * + * C Specification: + * ALvoid alDeleteSources(ALsizei n,ALuint *sources); + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_CoreAL10_alDeleteSources (JNIEnv *env, jobject obj, jint n, jintArray source) { + int* array = (*env)->GetIntArrayElements(env, source, 0); + alDeleteSources(n, array); + (*env)->ReleaseIntArrayElements(env, source, array, 0); +} + +/** + * This function deletes one or more buffers. + * + * C Specification: + * ALvoid alDeleteBuffers(ALsizei n,ALuint *buffers); + */ +JNIEXPORT void JNICALL Java_org_lwjgl_openal_CoreAL10_alDeleteBuffers (JNIEnv *env, jobject obj, jint n, jintArray buffer) { + int* array = (*env)->GetIntArrayElements(env, buffer, 0); + alDeleteBuffers(n, array); + (*env)->ReleaseIntArrayElements(env, buffer, array, 0); +} \ No newline at end of file