Fix some .atsl/ktsl2asbin [Nioh (PS4)]

This commit is contained in:
bnnm 2022-05-13 16:39:50 +02:00
parent e3e6522af5
commit a16e8e95c7
2 changed files with 59 additions and 25 deletions

View File

@ -7,7 +7,7 @@ VGMSTREAM* init_vgmstream_atsl(STREAMFILE* sf) {
VGMSTREAM* vgmstream = NULL;
STREAMFILE* temp_sf = NULL;
int total_subsongs, target_subsong = sf->stream_index;
int type, big_endian = 0, entries;
int type, version, big_endian = 0, entries;
uint32_t subfile_offset = 0, subfile_size = 0, header_size, entry_size;
init_vgmstream_t init_vgmstream = NULL;
@ -42,12 +42,14 @@ VGMSTREAM* init_vgmstream_atsl(STREAMFILE* sf) {
* - 01000000 01010501 .atsl from Nioh (PC)[KOVS] 2017-11
* - 01000000 00010501 .atsl from Nioh (PC)[KOVS] 2017-11
* - 000B0301 00080601 .atsl in G1l from Sengoku Musou Sanada Maru (Switch)[KTSS] 2017-09
* - 03070301 01060301 .atsl from Nioh (PS4)[ATRAC9]
* - 00090301 01060501 .atsl from Nioh (PS4)[ATRAC9]-bigger header
* - 010C0301 01060601 .atsl from Dynasty Warriors 9 (PS4)[KTAC]
* - 010D0301 01010601 .atsl from Dynasty Warriors 9 DLC (PC)[KOVS]
*/
type = read_u16le(0x0c, sf);
//version = read_u16le(0x0e, sf);
version = read_u16le(0x0e, sf);
switch(type) {
case 0x0100: /* KOVS */
init_vgmstream = init_vgmstream_ogg_vorbis;
@ -71,10 +73,17 @@ VGMSTREAM* init_vgmstream_atsl(STREAMFILE* sf) {
fake_ext = "at9";
entry_size = 0x28;
break;
case 0x0601: /* KTAC */
init_vgmstream = init_vgmstream_ktac;
fake_ext = "ktac";
entry_size = 0x3c;
case 0x0601: /* KTAC / ATRAC9 */
if (version == 0x0103 || version == 0x0105) {
init_vgmstream = init_vgmstream_riff;
fake_ext = "at9";
entry_size = 0x3c;
}
else {
init_vgmstream = init_vgmstream_ktac;
fake_ext = "ktac";
entry_size = 0x3c;
}
break;
case 0x0800: /* KTSS */
init_vgmstream = init_vgmstream_ktss;

View File

@ -2,7 +2,7 @@
#include "../coding/coding.h"
#include "../layout/layout.h"
typedef enum { NONE, MSADPCM, DSP, GCADPCM, ATRAC9, KVS, /*KNS*/ } ktsr_codec;
typedef enum { NONE, MSADPCM, DSP, GCADPCM, ATRAC9, RIFF_ATRAC9, KOVS, /*KNS*/ } ktsr_codec;
#define MAX_CHANNELS 8
@ -126,8 +126,28 @@ VGMSTREAM* init_vgmstream_ktsr(STREAMFILE* sf) {
}
#endif
case RIFF_ATRAC9: {
VGMSTREAM* riff_vgmstream = NULL; //TODO: meh
STREAMFILE* temp_sf = setup_subfile_streamfile(sf_b, ktsr.stream_offsets[0], ktsr.stream_sizes[0], "at9");
if (!temp_sf) goto fail;
riff_vgmstream = init_vgmstream_riff(temp_sf);
close_streamfile(temp_sf);
if (!riff_vgmstream) goto fail;
riff_vgmstream->stream_size = vgmstream->stream_size;
riff_vgmstream->num_streams = vgmstream->num_streams;
riff_vgmstream->channel_layout = vgmstream->channel_layout;
strcpy(riff_vgmstream->stream_name, vgmstream->stream_name);
close_vgmstream(vgmstream);
if (sf_b != sf) close_streamfile(sf_b);
return riff_vgmstream;
}
#ifdef VGM_USE_VORBIS
case KVS: {
case KOVS: {
VGMSTREAM* ogg_vgmstream = NULL; //TODO: meh
STREAMFILE* temp_sf = setup_subfile_streamfile(sf_b, ktsr.stream_offsets[0], ktsr.stream_sizes[0], "kvs");
if (!temp_sf) goto fail;
@ -234,18 +254,28 @@ static int parse_codec(ktsr_header* ktsr) {
/* platform + format to codec, simplified until more codec combos are found */
switch(ktsr->platform) {
case 0x01: /* PC */
if (ktsr->is_external)
ktsr->codec = KVS;
else if (ktsr->format == 0x00)
if (ktsr->is_external) {
if (ktsr->format == 0x0005)
ktsr->codec = KOVS;
else
goto fail;
}
else if (ktsr->format == 0x0000) {
ktsr->codec = MSADPCM;
else
}
else {
goto fail;
}
break;
case 0x03: /* VITA */
if (ktsr->is_external)
goto fail;
else if (ktsr->format == 0x01)
case 0x03: /* PS4/VITA */
if (ktsr->is_external) {
if (ktsr->format == 0x1001)
ktsr->codec = RIFF_ATRAC9;
else
goto fail;
}
else if (ktsr->format == 0x0001)
ktsr->codec = ATRAC9;
else
goto fail;
@ -254,7 +284,7 @@ static int parse_codec(ktsr_header* ktsr) {
case 0x04: /* Switch */
if (ktsr->is_external)
goto fail; /* KTSS? */
else if (ktsr->format == 0x00)
else if (ktsr->format == 0x0000)
ktsr->codec = DSP;
else
goto fail;
@ -281,14 +311,14 @@ static int parse_ktsr_subfile(ktsr_header* ktsr, STREAMFILE* sf, uint32_t offset
/* probably could check the flag in sound header, but the format is kinda messy */
switch(type) {
case 0x38D0437D: /* external [Nioh (PC), Atelier Ryza (PC)] */
case 0x3DEA478D: /* external [Nioh (PC)] */
case 0x38D0437D: /* external [Nioh (PC/PS4), Atelier Ryza (PC)] */
case 0x3DEA478D: /* external [Nioh (PC)] (smaller) */
case 0xDF92529F: /* external [Atelier Ryza (PC)] */
case 0x6422007C: /* external [Atelier Ryza (PC)] */
/* 08 subtype? (ex. 0x522B86B9)
* 0c channels
* 10 ? (always 0x002706B8)
* 14 codec? (05=KVS)
* 14 external codec
* 18 sample rate
* 1c num samples
* 20 null?
@ -317,11 +347,6 @@ static int parse_ktsr_subfile(ktsr_header* ktsr, STREAMFILE* sf, uint32_t offset
}
ktsr->is_external = 1;
if (ktsr->format != 0x05) {
VGM_LOG("ktsr: unknown subcodec at %x\n", offset);
goto fail;
}
break;
case 0x41FDBD4E: /* internal [Attack on Titan: Wings of Freedom (Vita)] */