vgmstream/src/meta/bw_mp3_riff.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;
}