diff --git a/src/Makefile b/src/Makefile index 46fd2d92..7f382ee2 100644 --- a/src/Makefile +++ b/src/Makefile @@ -124,7 +124,8 @@ META_OBJS=meta/adx_header.o \ meta/de2.o \ meta/dc_str.o \ meta/xbox_xmu.o \ - meta/ngc_bh2pcm.o + meta/ngc_bh2pcm.o \ + meta/sat_sap.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 67050ffe..e0197d2c 100644 --- a/src/libvgmstream.vcproj +++ b/src/libvgmstream.vcproj @@ -520,6 +520,10 @@ RelativePath=".\meta\sat_dvi.c" > + + diff --git a/src/meta/Makefile.unix.am b/src/meta/Makefile.unix.am index 5dd7ba5f..214eba87 100644 --- a/src/meta/Makefile.unix.am +++ b/src/meta/Makefile.unix.am @@ -94,6 +94,7 @@ libmeta_la_SOURCES += xbox_ims.c libmeta_la_SOURCES += de2.c libmeta_la_SOURCES += dc_str.c libmeta_la_SOURCES += xbox_xmu.c -libmeta_la_SOURCES += ngc_bh2pcm.c.c +libmeta_la_SOURCES += ngc_bh2pcm.c +libmeta_la_SOURCES += sat_sap.c EXTRA_DIST = meta.h diff --git a/src/meta/meta.h b/src/meta/meta.h index 0fd55d6d..b0e8c674 100644 --- a/src/meta/meta.h +++ b/src/meta/meta.h @@ -209,4 +209,6 @@ VGMSTREAM * init_vgmstream_xbox_xvas(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_ngc_bh2pcm(STREAMFILE *streamFile); +VGMSTREAM * init_vgmstream_sat_sap(STREAMFILE *streamFile); + #endif diff --git a/src/meta/sat_sap.c b/src/meta/sat_sap.c new file mode 100644 index 00000000..3d1f2ba2 --- /dev/null +++ b/src/meta/sat_sap.c @@ -0,0 +1,67 @@ +#include "meta.h" +#include "../util.h" + +/* SAP (from Bubble_Symphony) */ +VGMSTREAM * init_vgmstream_sat_sap(STREAMFILE *streamFile) { + VGMSTREAM * vgmstream = NULL; + char filename[260]; + off_t start_offset; + + int loop_flag = 0; + int channel_count; + + /* check extension, case insensitive */ + streamFile->get_name(streamFile,filename,sizeof(filename)); + if (strcasecmp("sap",filename_extension(filename))) goto fail; + + + /* check header */ + if (read_32bitBE(0x0A,streamFile) != 0x0010400E) /* "0010400E" */ + goto fail; + + + loop_flag = 0; /* (read_32bitLE(0x08,streamFile)!=0); */ + channel_count = read_32bitBE(0x04,streamFile); + + /* 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 = (uint16_t)read_16bitBE(0x0E,streamFile); + vgmstream->coding_type = coding_PCM16BE; + vgmstream->num_samples = read_32bitBE(0x00,streamFile); + if (loop_flag) { + vgmstream->loop_start_sample = 0; /* (read_32bitLE(0x08,streamFile)-1)*28; */ + vgmstream->loop_end_sample = read_32bitBE(0x00,streamFile); + } + + vgmstream->layout_type = layout_none; + vgmstream->interleave_block_size = 0x10; + vgmstream->meta_type = meta_SAT_SAP; + + /* 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 823ed146..58ef7deb 100644 --- a/src/vgmstream.c +++ b/src/vgmstream.c @@ -120,6 +120,7 @@ VGMSTREAM * (*init_vgmstream_fcns[])(STREAMFILE *streamFile) = { init_vgmstream_xbox_xmu, init_vgmstream_xbox_xvas, init_vgmstream_ngc_bh2pcm, + init_vgmstream_sat_sap, }; #define INIT_VGMSTREAM_FCNS (sizeof(init_vgmstream_fcns)/sizeof(init_vgmstream_fcns[0])) diff --git a/src/vgmstream.h b/src/vgmstream.h index 8bd12b0f..0d202770 100644 --- a/src/vgmstream.h +++ b/src/vgmstream.h @@ -227,7 +227,8 @@ typedef enum { meta_NGC_SWD, /* Conflict - Desert Storm 1 & 2 */ meta_NGC_VJDSP, /* Viewtiful Joe */ meta_DC_STR, /* Evil Dead */ - meta_NGC_BH2PCM, /* Bio hazard 2 */ + meta_NGC_BH2PCM, /* Bio hazard 2 */ + meta_SAT_SAP, /* Bubble Symphony */ meta_XBOX_WAVM, /* XBOX WAVM File */ meta_XBOX_RIFF, /* XBOX RIFF/WAVE File */ diff --git a/winamp/in_vgmstream.c b/winamp/in_vgmstream.c index be0ead49..ebbca25f 100644 --- a/winamp/in_vgmstream.c +++ b/winamp/in_vgmstream.c @@ -176,6 +176,8 @@ char * extension_list[] = { "de2\0DE2 Audio File (*.DE2)\0", "xmu\0XMU Audio File (*.XMU)\0", "xvas\0XVAS Audio File (*.XVAS)\0", + "bh2pcm\0BH2PCM Audio File (*.BH2PCM)\0", + "sap\0SAP Audio File (*.SAP)\0", }; void about(HWND hwndParent) {