Redo Blitz Games STR+WAV [Zapper (GC), Tak (PS2)]

Also removes 3 metas that parsed Blitz stuff
This commit is contained in:
bnnm 2018-08-04 21:02:10 +02:00
parent 10dc43f2fb
commit 790525f990
11 changed files with 465 additions and 549 deletions

View File

@ -704,7 +704,7 @@ static const meta_info meta_info_list[] = {
{meta_PS2_VAGm, "Sony VAG Mono header (VAGm)"}, {meta_PS2_VAGm, "Sony VAG Mono header (VAGm)"},
{meta_PS2_pGAV, "Sony VAG Stereo Little Endian header (pGAV)"}, {meta_PS2_pGAV, "Sony VAG Stereo Little Endian header (pGAV)"},
{meta_PSX_GMS, "assumed Grandia GMS file by .gms extension"}, {meta_PSX_GMS, "assumed Grandia GMS file by .gms extension"},
{meta_PS2_STR, "assumed STR + STH File by .str & .sth extension"}, {meta_STR_WAV, "Blitz Games STR+WAV header"},
{meta_PS2_ILD, "ILD header"}, {meta_PS2_ILD, "ILD header"},
{meta_PS2_PNB, "assumed PNB (PsychoNauts Bgm File) by .pnb extension"}, {meta_PS2_PNB, "assumed PNB (PsychoNauts Bgm File) by .pnb extension"},
{meta_XBOX_WAVM, "Xbox WAVM raw header"}, {meta_XBOX_WAVM, "Xbox WAVM raw header"},
@ -851,7 +851,6 @@ static const meta_info meta_info_list[] = {
{meta_PS2_SND, "Might and Magic SSND Header"}, {meta_PS2_SND, "Might and Magic SSND Header"},
{meta_PS2_VSF_TTA, "VSF with SMSS Header"}, {meta_PS2_VSF_TTA, "VSF with SMSS Header"},
{meta_ADS, "dhSS Header"}, {meta_ADS, "dhSS Header"},
{meta_WII_STR, "HOTD Overkill - STR+STH WII Header"},
{meta_PS2_MCG, "Gunvari MCG Header"}, {meta_PS2_MCG, "Gunvari MCG Header"},
{meta_ZSD, "ZSD Header"}, {meta_ZSD, "ZSD Header"},
{meta_RedSpark, "RedSpark Header"}, {meta_RedSpark, "RedSpark Header"},
@ -908,7 +907,6 @@ static const meta_info meta_info_list[] = {
{meta_PS2_B1S, "B1S header"}, {meta_PS2_B1S, "B1S header"},
{meta_PS2_WAD, "WAD header"}, {meta_PS2_WAD, "WAD header"},
{meta_DSP_XIII, "XIII dsp header"}, {meta_DSP_XIII, "XIII dsp header"},
{meta_NGC_DSP_STH_STR, "STH dsp header"},
{meta_DSP_CABELAS, "Cabelas games dsp header"}, {meta_DSP_CABELAS, "Cabelas games dsp header"},
{meta_PS2_ADM, "Dragon Quest V .ADM raw header"}, {meta_PS2_ADM, "Dragon Quest V .ADM raw header"},
{meta_PS2_LPCM, "LPCM header"}, {meta_PS2_LPCM, "LPCM header"},

View File

@ -400,10 +400,6 @@
RelativePath=".\meta\dsp_bdsp.c" RelativePath=".\meta\dsp_bdsp.c"
> >
</File> </File>
<File
RelativePath=".\meta\dsp_sth_str.c"
>
</File>
<File <File
RelativePath=".\meta\ea_schl.c" RelativePath=".\meta\ea_schl.c"
> >
@ -1038,10 +1034,6 @@
RelativePath=".\meta\ps2_ster.c" RelativePath=".\meta\ps2_ster.c"
> >
</File> </File>
<File
RelativePath=".\meta\ps2_str.c"
>
</File>
<File <File
RelativePath=".\meta\ps2_strlr.c" RelativePath=".\meta\ps2_strlr.c"
> >
@ -1286,6 +1278,10 @@
RelativePath=".\meta\str_snds.c" RelativePath=".\meta\str_snds.c"
> >
</File> </File>
<File
RelativePath=".\meta\str_wav.c"
>
</File>
<File <File
RelativePath=".\meta\stx.c" RelativePath=".\meta\stx.c"
> >
@ -1398,10 +1394,6 @@
RelativePath=".\meta\wii_sng.c" RelativePath=".\meta\wii_sng.c"
> >
</File> </File>
<File
RelativePath=".\meta\wii_str.c"
>
</File>
<File <File
RelativePath=".\meta\wii_sts.c" RelativePath=".\meta\wii_sts.c"
> >

View File

@ -218,7 +218,6 @@
<ClCompile Include="meta\dmsg_segh.c" /> <ClCompile Include="meta\dmsg_segh.c" />
<ClCompile Include="meta\dsp_adx.c" /> <ClCompile Include="meta\dsp_adx.c" />
<ClCompile Include="meta\dsp_bdsp.c" /> <ClCompile Include="meta\dsp_bdsp.c" />
<ClCompile Include="meta\dsp_sth_str.c" />
<ClCompile Include="meta\ea_schl.c" /> <ClCompile Include="meta\ea_schl.c" />
<ClCompile Include="meta\ea_schl_fixed.c" /> <ClCompile Include="meta\ea_schl_fixed.c" />
<ClCompile Include="meta\ea_1snh.c" /> <ClCompile Include="meta\ea_1snh.c" />
@ -353,7 +352,6 @@
<ClCompile Include="meta\ps2_snd.c" /> <ClCompile Include="meta\ps2_snd.c" />
<ClCompile Include="meta\ps2_sps.c" /> <ClCompile Include="meta\ps2_sps.c" />
<ClCompile Include="meta\ps2_ster.c" /> <ClCompile Include="meta\ps2_ster.c" />
<ClCompile Include="meta\ps2_str.c" />
<ClCompile Include="meta\ps2_svag.c" /> <ClCompile Include="meta\ps2_svag.c" />
<ClCompile Include="meta\ps2_svag_snk.c" /> <ClCompile Include="meta\ps2_svag_snk.c" />
<ClCompile Include="meta\ps2_tec.c" /> <ClCompile Include="meta\ps2_tec.c" />
@ -403,6 +401,7 @@
<ClCompile Include="meta\stm.c" /> <ClCompile Include="meta\stm.c" />
<ClCompile Include="meta\str_asr.c" /> <ClCompile Include="meta\str_asr.c" />
<ClCompile Include="meta\str_snds.c" /> <ClCompile Include="meta\str_snds.c" />
<ClCompile Include="meta\str_wav.c" />
<ClCompile Include="meta\stx.c" /> <ClCompile Include="meta\stx.c" />
<ClCompile Include="meta\svs.c" /> <ClCompile Include="meta\svs.c" />
<ClCompile Include="meta\sxd.c" /> <ClCompile Include="meta\sxd.c" />
@ -427,7 +426,6 @@
<ClCompile Include="meta\wii_mus.c" /> <ClCompile Include="meta\wii_mus.c" />
<ClCompile Include="meta\wii_smp.c" /> <ClCompile Include="meta\wii_smp.c" />
<ClCompile Include="meta\wii_sng.c" /> <ClCompile Include="meta\wii_sng.c" />
<ClCompile Include="meta\wii_str.c" />
<ClCompile Include="meta\wii_sts.c" /> <ClCompile Include="meta\wii_sts.c" />
<ClCompile Include="meta\ws_aud.c" /> <ClCompile Include="meta\ws_aud.c" />
<ClCompile Include="meta\wv6.c" /> <ClCompile Include="meta\wv6.c" />

View File

@ -244,9 +244,6 @@
<ClCompile Include="meta\dsp_bdsp.c"> <ClCompile Include="meta\dsp_bdsp.c">
<Filter>meta\Source Files</Filter> <Filter>meta\Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="meta\dsp_sth_str.c">
<Filter>meta\Source Files</Filter>
</ClCompile>
<ClCompile Include="meta\ea_schl.c"> <ClCompile Include="meta\ea_schl.c">
<Filter>meta\Source Files</Filter> <Filter>meta\Source Files</Filter>
</ClCompile> </ClCompile>
@ -634,9 +631,6 @@
<ClCompile Include="meta\ps2_ster.c"> <ClCompile Include="meta\ps2_ster.c">
<Filter>meta\Source Files</Filter> <Filter>meta\Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="meta\ps2_str.c">
<Filter>meta\Source Files</Filter>
</ClCompile>
<ClCompile Include="meta\ps2_svag.c"> <ClCompile Include="meta\ps2_svag.c">
<Filter>meta\Source Files</Filter> <Filter>meta\Source Files</Filter>
</ClCompile> </ClCompile>
@ -784,6 +778,9 @@
<ClCompile Include="meta\str_snds.c"> <ClCompile Include="meta\str_snds.c">
<Filter>meta\Source Files</Filter> <Filter>meta\Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="meta\str_wav.c">
<Filter>meta\Source Files</Filter>
</ClCompile>
<ClCompile Include="meta\stx.c"> <ClCompile Include="meta\stx.c">
<Filter>meta\Source Files</Filter> <Filter>meta\Source Files</Filter>
</ClCompile> </ClCompile>
@ -856,9 +853,6 @@
<ClCompile Include="meta\wii_sng.c"> <ClCompile Include="meta\wii_sng.c">
<Filter>meta\Source Files</Filter> <Filter>meta\Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="meta\wii_str.c">
<Filter>meta\Source Files</Filter>
</ClCompile>
<ClCompile Include="meta\wii_sts.c"> <ClCompile Include="meta\wii_sts.c">
<Filter>meta\Source Files</Filter> <Filter>meta\Source Files</Filter>
</ClCompile> </ClCompile>

View File

@ -1,320 +0,0 @@
#include "meta.h"
#include "../util.h"
/*
STH+STR
found in SpongebobSquarepants: Creature From The Krusty Krab (NGC)
*/
VGMSTREAM * init_vgmstream_ngc_dsp_sth_str1(STREAMFILE *streamFile) {
VGMSTREAM * vgmstream = NULL;
STREAMFILE * streamFileSTR = NULL;
char filename[PATH_LIMIT];
char filenameSTR[PATH_LIMIT];
int i, j;
int channel_count;
int loop_flag;
off_t coef_table[8] = {0x12C,0x18C,0x1EC,0x24C,0x2AC,0x30C,0x36C,0x3CC};
/* check extension, case insensitive */
streamFile->get_name(streamFile,filename,sizeof(filename));
if (strcasecmp("sth",filename_extension(filename))) goto fail;
strcpy(filenameSTR,filename);
strcpy(filenameSTR+strlen(filenameSTR)-3,"str");
streamFileSTR = streamFile->open(streamFile,filenameSTR,STREAMFILE_DEFAULT_BUFFER_SIZE);
if (!streamFileSTR) goto fail;
if (read_32bitBE(0x0,streamFile) != 0x0)
{
goto fail;
}
if (read_32bitBE(0x4,streamFile) != 0x800)
{
goto fail;
}
/* Not really channel_count, just 'included tracks * channels per track */
loop_flag = (read_32bitBE(0xD8,streamFile) != 0xFFFFFFFF);
channel_count = (read_32bitBE(0x70,streamFile)) * (read_32bitBE(0x88,streamFile));
if (channel_count > 8)
{
goto fail;
}
/* build the VGMSTREAM */
vgmstream = allocate_vgmstream(channel_count,loop_flag);
if (!vgmstream) goto fail;
/* fill in the vital statistics */
vgmstream->channels = channel_count;
vgmstream->sample_rate = read_32bitBE(0x24,streamFile);
vgmstream->num_samples=get_streamfile_size(streamFileSTR)/8/channel_count*14;
vgmstream->coding_type = coding_NGC_DSP;
if(loop_flag)
{
vgmstream->loop_start_sample = read_32bitBE(0xD8,streamFile);
vgmstream->loop_end_sample = read_32bitBE(0xDC,streamFile);
}
if (channel_count == 1)
{
vgmstream->layout_type = layout_none;
}
else
{
vgmstream->layout_type = layout_interleave;
if (channel_count == 2)
{
vgmstream->interleave_block_size=0x10000;
}
else
{
vgmstream->interleave_block_size=0x8000;
}
}
vgmstream->meta_type = meta_NGC_DSP_STH_STR;
/* open the file for reading */
for (i=0;i<channel_count;i++)
{
vgmstream->ch[i].streamfile = streamFileSTR->open(streamFileSTR,filenameSTR,0x8000);
if (!vgmstream->ch[i].streamfile) goto fail;
vgmstream->ch[i].channel_start_offset=vgmstream->ch[i].offset=i*vgmstream->interleave_block_size;
}
// COEFFS
for (j=0;j<vgmstream->channels;j++)
{
for (i=0;i<16;i++)
{
vgmstream->ch[j].adpcm_coef[i] = read_16bitBE(coef_table[j]+i*2,streamFile);
}
}
close_streamfile(streamFileSTR); streamFileSTR=NULL;
return vgmstream;
/* clean up anything we may have opened */
fail:
if (streamFileSTR) close_streamfile(streamFileSTR);
if (vgmstream) close_vgmstream(vgmstream);
return NULL;
}
/*
STH+STR
found in Taz Wanted (NGC), Cubix Robots for Everyone: Showdown (NGC)
*/
VGMSTREAM * init_vgmstream_ngc_dsp_sth_str2(STREAMFILE *streamFile) {
VGMSTREAM * vgmstream = NULL;
STREAMFILE * streamFileSTR = NULL;
char filename[PATH_LIMIT];
char filenameSTR[PATH_LIMIT];
int i, j;
int channel_count;
int loop_flag;
off_t coef_table[8] = {0xDC,0x13C,0x19C,0x1FC,0x25C,0x2BC,0x31C,0x37C};
/* check extension, case insensitive */
streamFile->get_name(streamFile,filename,sizeof(filename));
if (strcasecmp("sth",filename_extension(filename))) goto fail;
strcpy(filenameSTR,filename);
strcpy(filenameSTR+strlen(filenameSTR)-3,"str");
streamFileSTR = streamFile->open(streamFile,filenameSTR,STREAMFILE_DEFAULT_BUFFER_SIZE);
if (!streamFileSTR) goto fail;
if (read_32bitBE(0x0,streamFile) != 0x0)
{
goto fail;
}
if (read_32bitBE(0x4,streamFile) != 0x900)
{
goto fail;
}
/* Not really channel_count, just 'included tracks * channels per track */
loop_flag = (read_32bitBE(0xB8,streamFile) != 0xFFFFFFFF);
channel_count = read_32bitBE(0x50,streamFile)*2;
if (channel_count > 8)
{
goto fail;
}
/* build the VGMSTREAM */
vgmstream = allocate_vgmstream(channel_count,loop_flag);
if (!vgmstream) goto fail;
/* fill in the vital statistics */
vgmstream->channels = channel_count;
vgmstream->sample_rate = read_32bitBE(0x24,streamFile);
vgmstream->num_samples=get_streamfile_size(streamFileSTR)/8/channel_count*14;
vgmstream->coding_type = coding_NGC_DSP;
if(loop_flag)
{
vgmstream->loop_start_sample = read_32bitBE(0xB8,streamFile);
vgmstream->loop_end_sample = read_32bitBE(0xBC,streamFile);
}
if (channel_count == 1)
{
vgmstream->layout_type = layout_none;
}
else
{
vgmstream->layout_type = layout_interleave;
if (channel_count == 2)
{
vgmstream->interleave_block_size=0x10000;
}
else
{
vgmstream->interleave_block_size=0x8000;
}
}
vgmstream->meta_type = meta_NGC_DSP_STH_STR;
/* open the file for reading */
for (i=0;i<channel_count;i++)
{
vgmstream->ch[i].streamfile = streamFileSTR->open(streamFileSTR,filenameSTR,0x8000);
if (!vgmstream->ch[i].streamfile) goto fail;
vgmstream->ch[i].channel_start_offset=vgmstream->ch[i].offset=i*vgmstream->interleave_block_size;
}
// COEFFS
for (j=0;j<vgmstream->channels;j++)
{
for (i=0;i<16;i++)
{
vgmstream->ch[j].adpcm_coef[i] = read_16bitBE(coef_table[j]+i*2,streamFile);
}
}
close_streamfile(streamFileSTR); streamFileSTR=NULL;
return vgmstream;
/* clean up anything we may have opened */
fail:
if (streamFileSTR) close_streamfile(streamFileSTR);
if (vgmstream) close_vgmstream(vgmstream);
return NULL;
}
/*
STH+STR
found in Tak and the Guardians of Gross (WII)
*/
VGMSTREAM * init_vgmstream_ngc_dsp_sth_str3(STREAMFILE *streamFile) {
VGMSTREAM * vgmstream = NULL;
STREAMFILE * streamFileSTR = NULL;
char filename[PATH_LIMIT];
char filenameSTR[PATH_LIMIT];
int i, j;
int channel_count;
int loop_flag;
off_t coef_table[8] = {read_32bitBE(0x7C,streamFile),read_32bitBE(0x80,streamFile),read_32bitBE(0x84,streamFile),read_32bitBE(0x88,streamFile),read_32bitBE(0x8C,streamFile),read_32bitBE(0x90,streamFile),read_32bitBE(0x94,streamFile),read_32bitBE(0x98,streamFile)};
/* check extension, case insensitive */
streamFile->get_name(streamFile,filename,sizeof(filename));
if (strcasecmp("sth",filename_extension(filename))) goto fail;
strcpy(filenameSTR,filename);
strcpy(filenameSTR+strlen(filenameSTR)-3,"str");
streamFileSTR = streamFile->open(streamFile,filenameSTR,STREAMFILE_DEFAULT_BUFFER_SIZE);
if (!streamFileSTR) goto fail;
if (read_32bitBE(0x0,streamFile) != 0x0)
{
goto fail;
}
if ((read_32bitBE(0x4,streamFile) != 0x700) &&
(read_32bitBE(0x4,streamFile) != 0x800))
{
goto fail;
}
/* Not really channel_count, just 'included tracks * channels per track */
loop_flag = 0;
channel_count = read_32bitBE(0x70,streamFile);
if (channel_count > 8)
{
goto fail;
}
/* build the VGMSTREAM */
vgmstream = allocate_vgmstream(channel_count,loop_flag);
if (!vgmstream) goto fail;
/* fill in the vital statistics */
vgmstream->channels = channel_count;
vgmstream->sample_rate = read_32bitBE(0x38,streamFile);
vgmstream->num_samples=get_streamfile_size(streamFileSTR)/8/channel_count*14;
vgmstream->coding_type = coding_NGC_DSP;
if(loop_flag)
{
vgmstream->loop_start_sample = 0;
vgmstream->loop_end_sample = 0;
}
if (channel_count == 1)
{
vgmstream->layout_type = layout_none;
}
else
{
vgmstream->layout_type = layout_interleave;
if (channel_count == 2 || channel_count == 4)
{
vgmstream->interleave_block_size=0x8000;
}
else
{
vgmstream->interleave_block_size=0x4000;
}
}
vgmstream->meta_type = meta_NGC_DSP_STH_STR;
/* open the file for reading */
for (i=0;i<channel_count;i++)
{
vgmstream->ch[i].streamfile = streamFileSTR->open(streamFileSTR,filenameSTR,0x8000);
if (!vgmstream->ch[i].streamfile) goto fail;
vgmstream->ch[i].channel_start_offset=vgmstream->ch[i].offset=i*vgmstream->interleave_block_size;
}
// COEFFS
for (j=0;j<vgmstream->channels;j++)
{
for (i=0;i<16;i++)
{
vgmstream->ch[j].adpcm_coef[i] = read_16bitBE(coef_table[j]+i*2,streamFile);
}
}
close_streamfile(streamFileSTR); streamFileSTR=NULL;
return vgmstream;
/* clean up anything we may have opened */
fail:
if (streamFileSTR) close_streamfile(streamFileSTR);
if (vgmstream) close_vgmstream(vgmstream);
return NULL;
}

View File

@ -69,8 +69,6 @@ VGMSTREAM * init_vgmstream_ps2_vag(STREAMFILE *streamFile);
VGMSTREAM * init_vgmstream_psx_gms(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_psx_gms(STREAMFILE *streamFile);
VGMSTREAM * init_vgmstream_ps2_str(STREAMFILE *streamFile);
VGMSTREAM * init_vgmstream_ps2_ild(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_ps2_ild(STREAMFILE *streamFile);
VGMSTREAM * init_vgmstream_ps2_pnb(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_ps2_pnb(STREAMFILE *streamFile);
@ -385,8 +383,6 @@ VGMSTREAM * init_vgmstream_ps2_vsf_tta(STREAMFILE *streamFile);
VGMSTREAM * init_vgmstream_ads(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_ads(STREAMFILE *streamFile);
VGMSTREAM * init_vgmstream_wii_str(STREAMFILE *streamFile);
VGMSTREAM * init_vgmstream_ps2_mcg(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_ps2_mcg(STREAMFILE *streamFile);
VGMSTREAM * init_vgmstream_zsd(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_zsd(STREAMFILE *streamFile);
@ -490,10 +486,6 @@ VGMSTREAM * init_vgmstream_dsp_str_ig(STREAMFILE* streamFile);
VGMSTREAM * init_vgmstream_ea_swvr(STREAMFILE* streamFile); VGMSTREAM * init_vgmstream_ea_swvr(STREAMFILE* streamFile);
VGMSTREAM * init_vgmstream_ngc_dsp_sth_str1(STREAMFILE* streamFile);
VGMSTREAM * init_vgmstream_ngc_dsp_sth_str2(STREAMFILE* streamFile);
VGMSTREAM * init_vgmstream_ngc_dsp_sth_str3(STREAMFILE* streamFile);
VGMSTREAM * init_vgmstream_ps2_b1s(STREAMFILE* streamFile); VGMSTREAM * init_vgmstream_ps2_b1s(STREAMFILE* streamFile);
VGMSTREAM * init_vgmstream_ps2_wad(STREAMFILE* streamFile); VGMSTREAM * init_vgmstream_ps2_wad(STREAMFILE* streamFile);
@ -773,4 +765,6 @@ VGMSTREAM * init_vgmstream_ckb(STREAMFILE *streamFile);
VGMSTREAM * init_vgmstream_wv6(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_wv6(STREAMFILE *streamFile);
VGMSTREAM * init_vgmstream_str_wav(STREAMFILE *streamFile);
#endif /*_META_H*/ #endif /*_META_H*/

View File

@ -1,96 +0,0 @@
#include "meta.h"
#include "../util.h"
/* STR
2008-05-19 - Fastelbja : Test version ...
*/
VGMSTREAM * init_vgmstream_ps2_str(STREAMFILE *streamFile) {
VGMSTREAM * vgmstream = NULL;
STREAMFILE * infileSTH = NULL;
char filename[PATH_LIMIT];
char * filenameSTH = NULL;
int i, channel_count, loop_flag;
/* check extension, case insensitive */
streamFile->get_name(streamFile,filename,sizeof(filename));
if (strcasecmp("str",filename_extension(filename))) goto fail;
/* check for .MIH file */
filenameSTH=(char *)malloc(strlen(filename)+1);
if (!filenameSTH) goto fail;
strcpy(filenameSTH,filename);
strcpy(filenameSTH+strlen(filenameSTH)-3,"STH");
infileSTH = streamFile->open(streamFile,filenameSTH,STREAMFILE_DEFAULT_BUFFER_SIZE);
/* STH File is necessary, so we can't confuse those file */
/* with others .STR file as it is a very common extension */
if (!infileSTH) goto fail;
if(read_32bitLE(0x2C,infileSTH)==0)
goto fail;
if((read_32bitLE(0x2C,infileSTH)==0x07) ||
(read_32bitLE(0x2C,infileSTH)==0x06))
channel_count=2;
if(read_32bitLE(0x2C,infileSTH)==0x05)
channel_count=1;
loop_flag = read_32bitLE(0x2C,infileSTH) & 0x01;
/* build the VGMSTREAM */
vgmstream = allocate_vgmstream(channel_count,loop_flag);
if (!vgmstream) goto fail;
/* fill in the vital statistics */
vgmstream->channels = channel_count;
vgmstream->sample_rate = read_32bitLE(0x24,infileSTH);
vgmstream->interleave_block_size=0x4000;
if(read_32bitLE(0x40,infileSTH)==0x01)
vgmstream->interleave_block_size = 0x8000;
vgmstream->num_samples=read_32bitLE(0x20,infileSTH);
vgmstream->coding_type = coding_PSX;
vgmstream->layout_type = layout_interleave;
vgmstream->meta_type = meta_PS2_STR;
if(loop_flag) {
vgmstream->loop_start_sample = 0;
vgmstream->loop_end_sample = read_32bitLE(0x20,infileSTH);
}
close_streamfile(infileSTH); infileSTH=NULL;
/* open the file for reading by each channel */
{
for (i=0;i<channel_count;i++) {
vgmstream->ch[i].streamfile = streamFile->open(streamFile,filename,vgmstream->interleave_block_size);
if (!vgmstream->ch[i].streamfile) goto fail;
vgmstream->ch[i].channel_start_offset=
vgmstream->ch[i].offset+=(off_t)(vgmstream->interleave_block_size*i);
}
}
return vgmstream;
/* clean up anything we may have opened */
fail:
if (infileSTH) close_streamfile(infileSTH);
if (filenameSTH) {free(filenameSTH); filenameSTH=NULL;}
if (vgmstream) close_vgmstream(vgmstream);
return NULL;
}

452
src/meta/str_wav.c Normal file
View File

@ -0,0 +1,452 @@
#include "meta.h"
#include "../coding/coding.h"
typedef enum { PSX, DSP, XBOX, WMA } strwav_codec;
typedef struct {
int32_t channels;
int32_t sample_rate;
int32_t num_samples;
int32_t loop_start;
int32_t loop_end;
int32_t loop_flag;
size_t interleave;
off_t coefs_offset;
off_t dsps_table;
off_t coefs_table;
uint32_t flags;
strwav_codec codec;
} strwav_header;
static int parse_header(STREAMFILE* streamHeader, strwav_header* strwav);
/* STR+WAV - Blitz Games streams+header */
VGMSTREAM * init_vgmstream_str_wav(STREAMFILE *streamFile) {
VGMSTREAM * vgmstream = NULL;
STREAMFILE * streamHeader = NULL;
strwav_header strwav = {0};
off_t start_offset;
/* checks */
if (!check_extensions(streamFile, "str"))
goto fail;
/* get external header (extracted with filenames from bigfiles) */
{
/* try with standard file.wav.str=body + file.wav=header (or file.wma.str + file.wma for Fuzion Frenzy (Xbox)) */
char basename[PATH_LIMIT];
get_streamfile_basename(streamFile,basename,PATH_LIMIT);
streamHeader = open_streamfile_by_filename(streamFile, basename);
if (!streamHeader) {
/* try again with file.str=body + file.wav=header [Bad Boys II (PS2), Zapper (PS2)] */
streamHeader = open_streamfile_by_ext(streamFile, "wav");
if (!streamHeader) {
/* try again with file.str=body + file.sth=header (renamed/fake extension) */
streamHeader = open_streamfile_by_ext(streamFile, "sth");
if (!streamHeader) goto fail;
}
}
else {
if (!check_extensions(streamHeader, "wav,wma"))
goto fail;
}
}
/* detect version */
if (!parse_header(streamHeader, &strwav))
goto fail;
if (strwav.flags == 0)
goto fail;
if (strwav.channels > 8)
goto fail;
/* &0x01: loop?, &0x02: non-mono?, &0x04: stream???, &0x08: unused? */
if (strwav.flags != 0x07 && strwav.flags != 0x06 && strwav.flags != 0x05 && strwav.flags != 0x04 && strwav.flags != 0x02) {
VGM_LOG("STR+WAV: unknown flags\n");
goto fail;
}
start_offset = 0x00;
/* build the VGMSTREAM */
vgmstream = allocate_vgmstream(strwav.channels,strwav.loop_flag);
if (!vgmstream) goto fail;
vgmstream->sample_rate = strwav.sample_rate;
vgmstream->num_samples = strwav.num_samples;
if (strwav.loop_flag) {
vgmstream->loop_start_sample = strwav.loop_start;
vgmstream->loop_end_sample = strwav.loop_end;
}
vgmstream->meta_type = meta_STR_WAV;
switch(strwav.codec) {
case PSX:
vgmstream->coding_type = coding_PSX;
vgmstream->layout_type = layout_interleave;
vgmstream->interleave_block_size = strwav.interleave;
break;
case DSP:
vgmstream->coding_type = coding_NGC_DSP;
vgmstream->layout_type = layout_interleave;
vgmstream->interleave_block_size = strwav.interleave;
/* get coefs */
{
int i, ch;
for (ch = 0; ch < vgmstream->channels; ch++) {
for (i = 0; i < 16; i++) {
off_t coef_offset;
if (strwav.dsps_table) /* mini table with offsets to DSP headers */
coef_offset = read_32bitBE(strwav.dsps_table+0x04*ch,streamHeader) + 0x1c;
else if (strwav.coefs_table) /* mini table with offsets to coefs then header */
coef_offset = read_32bitBE(strwav.coefs_table+0x04*ch,streamHeader);
else
coef_offset = strwav.coefs_offset + 0x60*ch;
vgmstream->ch[ch].adpcm_coef[i] = read_16bitBE(coef_offset+i*0x02,streamHeader);
}
}
}
break;
case XBOX:
vgmstream->coding_type = coding_XBOX_IMA;
vgmstream->layout_type = layout_none;
if (strwav.channels > 2) goto fail; //todo multistreams are 2ch*N interleaved using ~0xD000
break;
#ifdef VGM_USE_FFMPEG
case WMA: {
ffmpeg_codec_data *ffmpeg_data = NULL;
ffmpeg_data = init_ffmpeg_offset(streamFile, start_offset,get_streamfile_size(streamFile));
if (!ffmpeg_data) goto fail;
vgmstream->codec_data = ffmpeg_data;
vgmstream->coding_type = coding_FFmpeg;
vgmstream->layout_type = layout_none;
vgmstream->num_samples = ffmpeg_data->totalSamples;
if (vgmstream->channels != ffmpeg_data->channels)
goto fail;
break;
}
#endif
default:
goto fail;
}
if (!vgmstream_open_stream(vgmstream,streamFile,start_offset))
goto fail;
close_streamfile(streamHeader);
return vgmstream;
fail:
close_streamfile(streamHeader);
close_vgmstream(vgmstream);
return NULL;
}
/* Parse header versions. Almost every game uses its own variation (struct serialization?),
* so detection could be improved once enough versions are known. */
static int parse_header(STREAMFILE* streamHeader, strwav_header* strwav) {
size_t header_size;
if (read_32bitBE(0x00,streamHeader) != 0x00000000)
goto fail;
header_size = get_streamfile_size(streamHeader);
//todo loop start/end values may be off for some headers
/* Fuzion Frenzy (Xbox)[2001] wma */
if ( read_32bitBE(0x04,streamHeader) == 0x00000900 &&
read_32bitLE(0x20,streamHeader) == 0 && /* no num_samples */
read_32bitLE(0x24,streamHeader) == read_32bitLE(0x80,streamHeader) && /* sample rate repeat */
read_32bitLE(0x28,streamHeader) == 0x10 &&
header_size == 0x110 /* no value in header */
) {
strwav->num_samples = read_32bitLE(0x20,streamHeader); /* 0 but will be rectified later */
strwav->sample_rate = read_32bitLE(0x24,streamHeader);
strwav->flags = read_32bitLE(0x2c,streamHeader);
strwav->loop_start = 0;
strwav->loop_end = 0;
strwav->channels = read_32bitLE(0x60,streamHeader) * (strwav->flags & 0x02 ? 2 : 1); /* tracks of 2/1ch */
strwav->loop_flag = strwav->flags & 0x01;
strwav->interleave = 0;
strwav->codec = WMA;
;VGM_LOG("STR+WAV: header Fuzion Frenzy (Xbox)\n");
return 1;
}
/* Taz: Wanted (GC)[2002] */
/* Cubix Robots for Everyone: Showdown (GC)[2003] */
if ( read_32bitBE(0x04,streamHeader) == 0x00000900 &&
read_32bitBE(0x24,streamHeader) == read_32bitBE(0x90,streamHeader) && /* sample rate repeat */
read_32bitBE(0x28,streamHeader) == 0x10 &&
read_32bitBE(0xa0,streamHeader) == header_size /* ~0x3C0 */
) {
strwav->num_samples = read_32bitBE(0x20,streamHeader);
strwav->sample_rate = read_32bitBE(0x24,streamHeader);
strwav->flags = read_32bitBE(0x2c,streamHeader);
strwav->loop_start = read_32bitBE(0xb8,streamHeader);
strwav->loop_end = read_32bitBE(0xbc,streamHeader);
strwav->channels = read_32bitBE(0x50,streamHeader) * (strwav->flags & 0x02 ? 2 : 1); /* tracks of 2/1ch */
strwav->loop_flag = strwav->flags & 0x01;
strwav->interleave = strwav->channels > 2 ? 0x8000 : 0x10000;
strwav->coefs_offset = 0xdc;
strwav->codec = DSP;
;VGM_LOG("STR+WAV: header Taz: Wanted (GC)\n");
return 1;
}
/* The Fairly OddParents - Breakin' da Rules (Xbox)[2003] */
if ( read_32bitBE(0x04,streamHeader) == 0x00000900 &&
read_32bitLE(0x24,streamHeader) == read_32bitLE(0xb0,streamHeader) && /* sample rate repeat */
read_32bitLE(0x28,streamHeader) == 0x10 &&
read_32bitLE(0xc0,streamHeader)*0x04 + read_32bitLE(0xc4,streamHeader) == header_size /* ~0xe0 + variable */
) {
strwav->num_samples = read_32bitLE(0x20,streamHeader);
strwav->sample_rate = read_32bitLE(0x24,streamHeader);
strwav->flags = read_32bitLE(0x2c,streamHeader);
strwav->loop_start = read_32bitLE(0x38,streamHeader);
strwav->loop_end = strwav->num_samples;
strwav->channels = read_32bitLE(0x70,streamHeader) * (strwav->flags & 0x02 ? 2 : 1); /* tracks of 2/1ch */
strwav->loop_flag = strwav->flags & 0x01;
strwav->interleave = strwav->channels > 2 ? 0xD000 : 0x0;
strwav->codec = XBOX;
;VGM_LOG("STR+WAV: header The Fairly OddParents (Xbox)\n");
return 1;
}
/* Bad Boys II (GC)[2004] */
if ( read_32bitBE(0x04,streamHeader) == 0x00000800 &&
read_32bitBE(0x24,streamHeader) == read_32bitBE(0xb0,streamHeader) && /* sample rate repeat */
read_32bitBE(0x24,streamHeader) == read_32bitBE(read_32bitBE(0xe0,streamHeader)+0x08,streamHeader) && /* sample rate vs 1st DSP header */
read_32bitBE(0x28,streamHeader) == 0x10 &&
read_32bitBE(0xc0,streamHeader)*0x04 + read_32bitBE(0xc4,streamHeader) == header_size /* variable + variable */
) {
strwav->num_samples = read_32bitBE(0x20,streamHeader);
strwav->sample_rate = read_32bitBE(0x24,streamHeader);
strwav->flags = read_32bitBE(0x2c,streamHeader);
strwav->loop_start = read_32bitBE(0xd8,streamHeader);
strwav->loop_end = read_32bitBE(0xdc,streamHeader);
strwav->channels = read_32bitBE(0x70,streamHeader) * read_32bitBE(0x88,streamHeader); /* tracks of Nch */
strwav->loop_flag = strwav->flags & 0x01;
strwav->interleave = strwav->channels > 2 ? 0x8000 : 0x10000;
strwav->dsps_table = 0xe0;
strwav->codec = DSP;
;VGM_LOG("STR+WAV: header Bad Boys II (GC)\n");
return 1;
}
#if 0
if ( read_32bitBE(0x04,streamHeader) == 0x00000800 &&
read_32bitBE(0x24,streamHeader) == read_32bitBE(0xb0,streamHeader) && /* sample rate repeat */
read_32bitBE(0x24,streamHeader) == read_32bitBE(read_32bitBE(0xf0,streamHeader)+0x08,streamHeader) && /* sample rate vs 1st DSP header */
read_32bitBE(0x28,streamHeader) == 0x10 &&
read_32bitBE(0xc0,streamHeader)*0x04 + read_32bitBE(0xc4,streamHeader) == header_size /* variable + variable */
) {
strwav->num_samples = read_32bitBE(0x20,streamHeader);
strwav->sample_rate = read_32bitBE(0x24,streamHeader);
strwav->flags = read_32bitBE(0x2c,streamHeader);
strwav->loop_start = read_32bitBE(0xd8,streamHeader);
strwav->loop_end = read_32bitBE(0xdc,streamHeader);
strwav->channels = read_32bitBE(0x70,streamHeader) * read_32bitBE(0x88,streamHeader); /* tracks of Nch */
strwav->loop_flag = strwav->flags & 0x01;
strwav->interleave = strwav->channels > 2 ? 0x8000 : 0x10000;
strwav->dsps_table = 0xf0;
strwav->codec = DSP;
;VGM_LOG("STR+WAV: header Pac-Man World 3 (GC)\n");
return 1;
}
#endif
/* Bad Boys II (PS2)[2004] */
/* Pac-Man World 3 (PS2)[2005] */
if ((read_32bitBE(0x04,streamHeader) == 0x00000800 ||
read_32bitBE(0x04,streamHeader) == 0x01000800) && /* rare (PW3 mu_spectral1_explore_2) */
read_32bitLE(0x24,streamHeader) == read_32bitLE(0x70,streamHeader) && /* sample rate repeat */
read_32bitLE(0x28,streamHeader) == 0x10 &&
read_32bitLE(0x78,streamHeader)*0x04 + read_32bitLE(0x7c,streamHeader) == header_size /* ~0xe0 + variable */
) {
strwav->num_samples = read_32bitLE(0x20,streamHeader);
strwav->sample_rate = read_32bitLE(0x24,streamHeader);
strwav->flags = read_32bitLE(0x2c,streamHeader);
strwav->loop_start = read_32bitLE(0x38,streamHeader);
strwav->interleave = read_32bitLE(0x40,streamHeader) == 1 ? 0x8000 : 0x4000;
strwav->loop_end = read_32bitLE(0x54,streamHeader);
strwav->channels = read_32bitLE(0x40,streamHeader) * (strwav->flags & 0x02 ? 2 : 1); /* tracks of 2/1ch */
strwav->loop_flag = strwav->flags & 0x01;
strwav->interleave = strwav->channels > 2 ? 0x4000 : 0x8000;
strwav->codec = PSX;
;VGM_LOG("STR+WAV: header Bad Boys II (PS2)\n");
return 1;
}
/* Zapper: One Wicked Cricket! (PS2)[2005] */
if ( read_32bitBE(0x04,streamHeader) == 0x00000900 &&
read_32bitLE(0x24,streamHeader) == read_32bitLE(0x70,streamHeader) && /* sample rate repeat */
read_32bitLE(0x28,streamHeader) == 0x10 &&
read_32bitLE(0x7c,streamHeader) == header_size /* ~0xD0 */
) {
strwav->num_samples = read_32bitLE(0x20,streamHeader);
strwav->sample_rate = read_32bitLE(0x24,streamHeader);
strwav->flags = read_32bitLE(0x2c,streamHeader);
strwav->loop_start = read_32bitLE(0x38,streamHeader);
strwav->loop_end = read_32bitLE(0x54,streamHeader);
strwav->channels = read_32bitLE(0x40,streamHeader) * (strwav->flags & 0x02 ? 2 : 1); /* tracks of 2/1ch */
strwav->loop_flag = strwav->flags & 0x01;
strwav->interleave = strwav->channels > 2 ? 0x4000 : 0x8000;
strwav->codec = PSX;
;VGM_LOG("STR+WAV: header Zapper (PS2)\n");
return 1;
}
/* Zapper: One Wicked Cricket! (GC)[2005] */
if ( read_32bitBE(0x04,streamHeader) == 0x00000900 &&
read_32bitBE(0x24,streamHeader) == read_32bitBE(0xB0,streamHeader) && /* sample rate repeat */
read_32bitBE(0x28,streamHeader) == 0x10 &&
read_32bitLE(0xc0,streamHeader) == header_size /* variable LE size */
) {
strwav->num_samples = read_32bitBE(0x20,streamHeader);
strwav->sample_rate = read_32bitBE(0x24,streamHeader);
strwav->flags = read_32bitBE(0x2c,streamHeader);
strwav->loop_start = read_32bitBE(0xd8,streamHeader);
strwav->loop_end = read_32bitBE(0xdc,streamHeader);
strwav->channels = read_32bitBE(0x70,streamHeader) * read_32bitBE(0x88,streamHeader); /* tracks of Nch */
strwav->loop_flag = strwav->flags & 0x01;
strwav->interleave = strwav->channels > 2 ? 0x8000 : 0x10000;
strwav->dsps_table = 0xe0;
strwav->codec = DSP;
;VGM_LOG("STR+WAV: header Zapper (GC)\n");
return 1;
}
/* Pac-Man World 3 (GC)[2005] */
/* SpongeBob SquarePants: Creature from the Krusty Krab (GC)[2006] */
if ( read_32bitBE(0x04,streamHeader) == 0x00000800 &&
read_32bitBE(0x24,streamHeader) == read_32bitBE(0xb0,streamHeader) && /* sample rate repeat */
read_32bitBE(0x24,streamHeader) == read_32bitBE(read_32bitBE(0xf0,streamHeader)+0x08,streamHeader) && /* sample rate vs 1st DSP header */
read_32bitBE(0x28,streamHeader) == 0x10 &&
read_32bitBE(0xc0,streamHeader)*0x04 + read_32bitBE(0xc4,streamHeader) == read_32bitBE(0xe0,streamHeader) && /* main size */
(read_32bitBE(0xe0,streamHeader) + read_32bitBE(0xe4,streamHeader)*0x40 == header_size || /* main size + extradata 1 (config? PMW3 cs2.wav) */
read_32bitBE(0xe0,streamHeader) + read_32bitBE(0xe4,streamHeader)*0x08 == header_size) /* main size + extradata 2 (ids? SBSP 0_0_mu_hr.wav) */
) {
strwav->num_samples = read_32bitBE(0x20,streamHeader);
strwav->sample_rate = read_32bitBE(0x24,streamHeader);
strwav->flags = read_32bitBE(0x2c,streamHeader);
strwav->loop_start = read_32bitBE(0xd8,streamHeader);
strwav->loop_end = read_32bitBE(0xdc,streamHeader);
strwav->channels = read_32bitBE(0x70,streamHeader) * read_32bitBE(0x88,streamHeader); /* tracks of Nch */
strwav->loop_flag = strwav->flags & 0x01;
strwav->interleave = strwav->channels > 2 ? 0x8000 : 0x10000;
strwav->dsps_table = 0xf0;
strwav->codec = DSP;
;VGM_LOG("STR+WAV: header SpongeBob SquarePants (GC)\n");
return 1;
}
/* SpongeBob SquarePants: Creature from the Krusty Krab (PS2)[2006] */
if ( read_32bitBE(0x04,streamHeader) == 0x00000800 &&
read_32bitLE(0x08,streamHeader) == 0x00000000 &&
read_32bitLE(0x0c,streamHeader) != header_size && /* some ID */
(header_size == 0x74 + read_32bitLE(0x64,streamHeader)*0x04 ||
header_size == 0x78 + read_32bitLE(0x64,streamHeader)*0x04)
) {
strwav->loop_start = read_32bitLE(0x24,streamHeader); //not ok?
strwav->num_samples = read_32bitLE(0x30,streamHeader);
strwav->loop_end = read_32bitLE(0x34,streamHeader);
strwav->sample_rate = read_32bitLE(0x38,streamHeader);
strwav->flags = read_32bitLE(0x3c,streamHeader);
strwav->channels = read_32bitLE(0x64,streamHeader); /* tracks of 1ch */
strwav->loop_flag = strwav->flags & 0x01;
strwav->interleave = strwav->channels > 4 ? 0x4000 : 0x8000;
strwav->codec = PSX;
;VGM_LOG("STR+WAV: header SpongeBob SquarePants (PS2)\n");
return 1;
}
/* Tak and the Guardians of Gross (PS2)[2008] */
if ( read_32bitBE(0x04,streamHeader) == 0x00000800 &&
read_32bitLE(0x08,streamHeader) != 0x00000000 &&
read_32bitLE(0x0c,streamHeader) == header_size && /* ~0x80+0x04*ch */
read_32bitLE(0x0c,streamHeader) == 0x80 + read_32bitLE(0x70,streamHeader)*0x04
) {
strwav->loop_start = read_32bitLE(0x24,streamHeader); //not ok?
strwav->num_samples = read_32bitLE(0x30,streamHeader);
strwav->loop_end = read_32bitLE(0x34,streamHeader);
strwav->sample_rate = read_32bitLE(0x38,streamHeader);
strwav->flags = read_32bitLE(0x3c,streamHeader);
strwav->channels = read_32bitLE(0x70,streamHeader); /* tracks of 1ch */
strwav->loop_flag = strwav->flags & 0x01;
strwav->interleave = strwav->channels > 4 ? 0x4000 : 0x8000;
strwav->codec = PSX;
;VGM_LOG("STR+WAV: header Tak (PS2)\n");
return 1;
}
/* Tak and the Guardians of Gross (Wii)[2008] */
/* The House of the Dead: Overkill (Wii)[2009] (not Blitz but still the same format) */
if ((read_32bitBE(0x04,streamHeader) == 0x00000800 ||
read_32bitBE(0x04,streamHeader) == 0x00000700) && /* rare? */
read_32bitLE(0x08,streamHeader) != 0x00000000 &&
read_32bitBE(0x0c,streamHeader) == header_size && /* variable per DSP header */
read_32bitBE(0x38,streamHeader) == read_32bitBE(read_32bitBE(0x7c,streamHeader)+0x38,streamHeader) /* sample rate vs 1st DSP header */
) {
strwav->loop_start = 0; //read_32bitLE(0x24,streamHeader); //not ok?
strwav->num_samples = read_32bitBE(0x30,streamHeader);
strwav->loop_end = read_32bitBE(0x34,streamHeader);
strwav->sample_rate = read_32bitBE(0x38,streamHeader);
strwav->flags = read_32bitBE(0x3c,streamHeader);
strwav->channels = read_32bitBE(0x70,streamHeader); /* tracks of 1ch */
strwav->loop_flag = strwav->flags & 0x01;
strwav->interleave = strwav->channels > 4 ? 0x4000 : 0x8000;
strwav->coefs_table = 0x7c;
strwav->codec = DSP;
;VGM_LOG("STR+WAV: header Tak (Wii)\n");
return 1;
}
/* unknown */
goto fail;
fail:
return 0;
}

View File

@ -1,90 +0,0 @@
#include "meta.h"
#include "../util.h"
VGMSTREAM * init_vgmstream_wii_str(STREAMFILE *streamFile) {
VGMSTREAM * vgmstream = NULL;
STREAMFILE * infileSTH = NULL;
char filename[PATH_LIMIT];
char * filenameSTH = NULL;
int i, j, channel_count, loop_flag;
/* check extension, case insensitive */
streamFile->get_name(streamFile,filename,sizeof(filename));
if (strcasecmp("str",filename_extension(filename))) goto fail;
/* check for .MIH file */
filenameSTH=(char *)malloc(strlen(filename)+1);
if (!filenameSTH) goto fail;
strcpy(filenameSTH,filename);
strcpy(filenameSTH+strlen(filenameSTH)-3,"sth");
infileSTH = streamFile->open(streamFile,filenameSTH,STREAMFILE_DEFAULT_BUFFER_SIZE);
/* STH File is necessary, so we can't confuse those file */
/* with others .STR file as it is a very common extension */
if (!infileSTH) goto fail;
if(read_32bitLE(0x2C,infileSTH)!=0)
goto fail;
channel_count = read_32bitBE(0x70,infileSTH);
if(channel_count==1)
loop_flag = (read_32bitBE(0xD4,infileSTH)==0x00740000);
else
loop_flag = (read_32bitBE(0x124,infileSTH)==0x00740000);
/* build the VGMSTREAM */
vgmstream = allocate_vgmstream(channel_count,loop_flag);
if (!vgmstream) goto fail;
/* fill in the vital statistics */
vgmstream->channels = channel_count;
vgmstream->sample_rate = read_32bitBE(0x38,infileSTH);
vgmstream->interleave_block_size=0x8000;
vgmstream->num_samples=read_32bitBE(0x34,infileSTH);
vgmstream->coding_type = coding_NGC_DSP;
vgmstream->layout_type = layout_interleave;
vgmstream->meta_type = meta_WII_STR;
if(loop_flag) {
vgmstream->loop_start_sample = 0;
vgmstream->loop_end_sample = vgmstream->num_samples;
}
/* open the file for reading by each channel */
{
for (i=0;i<channel_count;i++) {
vgmstream->ch[i].streamfile = streamFile->open(streamFile,filename,vgmstream->interleave_block_size);
if (!vgmstream->ch[i].streamfile) goto fail;
vgmstream->ch[i].channel_start_offset=
vgmstream->ch[i].offset+=(off_t)(vgmstream->interleave_block_size*i);
for(j=0; j<16; j++) {
vgmstream->ch[i].adpcm_coef[j]=read_16bitBE(0xAC+(j*2)+(i*0x50),infileSTH);
}
}
}
close_streamfile(infileSTH); infileSTH=NULL;
return vgmstream;
/* clean up anything we may have opened */
fail:
if (infileSTH) close_streamfile(infileSTH);
if (filenameSTH) {free(filenameSTH); filenameSTH=NULL;}
if (vgmstream) close_vgmstream(vgmstream);
return NULL;
}

View File

@ -52,7 +52,6 @@ VGMSTREAM * (*init_vgmstream_functions[])(STREAMFILE *streamFile) = {
init_vgmstream_raw, init_vgmstream_raw,
init_vgmstream_ps2_vag, init_vgmstream_ps2_vag,
init_vgmstream_psx_gms, init_vgmstream_psx_gms,
init_vgmstream_ps2_str,
init_vgmstream_ps2_ild, init_vgmstream_ps2_ild,
init_vgmstream_ps2_pnb, init_vgmstream_ps2_pnb,
init_vgmstream_xbox_wavm, init_vgmstream_xbox_wavm,
@ -212,7 +211,6 @@ VGMSTREAM * (*init_vgmstream_functions[])(STREAMFILE *streamFile) = {
init_vgmstream_ps2_tk5, init_vgmstream_ps2_tk5,
init_vgmstream_ps2_vsf_tta, init_vgmstream_ps2_vsf_tta,
init_vgmstream_ads, init_vgmstream_ads,
init_vgmstream_wii_str,
init_vgmstream_ps2_mcg, init_vgmstream_ps2_mcg,
init_vgmstream_zsd, init_vgmstream_zsd,
init_vgmstream_ps2_vgs, init_vgmstream_ps2_vgs,
@ -266,9 +264,6 @@ VGMSTREAM * (*init_vgmstream_functions[])(STREAMFILE *streamFile) = {
init_vgmstream_ngc_dsp_mpds, init_vgmstream_ngc_dsp_mpds,
init_vgmstream_dsp_str_ig, init_vgmstream_dsp_str_ig,
init_vgmstream_ea_swvr, init_vgmstream_ea_swvr,
init_vgmstream_ngc_dsp_sth_str1,
init_vgmstream_ngc_dsp_sth_str2,
init_vgmstream_ngc_dsp_sth_str3,
init_vgmstream_ps2_b1s, init_vgmstream_ps2_b1s,
init_vgmstream_ps2_wad, init_vgmstream_ps2_wad,
init_vgmstream_dsp_xiii, init_vgmstream_dsp_xiii,
@ -424,6 +419,7 @@ VGMSTREAM * (*init_vgmstream_functions[])(STREAMFILE *streamFile) = {
init_vgmstream_cks, init_vgmstream_cks,
init_vgmstream_ckb, init_vgmstream_ckb,
init_vgmstream_wv6, init_vgmstream_wv6,
init_vgmstream_str_wav,
init_vgmstream_txth, /* should go at the end (lower priority) */ init_vgmstream_txth, /* should go at the end (lower priority) */
#ifdef VGM_USE_FFMPEG #ifdef VGM_USE_FFMPEG

View File

@ -341,7 +341,7 @@ typedef enum {
meta_PS2_VAGm, /* VAGp Mono File */ meta_PS2_VAGm, /* VAGp Mono File */
meta_PS2_pGAV, /* VAGp with Little Endian Header */ meta_PS2_pGAV, /* VAGp with Little Endian Header */
meta_PSX_GMS, /* GMS File (used in PS1 & PS2) [no header_id] */ meta_PSX_GMS, /* GMS File (used in PS1 & PS2) [no header_id] */
meta_PS2_STR, /* Pacman STR+STH files */ meta_STR_WAV, /* Blitz Games STR+WAV files */
meta_PS2_ILD, /* ILD File */ meta_PS2_ILD, /* ILD File */
meta_PS2_PNB, /* PsychoNauts Bgm File */ meta_PS2_PNB, /* PsychoNauts Bgm File */
meta_PS2_VAGs, /* VAG Stereo from Kingdom Hearts */ meta_PS2_VAGs, /* VAG Stereo from Kingdom Hearts */
@ -505,7 +505,6 @@ typedef enum {
meta_PS2_GBTS, /* Pop'n'Music 9 Audio File */ meta_PS2_GBTS, /* Pop'n'Music 9 Audio File */
meta_NGC_DSP_IADP, /* Gamecube Interleave DSP */ meta_NGC_DSP_IADP, /* Gamecube Interleave DSP */
meta_PS2_TK5, /* Tekken 5 Stream Files */ meta_PS2_TK5, /* Tekken 5 Stream Files */
meta_WII_STR, /* House of The Dead Overkill STR+STH */
meta_PS2_MCG, /* Gunvari MCG Files (was name .GCM on disk) */ meta_PS2_MCG, /* Gunvari MCG Files (was name .GCM on disk) */
meta_ZSD, /* Dragon Booster ZSD */ meta_ZSD, /* Dragon Booster ZSD */
meta_RedSpark, /* "RedSpark" RSD (MadWorld) */ meta_RedSpark, /* "RedSpark" RSD (MadWorld) */
@ -545,7 +544,6 @@ typedef enum {
meta_NGC_DSP_MPDS, /* Big Air Freestyle, Terminator 3 */ meta_NGC_DSP_MPDS, /* Big Air Freestyle, Terminator 3 */
meta_DSP_STR_IG, /* Micro Machines, Superman Superman: Shadow of Apokolis */ meta_DSP_STR_IG, /* Micro Machines, Superman Superman: Shadow of Apokolis */
meta_EA_SWVR, /* Future Cop L.A.P.D., Freekstyle */ meta_EA_SWVR, /* Future Cop L.A.P.D., Freekstyle */
meta_NGC_DSP_STH_STR, /* SpongeBob Squarepants (NGC), Taz Wanted (NGC), Cubix (NGC), Tak (WII)*/
meta_PS2_B1S, /* 7 Wonders of the ancient world */ meta_PS2_B1S, /* 7 Wonders of the ancient world */
meta_PS2_WAD, /* The golden Compass */ meta_PS2_WAD, /* The golden Compass */
meta_DSP_XIII, /* XIII, possibly more (Ubisoft header???) */ meta_DSP_XIII, /* XIII, possibly more (Ubisoft header???) */