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]);
+}