From 6ea7e4a256ae0c5b7c5dbf0fb53ec3e29b100c00 Mon Sep 17 00:00:00 2001 From: bnnm Date: Fri, 31 Dec 2021 16:11:47 +0100 Subject: [PATCH] SLI: ignore comments and cleanup --- src/meta/sli.c | 226 +++++++++++++++++++++++------------------------- src/vgmstream.c | 2 +- 2 files changed, 111 insertions(+), 117 deletions(-) diff --git a/src/meta/sli.c b/src/meta/sli.c index 41554ed1..b4a994c0 100644 --- a/src/meta/sli.c +++ b/src/meta/sli.c @@ -1,116 +1,110 @@ -#include "meta.h" -#include - - -/* .sli+ogg/opus - KiriKiri engine / WaveLoopManager loop points loader [Fate/Stay Night (PC), World End Economica (PC)] */ -VGMSTREAM * init_vgmstream_sli_ogg(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - STREAMFILE * streamData = NULL; - int32_t loop_start = -1, loop_length = -1; - int32_t loop_from = -1, loop_to = -1; - - /* checks */ - if (!check_extensions(streamFile, "sli")) - goto fail; - - { - /* try with file.ogg/opus.sli=header and file.ogg/opus=data */ - char basename[PATH_LIMIT]; - get_streamfile_basename(streamFile,basename,PATH_LIMIT); - streamData = open_streamfile_by_filename(streamFile, basename); - if (!streamData) goto fail; - } - - - /* let the real initer do the parsing */ - if (check_extensions(streamData, "ogg")) { /* Fate/Stay Night (PC) */ -#ifdef VGM_USE_VORBIS - vgmstream = init_vgmstream_ogg_vorbis(streamData); - if (!vgmstream) goto fail; - - vgmstream->meta_type = meta_OGG_SLI; -#else - goto fail; -#endif - } - else if (check_extensions(streamData, "opus")) { /* Sabbat of the Witch (PC) */ -#ifdef VGM_USE_FFMPEG - vgmstream = init_vgmstream_ffmpeg(streamData); - if (!vgmstream) goto fail; - - /* FFmpeg's Opus encoder delay is borked but no need to fix: - * somehow sli+opus use 0 in the OpusHead (to simplify looping?) */ - - vgmstream->meta_type = meta_OPUS_SLI; -#else - goto fail; -#endif - } - else { - goto fail; - } - - - /* find loop text */ - { - char line[PATH_LIMIT]; - size_t bytes_read; - off_t sli_offset; - int line_ok; - - sli_offset = 0; - while ((loop_start == -1 || loop_length == -1) && sli_offset < get_streamfile_size(streamFile)) { - char *endptr, *foundptr; - - bytes_read = read_line(line, sizeof(line), sli_offset, streamFile, &line_ok); - if (!line_ok) goto fail; - - if (memcmp("LoopStart=",line,10)==0 && line[10] != '\0') { - loop_start = strtol(line+10,&endptr,10); - if (*endptr != '\0') { - loop_start = -1; /* if it didn't parse cleanly */ - } - } - else if (memcmp("LoopLength=",line,11)==0 && line[11] != '\0') { - loop_length = strtol(line+11,&endptr,10); - if (*endptr != '\0') { - loop_length = -1; /* if it didn't parse cleanly */ - } - } - - /* a completely different format (2.0?), also with .sli extension and can be handled similarly */ - if ((foundptr = strstr(line,"To=")) != NULL && isdigit(foundptr[3])) { - loop_to = strtol(foundptr+3,&endptr,10); - if (*endptr != ';') { - loop_to = -1; - } - } - if ((foundptr = strstr(line,"From=")) != NULL && isdigit(foundptr[5])) { - loop_from = strtol(foundptr+5,&endptr,10); - if (*endptr != ';') { - loop_from = -1; - } - } - - sli_offset += bytes_read; - } - } - - if (loop_start != -1 && loop_length != -1) { /* v1 */ - vgmstream_force_loop(vgmstream,1,loop_start, loop_start+loop_length); - } - else if (loop_from != -1 && loop_to != -1) { /* v2 */ - vgmstream_force_loop(vgmstream,1,loop_to, loop_from); - } - else { - goto fail; /* if there's no loop points the .sli wasn't valid */ - } - - close_streamfile(streamData); - return vgmstream; - -fail: - close_streamfile(streamData); - close_vgmstream(vgmstream); - return NULL; -} +#include "meta.h" +#include + + +/* .sli+ogg/opus - KiriKiri engine / WaveLoopManager loop points loader [Fate/Stay Night (PC), World End Economica (PC)] */ +VGMSTREAM* init_vgmstream_sli_ogg(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + STREAMFILE* sf_data = NULL; + int32_t loop_start = -1, loop_length = -1; + int32_t loop_from = -1, loop_to = -1; + + /* checks */ + if (!check_extensions(sf, "sli")) + goto fail; + + { + /* try with file.ogg/opus.sli=header and file.ogg/opus=data */ + char basename[PATH_LIMIT]; + get_streamfile_basename(sf,basename,PATH_LIMIT); + sf_data = open_streamfile_by_filename(sf, basename); + if (!sf_data) goto fail; + } + + if (!is_id32be(0x00, sf_data, "OggS")) + goto fail; + + /* let the real initer do the parsing */ + if (is_id32be(0x1c, sf_data, "Opus")) { /* Sabbat of the Witch (PC) */ + vgmstream = init_vgmstream_ogg_opus(sf_data); + if (!vgmstream) goto fail; + + /* somehow sli+opus use 0 encoder delay in the OpusHead (to simplify looping?) */ + vgmstream->meta_type = meta_OPUS_SLI; + } + else { /* Fate/Stay Night (PC) */ + vgmstream = init_vgmstream_ogg_vorbis(sf_data); + if (!vgmstream) goto fail; + + vgmstream->meta_type = meta_OGG_SLI; + } + + + /* find loop text */ + { + char line[PATH_LIMIT]; + size_t bytes_read; + off_t sli_offset; + int line_ok; + + sli_offset = 0; + while ((loop_start == -1 || loop_length == -1) && sli_offset < get_streamfile_size(sf)) { + char *endptr, *foundptr; + + bytes_read = read_line(line, sizeof(line), sli_offset, sf, &line_ok); + if (!line_ok) goto fail; + sli_offset += bytes_read; + /* files may be padded with 0s */ + + /* comments in v2.0 [Sabbath of the Witch (PC), KARAKARA (PC)] */ + if (line[0] == '#') + continue; + + if (memcmp("LoopStart=", line,10) == 0 && line[10] != '\0') { + loop_start = strtol(line + 10, &endptr, 10); + if (*endptr != '\0') { + loop_start = -1; /* if it didn't parse cleanly */ + } + } + else if (memcmp("LoopLength=", line, 11) == 0 && line[11] != '\0') { + loop_length = strtol(line + 11, &endptr, 10); + if (*endptr != '\0') { + loop_length = -1; /* if it didn't parse cleanly */ + } + } + + /* a completely different format ("#2.00"?), can be handled similarly */ + if ((foundptr = strstr(line,"To=")) != NULL && isdigit(foundptr[3])) { + loop_to = strtol(foundptr + 3, &endptr, 10); + if (*endptr != ';') { + loop_to = -1; + } + } + if ((foundptr = strstr(line,"From=")) != NULL && isdigit(foundptr[5])) { + loop_from = strtol(foundptr + 5, &endptr, 10); + if (*endptr != ';') { + loop_from = -1; + } + } + + } + } + + if (loop_start != -1 && loop_length != -1) { /* v1 */ + vgmstream_force_loop(vgmstream, 1, loop_start, loop_start + loop_length); + } + else if (loop_from != -1 && loop_to != -1) { /* v2 */ + vgmstream_force_loop(vgmstream, 1, loop_to, loop_from); + } + else { + goto fail; /* if there's no loop points the .sli wasn't valid */ + } + + close_streamfile(sf_data); + return vgmstream; + +fail: + close_streamfile(sf_data); + close_vgmstream(vgmstream); + return NULL; +} diff --git a/src/vgmstream.c b/src/vgmstream.c index 89965820..4866a403 100644 --- a/src/vgmstream.c +++ b/src/vgmstream.c @@ -53,7 +53,6 @@ VGMSTREAM* (*init_vgmstream_functions[])(STREAMFILE* sf) = { init_vgmstream_vpk, init_vgmstream_genh, init_vgmstream_ogg_vorbis, - init_vgmstream_sli_ogg, init_vgmstream_sfl_ogg, init_vgmstream_sadb, init_vgmstream_ps2_bmdx, @@ -529,6 +528,7 @@ VGMSTREAM* (*init_vgmstream_functions[])(STREAMFILE* sf) = { init_vgmstream_mic_koei, init_vgmstream_seb, init_vgmstream_ps2_pnb, + init_vgmstream_sli_ogg, /* lowest priority metas (should go after all metas, and TXTH should go before raw formats) */ init_vgmstream_txth, /* proper parsers should supersede TXTH, once added */