From 0482a120bc250bbe5334817a8919829e81ec3842 Mon Sep 17 00:00:00 2001 From: bnnm Date: Fri, 13 Apr 2018 16:40:50 +0200 Subject: [PATCH] Minor cleanup --- src/formats.c | 2 +- src/layout/blocked_ps2_iab.c | 21 +++++++----- src/meta/ps2_iab.c | 63 ++++++++++++++---------------------- 3 files changed, 38 insertions(+), 48 deletions(-) diff --git a/src/formats.c b/src/formats.c index d90f7e4e..8a452ca7 100644 --- a/src/formats.c +++ b/src/formats.c @@ -887,7 +887,7 @@ static const meta_info meta_info_list[] = { {meta_PS2_SPM, "SPM header"}, {meta_X360_TRA, "Terminal Reality .TRA raw header"}, {meta_PS2_VGS, "Princess Soft VGS header"}, - {meta_PS2_IAB, "IAB header"}, + {meta_PS2_IAB, "Runtime .IAB header"}, {meta_PS2_STRLR, "STR L/R header"}, {meta_LSF_N1NJ4N, ".lsf !n1nj4n header"}, {meta_VAWX, "feelplus VAWX header"}, diff --git a/src/layout/blocked_ps2_iab.c b/src/layout/blocked_ps2_iab.c index e91c94a4..5ec5a061 100644 --- a/src/layout/blocked_ps2_iab.c +++ b/src/layout/blocked_ps2_iab.c @@ -1,17 +1,22 @@ #include "layout.h" #include "../vgmstream.h" -/* set up for the block at the given offset */ +/* blocks with mini header (0x48124812 + unknown + block data + block size) */ void block_update_ps2_iab(off_t block_offset, VGMSTREAM * vgmstream) { + STREAMFILE* streamFile = vgmstream->ch[0].streamfile; int i; + size_t block_size, channel_size; - vgmstream->current_block_offset = block_offset; - vgmstream->current_block_size = read_32bitLE(vgmstream->current_block_offset+0x08,vgmstream->ch[0].streamfile); - vgmstream->next_block_offset = vgmstream->current_block_offset+vgmstream->current_block_size+0x10; - vgmstream->current_block_size/=vgmstream->channels; + channel_size = read_32bitLE(block_offset+0x08,streamFile) / vgmstream->channels; + block_size = read_32bitLE(block_offset+0x0c,streamFile); + if (!block_size) + block_size = 0x10; /* happens on last block */ - for (i=0;ichannels;i++) { - vgmstream->ch[i].offset = vgmstream->current_block_offset+0x10+(vgmstream->current_block_size*i); - + vgmstream->current_block_size = channel_size; + vgmstream->current_block_offset = block_offset; + vgmstream->next_block_offset = block_offset + block_size; + + for (i = 0; i < vgmstream->channels; i++) { + vgmstream->ch[i].offset = block_offset + 0x10 + channel_size*i; } } diff --git a/src/meta/ps2_iab.c b/src/meta/ps2_iab.c index 0d010ae5..593cb4f8 100644 --- a/src/meta/ps2_iab.c +++ b/src/meta/ps2_iab.c @@ -1,70 +1,55 @@ #include "meta.h" #include "../layout/layout.h" +#include "../coding/coding.h" #include "../util.h" -/* IAB: Ueki no Housoku - Taosu ze Robert Juudan!! (PS2) */ +/* .IAB - from Runtime(?) games [Ueki no Housoku - Taosu ze Robert Juudan!! (PS2), RPG Maker 3 (PS2)] */ VGMSTREAM * init_vgmstream_ps2_iab(STREAMFILE *streamFile) { VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - int loop_flag = 0; - int channel_count; - int i; - off_t start_offset; + off_t start_offset; + int loop_flag, channel_count; - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("iab",filename_extension(filename))) goto fail; - /* check header */ + /* checks */ + if (!check_extensions(streamFile,"iab")) + goto fail; + if (read_32bitBE(0x00,streamFile) != 0x10000000) goto fail; - - /* check file size */ if (read_32bitLE(0x1C,streamFile) != get_streamfile_size(streamFile)) goto fail; loop_flag = 0; channel_count = 2; - + start_offset = 0x40; + /* build the VGMSTREAM */ vgmstream = allocate_vgmstream(channel_count,loop_flag); if (!vgmstream) goto fail; - /* fill in the vital statistics */ - start_offset = 0x40; - vgmstream->channels = channel_count; - vgmstream->sample_rate = read_32bitLE(0x4,streamFile); - vgmstream->coding_type = coding_PSX; - - vgmstream->layout_type = layout_blocked_ps2_iab; - vgmstream->interleave_block_size = read_32bitLE(0xC, streamFile); + vgmstream->sample_rate = read_32bitLE(0x04,streamFile); vgmstream->meta_type = meta_PS2_IAB; + vgmstream->coding_type = coding_PSX; + vgmstream->layout_type = layout_blocked_ps2_iab; + //vgmstream->interleave_block_size = read_32bitLE(0x0C, streamFile); /* unneeded */ - /* open the file for reading by each channel */ + if (!vgmstream_open_stream(vgmstream,streamFile,start_offset)) + goto fail; + + /* calc num_samples */ { - for (i=0;ich[i].streamfile = streamFile->open(streamFile, filename, vgmstream->interleave_block_size); - if (!vgmstream->ch[i].streamfile) goto fail; + vgmstream->next_block_offset = start_offset; + do { + block_update_ps2_iab(vgmstream->next_block_offset, vgmstream); + vgmstream->num_samples += ps_bytes_to_samples(vgmstream->current_block_size, 1); } + while (vgmstream->next_block_offset < get_streamfile_size(streamFile)); } - /* Calc num_samples */ block_update_ps2_iab(start_offset, vgmstream); - vgmstream->num_samples=0; - - do - { - vgmstream->num_samples += 0x4000 * 14 / 16; - block_update_ps2_iab(vgmstream->next_block_offset, vgmstream); - } while (vgmstream->next_block_offset < get_streamfile_size(streamFile)); - - block_update_ps2_iab(start_offset, vgmstream); - return vgmstream; - /* clean up anything we may have opened */ fail: - if (vgmstream) close_vgmstream(vgmstream); + close_vgmstream(vgmstream); return NULL; }