mirror of
https://github.com/vgmstream/vgmstream.git
synced 2024-12-24 04:14:50 +01:00
76 lines
2.1 KiB
C
76 lines
2.1 KiB
C
#include "meta.h"
|
|
#include "../coding/coding.h"
|
|
|
|
|
|
/* Bioware pseudo-format (for sfx) [Star Wars: Knights of the Old Republic 1/2 (PC/Switch/iOS)] */
|
|
VGMSTREAM* init_vgmstream_bw_mp3_riff(STREAMFILE* sf) {
|
|
VGMSTREAM* vgmstream = NULL;
|
|
STREAMFILE* temp_sf = NULL;
|
|
uint32_t subfile_offset = 0, subfile_size = 0;
|
|
|
|
|
|
/* checks */
|
|
if (read_u32be(0x00, sf) != 0xFFF360C4)
|
|
goto fail;
|
|
//if ((read_u32be(0x00, sf) & 0xFFF00000) != 0xFFF00000) /* no point to check other mp3s */
|
|
// goto fail;
|
|
if (!is_id32be(0x0d, sf, "LAME") && !is_id32be(0x1d6, sf, "RIFF"))
|
|
goto fail;
|
|
|
|
/* strange mix of micro empty MP3 (LAME3.93, common header) + standard RIFF */
|
|
|
|
subfile_offset = 0x1d6;
|
|
subfile_size = read_u32le(subfile_offset + 0x04, sf) + 0x08;
|
|
|
|
temp_sf = setup_subfile_streamfile(sf, subfile_offset, subfile_size, "wav");
|
|
if (!temp_sf) goto fail;
|
|
|
|
/* init the VGMSTREAM */
|
|
vgmstream = init_vgmstream_riff(temp_sf);
|
|
if (!vgmstream) goto fail;
|
|
|
|
close_streamfile(temp_sf);
|
|
return vgmstream;
|
|
|
|
fail:
|
|
close_streamfile(temp_sf);
|
|
close_vgmstream(vgmstream);
|
|
return NULL;
|
|
}
|
|
|
|
/* Bioware pseudo-format (for music) [Star Wars: Knights of the Old Republic 1/2 (PC/Switch/iOS)] */
|
|
VGMSTREAM* init_vgmstream_bw_riff_mp3(STREAMFILE* sf) {
|
|
VGMSTREAM* vgmstream = NULL;
|
|
STREAMFILE* temp_sf = NULL;
|
|
uint32_t subfile_offset = 0, subfile_size = 0;
|
|
|
|
|
|
/* checks */
|
|
if (!is_id32be(0x00, sf, "RIFF"))
|
|
goto fail;
|
|
if (read_u32le(0x04, sf) != 0x32)
|
|
goto fail;
|
|
if (get_streamfile_size(sf) <= 0x32 + 0x08) /* ? */
|
|
goto fail;
|
|
|
|
/* strange mix of micro RIFF (with codec 0x01, "fact" and "data" size 0)) + standard MP3 (sometimes with ID3) */
|
|
|
|
subfile_offset = 0x3A;
|
|
subfile_size = get_streamfile_size(sf) - subfile_offset;
|
|
|
|
temp_sf = setup_subfile_streamfile(sf, subfile_offset, subfile_size, "mp3");
|
|
if (!temp_sf) goto fail;
|
|
|
|
/* init the VGMSTREAM */
|
|
vgmstream = init_vgmstream_mpeg(temp_sf);
|
|
if (!vgmstream) goto fail;
|
|
|
|
close_streamfile(temp_sf);
|
|
return vgmstream;
|
|
|
|
fail:
|
|
close_streamfile(temp_sf);
|
|
close_vgmstream(vgmstream);
|
|
return NULL;
|
|
}
|