mirror of
https://github.com/vgmstream/vgmstream.git
synced 2025-02-01 04:25:48 +01:00
Fix some .atsl/ktsl2asbin [Nioh (PS4)]
This commit is contained in:
parent
e3e6522af5
commit
a16e8e95c7
@ -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;
|
||||
|
@ -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)] */
|
||||
|
Loading…
x
Reference in New Issue
Block a user