diff --git a/src/libvgmstream.vcproj b/src/libvgmstream.vcproj
index 53279772..5ebf07f7 100644
--- a/src/libvgmstream.vcproj
+++ b/src/libvgmstream.vcproj
@@ -942,10 +942,14 @@
RelativePath=".\meta\nds_rrds.c"
>
-
-
+
+
+
+
diff --git a/src/libvgmstream.vcxproj b/src/libvgmstream.vcxproj
index 5a99aa20..d814bc14 100644
--- a/src/libvgmstream.vcxproj
+++ b/src/libvgmstream.vcxproj
@@ -360,6 +360,7 @@
+
diff --git a/src/libvgmstream.vcxproj.filters b/src/libvgmstream.vcxproj.filters
index 4b880448..56c7e2ba 100644
--- a/src/libvgmstream.vcxproj.filters
+++ b/src/libvgmstream.vcxproj.filters
@@ -595,6 +595,9 @@
meta\Source Files
+
+ meta\Source Files
+
meta\Source Files
diff --git a/src/meta/ngc_dsp_std.c b/src/meta/ngc_dsp_std.c
index e531c890..b1a9e760 100644
--- a/src/meta/ngc_dsp_std.c
+++ b/src/meta/ngc_dsp_std.c
@@ -655,48 +655,6 @@ fail:
return NULL;
}
-/* sadf - Procyon Studio Header Variant [Xenoblade Chronicles 2 (Switch)] (sfx) */
-VGMSTREAM * init_vgmstream_sadf(STREAMFILE *streamFile) {
- VGMSTREAM * vgmstream = NULL;
- int channel_count, loop_flag;
- off_t start_offset;
-
- /* checks */
- if (!check_extensions(streamFile, "sad"))
- goto fail;
- if (read_32bitBE(0x00, streamFile) != 0x73616466) /* "sadf" */
- goto fail;
-
- channel_count = read_8bit(0x18, streamFile);
- loop_flag = read_8bit(0x19, streamFile);
- start_offset = read_32bitLE(0x1C, streamFile);
-
- /* build the VGMSTREAM */
- vgmstream = allocate_vgmstream(channel_count, loop_flag);
- if (!vgmstream) goto fail;
-
- vgmstream->num_samples = read_32bitLE(0x28, streamFile);
- vgmstream->sample_rate = read_32bitLE(0x24, streamFile);
- if (loop_flag) {
- vgmstream->loop_start_sample = read_32bitLE(0x2c, streamFile);
- vgmstream->loop_end_sample = read_32bitLE(0x30, streamFile);
- }
- vgmstream->coding_type = coding_NGC_DSP;
- vgmstream->layout_type = layout_interleave;
- vgmstream->interleave_block_size = channel_count == 1 ? 0x8 :
- read_32bitLE(0x20, streamFile) / channel_count;
- vgmstream->meta_type = meta_DSP_SADF;
-
- dsp_read_coefs_le(vgmstream, streamFile, 0x80, 0x80);
-
- if (!vgmstream_open_stream(vgmstream, streamFile, start_offset))
- goto fail;
- return vgmstream;
-
-fail:
- close_vgmstream(vgmstream);
- return NULL;
-}
/* IDSP - Traveller's Tales header + interleaved dsps [Lego Batman (Wii), Lego Dimensions (Wii U)] */
VGMSTREAM * init_vgmstream_idsp_tt(STREAMFILE *streamFile) {
diff --git a/src/meta/sadf.c b/src/meta/sadf.c
new file mode 100644
index 00000000..96c73d2b
--- /dev/null
+++ b/src/meta/sadf.c
@@ -0,0 +1,45 @@
+#include "meta.h"
+#include "../util.h"
+
+/* sadf - from Procyon Studio games [Xenoblade Chronicles 2 (Switch)] (sfx) */
+VGMSTREAM * init_vgmstream_sadf(STREAMFILE *streamFile) {
+ VGMSTREAM * vgmstream = NULL;
+ int channel_count, loop_flag;
+ off_t start_offset;
+
+ /* checks */
+ if (!check_extensions(streamFile, "sad"))
+ goto fail;
+ if (read_32bitBE(0x00, streamFile) != 0x73616466) /* "sadf" */
+ goto fail;
+
+ channel_count = read_8bit(0x18, streamFile);
+ loop_flag = read_8bit(0x19, streamFile);
+ start_offset = read_32bitLE(0x1C, streamFile);
+
+ /* build the VGMSTREAM */
+ vgmstream = allocate_vgmstream(channel_count, loop_flag);
+ if (!vgmstream) goto fail;
+
+ vgmstream->num_samples = read_32bitLE(0x28, streamFile);
+ vgmstream->sample_rate = read_32bitLE(0x24, streamFile);
+ if (loop_flag) {
+ vgmstream->loop_start_sample = read_32bitLE(0x2c, streamFile);
+ vgmstream->loop_end_sample = read_32bitLE(0x30, streamFile);
+ }
+ vgmstream->coding_type = coding_NGC_DSP;
+ vgmstream->layout_type = layout_interleave;
+ vgmstream->interleave_block_size = channel_count == 1 ? 0x8 :
+ read_32bitLE(0x20, streamFile) / channel_count;
+ vgmstream->meta_type = meta_DSP_SADF;
+
+ dsp_read_coefs_le(vgmstream, streamFile, 0x80, 0x80);
+
+ if (!vgmstream_open_stream(vgmstream, streamFile, start_offset))
+ goto fail;
+ return vgmstream;
+
+fail:
+ close_vgmstream(vgmstream);
+ return NULL;
+}