cog/Frameworks/vgmstream/vgmstream/src/meta/sscf_encrypted.c

50 lines
1.2 KiB
C

#include "meta.h"
#include "sscf_encrypted.h"
/* SSCF - Square-Enix games, older version of .scd with encrypted data [Final Fantasy XI (360), PlayOnline Viewer (X360)] */
VGMSTREAM* init_vgmstream_sscf_encrypted(STREAMFILE* sf) {
VGMSTREAM* vgmstream = NULL;
STREAMFILE* temp_sf = NULL;
uint32_t xorkey;
/* checks */
if (!is_id32be(0x00,sf, "SSCF"))
goto fail;
if (!check_extensions(sf, "scd"))
goto fail;
/* LE header even though X360 */
/* 0x04: version? (0x0003xxxx)*/
/* 0x08: file size, except for a few files that with a weird value */
/* 0x0c: null */
/* 0x10: file id */
xorkey = read_u32le(0x14,sf);
/* 0x18: null */
/* 0x1c: always 1 */
/* 0x20~0x40: null */
/* 0x40: num samples? */
/* 0x48: loop start? */
/* 0x50: channels */
/* 0x54: sample rate */
/* rest: null */
/* 0x80: encrypted RIFF data */
temp_sf = setup_sscf_streamfile(sf, xorkey);
if (!temp_sf) goto fail;
vgmstream = init_vgmstream_xma(temp_sf);
if (!vgmstream) goto fail;
close_streamfile(temp_sf);
return vgmstream;
fail:
close_streamfile(temp_sf);
close_vgmstream(vgmstream);
return NULL;
}