diff --git a/src/libvgmstream.vcproj b/src/libvgmstream.vcproj index 9e894d28..b8c27f7b 100644 --- a/src/libvgmstream.vcproj +++ b/src/libvgmstream.vcproj @@ -226,6 +226,10 @@ RelativePath=".\meta\Cstr.c" > + + diff --git a/src/meta/dc_kcey.c b/src/meta/dc_kcey.c new file mode 100644 index 00000000..13ec7f40 --- /dev/null +++ b/src/meta/dc_kcey.c @@ -0,0 +1,66 @@ +#include "meta.h" +#include "../coding/coding.h" +#include "../util.h" + +VGMSTREAM * init_vgmstream_kcey(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("kcey",filename_extension(filename))) goto fail; + + /* check header */ + if (read_32bitBE(0x00,streamFile) != 0x4B434559) /* "DVI." */ + goto fail; + + loop_flag = (read_32bitBE(0x14,streamFile)!=0xFFFFFFFF); + channel_count = read_32bitBE(0x08,streamFile); + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channel_count,loop_flag); + if (!vgmstream) goto fail; + + /* fill in the vital statistics */ + vgmstream->channels = channel_count; + start_offset = read_32bitBE(0x10,streamFile); + vgmstream->sample_rate = 37800; + vgmstream->coding_type = coding_EACS_IMA; + + vgmstream->num_samples = read_32bitBE(0x0C,streamFile); + + if (loop_flag) { + vgmstream->loop_start_sample = read_32bitBE(0x14,streamFile); + vgmstream->loop_end_sample = read_32bitBE(0x0C,streamFile); + } + + vgmstream->layout_type = layout_none; + vgmstream->meta_type = meta_KCEY; + vgmstream->get_high_nibble=1; + + /* 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+(i*vgmstream->interleave_block_size); + vgmstream->ch[i].adpcm_history1_32=0; + vgmstream->ch[i].adpcm_step_index=0; + } + } + + return vgmstream; + + /* clean up anything we may have opened */ +fail: + if (vgmstream) close_vgmstream(vgmstream); + return NULL; +} \ No newline at end of file diff --git a/src/meta/meta.h b/src/meta/meta.h index 580b1ffd..7b2d100b 100644 --- a/src/meta/meta.h +++ b/src/meta/meta.h @@ -148,4 +148,6 @@ VGMSTREAM * init_vgmstream_ikm(STREAMFILE * streamFile); VGMSTREAM * init_vgmstream_sfs(STREAMFILE * streamFile); VGMSTREAM * init_vgmstream_dvi(STREAMFILE * streamFile); + +VGMSTREAM * init_vgmstream_kcey(STREAMFILE * streamFile); #endif diff --git a/src/meta/sat_dvi.c b/src/meta/sat_dvi.c index 57871b46..8b763bed 100644 --- a/src/meta/sat_dvi.c +++ b/src/meta/sat_dvi.c @@ -1,12 +1,7 @@ #include "meta.h" -#include "../coding/coding.h" -#include "../util.h" - -/* DVI */ -#include "meta.h" #include "../util.h" -/* XA30 (found in Driver - Parallel Lines) */ +/* DVI (Castlevania Symphony of the Night) */ VGMSTREAM * init_vgmstream_dvi(STREAMFILE *streamFile) { VGMSTREAM * vgmstream = NULL; char filename[260]; diff --git a/src/vgmstream.c b/src/vgmstream.c index 2186eb2b..32e263d3 100644 --- a/src/vgmstream.c +++ b/src/vgmstream.c @@ -90,6 +90,7 @@ VGMSTREAM * (*init_vgmstream_fcns[])(STREAMFILE *streamFile) = { init_vgmstream_ikm, init_vgmstream_sfs, init_vgmstream_dvi, + init_vgmstream_kcey, }; #define INIT_VGMSTREAM_FCNS (sizeof(init_vgmstream_fcns)/sizeof(init_vgmstream_fcns[0])) @@ -1305,6 +1306,9 @@ void describe_vgmstream(VGMSTREAM * vgmstream, char * desc, int length) { break; case meta_DVI: snprintf(temp,TEMPSIZE,"DVI Header"); + break; + case meta_KCEY: + snprintf(temp,TEMPSIZE,"KCEYCOMP Header"); break; default: snprintf(temp,TEMPSIZE,"THEY SHOULD HAVE SENT A POET"); diff --git a/src/vgmstream.h b/src/vgmstream.h index fba0259a..a704f400 100644 --- a/src/vgmstream.h +++ b/src/vgmstream.h @@ -223,6 +223,7 @@ typedef enum { meta_NWA_NWAINFOINI, /* NWA w/ NWAINFO.INI for looping */ meta_NWA_GAMEEXEINI, /* NWA w/ Gameexe.ini for looping */ meta_DVI, /* DVI Interleaved */ + meta_KCEY, /* KCEYCOMP */ } meta_t; typedef struct { diff --git a/winamp/in_vgmstream.c b/winamp/in_vgmstream.c index 92cf1446..f47b062c 100644 --- a/winamp/in_vgmstream.c +++ b/winamp/in_vgmstream.c @@ -71,7 +71,7 @@ int decode_pos_samples = 0; int stream_length_samples = 0; int fade_samples = 0; -#define EXTENSION_LIST_SIZE 2048 +#define EXTENSION_LIST_SIZE 3072 char working_extension_list[EXTENSION_LIST_SIZE] = {0}; char * extension_list[] = { "adx\0ADX Audio File (*.ADX)\0", @@ -146,6 +146,7 @@ char * extension_list[] = { "ikm\0IKM Audio File (*.IKM)\0", "sfs\0SFS Audio File (*.SFS)\0", "dvi\0DVI Audio File (*.DVI)\0", + "kcey\0KCEY Audio File (*.KCEY)\0", }; void about(HWND hwndParent) {