mirror of
https://github.com/vgmstream/vgmstream.git
synced 2025-01-31 12:23:44 +01:00
Add PS3 .gtd [Knight's Contract (PS3)]
This commit is contained in:
parent
de3bd9fb31
commit
4aae3fb78d
@ -1248,7 +1248,7 @@ static const meta_info meta_info_list[] = {
|
|||||||
{meta_SXD, "Sony SXD header"},
|
{meta_SXD, "Sony SXD header"},
|
||||||
{meta_OGL, "Shin'en OGL header"},
|
{meta_OGL, "Shin'en OGL header"},
|
||||||
{meta_MC3, "Paradigm MC3 header"},
|
{meta_MC3, "Paradigm MC3 header"},
|
||||||
{meta_GTD, "Hexadrive GHS/S_P_STH header"},
|
{meta_GHS, "Hexadrive GHS/S_P_STH header"},
|
||||||
{meta_AAC_TRIACE, "tri-Ace AAC header"},
|
{meta_AAC_TRIACE, "tri-Ace AAC header"},
|
||||||
{meta_MTA2, "Konami MTA2 header"},
|
{meta_MTA2, "Konami MTA2 header"},
|
||||||
{meta_NGC_ULW, "Criterion ULW raw header"},
|
{meta_NGC_ULW, "Criterion ULW raw header"},
|
||||||
|
@ -2,9 +2,9 @@
|
|||||||
#include "../coding/coding.h"
|
#include "../coding/coding.h"
|
||||||
|
|
||||||
typedef enum { XMA2, ATRAC9 } gtd_codec;
|
typedef enum { XMA2, ATRAC9 } gtd_codec;
|
||||||
|
//TODO rename gtd to ghs
|
||||||
/* GTD - from Hexadrive's HexaEngine [Knights Contract (X360/PS3), Valhalla Knights 3 (Vita)] */
|
/* GHS - Hexadrive's HexaEngine games [Knights Contract (X360), Valhalla Knights 3 (Vita)] */
|
||||||
VGMSTREAM* init_vgmstream_gtd(STREAMFILE* sf) {
|
VGMSTREAM* init_vgmstream_ghs(STREAMFILE* sf) {
|
||||||
VGMSTREAM* vgmstream = NULL;
|
VGMSTREAM* vgmstream = NULL;
|
||||||
off_t start_offset, chunk_offset, stpr_offset, name_offset = 0, loop_start_offset, loop_end_offset;
|
off_t start_offset, chunk_offset, stpr_offset, name_offset = 0, loop_start_offset, loop_end_offset;
|
||||||
size_t data_size, chunk_size;
|
size_t data_size, chunk_size;
|
||||||
@ -36,7 +36,8 @@ VGMSTREAM* init_vgmstream_gtd(STREAMFILE* sf) {
|
|||||||
/* 0x34(18): null, 0x54(4): seek table offset, 0x58(4): seek table size, 0x5c(8): null, 0x64: seek table */
|
/* 0x34(18): null, 0x54(4): seek table offset, 0x58(4): seek table size, 0x5c(8): null, 0x64: seek table */
|
||||||
|
|
||||||
stpr_offset = read_32bitBE(chunk_offset+0x54,sf) + read_32bitBE(chunk_offset+0x58,sf);
|
stpr_offset = read_32bitBE(chunk_offset+0x54,sf) + read_32bitBE(chunk_offset+0x58,sf);
|
||||||
if (read_32bitBE(stpr_offset,sf) == 0x53545052) { /* "STPR" */
|
if (is_id32be(stpr_offset,sf, "STPR")) {
|
||||||
|
/* SRPR encases the original "S_P_STH" header (no data) */
|
||||||
name_offset = stpr_offset + 0xB8; /* there are offsets fields but seems to work */
|
name_offset = stpr_offset + 0xB8; /* there are offsets fields but seems to work */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,14 +56,14 @@ VGMSTREAM* init_vgmstream_gtd(STREAMFILE* sf) {
|
|||||||
/* 0x18-0x28: fixed/unknown values */
|
/* 0x18-0x28: fixed/unknown values */
|
||||||
|
|
||||||
stpr_offset = 0x2c;
|
stpr_offset = 0x2c;
|
||||||
if (read_32bitBE(stpr_offset,sf) == 0x53545052) { /* "STPR" */
|
if (is_id32be(stpr_offset,sf, "STPR")) {
|
||||||
|
/* STPR encases the original "S_P_STH" header (no data) */
|
||||||
name_offset = stpr_offset + 0xE8; /* there are offsets fields but seems to work */
|
name_offset = stpr_offset + 0xE8; /* there are offsets fields but seems to work */
|
||||||
}
|
}
|
||||||
|
|
||||||
codec = ATRAC9;
|
codec = ATRAC9;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* there is a PS3 variation with MSF inside */
|
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -75,7 +76,7 @@ VGMSTREAM* init_vgmstream_gtd(STREAMFILE* sf) {
|
|||||||
vgmstream->sample_rate = sample_rate;
|
vgmstream->sample_rate = sample_rate;
|
||||||
vgmstream->loop_start_sample = loop_start_sample;
|
vgmstream->loop_start_sample = loop_start_sample;
|
||||||
vgmstream->loop_end_sample = loop_end_sample;
|
vgmstream->loop_end_sample = loop_end_sample;
|
||||||
vgmstream->meta_type = meta_GTD;
|
vgmstream->meta_type = meta_GHS;
|
||||||
if (name_offset) //encoding is Shift-Jis in some PSV files
|
if (name_offset) //encoding is Shift-Jis in some PSV files
|
||||||
read_string(vgmstream->stream_name,STREAM_NAME_SIZE, name_offset,sf);
|
read_string(vgmstream->stream_name,STREAM_NAME_SIZE, name_offset,sf);
|
||||||
|
|
||||||
@ -125,3 +126,38 @@ fail:
|
|||||||
close_vgmstream(vgmstream);
|
close_vgmstream(vgmstream);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* S_P_STH - Hexadrive's HexaEngine games [Knights Contract (PS3)] */
|
||||||
|
VGMSTREAM* init_vgmstream_s_p_sth(STREAMFILE* sf) {
|
||||||
|
VGMSTREAM* vgmstream = NULL;
|
||||||
|
STREAMFILE* temp_sf = NULL;
|
||||||
|
uint32_t subfile_offset, subfile_size, name_offset;
|
||||||
|
|
||||||
|
|
||||||
|
/* checks */
|
||||||
|
if (!is_id64be(0x00,sf,"S_P_STH\x01"))
|
||||||
|
goto fail;
|
||||||
|
if (!check_extensions(sf,"gtd"))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
subfile_offset = read_u32be(0x08, sf);
|
||||||
|
subfile_size = get_streamfile_size(sf) - subfile_offset;
|
||||||
|
|
||||||
|
temp_sf = setup_subfile_streamfile(sf, subfile_offset, subfile_size, "msf");
|
||||||
|
if (!temp_sf) goto fail;
|
||||||
|
|
||||||
|
vgmstream = init_vgmstream_msf(temp_sf);
|
||||||
|
if (!vgmstream) goto fail;
|
||||||
|
|
||||||
|
vgmstream->meta_type = meta_GHS;
|
||||||
|
name_offset = 0xB0; /* there are offsets fields but seems to work */
|
||||||
|
read_string(vgmstream->stream_name, STREAM_NAME_SIZE, name_offset, sf);
|
||||||
|
|
||||||
|
close_streamfile(temp_sf);
|
||||||
|
return vgmstream;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
close_streamfile(temp_sf);
|
||||||
|
close_vgmstream(vgmstream);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
@ -596,7 +596,8 @@ VGMSTREAM * init_vgmstream_ogl(STREAMFILE *streamFile);
|
|||||||
|
|
||||||
VGMSTREAM * init_vgmstream_mc3(STREAMFILE *streamFile);
|
VGMSTREAM * init_vgmstream_mc3(STREAMFILE *streamFile);
|
||||||
|
|
||||||
VGMSTREAM * init_vgmstream_gtd(STREAMFILE *streamFile);
|
VGMSTREAM* init_vgmstream_ghs(STREAMFILE* sf);
|
||||||
|
VGMSTREAM* init_vgmstream_s_p_sth(STREAMFILE* sf);
|
||||||
|
|
||||||
VGMSTREAM* init_vgmstream_aac_triace(STREAMFILE* sf);
|
VGMSTREAM* init_vgmstream_aac_triace(STREAMFILE* sf);
|
||||||
|
|
||||||
|
@ -294,7 +294,7 @@ VGMSTREAM* (*init_vgmstream_functions[])(STREAMFILE* sf) = {
|
|||||||
init_vgmstream_sxd,
|
init_vgmstream_sxd,
|
||||||
init_vgmstream_ogl,
|
init_vgmstream_ogl,
|
||||||
init_vgmstream_mc3,
|
init_vgmstream_mc3,
|
||||||
init_vgmstream_gtd,
|
init_vgmstream_ghs,
|
||||||
init_vgmstream_aac_triace,
|
init_vgmstream_aac_triace,
|
||||||
init_vgmstream_va3,
|
init_vgmstream_va3,
|
||||||
init_vgmstream_mta2,
|
init_vgmstream_mta2,
|
||||||
@ -524,6 +524,7 @@ VGMSTREAM* (*init_vgmstream_functions[])(STREAMFILE* sf) = {
|
|||||||
init_vgmstream_vab,
|
init_vgmstream_vab,
|
||||||
init_vgmstream_bigrp,
|
init_vgmstream_bigrp,
|
||||||
init_vgmstream_sscf_encrypted,
|
init_vgmstream_sscf_encrypted,
|
||||||
|
init_vgmstream_s_p_sth,
|
||||||
|
|
||||||
/* 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,
|
||||||
|
@ -593,7 +593,7 @@ typedef enum {
|
|||||||
meta_SXD, /* Sony SXD (Gravity Rush, Freedom Wars PSV) */
|
meta_SXD, /* Sony SXD (Gravity Rush, Freedom Wars PSV) */
|
||||||
meta_OGL, /* Shin'en Wii/WiiU (Jett Rocket (Wii), FAST Racing NEO (WiiU)) */
|
meta_OGL, /* Shin'en Wii/WiiU (Jett Rocket (Wii), FAST Racing NEO (WiiU)) */
|
||||||
meta_MC3, /* Paradigm games (T3 PS2, MX Rider PS2, MI: Operation Surma PS2) */
|
meta_MC3, /* Paradigm games (T3 PS2, MX Rider PS2, MI: Operation Surma PS2) */
|
||||||
meta_GTD,
|
meta_GHS,
|
||||||
meta_AAC_TRIACE,
|
meta_AAC_TRIACE,
|
||||||
meta_MTA2,
|
meta_MTA2,
|
||||||
meta_NGC_ULW, /* Burnout 1 (GC only) */
|
meta_NGC_ULW, /* Burnout 1 (GC only) */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user