Mercurial > hg > pulseaudio
changeset 84:d3ed87d80d16
2008-08-15 Omair Majid <omajid@redhat.com>
* src/java/org/classpath/icedtea/pulseaudio/Stream.java: implemented
drop() and peek()
* src/native/org_classpath_icedtea_pulseaudio_Stream.c: added a prototype
for stream_started_callback(), more cleanup on an error in new().
implmeneted peek() and drop()
author | Omair Majid <omajid@redhat.com> |
---|---|
date | Fri, 15 Aug 2008 17:09:53 -0400 |
parents | 543d5b1cef67 |
children | dc7a6d1c130e |
files | src/java/org/classpath/icedtea/pulseaudio/Stream.java src/native/org_classpath_icedtea_pulseaudio_Stream.c |
diffstat | 2 files changed, 71 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/java/org/classpath/icedtea/pulseaudio/Stream.java Fri Aug 15 15:46:53 2008 -0400 +++ b/src/java/org/classpath/icedtea/pulseaudio/Stream.java Fri Aug 15 17:09:53 2008 -0400 @@ -97,13 +97,9 @@ private native int native_pa_stream_write(byte[] data, int offset, int length); - /* - * private native int native_pa_stream_peek (pa_stream *p, const void - * **data, size_t *nbytes) Read the next fragment from the buffer (for - * recording). int pa_stream_drop (pa_stream *p) Remove the current fragment - * on record streams. - * - */ + private native byte[] native_pa_stream_peek(); + + private native int native_pa_stream_drop(); private native int native_pa_stream_writable_size(); @@ -336,7 +332,7 @@ int returnValue = native_pa_stream_connect_playback(deviceName, 0, 0, 0, 0); - assert(returnValue == 0); + assert (returnValue == 0); } /** @@ -345,7 +341,7 @@ */ public void connectForRecording(String deviceName) { int returnValue = native_pa_stream_connect_record(deviceName, 0, 0); - assert(returnValue == 0); + assert (returnValue == 0); } /** @@ -353,8 +349,8 @@ */ public void disconnect() { int returnValue = native_pa_stream_disconnect(); - assert(returnValue == 0); - } + assert (returnValue == 0); + } /** * Write data to the server @@ -373,8 +369,8 @@ * * @param data */ - public void peek(byte[] data) { - + public byte[] peek() { + return native_pa_stream_peek(); } /** @@ -382,7 +378,7 @@ * Remove the current fragment on record streams. */ public void drop() { - + native_pa_stream_drop(); } /** @@ -467,7 +463,7 @@ */ @SuppressWarnings("unused") private void playbackStartedCallback() { - assert(false); + assert (false); synchronized (playbackStartedListeners) { for (PlaybackStartedListener listener : playbackStartedListeners) { listener.update();
--- a/src/native/org_classpath_icedtea_pulseaudio_Stream.c Fri Aug 15 15:46:53 2008 -0400 +++ b/src/native/org_classpath_icedtea_pulseaudio_Stream.c Fri Aug 15 17:09:53 2008 -0400 @@ -96,9 +96,23 @@ } // requires pulseaudio 0.9.11 :( -//static void stream_started_callback(pa_stream *p, void *userdata) { -// printf("stream_started_callback called\n"); -//} +/* + static void stream_started_callback(pa_stream *p, void *userdata) { + printf("stream_started_callback called\n"); + java_context* context = userdata; + assert(stream); + assert(context); + assert(context->env); + assert(context->obj); + + if (pa_stream_get_state(stream) == PA_STREAM_CREATING) { + callJavaVoidMethod(context->env, context->obj, "playbackStartedCallback"); + } else { + callJavaVoidMethod(pulse_thread_env, context->obj, "playbackStartedCallback"); + } + + } + */ static void stream_latency_update_callback(pa_stream *stream, void *userdata) { printf("stream_latency_update_callback called\n"); @@ -160,6 +174,7 @@ (JNIEnv* env, jobject obj, jlong contextPointer, jstring nameString, jstring encodingString, jint sampleRate, jint channels) { java_context* j_context = malloc(sizeof(java_context)); + assert(j_context); j_context->env = env; j_context->obj = (*env)->NewGlobalRef(env, obj); @@ -169,6 +184,8 @@ if (nameString) { name = (*env)->GetStringUTFChars(env,nameString, NULL); if (name == NULL) { + (*env)->DeleteGlobalRef(env, obj); + free(j_context); return; // oome thrown } } @@ -199,6 +216,8 @@ throwByName(env, "java/lang/IllegalArgumentException", "Invalid format"); /* clean up */ (*env)->ReleaseStringUTFChars(env, encodingString, encoding); + free(j_context); + (*env)->DeleteGlobalRef(env, obj); return; } @@ -400,6 +419,44 @@ /* * Class: org_classpath_icedtea_pulseaudio_Stream + * Method: native_pa_stream_peek + * Signature: ()[B + */ +JNIEXPORT jbyteArray JNICALL Java_org_classpath_icedtea_pulseaudio_Stream_native_1pa_1stream_1peek +(JNIEnv* env, jobject obj) { + + pa_stream* stream = (pa_stream*)getJavaPointer(env, obj, "streamPointer"); + const void* startLocation; + size_t count; + + if ( pa_stream_peek(stream, &startLocation, &count) < 0 ) { + return NULL; + } + + jsize length = count; + jbyteArray data = (*env)->NewByteArray(env, length); + + if ( data == NULL) { + return NULL; // oome thrown + } + + (*env)->SetByteArrayRegion(env, data, 0, count, startLocation); + return data; +} + +/* + * Class: org_classpath_icedtea_pulseaudio_Stream + * Method: native_pa_stream_drop + * Signature: ()I + */ +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"); + return pa_stream_drop(stream); +} + +/* + * Class: org_classpath_icedtea_pulseaudio_Stream * Method: native_pa_stream_writable_size * Signature: ()I */