From 37d7fe83c457ec007dac7cf118038e07eea5a238 Mon Sep 17 00:00:00 2001 From: bnnm Date: Mon, 10 Sep 2018 02:24:59 +0200 Subject: [PATCH] Move NXA Opus to its own file, since it's not very standard --- src/formats.c | 1 + src/libvgmstream.vcproj | 12 ++++--- src/libvgmstream.vcxproj | 1 + src/libvgmstream.vcxproj.filters | 3 ++ src/meta/nxa.c | 58 ++++++++++++++++++++++++++++++++ src/meta/opus.c | 56 ------------------------------ src/vgmstream.h | 1 + 7 files changed, 72 insertions(+), 60 deletions(-) create mode 100644 src/meta/nxa.c diff --git a/src/formats.c b/src/formats.c index 3566c5b4..d9e9a7af 100644 --- a/src/formats.c +++ b/src/formats.c @@ -1091,6 +1091,7 @@ static const meta_info meta_info_list[] = { {meta_XAU_KONAMI, "Konami XAU header"}, {meta_DERF, "Xilam DERF header"}, {meta_UTK, "Maxis UTK header"}, + {meta_NXA, "Entergram NXA header"}, }; diff --git a/src/libvgmstream.vcproj b/src/libvgmstream.vcproj index 1018203d..89e0e24e 100644 --- a/src/libvgmstream.vcproj +++ b/src/libvgmstream.vcproj @@ -830,10 +830,14 @@ RelativePath=".\meta\nus3bank.c" > - - + + + + diff --git a/src/libvgmstream.vcxproj b/src/libvgmstream.vcxproj index b91f0f34..8a4445e3 100644 --- a/src/libvgmstream.vcxproj +++ b/src/libvgmstream.vcxproj @@ -312,6 +312,7 @@ + diff --git a/src/libvgmstream.vcxproj.filters b/src/libvgmstream.vcxproj.filters index 7130e738..cf058c9f 100644 --- a/src/libvgmstream.vcxproj.filters +++ b/src/libvgmstream.vcxproj.filters @@ -511,6 +511,9 @@ meta\Source Files + + meta\Source Files + meta\Source Files diff --git a/src/meta/nxa.c b/src/meta/nxa.c new file mode 100644 index 00000000..3c385ad2 --- /dev/null +++ b/src/meta/nxa.c @@ -0,0 +1,58 @@ +#include "meta.h" +#include "../coding/coding.h" + + +/* Entergram NXA Opus [Higurashi no Naku Koro ni Hou (Switch)] */ +VGMSTREAM * init_vgmstream_opus_nxa(STREAMFILE *streamFile) { + VGMSTREAM * vgmstream = NULL; + off_t start_offset; + int loop_flag = 0, channel_count; + size_t data_size, skip = 0; + + /* checks */ + if (!check_extensions(streamFile, "nxa")) + goto fail; + if (read_32bitBE(0x00, streamFile) != 0x4E584131) /* "NXA1" */ + goto fail; + + channel_count = read_16bitLE(0x10, streamFile); + skip = read_16bitLE(0x16, streamFile); + data_size = read_32bitLE(0x08, streamFile)-0x30; + start_offset = 0x30; + + /* TODO: Determine if loop points are stored externally. No visible loop points in header */ + loop_flag = 0; + + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channel_count, loop_flag); + if (!vgmstream) goto fail; + + vgmstream->meta_type = meta_NXA; + vgmstream->num_samples = read_32bitLE(0x20, streamFile); + vgmstream->sample_rate = read_32bitLE(0x0C, streamFile); + +#ifdef VGM_USE_FFMPEG + { + vgmstream->codec_data = init_ffmpeg_switch_opus(streamFile, start_offset, data_size, vgmstream->channels, skip, vgmstream->sample_rate); + if (!vgmstream->codec_data) goto fail; + vgmstream->coding_type = coding_FFmpeg; + vgmstream->layout_type = layout_none; + + if (vgmstream->num_samples == 0) { + vgmstream->num_samples = switch_opus_get_samples(start_offset, data_size, vgmstream->sample_rate, streamFile) - skip; + } + } +#else + goto fail; +#endif + + /* open the file for reading */ + if (!vgmstream_open_stream(vgmstream, streamFile, start_offset)) + goto fail; + return vgmstream; + +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/src/meta/opus.c b/src/meta/opus.c index fe301de5..125e1e9d 100644 --- a/src/meta/opus.c +++ b/src/meta/opus.c @@ -1,5 +1,4 @@ #include "meta.h" -#include "../util.h" #include "../coding/coding.h" #include "../layout/layout.h" #include "opus_interleave_streamfile.h" @@ -314,58 +313,3 @@ VGMSTREAM * init_vgmstream_opus_nlsd(STREAMFILE *streamFile) { fail: return NULL; } - -/* Entergram NXA Opus [Higurashi no Naku Koro ni Hou (Switch)] */ -VGMSTREAM * init_vgmstream_opus_nxa(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - off_t start_offset; - int loop_flag = 0, channel_count; - size_t data_size, skip = 0; - - /* checks */ - if (!check_extensions(streamFile, "nxa")) - goto fail; - if (read_32bitBE(0x00, streamFile) != 0x4E584131) /* "NXA1" */ - goto fail; - - channel_count = read_16bitLE(0x10, streamFile); - skip = read_16bitLE(0x16, streamFile); - data_size = read_32bitLE(0x08, streamFile)-0x30; - start_offset = 0x30; - - /* TODO: Determine if loop points are stored externally. No visible loop points in header */ - loop_flag = 0; - - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count, loop_flag); - if (!vgmstream) goto fail; - - vgmstream->meta_type = meta_OPUS; - vgmstream->num_samples = read_32bitLE(0x20, streamFile); - vgmstream->sample_rate = read_32bitLE(0x0C, streamFile); - -#ifdef VGM_USE_FFMPEG - { - vgmstream->codec_data = init_ffmpeg_switch_opus(streamFile, start_offset, data_size, vgmstream->channels, skip, vgmstream->sample_rate); - if (!vgmstream->codec_data) goto fail; - vgmstream->coding_type = coding_FFmpeg; - vgmstream->layout_type = layout_none; - - if (vgmstream->num_samples == 0) { - vgmstream->num_samples = switch_opus_get_samples(start_offset, data_size, vgmstream->sample_rate, streamFile) - skip; - } - } -#else - goto fail; -#endif - - /* open the file for reading */ - if (!vgmstream_open_stream(vgmstream, streamFile, start_offset)) - goto fail; - return vgmstream; - -fail: - close_vgmstream(vgmstream); - return NULL; -} diff --git a/src/vgmstream.h b/src/vgmstream.h index 38c7ecc7..210818c9 100644 --- a/src/vgmstream.h +++ b/src/vgmstream.h @@ -704,6 +704,7 @@ typedef enum { meta_XAU_KONAMI, /* Yu-Gi-Oh - The Dawn of Destiny (Xbox) */ meta_DERF, /* Stupid Invaders (PC) */ meta_UTK, + meta_NXA, } meta_t;