Mercurial > hg > pulseaudio
changeset 106:b191c8f8cb2d
2008-09-03 Omair Majid <omajid@redhat.com>
* src/java/org/classpath/icedtea/pulseaudio/Eventloop.java
(nativeUpdateTargetPortNameList): Changed return type to long.
(nativeUpdateSourcePortNameList): Likewise.
* src/native/org_classpath_icedtea_pulseaudio_Eventloop.c
(sink_list_success_cb): Added asserts to fail nosily on error.
(source_list_success_cb): Likewise.
(context_change_callback): Likewise.
(poll_function): Likewise.
(Java_org_classpath_icedtea_pulseaudio_EventLoop_nativeUpdateTargetPortNameList):
Changed return type to jlong from jint. Added asserts.
(Java_org_classpath_icedtea_pulseaudio_EventLoop_nativeUpdateSourcePortNameList):
Likewise.
(Java_org_classpath_icedtea_pulseaudio_EventLoop_native_1shutdown): Set
pointer to NULL on cleanup.
(Java_org_classpath_icedtea_pulseaudio_EventLoop_native_1set_1sink_1volume):
Added asserts.
* src/native/org_classpath_icedtea_pulseaudio_Operation.c
(Java_org_classpath_icedtea_pulseaudio_Operation_native_1ref): Added
asserts.
(Java_org_classpath_icedtea_pulseaudio_Operation_native_1unref): Likewise.
(Java_org_classpath_icedtea_pulseaudio_Operation_native_1get_1state):
Likewise.
* src/native/org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.c
(source_callback): Added asserts.
(get_source_volume_callback): Likewise.
(Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_native_1updateVolumeInfo):
Added checks for error conditions and asserts.
(Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_native_1setVolume):
Likewise.
* src/native/org_classpath_icedtea_pulseaudio_PulseAudioTargetPort.c
(get_sink_volume_callback): Added asserts.
(Java_org_classpath_icedtea_pulseaudio_PulseAudioTargetPort_native_1updateVolumeInfo):
Added asserts and checks for errors.
(Java_org_classpath_icedtea_pulseaudio_PulseAudioTargetPort_native_1setVolume):
Likewise.
* src/native/org_classpath_icedtea_pulseaudio_Stream.c
(Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1read):
Added asserts.
(Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1peek):
Likewise.
(Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1drop):
Likewise.
(Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1writable_1size):
Likewise.
(Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1readable_1size):
Likewise.
(drain_callback): Likewise.
(Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1drain):
Likewise.
(cork_callback): Likewise.
(Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1cork):
Likewise.
(flush_callback): Likewise.
(Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1flush):
Likewise.
(trigger_callback): Likewise.
(Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1trigger):
Likewise.
(Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1set_1name):
Likewise.
(Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1get_1sample_1spec):
Added code for error checking and asserts.
(Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1get_1buffer_1attr):
Adde asserts.
(set_buffer_attr_callback): Likewise.
(update_sample_rate_callback): Likewise.
(Java_org_classpath_icedtea_pulseaudio_Stream_native_1setVolume):
Likewise.
author | Omair Majid <omajid@redhat.com> |
---|---|
date | Wed, 03 Sep 2008 10:47:27 -0400 |
parents | 52c81c12f7d0 |
children | 8ddfb8d274c7 |
files | src/java/org/classpath/icedtea/pulseaudio/EventLoop.java src/native/org_classpath_icedtea_pulseaudio_EventLoop.c src/native/org_classpath_icedtea_pulseaudio_Operation.c src/native/org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.c src/native/org_classpath_icedtea_pulseaudio_PulseAudioTargetPort.c src/native/org_classpath_icedtea_pulseaudio_Stream.c |
diffstat | 6 files changed, 185 insertions(+), 52 deletions(-) [+] |
line wrap: on
line diff
--- a/src/java/org/classpath/icedtea/pulseaudio/EventLoop.java Tue Sep 02 17:23:01 2008 -0400 +++ b/src/java/org/classpath/icedtea/pulseaudio/EventLoop.java Wed Sep 03 10:47:27 2008 -0400 @@ -244,9 +244,9 @@ return mainloopPointer; } - private native int nativeUpdateTargetPortNameList(); + private native long nativeUpdateTargetPortNameList(); - private native int nativeUpdateSourcePortNameList(); + private native long nativeUpdateSourcePortNameList(); protected synchronized List<String> updateTargetPortNameList() { targetPortNameList = new ArrayList<String>();
--- a/src/native/org_classpath_icedtea_pulseaudio_EventLoop.c Tue Sep 02 17:23:01 2008 -0400 +++ b/src/native/org_classpath_icedtea_pulseaudio_EventLoop.c Wed Sep 03 10:47:27 2008 -0400 @@ -49,27 +49,43 @@ JNIEnv* pulse_thread_env = NULL; -void sink_list_success_cb(pa_context *context, const pa_sink_info *i, int eol, void *userdata) { - +void sink_list_success_cb(pa_context *context, const pa_sink_info *i, int eol, + void *userdata) { + if (eol == 0) { - jclass cls = (*pulse_thread_env)->GetObjectClass(pulse_thread_env, java_context->obj); + jclass cls = (*pulse_thread_env)->GetObjectClass(pulse_thread_env, + java_context->obj); + assert(cls); jstring name = (*pulse_thread_env)->NewStringUTF(pulse_thread_env, i->name); - jmethodID mid1 = (*pulse_thread_env)->GetMethodID(pulse_thread_env, cls, "sink_callback", "(Ljava/lang/String;)V"); - (*pulse_thread_env)->CallVoidMethod(pulse_thread_env, java_context->obj, mid1, name) ; + assert(name); + jmethodID mid1 = (*pulse_thread_env)->GetMethodID(pulse_thread_env, cls, + "sink_callback", "(Ljava/lang/String;)V"); + assert(mid1); + (*pulse_thread_env)->CallVoidMethod(pulse_thread_env, + java_context->obj, mid1, name) ; } else { + assert(pulse_thread_env); notifyWaitingOperations(pulse_thread_env); } } -void source_list_success_cb(pa_context *context, const pa_source_info *i, int eol, void *userdata) { - +void source_list_success_cb(pa_context *context, const pa_source_info *i, + int eol, void *userdata) { + if (eol == 0) { - jclass cls = (*pulse_thread_env)->GetObjectClass(pulse_thread_env, java_context->obj); + jclass cls = (*pulse_thread_env)->GetObjectClass(pulse_thread_env, + java_context->obj); + assert(cls); jstring name = (*pulse_thread_env)->NewStringUTF(pulse_thread_env, i->name); - jmethodID mid1 = (*pulse_thread_env)->GetMethodID(pulse_thread_env, cls, "source_callback", "(Ljava/lang/String;)V"); - (*pulse_thread_env)->CallVoidMethod(pulse_thread_env, java_context->obj, mid1, name) ; + assert(name); + jmethodID mid1 = (*pulse_thread_env)->GetMethodID(pulse_thread_env, cls, + "source_callback", "(Ljava/lang/String;)V"); + assert(mid1); + (*pulse_thread_env)->CallVoidMethod(pulse_thread_env, + java_context->obj, mid1, name) ; } else { + assert(pulse_thread_env); notifyWaitingOperations(pulse_thread_env); } @@ -85,20 +101,13 @@ // printf("context state changed to %d\n", pa_context_get_state(context)); - /* Call the 'update' method in java + /* Call the EventLoop.update method in java * to handle all java-side events */ jclass cls = (*env)->GetObjectClass(env, obj); - if (cls == NULL) { - printf("unable to get class of object"); - return; - } + assert(cls); jmethodID mid = (*env)->GetMethodID(env, cls, "update", "(I)V"); - if (mid == NULL) { - printf("unable to get callback method\n"); - return; - - } + assert(mid); (*env)->CallVoidMethod(env, obj, mid, pa_context_get_state(context)); return; @@ -108,6 +117,7 @@ void *userdata) { JNIEnv* env = pulse_thread_env; + assert(env); jobject lockObject = getLockObject(env); (*env)->MonitorExit(env, lockObject); @@ -213,17 +223,21 @@ } -JNIEXPORT jint JNICALL Java_org_classpath_icedtea_pulseaudio_EventLoop_nativeUpdateTargetPortNameList(JNIEnv *env, jobject obj) { +JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_EventLoop_nativeUpdateTargetPortNameList(JNIEnv *env, jobject obj) { pa_context* context = (pa_context*) getJavaPointer(env, obj, "contextPointer"); + assert(context); pa_operation *o = pa_context_get_sink_info_list(context, sink_list_success_cb, NULL); - return (jint) o; - } - - JNIEXPORT jint JNICALL Java_org_classpath_icedtea_pulseaudio_EventLoop_nativeUpdateSourcePortNameList(JNIEnv *env, jobject obj) { + assert(o); + return convertPointerToJavaLong(o); +} + +JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_EventLoop_nativeUpdateSourcePortNameList(JNIEnv *env, jobject obj) { pa_context* context = (pa_context*) getJavaPointer(env, obj, "contextPointer"); + assert(context); pa_operation *o = pa_context_get_source_info_list(context, source_list_success_cb, NULL); - return (jint) o; - } + assert(o); + return convertPointerToJavaLong(o); +} static void context_drain_complete_callback(pa_context* context, void* userdata) { pa_context_disconnect(context); @@ -257,6 +271,7 @@ (*env)->DeleteGlobalRef(env, java_context->obj); free(java_context); + java_context = NULL; setJavaPointer(env, obj, "mainloopPointer", NULL); setJavaPointer(env, obj, "contextPointer", NULL); @@ -272,7 +287,6 @@ assert(userdata); free(userdata); assert(success); - printf("volume change complete\n"); } @@ -280,7 +294,6 @@ const pa_sink_input_info* i, int eol, void* userdata) { assert(c); - // end of list ? if (eol) { return; } @@ -317,10 +330,17 @@ */ JNIEXPORT void JNICALL Java_org_classpath_icedtea_pulseaudio_EventLoop_native_1set_1sink_1volume (JNIEnv* env, jobject obj, jlong streamPointer, jint volume) { + + pa_stream* stream = (pa_stream*) convertJavaLongToPointer(streamPointer); + assert(stream); + pa_context* context = (pa_context*) getJavaPointer(env, obj, "contextPointer"); + assert(context); + int* new_volume = malloc(sizeof(int)); *new_volume = volume; - 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); + + int stream_id = pa_stream_get_index(stream); + pa_context_get_sink_input_info(context, stream_id,sink_input_change_volume, new_volume); return; }
--- a/src/native/org_classpath_icedtea_pulseaudio_Operation.c Tue Sep 02 17:23:01 2008 -0400 +++ b/src/native/org_classpath_icedtea_pulseaudio_Operation.c Wed Sep 03 10:47:27 2008 -0400 @@ -49,6 +49,7 @@ (JNIEnv* env, jobject obj) { pa_operation* operation = (pa_operation*) getJavaPointer(env, obj, "operationPointer"); + assert(operation); pa_operation_ref(operation); } @@ -62,6 +63,7 @@ (JNIEnv* env, jobject obj) { pa_operation* operation = (pa_operation*) getJavaPointer(env, obj, "operationPointer"); + assert(operation); pa_operation_unref(operation); } @@ -75,6 +77,7 @@ (JNIEnv *env, jobject obj) { pa_operation* operation = (pa_operation*) getJavaPointer(env, obj, "operationPointer"); + assert(operation); int state = pa_operation_get_state(operation); return state; }
--- a/src/native/org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.c Tue Sep 02 17:23:01 2008 -0400 +++ b/src/native/org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.c Wed Sep 03 10:47:27 2008 -0400 @@ -1,4 +1,3 @@ - #include "org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.h" #include "jni-common.h" #include <pulse/pulseaudio.h> @@ -12,43 +11,80 @@ extern JNIEnv* pulse_thread_env; void source_callback(pa_context *context, int success, void *userdata) { + assert(context); + assert(pulse_thread_env); notifyWaitingOperations(pulse_thread_env); } -void get_source_volume_callback(pa_context *context, const pa_source_info *i, int eol, void *userdata) { - if(eol == 0) { - printf("%s\n", i->name); +void get_source_volume_callback(pa_context *context, const pa_source_info *i, + int eol, void *userdata) { + assert(context); + assert(pulse_thread_env); + + if (eol == 0) { + // printf("%s\n", i->name); jobject obj = (jobject) userdata; + assert(obj); jclass cls = (*pulse_thread_env)->GetObjectClass(pulse_thread_env, obj); - jmethodID mid1 = (*pulse_thread_env)->GetMethodID(pulse_thread_env, cls, "update_channels_and_volume", "(IF)V"); - (*pulse_thread_env)->CallVoidMethod(pulse_thread_env, obj, mid1, (int) (i->volume).channels, (float) (i->volume).values[0]) ; + assert(cls); + jmethodID mid1 = (*pulse_thread_env)->GetMethodID(pulse_thread_env, cls, + "update_channels_and_volume", "(IF)V"); + assert(mid1); + (*pulse_thread_env)->CallVoidMethod(pulse_thread_env, obj, mid1, + (int) (i->volume).channels, (float) (i->volume).values[0]) ; } else { notifyWaitingOperations(pulse_thread_env); } } - + JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_native_1updateVolumeInfo(JNIEnv *env, jobject obj) { jclass cls = (*env)->GetObjectClass(env, obj); + assert(cls); jfieldID fid = (*env)->GetFieldID(env, cls, "name", "Ljava/lang/String;"); + assert(fid); jstring jstr = (*env)->GetObjectField(env, obj, fid); + assert(jstr); const char *name = (*env)->GetStringUTFChars(env, jstr, NULL); + if (name == NULL) { + return convertPointerToJavaLong(NULL); // oome + } + pa_context* context = (pa_context*) getJavaPointer(env, obj, "contextPointer"); + assert(context); obj = (*env)->NewGlobalRef(env, obj); pa_operation *o = pa_context_get_source_info_by_name (context, (char*) name, get_source_volume_callback, obj); + assert(o); return convertPointerToJavaLong(o); } JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_native_1setVolume(JNIEnv *env, jobject obj, jfloat value) { jclass cls = (*env)->GetObjectClass(env, obj); + assert(cls); + jfieldID fid = (*env)->GetFieldID(env, cls, "name", "Ljava/lang/String;"); + assert(fid); + jstring jstr = (*env)->GetObjectField(env, obj, fid); + assert(jstr); + const char *name = (*env)->GetStringUTFChars(env, jstr, NULL); + if (name == NULL) { + return convertPointerToJavaLong(NULL); // oome + } + pa_context* context = (pa_context*) getJavaPointer(env, obj, "contextPointer"); + assert(context); + obj = (*env)->NewGlobalRef(env, obj); fid = (*env)->GetFieldID(env, cls, "channels", "I"); + assert(fid); + jint channels = (*env)->GetIntField(env, obj, fid); pa_cvolume cv; + pa_operation *o = pa_context_set_source_volume_by_name (context, (char*) name,pa_cvolume_set(&cv, channels, value), source_callback, obj); + assert(o); + return convertPointerToJavaLong(o); }
--- a/src/native/org_classpath_icedtea_pulseaudio_PulseAudioTargetPort.c Tue Sep 02 17:23:01 2008 -0400 +++ b/src/native/org_classpath_icedtea_pulseaudio_PulseAudioTargetPort.c Wed Sep 03 10:47:27 2008 -0400 @@ -15,41 +15,80 @@ notifyWaitingOperations(pulse_thread_env); } -void get_sink_volume_callback(pa_context *context, const pa_sink_info *i, int eol, void *userdata) { - if(eol == 0) { - printf("%s\n", i->name); +void get_sink_volume_callback(pa_context *context, const pa_sink_info *i, + int eol, void *userdata) { + assert(context); + assert(pulse_thread_env); + + if (eol == 0) { + // printf("%s\n", i->name); jobject obj = (jobject) userdata; + assert(obj); jclass cls = (*pulse_thread_env)->GetObjectClass(pulse_thread_env, obj); - jmethodID mid1 = (*pulse_thread_env)->GetMethodID(pulse_thread_env, cls, "update_channels_and_volume", "(IF)V"); - (*pulse_thread_env)->CallVoidMethod(pulse_thread_env, obj, mid1, (int) (i->volume).channels, (float) (i->volume).values[0]) ; + assert(cls); + jmethodID mid1 = (*pulse_thread_env)->GetMethodID(pulse_thread_env, cls, + "update_channels_and_volume", "(IF)V"); + assert(mid1); + (*pulse_thread_env)->CallVoidMethod(pulse_thread_env, obj, mid1, + (int) (i->volume).channels, (float) (i->volume).values[0]) ; } else { notifyWaitingOperations(pulse_thread_env); } - } JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_PulseAudioTargetPort_native_1updateVolumeInfo(JNIEnv *env, jobject obj) { jclass cls = (*env)->GetObjectClass(env, obj); + assert(cls); + jfieldID fid = (*env)->GetFieldID(env, cls, "name", "Ljava/lang/String;"); + assert(fid); + jstring jstr = (*env)->GetObjectField(env, obj, fid); + assert(jstr); + const char *name = (*env)->GetStringUTFChars(env, jstr, NULL); + if (name == NULL) { + return convertPointerToJavaLong(NULL); // oome + } + pa_context* context = (pa_context*) getJavaPointer(env, obj, "contextPointer"); + assert(context); + obj = (*env)->NewGlobalRef(env, obj); + pa_operation *o = pa_context_get_sink_info_by_name (context, (char*) name, get_sink_volume_callback, obj); + assert(o); + return convertPointerToJavaLong(o); } JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_PulseAudioTargetPort_native_1setVolume(JNIEnv *env, jobject obj, jfloat value) { jclass cls = (*env)->GetObjectClass(env, obj); + assert(cls); + jfieldID fid = (*env)->GetFieldID(env, cls, "name", "Ljava/lang/String;"); + assert(fid); + jstring jstr = (*env)->GetObjectField(env, obj, fid); + assert(jstr); + const char *name = (*env)->GetStringUTFChars(env, jstr, NULL); + if (name == NULL) { + return convertPointerToJavaLong(NULL); // return oome + } + pa_context* context = (pa_context*) getJavaPointer(env, obj, "contextPointer"); + assert(context); + obj = (*env)->NewGlobalRef(env, obj); fid = (*env)->GetFieldID(env, cls, "channels", "I"); + assert(fid); + jint channels = (*env)->GetIntField(env, obj, fid); pa_cvolume cv; pa_operation *o = pa_context_set_sink_volume_by_name (context, (char*) name,pa_cvolume_set(&cv, channels, value), sink_callback, obj); + assert(o); + return convertPointerToJavaLong(o); }
--- a/src/native/org_classpath_icedtea_pulseaudio_Stream.c Tue Sep 02 17:23:01 2008 -0400 +++ b/src/native/org_classpath_icedtea_pulseaudio_Stream.c Wed Sep 03 10:47:27 2008 -0400 @@ -11,13 +11,12 @@ extern JNIEnv* pulse_thread_env; -static void set_sink_input_volume_callback(pa_context* context, int success,void* userdata) { +static void set_sink_input_volume_callback(pa_context* context, int success, + void* userdata) { notifyWaitingOperations(pulse_thread_env); } - - const char* getStringFromFormat(pa_sample_format_t format) { const char* value; @@ -499,6 +498,7 @@ JNIEXPORT jint JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1read (JNIEnv *env, jobject obj, jbyteArray array, jint length, jint offset) { pa_stream *stream = getJavaPointer(env, obj, "streamPointer"); + assert(stream); const void *read_data = NULL; size_t read_length = 0; pa_stream_peek(stream, &read_data, &read_length); @@ -520,6 +520,7 @@ (JNIEnv* env, jobject obj) { pa_stream* stream = (pa_stream*)getJavaPointer(env, obj, "streamPointer"); + assert(stream); const void* startLocation; size_t count; @@ -546,6 +547,7 @@ JNIEXPORT jint JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1drop (JNIEnv* env, jobject obj) { pa_stream* stream = (pa_stream*) getJavaPointer(env, obj, "streamPointer"); + assert(stream); return pa_stream_drop(stream); } @@ -557,6 +559,7 @@ JNIEXPORT jint JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1writable_1size (JNIEnv* env, jobject obj) { pa_stream* stream = (pa_stream*)getJavaPointer(env, obj, "streamPointer"); + assert(stream); size_t size = pa_stream_writable_size(stream); return size; @@ -570,6 +573,7 @@ JNIEXPORT jint JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1readable_1size (JNIEnv* env, jobject obj) { pa_stream* stream = (pa_stream*)getJavaPointer(env, obj, "streamPointer"); + assert(stream); return pa_stream_readable_size(stream); } @@ -577,6 +581,7 @@ assert(success); JNIEnv* env = pulse_thread_env; + assert(env); notifyWaitingOperations(env); } @@ -589,13 +594,16 @@ JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1drain (JNIEnv* env, jobject obj) { pa_stream* stream = (pa_stream*)getJavaPointer(env, obj, "streamPointer"); + assert(stream); pa_operation* operation = pa_stream_drain(stream, drain_callback, NULL); + assert(operation); return convertPointerToJavaLong(operation); } static void cork_callback(pa_stream* stream, int success, void* userdata) { assert(success); JNIEnv* env = pulse_thread_env; + assert(env); notifyWaitingOperations(env); } @@ -608,13 +616,16 @@ JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1cork (JNIEnv* env, jobject obj, jint yes) { pa_stream* stream = (pa_stream*)getJavaPointer(env, obj, "streamPointer"); + assert(stream); pa_operation* operation = pa_stream_cork(stream, yes, cork_callback, NULL); + assert(operation); return convertPointerToJavaLong(operation); } static void flush_callback(pa_stream* stream, int success, void* userdata) { assert(success); JNIEnv* env = pulse_thread_env; + assert(env); notifyWaitingOperations(env); } @@ -627,13 +638,16 @@ JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1flush (JNIEnv* env, jobject obj) { pa_stream* stream = (pa_stream*) getJavaPointer(env, obj, "streamPointer"); + assert(stream); pa_operation* operation = pa_stream_flush(stream, flush_callback, NULL); + assert(operation); return convertPointerToJavaLong(operation); } static void trigger_callback(pa_stream* stream, int success, void* userdata) { assert(success); JNIEnv* env = pulse_thread_env; + assert(env); notifyWaitingOperations(env); } @@ -646,7 +660,9 @@ JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1trigger (JNIEnv* env, jobject obj) { pa_stream* stream = (pa_stream*)getJavaPointer(env, obj, "streamPointer"); + assert(stream); pa_operation* operation = pa_stream_trigger(stream, trigger_callback, NULL); + assert(operation); return convertPointerToJavaLong(operation); } @@ -665,6 +681,8 @@ JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1set_1name (JNIEnv* env, jobject obj, jstring newName) { pa_stream* stream = (pa_stream*)getJavaPointer(env, obj, "streamPointer"); + assert(stream); + const char* name; name = (*env)->GetStringUTFChars(env, newName, NULL); if (name == NULL) { @@ -721,18 +739,26 @@ JNIEXPORT jobject JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1get_1sample_1spec (JNIEnv* env, jobject obj) { pa_stream* stream = (pa_stream*)getJavaPointer(env, obj, "streamPointer"); + assert(stream); + const pa_sample_spec* sample_spec = pa_stream_get_sample_spec(stream); + assert(sample_spec); char* name = "Lorg/classpath/icedtea/pulseaudio/StreamSampleSpecification;"; jclass cls = (*env)->FindClass(env, name); + assert(cls); jmethodID constructor_mid = (*env)->GetMethodID(env, cls, "<init>", "V"); + assert(constructor_mid); const char* formatString = getStringFromFormat(sample_spec->format); + assert(formatString); int rate = sample_spec->rate; int channels = sample_spec->channels; jstring format = (*env)->NewStringUTF(env, formatString); - + if ( format == NULL) { + return NULL; // oome + } jobject return_object = (*env)->NewObject(env, cls, constructor_mid, format, rate, channels); return return_object; @@ -766,7 +792,6 @@ jobject return_object = (*env)->NewObject(env, cls, constructor_mid, maxLength, targetLength, preBuffering, minimumRequest, fragmentSize); - assert(return_object); return return_object; } @@ -779,6 +804,7 @@ assert(success); JNIEnv* env = pulse_thread_env; + assert(env); notifyWaitingOperations(env); } @@ -837,6 +863,7 @@ void* userdata) { assert(success); JNIEnv* env = pulse_thread_env; + assert(env); notifyWaitingOperations(env); } @@ -861,11 +888,19 @@ JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1setVolume(JNIEnv *env, jobject obj, jfloat new_volume) { pa_stream *stream = getJavaPointer(env, obj, "streamPointer"); + assert(stream); + pa_context *context = pa_stream_get_context(stream); + assert(context); + int stream_id = pa_stream_get_index(stream); int channels = pa_stream_get_sample_spec(stream)->channels; pa_cvolume cv; - return convertPointerToJavaLong(pa_context_set_sink_input_volume(context, stream_id, pa_cvolume_set(&cv, channels, new_volume), set_sink_input_volume_callback, NULL)); + + pa_operation* o = pa_context_set_sink_input_volume(context, stream_id, pa_cvolume_set(&cv, channels, new_volume), set_sink_input_volume_callback, NULL); + assert(o); + + return convertPointerToJavaLong(o); }