From 8ae823dd4a40724a5e208367b2efa9a439b83816 Mon Sep 17 00:00:00 2001 From: Brian Matzon Date: Sat, 16 Oct 2004 01:02:34 +0000 Subject: [PATCH] tagfields implemented --- src/java/org/lwjgl/fmod3/FSound.java | 1 - src/java/org/lwjgl/fmod3/FSoundTagField.java | 33 ++++- .../org/lwjgl/test/fmod3/TagFieldTest.java | 129 ++++++++++++++++++ .../common/fmod3/org_lwjgl_fmod3_FSound.c | 41 ++++-- 4 files changed, 190 insertions(+), 14 deletions(-) create mode 100644 src/java/org/lwjgl/test/fmod3/TagFieldTest.java diff --git a/src/java/org/lwjgl/fmod3/FSound.java b/src/java/org/lwjgl/fmod3/FSound.java index 6ef1f769..a41643fb 100644 --- a/src/java/org/lwjgl/fmod3/FSound.java +++ b/src/java/org/lwjgl/fmod3/FSound.java @@ -2368,7 +2368,6 @@ public class FSound { * Get a tag field associated with an open stream *

* Remarks - * Do not attempt to modify or free any pointers returned by this function. * If this function returns successfully, "value" will contain a pointer to a piece of tag-field-specific data - do not assume it will always point to a null-terminated ASCII string. * @param stream The stream to get the tag field from. * @param num The number of the tag field to retrieve. diff --git a/src/java/org/lwjgl/fmod3/FSoundTagField.java b/src/java/org/lwjgl/fmod3/FSoundTagField.java index 919d35b0..54021ff4 100644 --- a/src/java/org/lwjgl/fmod3/FSoundTagField.java +++ b/src/java/org/lwjgl/fmod3/FSoundTagField.java @@ -55,6 +55,12 @@ public class FSoundTagField { /** Type of tagfield */ int type; + + /** + * Creates a new FSoundTagField + */ + public FSoundTagField() { + } /** * Creates a new FSoundTagField @@ -65,36 +71,53 @@ public class FSoundTagField { } /** - * Sets the value and length + * Sets the name value and type + * @param name name of tagfield * @param value value of tagfield - * @param lenght length of data + * @param type type of tagfield */ - void set(ByteBuffer value, int lenght) { + void set(String name, ByteBuffer value, int type) { + this.name = name; this.value = value; - this.length = lenght; + this.length = value.capacity(); + this.type = type; } + /** * @return Returns the length. */ public int getLength() { return length; } + /** * @return Returns the name. */ public String getName() { return name; } + /** * @return Returns the type. */ public int getType() { return type; } + /** * @return Returns the value. */ public ByteBuffer getValue() { - return value; + return value.asReadOnlyBuffer(); } + + /** + * @value as string + */ + public String getValueAsString() { + byte[] buffer = new byte[value.capacity()]; + value.get(buffer); + value.rewind(); + return new String(buffer); + } } \ No newline at end of file diff --git a/src/java/org/lwjgl/test/fmod3/TagFieldTest.java b/src/java/org/lwjgl/test/fmod3/TagFieldTest.java new file mode 100644 index 00000000..4b4acd41 --- /dev/null +++ b/src/java/org/lwjgl/test/fmod3/TagFieldTest.java @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2002-2004 LWJGL 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 'LWJGL' 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. + */ +package org.lwjgl.test.fmod3; + +import java.io.File; +import java.io.IOException; +import java.nio.IntBuffer; + +import org.lwjgl.BufferUtils; +import org.lwjgl.fmod3.FMOD; +import org.lwjgl.fmod3.FMODException; +import org.lwjgl.fmod3.FSound; +import org.lwjgl.fmod3.FSoundStream; +import org.lwjgl.fmod3.FSoundTagField; + +/** + * $Id$
+ * + * @author Brian Matzon + * @version $Revision$ + */ +public class TagFieldTest { + + public static void main(String[] args) { + if (args.length < 1) { + System.out.println("Usage:\n TagFieldTest "); + + // default to phero.mp3 + args = new String[] { "res\\phero.mp3"}; + System.out.println("Using default: " + args[0]); + } + + File file = new File(args[0]); + if (!file.exists()) { + System.out.println("No such file: " + args[0]); + return; + } + + try { + FMOD.create(); + } catch (FMODException fmode) { + fmode.printStackTrace(); + return; + } + + System.out.println("Initializing FMOD"); + if (!FSound.FSOUND_Init(44100, 32, 0)) { + System.out.println("Failed to initialize FMOD"); + System.out.println("Error: " + FMOD.FMOD_ErrorString(FSound.FSOUND_GetError())); + return; + } + + System.out.println("Loading " + args[0]); + FSoundStream stream = FSound.FSOUND_Stream_Open(args[0], FSound.FSOUND_NORMAL, 0, 0); + + if (stream != null) { + //scratch buffer + IntBuffer scratch = BufferUtils.createIntBuffer(16); + + FSound.FSOUND_Stream_Play(0, stream); + + // find number of tags + FSound.FSOUND_Stream_GetNumTagFields(stream, scratch); + int tagCount = scratch.get(0); + System.out.println("Found: " + tagCount + " tag fields"); + + // print each name value pair + FSoundTagField field; + for(int i=0; iGetStringUTFChars(env, name, 0); + bool result = false; + void* value; + jint length; + + if(fmod_instance->FSOUND_Stream_FindTagField((FSOUND_STREAM*) stream, type, nName, &value, &length)) { + + // get set method and call it + jclass cls = (*env)->GetObjectClass(env, tagField); + jmethodID mid = (*env)->GetMethodID(env, cls, "set", "(Ljava/lang/String;Ljava/nio/ByteBuffer;I)V"); + (*env)->CallVoidMethod(env, tagField, mid, name, safeNewBuffer(env, value, length), type); + result = true; + } + (*env)->ReleaseStringUTFChars (env, name, nName); + return result; } /* @@ -1195,10 +1207,23 @@ JNIEXPORT jstring JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1GetSyncPo * Method: nFSOUND_Stream_GetTagField * Signature: (JILorg/lwjgl/fmod_instance/FSoundTagField;)Z */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1GetTagField(JNIEnv * env, jclass clazz, jlong p1, jint p2, jobject p3) { - //XXX - throwFMODException(env, "missing implementation"); - return false; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_fmod3_FSound_nFSOUND_1Stream_1GetTagField(JNIEnv * env, jclass clazz, jlong stream, jint num, jobject tagField) { + jint type; + char* name; + void* value; + jint length; + + if(fmod_instance->FSOUND_Stream_GetTagField((FSOUND_STREAM*) stream, num, &type, &name, &value, &length)) { + // create string instance of name + jstring nName = (*env)->NewStringUTF(env, name); + + // get set method and call it + jclass cls = (*env)->GetObjectClass(env, tagField); + jmethodID mid = (*env)->GetMethodID(env, cls, "set", "(Ljava/lang/String;Ljava/nio/ByteBuffer;I)V"); + (*env)->CallVoidMethod(env, tagField, mid, nName, safeNewBuffer(env, value, length), type); + return true; + } + return false; } /*