From 0d754a81b3183eaf7cfd136efc1525ebb5f0c5f4 Mon Sep 17 00:00:00 2001 From: bnnm Date: Sun, 12 Mar 2023 14:53:29 +0100 Subject: [PATCH] Add .csb with AHX [Yakuza: Dead Souls (PS3)] --- src/meta/csb.c | 71 ++++++++++++++++++++++++++++++++++++++++++++----- src/meta/meta.h | 1 + src/vgmstream.c | 1 + 3 files changed, 66 insertions(+), 7 deletions(-) diff --git a/src/meta/csb.c b/src/meta/csb.c index 83211750..f9e40e84 100644 --- a/src/meta/csb.c +++ b/src/meta/csb.c @@ -7,8 +7,7 @@ VGMSTREAM* init_vgmstream_csb(STREAMFILE* sf) { VGMSTREAM* vgmstream = NULL; STREAMFILE* temp_sf = NULL; - off_t subfile_offset; - size_t subfile_size; + uint32_t subfile_offset, subfile_size; utf_context* utf = NULL; utf_context* utf_sdl = NULL; int total_subsongs, target_subsong = sf->stream_index; @@ -17,10 +16,10 @@ VGMSTREAM* init_vgmstream_csb(STREAMFILE* sf) { /* checks */ - if (!check_extensions(sf, "csb")) - goto fail; if (!is_id32be(0x00,sf, "@UTF")) goto fail; + if (!check_extensions(sf, "csb")) + goto fail; /* .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. */ @@ -115,9 +114,7 @@ VGMSTREAM* init_vgmstream_csb(STREAMFILE* sf) { 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"); if (!temp_sf) goto fail; @@ -128,6 +125,11 @@ VGMSTREAM* init_vgmstream_csb(STREAMFILE* sf) { if (!vgmstream) goto fail; break; + case 2: /* AHX */ + vgmstream = init_vgmstream_utf_ahx(temp_sf); + if (!vgmstream) goto fail; + break; + case 4: /* ADPCM_WII */ vgmstream = init_vgmstream_utf_dsp(temp_sf); if (!vgmstream) goto fail; @@ -153,3 +155,58 @@ fail: close_vgmstream(vgmstream); 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; +} diff --git a/src/meta/meta.h b/src/meta/meta.h index fe608631..ca97f485 100644 --- a/src/meta/meta.h +++ b/src/meta/meta.h @@ -881,6 +881,7 @@ VGMSTREAM* init_vgmstream_xssb(STREAMFILE *sf); VGMSTREAM* init_vgmstream_xma_ue3(STREAMFILE *sf); VGMSTREAM* init_vgmstream_csb(STREAMFILE *sf); +VGMSTREAM* init_vgmstream_utf_ahx(STREAMFILE *sf); VGMSTREAM *init_vgmstream_fwse(STREAMFILE *streamFile); diff --git a/src/vgmstream.c b/src/vgmstream.c index c4478df0..c284b4b4 100644 --- a/src/vgmstream.c +++ b/src/vgmstream.c @@ -525,6 +525,7 @@ VGMSTREAM* (*init_vgmstream_functions[])(STREAMFILE* sf) = { init_vgmstream_bigrp, init_vgmstream_sscf_encrypted, 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) */ init_vgmstream_scd_pcm,