From 0cf96007917c733023ed83120a4cc5b0e114bf3e Mon Sep 17 00:00:00 2001 From: bnnm Date: Thu, 16 Nov 2017 00:32:22 +0100 Subject: [PATCH] Clean/separate PS2 .PCM and fix looping in some cases --- src/formats.c | 2 +- src/libvgmstream.vcproj | 4 ++ src/libvgmstream.vcxproj | 1 + src/libvgmstream.vcxproj.filters | 3 ++ src/meta/pcm.c | 65 -------------------------------- src/meta/ps2_pcm.c | 48 +++++++++++++++++++++++ src/vgmstream.h | 2 +- 7 files changed, 58 insertions(+), 67 deletions(-) create mode 100644 src/meta/ps2_pcm.c diff --git a/src/formats.c b/src/formats.c index 75f4f2cb..44595229 100644 --- a/src/formats.c +++ b/src/formats.c @@ -666,7 +666,7 @@ static const meta_info meta_info_list[] = { {meta_RIFX_WAVE_smpl, "RIFX WAVE header with sample looping info"}, {meta_XNB, "Microsoft XNA Game Studio 4.0 header"}, {meta_PCM_SCD, "PCM file with custom header (SCD)"}, - {meta_PCM_PS2, "PCM file with custom header (PS2)"}, + {meta_PS2_PCM, "Konami KCEJ East .PCM header"}, {meta_PS2_RKV, "Legacy of Kain - Blood Omen 2 RKV Header"}, {meta_PS2_PSW, "Rayman Raving Rabbids Riff Container File"}, {meta_PS2_VAS, "Pro Baseball Spirits 5 VAS Header"}, diff --git a/src/libvgmstream.vcproj b/src/libvgmstream.vcproj index e90ca7d1..64a74c1d 100644 --- a/src/libvgmstream.vcproj +++ b/src/libvgmstream.vcproj @@ -858,6 +858,10 @@ RelativePath=".\meta\ps2_p2bt.c" > + + diff --git a/src/libvgmstream.vcxproj b/src/libvgmstream.vcxproj index bcebddb0..c6bf8d17 100644 --- a/src/libvgmstream.vcxproj +++ b/src/libvgmstream.vcxproj @@ -333,6 +333,7 @@ + diff --git a/src/libvgmstream.vcxproj.filters b/src/libvgmstream.vcxproj.filters index fc39f79e..de9b1c5f 100644 --- a/src/libvgmstream.vcxproj.filters +++ b/src/libvgmstream.vcxproj.filters @@ -517,6 +517,9 @@ meta\Source Files + + meta\Source Files + meta\Source Files diff --git a/src/meta/pcm.c b/src/meta/pcm.c index 30ca247e..ddd47eca 100644 --- a/src/meta/pcm.c +++ b/src/meta/pcm.c @@ -61,68 +61,3 @@ fail: if (vgmstream) close_vgmstream(vgmstream); return NULL; } - - -/* PCM - Custom header from Konami, which contains only loop infos... - found in: Ephemeral Fantasia [Reiselied] - Yu-Gi-Oh! The Duelists of the Roses [Yu-Gi-Oh! Shin Duel Monsters II] -*/ -VGMSTREAM * init_vgmstream_pcm_ps2(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - off_t start_offset; - int loop_flag = 0; - int channel_count; - - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("pcm",filename_extension(filename))) goto fail; - - // if ((read_32bitLE(0x00,streamFile)+0x800) != (get_streamfile_size(streamFile))) - // goto fail; - if ((read_32bitLE(0x00,streamFile)) != (read_32bitLE(0x04,streamFile)*4)) - goto fail; - - loop_flag = (read_32bitLE(0x08,streamFile) != 0x0); - 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 = 24000; - vgmstream->coding_type = coding_PCM16LE; - vgmstream->num_samples = read_32bitLE(0x0,streamFile)/2/channel_count; - if (loop_flag) { - vgmstream->loop_start_sample = read_32bitLE(0x08,streamFile); - vgmstream->loop_end_sample = read_32bitLE(0x0C,streamFile); - } - - vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = 0x2; - vgmstream->meta_type = meta_PCM_PS2; - - /* 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/meta/ps2_pcm.c b/src/meta/ps2_pcm.c new file mode 100644 index 00000000..1564a3f0 --- /dev/null +++ b/src/meta/ps2_pcm.c @@ -0,0 +1,48 @@ +#include "meta.h" +#include "../coding/coding.h" + +/* .PCM - KCE Japan East PS2 games (Ephemeral Fantasia, Yu-Gi-Oh! The Duelists of the Roses, 7 Blades) */ +VGMSTREAM * init_vgmstream_pcm_ps2(STREAMFILE *streamFile) { + VGMSTREAM * vgmstream = NULL; + off_t start_offset; + int loop_flag, channel_count; + + /* check extension */ + if ( !check_extensions(streamFile,"pcm") ) + goto fail; + + /* check header (data_size vs num_samples) */ + if (pcm_bytes_to_samples(read_32bitLE(0x00,streamFile), 2, 16) != read_32bitLE(0x04,streamFile)) + goto fail; + /* should work too */ + //if (read_32bitLE(0x00,streamFile)+0x800 != get_streamfile_size(streamFile)) + // goto fail; + + loop_flag = (read_32bitLE(0x0C,streamFile) != 0x00); + channel_count = 2; + start_offset = 0x800; + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channel_count,loop_flag); + if (!vgmstream) goto fail; + + vgmstream->channels = channel_count; + vgmstream->sample_rate = 24000; + vgmstream->num_samples = read_32bitLE(0x04,streamFile); + vgmstream->loop_start_sample = read_32bitLE(0x08,streamFile); + vgmstream->loop_end_sample = read_32bitLE(0x0C,streamFile); + + vgmstream->coding_type = coding_PCM16LE; + vgmstream->layout_type = layout_interleave; + vgmstream->interleave_block_size = 0x2; + vgmstream->meta_type = meta_PS2_PCM; + + /* open the file for reading */ + if ( !vgmstream_open_stream(vgmstream, streamFile, start_offset) ) + goto fail; + return vgmstream; + +fail: + if (vgmstream) close_vgmstream(vgmstream); + return NULL; +} diff --git a/src/vgmstream.h b/src/vgmstream.h index f10fba06..44776433 100644 --- a/src/vgmstream.h +++ b/src/vgmstream.h @@ -370,7 +370,7 @@ typedef enum { meta_PS2_DXH, /* Tokobot Plus - Myteries of the Karakuri */ meta_PS2_PSH, /* Dawn of Mana - Seiken Densetsu 4 */ meta_PCM_SCD, /* Lunar - Eternal Blue */ - meta_PCM_PS2, /* Konami: Ephemeral Fantasia, Yu-Gi-Oh! The Duelists of the Roses */ + meta_PS2_PCM, /* Konami KCEJ East: Ephemeral Fantasia, Yu-Gi-Oh! The Duelists of the Roses, 7 Blades */ meta_PS2_RKV, /* Legacy of Kain - Blood Omen 2 */ meta_PS2_PSW, /* Rayman Raving Rabbids */ meta_PS2_VAS, /* Pro Baseball Spirits 5 */