mirror of
https://github.com/vgmstream/vgmstream.git
synced 2025-01-19 00:04:04 +01:00
Cleanup/doc
This commit is contained in:
parent
47381e7e3d
commit
791a7de02a
19
doc/USAGE.md
19
doc/USAGE.md
@ -630,6 +630,25 @@ If your main motivation for extracting is to rename or have loose files, remembe
|
||||
you can simply use TXTP to point to a subsong, and name that `.txtp` whatever you
|
||||
want, without having to touch original data or needing custom extractors.
|
||||
|
||||
### Cue formats
|
||||
Some formats that vgmstream supports (SQEX's .sab, CRI's .acb+awb, Wwise's .bnk+wem,
|
||||
Microsoft's .xss+.xwb....) are "cue" formats. The way these work is (more or less),
|
||||
they have a bunch of named audio "cues"/"events" in a section of the file, that are
|
||||
called to play one or multiple audio "waves"/"materials" in another section.
|
||||
|
||||
Rather than handling cues, vgmstream shows and plays waves, then assigns cue names
|
||||
that point to the wave if possible, since vgmstream mainly deals with streamed/wave
|
||||
audio and simulating cues is out of scope. Figuring out a whole cue format can be a
|
||||
*huge* time investment, so handling waves only is often enough.
|
||||
|
||||
Cues can be *very* complex, like N cues pointing to 1 wave with varying pitch, or
|
||||
1 cue playing one random wave out of 3. Sometimes not all waves are referenced by
|
||||
cues, or cues do undesirable effects that make only playing waves a good compromise.
|
||||
Simulating cues is better handled with external tools that allow more flexibility
|
||||
(for example, this project simulates Wwise's extremely complex cues/events by creating
|
||||
.TXTP telling vgmstream which config and waves to play, and one can filter desired
|
||||
cues/TXTP: https://github.com/bnnm/wwiser).
|
||||
|
||||
## Logged errors and unplayable supported files
|
||||
Some formats should normally play, but somehow don't. In those cases plugins
|
||||
can print vgmstream's error info to console (for example, `.fsb` with an unknown
|
||||
|
@ -17,8 +17,9 @@ static int build_header_identification(uint8_t* buf, size_t bufsize, int channel
|
||||
static int build_header_comment(uint8_t* buf, size_t bufsize);
|
||||
static int build_header_setup(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf);
|
||||
|
||||
static int load_fvs_file_single(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf);
|
||||
static int load_fvs_file_multi(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf);
|
||||
#if !(FSB_VORBIS_USE_PRECOMPILED_FVS)
|
||||
static int load_fvs_file(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf);
|
||||
#endif
|
||||
static int load_fvs_array(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf);
|
||||
|
||||
|
||||
@ -58,7 +59,7 @@ int vorbis_custom_parse_packet_fsb(VGMSTREAMCHANNEL* stream, vorbis_custom_codec
|
||||
size_t bytes;
|
||||
|
||||
/* get next packet size from the FSB 16b header (doesn't count this 16b) */
|
||||
data->op.bytes = (uint16_t)read_16bitLE(stream->offset, stream->streamfile);
|
||||
data->op.bytes = read_u16le(stream->offset, stream->streamfile);
|
||||
stream->offset += 2;
|
||||
if (data->op.bytes == 0 || data->op.bytes == 0xFFFF || data->op.bytes > data->buffer_size) goto fail; /* EOF or end padding */
|
||||
|
||||
@ -108,16 +109,16 @@ static int build_header_identification(uint8_t* buf, size_t bufsize, int channel
|
||||
}
|
||||
blocksizes = (exp_blocksize_0 << 4) | (exp_blocksize_1);
|
||||
|
||||
put_8bit (buf+0x00, 0x01); /* packet_type (id) */
|
||||
put_u8 (buf+0x00, 0x01); /* packet_type (id) */
|
||||
memcpy (buf+0x01, "vorbis", 6); /* id */
|
||||
put_32bitLE(buf+0x07, 0x00); /* vorbis_version (fixed) */
|
||||
put_8bit (buf+0x0b, channels); /* audio_channels */
|
||||
put_32bitLE(buf+0x0c, sample_rate); /* audio_sample_rate */
|
||||
put_32bitLE(buf+0x10, 0x00); /* bitrate_maximum (optional hint) */
|
||||
put_32bitLE(buf+0x14, 0x00); /* bitrate_nominal (optional hint) */
|
||||
put_32bitLE(buf+0x18, 0x00); /* bitrate_minimum (optional hint) */
|
||||
put_8bit (buf+0x1c, blocksizes); /* blocksize_0 + blocksize_1 nibbles */
|
||||
put_8bit (buf+0x1d, 0x01); /* framing_flag (fixed) */
|
||||
put_u32le(buf+0x07, 0x00); /* vorbis_version (fixed) */
|
||||
put_u8 (buf+0x0b, channels); /* audio_channels */
|
||||
put_s32le(buf+0x0c, sample_rate); /* audio_sample_rate */
|
||||
put_u32le(buf+0x10, 0x00); /* bitrate_maximum (optional hint) */
|
||||
put_u32le(buf+0x14, 0x00); /* bitrate_nominal (optional hint) */
|
||||
put_u32le(buf+0x18, 0x00); /* bitrate_minimum (optional hint) */
|
||||
put_u8 (buf+0x1c, blocksizes); /* blocksize_0 + blocksize_1 nibbles */
|
||||
put_u8 (buf+0x1d, 0x01); /* framing_flag (fixed) */
|
||||
|
||||
return bytes;
|
||||
}
|
||||
@ -127,12 +128,12 @@ static int build_header_comment(uint8_t* buf, size_t bufsize) {
|
||||
|
||||
if (bytes > bufsize) return 0;
|
||||
|
||||
put_8bit (buf+0x00, 0x03); /* packet_type (comments) */
|
||||
memcpy (buf+0x01, "vorbis", 6); /* id */
|
||||
put_32bitLE(buf+0x07, 0x09); /* vendor_length */
|
||||
memcpy (buf+0x0b, "vgmstream", 9); /* vendor_string */
|
||||
put_32bitLE(buf+0x14, 0x00); /* user_comment_list_length */
|
||||
put_8bit (buf+0x18, 0x01); /* framing_flag (fixed) */
|
||||
put_u8 (buf+0x00, 0x03); /* packet_type (comments) */
|
||||
memcpy (buf+0x01, "vorbis", 6); /* id */
|
||||
put_u32le(buf+0x07, 0x09); /* vendor_length */
|
||||
memcpy (buf+0x0b, "vgmstream", 9); /* vendor_string */
|
||||
put_u32le(buf+0x14, 0x00); /* user_comment_list_length */
|
||||
put_u8 (buf+0x18, 0x01); /* framing_flag (fixed) */
|
||||
|
||||
return bytes;
|
||||
}
|
||||
@ -145,49 +146,20 @@ static int build_header_setup(uint8_t* buf, size_t bufsize, uint32_t setup_id, S
|
||||
if (bytes)
|
||||
return bytes;
|
||||
|
||||
#if !(FSB_VORBIS_USE_PRECOMPILED_FVS)
|
||||
/* try to load from external files */
|
||||
bytes = load_fvs_file_single(buf, bufsize, setup_id, sf);
|
||||
if (bytes)
|
||||
return bytes;
|
||||
|
||||
bytes = load_fvs_file_multi(buf, bufsize, setup_id, sf);
|
||||
bytes = load_fvs_file(buf, bufsize, setup_id, sf);
|
||||
if (bytes)
|
||||
return bytes;
|
||||
#endif
|
||||
|
||||
/* not found */
|
||||
VGM_LOG("FSB Vorbis: setup_id %08x not found\n", setup_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int load_fvs_file_single(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf) {
|
||||
STREAMFILE* sf_setup = NULL;
|
||||
|
||||
/* get from artificial external file (used if compiled without codebooks) */
|
||||
{
|
||||
char setupname[0x20];
|
||||
|
||||
snprintf(setupname, sizeof(setupname), ".fvs_%08x", setup_id);
|
||||
sf_setup = open_streamfile_by_filename(sf, setupname);
|
||||
}
|
||||
|
||||
/* get codebook and copy to buffer */
|
||||
if (sf_setup) {
|
||||
size_t bytes = sf_setup->get_size(sf_setup);
|
||||
if (bytes > bufsize) goto fail;
|
||||
|
||||
if (read_streamfile(buf, 0, bytes, sf_setup) != bytes)
|
||||
goto fail;
|
||||
|
||||
close_streamfile(sf_setup);
|
||||
return bytes;
|
||||
}
|
||||
|
||||
fail:
|
||||
close_streamfile(sf_setup);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int load_fvs_file_multi(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf) {
|
||||
#if !(FSB_VORBIS_USE_PRECOMPILED_FVS)
|
||||
static int load_fvs_file(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf) {
|
||||
STREAMFILE* sf_setup = NULL;
|
||||
|
||||
/* from to get from artificial external file (used if compiled without codebooks) */
|
||||
@ -230,6 +202,7 @@ fail:
|
||||
if (sf_setup) sf_setup->close(sf_setup);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int load_fvs_array(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf) {
|
||||
#if FSB_VORBIS_USE_PRECOMPILED_FVS
|
||||
|
@ -34,7 +34,9 @@ static int ww2ogg_generate_vorbis_packet(bitstream_t* ow, bitstream_t* iw, wpack
|
||||
static int ww2ogg_generate_vorbis_setup(bitstream_t* ow, bitstream_t* iw, vorbis_custom_codec_data* data, size_t packet_size, STREAMFILE* sf);
|
||||
|
||||
static int load_wvc(uint8_t* ibuf, size_t ibufsize, uint32_t codebook_id, wwise_setup_t setup_type, STREAMFILE* sf);
|
||||
#if !(WWISE_VORBIS_USE_PRECOMPILED_WVC)
|
||||
static int load_wvc_file(uint8_t* buf, size_t bufsize, uint32_t codebook_id, STREAMFILE* sf);
|
||||
#endif
|
||||
static int load_wvc_array(uint8_t* buf, size_t bufsize, uint32_t codebook_id, wwise_setup_t setup_type);
|
||||
|
||||
|
||||
@ -1133,16 +1135,19 @@ static int load_wvc(uint8_t* ibuf, size_t ibufsize, uint32_t codebook_id, wwise_
|
||||
if (bytes)
|
||||
return bytes;
|
||||
|
||||
#if !(WWISE_VORBIS_USE_PRECOMPILED_WVC)
|
||||
/* try to load from external file (ignoring type, just use file if found) */
|
||||
bytes = load_wvc_file(ibuf, ibufsize, codebook_id, sf);
|
||||
if (bytes)
|
||||
return bytes;
|
||||
#endif
|
||||
|
||||
/* not found */
|
||||
VGM_LOG("Wwise Vorbis: codebook_id %04x not found\n", codebook_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if !(WWISE_VORBIS_USE_PRECOMPILED_WVC)
|
||||
static int load_wvc_file(uint8_t* buf, size_t bufsize, uint32_t codebook_id, STREAMFILE* sf) {
|
||||
STREAMFILE* sf_setup = NULL;
|
||||
size_t wvc_size = 0;
|
||||
@ -1185,6 +1190,7 @@ fail:
|
||||
close_streamfile(sf_setup);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int load_wvc_array(uint8_t* buf, size_t bufsize, uint32_t codebook_id, wwise_setup_t setup_type) {
|
||||
#if WWISE_VORBIS_USE_PRECOMPILED_WVC
|
||||
@ -1217,7 +1223,7 @@ static int load_wvc_array(uint8_t* buf, size_t bufsize, uint32_t codebook_id, ww
|
||||
}
|
||||
}
|
||||
|
||||
// this can be used if the lists contained a 1:1 dump of the codebook files
|
||||
// this can be used with 1:1 dump of the codebook file
|
||||
#if 0
|
||||
if (wvc == NULL) goto fail;
|
||||
/* find codebook and copy to buffer */
|
||||
|
@ -138,10 +138,8 @@ VGMSTREAM* init_vgmstream_akb(STREAMFILE* sf) {
|
||||
|
||||
/* enable encryption */
|
||||
if (version >= 3 && (flags & 8)) {
|
||||
VGM_LOG("temp1\n");
|
||||
temp_sf = setup_sqex_streamfile(sf, start_offset, stream_size, 1, 0x00, 0x00, "ogg");
|
||||
if (!temp_sf) goto fail;
|
||||
VGM_LOG("temp2\n");
|
||||
|
||||
ogg_vgmstream = init_vgmstream_ogg_vorbis_config(temp_sf, 0x00, &ovmi);
|
||||
close_streamfile(temp_sf);
|
||||
|
@ -78,7 +78,7 @@ VGMSTREAM* init_vgmstream_awb_memory(STREAMFILE* sf, STREAMFILE* sf_acb) {
|
||||
subfile_size = subfile_next - subfile_offset;
|
||||
}
|
||||
|
||||
;VGM_LOG("awb: subfile offset=%x + %x\n", subfile_offset, subfile_size);
|
||||
//;VGM_LOG("awb: subfile offset=%x + %x\n", subfile_offset, subfile_size);
|
||||
|
||||
/* autodetect as there isn't anything, plus can mix types
|
||||
* (waveid<>codec info is usually in the companion .acb) */
|
||||
|
@ -406,7 +406,6 @@ int vgmstream_tags_next_tag(VGMSTREAM_TAGS* tags, STREAMFILE* tagfile) {
|
||||
}
|
||||
else if (strncasecmp(tags->key, "EXACTMATCH", key_len) == 0) {
|
||||
tags->exact_match = 1;
|
||||
VGM_LOG("exact\n");
|
||||
}
|
||||
|
||||
continue; /* not an actual tag */
|
||||
|
Loading…
x
Reference in New Issue
Block a user