mirror of
https://github.com/vgmstream/vgmstream.git
synced 2025-02-25 22:38:11 +01:00
Add Argonaut ASF to TXTH [Croc (SAT)]
This commit is contained in:
parent
a2e99178e3
commit
d556919895
44
doc/TXTH.md
44
doc/TXTH.md
@ -139,10 +139,14 @@ as explained below, but often will use default values. Accepted codec strings:
|
|||||||
# - PCM4_U PCM 4-bit unsigned
|
# - PCM4_U PCM 4-bit unsigned
|
||||||
# * Variation with modified encoding
|
# * Variation with modified encoding
|
||||||
# - OKI16 OKI ADPCM with 16-bit output (not VOX/Dialogic 12-bit)
|
# - OKI16 OKI ADPCM with 16-bit output (not VOX/Dialogic 12-bit)
|
||||||
# * For few PS2 games (Sweet Legacy, Hooligan)
|
# * For rare PS2 games (Sweet Legacy, Hooligan)
|
||||||
# - AAC Advanced Audio Coding (raw without .mp4)
|
# - AAC Advanced Audio Coding (raw without .mp4)
|
||||||
# * For some 3DS games and many iOS games
|
# * For some 3DS games and many iOS games
|
||||||
# * Should set skip_samples (around 1024 but varies)
|
# * Should set skip_samples (around 1024 but varies)
|
||||||
|
# - TGC Tiger Game.com 4-bit ADPCM
|
||||||
|
# * For Tiger Game.com
|
||||||
|
# - ASF Argonaut ASF ADPCM
|
||||||
|
# * For rare Argonaut games [Croc (SAT)]
|
||||||
codec = (codec string)
|
codec = (codec string)
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -679,7 +683,7 @@ sample_rate = @0x04 #reads at 0x1204
|
|||||||
|
|
||||||
## Examples
|
## Examples
|
||||||
|
|
||||||
**Colin McRae DiRT (PC) .wip.txth**
|
#### Colin McRae DiRT (PC) .wip.txth
|
||||||
```
|
```
|
||||||
id_value = 0x00000000 #check that value at 0x00 is really 0x00000000
|
id_value = 0x00000000 #check that value at 0x00 is really 0x00000000
|
||||||
id_offset = @0x00:BE
|
id_offset = @0x00:BE
|
||||||
@ -693,7 +697,7 @@ loop_start_sample = 0
|
|||||||
loop_end_sample = data_size
|
loop_end_sample = data_size
|
||||||
```
|
```
|
||||||
|
|
||||||
**Kim Possible: What's the Switch (PS2) .str.txth**
|
#### Kim Possible: What's the Switch (PS2) .str.txth
|
||||||
```
|
```
|
||||||
codec = PSX
|
codec = PSX
|
||||||
interleave = 0x2000
|
interleave = 0x2000
|
||||||
@ -703,7 +707,7 @@ num_samples = data_size
|
|||||||
interleave_last = auto
|
interleave_last = auto
|
||||||
```
|
```
|
||||||
|
|
||||||
**Manhunt (Xbox) .rib.txth**
|
#### Manhunt (Xbox) .rib.txth
|
||||||
```
|
```
|
||||||
codec = XBOX
|
codec = XBOX
|
||||||
codec_mode = 1 #interleaved XBOX
|
codec_mode = 1 #interleaved XBOX
|
||||||
@ -715,7 +719,7 @@ start_offset = 0x00
|
|||||||
num_samples = data_size
|
num_samples = data_size
|
||||||
```
|
```
|
||||||
|
|
||||||
**Pitfall The Lost Expedition (PC) .txth**
|
#### Pitfall The Lost Expedition (PC) .txth
|
||||||
```
|
```
|
||||||
codec = DVI_IMA
|
codec = DVI_IMA
|
||||||
interleave = 0x80
|
interleave = 0x80
|
||||||
@ -725,7 +729,7 @@ sample_rate = 44100
|
|||||||
num_samples = data_size
|
num_samples = data_size
|
||||||
```
|
```
|
||||||
|
|
||||||
**Spy Hunter (GC) .pcm.txth**
|
#### Spy Hunter (GC) .pcm.txth
|
||||||
```
|
```
|
||||||
codec = PCM8
|
codec = PCM8
|
||||||
sample_rate = 32000
|
sample_rate = 32000
|
||||||
@ -734,7 +738,7 @@ start_offset = 0
|
|||||||
num_samples = data_size
|
num_samples = data_size
|
||||||
```
|
```
|
||||||
|
|
||||||
**Ultimate Board Game Collection (Wii) .dsp.txth**
|
#### Ultimate Board Game Collection (Wii) .dsp.txth
|
||||||
```
|
```
|
||||||
codec = NGC_DSP
|
codec = NGC_DSP
|
||||||
interleave = 0x10000
|
interleave = 0x10000
|
||||||
@ -753,7 +757,8 @@ coef_offset = 0x1c
|
|||||||
coef_spacing = 0x10000
|
coef_spacing = 0x10000
|
||||||
coef_endianness = BE
|
coef_endianness = BE
|
||||||
```
|
```
|
||||||
**Aladdin in Nasira's Revenge (PS1) .cvs.txth**
|
|
||||||
|
#### Aladdin in Nasira's Revenge (PS1) .cvs.txth
|
||||||
```
|
```
|
||||||
codec = PSX
|
codec = PSX
|
||||||
interleave = 0x10
|
interleave = 0x10
|
||||||
@ -763,7 +768,7 @@ padding_size = auto-empty
|
|||||||
num_samples = data_size
|
num_samples = data_size
|
||||||
```
|
```
|
||||||
|
|
||||||
**Shikigami no Shiro - Nanayozuki Gensoukyoku (PS2) bgm.txth**
|
#### Shikigami no Shiro - Nanayozuki Gensoukyoku (PS2) bgm.txth
|
||||||
```
|
```
|
||||||
codec = PSX
|
codec = PSX
|
||||||
interleave = 0x1000
|
interleave = 0x1000
|
||||||
@ -790,7 +795,7 @@ loop_end_sample = @0x10 * channels
|
|||||||
data_size = @0x08 * channels #for bitrate
|
data_size = @0x08 * channels #for bitrate
|
||||||
```
|
```
|
||||||
|
|
||||||
**Dragon Poker (Mobile) .snd.txth**
|
#### Dragon Poker (Mobile) .snd.txth
|
||||||
```
|
```
|
||||||
# parse MP3 inside the .snd
|
# parse MP3 inside the .snd
|
||||||
subfile_extension = mp3
|
subfile_extension = mp3
|
||||||
@ -805,7 +810,7 @@ loop_start_sample = 0
|
|||||||
loop_end_sample = data_size
|
loop_end_sample = data_size
|
||||||
```
|
```
|
||||||
|
|
||||||
**Simple 2000 Series Vol. 120 - The Saigo no Nihonhei (PS2) .xag.txth**
|
#### Simple 2000 Series Vol. 120 - The Saigo no Nihonhei (PS2) .xag.txth
|
||||||
```
|
```
|
||||||
header_file = TSNDDRVC.IRX
|
header_file = TSNDDRVC.IRX
|
||||||
|
|
||||||
@ -853,15 +858,14 @@ subfile_extension = seb
|
|||||||
subfile_size = ((@0x04 - @0x00) & 0xFFFFF) * 0x800
|
subfile_size = ((@0x04 - @0x00) & 0xFFFFF) * 0x800
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Zack & Wiki (Wii) .ssd.txth
|
||||||
**Zack & Wiki (Wii) .ssd.txth**
|
|
||||||
```
|
```
|
||||||
header_file = bgm_S01.srt
|
header_file = bgm_S01.srt
|
||||||
name_table = .names.txt
|
name_table = .names.txt
|
||||||
|
|
||||||
base_offset = @0x0c:BE
|
base_offset = @0x0c:BE
|
||||||
base_offset = base_offset + @0x08:BE + name_value
|
base_offset = base_offset + @0x08:BE + name_value
|
||||||
base_offset = base_offset + @0x00:BE
|
base_offset = base_offset + @0x00:BE - name_value
|
||||||
|
|
||||||
codec = NGC_DSP
|
codec = NGC_DSP
|
||||||
channels = 2
|
channels = 2
|
||||||
@ -891,7 +895,7 @@ st_s01_02c.ssd: 7*0x04
|
|||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
**Zack & Wiki (Wii) st_s01_00a.txth**
|
#### Zack & Wiki (Wii) st_s01_00a.txth
|
||||||
```
|
```
|
||||||
#alt from above with untouched folders
|
#alt from above with untouched folders
|
||||||
header_file = Sound/BGM/bgm_S01.srt
|
header_file = Sound/BGM/bgm_S01.srt
|
||||||
@ -900,7 +904,7 @@ name_table = .names.txt
|
|||||||
|
|
||||||
base_offset = @0x0c:BE
|
base_offset = @0x0c:BE
|
||||||
base_offset = base_offset + @0x08:BE + name_value
|
base_offset = base_offset + @0x08:BE + name_value
|
||||||
base_offset = base_offset + @0x00:BE
|
base_offset = base_offset + @0x00:BE - name_value
|
||||||
|
|
||||||
codec = NGC_DSP
|
codec = NGC_DSP
|
||||||
channels = 2
|
channels = 2
|
||||||
@ -929,3 +933,11 @@ coef_endianness = BE
|
|||||||
*snd/stream/st_s01_02c.ssd: 7*0x04
|
*snd/stream/st_s01_02c.ssd: 7*0x04
|
||||||
# uses wildcards for full paths from plugins
|
# uses wildcards for full paths from plugins
|
||||||
```
|
```
|
||||||
|
|
||||||
|
#### Croc (SAT) .asf.txth
|
||||||
|
```
|
||||||
|
codec = ASF
|
||||||
|
sample_rate = 22050
|
||||||
|
channels = 2
|
||||||
|
num_samples = data_size
|
||||||
|
```
|
||||||
|
@ -54,3 +54,8 @@ void decode_asf(VGMSTREAMCHANNEL *stream, sample_t *outbuf, int channelspacing,
|
|||||||
stream->adpcm_history1_32 = hist1;
|
stream->adpcm_history1_32 = hist1;
|
||||||
stream->adpcm_history2_32 = hist2;
|
stream->adpcm_history2_32 = hist2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t asf_bytes_to_samples(size_t bytes, int channels) {
|
||||||
|
if (channels <= 0) return 0;
|
||||||
|
return bytes / channels / 0x11 * 32;
|
||||||
|
}
|
||||||
|
@ -36,7 +36,8 @@ typedef enum {
|
|||||||
PCM4_U = 26, /* 4-bit unsigned PCM (3rd and 4th gen games) */
|
PCM4_U = 26, /* 4-bit unsigned PCM (3rd and 4th gen games) */
|
||||||
OKI16 = 27, /* OKI ADPCM with 16-bit output (unlike OKI/VOX/Dialogic ADPCM's 12-bit) */
|
OKI16 = 27, /* OKI ADPCM with 16-bit output (unlike OKI/VOX/Dialogic ADPCM's 12-bit) */
|
||||||
AAC = 28, /* Advanced Audio Coding (raw without .mp4) */
|
AAC = 28, /* Advanced Audio Coding (raw without .mp4) */
|
||||||
TGC = 29 /* Tiger Game.com 4-bit ADPCM */
|
TGC = 29, /* Tiger Game.com 4-bit ADPCM */
|
||||||
|
ASF = 30, /* Argonaut ASF 4-bit ADPCM */
|
||||||
} txth_type;
|
} txth_type;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -223,6 +224,7 @@ VGMSTREAM * init_vgmstream_txth(STREAMFILE *streamFile) {
|
|||||||
case PCM4_U: coding = coding_PCM4_U; break;
|
case PCM4_U: coding = coding_PCM4_U; break;
|
||||||
case OKI16: coding = coding_OKI16; break;
|
case OKI16: coding = coding_OKI16; break;
|
||||||
case TGC: coding = coding_TGC; break;
|
case TGC: coding = coding_TGC; break;
|
||||||
|
case ASF: coding = coding_ASF; break;
|
||||||
default:
|
default:
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
@ -334,6 +336,11 @@ VGMSTREAM * init_vgmstream_txth(STREAMFILE *streamFile) {
|
|||||||
vgmstream->layout_type = layout_none;
|
vgmstream->layout_type = layout_none;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case coding_ASF:
|
||||||
|
vgmstream->layout_type = layout_interleave;
|
||||||
|
vgmstream->interleave_block_size = 0x11;
|
||||||
|
break;
|
||||||
|
|
||||||
case coding_MS_IMA:
|
case coding_MS_IMA:
|
||||||
if (!txth.interleave) goto fail; /* creates garbage */
|
if (!txth.interleave) goto fail; /* creates garbage */
|
||||||
|
|
||||||
@ -450,7 +457,7 @@ VGMSTREAM * init_vgmstream_txth(STREAMFILE *streamFile) {
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* fake header FFmpeg */
|
/* fake header FFmpeg */
|
||||||
uint8_t buf[200];
|
uint8_t buf[0x100];
|
||||||
int32_t bytes;
|
int32_t bytes;
|
||||||
|
|
||||||
if (txth.codec == ATRAC3) {
|
if (txth.codec == ATRAC3) {
|
||||||
@ -465,14 +472,14 @@ VGMSTREAM * init_vgmstream_txth(STREAMFILE *streamFile) {
|
|||||||
else if (txth.codec == ATRAC3PLUS) {
|
else if (txth.codec == ATRAC3PLUS) {
|
||||||
int block_size = txth.interleave;
|
int block_size = txth.interleave;
|
||||||
|
|
||||||
bytes = ffmpeg_make_riff_atrac3plus(buf, 200, vgmstream->num_samples, txth.data_size, vgmstream->channels, vgmstream->sample_rate, block_size, txth.skip_samples);
|
bytes = ffmpeg_make_riff_atrac3plus(buf, sizeof(buf), vgmstream->num_samples, txth.data_size, vgmstream->channels, vgmstream->sample_rate, block_size, txth.skip_samples);
|
||||||
ffmpeg_data = init_ffmpeg_header_offset(txth.streamBody, buf,bytes, txth.start_offset,txth.data_size);
|
ffmpeg_data = init_ffmpeg_header_offset(txth.streamBody, buf,bytes, txth.start_offset,txth.data_size);
|
||||||
if ( !ffmpeg_data ) goto fail;
|
if ( !ffmpeg_data ) goto fail;
|
||||||
}
|
}
|
||||||
else if (txth.codec == XMA1) {
|
else if (txth.codec == XMA1) {
|
||||||
int xma_stream_mode = txth.codec_mode == 1 ? 1 : 0;
|
int xma_stream_mode = txth.codec_mode == 1 ? 1 : 0;
|
||||||
|
|
||||||
bytes = ffmpeg_make_riff_xma1(buf, 100, vgmstream->num_samples, txth.data_size, vgmstream->channels, vgmstream->sample_rate, xma_stream_mode);
|
bytes = ffmpeg_make_riff_xma1(buf, sizeof(buf), vgmstream->num_samples, txth.data_size, vgmstream->channels, vgmstream->sample_rate, xma_stream_mode);
|
||||||
ffmpeg_data = init_ffmpeg_header_offset(txth.streamBody, buf,bytes, txth.start_offset,txth.data_size);
|
ffmpeg_data = init_ffmpeg_header_offset(txth.streamBody, buf,bytes, txth.start_offset,txth.data_size);
|
||||||
if ( !ffmpeg_data ) goto fail;
|
if ( !ffmpeg_data ) goto fail;
|
||||||
}
|
}
|
||||||
@ -482,7 +489,7 @@ VGMSTREAM * init_vgmstream_txth(STREAMFILE *streamFile) {
|
|||||||
block_size = txth.interleave ? txth.interleave : 2048;
|
block_size = txth.interleave ? txth.interleave : 2048;
|
||||||
block_count = txth.data_size / block_size;
|
block_count = txth.data_size / block_size;
|
||||||
|
|
||||||
bytes = ffmpeg_make_riff_xma2(buf, 200, vgmstream->num_samples, txth.data_size, vgmstream->channels, vgmstream->sample_rate, block_count, block_size);
|
bytes = ffmpeg_make_riff_xma2(buf, sizeof(buf), vgmstream->num_samples, txth.data_size, vgmstream->channels, vgmstream->sample_rate, block_count, block_size);
|
||||||
ffmpeg_data = init_ffmpeg_header_offset(txth.streamBody, buf,bytes, txth.start_offset,txth.data_size);
|
ffmpeg_data = init_ffmpeg_header_offset(txth.streamBody, buf,bytes, txth.start_offset,txth.data_size);
|
||||||
if ( !ffmpeg_data ) goto fail;
|
if ( !ffmpeg_data ) goto fail;
|
||||||
}
|
}
|
||||||
@ -848,6 +855,7 @@ static int parse_keyval(STREAMFILE * streamFile_, txth_header * txth, const char
|
|||||||
else if (is_string(val,"AAC")) txth->codec = AAC;
|
else if (is_string(val,"AAC")) txth->codec = AAC;
|
||||||
else if (is_string(val,"TGC")) txth->codec = TGC;
|
else if (is_string(val,"TGC")) txth->codec = TGC;
|
||||||
else if (is_string(val,"GCOM_ADPCM")) txth->codec = TGC;
|
else if (is_string(val,"GCOM_ADPCM")) txth->codec = TGC;
|
||||||
|
else if (is_string(val,"ASF")) txth->codec = ASF;
|
||||||
else goto fail;
|
else goto fail;
|
||||||
|
|
||||||
/* set common interleaves to simplify usage
|
/* set common interleaves to simplify usage
|
||||||
@ -1730,6 +1738,8 @@ static int get_bytes_to_samples(txth_header * txth, uint32_t bytes) {
|
|||||||
#endif
|
#endif
|
||||||
case AC3:
|
case AC3:
|
||||||
return ac3_bytes_to_samples(bytes, txth->interleave, txth->channels);
|
return ac3_bytes_to_samples(bytes, txth->interleave, txth->channels);
|
||||||
|
case ASF:
|
||||||
|
return asf_bytes_to_samples(bytes, txth->channels);
|
||||||
|
|
||||||
/* XMA bytes-to-samples is done at the end as the value meanings are a bit different */
|
/* XMA bytes-to-samples is done at the end as the value meanings are a bit different */
|
||||||
case XMA1:
|
case XMA1:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user