Fix EA EAAC looping for RAM assets

This commit is contained in:
bnnm 2018-08-15 17:37:06 +02:00
parent f4189f2482
commit 1f6c384a48

View File

@ -330,6 +330,7 @@ static VGMSTREAM * parse_s10a_header(STREAMFILE *streamFile, off_t offset, uint1
if (ast_offset == 0xFFFFFFFF) { if (ast_offset == 0xFFFFFFFF) {
/* RAM asset */ /* RAM asset */
sns_offset = snr_offset + get_snr_size(streamFile, snr_offset); sns_offset = snr_offset + get_snr_size(streamFile, snr_offset);
;VGM_LOG("EA S10A: RAM at sns=%lx, sns=%lx\n", snr_offset, sns_offset);
vgmstream = init_vgmstream_eaaudiocore_header(streamFile, streamFile, snr_offset, sns_offset, meta_EA_SNR_SNS); vgmstream = init_vgmstream_eaaudiocore_header(streamFile, streamFile, snr_offset, sns_offset, meta_EA_SNR_SNS);
if (!vgmstream) if (!vgmstream)
goto fail; goto fail;
@ -344,6 +345,7 @@ static VGMSTREAM * parse_s10a_header(STREAMFILE *streamFile, off_t offset, uint1
goto fail; goto fail;
sns_offset = ast_offset; sns_offset = ast_offset;
;VGM_LOG("EA S10A: stream at sns=%lx, sns=%lx\n", snr_offset, sns_offset);
vgmstream = init_vgmstream_eaaudiocore_header(streamFile, astFile, snr_offset, sns_offset, meta_EA_SNR_SNS); vgmstream = init_vgmstream_eaaudiocore_header(streamFile, astFile, snr_offset, sns_offset, meta_EA_SNR_SNS);
if (!vgmstream) if (!vgmstream)
goto fail; goto fail;
@ -519,20 +521,22 @@ static VGMSTREAM * init_vgmstream_eaaudiocore_header(STREAMFILE * streamHead, ST
goto fail; goto fail;
} }
/* Non-streamed sounds are stored as a single block (may not set block end flags) */
eaac.streamed = (eaac.flags & EAAC_FLAG_STREAMED) != 0;
/* get loops (fairly involved due to the multiple layouts and mutant streamfiles) /* get loops (fairly involved due to the multiple layouts and mutant streamfiles)
* full loops aren't too uncommon [Dead Space (PC) sfx/ambiance], * full loops aren't too uncommon [Dead Space (PC) stream sfx/ambiance, FIFA 98 (PS3) RAM sfx],
* while actual looping is very rare [Need for Speed: World (PC)] */ * while actual looping is very rare [Need for Speed: World (PC)] */
if (eaac.flags & EAAC_FLAG_LOOPED) { if (eaac.flags & EAAC_FLAG_LOOPED) {
eaac.loop_flag = 1; eaac.loop_flag = 1;
eaac.loop_start = read_32bitBE(header_offset+0x08, streamHead); eaac.loop_start = read_32bitBE(header_offset+0x08, streamHead);
eaac.loop_end = eaac.num_samples; eaac.loop_end = eaac.num_samples;
//todo header size always depends on flags or is implicit by loop values? see get_snr_size /* RAM assets only have one block, even if they (rarely) set loop_start > 0 */
if (eaac.loop_start > 0) if (eaac.streamed)
eaac.loop_offset = read_32bitBE(header_offset+0x0c, streamHead); /* normal loop */ eaac.loop_offset = read_32bitBE(header_offset+0x0c, streamHead);
else else
eaac.loop_offset = eaac.stream_offset; /* full loop */ eaac.loop_offset = eaac.stream_offset; /* implicit */
//todo EATrax has extra values in header, which would coexist with loop values //todo EATrax has extra values in header, which would coexist with loop values
if (eaac.codec == EAAC_CODEC_EATRAX) { if (eaac.codec == EAAC_CODEC_EATRAX) {
@ -548,9 +552,6 @@ static VGMSTREAM * init_vgmstream_eaaudiocore_header(STREAMFILE * streamHead, ST
} }
} }
/* Non-streamed sounds are stored as a single block (may not set block end flags) */
eaac.streamed = (eaac.flags & EAAC_FLAG_STREAMED) != 0;
/* accepted channel configs only seem to be mono/stereo/quad/5.1/7.1, from debug strings */ /* accepted channel configs only seem to be mono/stereo/quad/5.1/7.1, from debug strings */
switch(eaac.channel_config) { switch(eaac.channel_config) {
case 0x00: eaac.channels = 1; break; case 0x00: eaac.channels = 1; break;
@ -629,7 +630,7 @@ static VGMSTREAM * init_vgmstream_eaaudiocore_header(STREAMFILE * streamHead, ST
start_offset = 0x00; /* must point to the custom streamfile's beginning */ start_offset = 0x00; /* must point to the custom streamfile's beginning */
if (eaac.loop_start > 0) { /* special (if hacky) loop handling, see comments */ if (eaac.streamed && eaac.loop_start > 0) { /* special (if hacky) loop handling, see comments */
segmented_layout_data *data = build_segmented_eaaudiocore_looping(streamData, &eaac); segmented_layout_data *data = build_segmented_eaaudiocore_looping(streamData, &eaac);
if (!data) goto fail; if (!data) goto fail;
vgmstream->layout_data = data; vgmstream->layout_data = data;