diff --git a/src/Makefile b/src/Makefile
index 3768454f..1165a79a 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -54,7 +54,8 @@ META_OBJS=meta/adx_header.o \
meta/ngc_caf.o \
meta/ps2_vpk.o \
meta/genh.o \
- meta/ogg_vorbis_file.o
+ meta/ogg_vorbis_file.o \
+ meta/ps2_bmdx.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 c85bc8dc..8088b06e 100644
--- a/src/libvgmstream.vcproj
+++ b/src/libvgmstream.vcproj
@@ -330,6 +330,10 @@
RelativePath=".\meta\rwsd.c"
>
+
+
diff --git a/src/meta/Makefile.unix.am b/src/meta/Makefile.unix.am
index 14f9e963..196ef1ed 100644
--- a/src/meta/Makefile.unix.am
+++ b/src/meta/Makefile.unix.am
@@ -4,6 +4,6 @@ AM_CFLAGS = -Wall @CFLAGS@ -I$(top_builddir) -I$(top_srcdir)
AM_MAKEFLAGS=-f Makefile.unix
libmeta_la_LDFLAGS =
-libmeta_la_SOURCES = Cstr.c adx_header.c afc_header.c agsc.c ast.c brstm.c ea_header.c gcsw.c halpst.c nds_strm.c ngc_adpdtk.c ngc_caf.c ngc_dsp_std.c ps2_ads.c ps2_exst.c ps2_ild.c ps2_int.c ps2_mib.c ps2_mic.c ps2_npsf.c ps2_pnb.c ps2_rxw.c ps2_str.c ps2_svag.c ps2_vag.c ps2_vpk.c psx_cdxa.c raw.c rs03.c rsf.c rwsd.c psx_gms.c xbox_xwav.c xbox_wavm.c genh.c ogg_vorbis_file.c
+libmeta_la_SOURCES = Cstr.c adx_header.c afc_header.c agsc.c ast.c brstm.c ea_header.c gcsw.c halpst.c nds_strm.c ngc_adpdtk.c ngc_caf.c ngc_dsp_std.c ps2_ads.c ps2_exst.c ps2_ild.c ps2_int.c ps2_mib.c ps2_mic.c ps2_npsf.c ps2_pnb.c ps2_rxw.c ps2_str.c ps2_svag.c ps2_vag.c ps2_vpk.c psx_cdxa.c raw.c rs03.c rsf.c rwsd.c psx_gms.c xbox_xwav.c xbox_wavm.c genh.c ogg_vorbis_file.c ps2_bmdx.c
EXTRA_DIST = meta.h
diff --git a/src/meta/meta.h b/src/meta/meta.h
index a28fe452..c26eb617 100644
--- a/src/meta/meta.h
+++ b/src/meta/meta.h
@@ -87,4 +87,6 @@ VGMSTREAM * init_vgmstream_ogg_vorbis(STREAMFILE *streamFile);
VGMSTREAM * init_vgmstream_sadb(STREAMFILE *streamFile);
+VGMSTREAM * init_vgmstream_ps2_bmdx(STREAMFILE * streamFile);
+
#endif
diff --git a/src/meta/ps2_bmdx.c b/src/meta/ps2_bmdx.c
new file mode 100644
index 00000000..bdfe014f
--- /dev/null
+++ b/src/meta/ps2_bmdx.c
@@ -0,0 +1,72 @@
+#include "meta.h"
+#include "../util.h"
+
+VGMSTREAM * init_vgmstream_ps2_bmdx(STREAMFILE *streamFile) {
+ VGMSTREAM * vgmstream = NULL;
+ char filename[260];
+
+ int loop_flag=0;
+ int channel_count;
+ off_t start_offset;
+ int i;
+
+ /* check extension, case insensitive */
+ streamFile->get_name(streamFile,filename,sizeof(filename));
+ if (strcasecmp("bmdx",filename_extension(filename))) goto fail;
+
+ /* check NPSF Header */
+ if (read_32bitBE(0x00,streamFile) != 0x01006408 ||
+ read_32bitBE(0x04,streamFile) != 0)
+ goto fail;
+
+ /* check loop */
+ loop_flag = (read_32bitLE(0x10,streamFile)!=0);
+ channel_count=read_32bitLE(0x1C,streamFile);
+
+ /* 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(0x18,streamFile);
+
+ /* Check for Compression Scheme */
+ vgmstream->coding_type = coding_PSX;
+ vgmstream->num_samples = read_32bitLE(0x0c,streamFile)*28/16;
+
+ /* Get loop point values */
+ if(vgmstream->loop_flag) {
+ vgmstream->loop_start_sample = read_32bitLE(0x10,streamFile)*28/16;
+ vgmstream->loop_end_sample = vgmstream->num_samples;
+ }
+
+ vgmstream->interleave_block_size = read_32bitLE(0x24,streamFile);
+ vgmstream->layout_type = layout_interleave;
+ vgmstream->meta_type = meta_PS2_BMDX;
+
+ start_offset = read_32bitLE(0x0c,streamFile);
+
+ /* open the file for reading by each channel */
+ {
+ for (i=0;ich[0].streamfile) {
+ vgmstream->ch[0].streamfile = streamFile->open(streamFile,filename,0x8000);
+ vgmstream->ch[i].streamfile = vgmstream->ch[0].streamfile;
+ }
+
+ if (!vgmstream->ch[i].streamfile) goto fail;
+
+ vgmstream->ch[i].channel_start_offset=
+ vgmstream->ch[i].offset=
+ (off_t)(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 f9914a0b..b08478ea 100644
--- a/src/vgmstream.c
+++ b/src/vgmstream.c
@@ -866,6 +866,9 @@ void describe_vgmstream(VGMSTREAM * vgmstream, char * desc, int length) {
case meta_DSP_SADB:
snprintf(temp,TEMPSIZE,"sadb header");
break;
+ case meta_PS2_BMDX:
+ snprintf(temp,TEMPSIZE,"Beatmania .bmdx header");
+ break;
default:
snprintf(temp,TEMPSIZE,"THEY SHOULD HAVE SENT A POET");
}
diff --git a/src/vgmstream.h b/src/vgmstream.h
index e1b75d89..c31393c3 100644
--- a/src/vgmstream.h
+++ b/src/vgmstream.h
@@ -118,6 +118,7 @@ typedef enum {
meta_PSX_XA, /* CD-XA with RIFF header */
meta_PS2_VAGs, /* VAG Stereo from Kingdom Hearts */
meta_PS2_VPK, /* VPK Audio File */
+ meta_PS2_BMDX, /* Beatmania thing */
meta_XBOX_WAVM, /* XBOX WAVM File */
meta_XBOX_RIFF, /* XBOX RIFF/WAVE File */