Mercurial > hg > pulseaudio
changeset 25:7fc1bc131b7e
volume stuff
committer: Ioana Ivan <iivan@redhat.com>
author | Ioana Ivan <iivan@redhat.com> |
---|---|
date | Thu, 31 Jul 2008 10:24:13 -0400 |
parents | 03101556665f |
children | bc8045fdeaf2 |
files | src/org/openjdk/sound/PulseAudioStreamVolumeControl.java src/org/openjdk/sound/PulseAudioVolumeControl.java src/org_openjdk_sound_PulseAudioStreamVolumeControl.c src/org_openjdk_sound_PulseAudioVolumeMuteControl.c src/org_openjdk_sound_PulseStreamAudioVolumeControl.c |
diffstat | 5 files changed, 167 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/openjdk/sound/PulseAudioStreamVolumeControl.java Thu Jul 31 10:24:13 2008 -0400 @@ -0,0 +1,28 @@ +package org.openjdk.sound; + + +public class PulseAudioStreamVolumeControl extends PulseAudioVolumeControl{ + private long streamPointer; + private long mainLoopPointer; + + static { + + String library = "/home/iivan/workspace/pulse-java" + java.io.File.separatorChar + "lib" + java.io.File.separatorChar + System.mapLibraryName("PulseAudioStreamVolumeControl"); + System.out.println(library); + System.load(library) ; + + } + + protected PulseAudioStreamVolumeControl(Type type, float minimum, + float maximum, float precision, int updatePeriod, + float initialValue, String units, long streamPointer, long mainLoopPointer) { + super(type, minimum, maximum, precision, updatePeriod, initialValue, units); + this.streamPointer = streamPointer; + this.mainLoopPointer = mainLoopPointer; + + } + + public native float getValue(); + public native void setValue(float newValue); + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org/openjdk/sound/PulseAudioVolumeControl.java Thu Jul 31 10:24:13 2008 -0400 @@ -0,0 +1,24 @@ +package org.openjdk.sound; + +import javax.sound.sampled.FloatControl; +import javax.sound.sampled.FloatControl.Type; + +public class PulseAudioVolumeControl extends FloatControl { + + + + protected PulseAudioVolumeControl(Type type, float minimum, float maximum, + float precision, int updatePeriod, float initialValue, String units) { + super(type, minimum, maximum, precision, updatePeriod, initialValue, units); + + } + + public native float getMaximum(); + + + + + + + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org_openjdk_sound_PulseAudioStreamVolumeControl.c Thu Jul 31 10:24:13 2008 -0400 @@ -0,0 +1,65 @@ +#include <jni.h> +#include <pulse/pulseaudio.h> +#include "org_openjdk_sound_PulseAudioStreamVolumeControl.h" + +typedef struct{ + pa_threaded_mainloop *mainloop; + pa_cvolume *volume; +} userdata_info; + +void *getJavaLongField(JNIEnv *env, jobject obj, char *fieldName) { + jclass cls = (*env)->GetObjectClass(env, obj); + jfieldID fid = (*env)->GetFieldID(env, cls, fieldName, "J"); + jlong value = (*env)->GetLongField(env, obj, fid); + //(*env)->DeleteLocalReference(cls); + return (void *) value; +} + +static void sink_input_change_volume(pa_context* context, const pa_sink_input_info* sink_input_info, int eol, void* userdata) { + assert(context); + if (eol) { + return; + } + assert(sink_input_info); + + + (((userdata_info *) userdata)->volume)->channels = sink_input_info->volume.channels; + int j; + for (j = 0; j < (((userdata_info *)userdata)->volume)->channels; j++) { + (((userdata_info *)userdata)->volume)->values[j] = sink_input_info->volume.values[j]; + } + pa_threaded_mainloop_signal(((userdata_info *) userdata)->mainloop, 0); + +} + +JNIEXPORT jfloat JNICALL Java_org_openjdk_sound_PulseAudioStreamVolumeControl_getValue(JNIEnv *env, jobject obj) { + pa_stream *stream = getJavaLongField(env, obj, "streamPointer"); + pa_threaded_mainloop *mainloop = getJavaLongField(env, obj, "mainLoopPointer"); + pa_context *context = pa_stream_get_context(stream); + int stream_id = pa_stream_get_index(stream); + + userdata_info *userdata = malloc(sizeof(userdata_info)); + userdata->mainloop = mainloop; + userdata->volume = malloc(sizeof(pa_cvolume)); + pa_threaded_mainloop_lock(mainloop); + pa_operation *o = pa_context_get_sink_input_info((pa_context*) context ,stream_id,sink_input_change_volume, userdata); + while(pa_operation_get_state(o) != PA_OPERATION_DONE) { + pa_threaded_mainloop_wait(mainloop); + } + pa_operation_unref(o); + pa_threaded_mainloop_unlock(mainloop); + return pa_sw_volume_to_dB(userdata->volume->values[0]); + +} + +JNIEXPORT void JNICALL Java_org_openjdk_sound_PulseAudioStreamVolumeControl_setValue (JNIEnv *env, jobject obj, jfloat new_volume) { + pa_stream *stream = getJavaLongField(env, obj, "streamPointer"); + pa_context *context = pa_stream_get_context(stream); + int stream_id = pa_stream_get_index(stream); + int channels = pa_stream_get_sample_spec(stream)->channels; + pa_cvolume cv; + pa_context_set_sink_input_by_index(context, stream_id, pa_cvolume_set(&cv, channels, pa_sw_volume_from_dB(new_volume)), NULL, NULL); +} + + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org_openjdk_sound_PulseAudioVolumeMuteControl.c Thu Jul 31 10:24:13 2008 -0400 @@ -0,0 +1,25 @@ + + void *getJavaLongField(JNIEnv *env, jobject obj, char *fieldName) { + jclass cls = (*env)->GetObjectClass(env, obj); + jfieldID fid = (*env)->GetFieldID(env, cls, fieldName, "J"); + jlong value = (*env)->GetLongField(env, obj, fid); + //(*env)->DeleteLocalReference(cls); + return (void *) value; +} + +static void sink_input_change_volume(pa_context* context, const pa_sink_input_info* input_info, int eol, void* userdata) { + assert(context); + if (eol) { + return; + } + assert(i); + userdata = i->volume; +} + +JNIEXPORT jint JNICALL Java_org_openjdk_sound_PulseAudioStreamVolumeControl_getValue(JNIEnv env*, jobject obj) { + pa_stream *stream = getJavaLongField(env, obj, "streamPointer"); + int stream_id pa_stream_get_index(stream); + pa_cvolume *volume; + pa_context_get_sink_input_info((pa_context*) contextPointer ,stream_id,sink_input_change_volume, volume); + printf("%d\n", volume->values[0]); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/org_openjdk_sound_PulseStreamAudioVolumeControl.c Thu Jul 31 10:24:13 2008 -0400 @@ -0,0 +1,25 @@ + + void *getJavaLongField(JNIEnv *env, jobject obj, char *fieldName) { + jclass cls = (*env)->GetObjectClass(env, obj); + jfieldID fid = (*env)->GetFieldID(env, cls, fieldName, "J"); + jlong value = (*env)->GetLongField(env, obj, fid); + //(*env)->DeleteLocalReference(cls); + return (void *) value; +} + +static void sink_input_change_volume(pa_context* context, const pa_sink_input_info* input_info, int eol, void* userdata) { + assert(context); + if (eol) { + return; + } + assert(i); + userdata = i->volume; +} + +JNIEXPORT jint JNICALL Java_org_openjdk_sound_PulseAudioStreamVolumeControl_getValue(JNIEnv env*, jobject obj) { + pa_stream *stream = getJavaLongField(env, obj, "streamPointer"); + int stream_id pa_stream_get_index(stream); + pa_cvolume *volume; + pa_context_get_sink_input_info((pa_context*) contextPointer ,stream_id,sink_input_change_volume, volume); + printf("%d\n", volume->values[0]); +}