changeset in /hg/pulseaudio: Added a Operation object to wrap pa...
Omair Majid
omajid at redhat.com
Fri Aug 8 14:28:35 PDT 2008
changeset 5c09d21c2d70 in /hg/pulseaudio
details: http://icedtea.classpath.org/hg/pulseaudio?cmd=changeset;node=5c09d21c2d70
description:
Added a Operation object to wrap pa_operation_*. Using it to free memory whenever async Operations are performed. Also added a new method to convert a pointer to a java long
diffstat:
8 files changed, 160 insertions(+), 53 deletions(-)
makefile | 8 -
src/jni-common.c | 17 ++-
src/jni-common.h | 4
src/org/classpath/icedtea/pulseaudio/Operation.java | 56 ++++++++++
src/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java | 44 ++++---
src/org_classpath_icedtea_pulseaudio_EventLoop.c | 2
src/org_classpath_icedtea_pulseaudio_Operation.c | 43 +++++++
src/org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine.c | 39 ++----
diffs (351 lines):
diff -r 61cf6f811619 -r 5c09d21c2d70 makefile
--- a/makefile Fri Aug 08 16:24:38 2008 -0400
+++ b/makefile Fri Aug 08 17:28:30 2008 -0400
@@ -35,8 +35,8 @@ lib/libpulse-java.so: \
bin/org_classpath_icedtea_pulseaudio_EventLoop.o \
bin/org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine.o \
bin/org_classpath_icedtea_pulseaudio_PulseAudioStreamVolumeControl.o \
+ bin/org_classpath_icedtea_pulseaudio_Operation.o \
bin/jni-common.o
-# bin/org_classpath_icedtea_pulseaudio_PulseAudioStreamVolumeControl.o \
# bin/org_classpath_icedtea_pulseaudio_PulseAudioTargetDataLine.o \
gcc -g -shared -o $@ $^ /usr/lib/libpulse.so
@@ -54,7 +54,7 @@ bin/org_classpath_icedtea_pulseaudio_Pul
bin/org_classpath_icedtea_pulseaudio_PulseAudioStreamVolumeControl.o: src/org_classpath_icedtea_pulseaudio_PulseAudioStreamVolumeControl.c src/org_classpath_icedtea_pulseaudio_PulseAudioStreamVolumeControl.h
gcc $(CFLAGS) $(PLATFORM_FLAGS) -c -o $@ $<
-bin/org_classpath_icedtea_pulseaudio_StreamVolume.o: src/org_classpath_icedtea_pulseaudio_StreamVolume.c src/org_classpath_icedtea_pulseaudio_StreamVolume.h
+bin/org_classpath_icedtea_pulseaudio_Operation.o: src/org_classpath_icedtea_pulseaudio_Operation.c src/org_classpath_icedtea_pulseaudio_Operation.h
gcc $(CFLAGS) $(PLATFORM_FLAGS) -c -o $@ $<
bin/jni-common.o: src/jni-common.c src/jni-common.h
@@ -74,8 +74,8 @@ src/org_classpath_icedtea_pulseaudio_Pul
src/org_classpath_icedtea_pulseaudio_PulseAudioStreamVolumeControl.h: src/org/classpath/icedtea/pulseaudio/PulseAudioStreamVolumeControl.class
javah -d src -classpath src org.classpath.icedtea.pulseaudio.PulseAudioStreamVolumeControl
-src/org_classpath_icedtea_pulseaudio_StreamVolume.h: src/org/classpath/icedtea/pulseaudio/StreamVolume.class
- javah -d src -classpath src org.classpath.icedtea.pulseaudio.StreamVolume
+src/org_classpath_icedtea_pulseaudio_Operation.h: src/org/classpath/icedtea/pulseaudio/Operation.class
+ javah -d src -classpath src org.classpath.icedtea.pulseaudio.Operation
# Compile Java
# Actually, this is not the best thing to do; javac might do some crazy things
diff -r 61cf6f811619 -r 5c09d21c2d70 src/jni-common.c
--- a/src/jni-common.c Fri Aug 08 16:24:38 2008 -0400
+++ b/src/jni-common.c Fri Aug 08 17:28:30 2008 -0400
@@ -85,6 +85,16 @@ void setJavaLongField(JNIEnv* env, jobje
(*env)->SetLongField(env, obj, fid, value);
}
+
+/*
+ *
+ *
+ * The functions below are going to cause headaches when porting
+ *
+ *
+ */
+
+
void* getJavaPointer(JNIEnv* env, jobject obj, char* name) {
/*
@@ -155,10 +165,15 @@ void setJavaPointer(JNIEnv* env, jobject
}
-void* convertFromJavaPointer(jlong pointer) {
+void* convertJavaLongToPointer(jlong pointer) {
/* this truncates the jlong */
jPointer p = pointer;
return (void*) p;
}
+
+jlong convertPointerToJavaLong(void* pointer) {
+ return (long) pointer;
+
+}
diff -r 61cf6f811619 -r 5c09d21c2d70 src/jni-common.h
--- a/src/jni-common.h Fri Aug 08 16:24:38 2008 -0400
+++ b/src/jni-common.h Fri Aug 08 17:28:30 2008 -0400
@@ -72,8 +72,8 @@ void* getJavaPointer(JNIEnv* env, jobjec
void* getJavaPointer(JNIEnv* env, jobject obj, char* name);
void setJavaPointer(JNIEnv* env, jobject obj, char*name, void* pointer_value);
-void* convertFromJavaPointer(jlong pointer);
-
+void* convertJavaLongToPointer(jlong pointer);
+jlong convertPointerToJavaLong(void* pointer);
#endif
diff -r 61cf6f811619 -r 5c09d21c2d70 src/org/classpath/icedtea/pulseaudio/Operation.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/org/classpath/icedtea/pulseaudio/Operation.java Fri Aug 08 17:28:30 2008 -0400
@@ -0,0 +1,56 @@
+package org.classpath.icedtea.pulseaudio;
+
+/*
+ * Encapsulates a pa_operation object
+ *
+ *
+ * This is really needed only so that we can deallocate the reference counted object
+ *
+ *
+ */
+
+public class Operation {
+
+ long operationPointer;
+
+ public enum State {
+ Running, Done, Cancelled,
+ }
+
+ private native void native_ref();
+
+ private native void native_unref();
+
+ private native int native_get_state();
+
+ public Operation(long operationPointer) {
+ this.operationPointer = operationPointer;
+ }
+
+ public void addReference() {
+ assert(operationPointer != 0);
+ native_ref();
+ }
+
+ public void releaseReference() {
+ assert(operationPointer!= 0);
+ native_unref();
+ }
+
+ public State getState() {
+ assert(operationPointer!= 0);
+ int state = native_get_state();
+ switch (state) {
+ case 0:
+ return State.Running;
+ case 1:
+ return State.Done;
+ case 2:
+ return State.Cancelled;
+ default:
+ throw new IllegalStateException("Invalid operation State");
+ }
+
+ }
+
+}
diff -r 61cf6f811619 -r 5c09d21c2d70 src/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java
--- a/src/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java Fri Aug 08 16:24:38 2008 -0400
+++ b/src/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java Fri Aug 08 17:28:30 2008 -0400
@@ -95,9 +95,7 @@ public class PulseAudioSourceDataLine im
private native int native_get_writable_size();
- private native int native_getOperationState(int operationState);
-
- private native int native_flush();
+ private native long native_flush();
private native void native_start();
@@ -105,7 +103,7 @@ public class PulseAudioSourceDataLine im
private native void native_resume();
- private native int native_drain();
+ private native long native_drain();
private native void native_close();
@@ -555,33 +553,39 @@ public class PulseAudioSourceDataLine im
@Override
public void drain() {
- int operationPointer;
- int operationState;
- synchronized (eventLoop.threadLock) {
- operationPointer = native_drain();
- operationState = native_getOperationState(operationPointer);
- }
- while (operationState != 1) {
+ Operation operation;
+ Operation.State operationState;
+ synchronized (eventLoop.threadLock) {
+ operation = new Operation(native_drain());
+ operationState = operation.getState();
+ }
+
+ // FIXME need to find a way to do a wait than a busy loop
+ while (operationState != Operation.State.Done) {
synchronized (eventLoop.threadLock) {
- operationState = native_getOperationState(operationPointer);
+ operationState = operation.getState();
}
}
+ operation.releaseReference();
}
@Override
public void flush() {
- int operationPointer;
- int operationState;
- synchronized (eventLoop.threadLock) {
- operationPointer = native_flush();
- operationState = native_getOperationState(operationPointer);
- }
- while (operationState != 1) {
+ Operation operation;
+ Operation.State operationState;
+ synchronized (eventLoop.threadLock) {
+ operation = new Operation(native_flush());
+ operationState = operation.getState();
+ }
+ // FIXME need to find a way to do a wait than a busy loop
+ while (operationState != Operation.State.Done) {
synchronized (eventLoop.threadLock) {
- operationState = native_getOperationState(operationPointer);
+ operationState = operation.getState();
}
}
+
+ operation.releaseReference();
}
diff -r 61cf6f811619 -r 5c09d21c2d70 src/org_classpath_icedtea_pulseaudio_EventLoop.c
--- a/src/org_classpath_icedtea_pulseaudio_EventLoop.c Fri Aug 08 16:24:38 2008 -0400
+++ b/src/org_classpath_icedtea_pulseaudio_EventLoop.c Fri Aug 08 17:28:30 2008 -0400
@@ -262,7 +262,7 @@ JNIEXPORT void JNICALL Java_org_classpat
(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*) convertFromJavaPointer(streamPointer));
+ int stream_id = pa_stream_get_index((pa_stream*) convertJavaLongToPointer(streamPointer));
pa_context_get_sink_input_info((pa_context*) getJavaPointer(env, obj,"contextPointer") ,stream_id,sink_input_change_volume, new_volume);
return;
}
diff -r 61cf6f811619 -r 5c09d21c2d70 src/org_classpath_icedtea_pulseaudio_Operation.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/org_classpath_icedtea_pulseaudio_Operation.c Fri Aug 08 17:28:30 2008 -0400
@@ -0,0 +1,43 @@
+#include "org_classpath_icedtea_pulseaudio_Operation.h"
+
+#include "jni-common.h"
+#include <pulse/pulseaudio.h>
+
+/*
+ * Class: org_classpath_icedtea_pulseaudio_Operation
+ * Method: native_ref
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_classpath_icedtea_pulseaudio_Operation_native_1ref
+(JNIEnv* env, jobject obj) {
+
+ pa_operation* operation = (pa_operation*) getJavaPointer(env, obj, "operationPointer");
+ pa_operation_ref(operation);
+
+}
+
+/*
+ * Class: org_classpath_icedtea_pulseaudio_Operation
+ * Method: native_unref
+ * Signature: ()V
+ */
+JNIEXPORT void JNICALL Java_org_classpath_icedtea_pulseaudio_Operation_native_1unref
+(JNIEnv* env, jobject obj) {
+
+ pa_operation* operation = (pa_operation*) getJavaPointer(env, obj, "operationPointer");
+ pa_operation_unref(operation);
+
+}
+
+/*
+ * Class: org_classpath_icedtea_pulseaudio_Operation
+ * Method: native_get_state
+ * Signature: ()I
+ */
+JNIEXPORT jint JNICALL Java_org_classpath_icedtea_pulseaudio_Operation_native_1get_1state
+(JNIEnv* env, jobject obj) {
+
+ pa_operation* operation = (pa_operation*) getJavaPointer(env, obj, "operationPointer");
+ int state = pa_operation_get_state(operation);
+ return state;
+}
diff -r 61cf6f811619 -r 5c09d21c2d70 src/org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine.c
--- a/src/org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine.c Fri Aug 08 16:24:38 2008 -0400
+++ b/src/org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine.c Fri Aug 08 17:28:30 2008 -0400
@@ -113,7 +113,7 @@ JNIEXPORT void JNICALL Java_org_classpat
java_context->env = env;
java_context->obj = (*env)->NewGlobalRef(env, obj);
- pa_context* context = (pa_context*) convertFromJavaPointer(contextPointer);
+ pa_context* context = (pa_context*) convertJavaLongToPointer(contextPointer);
assert(context != NULL);
pa_sample_spec sample_spec;
@@ -210,28 +210,17 @@ JNIEXPORT jint JNICALL Java_org_classpat
/*
* Class: org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine
* Method: native_flush
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine_native_1flush
-(JNIEnv* env, jobject obj) {
-
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine_native_1flush
+(JNIEnv* env, jobject obj)
+{
pa_stream *stream = (pa_stream*) getJavaPointer(env, obj, "streamPointer");
pa_operation *o = pa_stream_flush(stream, NULL, NULL);
- return (int) o;
-
-}
-
-/*
- * Class: org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine
- * Method: native_getOperationState
- * Signature: (I)I
- */
-JNIEXPORT jint JNICALL Java_org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine_native_1getOperationState
-(JNIEnv *env, jobject obj, jint operation) {
-
- return pa_operation_get_state((pa_operation *) operation);
-
-}
+ return convertPointerToJavaLong(o);
+
+}
+
/*
* Class: org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine
@@ -269,14 +258,14 @@ JNIEXPORT void JNICALL Java_org_classpat
/*
* Class: org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine
* Method: native_drain
- * Signature: ()I
- */
-JNIEXPORT jint JNICALL Java_org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine_native_1drain
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_PulseAudioSourceDataLine_native_1drain
(JNIEnv* env, jobject obj) {
pa_stream *stream = (pa_stream*) getJavaPointer(env, obj, "streamPointer");
assert(stream);
pa_operation *o = pa_stream_drain(stream, NULL, NULL);
- return (int) o;
+ return convertPointerToJavaLong(o);
}
/*
More information about the distro-pkg-dev
mailing list