IT import: handle end of file when reading samples

This commit is contained in:
tildearrow 2024-08-17 17:18:14 -05:00
parent 3fce04e77b
commit 3f47979ea7

View file

@ -639,6 +639,8 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) {
logD("seek not needed..."); logD("seek not needed...");
} }
logV("reading sample data (%d)",s->samples);
if (flags&8) { // compressed sample if (flags&8) { // compressed sample
unsigned int ret=0; unsigned int ret=0;
logV("decompression begin... (%d)",s->samples); logV("decompression begin... (%d)",s->samples);
@ -672,62 +674,66 @@ bool DivEngine::loadIT(unsigned char* file, size_t len) {
} }
logV("got: %d",ret); logV("got: %d",ret);
} else { } else {
if (s->depth==DIV_SAMPLE_DEPTH_16BIT) { try {
if (flags&4) { // downmix stereo if (s->depth==DIV_SAMPLE_DEPTH_16BIT) {
for (unsigned int i=0; i<s->samples; i++) { if (flags&4) { // downmix stereo
short l; for (unsigned int i=0; i<s->samples; i++) {
if (convert&2) { short l;
l=reader.readS_BE(); if (convert&2) {
} else { l=reader.readS_BE();
l=reader.readS(); } else {
l=reader.readS();
}
if (!(convert&1)) {
l^=0x8000;
}
s->data16[i]=l;
} }
if (!(convert&1)) { for (unsigned int i=0; i<s->samples; i++) {
l^=0x8000; short r;
if (convert&2) {
r=reader.readS_BE();
} else {
r=reader.readS();
}
if (!(convert&1)) {
r^=0x8000;
}
s->data16[i]=(s->data16[i]+r)>>1;
} }
s->data16[i]=l; } else {
} for (unsigned int i=0; i<s->samples; i++) {
for (unsigned int i=0; i<s->samples; i++) { if (convert&2) {
short r; s->data16[i]=reader.readS_BE()^((convert&1)?0:0x8000);
if (convert&2) { } else {
r=reader.readS_BE(); s->data16[i]=reader.readS()^((convert&1)?0:0x8000);
} else { }
r=reader.readS();
} }
if (!(convert&1)) {
r^=0x8000;
}
s->data16[i]=(s->data16[i]+r)>>1;
} }
} else { } else {
for (unsigned int i=0; i<s->samples; i++) { if (flags&4) { // downmix stereo
if (convert&2) { for (unsigned int i=0; i<s->samples; i++) {
s->data16[i]=reader.readS_BE()^((convert&1)?0:0x8000); signed char l=reader.readC();
} else { if (!(convert&1)) {
s->data16[i]=reader.readS()^((convert&1)?0:0x8000); l^=0x80;
}
s->data8[i]=l;
}
for (unsigned int i=0; i<s->samples; i++) {
signed char r=reader.readC();
if (!(convert&1)) {
r^=0x80;
}
s->data8[i]=(s->data8[i]+r)>>1;
}
} else {
for (unsigned int i=0; i<s->samples; i++) {
s->data8[i]=reader.readC()^((convert&1)?0:0x80);
} }
} }
} }
} else { } catch (EndOfFileException& e) {
if (flags&4) { // downmix stereo logW("premature end of file...");
for (unsigned int i=0; i<s->samples; i++) {
signed char l=reader.readC();
if (!(convert&1)) {
l^=0x80;
}
s->data8[i]=l;
}
for (unsigned int i=0; i<s->samples; i++) {
signed char r=reader.readC();
if (!(convert&1)) {
r^=0x80;
}
s->data8[i]=(s->data8[i]+r)>>1;
}
} else {
for (unsigned int i=0; i<s->samples; i++) {
s->data8[i]=reader.readC()^((convert&1)?0:0x80);
}
}
} }
} }