diff --git a/.gitattributes b/.gitattributes index b316a22e..e0d9174e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,6 +6,7 @@ *.cpp text eol=lf *.cc text eol=lf +*.h text eol=lf *.sh text eol=lf *.bat text eol=crlf diff --git a/src/libvgmstream.vcxproj b/src/libvgmstream.vcxproj index bbec0c43..4f39f754 100644 --- a/src/libvgmstream.vcxproj +++ b/src/libvgmstream.vcxproj @@ -90,14 +90,16 @@ + + + - - + @@ -212,6 +214,7 @@ + @@ -221,6 +224,9 @@ + + + diff --git a/src/libvgmstream.vcxproj.filters b/src/libvgmstream.vcxproj.filters index ce506992..4c85b320 100644 --- a/src/libvgmstream.vcxproj.filters +++ b/src/libvgmstream.vcxproj.filters @@ -104,6 +104,9 @@ Header Files + + Header Files + Header Files @@ -113,21 +116,24 @@ base\Header Files + + base\Header Files + + + base\Header Files + base\Header Files - - base\Header Files - - - base\Header Files - base\Header Files base\Header Files + + base\Header Files + coding\Header Files @@ -466,6 +472,9 @@ Source Files + + Source Files + base\Source Files @@ -493,6 +502,15 @@ base\Source Files + + base\Source Files + + + base\Source Files + + + base\Source Files + base\Source Files diff --git a/src/vgmstream.c b/src/vgmstream.c index 307e3114..31cbd938 100644 --- a/src/vgmstream.c +++ b/src/vgmstream.c @@ -15,608 +15,27 @@ #include "base/mixer.h" #include "util/sf_utils.h" -typedef VGMSTREAM* (*init_vgmstream_t)(STREAMFILE*); static void try_dual_file_stereo(VGMSTREAM* opened_vgmstream, STREAMFILE* sf, int format_id); -/* list of metadata parser functions that will recognize files, used on init */ -init_vgmstream_t init_vgmstream_functions[] = { - init_vgmstream_adx, - init_vgmstream_brstm, - init_vgmstream_brwav, - init_vgmstream_bfwav, - init_vgmstream_bcwav, - init_vgmstream_brwar, - init_vgmstream_nds_strm, - init_vgmstream_afc, - init_vgmstream_ast, - init_vgmstream_halpst, - init_vgmstream_rs03, - init_vgmstream_ngc_dsp_std, - init_vgmstream_ngc_dsp_std_le, - init_vgmstream_ngc_mdsp_std, - init_vgmstream_csmp, - init_vgmstream_rfrm, - init_vgmstream_cstr, - init_vgmstream_gcsw, - init_vgmstream_ads, - init_vgmstream_npsf, - init_vgmstream_xa, - init_vgmstream_rxws, - init_vgmstream_ngc_dsp_stm, - init_vgmstream_exst, - init_vgmstream_svag_kcet, - init_vgmstream_ngc_mpdsp, - init_vgmstream_ngc_dsp_std_int, - init_vgmstream_vag, - init_vgmstream_vag_aaap, - init_vgmstream_vag_footer, - init_vgmstream_vag_evolution_games, - init_vgmstream_ild, - init_vgmstream_ngc_str, - init_vgmstream_ea_schl, - init_vgmstream_caf, - init_vgmstream_vpk, - init_vgmstream_genh, - init_vgmstream_ogg_vorbis, - init_vgmstream_sfl_ogg, - init_vgmstream_sadb, - init_vgmstream_ps2_bmdx, - init_vgmstream_wsi, - init_vgmstream_aifc, - init_vgmstream_str_snds, - init_vgmstream_ws_aud, - init_vgmstream_ahx, - init_vgmstream_iivb, - init_vgmstream_svs, - init_vgmstream_riff, - init_vgmstream_rifx, - init_vgmstream_nwa, - init_vgmstream_ea_1snh, - init_vgmstream_ea_eacs, - init_vgmstream_xss, - init_vgmstream_sl3, - init_vgmstream_hgc1, - init_vgmstream_aus, - init_vgmstream_rws, - init_vgmstream_fsb, - init_vgmstream_fsb5, - init_vgmstream_rwax, - init_vgmstream_xwb, - init_vgmstream_ps2_xa30, - init_vgmstream_musc, - init_vgmstream_musx, - init_vgmstream_filp, - init_vgmstream_ikm, - init_vgmstream_ster, - init_vgmstream_bg00, - init_vgmstream_sat_dvi, - init_vgmstream_dc_kcey, - init_vgmstream_rstm_rockstar, - init_vgmstream_acm, - init_vgmstream_mus_acm, - init_vgmstream_vig_kces, - init_vgmstream_hxd, - init_vgmstream_vsv, - init_vgmstream_ps2_pcm, - init_vgmstream_ps2_rkv, - init_vgmstream_lp_ap_lep, - init_vgmstream_sdt, - init_vgmstream_aix, - init_vgmstream_wvs_xbox, - init_vgmstream_wvs_ngc, - init_vgmstream_str_sega, - init_vgmstream_str_sega_custom, - init_vgmstream_dec, - init_vgmstream_vs, - init_vgmstream_xmu, - init_vgmstream_xvas, - init_vgmstream_sat_sap, - init_vgmstream_dc_idvi, - init_vgmstream_ps2_rnd, - init_vgmstream_idsp_tt, - init_vgmstream_kraw, - init_vgmstream_omu, - init_vgmstream_xa2_acclaim, - init_vgmstream_idsp_nl, - init_vgmstream_idsp_ie, - init_vgmstream_ymf, - init_vgmstream_sadl, - init_vgmstream_fag, - init_vgmstream_mic, - init_vgmstream_ngc_pdt_split, - init_vgmstream_ngc_pdt, - init_vgmstream_mus_krome, - init_vgmstream_spsd, - init_vgmstream_rsd, - init_vgmstream_bgw, - init_vgmstream_spw, - init_vgmstream_ps2_ass, - init_vgmstream_ubi_jade, - init_vgmstream_ubi_jade_container, - init_vgmstream_seg, - init_vgmstream_nds_strm_ffta2, - init_vgmstream_knon, - init_vgmstream_gca, - init_vgmstream_spt_spd, - init_vgmstream_ish_isd, - init_vgmstream_gsnd, - init_vgmstream_ydsp, - init_vgmstream_ssm, - init_vgmstream_ps2_joe, - init_vgmstream_vgs, - init_vgmstream_dcs_wav, - init_vgmstream_mul, - init_vgmstream_thp, - init_vgmstream_sts, - init_vgmstream_p2bt_move_visa, - init_vgmstream_gbts, - init_vgmstream_wii_sng, - init_vgmstream_ngc_dsp_iadp, - init_vgmstream_aax, - init_vgmstream_utf_dsp, - init_vgmstream_ngc_ffcc_str, - init_vgmstream_sat_baka, - init_vgmstream_swav, - init_vgmstream_vsf, - init_vgmstream_nds_rrds, - init_vgmstream_ps2_vsf_tta, - init_vgmstream_ads_midway, - init_vgmstream_ps2_mcg, - init_vgmstream_zsd, - init_vgmstream_vgs_ps, - init_vgmstream_redspark, - init_vgmstream_wii_wsd, - init_vgmstream_dsp_ndp, - init_vgmstream_ps2_sps, - init_vgmstream_nds_hwas, - init_vgmstream_ngc_lps, - init_vgmstream_ps2_snd, - init_vgmstream_naomi_adpcm, - init_vgmstream_sd9, - init_vgmstream_2dx9, - init_vgmstream_dsp_ygo, - init_vgmstream_ps2_vgv, - init_vgmstream_gcub, - init_vgmstream_maxis_xa, - init_vgmstream_ngc_sck_dsp, - init_vgmstream_apple_caff, - init_vgmstream_pc_mxst, - init_vgmstream_sab, - init_vgmstream_bns, - init_vgmstream_wii_was, - init_vgmstream_pona_3do, - init_vgmstream_pona_psx, - init_vgmstream_xbox_hlwav, - init_vgmstream_myspd, - init_vgmstream_his, - init_vgmstream_ast_mmv, - init_vgmstream_ast_mv, - init_vgmstream_dmsg, - init_vgmstream_ngc_dsp_aaap, - init_vgmstream_ngc_dsp_konami, - init_vgmstream_wb, - init_vgmstream_bnsf, - init_vgmstream_ps2_gcm, - init_vgmstream_smpl, - init_vgmstream_msa, - init_vgmstream_voi, - init_vgmstream_ngc_rkv, - init_vgmstream_dsp_ddsp, - init_vgmstream_p3d, - init_vgmstream_ngc_dsp_mpds, - init_vgmstream_dsp_str_ig, - init_vgmstream_ea_swvr, - init_vgmstream_dsp_xiii, - init_vgmstream_dsp_cabelas, - init_vgmstream_lpcm_shade, - init_vgmstream_ps2_vms, - init_vgmstream_xau, - init_vgmstream_bar, - init_vgmstream_dsp_dspw, - init_vgmstream_jstm, - init_vgmstream_xvag, - init_vgmstream_cps, - init_vgmstream_sqex_scd, - init_vgmstream_ngc_nst_dsp, - init_vgmstream_baf, - init_vgmstream_msf, - init_vgmstream_ps3_past, - init_vgmstream_sgxd, - init_vgmstream_wii_ras, - init_vgmstream_spm, - init_vgmstream_ps2_iab, - init_vgmstream_vs_str, - init_vgmstream_lsf_n1nj4n, - init_vgmstream_xwav_new, - init_vgmstream_xwav_old, - init_vgmstream_hyperscan_kvag, - init_vgmstream_psnd, - init_vgmstream_adp_wildfire, - init_vgmstream_adp_qd, - init_vgmstream_eb_sfx, - init_vgmstream_eb_sf0, - init_vgmstream_mtaf, - init_vgmstream_alp, - init_vgmstream_wpd, - init_vgmstream_mn_str, - init_vgmstream_mss, - init_vgmstream_ps2_hsf, - init_vgmstream_ivag, - init_vgmstream_2pfs, - init_vgmstream_xnb, - init_vgmstream_ubi_ckd, - init_vgmstream_ps2_vbk, - init_vgmstream_otm, - init_vgmstream_bcstm, - init_vgmstream_idsp_namco, - init_vgmstream_kt_g1l, - init_vgmstream_kt_wiibgm, - init_vgmstream_bfstm, - init_vgmstream_mca, -#if 0 - init_vgmstream_mp4_aac, -#endif -#if defined(VGM_USE_MP4V2) && defined(VGM_USE_FDKAAC) - init_vgmstream_akb_mp4, -#endif - init_vgmstream_ktss, - init_vgmstream_hca, - init_vgmstream_svag_snk, - init_vgmstream_ps2_vds_vdm, - init_vgmstream_cxs, - init_vgmstream_adx_monster, - init_vgmstream_akb, - init_vgmstream_akb2, -#ifdef VGM_USE_FFMPEG - init_vgmstream_mp4_aac_ffmpeg, -#endif - init_vgmstream_bik, - init_vgmstream_astb, - init_vgmstream_wwise, - init_vgmstream_ubi_raki, - init_vgmstream_pasx, - init_vgmstream_xma, - init_vgmstream_sndx, - init_vgmstream_ogl, - init_vgmstream_mc3, - init_vgmstream_ghs, - init_vgmstream_aac_triace, - init_vgmstream_va3, - init_vgmstream_mta2, - init_vgmstream_mta2_container, - init_vgmstream_xa_xa30, - init_vgmstream_xa_04sw, - init_vgmstream_ea_bnk, - init_vgmstream_ea_abk_schl, - init_vgmstream_ea_amb_schl, - init_vgmstream_ea_hdr_dat, - init_vgmstream_ea_hdr_dat_v2, - init_vgmstream_ea_map_mus, - init_vgmstream_ea_mpf_mus_schl, - init_vgmstream_ea_msb_mus_schl, - init_vgmstream_ea_schl_fixed, - init_vgmstream_sk_aud, - init_vgmstream_stma, - init_vgmstream_ea_snu, - init_vgmstream_awc, - init_vgmstream_opus_std, - init_vgmstream_opus_n1, - init_vgmstream_opus_capcom, - init_vgmstream_opus_nop, - init_vgmstream_opus_shinen, - init_vgmstream_opus_nus3, - init_vgmstream_opus_sps_n1, - init_vgmstream_pc_ast, - init_vgmstream_naac, - init_vgmstream_ubi_sb, - init_vgmstream_ubi_sm, - init_vgmstream_ubi_bnm, - init_vgmstream_ubi_bnm_ps2, - init_vgmstream_ubi_dat, - init_vgmstream_ubi_blk, - init_vgmstream_ezw, - init_vgmstream_vxn, - init_vgmstream_ea_snr_sns, - init_vgmstream_ea_sps, - init_vgmstream_ea_abk_eaac, - init_vgmstream_ea_amb_eaac, - init_vgmstream_ea_hdr_sth_dat, - init_vgmstream_ea_mpf_mus_eaac, - init_vgmstream_ea_msb_mus_eaac, - init_vgmstream_ea_tmx, - init_vgmstream_ea_sbr, - init_vgmstream_ea_sbr_harmony, - init_vgmstream_vid1, - init_vgmstream_flx, - init_vgmstream_mogg, - init_vgmstream_kma9, - init_vgmstream_xwc, - init_vgmstream_atsl, - init_vgmstream_sps_n1, - init_vgmstream_apa3, - init_vgmstream_sqex_sead, - init_vgmstream_waf, - init_vgmstream_wave, - init_vgmstream_wave_segmented, - init_vgmstream_smv, - init_vgmstream_nxap, - init_vgmstream_ea_wve_au00, - init_vgmstream_ea_wve_ad10, - init_vgmstream_sthd, - init_vgmstream_pcm_sre, - init_vgmstream_dsp_mcadpcm, - init_vgmstream_ubi_lyn, - init_vgmstream_ubi_lyn_container, - init_vgmstream_msb_msh, - init_vgmstream_txtp, - init_vgmstream_smc_smh, - init_vgmstream_ppst, - init_vgmstream_sps_n1_segmented, - init_vgmstream_ubi_bao_pk, - init_vgmstream_ubi_bao_atomic, - init_vgmstream_dsp_switch_audio, - init_vgmstream_sadf, - init_vgmstream_h4m, - init_vgmstream_ads_container, - init_vgmstream_asf, - init_vgmstream_xmd, - init_vgmstream_cks, - init_vgmstream_ckb, - init_vgmstream_wv6, - init_vgmstream_str_wav, - init_vgmstream_wavebatch, - init_vgmstream_hd3_bd3, - init_vgmstream_bnk_sony, - init_vgmstream_nus3bank, - init_vgmstream_sscf, - init_vgmstream_dsp_sps_n1, - init_vgmstream_dsp_itl_ch, - init_vgmstream_a2m, - init_vgmstream_ahv, - init_vgmstream_msv, - init_vgmstream_sdf, - init_vgmstream_svg, - init_vgmstream_vai, - init_vgmstream_aif_asobo, - init_vgmstream_ao, - init_vgmstream_apc, - init_vgmstream_wv2, - init_vgmstream_xau_konami, - init_vgmstream_derf, - init_vgmstream_utk, - init_vgmstream_nxa1, - init_vgmstream_adpcm_capcom, - init_vgmstream_ue4opus, - init_vgmstream_xwma, - init_vgmstream_xopus, - init_vgmstream_vs_square, - init_vgmstream_msf_banpresto_wmsf, - init_vgmstream_msf_banpresto_2msf, - init_vgmstream_nwav, - init_vgmstream_xpcm, - init_vgmstream_msf_tamasoft, - init_vgmstream_xps_dat, - init_vgmstream_xps, - init_vgmstream_zsnd, - init_vgmstream_opus_opusx, - init_vgmstream_dsp_adpy, - init_vgmstream_dsp_adpx, - init_vgmstream_ogg_opus, - init_vgmstream_nus3audio, - init_vgmstream_imc, - init_vgmstream_imc_container, - init_vgmstream_smp, - init_vgmstream_gin, - init_vgmstream_dsf, - init_vgmstream_208, - init_vgmstream_dsp_lucasarts_ds2, - init_vgmstream_ffdl, - init_vgmstream_mus_vc, - init_vgmstream_strm_abylight, - init_vgmstream_sfh, - init_vgmstream_ea_schl_video, - init_vgmstream_msf_konami, - init_vgmstream_xwma_konami, - init_vgmstream_9tav, - init_vgmstream_fsb5_fev_bank, - init_vgmstream_bwav, - init_vgmstream_opus_prototype, - init_vgmstream_awb, - init_vgmstream_acb, - init_vgmstream_rad, - init_vgmstream_smk, - init_vgmstream_mzrt_v0, - init_vgmstream_xavs, - init_vgmstream_psf_single, - init_vgmstream_psf_segmented, - init_vgmstream_dsp_itl, - init_vgmstream_sch, - init_vgmstream_ima, - init_vgmstream_nub, - init_vgmstream_nub_wav, - init_vgmstream_nub_vag, - init_vgmstream_nub_at3, - init_vgmstream_nub_xma, - init_vgmstream_nub_idsp, - init_vgmstream_nub_is14, - init_vgmstream_xwv_valve, - init_vgmstream_ubi_hx, - init_vgmstream_bmp_konami, - init_vgmstream_opus_opusnx, - init_vgmstream_opus_sqex, - init_vgmstream_isb, - init_vgmstream_xssb, - init_vgmstream_xma_ue3, - init_vgmstream_csb, - init_vgmstream_fwse, - init_vgmstream_fda, - init_vgmstream_kwb, - init_vgmstream_lrmd, - init_vgmstream_bkhd, - init_vgmstream_bkhd_fx, - init_vgmstream_diva, - init_vgmstream_imuse, - init_vgmstream_ktsr, - init_vgmstream_asrs, - init_vgmstream_mups, - init_vgmstream_kat, - init_vgmstream_pcm_success, - init_vgmstream_ktsc, - init_vgmstream_adp_konami, - init_vgmstream_zwv, - init_vgmstream_dsb, - init_vgmstream_bsf, - init_vgmstream_sdrh_new, - init_vgmstream_sdrh_old, - init_vgmstream_wady, - init_vgmstream_dsp_sqex, - init_vgmstream_dsp_wiivoice, - init_vgmstream_xws, - init_vgmstream_cpk, - init_vgmstream_opus_nsopus, - init_vgmstream_sbk, - init_vgmstream_dsp_wiiadpcm, - init_vgmstream_dsp_cwac, - init_vgmstream_ifs, - init_vgmstream_acx, - init_vgmstream_compresswave, - init_vgmstream_ktac, - init_vgmstream_mzrt_v1, - init_vgmstream_bsnf, - init_vgmstream_tac, - init_vgmstream_idsp_tose, - init_vgmstream_dsp_kwa, - init_vgmstream_ogv_3rdeye, - init_vgmstream_sspr, - init_vgmstream_piff_tpcm, - init_vgmstream_wxd_wxh, - init_vgmstream_bnk_relic, - init_vgmstream_xsh_xsd_xss, - init_vgmstream_psb, - init_vgmstream_lopu_fb, - init_vgmstream_lpcm_fb, - init_vgmstream_wbk, - init_vgmstream_wbk_nslb, - init_vgmstream_dsp_apex, - init_vgmstream_ubi_ckd_cwav, - init_vgmstream_sspf, - init_vgmstream_opus_rsnd, - init_vgmstream_s3v, - init_vgmstream_esf, - init_vgmstream_adm3, - init_vgmstream_tt_ad, - init_vgmstream_bw_mp3_riff, - init_vgmstream_bw_riff_mp3, - init_vgmstream_sndz, - init_vgmstream_vab, - init_vgmstream_bigrp, - init_vgmstream_sscf_encrypted, - init_vgmstream_s_p_sth, - init_vgmstream_utf_ahx, - init_vgmstream_ego_dic, - init_vgmstream_awd, - init_vgmstream_rws_809, - init_vgmstream_pwb, - init_vgmstream_squeakstream, - init_vgmstream_squeaksample, - init_vgmstream_snds, - init_vgmstream_adm2, - init_vgmstream_nxof, - init_vgmstream_gwb_gwd, - init_vgmstream_s_pack, - init_vgmstream_cbx, - init_vgmstream_vas_rockstar, - init_vgmstream_ea_sbk, - init_vgmstream_dsp_asura, - init_vgmstream_dsp_asura_ds2, - init_vgmstream_dsp_asura_ttss, - init_vgmstream_dsp_asura_sfx, - init_vgmstream_adp_ongakukan, - - /* lower priority metas (no clean header identity, somewhat ambiguous, or need extension/companion file to identify) */ - init_vgmstream_agsc, - init_vgmstream_scd_pcm, - init_vgmstream_vas_kceo, - init_vgmstream_vas_kceo_container, - init_vgmstream_ps2_wmus, - init_vgmstream_mib_mih, - init_vgmstream_mjb_mjh, - init_vgmstream_mic_koei, - init_vgmstream_seb, - init_vgmstream_tgc, - init_vgmstream_rage_aud, - init_vgmstream_asd_naxat, - /* need companion files */ - init_vgmstream_pos, - init_vgmstream_sli_loops, - - /* lowest priority metas (should go after all metas, and TXTH should go before raw formats) */ - init_vgmstream_txth, /* proper parsers should supersede TXTH, once added */ - init_vgmstream_dtk, /* semi-raw GC streamed files */ - init_vgmstream_mpeg, /* semi-raw MP3 */ - init_vgmstream_btsnd, /* semi-headerless */ - init_vgmstream_fsb_encrypted, - init_vgmstream_nus3bank_encrypted, - init_vgmstream_encrypted, /* encrypted stuff */ - init_vgmstream_raw_rsf, /* raw GC streamed files */ - init_vgmstream_raw_int, /* .int raw PCM */ - init_vgmstream_ps_headerless, /* tries to detect a bunch of PS-ADPCM formats */ - init_vgmstream_raw_snds, /* .snds raw SNDS IMA */ - init_vgmstream_raw_wavm, /* .wavm raw xbox */ - init_vgmstream_raw_pcm, /* .raw raw PCM */ - init_vgmstream_raw_s14_sss, /* .s14/sss raw siren14 */ - init_vgmstream_exakt_sc, /* .sc raw PCM */ - init_vgmstream_zwdsp, /* fake format */ - init_vgmstream_ps2_adm, /* weird non-constant PSX blocks */ - init_vgmstream_rwsd, /* crap, to be removed */ -#ifdef VGM_USE_FFMPEG - init_vgmstream_ffmpeg, /* may play anything incorrectly, since FFmpeg doesn't check extensions */ -#endif -}; - -#define LOCAL_ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0])) -static const int init_vgmstream_count = LOCAL_ARRAY_LENGTH(init_vgmstream_functions); /*****************************************************************************/ /* INIT/META */ /*****************************************************************************/ -VGMSTREAM* detect_vgmstream_format(STREAMFILE* sf) { - if (!sf) - return NULL; - - /* try a series of formats, see which works */ - for (int i = 0; i < init_vgmstream_count; i++) { - init_vgmstream_t init_vgmstream_function = init_vgmstream_functions[i]; - - /* call init function and see if valid VGMSTREAM was returned */ - VGMSTREAM* vgmstream = init_vgmstream_function(sf); - if (!vgmstream) - continue; - - int format_id = i + 1; - - /* validate + setup vgmstream */ - if (!prepare_vgmstream(vgmstream, sf, format_id)) { - /* keep trying if wasn't valid, as simpler formats may return a vgmstream by mistake */ - close_vgmstream(vgmstream); - continue; - } - - return vgmstream; +/* format detection and VGMSTREAM setup, uses default parameters */ +VGMSTREAM* init_vgmstream(const char* const filename) { + VGMSTREAM* vgmstream = NULL; + STREAMFILE* sf = open_stdio_streamfile(filename); + if (sf) { + vgmstream = init_vgmstream_from_STREAMFILE(sf); + close_streamfile(sf); } - - /* not supported */ - return NULL; + return vgmstream; } -init_vgmstream_t get_vgmstream_format_init(int format_id) { - // ID is expected to be from 1...N, to distinguish from 0 = not set - if (format_id <= 0 || format_id > init_vgmstream_count) - return NULL; - - return init_vgmstream_functions[format_id - 1]; +VGMSTREAM* init_vgmstream_from_STREAMFILE(STREAMFILE* sf) { + return detect_vgmstream_format(sf); } @@ -733,22 +152,6 @@ void setup_vgmstream(VGMSTREAM* vgmstream) { * as they can be created using init_vgmstream or manually */ } - -/* format detection and VGMSTREAM setup, uses default parameters */ -VGMSTREAM* init_vgmstream(const char* const filename) { - VGMSTREAM* vgmstream = NULL; - STREAMFILE* sf = open_stdio_streamfile(filename); - if (sf) { - vgmstream = init_vgmstream_from_STREAMFILE(sf); - close_streamfile(sf); - } - return vgmstream; -} - -VGMSTREAM* init_vgmstream_from_STREAMFILE(STREAMFILE* sf) { - return detect_vgmstream_format(sf); -} - /* Reset a VGMSTREAM to its state at the start of playback (when a plugin seeks back to zero). */ void reset_vgmstream(VGMSTREAM* vgmstream) { diff --git a/src/vgmstream_init.c b/src/vgmstream_init.c new file mode 100644 index 00000000..5db7c3e8 --- /dev/null +++ b/src/vgmstream_init.c @@ -0,0 +1,600 @@ +#include "vgmstream_init.h" + +//typedef VGMSTREAM* (*init_vgmstream_t)(STREAMFILE*); + +/* list of metadata parser functions that will recognize files, used on init */ +init_vgmstream_t init_vgmstream_functions[] = { + init_vgmstream_adx, + init_vgmstream_brstm, + init_vgmstream_brwav, + init_vgmstream_bfwav, + init_vgmstream_bcwav, + init_vgmstream_brwar, + init_vgmstream_nds_strm, + init_vgmstream_afc, + init_vgmstream_ast, + init_vgmstream_halpst, + init_vgmstream_rs03, + init_vgmstream_ngc_dsp_std, + init_vgmstream_ngc_dsp_std_le, + init_vgmstream_ngc_mdsp_std, + init_vgmstream_csmp, + init_vgmstream_rfrm, + init_vgmstream_cstr, + init_vgmstream_gcsw, + init_vgmstream_ads, + init_vgmstream_npsf, + init_vgmstream_xa, + init_vgmstream_rxws, + init_vgmstream_ngc_dsp_stm, + init_vgmstream_exst, + init_vgmstream_svag_kcet, + init_vgmstream_ngc_mpdsp, + init_vgmstream_ngc_dsp_std_int, + init_vgmstream_vag, + init_vgmstream_vag_aaap, + init_vgmstream_vag_footer, + init_vgmstream_vag_evolution_games, + init_vgmstream_ild, + init_vgmstream_ngc_str, + init_vgmstream_ea_schl, + init_vgmstream_caf, + init_vgmstream_vpk, + init_vgmstream_genh, + init_vgmstream_ogg_vorbis, + init_vgmstream_sfl_ogg, + init_vgmstream_sadb, + init_vgmstream_ps2_bmdx, + init_vgmstream_wsi, + init_vgmstream_aifc, + init_vgmstream_str_snds, + init_vgmstream_ws_aud, + init_vgmstream_ahx, + init_vgmstream_iivb, + init_vgmstream_svs, + init_vgmstream_riff, + init_vgmstream_rifx, + init_vgmstream_nwa, + init_vgmstream_ea_1snh, + init_vgmstream_ea_eacs, + init_vgmstream_xss, + init_vgmstream_sl3, + init_vgmstream_hgc1, + init_vgmstream_aus, + init_vgmstream_rws, + init_vgmstream_fsb, + init_vgmstream_fsb5, + init_vgmstream_rwax, + init_vgmstream_xwb, + init_vgmstream_ps2_xa30, + init_vgmstream_musc, + init_vgmstream_musx, + init_vgmstream_filp, + init_vgmstream_ikm, + init_vgmstream_ster, + init_vgmstream_bg00, + init_vgmstream_sat_dvi, + init_vgmstream_dc_kcey, + init_vgmstream_rstm_rockstar, + init_vgmstream_acm, + init_vgmstream_mus_acm, + init_vgmstream_vig_kces, + init_vgmstream_hxd, + init_vgmstream_vsv, + init_vgmstream_ps2_pcm, + init_vgmstream_ps2_rkv, + init_vgmstream_lp_ap_lep, + init_vgmstream_sdt, + init_vgmstream_aix, + init_vgmstream_wvs_xbox, + init_vgmstream_wvs_ngc, + init_vgmstream_str_sega, + init_vgmstream_str_sega_custom, + init_vgmstream_dec, + init_vgmstream_vs, + init_vgmstream_xmu, + init_vgmstream_xvas, + init_vgmstream_sat_sap, + init_vgmstream_dc_idvi, + init_vgmstream_ps2_rnd, + init_vgmstream_idsp_tt, + init_vgmstream_kraw, + init_vgmstream_omu, + init_vgmstream_xa2_acclaim, + init_vgmstream_idsp_nl, + init_vgmstream_idsp_ie, + init_vgmstream_ymf, + init_vgmstream_sadl, + init_vgmstream_fag, + init_vgmstream_mic, + init_vgmstream_ngc_pdt_split, + init_vgmstream_ngc_pdt, + init_vgmstream_mus_krome, + init_vgmstream_spsd, + init_vgmstream_rsd, + init_vgmstream_bgw, + init_vgmstream_spw, + init_vgmstream_ps2_ass, + init_vgmstream_ubi_jade, + init_vgmstream_ubi_jade_container, + init_vgmstream_seg, + init_vgmstream_nds_strm_ffta2, + init_vgmstream_knon, + init_vgmstream_gca, + init_vgmstream_spt_spd, + init_vgmstream_ish_isd, + init_vgmstream_gsnd, + init_vgmstream_ydsp, + init_vgmstream_ssm, + init_vgmstream_ps2_joe, + init_vgmstream_vgs, + init_vgmstream_dcs_wav, + init_vgmstream_mul, + init_vgmstream_thp, + init_vgmstream_sts, + init_vgmstream_p2bt_move_visa, + init_vgmstream_gbts, + init_vgmstream_wii_sng, + init_vgmstream_ngc_dsp_iadp, + init_vgmstream_aax, + init_vgmstream_utf_dsp, + init_vgmstream_ngc_ffcc_str, + init_vgmstream_sat_baka, + init_vgmstream_swav, + init_vgmstream_vsf, + init_vgmstream_nds_rrds, + init_vgmstream_ps2_vsf_tta, + init_vgmstream_ads_midway, + init_vgmstream_ps2_mcg, + init_vgmstream_zsd, + init_vgmstream_vgs_ps, + init_vgmstream_redspark, + init_vgmstream_wii_wsd, + init_vgmstream_dsp_ndp, + init_vgmstream_ps2_sps, + init_vgmstream_nds_hwas, + init_vgmstream_ngc_lps, + init_vgmstream_ps2_snd, + init_vgmstream_naomi_adpcm, + init_vgmstream_sd9, + init_vgmstream_2dx9, + init_vgmstream_dsp_ygo, + init_vgmstream_ps2_vgv, + init_vgmstream_gcub, + init_vgmstream_maxis_xa, + init_vgmstream_ngc_sck_dsp, + init_vgmstream_apple_caff, + init_vgmstream_pc_mxst, + init_vgmstream_sab, + init_vgmstream_bns, + init_vgmstream_wii_was, + init_vgmstream_pona_3do, + init_vgmstream_pona_psx, + init_vgmstream_xbox_hlwav, + init_vgmstream_myspd, + init_vgmstream_his, + init_vgmstream_ast_mmv, + init_vgmstream_ast_mv, + init_vgmstream_dmsg, + init_vgmstream_ngc_dsp_aaap, + init_vgmstream_ngc_dsp_konami, + init_vgmstream_wb, + init_vgmstream_bnsf, + init_vgmstream_ps2_gcm, + init_vgmstream_smpl, + init_vgmstream_msa, + init_vgmstream_voi, + init_vgmstream_ngc_rkv, + init_vgmstream_dsp_ddsp, + init_vgmstream_p3d, + init_vgmstream_ngc_dsp_mpds, + init_vgmstream_dsp_str_ig, + init_vgmstream_ea_swvr, + init_vgmstream_dsp_xiii, + init_vgmstream_dsp_cabelas, + init_vgmstream_lpcm_shade, + init_vgmstream_ps2_vms, + init_vgmstream_xau, + init_vgmstream_bar, + init_vgmstream_dsp_dspw, + init_vgmstream_jstm, + init_vgmstream_xvag, + init_vgmstream_cps, + init_vgmstream_sqex_scd, + init_vgmstream_ngc_nst_dsp, + init_vgmstream_baf, + init_vgmstream_msf, + init_vgmstream_ps3_past, + init_vgmstream_sgxd, + init_vgmstream_wii_ras, + init_vgmstream_spm, + init_vgmstream_ps2_iab, + init_vgmstream_vs_str, + init_vgmstream_lsf_n1nj4n, + init_vgmstream_xwav_new, + init_vgmstream_xwav_old, + init_vgmstream_hyperscan_kvag, + init_vgmstream_psnd, + init_vgmstream_adp_wildfire, + init_vgmstream_adp_qd, + init_vgmstream_eb_sfx, + init_vgmstream_eb_sf0, + init_vgmstream_mtaf, + init_vgmstream_alp, + init_vgmstream_wpd, + init_vgmstream_mn_str, + init_vgmstream_mss, + init_vgmstream_ps2_hsf, + init_vgmstream_ivag, + init_vgmstream_2pfs, + init_vgmstream_xnb, + init_vgmstream_ubi_ckd, + init_vgmstream_ps2_vbk, + init_vgmstream_otm, + init_vgmstream_bcstm, + init_vgmstream_idsp_namco, + init_vgmstream_kt_g1l, + init_vgmstream_kt_wiibgm, + init_vgmstream_bfstm, + init_vgmstream_mca, +#if 0 + init_vgmstream_mp4_aac, +#endif +#if defined(VGM_USE_MP4V2) && defined(VGM_USE_FDKAAC) + init_vgmstream_akb_mp4, +#endif + init_vgmstream_ktss, + init_vgmstream_hca, + init_vgmstream_svag_snk, + init_vgmstream_ps2_vds_vdm, + init_vgmstream_cxs, + init_vgmstream_adx_monster, + init_vgmstream_akb, + init_vgmstream_akb2, +#ifdef VGM_USE_FFMPEG + init_vgmstream_mp4_aac_ffmpeg, +#endif + init_vgmstream_bik, + init_vgmstream_astb, + init_vgmstream_wwise, + init_vgmstream_ubi_raki, + init_vgmstream_pasx, + init_vgmstream_xma, + init_vgmstream_sndx, + init_vgmstream_ogl, + init_vgmstream_mc3, + init_vgmstream_ghs, + init_vgmstream_aac_triace, + init_vgmstream_va3, + init_vgmstream_mta2, + init_vgmstream_mta2_container, + init_vgmstream_xa_xa30, + init_vgmstream_xa_04sw, + init_vgmstream_ea_bnk, + init_vgmstream_ea_abk_schl, + init_vgmstream_ea_amb_schl, + init_vgmstream_ea_hdr_dat, + init_vgmstream_ea_hdr_dat_v2, + init_vgmstream_ea_map_mus, + init_vgmstream_ea_mpf_mus_schl, + init_vgmstream_ea_msb_mus_schl, + init_vgmstream_ea_schl_fixed, + init_vgmstream_sk_aud, + init_vgmstream_stma, + init_vgmstream_ea_snu, + init_vgmstream_awc, + init_vgmstream_opus_std, + init_vgmstream_opus_n1, + init_vgmstream_opus_capcom, + init_vgmstream_opus_nop, + init_vgmstream_opus_shinen, + init_vgmstream_opus_nus3, + init_vgmstream_opus_sps_n1, + init_vgmstream_pc_ast, + init_vgmstream_naac, + init_vgmstream_ubi_sb, + init_vgmstream_ubi_sm, + init_vgmstream_ubi_bnm, + init_vgmstream_ubi_bnm_ps2, + init_vgmstream_ubi_dat, + init_vgmstream_ubi_blk, + init_vgmstream_ezw, + init_vgmstream_vxn, + init_vgmstream_ea_snr_sns, + init_vgmstream_ea_sps, + init_vgmstream_ea_abk_eaac, + init_vgmstream_ea_amb_eaac, + init_vgmstream_ea_hdr_sth_dat, + init_vgmstream_ea_mpf_mus_eaac, + init_vgmstream_ea_msb_mus_eaac, + init_vgmstream_ea_tmx, + init_vgmstream_ea_sbr, + init_vgmstream_ea_sbr_harmony, + init_vgmstream_vid1, + init_vgmstream_flx, + init_vgmstream_mogg, + init_vgmstream_kma9, + init_vgmstream_xwc, + init_vgmstream_atsl, + init_vgmstream_sps_n1, + init_vgmstream_apa3, + init_vgmstream_sqex_sead, + init_vgmstream_waf, + init_vgmstream_wave, + init_vgmstream_wave_segmented, + init_vgmstream_smv, + init_vgmstream_nxap, + init_vgmstream_ea_wve_au00, + init_vgmstream_ea_wve_ad10, + init_vgmstream_sthd, + init_vgmstream_pcm_sre, + init_vgmstream_dsp_mcadpcm, + init_vgmstream_ubi_lyn, + init_vgmstream_ubi_lyn_container, + init_vgmstream_msb_msh, + init_vgmstream_txtp, + init_vgmstream_smc_smh, + init_vgmstream_ppst, + init_vgmstream_sps_n1_segmented, + init_vgmstream_ubi_bao_pk, + init_vgmstream_ubi_bao_atomic, + init_vgmstream_dsp_switch_audio, + init_vgmstream_sadf, + init_vgmstream_h4m, + init_vgmstream_ads_container, + init_vgmstream_asf, + init_vgmstream_xmd, + init_vgmstream_cks, + init_vgmstream_ckb, + init_vgmstream_wv6, + init_vgmstream_str_wav, + init_vgmstream_wavebatch, + init_vgmstream_hd3_bd3, + init_vgmstream_bnk_sony, + init_vgmstream_nus3bank, + init_vgmstream_sscf, + init_vgmstream_dsp_sps_n1, + init_vgmstream_dsp_itl_ch, + init_vgmstream_a2m, + init_vgmstream_ahv, + init_vgmstream_msv, + init_vgmstream_sdf, + init_vgmstream_svg, + init_vgmstream_vai, + init_vgmstream_aif_asobo, + init_vgmstream_ao, + init_vgmstream_apc, + init_vgmstream_wv2, + init_vgmstream_xau_konami, + init_vgmstream_derf, + init_vgmstream_utk, + init_vgmstream_nxa1, + init_vgmstream_adpcm_capcom, + init_vgmstream_ue4opus, + init_vgmstream_xwma, + init_vgmstream_xopus, + init_vgmstream_vs_square, + init_vgmstream_msf_banpresto_wmsf, + init_vgmstream_msf_banpresto_2msf, + init_vgmstream_nwav, + init_vgmstream_xpcm, + init_vgmstream_msf_tamasoft, + init_vgmstream_xps_dat, + init_vgmstream_xps, + init_vgmstream_zsnd, + init_vgmstream_opus_opusx, + init_vgmstream_dsp_adpy, + init_vgmstream_dsp_adpx, + init_vgmstream_ogg_opus, + init_vgmstream_nus3audio, + init_vgmstream_imc, + init_vgmstream_imc_container, + init_vgmstream_smp, + init_vgmstream_gin, + init_vgmstream_dsf, + init_vgmstream_208, + init_vgmstream_dsp_lucasarts_ds2, + init_vgmstream_ffdl, + init_vgmstream_mus_vc, + init_vgmstream_strm_abylight, + init_vgmstream_sfh, + init_vgmstream_ea_schl_video, + init_vgmstream_msf_konami, + init_vgmstream_xwma_konami, + init_vgmstream_9tav, + init_vgmstream_fsb5_fev_bank, + init_vgmstream_bwav, + init_vgmstream_opus_prototype, + init_vgmstream_awb, + init_vgmstream_acb, + init_vgmstream_rad, + init_vgmstream_smk, + init_vgmstream_mzrt_v0, + init_vgmstream_xavs, + init_vgmstream_psf_single, + init_vgmstream_psf_segmented, + init_vgmstream_dsp_itl, + init_vgmstream_sch, + init_vgmstream_ima, + init_vgmstream_nub, + init_vgmstream_nub_wav, + init_vgmstream_nub_vag, + init_vgmstream_nub_at3, + init_vgmstream_nub_xma, + init_vgmstream_nub_idsp, + init_vgmstream_nub_is14, + init_vgmstream_xwv_valve, + init_vgmstream_ubi_hx, + init_vgmstream_bmp_konami, + init_vgmstream_opus_opusnx, + init_vgmstream_opus_sqex, + init_vgmstream_isb, + init_vgmstream_xssb, + init_vgmstream_xma_ue3, + init_vgmstream_csb, + init_vgmstream_fwse, + init_vgmstream_fda, + init_vgmstream_kwb, + init_vgmstream_lrmd, + init_vgmstream_bkhd, + init_vgmstream_bkhd_fx, + init_vgmstream_diva, + init_vgmstream_imuse, + init_vgmstream_ktsr, + init_vgmstream_asrs, + init_vgmstream_mups, + init_vgmstream_kat, + init_vgmstream_pcm_success, + init_vgmstream_ktsc, + init_vgmstream_adp_konami, + init_vgmstream_zwv, + init_vgmstream_dsb, + init_vgmstream_bsf, + init_vgmstream_sdrh_new, + init_vgmstream_sdrh_old, + init_vgmstream_wady, + init_vgmstream_dsp_sqex, + init_vgmstream_dsp_wiivoice, + init_vgmstream_xws, + init_vgmstream_cpk, + init_vgmstream_opus_nsopus, + init_vgmstream_sbk, + init_vgmstream_dsp_wiiadpcm, + init_vgmstream_dsp_cwac, + init_vgmstream_ifs, + init_vgmstream_acx, + init_vgmstream_compresswave, + init_vgmstream_ktac, + init_vgmstream_mzrt_v1, + init_vgmstream_bsnf, + init_vgmstream_tac, + init_vgmstream_idsp_tose, + init_vgmstream_dsp_kwa, + init_vgmstream_ogv_3rdeye, + init_vgmstream_sspr, + init_vgmstream_piff_tpcm, + init_vgmstream_wxd_wxh, + init_vgmstream_bnk_relic, + init_vgmstream_xsh_xsd_xss, + init_vgmstream_psb, + init_vgmstream_lopu_fb, + init_vgmstream_lpcm_fb, + init_vgmstream_wbk, + init_vgmstream_wbk_nslb, + init_vgmstream_dsp_apex, + init_vgmstream_ubi_ckd_cwav, + init_vgmstream_sspf, + init_vgmstream_opus_rsnd, + init_vgmstream_s3v, + init_vgmstream_esf, + init_vgmstream_adm3, + init_vgmstream_tt_ad, + init_vgmstream_bw_mp3_riff, + init_vgmstream_bw_riff_mp3, + init_vgmstream_sndz, + init_vgmstream_vab, + init_vgmstream_bigrp, + init_vgmstream_sscf_encrypted, + init_vgmstream_s_p_sth, + init_vgmstream_utf_ahx, + init_vgmstream_ego_dic, + init_vgmstream_awd, + init_vgmstream_rws_809, + init_vgmstream_pwb, + init_vgmstream_squeakstream, + init_vgmstream_squeaksample, + init_vgmstream_snds, + init_vgmstream_adm2, + init_vgmstream_nxof, + init_vgmstream_gwb_gwd, + init_vgmstream_s_pack, + init_vgmstream_cbx, + init_vgmstream_vas_rockstar, + init_vgmstream_ea_sbk, + init_vgmstream_dsp_asura, + init_vgmstream_dsp_asura_ds2, + init_vgmstream_dsp_asura_ttss, + init_vgmstream_dsp_asura_sfx, + init_vgmstream_adp_ongakukan, + + /* lower priority metas (no clean header identity, somewhat ambiguous, or need extension/companion file to identify) */ + init_vgmstream_agsc, + init_vgmstream_scd_pcm, + init_vgmstream_vas_kceo, + init_vgmstream_vas_kceo_container, + init_vgmstream_ps2_wmus, + init_vgmstream_mib_mih, + init_vgmstream_mjb_mjh, + init_vgmstream_mic_koei, + init_vgmstream_seb, + init_vgmstream_tgc, + init_vgmstream_rage_aud, + init_vgmstream_asd_naxat, + /* need companion files */ + init_vgmstream_pos, + init_vgmstream_sli_loops, + + /* lowest priority metas (should go after all metas, and TXTH should go before raw formats) */ + init_vgmstream_txth, /* proper parsers should supersede TXTH, once added */ + init_vgmstream_dtk, /* semi-raw GC streamed files */ + init_vgmstream_mpeg, /* semi-raw MP3 */ + init_vgmstream_btsnd, /* semi-headerless */ + init_vgmstream_fsb_encrypted, + init_vgmstream_nus3bank_encrypted, + init_vgmstream_encrypted, /* encrypted stuff */ + init_vgmstream_raw_rsf, /* raw GC streamed files */ + init_vgmstream_raw_int, /* .int raw PCM */ + init_vgmstream_ps_headerless, /* tries to detect a bunch of PS-ADPCM formats */ + init_vgmstream_raw_snds, /* .snds raw SNDS IMA */ + init_vgmstream_raw_wavm, /* .wavm raw xbox */ + init_vgmstream_raw_pcm, /* .raw raw PCM */ + init_vgmstream_raw_s14_sss, /* .s14/sss raw siren14 */ + init_vgmstream_exakt_sc, /* .sc raw PCM */ + init_vgmstream_zwdsp, /* fake format */ + init_vgmstream_ps2_adm, /* weird non-constant PSX blocks */ + init_vgmstream_rwsd, /* crap, to be removed */ +#ifdef VGM_USE_FFMPEG + init_vgmstream_ffmpeg, /* may play anything incorrectly, since FFmpeg doesn't check extensions */ +#endif +}; + +#define LOCAL_ARRAY_LENGTH(array) (sizeof(array) / sizeof(array[0])) +static const int init_vgmstream_count = LOCAL_ARRAY_LENGTH(init_vgmstream_functions); + + +VGMSTREAM* detect_vgmstream_format(STREAMFILE* sf) { + if (!sf) + return NULL; + + /* try a series of formats, see which works */ + for (int i = 0; i < init_vgmstream_count; i++) { + init_vgmstream_t init_vgmstream_function = init_vgmstream_functions[i]; + + /* call init function and see if valid VGMSTREAM was returned */ + VGMSTREAM* vgmstream = init_vgmstream_function(sf); + if (!vgmstream) + continue; + + int format_id = i + 1; + + /* validate + setup vgmstream */ + if (!prepare_vgmstream(vgmstream, sf, format_id)) { + /* keep trying if wasn't valid, as simpler formats may return a vgmstream by mistake */ + close_vgmstream(vgmstream); + continue; + } + + return vgmstream; + } + + /* not supported */ + return NULL; +} + +init_vgmstream_t get_vgmstream_format_init(int format_id) { + // ID is expected to be from 1...N, to distinguish from 0 = not set + if (format_id <= 0 || format_id > init_vgmstream_count) + return NULL; + + return init_vgmstream_functions[format_id - 1]; +}