提交 74680bd8 编写于 作者: S serb

8205361: Better RIFF reading support

Reviewed-by: prr, rhalade, mschoene
上级 633cdf48
...@@ -548,7 +548,7 @@ public final class DLSSoundbank implements Soundbank { ...@@ -548,7 +548,7 @@ public final class DLSSoundbank implements Soundbank {
long count = riff.readUnsignedInt(); long count = riff.readUnsignedInt();
if (size - 8 != 0) if (size - 8 != 0)
riff.skipBytes(size - 8); riff.skip(size - 8);
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
DLSModulator modulator = new DLSModulator(); DLSModulator modulator = new DLSModulator();
...@@ -568,7 +568,7 @@ public final class DLSSoundbank implements Soundbank { ...@@ -568,7 +568,7 @@ public final class DLSSoundbank implements Soundbank {
long count = riff.readUnsignedInt(); long count = riff.readUnsignedInt();
if (size - 8 != 0) if (size - 8 != 0)
riff.skipBytes(size - 8); riff.skip(size - 8);
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
DLSModulator modulator = new DLSModulator(); DLSModulator modulator = new DLSModulator();
...@@ -661,7 +661,7 @@ public final class DLSSoundbank implements Soundbank { ...@@ -661,7 +661,7 @@ public final class DLSSoundbank implements Soundbank {
long loops = riff.readInt(); long loops = riff.readInt();
if (size > 20) if (size > 20)
riff.skipBytes(size - 20); riff.skip(size - 20);
for (int i = 0; i < loops; i++) { for (int i = 0; i < loops; i++) {
DLSSampleLoop loop = new DLSSampleLoop(); DLSSampleLoop loop = new DLSSampleLoop();
...@@ -671,7 +671,7 @@ public final class DLSSoundbank implements Soundbank { ...@@ -671,7 +671,7 @@ public final class DLSSoundbank implements Soundbank {
loop.length = riff.readUnsignedInt(); loop.length = riff.readUnsignedInt();
sampleOptions.loops.add(loop); sampleOptions.loops.add(loop);
if (size2 > 16) if (size2 > 16)
riff.skipBytes(size2 - 16); riff.skip(size2 - 16);
} }
} }
......
...@@ -172,49 +172,41 @@ public final class RIFFReader extends InputStream { ...@@ -172,49 +172,41 @@ public final class RIFFReader extends InputStream {
} }
} }
public final long skipBytes(long n) throws IOException { @Override
if (n < 0) public long skip(final long n) throws IOException {
if (n <= 0 || avail == 0) {
return 0; return 0;
long skipped = 0;
while (skipped != n) {
long s = skip(n - skipped);
if (s < 0)
break;
if (s == 0)
Thread.yield();
skipped += s;
} }
return skipped; // will not skip more than
} long remaining = Math.min(n, avail);
while (remaining > 0) {
public long skip(long n) throws IOException { // Some input streams like FileInputStream can return more bytes,
if (avail == 0) // when EOF is reached.
return -1; long ret = Math.min(stream.skip(remaining), remaining);
if (n > avail) { if (ret == 0) {
long len = stream.skip(avail); // EOF or not? we need to check.
if (len != -1) Thread.yield();
filepointer += len; if (stream.read() == -1) {
avail = 0; avail = 0;
return len; break;
} else { }
long ret = stream.skip(n); ret = 1;
if (ret == -1) {
avail = 0;
return -1;
} }
remaining -= ret;
avail -= ret; avail -= ret;
filepointer += ret; filepointer += ret;
return ret;
} }
return n - remaining;
} }
@Override
public int available() { public int available() {
return (int)avail; return (int)avail;
} }
public void finish() throws IOException { public void finish() throws IOException {
if (avail != 0) { if (avail != 0) {
skipBytes(avail); skip(avail);
} }
} }
...@@ -337,6 +329,7 @@ public final class RIFFReader extends InputStream { ...@@ -337,6 +329,7 @@ public final class RIFFReader extends InputStream {
return ch1 + (ch2 << 8) | (ch3 << 16) | (ch4 << 24); return ch1 + (ch2 << 8) | (ch3 << 16) | (ch4 << 24);
} }
@Override
public void close() throws IOException { public void close() throws IOException {
finish(); finish();
if (this == root) if (this == root)
......
...@@ -27,9 +27,8 @@ ...@@ -27,9 +27,8 @@
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import javax.sound.sampled.*; import com.sun.media.sound.RIFFReader;
import com.sun.media.sound.RIFFWriter;
import com.sun.media.sound.*;
public class Skip { public class Skip {
...@@ -40,6 +39,11 @@ public class Skip { ...@@ -40,6 +39,11 @@ public class Skip {
} }
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
test(false);
test(true);
}
private static void test(boolean customStream) throws Exception {
RIFFWriter writer = null; RIFFWriter writer = null;
RIFFReader reader = null; RIFFReader reader = null;
File tempfile = File.createTempFile("test",".riff"); File tempfile = File.createTempFile("test",".riff");
...@@ -51,7 +55,17 @@ public class Skip { ...@@ -51,7 +55,17 @@ public class Skip {
chunk.write((byte)44); chunk.write((byte)44);
writer.close(); writer.close();
writer = null; 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); reader = new RIFFReader(fis);
RIFFReader readchunk = reader.nextChunk(); RIFFReader readchunk = reader.nextChunk();
reader.skip(1); reader.skip(1);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册