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 */