From b4ce515213ff8904a5609efa2a335a3eea9367e9 Mon Sep 17 00:00:00 2001 From: manakoAT Date: Thu, 21 Jan 2010 19:25:50 +0000 Subject: [PATCH] small idsp fixes git-svn-id: https://vgmstream.svn.sourceforge.net/svnroot/vgmstream@726 51a99a44-fe44-0410-b1ba-c3e57ba2b86b --- src/meta/idsp.c | 87 +++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 47 deletions(-) diff --git a/src/meta/idsp.c b/src/meta/idsp.c index f27fb281..1fddb6e4 100644 --- a/src/meta/idsp.c +++ b/src/meta/idsp.c @@ -80,14 +80,17 @@ fail: -/* IDSP (Soul Calibur Legends Wii) */ +/* "idsp/IDSP" + Soul Calibur Legends (Wii) + Sky Crawlers: Innocent Aces (Wii) +*/ VGMSTREAM * init_vgmstream_idsp2(STREAMFILE *streamFile) { VGMSTREAM * vgmstream = NULL; char filename[260]; off_t start_offset; - int loop_flag; int channel_count; + int i; /* check extension, case insensitive */ streamFile->get_name(streamFile,filename,sizeof(filename)); @@ -96,7 +99,7 @@ VGMSTREAM * init_vgmstream_idsp2(STREAMFILE *streamFile) { /* check header */ if (read_32bitBE(0x00,streamFile) != 0x69647370 || /* "idsp" */ read_32bitBE(0xBC,streamFile) != 0x49445350) /* IDSP */ - goto fail; + goto fail; loop_flag = read_32bitBE(0x20,streamFile); channel_count = read_32bitBE(0xC4,streamFile); @@ -106,62 +109,52 @@ VGMSTREAM * init_vgmstream_idsp2(STREAMFILE *streamFile) { if (!vgmstream) goto fail; /* fill in the vital statistics */ - start_offset = 0x1C0; - vgmstream->channels = channel_count; - vgmstream->sample_rate = read_32bitBE(0xC8,streamFile); - vgmstream->coding_type = coding_NGC_DSP; - vgmstream->num_samples = (read_32bitBE(0x14,streamFile))*14/8/channel_count; + start_offset = (channel_count * 0x60) + 0x100; + vgmstream->channels = channel_count; + vgmstream->sample_rate = read_32bitBE(0xC8,streamFile); + vgmstream->coding_type = coding_NGC_DSP; + vgmstream->num_samples = (read_32bitBE(0x14,streamFile))*14/8/channel_count; if (loop_flag) { vgmstream->loop_start_sample = (read_32bitBE(0xD0,streamFile)); vgmstream->loop_end_sample = (read_32bitBE(0xD4,streamFile)); } - - - - - switch (read_32bitBE(0xD8,streamFile)) { - case 0x00: - vgmstream->layout_type = layout_none; - vgmstream->interleave_block_size = (get_streamfile_size(streamFile)-start_offset)/2; - break; - case 0x10: + if (channel_count == 1) { + vgmstream->layout_type = layout_none; + } else if (channel_count > 1) { vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = read_32bitBE(0xD8,streamFile); - break; + vgmstream->interleave_block_size = read_32bitBE(0xD8,streamFile); } - vgmstream->meta_type = meta_IDSP2; + { + if (vgmstream->coding_type == coding_NGC_DSP) { + for (i=0;i<16;i++) + vgmstream->ch[0].adpcm_coef[i] = read_16bitBE(0x118+i*2,streamFile); + } + if (channel_count == 2) { + for (i=0;i<16;i++) + vgmstream->ch[1].adpcm_coef[i] = read_16bitBE(0x178+i*2,streamFile); + } + } - if (vgmstream->coding_type == coding_NGC_DSP) { - int i; - for (i=0;i<16;i++) { - vgmstream->ch[0].adpcm_coef[i] = read_16bitBE(0x118+i*2,streamFile); - } - if (vgmstream->channels) { - for (i=0;i<16;i++) { - vgmstream->ch[1].adpcm_coef[i] = read_16bitBE(0x178+i*2,streamFile); - } - } - } + /* open the file for reading */ + { + int i; + STREAMFILE * file; + file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); + if (!file) goto fail; + for (i=0;ich[i].streamfile = file; + + vgmstream->ch[i].channel_start_offset= + vgmstream->ch[i].offset=start_offset+ + vgmstream->interleave_block_size*i; + + } + } - /* open the file for reading */ - { - int i; - STREAMFILE * file; - file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); - if (!file) goto fail; - for (i=0;ich[i].streamfile = file; - - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset=start_offset+ - vgmstream->interleave_block_size*i; - - } - } return vgmstream;