changeset 122:d4bb2fa0df23

2008-09-12 Omair Majid <omajid@redhat.com> * src/java/org/classpath/icedtea/pulseaudio/Eventloop.java Fixed static initializer. Removed debug output from static initializer. * src/java/org/classpath/icedtea/pulseaudio/Operation.java Likewise. * src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourcePort.java Likewise. * src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetPort.java Likewise. * src/java/org/classpath/icedtea/pulseaudio/PulseAudioVolumeControl.java Likewise. * src/java/org/classpath/icedtea/pulseaudio/Stream.java Likewise. * src/java/org/classpath/icedtea/pulseaudio/PulseAudioPort.java Likewise. * src/java/org/classpath/icedtea/pulseaudio/PulseAudioMixer.java Added staticSourceLineInfos and staticTargetLineInfos to store Line.Info objects which are initialized only in the constructor. sourceLineInfos and targetLineInfos are now rebuilt whenever the mixer is opened. (PulseAudioMixer): Initialize static{Source,Target}LineInfos. (close): Call refreshSourceAndTargetLines to remove the Ports. (open): Likewise. (refreshSourceAndTargetLines): clear the {source,target}LineInfos and use the static version to initialize new ones. * unittests/org/classpath/icedtea/pulseaudio/PulseAudioMixerTest.java (testTargetLinesExist): Now tests for the existance of Port and TargetDataLine. (testSaneNumberOfPorts): New test. Checks that not too many ports are exported (which whould be a bug). (testGetTargetPortInfo): Now checks that the object is a Port and is not a source port. (testGetSourcePortInfo): Now checks that the ojbect is a Port ans is not a target port.
author Omair Majid <omajid@redhat.com>
date Fri, 12 Sep 2008 12:44:34 -0400
parents b10eef873d2d
children cd7041f7a655
files src/java/org/classpath/icedtea/pulseaudio/EventLoop.java src/java/org/classpath/icedtea/pulseaudio/Operation.java src/java/org/classpath/icedtea/pulseaudio/PulseAudioMixer.java src/java/org/classpath/icedtea/pulseaudio/PulseAudioPort.java src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourcePort.java src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetPort.java src/java/org/classpath/icedtea/pulseaudio/PulseAudioVolumeControl.java src/java/org/classpath/icedtea/pulseaudio/Stream.java unittests/org/classpath/icedtea/pulseaudio/PulseAudioMixerTest.java
diffstat 9 files changed, 162 insertions(+), 46 deletions(-) [+]
line wrap: on
line diff
--- a/src/java/org/classpath/icedtea/pulseaudio/EventLoop.java	Fri Sep 12 11:26:43 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/EventLoop.java	Fri Sep 12 12:44:34 2008 -0400
@@ -110,8 +110,8 @@
 			String library = new java.io.File(".").getCanonicalPath()
 					+ java.io.File.separatorChar
 					+ System.mapLibraryName("pulse-java");
-			System.out.println(EventLoop.class.getCanonicalName() + ": "
-					+ library);
+			// System.out.println(EventLoop.class.getCanonicalName() + ": "
+			//					+ library);
 			System.load(library);
 		} catch (IOException e) {
 			assert ("Loading failed".endsWith("library"));
--- a/src/java/org/classpath/icedtea/pulseaudio/Operation.java	Fri Sep 12 11:26:43 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/Operation.java	Fri Sep 12 12:44:34 2008 -0400
@@ -63,8 +63,8 @@
 			String library = new java.io.File(".").getCanonicalPath()
 					+ java.io.File.separatorChar
 					+ System.mapLibraryName("pulse-java");
-			System.out.println(Operation.class.getCanonicalName() + ": "
-					+ library);
+			// System.out.println(Operation.class.getCanonicalName() + ": "
+			// + library);
 			System.load(library);
 		} catch (IOException e) {
 			assert ("Loading failed".endsWith("library"));
--- a/src/java/org/classpath/icedtea/pulseaudio/PulseAudioMixer.java	Fri Sep 12 11:26:43 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/PulseAudioMixer.java	Fri Sep 12 12:44:34 2008 -0400
@@ -71,7 +71,10 @@
 	public Thread eventLoopThread;
 
 	private List<Line.Info> sourceLineInfos = new ArrayList<Line.Info>();
+	private List<Line.Info> staticSourceLineInfos = new ArrayList<Line.Info>();
+
 	private List<Line.Info> targetLineInfos = new ArrayList<Line.Info>();
+	private List<Line.Info> staticTargetLineInfos = new ArrayList<Line.Info>();
 
 	private static PulseAudioMixer _instance = null;
 
@@ -88,15 +91,15 @@
 	private PulseAudioMixer() {
 		AudioFormat[] formats = getSupportedFormats();
 
-		sourceLineInfos.add(new DataLine.Info(SourceDataLine.class, formats,
-				StreamBufferAttributes.MIN_VALUE,
+		staticSourceLineInfos.add(new DataLine.Info(SourceDataLine.class,
+				formats, StreamBufferAttributes.MIN_VALUE,
 				StreamBufferAttributes.MAX_VALUE));
-		sourceLineInfos.add(new DataLine.Info(Clip.class, formats,
+		staticSourceLineInfos.add(new DataLine.Info(Clip.class, formats,
 				StreamBufferAttributes.MIN_VALUE,
 				StreamBufferAttributes.MAX_VALUE));
 
-		targetLineInfos.add(new DataLine.Info(TargetDataLine.class, formats,
-				StreamBufferAttributes.MIN_VALUE,
+		staticTargetLineInfos.add(new DataLine.Info(TargetDataLine.class,
+				formats, StreamBufferAttributes.MIN_VALUE,
 				StreamBufferAttributes.MAX_VALUE));
 
 	}
@@ -442,6 +445,8 @@
 		synchronized (lineListeners) {
 			lineListeners.clear();
 		}
+		
+		refreshSourceAndTargetLines();
 
 	}
 
@@ -592,6 +597,8 @@
 		// sourceLineInfo and targetLineInfo need to be updated with
 		// port infos, which can only be obtained after EventLoop had started
 
+		refreshSourceAndTargetLines();
+
 		for (String portName : eventLoop.updateSourcePortNameList()) {
 			sourceLineInfos.add(new Port.Info(Port.class, portName, true));
 		}
@@ -680,4 +687,15 @@
 		targetLines.remove(line);
 	}
 
+	void refreshSourceAndTargetLines() {
+
+		sourceLineInfos.clear();
+		targetLineInfos.clear();
+
+		sourceLineInfos.addAll(staticSourceLineInfos);
+
+		targetLineInfos.addAll(staticTargetLineInfos);
+
+	}
+
 }
--- a/src/java/org/classpath/icedtea/pulseaudio/PulseAudioPort.java	Fri Sep 12 11:26:43 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/PulseAudioPort.java	Fri Sep 12 12:44:34 2008 -0400
@@ -37,6 +37,8 @@
 
 package org.classpath.icedtea.pulseaudio;
 
+import java.io.IOException;
+
 import javax.sound.sampled.AudioSystem;
 import javax.sound.sampled.LineEvent;
 import javax.sound.sampled.LineUnavailableException;
@@ -63,6 +65,19 @@
 	private PulseAudioMuteControl muteControl;
 	private PulseAudioVolumeControl volumeControl;
 
+	static {
+		try {
+			String library = new java.io.File(".").getCanonicalPath()
+					+ java.io.File.separatorChar
+					+ System.mapLibraryName("pulse-java");
+			// System.out.println(PulseAudioVolumeControl.class.getCanonicalName()
+			// + ": " + library);
+			System.load(library);
+		} catch (IOException e) {
+			assert ("Loading failed".endsWith("library"));
+		}
+	}
+
 	public PulseAudioPort(String name, EventLoop eventLoop) {
 		this.name = name;
 		this.contextPointer = eventLoop.getContextPointer();
@@ -75,7 +90,7 @@
 		controls.add(muteControl);
 		isOpen = true;
 
-		System.out.println("Opened Target Port " + name);
+		// System.out.println("Opened Target Port " + name);
 	}
 
 	public abstract byte[] native_setVolume(float newValue);
--- a/src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourcePort.java	Fri Sep 12 11:26:43 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourcePort.java	Fri Sep 12 12:44:34 2008 -0400
@@ -37,10 +37,25 @@
 
 package org.classpath.icedtea.pulseaudio;
 
+import java.io.IOException;
+
 import javax.sound.sampled.Port;
 
 public class PulseAudioSourcePort extends PulseAudioPort {
 
+	static {
+		try {
+			String library = new java.io.File(".").getCanonicalPath()
+					+ java.io.File.separatorChar
+					+ System.mapLibraryName("pulse-java");
+			// System.out.println(PulseAudioVolumeControl.class.getCanonicalName()
+			// + ": " + library);
+			System.load(library);
+		} catch (IOException e) {
+			assert ("Loading failed".endsWith("library"));
+		}
+	}
+
 	public PulseAudioSourcePort(String name, EventLoop eventLoop) {
 		super(name, eventLoop);
 	}
--- a/src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetPort.java	Fri Sep 12 11:26:43 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetPort.java	Fri Sep 12 12:44:34 2008 -0400
@@ -37,10 +37,25 @@
 
 package org.classpath.icedtea.pulseaudio;
 
+import java.io.IOException;
+
 import javax.sound.sampled.Port;
 
 public class PulseAudioTargetPort extends PulseAudioPort {
 
+	static {
+		try {
+			String library = new java.io.File(".").getCanonicalPath()
+					+ java.io.File.separatorChar
+					+ System.mapLibraryName("pulse-java");
+			// System.out.println(PulseAudioVolumeControl.class.getCanonicalName()
+			// + ": " + library);
+			System.load(library);
+		} catch (IOException e) {
+			assert ("Loading failed".endsWith("library"));
+		}
+	}
+
 	public PulseAudioTargetPort(String name, EventLoop eventLoop) {
 		super(name, eventLoop);
 	}
--- a/src/java/org/classpath/icedtea/pulseaudio/PulseAudioVolumeControl.java	Fri Sep 12 11:26:43 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/PulseAudioVolumeControl.java	Fri Sep 12 12:44:34 2008 -0400
@@ -66,8 +66,8 @@
 			String library = new java.io.File(".").getCanonicalPath()
 					+ java.io.File.separatorChar
 					+ System.mapLibraryName("pulse-java");
-			System.out.println(PulseAudioVolumeControl.class.getCanonicalName()
-					+ ": " + library);
+			// System.out.println(PulseAudioVolumeControl.class.getCanonicalName()
+			// + ": " + library);
 			System.load(library);
 		} catch (IOException e) {
 			assert ("Loading failed".endsWith("library"));
--- a/src/java/org/classpath/icedtea/pulseaudio/Stream.java	Fri Sep 12 11:26:43 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/Stream.java	Fri Sep 12 12:44:34 2008 -0400
@@ -103,8 +103,8 @@
 			String library = new java.io.File(".").getCanonicalPath()
 					+ java.io.File.separatorChar
 					+ System.mapLibraryName("pulse-java");
-			System.out
-					.println(Stream.class.getCanonicalName() + ": " + library);
+			// System.out
+			// .println(Stream.class.getCanonicalName() + ": " + library);
 			System.load(library);
 		} catch (IOException e) {
 			assert ("Loading failed".endsWith("library"));
--- a/unittests/org/classpath/icedtea/pulseaudio/PulseAudioMixerTest.java	Fri Sep 12 11:26:43 2008 -0400
+++ b/unittests/org/classpath/icedtea/pulseaudio/PulseAudioMixerTest.java	Fri Sep 12 12:44:34 2008 -0400
@@ -50,6 +50,7 @@
 import javax.sound.sampled.Mixer;
 import javax.sound.sampled.Port;
 import javax.sound.sampled.TargetDataLine;
+import javax.sound.sampled.DataLine.Info;
 
 import junit.framework.JUnit4TestAdapter;
 
@@ -152,11 +153,11 @@
 		Line.Info allLineInfo[] = selectedMixer.getSourceLineInfo();
 		Assert.assertNotNull(allLineInfo);
 		Assert.assertTrue(allLineInfo.length > 0);
-		
+
 		boolean foundSourceDataLine = false;
 		boolean foundClip = false;
 		boolean foundPort = false;
-		
+
 		int j = 0;
 		for (Line.Info lineInfo : allLineInfo) {
 			System.out.println("Source Line " + j++ + ": "
@@ -178,53 +179,38 @@
 		Assert.assertTrue("Couldnt find a SourceDataLine", foundSourceDataLine);
 		Assert.assertTrue("Couldnt find a Clip", foundClip);
 		Assert.assertTrue("Couldnt find a Port", foundPort);
-		
+
 	}
 
 	@Test
 	public void testTargetLinesExist() throws LineUnavailableException {
+		System.out.println("This tests if target Lines exist");
 		selectedMixer.open();
 		Line.Info allLineInfo[] = selectedMixer.getTargetLineInfo();
 		Assert.assertNotNull(allLineInfo);
 		Assert.assertTrue(allLineInfo.length > 0);
+
+		boolean foundTargetDataLine = false;
+		boolean foundPort = false;
+
 		int j = 0;
 		for (Line.Info lineInfo : allLineInfo) {
 			System.out.println("Target Line " + j++ + ": "
 					+ lineInfo.getLineClass());
+			if (lineInfo.getLineClass().toString().contains("TargetDataLine")) {
+				foundTargetDataLine = true;
+			} else if (lineInfo.getLineClass().toString().contains("Port")) {
+				foundPort = true;
+			} else {
+				Assert.assertTrue("Found invalid type of target line", true);
+			}
 			Line targetLine = (Line) selectedMixer.getLine(lineInfo);
 			assertNotNull(targetLine);
 
 		}
 
-	}
-
-	@Test
-	public void testGetTargetPortInfo() throws LineUnavailableException {
-		selectedMixer.open();
-		Line.Info[] lineInfos = selectedMixer.getTargetLineInfo();
-		int i = 0;
-		for (Line.Info info : lineInfos) {
-			if (info instanceof Port.Info) {
-				Port.Info portInfo = (Port.Info) info;
-				System.out.println("Port " + ++i + ": " + portInfo.getName()
-						+ " - " + portInfo.getLineClass());
-			}
-		}
-
-	}
-
-	@Test
-	public void testGetSourcePortInfo() throws LineUnavailableException {
-		selectedMixer.open();
-		Line.Info[] lineInfos = selectedMixer.getSourceLineInfo();
-		int i = 0;
-		for (Line.Info info : lineInfos) {
-			if (info instanceof Port.Info) {
-				Port.Info portInfo = (Port.Info) info;
-				System.out.println("Port " + ++i + ": " + portInfo.getName()
-						+ " - " + portInfo.getLineClass());
-			}
-		}
+		Assert.assertTrue("Couldnt find a TargetDataLine", foundTargetDataLine);
+		Assert.assertTrue("Couldnt find a target Port", foundPort);
 
 	}
 
@@ -270,6 +256,73 @@
 		selectedMixer.getLine(Port.Info.MICROPHONE);
 	}
 
+	@Test
+	public void testSaneNumberOfPorts() throws LineUnavailableException {
+		System.out
+				.println("This test checks that a sane number of ports are detected");
+		selectedMixer.open();
+		Line.Info[] lineInfos = selectedMixer.getSourceLineInfo();
+		Assert.assertNotNull(lineInfos);
+
+		int ports = 0;
+		for (Line.Info info : lineInfos) {
+			if (info instanceof Port.Info) {
+				ports++;
+			}
+		}
+		Assert.assertTrue("Too few Source ports", ports > 0);
+		Assert.assertTrue("Too many Source ports... this looks wrong",
+				ports < 5);
+
+		lineInfos = selectedMixer.getTargetLineInfo();
+		ports = 0;
+		for (Line.Info info : lineInfos) {
+			if (info instanceof Port.Info) {
+				ports++;
+			}
+		}
+		Assert.assertTrue("Too few Target ports", ports > 0);
+		Assert.assertTrue("Too many Target ports... this looks wrong",
+				ports < 5);
+
+	}
+
+	@Test
+	public void testGetTargetPortInfo() throws LineUnavailableException {
+		System.out.println("This test checks target ports");
+		selectedMixer.open();
+		Line.Info[] lineInfos = selectedMixer.getTargetLineInfo();
+		int i = 0;
+		for (Line.Info info : lineInfos) {
+			if (info instanceof Port.Info) {
+				Port.Info portInfo = (Port.Info) info;
+				Assert.assertTrue(portInfo.isSource() == false);
+				Assert.assertTrue(portInfo.getLineClass() == Port.class);
+				System.out.println("Port " + ++i + ": " + portInfo.getName()
+						+ " - " + portInfo.getLineClass());
+			}
+		}
+
+	}
+
+	@Test
+	public void testGetSourcePortInfo() throws LineUnavailableException {
+		System.out.println("This test checks source ports");
+		selectedMixer.open();
+		Line.Info[] lineInfos = selectedMixer.getSourceLineInfo();
+		int i = 0;
+		for (Line.Info info : lineInfos) {
+			if (info instanceof Port.Info) {
+				Port.Info portInfo = (Port.Info) info;
+				Assert.assertTrue(portInfo.isSource() == true);
+				Assert.assertTrue(portInfo.getLineClass() == Port.class);
+				System.out.println("Port " + ++i + ": " + portInfo.getName()
+						+ " - " + portInfo.getLineClass());
+			}
+		}
+
+	}
+
 	@Test(expected = IllegalStateException.class)
 	public void testOpeningAgain() throws LineUnavailableException {
 		selectedMixer.open();