aboutsummaryrefslogtreecommitdiff
path: root/lib/vgmstream/src/meta/acm.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/vgmstream/src/meta/acm.c')
-rw-r--r--lib/vgmstream/src/meta/acm.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/vgmstream/src/meta/acm.c b/lib/vgmstream/src/meta/acm.c
new file mode 100644
index 0000000000..c58e596788
--- /dev/null
+++ b/lib/vgmstream/src/meta/acm.c
@@ -0,0 +1,66 @@
+#include "../vgmstream.h"
+#include "meta.h"
+#include "../util.h"
+#include "../coding/acm_decoder.h"
+
+/* InterPlay ACM */
+/* The real work is done by libacm */
+VGMSTREAM * init_vgmstream_acm(STREAMFILE *streamFile) {
+ VGMSTREAM * vgmstream = NULL;
+ ACMStream *acm_stream = NULL;
+ mus_acm_codec_data *data;
+
+ char filename[260];
+
+ int loop_flag = 0;
+ int channel_count;
+
+ /* check extension, case insensitive */
+ streamFile->get_name(streamFile,filename,sizeof(filename));
+ if (strcasecmp("acm",filename_extension(filename))) goto fail;
+
+ /* check header */
+ if (read_32bitBE(0x0,streamFile) != 0x97280301)
+ goto fail;
+
+ data = calloc(1,sizeof(mus_acm_codec_data));
+ if (!data) goto fail;
+
+ data->files = calloc(1,sizeof(ACMStream *));
+ if (!data->files) {
+ free(data); data = NULL;
+ goto fail;
+ }
+
+ /* gonna do this a little backwards, open and parse the file
+ before creating the vgmstream */
+
+ if (acm_open_decoder(&acm_stream,streamFile,filename) != ACM_OK) {
+ goto fail;
+ }
+
+ channel_count = acm_stream->info.channels;
+ vgmstream = allocate_vgmstream(channel_count,loop_flag);
+ if (!vgmstream) goto fail;
+
+ vgmstream->channels = channel_count;
+ vgmstream->sample_rate = acm_stream->info.rate;
+ vgmstream->coding_type = coding_ACM;
+ vgmstream->num_samples = acm_stream->total_values / acm_stream->info.channels;
+ vgmstream->layout_type = layout_acm;
+ vgmstream->meta_type = meta_ACM;
+
+ data->file_count = 1;
+ data->current_file = 0;
+ data->files[0] = acm_stream;
+ /*data->end_file = -1;*/
+
+ vgmstream->codec_data = data;
+
+ return vgmstream;
+
+ /* clean up anything we may have opened */
+fail:
+ if (vgmstream) close_vgmstream(vgmstream);
+ return NULL;
+}