From: Brian M. <ma...@us...> - 2004-05-31 12:42:28
|
Update of /cvsroot/java-game-lib/LWJGL/src/native/common/fmod In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv25368/native/common/fmod Modified Files: extfmod.cpp extfmod.h org_lwjgl_fmod_FMOD.cpp org_lwjgl_fmod_FMusic.cpp Log Message: FMusic done, including callbacks! Added synctest to fmod, showing how to use FMusic Index: extfmod.h =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/common/fmod/extfmod.h,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- extfmod.h 23 May 2004 19:45:00 -0000 1.2 +++ extfmod.h 31 May 2004 12:42:09 -0000 1.3 @@ -34,14 +34,30 @@ #define _EXT_FMOD_H #include <jni.h> -#include "common_tools.h" +#include "../common_tools.h" #include "fmoddyn.h" #include "fmod_errors.h" +void fmod_create(JNIEnv *env, char*); +void fmod_destroy(); + extern FMOD_INSTANCE * fmod_instance; -void fmod_create(char*); -void fmod_destroy(); +// Setup for callback. The callbacks don't have access to a JNIEnv pointer, so we have to provide +// one. Unfortunately we cannot cache one, since JNIEnv er thread local copies. We can however +// aquire one, using AttachCurrent<ThreadAsDaemon>. However we need a VM instance for that. +// so we supply 1 VM instance for use by threads (in common_tools) (VM instances are shared across threads), and +// 1 JNIEnv pointer per thread. At this time, 2 threads have been identified - the Stream thread +// and the mixer thread. +extern JNIEnv *mixer_jnienv; +extern JNIEnv *stream_jnienv; + +// FMusic cached fields +extern jmethodID music_instcallback; +extern jmethodID music_ordercallback; +extern jmethodID music_rowcallback; +extern jmethodID music_zxxcallback; +extern jclass fmusic; #endif Index: extfmod.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/common/fmod/extfmod.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -u -d -r1.3 -r1.4 --- extfmod.cpp 23 May 2004 19:45:00 -0000 1.3 +++ extfmod.cpp 31 May 2004 12:42:09 -0000 1.4 @@ -41,6 +41,17 @@ /** Instance of fmod */ FMOD_INSTANCE * fmod_instance = NULL; +// jnienvs +JNIEnv *mixer_jnienv; +JNIEnv *stream_jnienv; + +// FMusic cached fields +jmethodID music_instcallback; +jmethodID music_ordercallback; +jmethodID music_rowcallback; +jmethodID music_zxxcallback; +jclass fmusic; + #ifdef _WIN32 /** * DLL entry point for Windows. Called when Java loads the .dll @@ -55,8 +66,16 @@ * * @param path path to try to load dll */ -void fmod_create(char* path) { +void fmod_create(JNIEnv *env, char* path) { fmod_instance = FMOD_CreateInstance(path); + + if (fmod_instance != NULL) { + fmusic = env->FindClass("org/lwjgl/fmod/FMusic"); + music_instcallback = env->GetStaticMethodID(fmusic, "music_instcallback", "(JI)V"); + music_ordercallback = env->GetStaticMethodID(fmusic, "music_ordercallback", "(JI)V"); + music_rowcallback = env->GetStaticMethodID(fmusic, "music_rowcallback", "(JI)V"); + music_zxxcallback = env->GetStaticMethodID(fmusic, "music_zxxcallback", "(JI)V"); + } } /** Index: org_lwjgl_fmod_FMOD.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/common/fmod/org_lwjgl_fmod_FMOD.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- org_lwjgl_fmod_FMOD.cpp 23 May 2004 19:45:00 -0000 1.2 +++ org_lwjgl_fmod_FMOD.cpp 31 May 2004 12:42:09 -0000 1.3 @@ -55,7 +55,7 @@ jstring path = (jstring) env->GetObjectArrayElement(paths, i); char *path_str = (char *) env->GetStringUTFChars(path, NULL); printfDebug("Trying to load fmod_instance from %s\n", path_str); - fmod_create(path_str); + fmod_create(env, path_str); env->ReleaseStringUTFChars(path, path_str); if(fmod_instance != NULL) { Index: org_lwjgl_fmod_FMusic.cpp =================================================================== RCS file: /cvsroot/java-game-lib/LWJGL/src/native/common/fmod/org_lwjgl_fmod_FMusic.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- org_lwjgl_fmod_FMusic.cpp 23 May 2004 19:45:00 -0000 1.2 +++ org_lwjgl_fmod_FMusic.cpp 31 May 2004 12:42:09 -0000 1.3 @@ -33,6 +33,12 @@ #include "org_lwjgl_fmod_FMusic.h" #include "extfmod.h" +// callback +void F_CALLBACKAPI fmusic_instcallback(FMUSIC_MODULE *mod, unsigned char param); +void F_CALLBACKAPI fmusic_ordercallback(FMUSIC_MODULE *mod, unsigned char param); +void F_CALLBACKAPI fmusic_rowcallback(FMUSIC_MODULE *mod, unsigned char param); +void F_CALLBACKAPI fmusic_zxxcallback(FMUSIC_MODULE *mod, unsigned char param); + /* * Class: org_lwjgl_fmod_FMusic * Method: nFMUSIC_LoadSong @@ -130,32 +136,26 @@ * Method: nFMUSIC_SetZxxCallback * Signature: (JLorg/lwjgl/fmod_instance/FMusicCallback;)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod_FMusic_nFMUSIC_1SetZxxCallback - (JNIEnv *env, jclass clazz, jlong, jobject){ - throwFMODException(env, "missing implementation"); - return false; - } +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod_FMusic_nFMUSIC_1SetZxxCallback(JNIEnv *env, jclass clazz, jlong module){ + return fmod_instance->FMUSIC_SetZxxCallback((FMUSIC_MODULE*)module, fmusic_zxxcallback); +} /* * Class: org_lwjgl_fmod_FMusic * Method: nFMUSIC_SetRowCallback * Signature: (JLorg/lwjgl/fmod_instance/FMusicCallback;I)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod_FMusic_nFMUSIC_1SetRowCallback - (JNIEnv *env, jclass clazz, jlong, jobject, jint){ - throwFMODException(env, "missing implementation"); - return false; - } +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod_FMusic_nFMUSIC_1SetRowCallback(JNIEnv *env, jclass clazz, jlong module, jint row) { + return fmod_instance->FMUSIC_SetRowCallback((FMUSIC_MODULE*)module, fmusic_rowcallback, row); +} /* * Class: org_lwjgl_fmod_FMusic * Method: nFMUSIC_SetOrderCallback * Signature: (JLorg/lwjgl/fmod_instance/FMusicCallback;I)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod_FMusic_nFMUSIC_1SetOrderCallback - (JNIEnv *env, jclass clazz, jlong, jobject, jint){ - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod_FMusic_nFMUSIC_1SetOrderCallback(JNIEnv *env, jclass clazz, jlong module, jint order) { + return fmod_instance->FMUSIC_SetOrderCallback((FMUSIC_MODULE*)module, fmusic_ordercallback, order); } /* @@ -163,11 +163,9 @@ * Method: nFMUSIC_SetInstCallback * Signature: (JLorg/lwjgl/fmod_instance/FMusicCallback;I)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod_FMusic_nFMUSIC_1SetInstCallback - (JNIEnv *env, jclass clazz, jlong, jobject, jint){ - throwFMODException(env, "missing implementation"); - return false; - } +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod_FMusic_nFMUSIC_1SetInstCallback(JNIEnv *env, jclass clazz, jlong module, jint inst){ + return fmod_instance->FMUSIC_SetInstCallback((FMUSIC_MODULE*)module, fmusic_instcallback, inst); +} /* * Class: org_lwjgl_fmod_FMusic @@ -184,11 +182,10 @@ * Method: nFMUSIC_SetUserData * Signature: (JLjava/nio/ByteBuffer;I)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod_FMusic_nFMUSIC_1SetUserData - (JNIEnv *env, jclass clazz, jlong module, jobject data, jint offset){ - throwFMODException(env, "missing implementation"); - return false; - } +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod_FMusic_nFMUSIC_1SetUserData(JNIEnv *env, jclass clazz, jlong module, jobject data, jint offset) { + void *userdata = offset + (char*) env->GetDirectBufferAddress(data); + return fmod_instance->FMUSIC_SetUserData((FMUSIC_MODULE *) module, userdata); +} /* * Class: org_lwjgl_fmod_FMusic @@ -486,8 +483,54 @@ * Method: nFMUSIC_GetUserData * Signature: (J)Ljava/nio/ByteBuffer; */ -JNIEXPORT jobject JNICALL Java_org_lwjgl_fmod_FMusic_nFMUSIC_1GetUserData - (JNIEnv *env, jclass clazz, jlong module) { - throwFMODException(env, "missing implementation"); - return NULL; - } +JNIEXPORT jobject JNICALL Java_org_lwjgl_fmod_FMusic_nFMUSIC_1GetUserData(JNIEnv *env, jclass clazz, jlong module, jint capacity) { + void* data = (void*) fmod_instance->FMUSIC_GetUserData((FMUSIC_MODULE *) module); + return env->NewDirectByteBuffer(data, capacity); +} + +/** + * This attaches the mixer thread as a daemon thread, and sets its + * priority to max value + */ +void attachMixerThread() { + jvm->AttachCurrentThreadAsDaemon((void**) &mixer_jnienv, NULL); + + // set to high priority + // ============================== + // get current thread + jclass threadClass = mixer_jnienv->FindClass("java/lang/Thread"); + jmethodID currentThread = mixer_jnienv->GetStaticMethodID(threadClass, "currentThread", "()Ljava/lang/Thread;"); + jobject myThread = mixer_jnienv->CallStaticObjectMethod(threadClass, currentThread); + + // get value of high priority + jfieldID highPriority = mixer_jnienv->GetStaticFieldID(threadClass, "MAX_PRIORITY", "I"); + jint highPriorityValue = mixer_jnienv->GetStaticIntField(threadClass, highPriority); + + // call set priority + jmethodID priority = mixer_jnienv->GetMethodID(threadClass, "setPriority", "(I)V"); + mixer_jnienv->CallVoidMethod(myThread, priority, highPriorityValue); + // ------------------------------ +} + +// FMusic callbacks +// ======================================= +void F_CALLBACKAPI fmusic_instcallback(FMUSIC_MODULE *mod, unsigned char param) { + if (mixer_jnienv == NULL) { attachMixerThread(); } + mixer_jnienv->CallStaticVoidMethod(fmusic, music_instcallback, (jlong) mod, (jint) param); +} + +void F_CALLBACKAPI fmusic_ordercallback(FMUSIC_MODULE *mod, unsigned char param) { + if (mixer_jnienv == NULL) { attachMixerThread(); } + mixer_jnienv->CallStaticVoidMethod(fmusic, music_ordercallback, (jlong) mod, (jint) param); +} + +void F_CALLBACKAPI fmusic_rowcallback(FMUSIC_MODULE *mod, unsigned char param) { + if (mixer_jnienv == NULL) { attachMixerThread(); } + mixer_jnienv->CallStaticVoidMethod(fmusic, music_rowcallback, (jlong) mod, (jint) param); +} + +void F_CALLBACKAPI fmusic_zxxcallback(FMUSIC_MODULE *mod, unsigned char param) { + if (mixer_jnienv == NULL) { attachMixerThread(); } + mixer_jnienv->CallStaticVoidMethod(fmusic, music_zxxcallback, (jlong) mod, (jint) param); +} +// ------------------------------------------ \ No newline at end of file |