Mercurial > hg > pulseaudio
changeset 40:6c22ddefdbfa
added method to access pointers stored as longs (safely i hope); fixed bugs in makefile
committer: Omair Majid <omajid@redhat.com>
author | Omair Majid <omajid@redhat.com> |
---|---|
date | Fri, 01 Aug 2008 17:16:36 -0400 |
parents | 92e04ec1b947 |
children | 94378da8ecd1 |
files | .externalToolBuilders/JNI builder.launch .externalToolBuilders/JNI cleaner.launch .project lib/dummy makefile src/jni-common.c src/jni-common.h src/org/openjdk/sound/EventLoop.java src/org/openjdk/sound/PulseAudioSourceDataLine.java src/org_openjdk_sound_EventLoop.c src/org_openjdk_sound_EventLoop.h src/org_openjdk_sound_PulseAudioSourceDataLine.c src/org_openjdk_sound_PulseAudioSourceDataLine.h src/org_openjdk_sound_PulseAudioTargetDataLine.h |
diffstat | 14 files changed, 139 insertions(+), 132 deletions(-) [+] |
line wrap: on
line diff
--- a/.externalToolBuilders/JNI builder.launch Fri Aug 01 13:02:00 2008 -0400 +++ b/.externalToolBuilders/JNI builder.launch Fri Aug 01 17:16:36 2008 -0400 @@ -5,5 +5,5 @@ <stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/> <stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="full,incremental,"/> <booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/> -<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${workspace_loc:/pulse-java}"/> +<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${build_project}"/> </launchConfiguration>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.externalToolBuilders/JNI cleaner.launch Fri Aug 01 17:16:36 2008 -0400 @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<launchConfiguration type="org.eclipse.ui.externaltools.ProgramBuilderLaunchConfigurationType"> +<booleanAttribute key="org.eclipse.debug.core.appendEnvironmentVariables" value="true"/> +<booleanAttribute key="org.eclipse.debug.ui.ATTR_LAUNCH_IN_BACKGROUND" value="false"/> +<stringAttribute key="org.eclipse.ui.externaltools.ATTR_LOCATION" value="/usr/bin/make"/> +<stringAttribute key="org.eclipse.ui.externaltools.ATTR_RUN_BUILD_KINDS" value="clean"/> +<stringAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS" value="clean"/> +<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/> +<stringAttribute key="org.eclipse.ui.externaltools.ATTR_WORKING_DIRECTORY" value="${build_project}"/> +</launchConfiguration>
--- a/.project Fri Aug 01 13:02:00 2008 -0400 +++ b/.project Fri Aug 01 17:16:36 2008 -0400 @@ -20,6 +20,16 @@ </dictionary> </arguments> </buildCommand> + <buildCommand> + <name>org.eclipse.ui.externaltools.ExternalToolBuilder</name> + <triggers>clean,</triggers> + <arguments> + <dictionary> + <key>LaunchConfigHandle</key> + <value><project>/.externalToolBuilders/JNI cleaner.launch</value> + </dictionary> + </arguments> + </buildCommand> </buildSpec> <natures> <nature>org.eclipse.jdt.core.javanature</nature>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lib/dummy Fri Aug 01 17:16:36 2008 -0400 @@ -0,0 +1,1 @@ +This is a dummy file to hack around git\'s inability to track empty directories
--- a/makefile Fri Aug 01 13:02:00 2008 -0400 +++ b/makefile Fri Aug 01 17:16:36 2008 -0400 @@ -1,18 +1,24 @@ - JAVAH=javah JAVAC=javac JAVA=java +CC=gcc + +CFLAGS=-g +LDFLAGS=-g # Standard targets -all: lib/libpulse-java.so +all: lib/libpulse-java.so clean: - rm src/*.h src/org/openjdk/sound/*.class - rm -r bin - rm -r lib + -rm src/org_*.h src/org/openjdk/sound/*.class + -rm -r bin + -rm -r lib + mkdir -p lib + echo "This is a dummy file to hack around git\'s inability to track empty directories" > lib/dummy + # Executables @@ -30,16 +36,16 @@ # Object files bin/org_openjdk_sound_EventLoop.o: src/org_openjdk_sound_EventLoop.c src/org_openjdk_sound_EventLoop.h bin - gcc -g -c -o $@ $< + gcc -g -DWITH_32BIT_PLATFORM -c -o $@ $< bin/org_openjdk_sound_PulseAudioSourceDataLine.o: src/org_openjdk_sound_PulseAudioSourceDataLine.c src/org_openjdk_sound_PulseAudioSourceDataLine.h bin - gcc -g -c -o $@ $< + gcc -g -DWITH_32BIT_PLATFORM -c -o $@ $< #bin/org_openjdk_sound_PulseAudioTargetDataLine.o: src/org_openjdk_sound_PulseAudioTargetDataLine.c src/org_openjdk_sound_PulseAudioTargetDataLine.h bin -# gcc -g -c -o $@ $< +# gcc -g -DWITH_32BIT_PLATFORM -c -o $@ $< bin/jni-common.o: src/jni-common.c src/jni-common.h - gcc -g -c -o $@ $< + gcc -g -DWITH_32BIT_PLATFORM -c -o $@ $< # Java headers @@ -52,7 +58,10 @@ #src/org_openjdk_sound_PulseAudioTargetDataLine.h: src/org/openjdk/sound/PulseAudioTargetDataLine.class # javah -d src -classpath src org.openjdk.sound.PulseAudioTargetDataLine + # Compile Java +# Actually, this is not the best thing to do; javac might do some crazy things +# but we are only doing this so we can get up to date jni header files src/org/openjdk/sound/EventLoop.class: src/org/openjdk/sound/EventLoop.java javac -classpath src $<
--- a/src/jni-common.c Fri Aug 01 13:02:00 2008 -0400 +++ b/src/jni-common.c Fri Aug 01 17:16:36 2008 -0400 @@ -49,3 +49,44 @@ (*env)->SetLongField(env, obj, fid, value); } +void* getJavaPointer(JNIEnv* env, jobject obj, char* name) { + + /* + * A reference snippet + * + int a_int = 0x1020; + long a_long = 0x102030; + long long a_long_long = 0x1020304150607080; + printf("size of int: %d\nsize of long: %d\nsize of long long: %d\n", sizeof(int), sizeof(long), sizeof(long long)); + printf("int to long long: %X -> %llX\n", a_int, (long long) a_int); + printf("long long to int: %llX -> %X\n", a_long_long, (int)a_long_long); + + * this shows that long long -> int does a bitwise mask to get the lower order bits only + * FIXME what about endianness? will it get the opposite bits? + */ + + /* + * jlong = 64 bits + * long long = at least 64 bits + */ + + long long value = getJavaLongField(env, obj, name); + + jPointer result = (jPointer) value; + return (void*) result; + +} + +void setJavaPointer(JNIEnv* env, jobject obj, char* name, void* pointer_value) { + + setJavaLongField(env, obj, name, (jPointer) pointer_value); + +} + +void* convertFromJavaPointer(jlong pointer) { + + /* this truncates the jlong */ + jPointer p = pointer; + return (void*) p; + +}
--- a/src/jni-common.h Fri Aug 01 13:02:00 2008 -0400 +++ b/src/jni-common.h Fri Aug 01 17:16:36 2008 -0400 @@ -7,6 +7,15 @@ * */ +#ifdef WITH_32BIT_PLATFORM +#define jPointer jint +#elif WITH_64BIT_PLATFORM +#define jPointer jlong +#else +# error Unsupported Platform +#endif + + jint getJavaIntField(JNIEnv* env, jobject obj, char* fieldName); void setJavaIntField(JNIEnv* env, jobject obj, char* fieldName, jint value); @@ -16,4 +25,12 @@ void throwByName(JNIEnv* const env, const char* const name, const char* const msg); + +void* getJavaPointer(JNIEnv* env, jobject obj, char* name); +void setJavaPointer(JNIEnv* env, jobject obj, char*name, void* pointer_value); + +void* convertFromJavaPointer(jlong pointer); + + #endif +
--- a/src/org/openjdk/sound/EventLoop.java Fri Aug 01 13:02:00 2008 -0400 +++ b/src/org/openjdk/sound/EventLoop.java Fri Aug 01 17:16:36 2008 -0400 @@ -5,8 +5,6 @@ import java.util.List; import java.util.concurrent.Semaphore; -import javax.sound.sampled.LineUnavailableException; - import org.openjdk.sound.ContextEvent.Type; /* @@ -44,12 +42,11 @@ private native void native_setup(String appName, String server); - private native int native_iterate(int mainloop, int timeout); + private native int native_iterate(int timeout); private native void native_shutdown(); - private native void native_set_sink_volume(int contextPointer, - int streamPointer, int volume); + private native void native_set_sink_volume(long streamPointer, int volume); /* * These fields hold pointers @@ -62,9 +59,9 @@ * */ @SuppressWarnings("unused") - private int contextPointer; + private long contextPointer; @SuppressWarnings("unused") - private int mainloopPointer; + private long mainloopPointer; /* * @@ -109,7 +106,7 @@ // timout = 0 means dont block // setting it to even 1 makes the program crawl // question is, why? - native_iterate(mainloopPointer, 0); + native_iterate(0); if (Thread.interrupted()) { native_shutdown(); @@ -184,19 +181,19 @@ } - public void setVolume(int streamPointer, int volume) { + public void setVolume(long streamPointer, int volume) { synchronized (threadLock) { - native_set_sink_volume(contextPointer, streamPointer, volume); + native_set_sink_volume(streamPointer, volume); } } - public int getContextPointer() { + public long getContextPointer() { return contextPointer; } - public int getMainLoopPointer() { + public long getMainLoopPointer() { return mainloopPointer; }
--- a/src/org/openjdk/sound/PulseAudioSourceDataLine.java Fri Aug 01 13:02:00 2008 -0400 +++ b/src/org/openjdk/sound/PulseAudioSourceDataLine.java Fri Aug 01 17:16:36 2008 -0400 @@ -35,9 +35,9 @@ * */ @SuppressWarnings("unused") - private int streamPointer; + private long streamPointer; - private native void native_open(int contextPointer, String name, + private native void native_open(long contextPointer, String name, String encoding, float rate, int size, int channels, boolean bigEndian, int bufferSize);
--- a/src/org_openjdk_sound_EventLoop.c Fri Aug 01 13:02:00 2008 -0400 +++ b/src/org_openjdk_sound_EventLoop.c Fri Aug 01 17:16:36 2008 -0400 @@ -99,22 +99,22 @@ pa_context_connect(context, NULL, 0, NULL); } - setJavaIntField(env, obj, "mainloopPointer", (int) mainloop); - setJavaIntField(env, obj, "contextPointer", (int) context); + setJavaPointer(env, obj, "mainloopPointer", mainloop); + setJavaPointer(env, obj, "contextPointer", context); printf("native_setup() returning\n"); return; } /* - * Class: org_openjdk_sound_EventLoopThread + * Class: org_openjdk_sound_EventLoop * Method: native_iterate * Signature: (I)I */ JNIEXPORT jint JNICALL Java_org_openjdk_sound_EventLoop_native_1iterate -(JNIEnv* env, jobject obj, jint mainloopPointer, jint timeout) { +(JNIEnv* env, jobject obj, jint timeout) { - pa_mainloop* mainloop = (pa_mainloop*)mainloopPointer; + pa_mainloop* mainloop = (pa_mainloop*) getJavaPointer(env, obj, "mainloopPointer"); assert(mainloop); int returnval; @@ -153,12 +153,10 @@ jfieldID fid; /* the field id */ jclass cls = (*env)->GetObjectClass(env,obj); - fid = (*env)->GetFieldID(env, cls, "mainloopPointer", "I"); - pa_mainloop* mainloop = (pa_mainloop*) ((*env)->GetIntField(env, obj, fid)); + pa_mainloop* mainloop = (pa_mainloop*) getJavaPointer(env, obj, "mainloopPointer"); assert(mainloop != NULL); - fid = (*env)->GetFieldID(env, cls, "contextPointer", "I"); - pa_context* context = (pa_context*) ((*env)->GetIntField(env, obj, fid)); + pa_context* context = (pa_context*) getJavaPointer(env, obj, "contextPointer"); assert(context != NULL); pa_operation* o = pa_context_drain(context, context_drain_complete_callback, NULL); @@ -225,15 +223,15 @@ /* * Class: org_openjdk_sound_EventLoop * Method: native_set_sink_volume - * Signature: (III)V + * Signature: (II)V */ JNIEXPORT void JNICALL Java_org_openjdk_sound_EventLoop_native_1set_1sink_1volume -(JNIEnv* env, jobject obj, jint contextPointer, jint streamPointer, jint volume) { +(JNIEnv* env, jobject obj, jlong streamPointer, jint volume) { int* new_volume = malloc(sizeof(int)); *new_volume = volume; - int stream_id = pa_stream_get_index((pa_stream*) streamPointer); - pa_context_get_sink_input_info((pa_context*) contextPointer ,stream_id,sink_input_change_volume, new_volume); + int stream_id = pa_stream_get_index((pa_stream*) convertFromJavaPointer(streamPointer)); + pa_context_get_sink_input_info((pa_context*) getJavaPointer(env, obj,"contextPointer") ,stream_id,sink_input_change_volume, new_volume); return; }
--- a/src/org_openjdk_sound_EventLoop.h Fri Aug 01 13:02:00 2008 -0400 +++ b/src/org_openjdk_sound_EventLoop.h Fri Aug 01 17:16:36 2008 -0400 @@ -18,10 +18,10 @@ /* * Class: org_openjdk_sound_EventLoop * Method: native_iterate - * Signature: (II)I + * Signature: (I)I */ JNIEXPORT jint JNICALL Java_org_openjdk_sound_EventLoop_native_1iterate - (JNIEnv *, jobject, jint, jint); + (JNIEnv *, jobject, jint); /* * Class: org_openjdk_sound_EventLoop @@ -34,10 +34,10 @@ /* * Class: org_openjdk_sound_EventLoop * Method: native_set_sink_volume - * Signature: (III)V + * Signature: (JI)V */ JNIEXPORT void JNICALL Java_org_openjdk_sound_EventLoop_native_1set_1sink_1volume - (JNIEnv *, jobject, jint, jint, jint); + (JNIEnv *, jobject, jlong, jint); #ifdef __cplusplus }
--- a/src/org_openjdk_sound_PulseAudioSourceDataLine.c Fri Aug 01 13:02:00 2008 -0400 +++ b/src/org_openjdk_sound_PulseAudioSourceDataLine.c Fri Aug 01 17:16:36 2008 -0400 @@ -69,13 +69,13 @@ } -/* +/* * Class: org_openjdk_sound_PulseAudioSourceDataLine * Method: native_open - * Signature: (ILjava/lang/String;Ljava/lang/String;FIIZI)V + * Signature: (JLjava/lang/String;Ljava/lang/String;FIIZI)V */ JNIEXPORT void JNICALL Java_org_openjdk_sound_PulseAudioSourceDataLine_native_1open -(JNIEnv* env, jobject obj, jint contextPointer, jstring name, jstring encodingString, jfloat rate, jint size, jint channels, jboolean bigEndian, jint bufferSize) { +(JNIEnv* env, jobject obj, jlong contextPointer, jstring name, jstring encodingString, jfloat rate, jint size, jint channels, jboolean bigEndian, jint bufferSize) { //TODO: Need to deal with the buffer size. Currently ignored @@ -84,7 +84,7 @@ java_context->env = env; java_context->obj = (*env)->NewGlobalRef(env, obj); - pa_context* context = (pa_context*) contextPointer; + pa_context* context = (pa_context*) convertFromJavaPointer(contextPointer); assert(context != NULL); pa_sample_spec sample_spec; @@ -126,7 +126,7 @@ pa_stream_set_state_callback(stream, stream_state_change_callback, java_context); - setJavaIntField(env, obj, "streamPointer", (int) stream); + setJavaPointer(env, obj, "streamPointer", stream); printf("returning from native_open\n"); } @@ -139,11 +139,7 @@ JNIEXPORT void JNICALL Java_org_openjdk_sound_PulseAudioSourceDataLine_native_1write (JNIEnv* env, jobject obj, jbyteArray data, jint offset, jint data_length) { - jclass cls = (*env)->GetObjectClass(env, obj); - jfieldID fid = (*env)->GetFieldID(env, cls, "streamPointer", "I"); - assert(fid); - - pa_stream* stream = (pa_stream*) (*env)->GetIntField(env, obj, fid); + pa_stream* stream = (pa_stream*) getJavaPointer(env, obj, "streamPointer"); jbyte* data_buffer = (*env)->GetByteArrayElements(env, data, NULL); jbyte* buffer_start = data_buffer + offset; pa_stream_write(stream, buffer_start, data_length, NULL, 0, PA_SEEK_RELATIVE); @@ -159,7 +155,7 @@ JNIEXPORT jint JNICALL Java_org_openjdk_sound_PulseAudioSourceDataLine_native_1get_1writable_1size (JNIEnv* env, jobject obj) { - pa_stream *stream = (pa_stream*) getJavaIntField(env, obj, "streamPointer"); + pa_stream *stream = (pa_stream*) getJavaPointer(env, obj, "streamPointer"); int available = pa_stream_writable_size(stream); } @@ -172,18 +168,15 @@ JNIEXPORT jint JNICALL Java_org_openjdk_sound_PulseAudioSourceDataLine_native_1flush (JNIEnv* env, jobject obj) { - pa_stream *stream = getJavaIntField(env, obj, "streamPointer"); + pa_stream *stream = (pa_stream*) getJavaPointer(env, obj, "streamPointer"); pa_operation *o = pa_stream_flush(stream, NULL, NULL); - return o; - + return (int) o; } JNIEXPORT jint JNICALL Java_org_openjdk_sound_PulseAudioSourceDataLine_native_1getOperationState(JNIEnv *env, jobject obj, jint operation) { - - return pa_operation_get_state((pa_operation *) operation); - + return pa_operation_get_state((pa_operation *) operation); } @@ -196,7 +189,7 @@ (JNIEnv *env, jobject obj) { printf("start called\n"); - pa_stream *stream = (pa_stream*)getJavaIntField(env, obj, "streamPointer"); + pa_stream *stream = (pa_stream*)getJavaPointer(env, obj, "streamPointer"); pa_stream_connect_playback(stream, NULL, NULL, 0, NULL, NULL); } @@ -228,9 +221,9 @@ */ JNIEXPORT jint JNICALL Java_org_openjdk_sound_PulseAudioSourceDataLine_native_1drain (JNIEnv* env, jobject obj) { - pa_stream *stream = getJavaIntField(env, obj, "streamPointer"); + pa_stream *stream = (pa_stream*) getJavaPointer(env, obj, "streamPointer"); pa_operation *o = pa_stream_drain(stream, NULL, NULL); - return o; + return (int) o; } /*
--- a/src/org_openjdk_sound_PulseAudioSourceDataLine.h Fri Aug 01 13:02:00 2008 -0400 +++ b/src/org_openjdk_sound_PulseAudioSourceDataLine.h Fri Aug 01 17:16:36 2008 -0400 @@ -12,10 +12,10 @@ /* * Class: org_openjdk_sound_PulseAudioSourceDataLine * Method: native_open - * Signature: (ILjava/lang/String;Ljava/lang/String;FIIZI)V + * Signature: (JLjava/lang/String;Ljava/lang/String;FIIZI)V */ JNIEXPORT void JNICALL Java_org_openjdk_sound_PulseAudioSourceDataLine_native_1open - (JNIEnv *, jobject, jint, jstring, jstring, jfloat, jint, jint, jboolean, jint); + (JNIEnv *, jobject, jlong, jstring, jstring, jfloat, jint, jint, jboolean, jint); /* * Class: org_openjdk_sound_PulseAudioSourceDataLine
--- a/src/org_openjdk_sound_PulseAudioTargetDataLine.h Fri Aug 01 13:02:00 2008 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include <jni.h> -/* Header for class org_openjdk_sound_PulseAudioTargetDataLine */ - -#ifndef _Included_org_openjdk_sound_PulseAudioTargetDataLine -#define _Included_org_openjdk_sound_PulseAudioTargetDataLine -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: org_openjdk_sound_PulseAudioTargetDataLine - * Method: openStream - * Signature: (Ljava/lang/String;FIIZI)V - */ -JNIEXPORT void JNICALL Java_org_openjdk_sound_PulseAudioTargetDataLine_openStream - (JNIEnv *, jobject, jstring, jfloat, jint, jint, jboolean, jint); - -/* - * Class: org_openjdk_sound_PulseAudioTargetDataLine - * Method: readFromStream - * Signature: ([BII)V - */ -JNIEXPORT void JNICALL Java_org_openjdk_sound_PulseAudioTargetDataLine_readFromStream - (JNIEnv *, jobject, jbyteArray, jint, jint); - -/* - * Class: org_openjdk_sound_PulseAudioTargetDataLine - * Method: startStream - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_org_openjdk_sound_PulseAudioTargetDataLine_startStream - (JNIEnv *, jobject); - -/* - * Class: org_openjdk_sound_PulseAudioTargetDataLine - * Method: pauseStream - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_org_openjdk_sound_PulseAudioTargetDataLine_pauseStream - (JNIEnv *, jobject); - -/* - * Class: org_openjdk_sound_PulseAudioTargetDataLine - * Method: resumeStream - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_org_openjdk_sound_PulseAudioTargetDataLine_resumeStream - (JNIEnv *, jobject); - -/* - * Class: org_openjdk_sound_PulseAudioTargetDataLine - * Method: available - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_openjdk_sound_PulseAudioTargetDataLine_available - (JNIEnv *, jobject); - -/* - * Class: org_openjdk_sound_PulseAudioTargetDataLine - * Method: closeStream - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_org_openjdk_sound_PulseAudioTargetDataLine_closeStream - (JNIEnv *, jobject); - -#ifdef __cplusplus -} -#endif -#endif