diff --git a/src/java/org/lwjgl/fmod3/FSound.java b/src/java/org/lwjgl/fmod3/FSound.java index 56060fa5..60262f4a 100644 --- a/src/java/org/lwjgl/fmod3/FSound.java +++ b/src/java/org/lwjgl/fmod3/FSound.java @@ -36,6 +36,7 @@ import java.nio.FloatBuffer; import java.nio.IntBuffer; import java.util.ArrayList; +import org.lwjgl.BufferUtils; import org.lwjgl.fmod3.callbacks.FSoundCloseCallback; import org.lwjgl.fmod3.callbacks.FSoundDSPCallback; import org.lwjgl.fmod3.callbacks.FSoundMetaDataCallback; @@ -1275,7 +1276,7 @@ public class FSound { public static int nFSOUND_PlaySoundEx(int channel, FSoundSample sample, FSoundDSPUnit dspunit, boolean startpaused) { return nFSOUND_PlaySoundEx(channel, sample.sampleHandle, dspunit.dspHandle, startpaused); } - private static native int nFSOUND_PlaySoundEx(int channel, long sample, long dspunit, boolean startpaused); + private static native int nFSOUND_PlaySoundEx(int channel, long sample, ByteBuffer dspunit, boolean startpaused); /** * Stops a specified sound channel from playing, and frees it up for re-use @@ -2111,13 +2112,13 @@ public class FSound { * @return On success, a sync point handle is returned. On failure, NULL is returned. */ public static FSoundSyncPoint FSOUND_Stream_AddSyncPoint(FSoundStream stream, int pcmoffset, String name) { - long result = nFSOUND_Stream_AddSyncPoint(stream.streamHandle, pcmoffset, name); - if(result != 0) { + ByteBuffer result = nFSOUND_Stream_AddSyncPoint(stream.streamHandle, pcmoffset, name); + if(result != null) { return new FSoundSyncPoint(result); } return null; } - private static native long nFSOUND_Stream_AddSyncPoint(long streamhandle, int pcmoffset, String name); + private static native ByteBuffer nFSOUND_Stream_AddSyncPoint(long streamhandle, int pcmoffset, String name); /** * Creates a user definable stream file ready for playing. The stream is serviced through a callback @@ -2158,15 +2159,18 @@ public class FSound { * @return On success, a handle to the FSoundDSPUnit is returned. All DSP functions are performable on this. On failure, null is returned */ public static FSoundDSPUnit FSOUND_Stream_CreateDSP(FSoundStream stream, FSoundDSPCallback callback, int priority) { + ByteBuffer dspID = (ByteBuffer) BufferUtils.createByteBuffer(8).putLong(FSoundDSPUnit.getNextId()).flip(); FSoundDSPUnit unit = null; - long result = nFSOUND_Stream_CreateDSP(stream.streamHandle, priority); - if(result != 0) { - unit = new FSoundDSPUnit(result); - FMOD.registerCallback(FMOD.FSOUND_DSPCALLBACK, unit.dspHandle, unit, callback); + + ByteBuffer dspHandle = nFSOUND_Stream_CreateDSP(stream.streamHandle, priority, dspID); + + if(dspHandle != null) { + unit = new FSoundDSPUnit(dspHandle, dspID); + FMOD.registerCallback(FMOD.FSOUND_DSPCALLBACK, dspID.getLong(0), unit, callback); } return unit; } - private static native long nFSOUND_Stream_CreateDSP(long streamHandle, int priority); + private static native ByteBuffer nFSOUND_Stream_CreateDSP(long streamHandle, int priority, ByteBuffer dspID); /** * Removes a user synchronization callback point from a stream. @@ -2177,7 +2181,7 @@ public class FSound { public static boolean FSOUND_Stream_DeleteSyncPoint(FSoundSyncPoint point) { return nFSOUND_Stream_DeleteSyncPoint(point.syncpointHandle); } - private static native boolean nFSOUND_Stream_DeleteSyncPoint(long syncpointHandle); + private static native boolean nFSOUND_Stream_DeleteSyncPoint(ByteBuffer syncpointHandle); /** * Find a tag field associated with an open stream by name and type @@ -2322,13 +2326,13 @@ public class FSound { * @return On success, a handle to a sync point is returned. On failure, NULL is returned. */ public static FSoundSyncPoint FSOUND_Stream_GetSyncPoint(FSoundStream stream, int index) { - long result = nFSOUND_Stream_GetSyncPoint(stream.streamHandle, index); - if(result != 0) { + ByteBuffer result = nFSOUND_Stream_GetSyncPoint(stream.streamHandle, index); + if(result != null) { return new FSoundSyncPoint(result); } return null; } - private static native long nFSOUND_Stream_GetSyncPoint(long streamHandle, int index); + private static native ByteBuffer nFSOUND_Stream_GetSyncPoint(long streamHandle, int index); /** * Retrieves the name and pcm offset in samples for a specified sync point @@ -2342,7 +2346,7 @@ public class FSound { public static String FSOUND_Stream_GetSyncPointInfo(FSoundSyncPoint point, IntBuffer pcmoffset) { return nFSOUND_Stream_GetSyncPointInfo(point.syncpointHandle, pcmoffset, (pcmoffset != null) ? pcmoffset.position() : 0); } - private static native String nFSOUND_Stream_GetSyncPointInfo(long pointHandle, IntBuffer pcmoffset, int bufferOffset); + private static native String nFSOUND_Stream_GetSyncPointInfo(ByteBuffer pointHandle, IntBuffer pcmoffset, int bufferOffset); /** * Get a tag field associated with an open stream @@ -2496,7 +2500,7 @@ public class FSound { public static int FSOUND_Stream_PlayEx(int channel, FSoundStream stream, FSoundDSPUnit dspunit, boolean paused) { return nFSOUND_Stream_PlayEx(channel, stream.streamHandle, dspunit.dspHandle, paused); } - private static native int nFSOUND_Stream_PlayEx(int channel, long stream, long dspunit, boolean paused); + private static native int nFSOUND_Stream_PlayEx(int channel, long stream, ByteBuffer dspunit, boolean paused); /** * Sets the internal file buffersize for audio streaming of data for the NEXT stream opened with FSOUND_Stream_Open. @@ -2916,15 +2920,16 @@ public class FSound { * @return On success, a new valid DSP unit is returned. On failure, NULL is returned. */ public static FSoundDSPUnit FSOUND_DSP_Create(FSoundDSPCallback callbackHandler, int priority) { - FSoundDSPUnit dspUnit = null; - long unit = nFSOUND_DSP_Create(priority); - if(unit != 0) { - dspUnit= new FSoundDSPUnit(unit); - FMOD.registerCallback(FMOD.FSOUND_DSPCALLBACK, dspUnit.dspHandle, dspUnit, callbackHandler); + FSoundDSPUnit dspUnit = null; + ByteBuffer handle = nFSOUND_DSP_Create(priority); + if(handle != null) { + ByteBuffer dspID = (ByteBuffer) BufferUtils.createByteBuffer(8).putLong(FSoundDSPUnit.getNextId()).flip(); + dspUnit= new FSoundDSPUnit(handle, dspID); + FMOD.registerCallback(FMOD.FSOUND_DSPCALLBACK, dspID.getLong(0), dspUnit, callbackHandler); } return dspUnit; } - private static native long nFSOUND_DSP_Create(int priority); + private static native ByteBuffer nFSOUND_DSP_Create(int priority); /** * Frees and removes a DSP unit from the DSP chain @@ -2933,9 +2938,9 @@ public class FSound { */ public static void FSOUND_DSP_Free(FSoundDSPUnit unit) { nFSOUND_DSP_Free(unit.dspHandle); - FMOD.registerCallback(FMOD.FSOUND_DSPCALLBACK, unit.dspHandle, unit, null); + FMOD.registerCallback(FMOD.FSOUND_DSPCALLBACK, unit.dspTrackingID.get(0), unit, null); } - private static native void nFSOUND_DSP_Free(long dspUnitHandle); + private static native void nFSOUND_DSP_Free(ByteBuffer dspUnitHandle); /** * Allows the user to toggle a DSP unit on or off @@ -2949,7 +2954,7 @@ public class FSound { public static void FSOUND_DSP_SetActive(FSoundDSPUnit unit, boolean active) { nFSOUND_DSP_SetActive(unit.dspHandle, active); } - private static native void nFSOUND_DSP_SetActive(long dspUnitHandle, boolean active); + private static native void nFSOUND_DSP_SetActive(ByteBuffer dspUnitHandle, boolean active); /** * Returns if a DSP unit is active or not @@ -2963,7 +2968,7 @@ public class FSound { public static boolean FSOUND_DSP_GetActive(FSoundDSPUnit unit) { return nFSOUND_DSP_GetActive(unit.dspHandle); } - private static native boolean nFSOUND_DSP_GetActive(long dspUnitHandle); + private static native boolean nFSOUND_DSP_GetActive(ByteBuffer dspUnitHandle); /** * Returns the buffer lenth passed by the DSP system to DSP unit callbacks, so you can allocate memory etc @@ -3004,7 +3009,7 @@ public class FSound { public static void FSOUND_DSP_GetActive(FSoundDSPUnit unit, int priority) { nFSOUND_DSP_SetPriority(unit.dspHandle, priority); } - private static native void nFSOUND_DSP_SetPriority(long dspUnitHandle, int priority); + private static native void nFSOUND_DSP_SetPriority(ByteBuffer dspUnitHandle, int priority); /** * Returns the priority status in the DSP chain, of a specified unit. @@ -3019,7 +3024,7 @@ public class FSound { public static int FSOUND_DSP_GetPriority(FSoundDSPUnit unit) { return nFSOUND_DSP_GetPriority(unit.dspHandle); } - private static native int nFSOUND_DSP_GetPriority(long dspUnitHandle); + private static native int nFSOUND_DSP_GetPriority(ByteBuffer dspUnitHandle); /** * Returns a reference to FSOUND's system DSP clear unit @@ -3035,7 +3040,7 @@ public class FSound { } return FMOD.fmodClearUnit; } - private static native long nFSOUND_DSP_GetClearUnit(); + private static native ByteBuffer nFSOUND_DSP_GetClearUnit(); /** * Returns a reference to FSOUND's system Clip and Copy DSP unit @@ -3051,7 +3056,7 @@ public class FSound { } return FMOD.fmodClipAndCopyUnit; } - private static native long nFSOUND_DSP_GetClipAndCopyUnit(); + private static native ByteBuffer nFSOUND_DSP_GetClipAndCopyUnit(); /** * Returns a reference to FSOUND's system DSP Music mixer unit @@ -3067,7 +3072,7 @@ public class FSound { } return FMOD.fmodMusicUnit; } - private static native long nFSOUND_DSP_GetMusicUnit(); + private static native ByteBuffer nFSOUND_DSP_GetMusicUnit(); /** * Returns a reference to FSOUND's system DSP SFX mixer unit @@ -3083,7 +3088,7 @@ public class FSound { } return FMOD.fmodSFXUnit; } - private static native long nFSOUND_DSP_GetSFXUnit(); + private static native ByteBuffer nFSOUND_DSP_GetSFXUnit(); /** * Returns a reference to FSOUND's system DSP FFT processing unit @@ -3100,7 +3105,7 @@ public class FSound { } return FMOD.fmodFFTUnit; } - private static native long nFSOUND_DSP_GetFFTUnit(); + private static native ByteBuffer nFSOUND_DSP_GetFFTUnit(); /** * Function to return a FloatBuffer to the current spectrum buffer. The buffer contains 512 floating @@ -3547,14 +3552,12 @@ public class FSound { * @param handle Handle to native object being monitored * @param param parameter passed to callback */ - private static void dsp_callback(long dspHandle, ByteBuffer originalbuffer, ByteBuffer newbuffer, int length) { + private static ByteBuffer dsp_callback(long dsp_id, ByteBuffer originalbuffer, ByteBuffer newbuffer, int length) { // we got a callback - notify everybody - ArrayList handlers = FMOD.getCallbacks(FMOD.FSOUND_DSPCALLBACK, dspHandle); - for(int i=0; iGetStaticMethodID(fmusic, "music_ordercallback", "(JI)V"); music_rowcallback = env->GetStaticMethodID(fmusic, "music_rowcallback", "(JI)V"); music_zxxcallback = env->GetStaticMethodID(fmusic, "music_zxxcallback", "(JI)V"); + + fsound = env->FindClass("org/lwjgl/fmod3/FSound"); + sound_dspcallback = env->GetStaticMethodID(fsound, "dsp_callback", "(JLjava/nio/ByteBuffer;Ljava/nio/ByteBuffer;I)Ljava/nio/ByteBuffer;"); + + // cache some data + switch(fmod_instance->FSOUND_GetMixer()) { + case FSOUND_MIXER_AUTODETECT: + case FSOUND_MIXER_BLENDMODE: + case FSOUND_MIXER_QUALITY_AUTODETECT: + case FSOUND_MIXER_QUALITY_FPU: + case FSOUND_MIXER_MONO: + case FSOUND_MIXER_QUALITY_MONO: + case FSOUND_MIXER_MAX: + fsound_dsp_buffer_size = 8; + break; + default: + fsound_dsp_buffer_size = 4; + break; + } } } diff --git a/src/native/common/fmod3/extfmod3.h b/src/native/common/fmod3/extfmod3.h index fd532d12..bf969e18 100644 --- a/src/native/common/fmod3/extfmod3.h +++ b/src/native/common/fmod3/extfmod3.h @@ -42,6 +42,7 @@ void fmod_create(JNIEnv *env, char*); void fmod_destroy(); +extern void attachMixerThread(); extern FMOD_INSTANCE * fmod_instance; // Setup for callback. The callbacks don't have access to a JNIEnv pointer, so we have to provide @@ -60,4 +61,11 @@ extern jmethodID music_rowcallback; extern jmethodID music_zxxcallback; extern jclass fmusic; +// FSound cached fields +extern jmethodID sound_dspcallback; +extern jclass fsound; + +// size of dsp buffer (in bytes) +extern int fsound_dsp_buffer_size; + #endif diff --git a/src/native/common/fmod3/org_lwjgl_fmod3_FSound.cpp b/src/native/common/fmod3/org_lwjgl_fmod3_FSound.cpp index 6890f9d2..f63402a5 100644 --- a/src/native/common/fmod3/org_lwjgl_fmod3_FSound.cpp +++ b/src/native/common/fmod3/org_lwjgl_fmod3_FSound.cpp @@ -32,6 +32,8 @@ #include "org_lwjgl_fmod3_FSound.h" #include "extfmod3.h" +void * F_CALLBACKAPI fsound_dspcallback(void *originalbuffer, void *newbuffer, int length, void *userdata); + /* * Class: org_lwjgl_fmod3_FSound * Method: FSOUND_Close @@ -553,8 +555,9 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1PlaySound(JNIEnv * e * Method: nFSOUND_PlaySoundEx * Signature: (IJJZ)I */ -JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1PlaySoundEx(JNIEnv * env, jclass clazz, jint channel, jlong sptr, jlong dsp, jboolean startpaused) { - return fmod_instance->FSOUND_PlaySoundEx(channel, (FSOUND_SAMPLE*) sptr, (FSOUND_DSPUNIT*) dsp, startpaused); +JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1PlaySoundEx(JNIEnv * env, jclass clazz, jint channel, jlong sptr, jobject dsp, jboolean startpaused) { + FSOUND_DSPUNIT* nDsp = (FSOUND_DSPUNIT*) env->GetDirectBufferAddress(dsp); + return fmod_instance->FSOUND_PlaySoundEx(channel, (FSOUND_SAMPLE*) sptr, nDsp, startpaused); } /* @@ -968,8 +971,9 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1Play(JNIEnv * Method: nFSOUND_Stream_PlayEx * Signature: (IJJZ)I */ -JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1PlayEx(JNIEnv * env, jclass clazz, jint channel, jlong stream, jlong dsp, jboolean startpaused) { - return fmod_instance->FSOUND_Stream_PlayEx(channel, (FSOUND_STREAM*) stream, (FSOUND_DSPUNIT*) dsp, startpaused); +JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1PlayEx(JNIEnv * env, jclass clazz, jint channel, jlong stream, jobject dsp, jboolean startpaused) { + FSOUND_DSPUNIT* nDsp = (FSOUND_DSPUNIT*) env->GetDirectBufferAddress(dsp); + return fmod_instance->FSOUND_Stream_PlayEx(channel, (FSOUND_STREAM*) stream, nDsp, startpaused); } /* @@ -1014,10 +1018,11 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1SetSubStream * Method: nFSOUND_Stream_AddSyncPoint * Signature: (JILjava/lang/String;)J */ -JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1AddSyncPoint(JNIEnv * env, jclass clazz, jlong, jint, jstring) { - //XXX - throwFMODException(env, "missing implementation"); - return 0; +JNIEXPORT jobject JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1AddSyncPoint(JNIEnv * env, jclass clazz, jlong stream, jint pcmOffset, jstring name) { + const char * nName = env->GetStringUTFChars(name, 0); + FSOUND_SYNCPOINT * result = fmod_instance->FSOUND_Stream_AddSyncPoint((FSOUND_STREAM*) stream, pcmOffset, (void *) nName); + env->ReleaseStringUTFChars (name, nName); + return safeNewBuffer(env, result, 0);; } /* @@ -1036,10 +1041,10 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1Create(JNIE * Method: nFSOUND_Stream_CreateDSP * Signature: (JI)J */ -JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1CreateDSP(JNIEnv * env, jclass clazz, jlong, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return 0; +JNIEXPORT jobject JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1CreateDSP(JNIEnv * env, jclass clazz, jlong stream, jint priority, jobject dspID) { + long * nDspID = (long *) env->GetDirectBufferAddress(dspID); + FSOUND_DSPUNIT* dsp = fmod_instance->FSOUND_Stream_CreateDSP((FSOUND_STREAM*) stream, fsound_dspcallback, priority, nDspID); + return safeNewBuffer(env, dsp, 0); } /* @@ -1103,9 +1108,9 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1GetNumSyncPo * Method: nFSOUND_Stream_GetNumTagFields * Signature: (JLjava/nio/IntBuffer;I)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1GetNumTagFields(JNIEnv * env, jclass clazz, jlong, jobject, jint) { - // XXX - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1GetNumTagFields(JNIEnv * env, jclass clazz, jlong stream, jobject num, jint numOffset) { + int* nNum = numOffset + (int*) env->GetDirectBufferAddress(num); + return fmod_instance->FSOUND_Stream_GetNumTagFields((FSOUND_STREAM*) stream, &nNum[0]); } /* @@ -1140,8 +1145,9 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1GetSample(J * Method: nFSOUND_Stream_GetSyncPoint * Signature: (JI)J */ -JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1GetSyncPoint(JNIEnv * env, jclass clazz, jlong stream, jint index) { - return (jlong) fmod_instance->FSOUND_Stream_GetSyncPoint((FSOUND_STREAM*) stream, index); +JNIEXPORT jobject JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1GetSyncPoint(JNIEnv * env, jclass clazz, jlong stream, jint index) { + FSOUND_SYNCPOINT * point = fmod_instance->FSOUND_Stream_GetSyncPoint((FSOUND_STREAM*) stream, index); + return safeNewBuffer(env, point, 0); } /* @@ -1149,10 +1155,14 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1GetSyncPoin * Method: nFSOUND_Stream_GetSyncPointInfo * Signature: (JLjava/nio/IntBuffer;I)Ljava/lang/String; */ -JNIEXPORT jstring JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1GetSyncPointInfo(JNIEnv * env, jclass clazz, jlong, jobject, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return NULL; +JNIEXPORT jstring JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1GetSyncPointInfo(JNIEnv * env, jclass clazz, jobject point, jobject pcmOffset, jint pcmOffsetPosition) { + FSOUND_SYNCPOINT * nPoint = (FSOUND_SYNCPOINT *) env->GetDirectBufferAddress(point); + unsigned int * nPcmOffset = pcmOffsetPosition + (unsigned int *) env->GetDirectBufferAddress(pcmOffset); + char * result = fmod_instance->FSOUND_Stream_GetSyncPointInfo(nPoint, nPcmOffset); + if(result != NULL) { + return env->NewStringUTF(result); + } + return NULL; } /* @@ -1180,10 +1190,9 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1GetTime(JNIE * Method: nFSOUND_Stream_Net_GetBufferProperties * Signature: (Ljava/nio/IntBuffer;I)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1Net_1GetBufferProperties(JNIEnv * env, jclass clazz, jobject, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1Net_1GetBufferProperties(JNIEnv * env, jclass clazz, jobject status, jint statusOffset) { + int* nStatus = statusOffset + (int*) env->GetDirectBufferAddress(status); + return fmod_instance->FSOUND_Stream_Net_GetBufferProperties(&nStatus[0], &nStatus[1], &nStatus[2]); } /* @@ -1200,10 +1209,9 @@ JNIEXPORT jstring JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1Stream_1Net_1GetLa * Method: nFSOUND_Stream_Net_GetStatus * Signature: (JLjava/nio/IntBuffer;I)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1Net_1GetStatus(JNIEnv * env, jclass clazz, jlong, jobject, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1Net_1GetStatus(JNIEnv * env, jclass clazz, jlong stream, jobject status, jint statusOffset) { + int* nStatus = statusOffset + (int*) env->GetDirectBufferAddress(status); + return fmod_instance->FSOUND_Stream_Net_GetStatus((FSOUND_STREAM*) stream, &nStatus[0], &nStatus[1], &nStatus[2], (unsigned int *) &nStatus[3]); } /* @@ -1211,10 +1219,8 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1Net_1Get * Method: FSOUND_Stream_Net_SetBufferProperties * Signature: (III)Ljava/lang/String; */ -JNIEXPORT jstring JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1Stream_1Net_1SetBufferProperties(JNIEnv * env, jclass clazz, jint, jint, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return NULL; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1Stream_1Net_1SetBufferPropertie(JNIEnv * env, jclass clazz, jint buffersize, jint prebuffer_percent, jint rebuffer_percent) { + return fmod_instance->FSOUND_Stream_Net_SetBufferProperties(buffersize, prebuffer_percent, rebuffer_percent); } /* @@ -1451,11 +1457,10 @@ JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1DSP_1ClearMixBuffer(J * Method: nFSOUND_DSP_Create * Signature: (I)J */ -JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1Create(JNIEnv * env, jclass clazz, jint priority) { - //XXX - //return (jlong) fmod_instance->FSOUND_DSP_Create(fmod_dsp_callback, priority, NULL); - throwFMODException(env, "missing implementation"); - return 0; +JNIEXPORT jobject JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1Create(JNIEnv * env, jclass clazz, jint priority, jobject dspID) { + long * nDspID = (long *) env->GetDirectBufferAddress(dspID); + FSOUND_DSPUNIT* dsp = fmod_instance->FSOUND_DSP_Create(fsound_dspcallback, priority, nDspID); + return safeNewBuffer(env, dsp, 0); } /* @@ -1463,8 +1468,9 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1Create(JNIEnv * Method: nFSOUND_DSP_Free * Signature: (J)V */ -JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1Free(JNIEnv * env, jclass clazz, jlong dsp) { - fmod_instance->FSOUND_DSP_Free((FSOUND_DSPUNIT*) dsp); +JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1Free(JNIEnv * env, jclass clazz, jobject dsp) { + FSOUND_DSPUNIT* nDsp = (FSOUND_DSPUNIT*) env->GetDirectBufferAddress(dsp); + fmod_instance->FSOUND_DSP_Free(nDsp); } /* @@ -1472,8 +1478,9 @@ JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1Free(JNIEnv * e * Method: nFSOUND_DSP_SetActive * Signature: (JZ)V */ -JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1SetActive(JNIEnv * env, jclass clazz, jlong dsp, jboolean active) { - fmod_instance->FSOUND_DSP_SetActive((FSOUND_DSPUNIT*) dsp, active); +JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1SetActive(JNIEnv * env, jclass clazz, jobject dsp, jboolean active) { + FSOUND_DSPUNIT* nDsp = (FSOUND_DSPUNIT*) env->GetDirectBufferAddress(dsp); + fmod_instance->FSOUND_DSP_SetActive(nDsp, active); } /* @@ -1481,8 +1488,9 @@ JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1SetActive(JNIEn * Method: nFSOUND_DSP_GetActive * Signature: (J)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetActive(JNIEnv * env, jclass clazz, jlong dsp) { - return fmod_instance->FSOUND_DSP_GetActive((FSOUND_DSPUNIT*) dsp); +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetActive(JNIEnv * env, jclass clazz, jobject dsp) { + FSOUND_DSPUNIT* nDsp = (FSOUND_DSPUNIT*) env->GetDirectBufferAddress(dsp); + return fmod_instance->FSOUND_DSP_GetActive(nDsp); } /* @@ -1508,8 +1516,9 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1DSP_1GetBufferLengthT * Method: nFSOUND_DSP_SetPriority * Signature: (JI)V */ -JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1SetPriority(JNIEnv * env, jclass clazz, jlong dsp, jint priority) { - fmod_instance->FSOUND_DSP_SetPriority((FSOUND_DSPUNIT*) dsp, priority); +JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1SetPriority(JNIEnv * env, jclass clazz, jobject dsp, jint priority) { + FSOUND_DSPUNIT* nDsp = (FSOUND_DSPUNIT*) env->GetDirectBufferAddress(dsp); + fmod_instance->FSOUND_DSP_SetPriority(nDsp, priority); } /* @@ -1517,8 +1526,9 @@ JNIEXPORT void JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1SetPriority(JNI * Method: nFSOUND_DSP_GetPriority * Signature: (J)I */ -JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetPriority(JNIEnv * env, jclass clazz, jlong dsp) { - return fmod_instance->FSOUND_DSP_GetPriority((FSOUND_DSPUNIT*) dsp); +JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetPriority(JNIEnv * env, jclass clazz, jobject dsp) { + FSOUND_DSPUNIT* nDsp = (FSOUND_DSPUNIT*) env->GetDirectBufferAddress(dsp); + return fmod_instance->FSOUND_DSP_GetPriority(nDsp); } /* @@ -1526,8 +1536,9 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetPriority(JNI * Method: nFSOUND_DSP_GetClearUnit * Signature: ()J */ -JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetClearUnit(JNIEnv * env, jclass clazz) { - return (jlong) fmod_instance->FSOUND_DSP_GetClearUnit(); +JNIEXPORT jobject JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetClearUnit(JNIEnv * env, jclass clazz) { + FSOUND_DSPUNIT* dsp = fmod_instance->FSOUND_DSP_GetClearUnit(); + return safeNewBuffer(env, dsp, 0); } /* @@ -1535,8 +1546,9 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetClearUnit(J * Method: nFSOUND_DSP_GetClipAndCopyUnit * Signature: ()J */ -JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetClipAndCopyUnit(JNIEnv * env, jclass clazz) { - return (jlong) fmod_instance->FSOUND_DSP_GetClipAndCopyUnit(); +JNIEXPORT jobject JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetClipAndCopyUnit(JNIEnv * env, jclass clazz) { + FSOUND_DSPUNIT* dsp = fmod_instance->FSOUND_DSP_GetClipAndCopyUnit(); + return safeNewBuffer(env, dsp, 0); } /* @@ -1544,8 +1556,9 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetClipAndCopy * Method: nFSOUND_DSP_GetMusicUnit * Signature: ()J */ -JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetMusicUnit(JNIEnv * env, jclass clazz) { - return (jlong) fmod_instance->FSOUND_DSP_GetMusicUnit(); +JNIEXPORT jobject JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetMusicUnit(JNIEnv * env, jclass clazz) { + FSOUND_DSPUNIT* dsp = fmod_instance->FSOUND_DSP_GetMusicUnit(); + return safeNewBuffer(env, dsp, 0); } /* @@ -1553,8 +1566,9 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetMusicUnit(J * Method: nFSOUND_DSP_GetSFXUnit * Signature: ()J */ -JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetSFXUnit(JNIEnv * env, jclass clazz) { - return (jlong) fmod_instance->FSOUND_DSP_GetSFXUnit(); +JNIEXPORT jobject JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetSFXUnit(JNIEnv * env, jclass clazz) { + FSOUND_DSPUNIT* dsp = fmod_instance->FSOUND_DSP_GetSFXUnit(); + return safeNewBuffer(env, dsp, 0); } /* @@ -1562,8 +1576,9 @@ JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetSFXUnit(JNI * Method: nFSOUND_DSP_GetFFTUnit * Signature: ()J */ -JNIEXPORT jlong JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetFFTUnit(JNIEnv * env, jclass clazz) { - return (jlong) fmod_instance->FSOUND_DSP_GetFFTUnit(); +JNIEXPORT jobject JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetFFTUnit(JNIEnv * env, jclass clazz) { + FSOUND_DSPUNIT* dsp = fmod_instance->FSOUND_DSP_GetFFTUnit(); + return safeNewBuffer(env, dsp, 0); } /* @@ -1580,10 +1595,10 @@ JNIEXPORT jobject JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1GetSpectrum( * Method: nFSOUND_DSP_MixBuffers * Signature: (Ljava/nio/ByteBuffer;ILjava/nio/ByteBuffer;IIIIII)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1MixBuffers(JNIEnv * env, jclass clazz, jobject, jint, jobject, jint, jint, jint, jint, jint, jint) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1DSP_1MixBuffers(JNIEnv * env, jclass clazz, jobject destBuffer, jint destBufferOffset, jobject srcBuffer, jint srcBufferOffset, jint len, jint freq, jint vol, jint pan, jint mode) { + void * nDestBuffer = destBufferOffset + (char *) env->GetDirectBufferAddress(destBuffer); + void * nSrcBuffer = srcBufferOffset + (char *) env->GetDirectBufferAddress(srcBuffer); + return fmod_instance->FSOUND_DSP_MixBuffers(nDestBuffer, nSrcBuffer, len, freq, vol, pan, mode); } /* @@ -1760,7 +1775,9 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_FSOUND_1Record_1Stop(JNIE * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Reverb_1SetProperties(JNIEnv * env, jclass clazz, jlong prop) { - return fmod_instance->FSOUND_Reverb_SetProperties((FSOUND_REVERB_PROPERTIES*) prop); + throwFMODException(env, "missing implementation"); + //return fmod_instance->FSOUND_Reverb_SetProperties((FSOUND_REVERB_PROPERTIES*) prop); + return false; } /* @@ -1769,7 +1786,9 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Reverb_1SetPrope * Signature: (J)Z */ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Reverb_1GetProperties(JNIEnv * env, jclass clazz, jlong prop) { - return fmod_instance->FSOUND_Reverb_GetProperties((FSOUND_REVERB_PROPERTIES*) prop); + throwFMODException(env, "missing implementation"); + //return fmod_instance->FSOUND_Reverb_GetProperties((FSOUND_REVERB_PROPERTIES*) prop); + return false; } /* @@ -1778,7 +1797,9 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Reverb_1GetPrope * Signature: (IJ)Z */ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Reverb_1SetChannelProperties(JNIEnv * env, jclass clazz, jint channel, jlong prop) { - return fmod_instance->FSOUND_Reverb_SetChannelProperties(channel, (FSOUND_REVERB_CHANNELPROPERTIES*) prop); + throwFMODException(env, "missing implementation"); + //return fmod_instance->FSOUND_Reverb_SetChannelProperties(channel, (FSOUND_REVERB_CHANNELPROPERTIES*) prop); + return false; } /* @@ -1787,5 +1808,18 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Reverb_1SetChann * Signature: (IJ)Z */ JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Reverb_1GetChannelProperties(JNIEnv * env, jclass clazz, jint channel, jlong prop) { - return fmod_instance->FSOUND_Reverb_GetChannelProperties(channel, (FSOUND_REVERB_CHANNELPROPERTIES*) prop); + throwFMODException(env, "missing implementation"); + //return fmod_instance->FSOUND_Reverb_GetChannelProperties(channel, (FSOUND_REVERB_CHANNELPROPERTIES*) prop); + return false; +} + +// FSound callbacks +// ======================================= +void * F_CALLBACKAPI fsound_dspcallback(void *originalbuffer, void *newbuffer, int length, void *userdata) { + if (mixer_jnienv == NULL) { attachMixerThread(); } + int size = length * fsound_dsp_buffer_size; + jobject origBuffer = mixer_jnienv->NewDirectByteBuffer(originalbuffer, size); + jobject newBuffer = mixer_jnienv->NewDirectByteBuffer(newbuffer, size); + jobject resultBuffer = mixer_jnienv->CallStaticObjectMethod(fsound, sound_dspcallback, (jlong) *((long *)userdata), origBuffer, newBuffer, (jint) length); + return mixer_jnienv->GetDirectBufferAddress(resultBuffer); }