# HG changeset patch # User Omair Majid # Date 1222267913 14400 # Node ID e29a9eb84a4e921a6fa943be82874fbf4216868c # Parent 438aa072a80d087c12df8f2a47892b0136e70de4 2008-09-24 Omair Majid * src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java (open): Reset currentFramePosition to 0. (read): Add to currentFramePosition. * unittests/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java (testOpenEvents): Print OPEN on an OPEN event. (testCloseEvents): Output CLOSE on a CLOSE event. (testStartedStopped): Output START on a START event and STOP on a STOP event. (testFramePosition): New function. Tests the getFramePosition for a TargetDataLine. (testFramePositionWithStartAndStop): New function. Tests frame position of a TargetDataLine while pausing it for a bit. diff -r 438aa072a80d -r e29a9eb84a4e src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java --- a/src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java Tue Sep 23 17:23:27 2008 -0400 +++ b/src/java/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLine.java Wed Sep 24 10:51:53 2008 -0400 @@ -79,6 +79,8 @@ super.open(format, bufferSize); + currentFramePosition = 0; + PulseAudioMixer parentMixer = PulseAudioMixer.getInstance(); parentMixer.addTargetLine(this); } @@ -128,7 +130,7 @@ sizeRead += bytesRead; position += bytesRead; remainingLength -= bytesRead; - currentFramePosition = bytesRead / currentFormat.getFrameSize(); + currentFramePosition += bytesRead / currentFormat.getFrameSize(); } } diff -r 438aa072a80d -r e29a9eb84a4e unittests/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLineTest.java --- a/unittests/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLineTest.java Tue Sep 23 17:23:27 2008 -0400 +++ b/unittests/org/classpath/icedtea/pulseaudio/PulseAudioTargetDataLineTest.java Wed Sep 24 10:51:53 2008 -0400 @@ -132,6 +132,7 @@ @Override public void update(LineEvent event) { Assert.assertEquals(LineEvent.Type.OPEN, event.getType()); + System.out.println("OPEN"); calledCount++; Assert.assertEquals(1, calledCount); } @@ -222,6 +223,7 @@ @Override public void update(LineEvent event) { Assert.assertEquals(LineEvent.Type.CLOSE, event.getType()); + System.out.println("CLOSE"); calledCount++; Assert.assertEquals(1, calledCount); } @@ -259,12 +261,13 @@ @Override public void update(LineEvent event) { if (event.getType() == LineEvent.Type.START) { + System.out.println("START"); started++; Assert.assertEquals(1, started); } if (event.getType() == LineEvent.Type.STOP) { - System.out.println("Stopped event"); + System.out.println("STOP"); stopped++; Assert.assertEquals(1, stopped); } @@ -317,6 +320,72 @@ targetDataLine.close(); } + @Test + public void testFramePosition() throws LineUnavailableException { + System.out + .println("This test tests frame position for a target data line"); + + final int CHUNCKS = 100; + final int BUFFER_SIZE = 1000; + targetDataLine = (TargetDataLine) mixer.getLine(new Line.Info( + TargetDataLine.class)); + + targetDataLine.open(); + targetDataLine.start(); + byte[] data = new byte[BUFFER_SIZE]; + + for (int i = 0; i < CHUNCKS; i++) { + targetDataLine.read(data, 0, data.length); + } + + targetDataLine.stop(); + long pos = targetDataLine.getLongFramePosition(); + System.out.println("Frames read: " + pos); + long expected = BUFFER_SIZE * CHUNCKS + / targetDataLine.getFormat().getFrameSize(); + System.out.println("Expected: " + expected); + long granularity = 2; + Assert.assertTrue(Math.abs(expected - pos) < granularity); + targetDataLine.close(); + } + + @Test + public void testFramePositionWithStartAndStop() + throws LineUnavailableException, InterruptedException { + System.out + .println("This test tests frame position for a target data line"); + + final int CHUNCKS = 100; + final int BUFFER_SIZE = 1000; + targetDataLine = (TargetDataLine) mixer.getLine(new Line.Info( + TargetDataLine.class)); + + targetDataLine.open(); + targetDataLine.start(); + byte[] data = new byte[BUFFER_SIZE]; + + for (int i = 0; i < CHUNCKS; i++) { + if (i == CHUNCKS / 2) { + targetDataLine.stop(); + Thread.sleep(1000); + targetDataLine.start(); + } + + targetDataLine.read(data, 0, data.length); + } + + targetDataLine.stop(); + long pos = targetDataLine.getLongFramePosition(); + System.out.println("Frames read: " + pos); + long expected = BUFFER_SIZE * CHUNCKS + / targetDataLine.getFormat().getFrameSize(); + System.out.println("Expected: " + expected); + long granularity = 2; + Assert.assertTrue(Math.abs(expected - pos) < granularity); + targetDataLine.close(); + + } + @After public void tearDown() { if (targetDataLine != null) {