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