mirror of
https://github.com/vgmstream/vgmstream.git
synced 2024-12-29 14:53:05 +01:00
50 lines
1.2 KiB
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;
|
||
|
}
|