# HG changeset patch # User serb # Date 1531228845 -10800 # Node ID 3dde65b3b78d72ffc12201f82eac217a7f118439 # Parent 01d60f0cbf30f04d92110908b8193923494c3d82 8205361: Better RIFF reading support Reviewed-by: prr, rhalade, mschoene diff -r 01d60f0cbf30 -r 3dde65b3b78d src/share/classes/com/sun/media/sound/DLSSoundbank.java --- a/src/share/classes/com/sun/media/sound/DLSSoundbank.java Mon Apr 23 12:01:46 2018 -0400 +++ b/src/share/classes/com/sun/media/sound/DLSSoundbank.java Tue Jul 10 16:20:45 2018 +0300 @@ -548,7 +548,7 @@ long count = riff.readUnsignedInt(); if (size - 8 != 0) - riff.skipBytes(size - 8); + riff.skip(size - 8); for (int i = 0; i < count; i++) { DLSModulator modulator = new DLSModulator(); @@ -568,7 +568,7 @@ long count = riff.readUnsignedInt(); if (size - 8 != 0) - riff.skipBytes(size - 8); + riff.skip(size - 8); for (int i = 0; i < count; i++) { DLSModulator modulator = new DLSModulator(); @@ -661,7 +661,7 @@ long loops = riff.readInt(); if (size > 20) - riff.skipBytes(size - 20); + riff.skip(size - 20); for (int i = 0; i < loops; i++) { DLSSampleLoop loop = new DLSSampleLoop(); @@ -671,7 +671,7 @@ loop.length = riff.readUnsignedInt(); sampleOptions.loops.add(loop); if (size2 > 16) - riff.skipBytes(size2 - 16); + riff.skip(size2 - 16); } } diff -r 01d60f0cbf30 -r 3dde65b3b78d src/share/classes/com/sun/media/sound/RIFFReader.java --- a/src/share/classes/com/sun/media/sound/RIFFReader.java Mon Apr 23 12:01:46 2018 -0400 +++ b/src/share/classes/com/sun/media/sound/RIFFReader.java Tue Jul 10 16:20:45 2018 +0300 @@ -165,47 +165,41 @@ } } - public final long skipBytes(long n) throws IOException { - if (n < 0) + @Override + public long skip(final long n) throws IOException { + if (n <= 0 || avail == 0) { return 0; - long skipped = 0; - while (skipped != n) { - long s = skip(n - skipped); - if (s < 0) - break; - if (s == 0) + } + // will not skip more than + long remaining = Math.min(n, avail); + while (remaining > 0) { + // Some input streams like FileInputStream can return more bytes, + // when EOF is reached. + long ret = Math.min(stream.skip(remaining), remaining); + if (ret == 0) { + // EOF or not? we need to check. Thread.yield(); - skipped += s; + if (stream.read() == -1) { + avail = 0; + break; + } + ret = 1; + } + remaining -= ret; + avail -= ret; + filepointer += ret; } - return skipped; + return n - remaining; } - public long skip(long n) throws IOException { - if (avail == 0) - return -1; - if (n > avail) { - long len = stream.skip(avail); - if (len != -1) - filepointer += len; - avail = 0; - return len; - } else { - long ret = stream.skip(n); - if (ret == -1) - return -1; - avail -= ret; - filepointer += ret; - return ret; - } - } - + @Override public int available() { return (int)avail; } public void finish() throws IOException { if (avail != 0) { - skipBytes(avail); + skip(avail); } } @@ -323,6 +317,7 @@ return ch1 + (ch2 << 8) | (ch3 << 16) | (ch4 << 24); } + @Override public void close() throws IOException { finish(); if (this == root) diff -r 01d60f0cbf30 -r 3dde65b3b78d test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java --- a/test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java Mon Apr 23 12:01:46 2018 -0400 +++ b/test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java Tue Jul 10 16:20:45 2018 +0300 @@ -29,9 +29,8 @@ import java.io.File; import java.io.FileInputStream; -import javax.sound.sampled.*; - -import com.sun.media.sound.*; +import com.sun.media.sound.RIFFReader; +import com.sun.media.sound.RIFFWriter; public class Skip { @@ -42,6 +41,11 @@ } public static void main(String[] args) throws Exception { + test(false); + test(true); + } + + private static void test(boolean customStream) throws Exception { RIFFWriter writer = null; RIFFReader reader = null; File tempfile = File.createTempFile("test",".riff"); @@ -53,7 +57,17 @@ chunk.write((byte)44); writer.close(); writer = null; - FileInputStream fis = new FileInputStream(tempfile); + final FileInputStream fis; + if (customStream) { + fis = new FileInputStream(tempfile); + } else { + fis = new FileInputStream(tempfile) { + @Override + public long skip(long n) { + return 0; + } + }; + } reader = new RIFFReader(fis); RIFFReader readchunk = reader.nextChunk(); reader.skip(1);