From aa07f67b6886792dbc59ced5f3b1d2bf7dbeb6fe Mon Sep 17 00:00:00 2001 From: Brian Matzon Date: Wed, 21 Jul 2004 14:48:15 +0000 Subject: [PATCH] implemented more fmod methods --- src/java/org/lwjgl/fmod3/FSound.java | 38 ++-- .../common/fmod3/org_lwjgl_fmod3_FSound.cpp | 176 ++++++++++-------- 2 files changed, 122 insertions(+), 92 deletions(-) diff --git a/src/java/org/lwjgl/fmod3/FSound.java b/src/java/org/lwjgl/fmod3/FSound.java index 9e2dc2c1..56060fa5 100644 --- a/src/java/org/lwjgl/fmod3/FSound.java +++ b/src/java/org/lwjgl/fmod3/FSound.java @@ -469,7 +469,7 @@ public class FSound { * FMOD uses GetForegroundWindow if this function is not called. * @return On success, TRUE is returned. On failure, FALSE is returned. */ - public static native boolean FSOUND_SetHWND(); + //public static native boolean FSOUND_SetHWND(); /** * This sets the maximum allocatable channels on a hardware card. FMOD automatically @@ -673,7 +673,10 @@ public class FSound { * @param currentallocated_maxallocated IntBuffer to store Currently allocated memory at time of call and * Maximum allocated memory since FSOUND_Init or FSOUND_SetMemorySystem */ - public static native void FSOUND_GetMemoryStats(IntBuffer currentallocated_maxallocated); + public static void FSOUND_GetMemoryStats(IntBuffer currentallocated_maxallocated) { + nFSOUND_GetMemoryStats(currentallocated_maxallocated, currentallocated_maxallocated.position()); + } + private static native void nFSOUND_GetMemoryStats(IntBuffer currentallocated_maxallocated, int offset); /** * Returns the number of sound cards or devices enumerated for the current output type. (Direct @@ -689,7 +692,10 @@ public class FSound { * platforms like PS2 and GameCube, this will be the same as num2d and num3d (and not the sum) because 2d and 3d voices share the same pool) * @return On success, TRUE is returned. On failure, FALSE is returned */ - public static native boolean FSOUND_GetNumHWChannels(IntBuffer twoD_threeD_channels_total); + public static boolean FSOUND_GetNumHWChannels(IntBuffer twoD_threeD_channels_total) { + return nFSOUND_GetNumHWChannels(twoD_threeD_channels_total, twoD_threeD_channels_total.position()); + } + private static native boolean nFSOUND_GetNumHWChannels(IntBuffer twoD_threeD_channels_total, int offset); /** * Returns the current id to the output type. @@ -764,15 +770,11 @@ public class FSound { * @param defpri Default priority for this sample * @return On success, a reference to an allocated sample is returned. On failure, NULL is returned */ - public static FSoundSample FSOUND_Sample_Alloc(int index, int length, int mode, int deffreq, int defvol, int defpan, - int defpri) { + public static FSoundSample FSOUND_Sample_Alloc(int index, int length, int mode, int deffreq, int defvol, int defpan, int defpri) { long result = nFSOUND_Sample_Alloc(index, length, mode, deffreq, defvol, defpan, defpri); - if (result != 0) { return new FSoundSample(result); } - return null; + return (result != 0) ? new FSoundSample(result) : null; } - - private static native long nFSOUND_Sample_Alloc(int index, int length, int mode, int deffreq, int defvol, int defpan, - int defpri); + private static native long nFSOUND_Sample_Alloc(int index, int length, int mode, int deffreq, int defvol, int defpan, int defpri); /** * Removes a sample from memory and makes its slot available again @@ -781,7 +783,6 @@ public class FSound { public static void FSOUND_Sample_Free(FSoundSample sample) { nFSOUND_Sample_Free(sample.sampleHandle); } - private static native void nFSOUND_Sample_Free(long sample); /** @@ -796,8 +797,7 @@ public class FSound { */ public static FSoundSample FSOUND_Sample_Get(int sampno) { long result = nFSOUND_Sample_Get(sampno); - if (result != 0) { return new FSoundSample(result); } - return null; + return (result != 0) ? new FSoundSample(result) : null; } private static native long nFSOUND_Sample_Get(int sampno); @@ -988,6 +988,8 @@ public class FSound { /** * Returns a reference to the beginning of the sample data for a sample. * Data written must be signed. + * NOTE: This method creates 2 direct buffers on the native side, that maps to + * the sample data. Calling this method excessively might hurt performance. *

* Remarks * You must always unlock the data again after you have finished with it, using FSOUND_Sample_Unlock. @@ -1003,6 +1005,9 @@ public class FSound { * @return On success, true is is returned. On failure, false is returned. */ public static boolean FSOUND_Sample_Lock(FSoundSample sample, int offset, int length, FSoundSampleLock lock) { + // reset before entering lock + lock.set(null, null, 0, 0); + return nFSOUND_Sample_Lock(sample.sampleHandle, offset, length, lock); } private static native boolean nFSOUND_Sample_Lock(long sample, int offset, int length, FSoundSampleLock lock); @@ -1135,14 +1140,13 @@ public class FSound { * Releases previous sample data lock from FSOUND_Sample_Lock * * @param sample sample definition - * @param offset Offset in BYTES to the position you want to unlock in the sample buffer. * @param lock lock object that contains lock info * @return On success, true is is returned. On failure, false is returned. */ - public static boolean FSOUND_Sample_Unlock(FSoundSample sample, int offset, FSoundSampleLock lock) { - return nFSOUND_Sample_Unlock(sample.sampleHandle, offset, lock); + public static boolean FSOUND_Sample_Unlock(FSoundSample sample, FSoundSampleLock lock) { + return nFSOUND_Sample_Unlock(sample.sampleHandle, lock.getPtr1(), lock.getPtr2(), lock.getLen1(), lock.getLen2()); } - private static native boolean nFSOUND_Sample_Unlock(long sample, int offset, FSoundSampleLock lock); + private static native boolean nFSOUND_Sample_Unlock(long sample, ByteBuffer ptr1, ByteBuffer ptr2, int len1, int len2); /** diff --git a/src/native/common/fmod3/org_lwjgl_fmod3_FSound.cpp b/src/native/common/fmod3/org_lwjgl_fmod3_FSound.cpp index aa77b1e2..8dd372e7 100644 --- a/src/native/common/fmod3/org_lwjgl_fmod3_FSound.cpp +++ b/src/native/common/fmod3/org_lwjgl_fmod3_FSound.cpp @@ -84,10 +84,10 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1SetDriver(JNIEnv * Method: FSOUND_SetHWND * Signature: ()Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1SetHWND(JNIEnv * env, jclass clazz) { - throwFMODException(env, "missing implementation"); - return false; -} +//JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1SetHWND(JNIEnv * env, jclass clazz) { +// throwFMODException(env, "missing implementation"); +// return false; +//} /* * Class: org_lwjgl_fmod3_FSound @@ -239,8 +239,9 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1GetMaxChannels(JNIEnv * Method: FSOUND_GetMemoryStats * Signature: (Ljava/nio/IntBuffer;)V */ -JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1GetMemoryStats(JNIEnv * env, jclass clazz, jobject) { - throwFMODException(env, "missing implementation"); +JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1GetMemoryStats(JNIEnv * env, jclass clazz, jobject buffer, jint offset) { + unsigned int * memory = offset + (unsigned int *) env->GetDirectBufferAddress(buffer); + fmod_instance->FSOUND_GetMemoryStats(&memory[0], &memory[1]); } /* @@ -257,9 +258,9 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1GetNumDrivers(JNIEnv * Method: FSOUND_GetNumHWChannels * Signature: (Ljava/nio/IntBuffer;)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1GetNumHWChannels(JNIEnv * env, jclass clazz, jobject) { - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1GetNumHWChannels(JNIEnv * env, jclass clazz, jobject buffer, jint offset) { + int * memory = offset + (int *) env->GetDirectBufferAddress(buffer); + return fmod_instance->FSOUND_GetNumHWChannels(&memory[0], &memory[1], &memory[2]); } /* @@ -303,9 +304,8 @@ JNIEXPORT jfloat JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1GetVersion(JNIEnv * * Method: nFSOUND_Sample_Alloc * Signature: (IIIIIII)J */ -JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Alloc(JNIEnv * env, jclass clazz, jint, jint, jint, jint, jint, jint, jint) { - throwFMODException(env, "missing implementation"); - return 0; +JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Alloc(JNIEnv * env, jclass clazz, jint index, jint length, jint mode, jint deffreq, jint defvol, jint defpan, jint defpri) { + return (long) fmod_instance->FSOUND_Sample_Alloc(index, length, mode, deffreq, defvol, defpan, defpri); } /* @@ -313,9 +313,8 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Alloc(JNIEn * Method: nFSOUND_Sample_Free * Signature: (J)V */ -JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Free(JNIEnv * env, jclass clazz, jlong) { - //XXX - throwFMODException(env, "missing implementation"); +JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Free(JNIEnv * env, jclass clazz, jlong handle) { + fmod_instance->FSOUND_Sample_Free((FSOUND_SAMPLE*) handle); } /* @@ -332,10 +331,13 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Get(JNIEnv * Method: nFSOUND_Sample_GetDefaults * Signature: (JLjava/nio/IntBuffer;ILjava/nio/IntBuffer;ILjava/nio/IntBuffer;ILjava/nio/IntBuffer;I)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1GetDefaults(JNIEnv * env, jclass clazz, jlong, jobject, jint, jobject, jint, jobject, jint, jobject, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1GetDefaults(JNIEnv * env, jclass clazz, jlong sptr, jobject deffreq, jint deffreqOffset, jobject defvol, jint defvolOffset, jobject defpan, jint defpanOffset, jobject defpri, jint defpriOffset) { + int * nDeffreq = (deffreq != NULL) ? deffreqOffset + (int *) env->GetDirectBufferAddress(deffreq) : NULL; + int * nDefvol = (defvol != NULL) ? defvolOffset + (int *) env->GetDirectBufferAddress(defvol) : NULL; + int * nDefpan = (defpan != NULL) ? defpanOffset + (int *) env->GetDirectBufferAddress(defpan) : NULL; + int * nDefpri = (defpri != NULL) ? defpriOffset + (int *) env->GetDirectBufferAddress(defpri) : NULL; + + return fmod_instance->FSOUND_Sample_GetDefaults((FSOUND_SAMPLE *) sptr, nDeffreq, nDefvol, nDefpan, nDefpri); } /* @@ -343,10 +345,17 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1GetDefau * Method: nFSOUND_Sample_GetDefaultsEx * Signature: (JLjava/nio/IntBuffer;ILjava/nio/IntBuffer;ILjava/nio/IntBuffer;ILjava/nio/IntBuffer;ILjava/nio/IntBuffer;ILjava/nio/IntBuffer;ILjava/nio/IntBuffer;I)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1GetDefaultsEx(JNIEnv * env, jclass clazz, jlong, jobject, jint, jobject, jint, jobject, jint, jobject, jint, jobject, jint, jobject, jint, jobject, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1GetDefaultsEx(JNIEnv * env, jclass clazz, jlong sptr, jobject deffreq, jint deffreqOffset, jobject defvol, jint defvolOffset, jobject defpan, jint defpanOffset, jobject defpri, jint defpriOffset, +jobject varfreq, jint varfreqOffset, jobject varvol, jint varvolOffset, jobject varpan, jint varpanOffset) { + int * nDeffreq = (deffreq != NULL) ? deffreqOffset + (int *) env->GetDirectBufferAddress(deffreq) : NULL; + int * nDefvol = (defvol != NULL) ? defvolOffset + (int *) env->GetDirectBufferAddress(defvol) : NULL; + int * nDefpan = (defpan != NULL) ? defpanOffset + (int *) env->GetDirectBufferAddress(defpan) : NULL; + int * nDefpri = (defpri != NULL) ? defpriOffset + (int *) env->GetDirectBufferAddress(defpri) : NULL; + int * nVarfreq = (varfreq != NULL) ? varfreqOffset + (int *) env->GetDirectBufferAddress(varfreq) : NULL; + int * nVarvol = (varvol != NULL) ? varvolOffset + (int *) env->GetDirectBufferAddress(varvol) : NULL; + int * nVarpan = (varpan != NULL) ? varpanOffset + (int *) env->GetDirectBufferAddress(varpan) : NULL; + + return fmod_instance->FSOUND_Sample_GetDefaultsEx((FSOUND_SAMPLE *) sptr, nDeffreq, nDefvol, nDefpan, nDefpri, nVarfreq, nVarvol, nVarpan); } /* @@ -363,10 +372,10 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1GetLength(JN * Method: nFSOUND_Sample_GetLoopPoints * Signature: (JLjava/nio/IntBuffer;ILjava/nio/IntBuffer;I)I */ -JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1GetLoopPoints(JNIEnv * env, jclass clazz, jlong, jobject, jint, jobject, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return 0; +JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1GetLoopPoints(JNIEnv * env, jclass clazz, jlong sptr, jobject loopstart, jint loopstartOffset, jobject loopend, jint loopendOffset) { + int * nLoopstart = (loopstart != NULL) ? loopstartOffset + (int *) env->GetDirectBufferAddress(loopstart) : NULL; + int * nLoopend = (loopend != NULL) ? loopendOffset + (int *) env->GetDirectBufferAddress(loopend) : NULL; + return fmod_instance->FSOUND_Sample_GetLoopPoints((FSOUND_SAMPLE *) sptr, nLoopstart, nLoopend); } /* @@ -374,10 +383,10 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1GetLoopPoint * Method: nFSOUND_Sample_GetMinMaxDistance * Signature: (JLjava/nio/FloatBuffer;ILjava/nio/FloatBuffer;I)I */ -JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1GetMinMaxDistance(JNIEnv * env, jclass clazz, jlong, jobject, jint, jobject, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return 0; +JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1GetMinMaxDistance(JNIEnv * env, jclass clazz, jlong sptr, jobject min, jint minOffset, jobject max, jint maxOffset) { + float * nMin = (min != NULL) ? minOffset + (float *) env->GetDirectBufferAddress(min) : NULL; + float * nMax = (max != NULL) ? maxOffset + (float *) env->GetDirectBufferAddress(max) : NULL; + return fmod_instance->FSOUND_Sample_GetMinMaxDistance((FSOUND_SAMPLE *) sptr, nMin, nMax); } /* @@ -403,10 +412,9 @@ JNIEXPORT jstring JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1GetName(J * Method: nFSOUND_Sample_Load * Signature: (ILjava/nio/ByteBuffer;IIII)J */ -JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Load__ILjava_nio_ByteBuffer_2IIII(JNIEnv * env, jclass clazz, jint, jobject, jint, jint, jint, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return 0; +JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Load__ILjava_nio_ByteBuffer_2IIII(JNIEnv * env, jclass clazz, jint index, jobject data, jint dataOffset, jint inputmode, jint offset, jint length) { + const char * nData = dataOffset + (const char *) env->GetDirectBufferAddress(data); + return (long) fmod_instance->FSOUND_Sample_Load(index, nData, inputmode, offset, length); } /* @@ -414,9 +422,9 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Load__ILjav * Method: nFSOUND_Sample_Load * Signature: (ILjava/lang/String;III)J */ -JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Load__ILjava_lang_String_2III(JNIEnv * env, jclass clazz, jint, jstring, jint, jint, jint) { - //XX - return 0; +JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Load__ILjava_lang_String_2III(JNIEnv * env, jclass clazz, jint index, jstring name, jint inputmode, jint offset, jint length) { + const char* nName = (const char*) (env->GetStringUTFChars(name, 0)); + return (long) fmod_instance->FSOUND_Sample_Load(index, nName, inputmode, offset, length); } /* @@ -424,10 +432,38 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Load__ILjav * Method: nFSOUND_Sample_Lock * Signature: (JIILorg/lwjgl/fmod_instance/FSoundSampleLock;)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Lock(JNIEnv * env, jclass clazz, jlong, jint, jint, jobject) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Lock(JNIEnv * env, jclass clazz, jlong sptr, jint offset, jint length, jobject sampleLock) { + void * ptr1; + void * ptr2; + unsigned int len1; + unsigned int len2; + signed char result; + result = fmod_instance->FSOUND_Sample_Lock((FSOUND_SAMPLE *) sptr, offset, length, &ptr1, &ptr2, &len1, &len2); + + // if we got true, prime lock + if(result) { + // get class & fields + jclass lock = env->GetObjectClass(sampleLock); + jfieldID objPtr1 = env->GetFieldID(lock, "ptr1", "Ljava/nio/ByteBuffer"); + jfieldID objPtr2 = env->GetFieldID(lock, "ptr2", "Ljava/nio/ByteBuffer"); + jfieldID objLen1 = env->GetFieldID(lock, "len1", "I"); + jfieldID objLen2 = env->GetFieldID(lock, "len2", "I"); + + // set buffers + if(len1 > 0) { + env->SetObjectField(sampleLock, objPtr1, env->NewDirectByteBuffer(ptr1, len1)); + } + + if(len2 > 0) { + env->SetObjectField(sampleLock, objPtr2, env->NewDirectByteBuffer(ptr2, len2)); + } + + // set lengths + env->SetIntField(sampleLock, objLen1, len1); + env->SetIntField(sampleLock, objLen2, len2); + } + + return result; } /* @@ -435,10 +471,8 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Lock(JNI * Method: nFSOUND_Sample_SetDefaults * Signature: (JIIII)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1SetDefaults(JNIEnv * env, jclass clazz, jlong, jint, jint, jint, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1SetDefaults(JNIEnv * env, jclass clazz, jlong sptr, jint deffreq, jint defvol, jint defpan, jint defpri) { + return fmod_instance->FSOUND_Sample_SetDefaults((FSOUND_SAMPLE *) sptr, deffreq, defvol, defpan, defpri); } /* @@ -446,10 +480,8 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1SetDefau * Method: nFSOUND_Sample_SetDefaultsEx * Signature: (JIIIIIII)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1SetDefaultsEx(JNIEnv * env, jclass clazz, jlong, jint, jint, jint, jint, jint, jint, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1SetDefaultsEx(JNIEnv * env, jclass clazz, jlong sptr, jint deffreq, jint defvol, jint defpan, jint defpri, jint varfreq, jint varvol, jint varpan) { + return fmod_instance->FSOUND_Sample_SetDefaultsEx((FSOUND_SAMPLE *) sptr, deffreq, defvol, defpan, defpri, varfreq, varvol, varpan); } /* @@ -493,10 +525,8 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1SetLoopP * Method: nFSOUND_Sample_Unlock * Signature: (JILorg/lwjgl/fmod_instance/FSoundSampleLock;)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Unlock(JNIEnv * env, jclass clazz, jlong, jint, jobject) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Unlock(JNIEnv * env, jclass clazz, jlong sptr, jobject ptr1, jobject ptr2, jint len1, jint len2) { + return fmod_instance->FSOUND_Sample_Unlock((FSOUND_SAMPLE *) sptr, env->GetDirectBufferAddress(ptr1), env->GetDirectBufferAddress(ptr2), len1, len2); } /* @@ -504,10 +534,9 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Unlock(J * Method: nFSOUND_Sample_Upload * Signature: (JLjava/nio/ByteBuffer;II)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Upload(JNIEnv * env, jclass clazz, jlong, jobject, jint, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Sample_1Upload(JNIEnv * env, jclass clazz, jlong sptr, jobject data, jint dataOffset, jint mode) { + void * nData = dataOffset + (char *) env->GetDirectBufferAddress(data); + return fmod_instance->FSOUND_Sample_Upload((FSOUND_SAMPLE *) sptr, nData, mode); } /* @@ -553,7 +582,6 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1SetFrequency(JNIE */ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1SetLevels(JNIEnv * env, jclass clazz, jint, jint, jint, jint, jint, jint, jint) { //XBOX only - //XXX return false; } @@ -661,10 +689,10 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1GetAmplitude(JNIEnv * * Method: nFSOUND_3D_SetAttributes * Signature: (ILjava/nio/FloatBuffer;ILjava/nio/FloatBuffer;I)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_13D_1SetAttributes(JNIEnv * env, jclass clazz, jint, jobject, jint, jobject, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_13D_1SetAttributes(JNIEnv * env, jclass clazz, jint channel, jobject pos, jint posOffset, jobject vel, jint velOffset) { + float* nPos = posOffset + (float *) env->GetDirectBufferAddress(pos); + float* nVel = velOffset + (float *) env->GetDirectBufferAddress(vel); + return fmod_instance->FSOUND_3D_SetAttributes(channel, nPos, nVel); } /* @@ -708,10 +736,9 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1GetCurrentSample(JN * Method: nFSOUND_GetCurrentLevels * Signature: (ILjava/nio/FloatBuffer;I)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1GetCurrentLevels(JNIEnv * env, jclass clazz, jint, jobject, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1GetCurrentLevels(JNIEnv * env, jclass clazz, jint channel , jobject l_rBuffer, jint l_rBufferOffset) { + float* nL_R = l_rBufferOffset + (float *) env->GetDirectBufferAddress(l_rBuffer); + return fmod_instance->FSOUND_GetCurrentLevels(channel, &nL_R[0], &nL_R[1]); } /* @@ -827,10 +854,10 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1IsPlaying(JNIEnv * Method: nFSOUND_3D_GetAttributes * Signature: (ILjava/nio/FloatBuffer;ILjava/nio/FloatBuffer;I)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_13D_1GetAttributes(JNIEnv * env, jclass clazz, jint, jobject, jint, jobject, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_13D_1GetAttributes(JNIEnv * env, jclass clazz, jint channel, jobject pos, jint posOffset, jobject vel, jint velOffset) { + float* nPos = posOffset + (float *) env->GetDirectBufferAddress(pos); + float* nVel = velOffset + (float *) env->GetDirectBufferAddress(vel); + return fmod_instance->FSOUND_3D_GetAttributes(channel, nPos, nVel); } /* @@ -838,10 +865,9 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_13D_1GetAttribute * Method: nFSOUND_3D_GetMinMaxDistance * Signature: (ILjava/nio/FloatBuffer;I)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_13D_1GetMinMaxDistance(JNIEnv * env, jclass clazz, jint, jobject, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_13D_1GetMinMaxDistance(JNIEnv * env, jclass clazz, jint channel, jobject minmax, jint minmaxOffset) { + float* nMinMax = minmaxOffset + (float *) env->GetDirectBufferAddress(minmax); + return fmod_instance->FSOUND_3D_GetMinMaxDistance(channel, &nMinMax[0], &nMinMax[1]); } /*