mirror of
https://github.com/vgmstream/vgmstream.git
synced 2025-01-31 04:13:47 +01:00
Add .csb with AHX [Yakuza: Dead Souls (PS3)]
This commit is contained in:
parent
2dd320a500
commit
0d754a81b3
@ -7,8 +7,7 @@
|
|||||||
VGMSTREAM* init_vgmstream_csb(STREAMFILE* sf) {
|
VGMSTREAM* init_vgmstream_csb(STREAMFILE* sf) {
|
||||||
VGMSTREAM* vgmstream = NULL;
|
VGMSTREAM* vgmstream = NULL;
|
||||||
STREAMFILE* temp_sf = NULL;
|
STREAMFILE* temp_sf = NULL;
|
||||||
off_t subfile_offset;
|
uint32_t subfile_offset, subfile_size;
|
||||||
size_t subfile_size;
|
|
||||||
utf_context* utf = NULL;
|
utf_context* utf = NULL;
|
||||||
utf_context* utf_sdl = NULL;
|
utf_context* utf_sdl = NULL;
|
||||||
int total_subsongs, target_subsong = sf->stream_index;
|
int total_subsongs, target_subsong = sf->stream_index;
|
||||||
@ -17,10 +16,10 @@ VGMSTREAM* init_vgmstream_csb(STREAMFILE* sf) {
|
|||||||
|
|
||||||
|
|
||||||
/* checks */
|
/* checks */
|
||||||
if (!check_extensions(sf, "csb"))
|
|
||||||
goto fail;
|
|
||||||
if (!is_id32be(0x00,sf, "@UTF"))
|
if (!is_id32be(0x00,sf, "@UTF"))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
if (!check_extensions(sf, "csb"))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
/* .csb is an early, simpler version of .acb+awk (see acb.c) used until ~2013?
|
/* .csb is an early, simpler version of .acb+awk (see acb.c) used until ~2013?
|
||||||
* Can stream from .cpk but this only loads memory data. */
|
* Can stream from .cpk but this only loads memory data. */
|
||||||
@ -115,9 +114,7 @@ VGMSTREAM* init_vgmstream_csb(STREAMFILE* sf) {
|
|||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
//;VGM_LOG("CSB: subfile offset=%lx + %x\n", subfile_offset, subfile_size);
|
//;VGM_LOG("CSB: subfile offset=%x + %x\n", subfile_offset, subfile_size);
|
||||||
|
|
||||||
|
|
||||||
temp_sf = setup_subfile_streamfile(sf, subfile_offset, subfile_size, "aax");
|
temp_sf = setup_subfile_streamfile(sf, subfile_offset, subfile_size, "aax");
|
||||||
if (!temp_sf) goto fail;
|
if (!temp_sf) goto fail;
|
||||||
|
|
||||||
@ -128,6 +125,11 @@ VGMSTREAM* init_vgmstream_csb(STREAMFILE* sf) {
|
|||||||
if (!vgmstream) goto fail;
|
if (!vgmstream) goto fail;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 2: /* AHX */
|
||||||
|
vgmstream = init_vgmstream_utf_ahx(temp_sf);
|
||||||
|
if (!vgmstream) goto fail;
|
||||||
|
break;
|
||||||
|
|
||||||
case 4: /* ADPCM_WII */
|
case 4: /* ADPCM_WII */
|
||||||
vgmstream = init_vgmstream_utf_dsp(temp_sf);
|
vgmstream = init_vgmstream_utf_dsp(temp_sf);
|
||||||
if (!vgmstream) goto fail;
|
if (!vgmstream) goto fail;
|
||||||
@ -153,3 +155,58 @@ fail:
|
|||||||
close_vgmstream(vgmstream);
|
close_vgmstream(vgmstream);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* CRI's UTF wrapper around AHX [Yakuza: Dead Souls (PS3)-voices] */
|
||||||
|
VGMSTREAM* init_vgmstream_utf_ahx(STREAMFILE* sf) {
|
||||||
|
VGMSTREAM* vgmstream = NULL;
|
||||||
|
STREAMFILE* temp_sf = NULL;
|
||||||
|
uint32_t subfile_offset, subfile_size;
|
||||||
|
utf_context* utf = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
/* checks */
|
||||||
|
if (!is_id32be(0x00,sf, "@UTF"))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
/* .aax: assumed
|
||||||
|
* (extensionless): extracted names inside csb/cpk often don't have extensions */
|
||||||
|
if (!check_extensions(sf, "aax,"))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
/* contains a simple UTF table with one row and offset+size info */
|
||||||
|
{
|
||||||
|
int rows;
|
||||||
|
const char* name;
|
||||||
|
uint32_t table_offset = 0x00;
|
||||||
|
|
||||||
|
utf = utf_open(sf, table_offset, &rows, &name);
|
||||||
|
if (!utf) goto fail;
|
||||||
|
|
||||||
|
if (strcmp(name, "AHX") != 0)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
if (rows != 1)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
if (!utf_query_data(utf, 0, "data", &subfile_offset, &subfile_size))
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
//;VGM_LOG("UTF_AHX: subfile offset=%x + %x\n", subfile_offset, subfile_size);
|
||||||
|
temp_sf = setup_subfile_streamfile(sf, subfile_offset, subfile_size, "ahx");
|
||||||
|
if (!temp_sf) goto fail;
|
||||||
|
|
||||||
|
vgmstream = init_vgmstream_ahx(temp_sf);
|
||||||
|
if (!vgmstream) goto fail;
|
||||||
|
|
||||||
|
utf_close(utf);
|
||||||
|
close_streamfile(temp_sf);
|
||||||
|
return vgmstream;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
utf_close(utf);
|
||||||
|
close_streamfile(temp_sf);
|
||||||
|
close_vgmstream(vgmstream);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
@ -881,6 +881,7 @@ VGMSTREAM* init_vgmstream_xssb(STREAMFILE *sf);
|
|||||||
VGMSTREAM* init_vgmstream_xma_ue3(STREAMFILE *sf);
|
VGMSTREAM* init_vgmstream_xma_ue3(STREAMFILE *sf);
|
||||||
|
|
||||||
VGMSTREAM* init_vgmstream_csb(STREAMFILE *sf);
|
VGMSTREAM* init_vgmstream_csb(STREAMFILE *sf);
|
||||||
|
VGMSTREAM* init_vgmstream_utf_ahx(STREAMFILE *sf);
|
||||||
|
|
||||||
VGMSTREAM *init_vgmstream_fwse(STREAMFILE *streamFile);
|
VGMSTREAM *init_vgmstream_fwse(STREAMFILE *streamFile);
|
||||||
|
|
||||||
|
@ -525,6 +525,7 @@ VGMSTREAM* (*init_vgmstream_functions[])(STREAMFILE* sf) = {
|
|||||||
init_vgmstream_bigrp,
|
init_vgmstream_bigrp,
|
||||||
init_vgmstream_sscf_encrypted,
|
init_vgmstream_sscf_encrypted,
|
||||||
init_vgmstream_s_p_sth,
|
init_vgmstream_s_p_sth,
|
||||||
|
init_vgmstream_utf_ahx,
|
||||||
|
|
||||||
/* lower priority metas (no clean header identity, somewhat ambiguous, or need extension/companion file to identify) */
|
/* lower priority metas (no clean header identity, somewhat ambiguous, or need extension/companion file to identify) */
|
||||||
init_vgmstream_scd_pcm,
|
init_vgmstream_scd_pcm,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user