From 1d982bef6f1a4fbe09bfa7dcc90e939adc827108 Mon Sep 17 00:00:00 2001 From: Adrian Graber Date: Wed, 27 Sep 2023 14:50:21 +0200 Subject: [PATCH] Add support for FDK (NX) Opus Header --- doc/FORMATS.md | 4 +++ src/formats.c | 2 ++ src/libvgmstream.vcxproj | 1 + src/libvgmstream.vcxproj.filters | 3 ++ src/meta/fdk_nxopus.c | 52 ++++++++++++++++++++++++++++++++ src/meta/meta.h | 1 + src/vgmstream.c | 1 + src/vgmstream_types.h | 1 + 8 files changed, 65 insertions(+) create mode 100644 src/meta/fdk_nxopus.c diff --git a/doc/FORMATS.md b/doc/FORMATS.md index 369b6b87..aa4e26ad 100644 --- a/doc/FORMATS.md +++ b/doc/FORMATS.md @@ -1124,6 +1124,10 @@ different internally (encrypted, different versions, etc) and not always can be - Entergram NXA header [*NXA*] - *opus_nxa*: `.nxa` - Codecs: Opus +- **fdk_nxopus.c** + - Nihon Falcom FDK Opus Header [*FDK_NXOPUS*] + - *opus_fdk*: `.nxopus` + - Codecs: Opus - **pc_ast.c** - Capcom AST (PC) header [*PC_AST*] - *pc_ast*: `.ast` diff --git a/src/formats.c b/src/formats.c index 93afc56f..faeb5a3a 100644 --- a/src/formats.c +++ b/src/formats.c @@ -392,6 +392,7 @@ static const char* extension_list[] = { "nwa", "nwav", "nxa", + "nxopus", //"ogg", //common "ogg_", @@ -1416,6 +1417,7 @@ static const meta_info meta_info_list[] = { {meta_SQUEAKSTREAM, "Torus SqueakStream header"}, {meta_SQUEAKSAMPLE, "Torus SqueakSample header"}, {meta_SNDS, "Sony SNDS header"}, + {meta_FDK_NXOPUS, "Nihon Falcom FDK Opus Header"}, }; void get_vgmstream_coding_description(VGMSTREAM* vgmstream, char* out, size_t out_size) { diff --git a/src/libvgmstream.vcxproj b/src/libvgmstream.vcxproj index 99a85c6a..c123a0d1 100644 --- a/src/libvgmstream.vcxproj +++ b/src/libvgmstream.vcxproj @@ -425,6 +425,7 @@ + diff --git a/src/libvgmstream.vcxproj.filters b/src/libvgmstream.vcxproj.filters index bb2f940c..2067c5e4 100644 --- a/src/libvgmstream.vcxproj.filters +++ b/src/libvgmstream.vcxproj.filters @@ -1096,6 +1096,9 @@ meta\Source Files + + meta\Source Files + meta\Source Files diff --git a/src/meta/fdk_nxopus.c b/src/meta/fdk_nxopus.c new file mode 100644 index 00000000..5d7725e0 --- /dev/null +++ b/src/meta/fdk_nxopus.c @@ -0,0 +1,52 @@ +#include "meta.h" +#include "../coding/coding.h" + +/* Nihon Falcom FDK NXOpus [Ys X -NORDICS- (Switch)] */ +VGMSTREAM* init_vgmstream_opus_fdk(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + off_t start_offset; + int loop_flag, channels, sample_rate; + size_t data_size, skip = 0; + int32_t num_samples, loop_start, loop_end; + + /* checks */ + if (!is_id32le(0x00, sf, "nxof")) + goto fail; + if (!check_extensions(sf,"nxopus")) + goto fail; + + channels = read_u8(0x05, sf); + sample_rate = read_u32le(0x08, sf); + start_offset = read_u32le(0x18, sf); + data_size = read_u32le(0x1C, sf); + num_samples = read_u32le(0x20, sf); + loop_start = read_u32le(0x30, sf); + loop_end = read_u32le(0x34, sf); + + loop_flag = (loop_end > 0); + + vgmstream = allocate_vgmstream(channels, loop_flag); + if (!vgmstream) goto fail; + + vgmstream->meta_type = meta_FDK_NXOPUS; + vgmstream->sample_rate = sample_rate; + vgmstream->num_samples = num_samples; + vgmstream->loop_start_sample = loop_start; + vgmstream->loop_end_sample = loop_end; + +#ifdef VGM_USE_FFMPEG + vgmstream->codec_data = init_ffmpeg_switch_opus(sf, 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; +#else + goto fail; +#endif + + if (!vgmstream_open_stream(vgmstream, sf, start_offset)) + goto fail; + return vgmstream; +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/src/meta/meta.h b/src/meta/meta.h index f11b389c..8fbeafa8 100644 --- a/src/meta/meta.h +++ b/src/meta/meta.h @@ -625,6 +625,7 @@ VGMSTREAM* init_vgmstream_opus_opusnx(STREAMFILE* sf); VGMSTREAM* init_vgmstream_opus_nsopus(STREAMFILE* sf); VGMSTREAM* init_vgmstream_opus_sqex(STREAMFILE* sf); VGMSTREAM* init_vgmstream_opus_rsnd(STREAMFILE* sf); +VGMSTREAM* init_vgmstream_opus_fdk(STREAMFILE* sf); VGMSTREAM * init_vgmstream_pc_ast(STREAMFILE * streamFile); diff --git a/src/vgmstream.c b/src/vgmstream.c index 1dcf641c..a85595fb 100644 --- a/src/vgmstream.c +++ b/src/vgmstream.c @@ -309,6 +309,7 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_opus_nus3, init_vgmstream_opus_sps_n1, init_vgmstream_opus_nxa, + init_vgmstream_opus_fdk, init_vgmstream_pc_ast, init_vgmstream_naac, init_vgmstream_ubi_sb, diff --git a/src/vgmstream_types.h b/src/vgmstream_types.h index 15217c33..2b0383ee 100644 --- a/src/vgmstream_types.h +++ b/src/vgmstream_types.h @@ -702,6 +702,7 @@ typedef enum { meta_SQUEAKSTREAM, meta_SQUEAKSAMPLE, meta_SNDS, + meta_FDK_NXOPUS, } meta_t;