view pulseaudio/src/native/org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.c @ 1322:a08ebb168e2f

2009-01-21 Omair Majid <omajid@redhat.com> * pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioClip.java: Remove unused variables volume and muted. (PulseAudioClip): Remove variable volume. (open): Remove muteControl, volume and muted. (native_setVolume): Rename to native_set_volume. (native_update_volume): New function. (isMuted): Remove. (setMuted): Remove. (setVolume): Rename to setCachedVolume. (getVolume): Rename to getCachedVolume. * pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioMuteControl.java: Remove file. Mute relied on chaning the volume only through the api. That assumption is invalid as the user can change volume through pulseaudio's controls. * pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioPlaybackLine.java (isMuted): Remove. (setMuted): Remove. (native_setVolume): Rename to native_set_volume. (native_update_volume): New function. (getVolume): Rename to getCachedVolume. (setVolume): Rename to setCachedVolume. * pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioPort.java: Remove muted and muteControl. Rename volume to cachedVolume. (PulseAudioPort): Remove muteControl. (isMuted): Remove function. (setMuted): Remove. (native_setVolume): Rename to native_set_volume. (native_updateVolumeInfo): Rename to native_update_volume. (setVolume): Rename to setCachedVolume. (getVolume): Rename to getCachedVolume. * pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java: Remove muteControl, muted and volume. (open): Remove muteControl. (native_setVolume): Rename to native_set_volume. (native_update_volume): New function. (isMuted): Remove. (setMuted): Remove. (getVolume): Rename to getCachedVolume. (setVolume): Rename to setCachedVolume. * pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourcePort.java (native_setVolume): Rename to native_set_volume. (native_updateVolumeInfo): Rename to native_update_volume. * pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetPort.java (native_setVolume): Rename to native_set_volume. (native_updateVolumeInfo): Rename to native_update_volume. * pulseaudio/src/java/org/classpath/icedtea/pulseaudio/PulseAudioVolumeControl.java (setValue): Dont check for mute. (getValue): Query pulseaudio for any change in volume. * pulseaudio/src/java/org/classpath/icedtea/pulseaudio/Stream.java: New variable cachedVolume. (native_setVolume): Rename to native_set_volume. (native_update_volume): New function. (getCachedVolume): New function. (setCachedVolume): New function. (update_channels_and_volume): New function. * pulseaudio/src/native/org_classpath_icedtea_pulseaudio_EventLoop.c (sink_input_volume_change_complete): Remove. (sink_input_change_volume): Remove. (Java_org_classpath_icedtea_pulseaudio_EventLoop_native_1set_1sink_1volume): Remove. * pulseaudio/src/native/org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.c (Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_native_1updateVolumeInfo): Rename to Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_native_1update_1volume. (Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_native_1setVolume): Rename to Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_native_1set_1volume. * pulseaudio/src/native/org_classpath_icedtea_pulseaudio_PulseAudioTargetPort.c (Java_org_classpath_icedtea_pulseaudio_PulseAudioTargetPort_native_1updateVolumeInfo): Rename to Java_org_classpath_icedtea_pulseaudio_PulseAudioTargetPort_native_1update_1volume. (Java_org_classpath_icedtea_pulseaudio_PulseAudioTargetPort_native_1setVolume): Rename to Java_org_classpath_icedtea_pulseaudio_PulseAudioTargetPort_native_1set_1volume. * pulseaudio/src/native/org_classpath_icedtea_pulseaudio_Stream.c (Java_org_classpath_icedtea_pulseaudio_Stream_native_1setVolume): Rename to Java_org_classpath_icedtea_pulseaudio_Stream_native_1set_1volume. (get_sink_input_volume_callback): New function. (Java_org_classpath_icedtea_pulseaudio_Stream_native_1update_1volume): New function. * pulseaudio/unittests/org/classpath/icedtea/pulseaudio/PulseAudioClipTest.java (testSupportedControls): Update to not check for MuteControl. * pulseaudio/unittests/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLineRawTest.java (testVolumeAndMute): Rename to testVolume. Remove test for MuteControl. * pulseaudio/unittests/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLineTest.java (testVolumeAndMute): Likewise. (testSupportedControls): Update to not check for MuteControl. * pulseaudio/unittests/org/classpath/icedtea/pulseaudio/PulseAudioSourcePortTest.java (testControls): Update to not check for MuteControl. * pulseaudio/unittests/org/classpath/icedtea/pulseaudio/PulseAudioTargetPortTest.java (testControls): Likewise.
author Omair Majid <omajid@redhat.com>
date Wed, 21 Jan 2009 17:17:47 -0500
parents 8b85ec866923
children
line wrap: on
line source

#include "org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.h"
#include "jni-common.h"
#include <pulse/pulseaudio.h>
#include <string.h>

typedef struct java_context {
	JNIEnv* env;
	jobject obj;
} java_context;

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) {
	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);
		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);
	}
}

/*
 * Class:     org_classpath_icedtea_pulseaudio_PulseAudioSourcePort
 * Method:    native_update_volume
 * Signature: ()[B
 */
JNIEXPORT jbyteArray JNICALL Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_native_1update_1volume
(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 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 convertNativePointerToJava(env, o);
}

/*
 * Class:     org_classpath_icedtea_pulseaudio_PulseAudioSourcePort
 * Method:    native_set_volume
 * Signature: (F)[B
 */
JNIEXPORT jbyteArray JNICALL Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_native_1set_1volume
(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 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 convertNativePointerToJava(env, o);
}