changeset 99:548fa22ff716

2008-08-27 Omair Majid <omajid@redhat.com> * src/java/org/classpath/icedtea/pusleaudio/PulseAudioDataLine.java Inherit from DataLine instead of line. (isRunning): Return isEngagedInIo to indicate what the function is doing. (connectLine): changed modifier to protected. (drain): Made method public. * src/java/org/classapth/icedtea/pulseaudio/PulseAudioMixer.java (getSourceLines): Changed the call to the toArray function to fix the ClassCastException. (getTargetLines): Likewise. (addSourceDataLine): New function. (removeSourceDataLine): Likewise. (addTargetDataLine): Likewise. (removeTargetDataLine): Likewise. * src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java (open): Tell the mixer that the line has been opened. (close): Tell the mixer that the line has been closed. * src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java (open): New function. Tell the mixer that the line has been opened. (closed): New function. Tell the mixer that the line has been closed. * unittests/org/classpath/icedtea/pulseaudio/PulseAudioClipTest.java: Remove uneeded imports. * unittests/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLineTest.java (testMixerKnowsAboutOpenLines): New funtion. Tests if the mixer knows about open lines. (testAllTargetLinesClosed): New funciton. Tests if all the TargetLines have been closed. * unittests/org/classpath/icedtea/pulseaudio/PulseSourceDataLineTest.java (testPlay): Drain instead of flush. (testPlayLessThanFrameSize): Added a finally clause to close the line. (testOpenFormat): Close the line. Fixes a resource leak. (testFindLineWithFormat): Likewise. (testFindLineWithWrongFormat): Likewise. (testVolumeAndMute): Likewise. (testVolumeChanging): Likewise. (testFramePosition): Likewise. (testMixerKnowsAboutOpenLines): New function. Tests if the mixer knows about open SourceDataLines. (testAllSourceLinesClosed): New function. Test if all SourceDataLines have been closed. (messWithStreams): Fixed resource leaks
author Omair Majid <omajid@redhat.com>
date Wed, 27 Aug 2008 12:04:55 -0400
parents 220882a984dd
children 1a1a426b17cc
files src/java/org/classpath/icedtea/pulseaudio/PulseAudioDataLine.java src/java/org/classpath/icedtea/pulseaudio/PulseAudioMixer.java src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java unittests/org/classpath/icedtea/pulseaudio/PulseAudioClipTest.java unittests/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLineTest.java unittests/org/classpath/icedtea/pulseaudio/PulseSourceDataLineTest.java
diffstat 7 files changed, 116 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/src/java/org/classpath/icedtea/pulseaudio/PulseAudioDataLine.java	Mon Aug 25 17:27:52 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/PulseAudioDataLine.java	Wed Aug 27 12:04:55 2008 -0400
@@ -6,12 +6,12 @@
 
 import javax.sound.sampled.AudioFormat;
 import javax.sound.sampled.AudioSystem;
-import javax.sound.sampled.Line;
+import javax.sound.sampled.DataLine;
 import javax.sound.sampled.LineEvent;
 import javax.sound.sampled.LineListener;
 import javax.sound.sampled.LineUnavailableException;
 
-public abstract class PulseAudioDataLine implements Line {
+public abstract class PulseAudioDataLine implements DataLine {
 
 	protected static final int DEFAULT_BUFFER_SIZE = StreamBufferAttributes.SANE_DEFAULT;
 	protected static final String PULSEAUDIO_FORMAT_KEY = "PulseAudioFormatKey";
@@ -182,8 +182,7 @@
 	}
 
 	public boolean isRunning() {
-		// FIXME Auto-generated method stub
-		return false;
+		return isEngagedInIo;
 	}
 
 	public void addLineListener(LineListener listener) {
@@ -200,9 +199,9 @@
 		}
 	}
 
-	abstract void connectLine(int bufferSize);
+	protected abstract void connectLine(int bufferSize);
 
-	abstract void drain();
+	public abstract void drain();
 
 	public boolean isOpen() {
 		return isOpen;
--- a/src/java/org/classpath/icedtea/pulseaudio/PulseAudioMixer.java	Mon Aug 25 17:27:52 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/PulseAudioMixer.java	Wed Aug 27 12:04:55 2008 -0400
@@ -364,8 +364,7 @@
 
 	@Override
 	public Line[] getSourceLines() {
-		// return (Line[]) _sourceLines.toArray();
-		return null;
+		return (Line[]) sourceLines.toArray(new PulseAudioSourceDataLine[0]);
 
 	}
 
@@ -392,8 +391,7 @@
 
 	@Override
 	public Line[] getTargetLines() {
-		// return (Line[]) _targetLines.toArray();
-		return null;
+		return (Line[]) targetLines.toArray(new TargetDataLine[0]);
 	}
 
 	@Override
@@ -663,4 +661,20 @@
 
 	}
 
+	void addSourceDataLine(PulseAudioSourceDataLine line) {
+		sourceLines.add(line);
+	}
+
+	void removeSourceDataLine(PulseAudioSourceDataLine line) {
+		sourceLines.remove(line);
+	}
+
+	void addTargetDataLine(PulseAudioTargetDataLine line) {
+		targetLines.add(line);
+	}
+
+	void removeTargetDataLine(PulseAudioTargetDataLine line) {
+		targetLines.remove(line);
+	}
+
 }
--- a/src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java	Mon Aug 25 17:27:52 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/PulseAudioSourceDataLine.java	Wed Aug 27 12:04:55 2008 -0400
@@ -97,6 +97,10 @@
 		controls[0] = volumeControl;
 		muteControl = new PulseAudioStreamMuteControl(this);
 		controls[1] = muteControl;
+		
+		PulseAudioMixer parentMixer = PulseAudioMixer.getInstance();
+		parentMixer.addSourceDataLine(this);
+		System.out.println("PulseAudioSourceDataLine: adding to mixer");
 
 	}
 
@@ -275,4 +279,13 @@
 		return stream;
 	}
 
+	@Override
+	public void close() {
+		PulseAudioMixer parent = PulseAudioMixer.getInstance();
+		parent.removeSourceDataLine(this);
+		System.out.println("PulseAudioSourceDataLine: removing from mixer");
+
+		super.close();
+	}
+
 }
--- a/src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java	Mon Aug 25 17:27:52 2008 -0400
+++ b/src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java	Wed Aug 27 12:04:55 2008 -0400
@@ -44,6 +44,7 @@
 import javax.sound.sampled.Control;
 import javax.sound.sampled.DataLine;
 import javax.sound.sampled.LineListener;
+import javax.sound.sampled.LineUnavailableException;
 import javax.sound.sampled.TargetDataLine;
 import javax.sound.sampled.Control.Type;
 
@@ -65,6 +66,23 @@
 
 	}
 
+	@Override
+	public void close() {
+		PulseAudioMixer parentMixer = PulseAudioMixer.getInstance();
+		parentMixer.removeTargetDataLine(this);
+		
+		super.close();
+	}
+
+	@Override
+	public void open(AudioFormat format, int bufferSize)
+			throws LineUnavailableException {
+		super.open(format, bufferSize);
+		
+		PulseAudioMixer parentMixer = PulseAudioMixer.getInstance();
+		parentMixer.addTargetDataLine(this);
+	}
+
 	protected void connectLine(int bufferSize) {
 		StreamBufferAttributes bufferAttributes = new StreamBufferAttributes(
 				bufferSize, 0, 0, 0, bufferSize / 10);
--- a/unittests/org/classpath/icedtea/pulseaudio/PulseAudioClipTest.java	Mon Aug 25 17:27:52 2008 -0400
+++ b/unittests/org/classpath/icedtea/pulseaudio/PulseAudioClipTest.java	Wed Aug 27 12:04:55 2008 -0400
@@ -44,11 +44,9 @@
 import javax.sound.sampled.AudioInputStream;
 import javax.sound.sampled.AudioSystem;
 import javax.sound.sampled.Clip;
-import javax.sound.sampled.DataLine;
 import javax.sound.sampled.Line;
 import javax.sound.sampled.LineUnavailableException;
 import javax.sound.sampled.Mixer;
-import javax.sound.sampled.SourceDataLine;
 import javax.sound.sampled.UnsupportedAudioFileException;
 
 import junit.framework.JUnit4TestAdapter;
--- a/unittests/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLineTest.java	Mon Aug 25 17:27:52 2008 -0400
+++ b/unittests/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLineTest.java	Wed Aug 27 12:04:55 2008 -0400
@@ -127,6 +127,26 @@
 		targetDataLine.removeLineListener(closeListener);
 
 	}
+	
+	
+	@Test
+	public void testMixerKnowsAboutOpenLines() throws LineUnavailableException {
+		targetDataLine = (TargetDataLine) mixer.getLine(new Line.Info(
+				TargetDataLine.class));
+		
+		Assert.assertEquals(0, mixer.getTargetLines().length);
+		targetDataLine.open();
+		Assert.assertEquals(1, mixer.getTargetLines().length);
+		targetDataLine.close();
+		Assert.assertEquals(0, mixer.getTargetLines().length);
+		
+	}
+	
+	@Test
+	public void testAllTargetLinesClosed() {
+		Assert.assertEquals(0, mixer.getTargetLines().length);
+		
+	}
 
 	@After
 	public void tearDown() {
--- a/unittests/org/classpath/icedtea/pulseaudio/PulseSourceDataLineTest.java	Mon Aug 25 17:27:52 2008 -0400
+++ b/unittests/org/classpath/icedtea/pulseaudio/PulseSourceDataLineTest.java	Wed Aug 27 12:04:55 2008 -0400
@@ -147,8 +147,9 @@
 		}
 		System.out.println("done");
 
-		line.flush();
-		System.out.println("flushed");
+		line.drain();
+		System.out.println("drained");
+		line.stop();
 		line.close();
 		System.out.println("closed");
 
@@ -172,10 +173,13 @@
 
 		line.open();
 		line.start();
-		line.write(data, 0, 1);
-		line.stop();
-		line.close();
-
+		try {
+			line.write(data, 0, 1);
+		} finally {
+			line.drain();
+			line.stop();
+			line.close();
+		}
 	}
 
 	@Test
@@ -198,6 +202,7 @@
 		Assert.assertNotNull(line);
 		line.open();
 		Assert.assertTrue(line.getFormat().matches(audioFormat));
+		line.close();
 	}
 
 	@Test
@@ -211,6 +216,7 @@
 				SourceDataLine.class, wantedFormat));
 		line.open();
 		System.out.println(line.getFormat());
+		line.close();
 
 	}
 
@@ -223,7 +229,7 @@
 						AudioFormat.Encoding.PCM_UNSIGNED, 44100, 10000, 1, 13,
 						10, true)));
 		line.open();
-
+		line.close();
 	}
 
 	@Test
@@ -263,7 +269,8 @@
 			}
 		}
 
-		line.flush();
+		line.drain();
+		line.close();
 		selectedMixer.close();
 
 	}
@@ -302,7 +309,8 @@
 			}
 		}
 
-		line.flush();
+		line.drain();
+		line.close();
 		selectedMixer.close();
 
 	}
@@ -421,7 +429,8 @@
 			}
 		}
 
-		line.flush();
+		line.drain();
+		line.stop();
 		System.out.println("time position: " + line.getMicrosecondPosition());
 		Assert.assertEquals(6199, line.getMicrosecondPosition());
 		line.close();
@@ -462,9 +471,28 @@
 	}
 
 	@Test
+	public void testMixerKnowsAboutOpenLines() throws LineUnavailableException {
+		SourceDataLine sourceDataLine = (SourceDataLine) mixer
+				.getLine(new Line.Info(SourceDataLine.class));
+
+		Assert.assertEquals(0, mixer.getSourceLines().length);
+		sourceDataLine.open();
+		Assert.assertEquals(1, mixer.getSourceLines().length);
+		sourceDataLine.close();
+		Assert.assertEquals(0, mixer.getSourceLines().length);
+
+	}
+
+	@Test
+	public void testAllSourceLinesClosed() {
+		Assert.assertEquals(0, mixer.getSourceLines().length);
+
+	}
+
+	@Test
 	public void messWithStreams() throws LineUnavailableException {
 		System.out
-				.println("This test tries to cork(false) a stream which hasnt been corked");
+				.println("This test tries to unCork a stream which hasnt been corked");
 
 		PulseAudioSourceDataLine line = (PulseAudioSourceDataLine) mixer
 				.getLine(new DataLine.Info(SourceDataLine.class,
@@ -478,6 +506,9 @@
 			o = s.unCork();
 		}
 		o.waitForCompletion();
+		o.releaseReference();
+		line.stop();
+		line.close();
 	}
 
 	@After