SLI: ignore comments and cleanup

This commit is contained in:
bnnm 2021-12-31 16:11:47 +01:00
parent 21f6696354
commit 6ea7e4a256
2 changed files with 111 additions and 117 deletions

View File

@ -1,116 +1,110 @@
#include "meta.h" #include "meta.h"
#include <ctype.h> #include <ctype.h>
/* .sli+ogg/opus - KiriKiri engine / WaveLoopManager loop points loader [Fate/Stay Night (PC), World End Economica (PC)] */ /* .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* init_vgmstream_sli_ogg(STREAMFILE* sf) {
VGMSTREAM * vgmstream = NULL; VGMSTREAM* vgmstream = NULL;
STREAMFILE * streamData = NULL; STREAMFILE* sf_data = NULL;
int32_t loop_start = -1, loop_length = -1; int32_t loop_start = -1, loop_length = -1;
int32_t loop_from = -1, loop_to = -1; int32_t loop_from = -1, loop_to = -1;
/* checks */ /* checks */
if (!check_extensions(streamFile, "sli")) if (!check_extensions(sf, "sli"))
goto fail; goto fail;
{ {
/* try with file.ogg/opus.sli=header and file.ogg/opus=data */ /* try with file.ogg/opus.sli=header and file.ogg/opus=data */
char basename[PATH_LIMIT]; char basename[PATH_LIMIT];
get_streamfile_basename(streamFile,basename,PATH_LIMIT); get_streamfile_basename(sf,basename,PATH_LIMIT);
streamData = open_streamfile_by_filename(streamFile, basename); sf_data = open_streamfile_by_filename(sf, basename);
if (!streamData) goto fail; if (!sf_data) goto fail;
} }
if (!is_id32be(0x00, sf_data, "OggS"))
/* let the real initer do the parsing */ goto fail;
if (check_extensions(streamData, "ogg")) { /* Fate/Stay Night (PC) */
#ifdef VGM_USE_VORBIS /* let the real initer do the parsing */
vgmstream = init_vgmstream_ogg_vorbis(streamData); if (is_id32be(0x1c, sf_data, "Opus")) { /* Sabbat of the Witch (PC) */
if (!vgmstream) goto fail; vgmstream = init_vgmstream_ogg_opus(sf_data);
if (!vgmstream) goto fail;
vgmstream->meta_type = meta_OGG_SLI;
#else /* somehow sli+opus use 0 encoder delay in the OpusHead (to simplify looping?) */
goto fail; vgmstream->meta_type = meta_OPUS_SLI;
#endif }
} else { /* Fate/Stay Night (PC) */
else if (check_extensions(streamData, "opus")) { /* Sabbat of the Witch (PC) */ vgmstream = init_vgmstream_ogg_vorbis(sf_data);
#ifdef VGM_USE_FFMPEG if (!vgmstream) goto fail;
vgmstream = init_vgmstream_ffmpeg(streamData);
if (!vgmstream) goto fail; vgmstream->meta_type = meta_OGG_SLI;
}
/* FFmpeg's Opus encoder delay is borked but no need to fix:
* somehow sli+opus use 0 in the OpusHead (to simplify looping?) */
/* find loop text */
vgmstream->meta_type = meta_OPUS_SLI; {
#else char line[PATH_LIMIT];
goto fail; size_t bytes_read;
#endif off_t sli_offset;
} int line_ok;
else {
goto fail; sli_offset = 0;
} while ((loop_start == -1 || loop_length == -1) && sli_offset < get_streamfile_size(sf)) {
char *endptr, *foundptr;
/* find loop text */ bytes_read = read_line(line, sizeof(line), sli_offset, sf, &line_ok);
{ if (!line_ok) goto fail;
char line[PATH_LIMIT]; sli_offset += bytes_read;
size_t bytes_read; /* files may be padded with 0s */
off_t sli_offset;
int line_ok; /* comments in v2.0 [Sabbath of the Witch (PC), KARAKARA (PC)] */
if (line[0] == '#')
sli_offset = 0; continue;
while ((loop_start == -1 || loop_length == -1) && sli_offset < get_streamfile_size(streamFile)) {
char *endptr, *foundptr; if (memcmp("LoopStart=", line,10) == 0 && line[10] != '\0') {
loop_start = strtol(line + 10, &endptr, 10);
bytes_read = read_line(line, sizeof(line), sli_offset, streamFile, &line_ok); if (*endptr != '\0') {
if (!line_ok) goto fail; loop_start = -1; /* if it didn't parse cleanly */
}
if (memcmp("LoopStart=",line,10)==0 && line[10] != '\0') { }
loop_start = strtol(line+10,&endptr,10); else if (memcmp("LoopLength=", line, 11) == 0 && line[11] != '\0') {
if (*endptr != '\0') { loop_length = strtol(line + 11, &endptr, 10);
loop_start = -1; /* if it didn't parse cleanly */ if (*endptr != '\0') {
} loop_length = -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') { /* a completely different format ("#2.00"?), can be handled similarly */
loop_length = -1; /* if it didn't parse cleanly */ if ((foundptr = strstr(line,"To=")) != NULL && isdigit(foundptr[3])) {
} loop_to = strtol(foundptr + 3, &endptr, 10);
} if (*endptr != ';') {
loop_to = -1;
/* 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 ((foundptr = strstr(line,"From=")) != NULL && isdigit(foundptr[5])) {
if (*endptr != ';') { loop_from = strtol(foundptr + 5, &endptr, 10);
loop_to = -1; if (*endptr != ';') {
} loop_from = -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);
sli_offset += bytes_read; }
} else if (loop_from != -1 && loop_to != -1) { /* v2 */
} vgmstream_force_loop(vgmstream, 1, loop_to, loop_from);
}
if (loop_start != -1 && loop_length != -1) { /* v1 */ else {
vgmstream_force_loop(vgmstream,1,loop_start, loop_start+loop_length); goto fail; /* if there's no loop points the .sli wasn't valid */
} }
else if (loop_from != -1 && loop_to != -1) { /* v2 */
vgmstream_force_loop(vgmstream,1,loop_to, loop_from); close_streamfile(sf_data);
} return vgmstream;
else {
goto fail; /* if there's no loop points the .sli wasn't valid */ fail:
} close_streamfile(sf_data);
close_vgmstream(vgmstream);
close_streamfile(streamData); return NULL;
return vgmstream; }
fail:
close_streamfile(streamData);
close_vgmstream(vgmstream);
return NULL;
}

View File

@ -53,7 +53,6 @@ VGMSTREAM* (*init_vgmstream_functions[])(STREAMFILE* sf) = {
init_vgmstream_vpk, init_vgmstream_vpk,
init_vgmstream_genh, init_vgmstream_genh,
init_vgmstream_ogg_vorbis, init_vgmstream_ogg_vorbis,
init_vgmstream_sli_ogg,
init_vgmstream_sfl_ogg, init_vgmstream_sfl_ogg,
init_vgmstream_sadb, init_vgmstream_sadb,
init_vgmstream_ps2_bmdx, init_vgmstream_ps2_bmdx,
@ -529,6 +528,7 @@ VGMSTREAM* (*init_vgmstream_functions[])(STREAMFILE* sf) = {
init_vgmstream_mic_koei, init_vgmstream_mic_koei,
init_vgmstream_seb, init_vgmstream_seb,
init_vgmstream_ps2_pnb, init_vgmstream_ps2_pnb,
init_vgmstream_sli_ogg,
/* lowest priority metas (should go after all metas, and TXTH should go before raw formats) */ /* 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 */ init_vgmstream_txth, /* proper parsers should supersede TXTH, once added */