changeset 103:e99d53a7bcfa

2008-08-29 Omair Majid <omajid@redhat.com> * build.xml: Removed header generation for classes with no native methods. * src/java/org/classpath/icedtea/pulseaudio/EventLoop.java Parameterized {target,source}PortNameList. Gets rid of a few warnings. * src/java/org/classpath/icedtea/pulseaudio/PulseAudioClip.java (writeFrames): Commented out debug output. * src/java/org/claspath/icedtea/pulseaudio/PulseAudioSourcePort.java (addLineListener): Implemented method. (close): Commented out unimplemented stuff. (nativeClose): Changed return type to long (since it can return a 64 bit pointer). (getControl): Implemented function. (getControls): Likewise. (getName): New function. (isOpen): Implemented function. (open): Commented out unimplemented stuff. (nativeOpen): Changed return type to long. (removeLineListener): Implemented function. * src/native/org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.c (Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_nativeClose): Added stub for future implementeation. (Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_nativeOpen): Likewise. * unittests/org/classpath/icedtea/pulseaudio/PulseAudioClipTest.java (testPlayTwoClips): New function. Tests http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=173 . * unittests/org/classpath/icedtea/pulseaudio/PulseAudioMixerTest.java (testSourceLinesExist): Fixed function to work with SourcePorts as well as SourceDataLines. (testTargetLinesExist): Fixed function to work with Target{Ports,DataLines}. (testSourceLinesOpenAndClose): Fixed to work with ports and sourcedatalines. (testTargetLinesOpenAndClose): Fixed to work with ports and target data lines.
author Omair Majid <omajid@redhat.com>
date Fri, 29 Aug 2008 16:26:10 -0400
parents cf375df7c7b7
children fd7d965da555
files build.xml src/java/org/classpath/icedtea/pulseaudio/EventLoop.java src/java/org/classpath/icedtea/pulseaudio/PulseAudioClip.java src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourcePort.java src/native/Makefile.am src/native/org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.c unittests/org/classpath/icedtea/pulseaudio/PulseAudioClipTest.java unittests/org/classpath/icedtea/pulseaudio/PulseAudioMixerTest.java
diffstat 8 files changed, 148 insertions(+), 67 deletions(-) [+]
line wrap: on
line diff
--- a/build.xml	Thu Aug 28 16:16:38 2008 -0400
+++ b/build.xml	Fri Aug 29 16:26:10 2008 -0400
@@ -38,12 +38,8 @@
 			<class name="org.classpath.icedtea.pulseaudio.EventLoop"/>
 			<class name="org.classpath.icedtea.pulseaudio.Operation"/>
 			<class name="org.classpath.icedtea.pulseaudio.Stream"/>
-			<class name="org.classpath.icedtea.pulseaudio.PulseAudioTargetDataLine"/>
-			<class name="org.classpath.icedtea.pulseaudio.PulseAudioStreamVolumeControl"/>
-			<class name="org.classpath.icedtea.pulseaudio.PulseAudioDataLine"/>
 			<class name="org.classpath.icedtea.pulseaudio.PulseAudioSourcePort"/>
 			<class name="org.classpath.icedtea.pulseaudio.PulseAudioTargetPort"/>
-			<class name="org.classpath.icedtea.pulseaudio.PulseAudioTargetPortVolumeControl"/>
 		</javah>
 	</target>
 
--- a/src/java/org/classpath/icedtea/pulseaudio/EventLoop.java	Thu Aug 28 16:16:38 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/EventLoop.java	Fri Aug 29 16:26:10 2008 -0400
@@ -72,8 +72,8 @@
 
 	public Semaphore finished = new Semaphore(0);
 	
-	private List<String> targetPortNameList = new ArrayList();
-	private List<String> sourcePortNameList = new ArrayList();
+	private List<String> targetPortNameList = new ArrayList<String>();
+	private List<String> sourcePortNameList = new ArrayList<String>();
 
 	/*
 	 * JNI stuff
--- a/src/java/org/classpath/icedtea/pulseaudio/PulseAudioClip.java	Thu Aug 28 16:16:38 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/PulseAudioClip.java	Fri Aug 29 16:26:10 2008 -0400
@@ -54,7 +54,8 @@
 import javax.sound.sampled.LineUnavailableException;
 import javax.sound.sampled.Control.Type;
 
-public class PulseAudioClip extends PulseAudioDataLine implements Clip, PulseAudioPlaybackLine {
+public class PulseAudioClip extends PulseAudioDataLine implements Clip,
+		PulseAudioPlaybackLine {
 
 	private byte[] data = null;
 
@@ -130,7 +131,7 @@
 					Thread.currentThread().interrupt();
 					break;
 				}
-				System.out.println("remaining frames" + remainingFrames);
+				// System.out.println("remaining frames" + remainingFrames);
 			}
 		}
 	}
@@ -213,7 +214,7 @@
 			if (control.getClass() == BooleanControl.Type.MUTE.getClass()) {
 				return controls.get(1);
 			}
-			
+
 			if (control.getClass() == FloatControl.Type.VOLUME.getClass()) {
 				return controls.get(0);
 			}
@@ -344,17 +345,17 @@
 
 		PulseAudioVolumeControl volumeControl = new PulseAudioVolumeControl(
 				this, eventLoop);
-		PulseAudioMuteControl muteControl = new PulseAudioMuteControl(
-				this, volumeControl);
+		PulseAudioMuteControl muteControl = new PulseAudioMuteControl(this,
+				volumeControl);
 		controls.add(volumeControl);
 		controls.add(muteControl);
 
 	}
-	
+
 	public int native_setVolume(float value) {
 		return stream.native_setVolume(value);
 	}
-	
+
 	public boolean isMuted() {
 		return muted;
 	}
--- a/src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourcePort.java	Thu Aug 28 16:16:38 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourcePort.java	Fri Aug 29 16:26:10 2008 -0400
@@ -1,5 +1,8 @@
 package org.classpath.icedtea.pulseaudio;
 
+import java.util.LinkedList;
+import java.util.List;
+
 import javax.sound.sampled.Control;
 import javax.sound.sampled.LineListener;
 import javax.sound.sampled.LineUnavailableException;
@@ -7,48 +10,58 @@
 import javax.sound.sampled.Control.Type;
 
 public class PulseAudioSourcePort implements Port {
-	
+
 	private String name;
+
+	@SuppressWarnings("unused")
 	private long contextPointer;
+
 	private EventLoop eventLoop;
-	
+
+	private boolean isOpen;
+
+	private List<LineListener> lineListeners = new LinkedList<LineListener>();
+
 	public PulseAudioSourcePort(String name, EventLoop eventLoop) {
+		System.out.println("new SourcePort constructed");
 		this.name = name;
 		this.contextPointer = eventLoop.getContextPointer();
 		this.eventLoop = eventLoop;
-		System.out.println("Opened Source Port" + name);
+		System.out.println("Opened Source Port: " + name);
 	}
 
 	@Override
 	public void addLineListener(LineListener listener) {
-		// TODO Auto-generated method stub
+		synchronized (lineListeners) {
+			lineListeners.add(listener);
+		}
 	}
 
 	@Override
 	public void close() {
 		Operation operation;
 
-		synchronized (eventLoop.threadLock) {
-			operation = new Operation(nativeClose());
-		}
+//		synchronized (eventLoop.threadLock) {
+//			operation = new Operation(nativeClose());
+//		}
+//
+//		operation.waitForCompletion();
+//		operation.releaseReference();
 
-		operation.waitForCompletion();
-		operation.releaseReference();
-		
+		isOpen = false;
 	}
-	
-	private native int nativeClose();
+
+	private native long nativeClose();
 
 	@Override
 	public Control getControl(Type control) {
-		// TODO Auto-generated method stub
-		return null;
+		throw new IllegalArgumentException(control.toString()
+				+ " not supported");
 	}
 
 	@Override
 	public Control[] getControls() {
-		// TODO Auto-generated method stub
-		return null;
+		return new Control[] {};
 	}
 
 	@Override
@@ -57,36 +70,44 @@
 		return null;
 	}
 
+	public String getName() {
+		return this.name;
+
+	}
+
 	@Override
 	public boolean isControlSupported(Type control) {
-		// TODO Auto-generated method stub
 		return false;
 	}
 
 	@Override
 	public boolean isOpen() {
-		// TODO Auto-generated method stub
-		return false;
+		return isOpen;
 	}
 
 	@Override
 	public void open() throws LineUnavailableException {
+		System.out.println("SourcePort opened");
 		Operation operation;
 
-		synchronized (eventLoop.threadLock) {
-			operation = new Operation(nativeOpen());
-		}
+//		synchronized (eventLoop.threadLock) {
+//			operation = new Operation(nativeOpen());
+//		}
+//
+//		operation.waitForCompletion();
+//		operation.releaseReference();
 
-		operation.waitForCompletion();
-		operation.releaseReference();
+		isOpen = true;
 	}
-	
-	private native int nativeOpen();
+
+	private native long nativeOpen();
 
 	@Override
 	public void removeLineListener(LineListener listener) {
-		// TODO Auto-generated method stub
-		
+		synchronized (lineListeners) {
+			lineListeners.remove(listener);
+		}
+
 	}
 
 }
--- a/src/native/Makefile.am	Thu Aug 28 16:16:38 2008 -0400
+++ b/src/native/Makefile.am	Fri Aug 29 16:26:10 2008 -0400
@@ -9,10 +9,10 @@
 	org_classpath_icedtea_pulseaudio_Operation.c \
 	org_classpath_icedtea_pulseaudio_Stream.c \
 	org_classpath_icedtea_pulseaudio_Stream.h \
+	org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.h \
 	org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.c \
-        org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.h \
 	org_classpath_icedtea_pulseaudio_PulseAudioTargetPort.c \
-        org_classpath_icedtea_pulseaudio_PulseAudioTargetPort.h 
+    org_classpath_icedtea_pulseaudio_PulseAudioTargetPort.h 
 
 
  
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/native/org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.c	Fri Aug 29 16:26:10 2008 -0400
@@ -0,0 +1,25 @@
+#include "org_classpath_icedtea_pulseaudio_PulseAudioSourcePort.h"
+
+#include "jni-common.h"
+
+/*
+ * Class:     org_classpath_icedtea_pulseaudio_PulseAudioSourcePort
+ * Method:    nativeClose
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_nativeClose
+(JNIEnv* env, jobject obj) {
+	return convertPointerToJavaLong(NULL);
+}
+
+/*
+ * Class:     org_classpath_icedtea_pulseaudio_PulseAudioSourcePort
+ * Method:    nativeOpen
+ * Signature: ()J
+ */
+JNIEXPORT jlong JNICALL Java_org_classpath_icedtea_pulseaudio_PulseAudioSourcePort_nativeOpen
+(JNIEnv* env, jobject obj) {
+	return convertPointerToJavaLong(NULL);
+
+}
+
--- a/unittests/org/classpath/icedtea/pulseaudio/PulseAudioClipTest.java	Thu Aug 28 16:16:38 2008 -0400
+++ b/unittests/org/classpath/icedtea/pulseaudio/PulseAudioClipTest.java	Fri Aug 29 16:26:10 2008 -0400
@@ -184,6 +184,37 @@
 
 	}
 
+	/*
+	 * 
+	 * modified version of the sample code at
+	 * http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=173
+	 * 
+	 */
+
+	@Test
+	public void testPlayTwoClips() {
+		try {
+			Clip clip1 = (Clip) mixer.getLine(new Line.Info(Clip.class));
+			File soundFile1 = new File("testsounds/startup.wav");
+			AudioInputStream audioInputStream1 = AudioSystem
+					.getAudioInputStream(soundFile1);
+			clip1.open(audioInputStream1);
+
+			Clip clip2 = (Clip) mixer.getLine(new Line.Info(Clip.class));
+			File soundFile2 = new File("testsounds/logout.wav");
+			AudioInputStream audioInputStream2 = AudioSystem
+					.getAudioInputStream(soundFile2);
+			clip2.open(audioInputStream2);
+
+			clip1.start();
+			clip2.start();
+			
+		} catch (Exception e) {
+			e.printStackTrace();
+		}
+
+	}
+
 	@After
 	public void tearDown() {
 
--- a/unittests/org/classpath/icedtea/pulseaudio/PulseAudioMixerTest.java	Thu Aug 28 16:16:38 2008 -0400
+++ b/unittests/org/classpath/icedtea/pulseaudio/PulseAudioMixerTest.java	Fri Aug 29 16:26:10 2008 -0400
@@ -49,7 +49,6 @@
 import javax.sound.sampled.LineUnavailableException;
 import javax.sound.sampled.Mixer;
 import javax.sound.sampled.Port;
-import javax.sound.sampled.SourceDataLine;
 import javax.sound.sampled.TargetDataLine;
 
 import junit.framework.JUnit4TestAdapter;
@@ -63,6 +62,9 @@
 
 	PulseAudioMixer selectedMixer;
 
+	AudioFormat aSupportedFormat = new AudioFormat(
+			AudioFormat.Encoding.PCM_UNSIGNED, 44100f, 8, 1, 1, 10, true);
+
 	public static junit.framework.Test suite() {
 		return new JUnit4TestAdapter(PulseAudioMixerTest.class);
 	}
@@ -152,9 +154,8 @@
 		for (Line.Info lineInfo : allLineInfo) {
 			System.out.println("Source Line " + j++ + ": "
 					+ lineInfo.getLineClass());
-			SourceDataLine sourceDataLine = (SourceDataLine) selectedMixer
-					.getLine(lineInfo);
-			assertNotNull(sourceDataLine);
+			Line sourceLine = (Line) selectedMixer.getLine(lineInfo);
+			assertNotNull(sourceLine);
 
 		}
 
@@ -170,9 +171,8 @@
 		for (Line.Info lineInfo : allLineInfo) {
 			System.out.println("Target Line " + j++ + ": "
 					+ lineInfo.getLineClass());
-			TargetDataLine targetDataLine = (TargetDataLine) selectedMixer
-					.getLine(lineInfo);
-			assertNotNull(targetDataLine);
+			Line targetLine = (Line) selectedMixer.getLine(lineInfo);
+			assertNotNull(targetLine);
 
 		}
 
@@ -263,17 +263,17 @@
 		System.out.println("This test checks if source lines open and close");
 		selectedMixer.open();
 
-		AudioFormat wantedFormat = new AudioFormat(
-				AudioFormat.Encoding.PCM_UNSIGNED, 44100f, 8, 1, 1, 10, true);
-
 		Line.Info allLineInfo[] = selectedMixer.getSourceLineInfo();
 		for (Line.Info lineInfo : allLineInfo) {
-			SourceDataLine sourceDataLine = (SourceDataLine) selectedMixer
-					.getLine(lineInfo);
+			Line sourceLine = (Line) selectedMixer.getLine(lineInfo);
 			System.out.println("opening line");
-			sourceDataLine.open(wantedFormat);
-			System.out.println("closing line");
-			sourceDataLine.close();
+			try {
+				sourceLine.open();
+				System.out.println("closing line");
+				sourceLine.close();
+			} catch (IllegalArgumentException e) {
+				assert (sourceLine.getClass() == PulseAudioClip.class);
+			}
 		}
 	}
 
@@ -282,17 +282,24 @@
 		System.out.println("This test checks if source lines open and close");
 		selectedMixer.open();
 
-		AudioFormat wantedFormat = new AudioFormat(
-				AudioFormat.Encoding.PCM_UNSIGNED, 44100f, 8, 1, 1, 10, true);
-
 		Line.Info allLineInfo[] = selectedMixer.getTargetLineInfo();
 		for (Line.Info lineInfo : allLineInfo) {
-			TargetDataLine targetDataLine = (TargetDataLine) selectedMixer
-					.getLine(lineInfo);
-			System.out.println("opening line");
-			targetDataLine.open(wantedFormat);
-			System.out.println("closing line");
-			targetDataLine.close();
+			try {
+				TargetDataLine targetLine = (TargetDataLine) selectedMixer
+						.getLine(lineInfo);
+				Assert.assertNotNull(targetLine);
+				System.out.println("opening line");
+				targetLine.open(aSupportedFormat);
+				System.out.println("closing line");
+				targetLine.close();
+			} catch (ClassCastException cce) {
+				Port targetLine = (Port) selectedMixer.getLine(lineInfo);
+				Assert.assertNotNull(targetLine);
+				targetLine.open();
+				System.out.println("closing line");
+				targetLine.close();
+			}
+
 		}
 	}