diff --git a/src/Makefile b/src/Makefile index a27cad25..d96ac56d 100644 --- a/src/Makefile +++ b/src/Makefile @@ -143,7 +143,8 @@ META_OBJS=meta/adx_header.o \ meta/wii_mus.o \ meta/dc_asd.o \ meta/naomi_spsd.o \ - meta/bgw.o + meta/bgw.o \ + meta/ps2_ass.o OBJECTS=vgmstream.o streamfile.o util.o $(CODING_OBJS) $(LAYOUT_OBJS) $(META_OBJS) diff --git a/src/libvgmstream.vcproj b/src/libvgmstream.vcproj index cbcb6d53..caf9ffb6 100644 --- a/src/libvgmstream.vcproj +++ b/src/libvgmstream.vcproj @@ -389,6 +389,10 @@ RelativePath=".\meta\ps2_ads.c" > + + diff --git a/src/meta/Makefile.unix.am b/src/meta/Makefile.unix.am index ffa09451..36af376c 100644 --- a/src/meta/Makefile.unix.am +++ b/src/meta/Makefile.unix.am @@ -112,4 +112,5 @@ libmeta_la_SOURCES += wii_mus.c libmeta_la_SOURCES += dc_asd.c libmeta_la_SOURCES += naomi_spsd.c libmeta_la_SOURCES += bgw.c +libmeta_la_SOURCES += ps2_ass.c EXTRA_DIST = meta.h diff --git a/src/meta/meta.h b/src/meta/meta.h index 3dc95a3a..d88e5a5a 100644 --- a/src/meta/meta.h +++ b/src/meta/meta.h @@ -267,4 +267,6 @@ VGMSTREAM * init_vgmstream_bgw(STREAMFILE * streamFile); VGMSTREAM * init_vgmstream_spw(STREAMFILE * streamFile); +VGMSTREAM * init_vgmstream_ps2_ass(STREAMFILE * streamFile); + #endif diff --git a/src/meta/ps2_ass.c b/src/meta/ps2_ass.c new file mode 100644 index 00000000..242a27c4 --- /dev/null +++ b/src/meta/ps2_ass.c @@ -0,0 +1,67 @@ +#include "meta.h" +#include "../util.h" + +/* SVS (from Dai Senryaku VII - Exceed) */ + +VGMSTREAM * init_vgmstream_ps2_ass(STREAMFILE *streamFile) { + VGMSTREAM * vgmstream = NULL; + char filename[260]; + off_t start_offset; + + int loop_flag; + int channel_count; + + /* check extension, case insensitive */ + streamFile->get_name(streamFile,filename,sizeof(filename)); + if (strcasecmp("ass",filename_extension(filename))) goto fail; + + /* check header */ + if (read_32bitBE(0x00,streamFile) != 0x02000000) /* "00000000" */ + goto fail; + + loop_flag = 1; + channel_count = 2; + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channel_count,loop_flag); + if (!vgmstream) goto fail; + + /* fill in the vital statistics */ + start_offset = 0x800; + vgmstream->channels = channel_count; + vgmstream->sample_rate = read_32bitLE(0x04,streamFile); + vgmstream->coding_type = coding_PSX; + vgmstream->num_samples = (read_32bitLE(0x08,streamFile)*2)*28/16/channel_count; + + if(loop_flag) { + vgmstream->loop_start_sample = 0; + vgmstream->loop_end_sample=(read_32bitLE(0x08,streamFile)*2)*28/16/channel_count; + } + + vgmstream->layout_type = layout_interleave; + vgmstream->interleave_block_size = read_32bitLE(0x0C,streamFile); + vgmstream->meta_type = meta_PS2_ASS; + + /* 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; + + /* clean up anything we may have opened */ +fail: + if (vgmstream) close_vgmstream(vgmstream); + return NULL; +} diff --git a/src/vgmstream.c b/src/vgmstream.c index 499cf645..f09e9458 100644 --- a/src/vgmstream.c +++ b/src/vgmstream.c @@ -150,6 +150,7 @@ VGMSTREAM * (*init_vgmstream_fcns[])(STREAMFILE *streamFile) = { init_vgmstream_rsd6xadp, init_vgmstream_bgw, init_vgmstream_spw, + init_vgmstream_ps2_ass, }; #define INIT_VGMSTREAM_FCNS (sizeof(init_vgmstream_fcns)/sizeof(init_vgmstream_fcns[0])) @@ -1785,6 +1786,9 @@ void describe_vgmstream(VGMSTREAM * vgmstream, char * desc, int length) { case meta_FFXI_SPW: snprintf(temp,TEMPSIZE,"SPW SeWave header"); break; + case meta_PS2_ASS: + snprintf(temp,TEMPSIZE,"ASS header"); + break; default: snprintf(temp,TEMPSIZE,"THEY SHOULD HAVE SENT A POET"); } diff --git a/src/vgmstream.h b/src/vgmstream.h index 871c980c..315e98f1 100644 --- a/src/vgmstream.h +++ b/src/vgmstream.h @@ -257,6 +257,8 @@ typedef enum { meta_RSD6WADP, /* RSD6WADP */ meta_RSD6XADP, /* RSD6XADP */ + meta_PS2_ASS, /* RSD6XADP */ + meta_XBOX_WAVM, /* XBOX WAVM File */ meta_XBOX_RIFF, /* XBOX RIFF/WAVE File */ meta_XBOX_WVS, /* XBOX WVS */ diff --git a/winamp/in_vgmstream.c b/winamp/in_vgmstream.c index 2dc6b92e..6eaf56a9 100644 --- a/winamp/in_vgmstream.c +++ b/winamp/in_vgmstream.c @@ -194,6 +194,7 @@ char * extension_list[] = { "spsd\0SPSD Audio File (*.SPSD)\0", "bgw\0BGW Audio File (*.BGW)\0", "spw\0SPW Audio File (*.SPW)\0", + "ass\0ASS Audio File (*.ASS)\0", }; void about(HWND hwndParent) {