OpenJDK / jdk8u / jdk8u / jdk
changeset 13253:c1cffa411ed5
8205361: Better RIFF reading support
Reviewed-by: prr, rhalade, mschoene
author | serb |
---|---|
date | Tue, 10 Jul 2018 16:20:45 +0300 |
parents | 530b9b024556 |
children | 28d4d67065ab e6d7570bc0d8 |
files | src/share/classes/com/sun/media/sound/DLSSoundbank.java src/share/classes/com/sun/media/sound/RIFFReader.java test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java |
diffstat | 3 files changed, 47 insertions(+), 40 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/com/sun/media/sound/DLSSoundbank.java Thu Jul 05 01:00:07 2018 -0700 +++ 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); } }
--- a/src/share/classes/com/sun/media/sound/RIFFReader.java Thu Jul 05 01:00:07 2018 -0700 +++ b/src/share/classes/com/sun/media/sound/RIFFReader.java Tue Jul 10 16:20:45 2018 +0300 @@ -172,49 +172,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) { - avail = 0; - 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); } } @@ -337,6 +329,7 @@ return ch1 + (ch2 << 8) | (ch3 << 16) | (ch4 << 24); } + @Override public void close() throws IOException { finish(); if (this == root)
--- a/test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java Thu Jul 05 01:00:07 2018 -0700 +++ b/test/javax/sound/midi/Gervill/RiffReaderWriter/Skip.java Tue Jul 10 16:20:45 2018 +0300 @@ -27,9 +27,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 { @@ -40,6 +39,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"); @@ -51,7 +55,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);