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
|
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.
|
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
|
## Logged errors and unplayable supported files
|
||||||
Some formats should normally play, but somehow don't. In those cases plugins
|
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
|
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_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 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);
|
#if !(FSB_VORBIS_USE_PRECOMPILED_FVS)
|
||||||
static int load_fvs_file_multi(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf);
|
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);
|
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;
|
size_t bytes;
|
||||||
|
|
||||||
/* get next packet size from the FSB 16b header (doesn't count this 16b) */
|
/* 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;
|
stream->offset += 2;
|
||||||
if (data->op.bytes == 0 || data->op.bytes == 0xFFFF || data->op.bytes > data->buffer_size) goto fail; /* EOF or end padding */
|
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);
|
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 */
|
memcpy (buf+0x01, "vorbis", 6); /* id */
|
||||||
put_32bitLE(buf+0x07, 0x00); /* vorbis_version (fixed) */
|
put_u32le(buf+0x07, 0x00); /* vorbis_version (fixed) */
|
||||||
put_8bit (buf+0x0b, channels); /* audio_channels */
|
put_u8 (buf+0x0b, channels); /* audio_channels */
|
||||||
put_32bitLE(buf+0x0c, sample_rate); /* audio_sample_rate */
|
put_s32le(buf+0x0c, sample_rate); /* audio_sample_rate */
|
||||||
put_32bitLE(buf+0x10, 0x00); /* bitrate_maximum (optional hint) */
|
put_u32le(buf+0x10, 0x00); /* bitrate_maximum (optional hint) */
|
||||||
put_32bitLE(buf+0x14, 0x00); /* bitrate_nominal (optional hint) */
|
put_u32le(buf+0x14, 0x00); /* bitrate_nominal (optional hint) */
|
||||||
put_32bitLE(buf+0x18, 0x00); /* bitrate_minimum (optional hint) */
|
put_u32le(buf+0x18, 0x00); /* bitrate_minimum (optional hint) */
|
||||||
put_8bit (buf+0x1c, blocksizes); /* blocksize_0 + blocksize_1 nibbles */
|
put_u8 (buf+0x1c, blocksizes); /* blocksize_0 + blocksize_1 nibbles */
|
||||||
put_8bit (buf+0x1d, 0x01); /* framing_flag (fixed) */
|
put_u8 (buf+0x1d, 0x01); /* framing_flag (fixed) */
|
||||||
|
|
||||||
return bytes;
|
return bytes;
|
||||||
}
|
}
|
||||||
@ -127,12 +128,12 @@ static int build_header_comment(uint8_t* buf, size_t bufsize) {
|
|||||||
|
|
||||||
if (bytes > bufsize) return 0;
|
if (bytes > bufsize) return 0;
|
||||||
|
|
||||||
put_8bit (buf+0x00, 0x03); /* packet_type (comments) */
|
put_u8 (buf+0x00, 0x03); /* packet_type (comments) */
|
||||||
memcpy (buf+0x01, "vorbis", 6); /* id */
|
memcpy (buf+0x01, "vorbis", 6); /* id */
|
||||||
put_32bitLE(buf+0x07, 0x09); /* vendor_length */
|
put_u32le(buf+0x07, 0x09); /* vendor_length */
|
||||||
memcpy (buf+0x0b, "vgmstream", 9); /* vendor_string */
|
memcpy (buf+0x0b, "vgmstream", 9); /* vendor_string */
|
||||||
put_32bitLE(buf+0x14, 0x00); /* user_comment_list_length */
|
put_u32le(buf+0x14, 0x00); /* user_comment_list_length */
|
||||||
put_8bit (buf+0x18, 0x01); /* framing_flag (fixed) */
|
put_u8 (buf+0x18, 0x01); /* framing_flag (fixed) */
|
||||||
|
|
||||||
return bytes;
|
return bytes;
|
||||||
}
|
}
|
||||||
@ -145,49 +146,20 @@ static int build_header_setup(uint8_t* buf, size_t bufsize, uint32_t setup_id, S
|
|||||||
if (bytes)
|
if (bytes)
|
||||||
return bytes;
|
return bytes;
|
||||||
|
|
||||||
|
#if !(FSB_VORBIS_USE_PRECOMPILED_FVS)
|
||||||
/* try to load from external files */
|
/* try to load from external files */
|
||||||
bytes = load_fvs_file_single(buf, bufsize, setup_id, sf);
|
bytes = load_fvs_file(buf, bufsize, setup_id, sf);
|
||||||
if (bytes)
|
|
||||||
return bytes;
|
|
||||||
|
|
||||||
bytes = load_fvs_file_multi(buf, bufsize, setup_id, sf);
|
|
||||||
if (bytes)
|
if (bytes)
|
||||||
return bytes;
|
return bytes;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* not found */
|
/* not found */
|
||||||
VGM_LOG("FSB Vorbis: setup_id %08x not found\n", setup_id);
|
VGM_LOG("FSB Vorbis: setup_id %08x not found\n", setup_id);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int load_fvs_file_single(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf) {
|
#if !(FSB_VORBIS_USE_PRECOMPILED_FVS)
|
||||||
STREAMFILE* sf_setup = NULL;
|
static int load_fvs_file(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf) {
|
||||||
|
|
||||||
/* 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) {
|
|
||||||
STREAMFILE* sf_setup = NULL;
|
STREAMFILE* sf_setup = NULL;
|
||||||
|
|
||||||
/* from to get from artificial external file (used if compiled without codebooks) */
|
/* 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);
|
if (sf_setup) sf_setup->close(sf_setup);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int load_fvs_array(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf) {
|
static int load_fvs_array(uint8_t* buf, size_t bufsize, uint32_t setup_id, STREAMFILE* sf) {
|
||||||
#if FSB_VORBIS_USE_PRECOMPILED_FVS
|
#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 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);
|
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);
|
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);
|
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)
|
if (bytes)
|
||||||
return bytes;
|
return bytes;
|
||||||
|
|
||||||
|
#if !(WWISE_VORBIS_USE_PRECOMPILED_WVC)
|
||||||
/* try to load from external file (ignoring type, just use file if found) */
|
/* try to load from external file (ignoring type, just use file if found) */
|
||||||
bytes = load_wvc_file(ibuf, ibufsize, codebook_id, sf);
|
bytes = load_wvc_file(ibuf, ibufsize, codebook_id, sf);
|
||||||
if (bytes)
|
if (bytes)
|
||||||
return bytes;
|
return bytes;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* not found */
|
/* not found */
|
||||||
VGM_LOG("Wwise Vorbis: codebook_id %04x not found\n", codebook_id);
|
VGM_LOG("Wwise Vorbis: codebook_id %04x not found\n", codebook_id);
|
||||||
return 0;
|
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) {
|
static int load_wvc_file(uint8_t* buf, size_t bufsize, uint32_t codebook_id, STREAMFILE* sf) {
|
||||||
STREAMFILE* sf_setup = NULL;
|
STREAMFILE* sf_setup = NULL;
|
||||||
size_t wvc_size = 0;
|
size_t wvc_size = 0;
|
||||||
@ -1185,6 +1190,7 @@ fail:
|
|||||||
close_streamfile(sf_setup);
|
close_streamfile(sf_setup);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int load_wvc_array(uint8_t* buf, size_t bufsize, uint32_t codebook_id, wwise_setup_t setup_type) {
|
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
|
#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 0
|
||||||
if (wvc == NULL) goto fail;
|
if (wvc == NULL) goto fail;
|
||||||
/* find codebook and copy to buffer */
|
/* find codebook and copy to buffer */
|
||||||
|
@ -138,10 +138,8 @@ VGMSTREAM* init_vgmstream_akb(STREAMFILE* sf) {
|
|||||||
|
|
||||||
/* enable encryption */
|
/* enable encryption */
|
||||||
if (version >= 3 && (flags & 8)) {
|
if (version >= 3 && (flags & 8)) {
|
||||||
VGM_LOG("temp1\n");
|
|
||||||
temp_sf = setup_sqex_streamfile(sf, start_offset, stream_size, 1, 0x00, 0x00, "ogg");
|
temp_sf = setup_sqex_streamfile(sf, start_offset, stream_size, 1, 0x00, 0x00, "ogg");
|
||||||
if (!temp_sf) goto fail;
|
if (!temp_sf) goto fail;
|
||||||
VGM_LOG("temp2\n");
|
|
||||||
|
|
||||||
ogg_vgmstream = init_vgmstream_ogg_vorbis_config(temp_sf, 0x00, &ovmi);
|
ogg_vgmstream = init_vgmstream_ogg_vorbis_config(temp_sf, 0x00, &ovmi);
|
||||||
close_streamfile(temp_sf);
|
close_streamfile(temp_sf);
|
||||||
|
@ -78,7 +78,7 @@ VGMSTREAM* init_vgmstream_awb_memory(STREAMFILE* sf, STREAMFILE* sf_acb) {
|
|||||||
subfile_size = subfile_next - subfile_offset;
|
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
|
/* autodetect as there isn't anything, plus can mix types
|
||||||
* (waveid<>codec info is usually in the companion .acb) */
|
* (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) {
|
else if (strncasecmp(tags->key, "EXACTMATCH", key_len) == 0) {
|
||||||
tags->exact_match = 1;
|
tags->exact_match = 1;
|
||||||
VGM_LOG("exact\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
continue; /* not an actual tag */
|
continue; /* not an actual tag */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user