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) {