mirror of
https://github.com/vgmstream/vgmstream.git
synced 2024-11-29 00:34:33 +01:00
Fix segfault while reading some .xsb for .xwb
This commit is contained in:
parent
9333a22c16
commit
f9f93e74e7
@ -708,17 +708,17 @@ static int get_xsb_name(char * buf, size_t maxsize, int target_subsong, xwb_head
|
|||||||
|
|
||||||
off = 0;
|
off = 0;
|
||||||
if (xsb_version <= XSB_XACT1_MAX) {
|
if (xsb_version <= XSB_XACT1_MAX) {
|
||||||
xsb.xsb_wavebanks_count = 1; //read_8bit(0x22, streamFile);
|
xsb.xsb_wavebanks_count = 1; //(uint8_t)read_8bit(0x22, streamFile);
|
||||||
xsb.xsb_sounds_count = read_16bit(0x1e, streamFile);//@ 0x1a? 0x1c?
|
xsb.xsb_sounds_count = (uint16_t)read_16bit(0x1e, streamFile);//@ 0x1a? 0x1c?
|
||||||
//xsb.xsb_names_size = 0;
|
//xsb.xsb_names_size = 0;
|
||||||
//xsb.xsb_names_offset = 0;
|
//xsb.xsb_names_offset = 0;
|
||||||
xsb.xsb_nameoffsets_offset = 0;
|
xsb.xsb_nameoffsets_offset = 0;
|
||||||
xsb.xsb_sounds_offset = 0x38;
|
xsb.xsb_sounds_offset = 0x38;
|
||||||
} else if (xsb_version <= XSB_XACT2_MAX) {
|
} else if (xsb_version <= XSB_XACT2_MAX) {
|
||||||
xsb.xsb_simple_sounds_count = read_16bit(0x09, streamFile);
|
xsb.xsb_simple_sounds_count = (uint16_t)read_16bit(0x09, streamFile);
|
||||||
xsb.xsb_complex_sounds_count = read_16bit(0x0B, streamFile);
|
xsb.xsb_complex_sounds_count = (uint16_t)read_16bit(0x0B, streamFile);
|
||||||
xsb.xsb_wavebanks_count = read_8bit(0x11, streamFile);
|
xsb.xsb_wavebanks_count = (uint8_t)read_8bit(0x11, streamFile);
|
||||||
xsb.xsb_sounds_count = read_16bit(0x12, streamFile);
|
xsb.xsb_sounds_count = (uint16_t)read_16bit(0x12, streamFile);
|
||||||
//0x14: 16b unk
|
//0x14: 16b unk
|
||||||
//xsb.xsb_names_size = read_32bit(0x16, streamFile);
|
//xsb.xsb_names_size = read_32bit(0x16, streamFile);
|
||||||
xsb.xsb_simple_sounds_offset = read_32bit(0x1a, streamFile);
|
xsb.xsb_simple_sounds_offset = read_32bit(0x1a, streamFile);
|
||||||
@ -727,9 +727,9 @@ static int get_xsb_name(char * buf, size_t maxsize, int target_subsong, xwb_head
|
|||||||
xsb.xsb_nameoffsets_offset = read_32bit(0x3a, streamFile);
|
xsb.xsb_nameoffsets_offset = read_32bit(0x3a, streamFile);
|
||||||
xsb.xsb_sounds_offset = read_32bit(0x3e, streamFile);
|
xsb.xsb_sounds_offset = read_32bit(0x3e, streamFile);
|
||||||
} else {
|
} else {
|
||||||
xsb.xsb_simple_sounds_count = read_16bit(0x13, streamFile);
|
xsb.xsb_simple_sounds_count = (uint16_t)read_16bit(0x13, streamFile);
|
||||||
xsb.xsb_complex_sounds_count = read_16bit(0x15, streamFile);
|
xsb.xsb_complex_sounds_count = (uint16_t)read_16bit(0x15, streamFile);
|
||||||
xsb.xsb_wavebanks_count = read_8bit(0x1b, streamFile);
|
xsb.xsb_wavebanks_count = (uint8_t)read_8bit(0x1b, streamFile);
|
||||||
xsb.xsb_sounds_count = read_16bit(0x1c, streamFile);
|
xsb.xsb_sounds_count = read_16bit(0x1c, streamFile);
|
||||||
//xsb.xsb_names_size = read_32bit(0x1e, streamFile);
|
//xsb.xsb_names_size = read_32bit(0x1e, streamFile);
|
||||||
xsb.xsb_simple_sounds_offset = read_32bit(0x22, streamFile);
|
xsb.xsb_simple_sounds_offset = read_32bit(0x22, streamFile);
|
||||||
@ -773,17 +773,17 @@ static int get_xsb_name(char * buf, size_t maxsize, int target_subsong, xwb_head
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
s->wavebank = 0; //read_8bit(off+suboff + 0x02, streamFile);
|
s->wavebank = 0; //(uint8_t)read_8bit(off+suboff + 0x02, streamFile);
|
||||||
s->stream_index = read_16bit(off+0x02, streamFile);
|
s->stream_index = (uint16_t)read_16bit(off+0x02, streamFile);
|
||||||
s->sound_offset = off;
|
s->sound_offset = off;
|
||||||
s->name_offset = read_16bit(off+0x04, streamFile);
|
s->name_offset = (uint16_t)read_16bit(off+0x04, streamFile);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* Each XSB sound has a variable size and somewhere inside is the stream/wavebank index.
|
/* Each XSB sound has a variable size and somewhere inside is the stream/wavebank index.
|
||||||
* Various flags control the sound layout, but I can't make sense of them so quick hack instead */
|
* Various flags control the sound layout, but I can't make sense of them so quick hack instead */
|
||||||
flag = read_8bit(off+0x00, streamFile);
|
flag = read_8bit(off+0x00, streamFile);
|
||||||
//0x01 16b unk, 0x03: 8b unk 04: 16b unk, 06: 8b unk
|
//0x01 16b unk, 0x03: 8b unk 04: 16b unk, 06: 8b unk
|
||||||
size = read_16bit(off+0x07, streamFile);
|
size = (uint16_t)read_16bit(off+0x07, streamFile);
|
||||||
|
|
||||||
if (!(flag & 0x01)) { /* simple sound */
|
if (!(flag & 0x01)) { /* simple sound */
|
||||||
suboff = 0x09;
|
suboff = 0x09;
|
||||||
@ -792,7 +792,7 @@ static int get_xsb_name(char * buf, size_t maxsize, int target_subsong, xwb_head
|
|||||||
if (flag==0x01 || flag==0x03 || flag==0x05 || flag==0x07) {
|
if (flag==0x01 || flag==0x03 || flag==0x05 || flag==0x07) {
|
||||||
if (size == 0x49) { //grotesque hack for Eschatos (these flags are way too complex)
|
if (size == 0x49) { //grotesque hack for Eschatos (these flags are way too complex)
|
||||||
suboff = 0x23;
|
suboff = 0x23;
|
||||||
} else if (size % 2 == 1 && read_16bit(off+size-0x2, streamFile)!=0) {
|
} else if (size % 2 == 1 && (uint16_t)read_16bit(off+size-0x2, streamFile)!=0) {
|
||||||
suboff = size - 0x08 - 0x07; //7 unk bytes at the end
|
suboff = size - 0x08 - 0x07; //7 unk bytes at the end
|
||||||
} else {
|
} else {
|
||||||
suboff = size - 0x08;
|
suboff = size - 0x08;
|
||||||
@ -805,8 +805,8 @@ static int get_xsb_name(char * buf, size_t maxsize, int target_subsong, xwb_head
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
s->stream_index = read_16bit(off+suboff + 0x00, streamFile);
|
s->stream_index = (uint16_t)read_16bit(off+suboff + 0x00, streamFile);
|
||||||
s->wavebank = read_8bit(off+suboff + 0x02, streamFile);
|
s->wavebank = (uint8_t)read_8bit(off+suboff + 0x02, streamFile);
|
||||||
s->sound_offset = off;
|
s->sound_offset = off;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user