diff --git a/Frameworks/vgmstream/libvgmstream.xcodeproj/project.pbxproj b/Frameworks/vgmstream/libvgmstream.xcodeproj/project.pbxproj index b4f9d7c0b..adbc736e1 100644 --- a/Frameworks/vgmstream/libvgmstream.xcodeproj/project.pbxproj +++ b/Frameworks/vgmstream/libvgmstream.xcodeproj/project.pbxproj @@ -27,7 +27,6 @@ 830595D8277EEAA500EBFAAE /* ffmpeg_decoder_custom_mp4.c in Sources */ = {isa = PBXBuildFile; fileRef = 830595D7277EEAA500EBFAAE /* ffmpeg_decoder_custom_mp4.c */; }; 8306B08520984518000302D4 /* yamaha_decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 8306B08220984517000302D4 /* yamaha_decoder.c */; }; 8306B08620984518000302D4 /* fadpcm_decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 8306B08320984517000302D4 /* fadpcm_decoder.c */; }; - 8306B0A220984552000302D4 /* blocked_bdsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 8306B0872098454C000302D4 /* blocked_bdsp.c */; }; 8306B0A320984552000302D4 /* blocked_ast.c in Sources */ = {isa = PBXBuildFile; fileRef = 8306B0882098454C000302D4 /* blocked_ast.c */; }; 8306B0A420984552000302D4 /* segmented.c in Sources */ = {isa = PBXBuildFile; fileRef = 8306B0892098454D000302D4 /* segmented.c */; }; 8306B0A520984552000302D4 /* blocked_ea_wve_au00.c in Sources */ = {isa = PBXBuildFile; fileRef = 8306B08A2098454D000302D4 /* blocked_ea_wve_au00.c */; }; @@ -100,7 +99,6 @@ 831BA61F1EAC61A500CF89B0 /* cxs.c in Sources */ = {isa = PBXBuildFile; fileRef = 831BA6151EAC61A500CF89B0 /* cxs.c */; }; 831BA6211EAC61A500CF89B0 /* pasx.c in Sources */ = {isa = PBXBuildFile; fileRef = 831BA6171EAC61A500CF89B0 /* pasx.c */; }; 831BA6281EAC61CB00CF89B0 /* coding_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 831BA6221EAC61CB00CF89B0 /* coding_utils.c */; }; - 8322ECE7240268BB009E9429 /* raw_al.c in Sources */ = {isa = PBXBuildFile; fileRef = 8322ECE6240268BA009E9429 /* raw_al.c */; }; 832389501D2246C300482226 /* hca.c in Sources */ = {isa = PBXBuildFile; fileRef = 8323894F1D2246C300482226 /* hca.c */; }; 832389521D224C0800482226 /* hca_decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 832389511D224C0800482226 /* hca_decoder.c */; }; 83256BC8286662840036D9C0 /* libmpg123.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83256BC7286662610036D9C0 /* libmpg123.0.dylib */; }; @@ -239,7 +237,6 @@ 8349A9111FE6258200E26435 /* bar_streamfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 8349A8F81FE6257E00E26435 /* bar_streamfile.h */; }; 8349A9121FE6258200E26435 /* vsf_tta.c in Sources */ = {isa = PBXBuildFile; fileRef = 8349A8F91FE6257E00E26435 /* vsf_tta.c */; }; 8349A9141FE6258200E26435 /* omu.c in Sources */ = {isa = PBXBuildFile; fileRef = 8349A8FB1FE6257F00E26435 /* omu.c */; }; - 8349A9151FE6258200E26435 /* ps2_xa2_rrp.c in Sources */ = {isa = PBXBuildFile; fileRef = 8349A8FC1FE6257F00E26435 /* ps2_xa2_rrp.c */; }; 8349A9161FE6258200E26435 /* flx.c in Sources */ = {isa = PBXBuildFile; fileRef = 8349A8FD1FE6257F00E26435 /* flx.c */; }; 8349A9171FE6258200E26435 /* pc_adp_otns.c in Sources */ = {isa = PBXBuildFile; fileRef = 8349A8FE1FE6257F00E26435 /* pc_adp_otns.c */; }; 8349A9181FE6258200E26435 /* ea_1snh.c in Sources */ = {isa = PBXBuildFile; fileRef = 8349A8FF1FE6258000E26435 /* ea_1snh.c */; }; @@ -380,7 +377,6 @@ 836F6F7C18BDC2190095E648 /* dc_kcey.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E4018BDC2180095E648 /* dc_kcey.c */; }; 836F6F7D18BDC2190095E648 /* dc_str.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E4118BDC2180095E648 /* dc_str.c */; }; 836F6F7F18BDC2190095E648 /* dmsg_segh.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E4318BDC2180095E648 /* dmsg_segh.c */; }; - 836F6F8018BDC2190095E648 /* dsp_bdsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E4418BDC2180095E648 /* dsp_bdsp.c */; }; 836F6F8218BDC2190095E648 /* ea_schl.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E4618BDC2180095E648 /* ea_schl.c */; }; 836F6F8518BDC2190095E648 /* exakt_sc.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E4918BDC2180095E648 /* exakt_sc.c */; }; 836F6F8618BDC2190095E648 /* excitebots.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E4A18BDC2180095E648 /* excitebots.c */; }; @@ -413,7 +409,6 @@ 836F6FA518BDC2190095E648 /* nds_rrds.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E6918BDC2180095E648 /* nds_rrds.c */; }; 836F6FA718BDC2190095E648 /* nds_strm.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E6B18BDC2180095E648 /* nds_strm.c */; }; 836F6FA918BDC2190095E648 /* ngc_adpdtk.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E6D18BDC2180095E648 /* ngc_adpdtk.c */; }; - 836F6FAA18BDC2190095E648 /* ngc_bh2pcm.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E6E18BDC2180095E648 /* ngc_bh2pcm.c */; }; 836F6FAD18BDC2190095E648 /* ngc_dsp_konami.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E7118BDC2180095E648 /* ngc_dsp_konami.c */; }; 836F6FAE18BDC2190095E648 /* ngc_dsp_mpds.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E7218BDC2180095E648 /* ngc_dsp_mpds.c */; }; 836F6FAF18BDC2190095E648 /* ngc_dsp_std.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E7318BDC2180095E648 /* ngc_dsp_std.c */; }; @@ -425,7 +420,7 @@ 836F6FB618BDC2190095E648 /* ngc_sck_dsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E7A18BDC2180095E648 /* ngc_sck_dsp.c */; }; 836F6FB718BDC2190095E648 /* ngc_ssm.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E7B18BDC2180095E648 /* ngc_ssm.c */; }; 836F6FB818BDC2190095E648 /* ngc_tydsp.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E7C18BDC2180095E648 /* ngc_tydsp.c */; }; - 836F6FBA18BDC2190095E648 /* ngc_ymf.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E7E18BDC2180095E648 /* ngc_ymf.c */; }; + 836F6FBA18BDC2190095E648 /* ymf.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E7E18BDC2180095E648 /* ymf.c */; }; 836F6FBD18BDC2190095E648 /* nwa.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E8118BDC2180095E648 /* nwa.c */; }; 836F6FBF18BDC2190095E648 /* otm.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E8318BDC2180095E648 /* otm.c */; }; 836F6FC018BDC2190095E648 /* p3d.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E8418BDC2180095E648 /* p3d.c */; }; @@ -440,44 +435,38 @@ 836F6FD118BDC2190095E648 /* ps2_bg00.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E9518BDC2180095E648 /* ps2_bg00.c */; }; 836F6FD218BDC2190095E648 /* ps2_bmdx.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E9618BDC2180095E648 /* ps2_bmdx.c */; }; 836F6FD418BDC2190095E648 /* hxd.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E9818BDC2180095E648 /* hxd.c */; }; - 836F6FD518BDC2190095E648 /* ps2_enth.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E9918BDC2180095E648 /* ps2_enth.c */; }; + 836F6FD518BDC2190095E648 /* lp_ap_lep.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E9918BDC2180095E648 /* lp_ap_lep.c */; }; 836F6FD718BDC2190095E648 /* ps2_filp.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E9B18BDC2180095E648 /* ps2_filp.c */; }; 836F6FD818BDC2190095E648 /* ps2_gbts.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E9C18BDC2180095E648 /* ps2_gbts.c */; }; 836F6FD918BDC2190095E648 /* ps2_gcm.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E9D18BDC2180095E648 /* ps2_gcm.c */; }; 836F6FDA18BDC2190095E648 /* ps2_hgc1.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E9E18BDC2180095E648 /* ps2_hgc1.c */; }; 836F6FDB18BDC2190095E648 /* ps2_hsf.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6E9F18BDC2180095E648 /* ps2_hsf.c */; }; 836F6FDC18BDC2190095E648 /* ps2_iab.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EA018BDC2180095E648 /* ps2_iab.c */; }; - 836F6FDE18BDC2190095E648 /* ps2_ild.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EA218BDC2180095E648 /* ps2_ild.c */; }; + 836F6FDE18BDC2190095E648 /* ild.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EA218BDC2180095E648 /* ild.c */; }; 836F6FE018BDC2190095E648 /* ps2_joe.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EA418BDC2180095E648 /* ps2_joe.c */; }; 836F6FE218BDC2190095E648 /* ps2_kces.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EA618BDC2180095E648 /* ps2_kces.c */; }; - 836F6FE418BDC2190095E648 /* ps2_leg.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EA818BDC2180095E648 /* ps2_leg.c */; }; 836F6FE618BDC2190095E648 /* ps2_mcg.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EAA18BDC2180095E648 /* ps2_mcg.c */; }; 836F6FE818BDC2190095E648 /* ps2_mic.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EAC18BDC2180095E648 /* ps2_mic.c */; }; 836F6FE918BDC2190095E648 /* ps2_mihb.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EAD18BDC2180095E648 /* ps2_mihb.c */; }; - 836F6FEA18BDC2190095E648 /* ps2_msa.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EAE18BDC2180095E648 /* ps2_msa.c */; }; 836F6FEE18BDC2190095E648 /* ps2_p2bt.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EB218BDC2180095E648 /* ps2_p2bt.c */; }; - 836F6FEF18BDC2190095E648 /* ps2_pnb.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EB318BDC2180095E648 /* ps2_pnb.c */; }; 836F6FF218BDC2190095E648 /* ps2_rnd.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EB618BDC2180095E648 /* ps2_rnd.c */; }; - 836F6FF318BDC2190095E648 /* ps2_rstm.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EB718BDC2180095E648 /* ps2_rstm.c */; }; - 836F6FF418BDC2190095E648 /* rws.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EB818BDC2180095E648 /* rws.c */; }; + 836F6FF418BDC2190095E648 /* rws_80d.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EB818BDC2180095E648 /* rws_80d.c */; }; 836F6FF618BDC2190095E648 /* ster.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EBA18BDC2180095E648 /* ster.c */; }; 836F6FF718BDC2190095E648 /* ps2_sl3.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EBB18BDC2180095E648 /* ps2_sl3.c */; }; - 836F6FF818BDC2190095E648 /* ps2_smpl.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EBC18BDC2180095E648 /* ps2_smpl.c */; }; + 836F6FF818BDC2190095E648 /* smpl.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EBC18BDC2180095E648 /* smpl.c */; }; 836F6FF918BDC2190095E648 /* ps2_snd.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EBD18BDC2180095E648 /* ps2_snd.c */; }; 836F6FFA18BDC2190095E648 /* spm.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EBE18BDC2190095E648 /* spm.c */; }; 836F6FFB18BDC2190095E648 /* ps2_sps.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EBF18BDC2190095E648 /* ps2_sps.c */; }; 836F700118BDC2190095E648 /* ps2_tec.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EC518BDC2190095E648 /* ps2_tec.c */; }; - 836F700218BDC2190095E648 /* ps2_tk5.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EC618BDC2190095E648 /* ps2_tk5.c */; }; 836F700418BDC2190095E648 /* ps2_vas.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EC818BDC2190095E648 /* ps2_vas.c */; }; 836F700518BDC2190095E648 /* ps2_vbk.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EC918BDC2190095E648 /* ps2_vbk.c */; }; 836F700618BDC2190095E648 /* vgs_ps.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6ECA18BDC2190095E648 /* vgs_ps.c */; }; 836F700718BDC2190095E648 /* ps2_vgv.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6ECB18BDC2190095E648 /* ps2_vgv.c */; }; 836F700818BDC2190095E648 /* ps2_vms.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6ECC18BDC2190095E648 /* ps2_vms.c */; }; - 836F700918BDC2190095E648 /* ps2_voi.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6ECD18BDC2190095E648 /* ps2_voi.c */; }; + 836F700918BDC2190095E648 /* voi.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6ECD18BDC2190095E648 /* voi.c */; }; 836F700B18BDC2190095E648 /* ps2_wad.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6ECF18BDC2190095E648 /* ps2_wad.c */; }; 836F700C18BDC2190095E648 /* ps2_wb.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6ED018BDC2190095E648 /* ps2_wb.c */; }; 836F700D18BDC2190095E648 /* ps2_wmus.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6ED118BDC2190095E648 /* ps2_wmus.c */; }; - 836F700E18BDC2190095E648 /* ps2_xa2.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6ED218BDC2190095E648 /* ps2_xa2.c */; }; 836F700F18BDC2190095E648 /* ps2_xa30.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6ED318BDC2190095E648 /* ps2_xa30.c */; }; 836F701518BDC2190095E648 /* ps3_past.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6ED918BDC2190095E648 /* ps3_past.c */; }; 836F701E18BDC2190095E648 /* redspark.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EE218BDC2190095E648 /* redspark.c */; }; @@ -485,10 +474,10 @@ 836F702018BDC2190095E648 /* rkv.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EE418BDC2190095E648 /* rkv.c */; }; 836F702118BDC2190095E648 /* rs03.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EE518BDC2190095E648 /* rs03.c */; }; 836F702218BDC2190095E648 /* rsd.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EE618BDC2190095E648 /* rsd.c */; }; - 836F702318BDC2190095E648 /* rsf.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EE718BDC2190095E648 /* rsf.c */; }; + 836F702318BDC2190095E648 /* raw_rsf.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EE718BDC2190095E648 /* raw_rsf.c */; }; 836F702418BDC2190095E648 /* rwsd.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EE818BDC2190095E648 /* rwsd.c */; }; - 836F702518BDC2190095E648 /* rwx.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EE918BDC2190095E648 /* rwx.c */; }; - 836F702618BDC2190095E648 /* s14_sss.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EEA18BDC2190095E648 /* s14_sss.c */; }; + 836F702518BDC2190095E648 /* rwax.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EE918BDC2190095E648 /* rwax.c */; }; + 836F702618BDC2190095E648 /* raw_s14_sss.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EEA18BDC2190095E648 /* raw_s14_sss.c */; }; 836F702718BDC2190095E648 /* sat_baka.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EEB18BDC2190095E648 /* sat_baka.c */; }; 836F702818BDC2190095E648 /* sat_dvi.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EEC18BDC2190095E648 /* sat_dvi.c */; }; 836F702918BDC2190095E648 /* sat_sap.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6EED18BDC2190095E648 /* sat_sap.c */; }; @@ -512,7 +501,7 @@ 836F703D18BDC2190095E648 /* wii_mus.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6F0118BDC2190095E648 /* wii_mus.c */; }; 836F703E18BDC2190095E648 /* wii_ras.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6F0218BDC2190095E648 /* wii_ras.c */; }; 836F704018BDC2190095E648 /* wii_sng.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6F0418BDC2190095E648 /* wii_sng.c */; }; - 836F704218BDC2190095E648 /* wii_sts.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6F0618BDC2190095E648 /* wii_sts.c */; }; + 836F704218BDC2190095E648 /* sts.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6F0618BDC2190095E648 /* sts.c */; }; 836F704318BDC2190095E648 /* wpd.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6F0718BDC2190095E648 /* wpd.c */; }; 836F704418BDC2190095E648 /* ws_aud.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6F0818BDC2190095E648 /* ws_aud.c */; }; 836F704518BDC2190095E648 /* wvs.c in Sources */ = {isa = PBXBuildFile; fileRef = 836F6F0918BDC2190095E648 /* wvs.c */; }; @@ -604,7 +593,6 @@ 839933602591E8C1001855AF /* ubi_sb_garbage_streamfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 8399335D2591E8C0001855AF /* ubi_sb_garbage_streamfile.h */; }; 839933612591E8C1001855AF /* sbk.c in Sources */ = {isa = PBXBuildFile; fileRef = 8399335E2591E8C0001855AF /* sbk.c */; }; 83997F5B22D9569E00633184 /* rad.c in Sources */ = {isa = PBXBuildFile; fileRef = 83997F5722D9569E00633184 /* rad.c */; }; - 839B54521EEE1D9600048A2D /* ngc_ulw.c in Sources */ = {isa = PBXBuildFile; fileRef = 831BD11F1EEE1CF200198540 /* ngc_ulw.c */; }; 839C3D27270D49FF00E13653 /* lpcm_fb.c in Sources */ = {isa = PBXBuildFile; fileRef = 839C3D22270D49FF00E13653 /* lpcm_fb.c */; }; 839E21E01F2EDAF100EE54D7 /* vorbis_custom_data_fsb.h in Headers */ = {isa = PBXBuildFile; fileRef = 839E21D61F2EDAF000EE54D7 /* vorbis_custom_data_fsb.h */; }; 839E21E11F2EDAF100EE54D7 /* vorbis_custom_decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 839E21D71F2EDAF000EE54D7 /* vorbis_custom_decoder.c */; }; @@ -637,7 +625,7 @@ 83A8BADD256679C5000F5F3F /* wady_decoder.c in Sources */ = {isa = PBXBuildFile; fileRef = 83A8BADC256679C5000F5F3F /* wady_decoder.c */; }; 83A8BADF256679E3000F5F3F /* blocked_xwav.c in Sources */ = {isa = PBXBuildFile; fileRef = 83A8BADE256679E3000F5F3F /* blocked_xwav.c */; }; 83A8BAE525667AA8000F5F3F /* wady.c in Sources */ = {isa = PBXBuildFile; fileRef = 83A8BAE025667AA7000F5F3F /* wady.c */; }; - 83A8BAE625667AA8000F5F3F /* ps2_enth_streamfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A8BAE125667AA7000F5F3F /* ps2_enth_streamfile.h */; }; + 83A8BAE625667AA8000F5F3F /* lp_ap_lep_streamfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 83A8BAE125667AA7000F5F3F /* lp_ap_lep_streamfile.h */; }; 83A8BAE725667AA8000F5F3F /* sdrh.c in Sources */ = {isa = PBXBuildFile; fileRef = 83A8BAE225667AA7000F5F3F /* sdrh.c */; }; 83A8BAE825667AA8000F5F3F /* xwav.c in Sources */ = {isa = PBXBuildFile; fileRef = 83A8BAE325667AA7000F5F3F /* xwav.c */; }; 83A8BAE925667AA8000F5F3F /* cpk.c in Sources */ = {isa = PBXBuildFile; fileRef = 83A8BAE425667AA7000F5F3F /* cpk.c */; }; @@ -649,7 +637,7 @@ 83AA5D1E1F6E2F800020821C /* blocked_awc.c in Sources */ = {isa = PBXBuildFile; fileRef = 83AA5D1B1F6E2F7F0020821C /* blocked_awc.c */; }; 83AA5D241F6E2F9C0020821C /* awc.c in Sources */ = {isa = PBXBuildFile; fileRef = 83AA5D201F6E2F9B0020821C /* awc.c */; }; 83AA5D251F6E2F9C0020821C /* hca_keys.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AA5D211F6E2F9C0020821C /* hca_keys.h */; }; - 83AA5D271F6E2F9C0020821C /* stm.c in Sources */ = {isa = PBXBuildFile; fileRef = 83AA5D231F6E2F9C0020821C /* stm.c */; }; + 83AA5D271F6E2F9C0020821C /* stma.c in Sources */ = {isa = PBXBuildFile; fileRef = 83AA5D231F6E2F9C0020821C /* stma.c */; }; 83AA7D17279EBD0400087AA4 /* libavcodec.59.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D13279EBCF900087AA4 /* libavcodec.59.dylib */; }; 83AA7D18279EBD0900087AA4 /* libavformat.59.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D14279EBCF900087AA4 /* libavformat.59.dylib */; }; 83AA7D19279EBD0B00087AA4 /* libavutil.57.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 83AA7D16279EBCF900087AA4 /* libavutil.57.dylib */; }; @@ -705,7 +693,7 @@ 83D2007F248DDB770048BD24 /* mups.c in Sources */ = {isa = PBXBuildFile; fileRef = 83D20077248DDB770048BD24 /* mups.c */; }; 83D20080248DDB770048BD24 /* sadf.c in Sources */ = {isa = PBXBuildFile; fileRef = 83D20078248DDB770048BD24 /* sadf.c */; }; 83D20081248DDB770048BD24 /* sadl.c in Sources */ = {isa = PBXBuildFile; fileRef = 83D20079248DDB770048BD24 /* sadl.c */; }; - 83D26A7A26E66D98001A9475 /* adp_bos.c in Sources */ = {isa = PBXBuildFile; fileRef = 83D26A7626E66D98001A9475 /* adp_bos.c */; }; + 83D26A7A26E66D98001A9475 /* adp_wildfire.c in Sources */ = {isa = PBXBuildFile; fileRef = 83D26A7626E66D98001A9475 /* adp_wildfire.c */; }; 83D26A8126E66DC2001A9475 /* log.c in Sources */ = {isa = PBXBuildFile; fileRef = 83D26A7D26E66DC2001A9475 /* log.c */; }; 83D26A8226E66DC2001A9475 /* chunks.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D26A7E26E66DC2001A9475 /* chunks.h */; }; 83D26A8326E66DC2001A9475 /* log.h in Headers */ = {isa = PBXBuildFile; fileRef = 83D26A7F26E66DC2001A9475 /* log.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -740,6 +728,15 @@ 83F2CCE525A5B41600F46FA8 /* acx.c in Sources */ = {isa = PBXBuildFile; fileRef = 83F2CCE125A5B41600F46FA8 /* acx.c */; }; 83F5F8831908D0A400C8E65F /* fsb5.c in Sources */ = {isa = PBXBuildFile; fileRef = 83F5F8821908D0A400C8E65F /* fsb5.c */; }; 83FB239127B14696003F3062 /* mpeg.c in Sources */ = {isa = PBXBuildFile; fileRef = 83FB238D27B14696003F3062 /* mpeg.c */; }; + 83FBB1712A4FF4EC00CD0580 /* xa2_acclaim.c in Sources */ = {isa = PBXBuildFile; fileRef = 83FBB16E2A4FF4EC00CD0580 /* xa2_acclaim.c */; }; + 83FBB1722A4FF4EC00CD0580 /* ego_dic.c in Sources */ = {isa = PBXBuildFile; fileRef = 83FBB16F2A4FF4EC00CD0580 /* ego_dic.c */; }; + 83FBB1732A4FF4EC00CD0580 /* awd.c in Sources */ = {isa = PBXBuildFile; fileRef = 83FBB1702A4FF4EC00CD0580 /* awd.c */; }; + 83FBB1752A4FF59E00CD0580 /* pwb.c in Sources */ = {isa = PBXBuildFile; fileRef = 83FBB1742A4FF59E00CD0580 /* pwb.c */; }; + 83FBB1782A4FF71B00CD0580 /* rws_809.c in Sources */ = {isa = PBXBuildFile; fileRef = 83FBB1762A4FF71B00CD0580 /* rws_809.c */; }; + 83FBB1792A4FF71B00CD0580 /* rstm_rockstar.c in Sources */ = {isa = PBXBuildFile; fileRef = 83FBB1772A4FF71B00CD0580 /* rstm_rockstar.c */; }; + 83FBB17C2A4FF87200CD0580 /* sf_utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 83FBB17A2A4FF87200CD0580 /* sf_utils.h */; }; + 83FBB17D2A4FF87200CD0580 /* sf_utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 83FBB17B2A4FF87200CD0580 /* sf_utils.c */; }; + 83FBB17F2A4FF94C00CD0580 /* msa.c in Sources */ = {isa = PBXBuildFile; fileRef = 83FBB17E2A4FF94C00CD0580 /* msa.c */; }; 83FBD506235D31F800D35BCD /* riff_ogg_streamfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 83FBD502235D31F700D35BCD /* riff_ogg_streamfile.h */; }; 83FC176D23AC58D100E1025F /* xma_ue3.c in Sources */ = {isa = PBXBuildFile; fileRef = 83FC176A23AC58D100E1025F /* xma_ue3.c */; }; 83FC176E23AC58D100E1025F /* csb.c in Sources */ = {isa = PBXBuildFile; fileRef = 83FC176B23AC58D100E1025F /* csb.c */; }; @@ -868,7 +865,6 @@ 830595D7277EEAA500EBFAAE /* ffmpeg_decoder_custom_mp4.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffmpeg_decoder_custom_mp4.c; sourceTree = ""; }; 8306B08220984517000302D4 /* yamaha_decoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yamaha_decoder.c; sourceTree = ""; }; 8306B08320984517000302D4 /* fadpcm_decoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fadpcm_decoder.c; sourceTree = ""; }; - 8306B0872098454C000302D4 /* blocked_bdsp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = blocked_bdsp.c; sourceTree = ""; }; 8306B0882098454C000302D4 /* blocked_ast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = blocked_ast.c; sourceTree = ""; }; 8306B0892098454D000302D4 /* segmented.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = segmented.c; sourceTree = ""; }; 8306B08A2098454D000302D4 /* blocked_ea_wve_au00.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = blocked_ea_wve_au00.c; sourceTree = ""; }; @@ -941,8 +937,6 @@ 831BA6151EAC61A500CF89B0 /* cxs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cxs.c; sourceTree = ""; }; 831BA6171EAC61A500CF89B0 /* pasx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pasx.c; sourceTree = ""; }; 831BA6221EAC61CB00CF89B0 /* coding_utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = coding_utils.c; sourceTree = ""; }; - 831BD11F1EEE1CF200198540 /* ngc_ulw.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ngc_ulw.c; sourceTree = ""; }; - 8322ECE6240268BA009E9429 /* raw_al.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = raw_al.c; sourceTree = ""; }; 8323894F1D2246C300482226 /* hca.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hca.c; sourceTree = ""; }; 832389511D224C0800482226 /* hca_decoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hca_decoder.c; sourceTree = ""; }; 83256BC7286662610036D9C0 /* libmpg123.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libmpg123.0.dylib; sourceTree = ""; }; @@ -1081,7 +1075,6 @@ 8349A8F81FE6257E00E26435 /* bar_streamfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bar_streamfile.h; sourceTree = ""; }; 8349A8F91FE6257E00E26435 /* vsf_tta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vsf_tta.c; sourceTree = ""; }; 8349A8FB1FE6257F00E26435 /* omu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = omu.c; sourceTree = ""; }; - 8349A8FC1FE6257F00E26435 /* ps2_xa2_rrp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_xa2_rrp.c; sourceTree = ""; }; 8349A8FD1FE6257F00E26435 /* flx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = flx.c; sourceTree = ""; }; 8349A8FE1FE6257F00E26435 /* pc_adp_otns.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pc_adp_otns.c; sourceTree = ""; }; 8349A8FF1FE6258000E26435 /* ea_1snh.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ea_1snh.c; sourceTree = ""; }; @@ -1223,7 +1216,6 @@ 836F6E4018BDC2180095E648 /* dc_kcey.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dc_kcey.c; sourceTree = ""; }; 836F6E4118BDC2180095E648 /* dc_str.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dc_str.c; sourceTree = ""; }; 836F6E4318BDC2180095E648 /* dmsg_segh.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dmsg_segh.c; sourceTree = ""; }; - 836F6E4418BDC2180095E648 /* dsp_bdsp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dsp_bdsp.c; sourceTree = ""; }; 836F6E4618BDC2180095E648 /* ea_schl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ea_schl.c; sourceTree = ""; }; 836F6E4918BDC2180095E648 /* exakt_sc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = exakt_sc.c; sourceTree = ""; }; 836F6E4A18BDC2180095E648 /* excitebots.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = excitebots.c; sourceTree = ""; }; @@ -1256,7 +1248,6 @@ 836F6E6918BDC2180095E648 /* nds_rrds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nds_rrds.c; sourceTree = ""; }; 836F6E6B18BDC2180095E648 /* nds_strm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nds_strm.c; sourceTree = ""; }; 836F6E6D18BDC2180095E648 /* ngc_adpdtk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_adpdtk.c; sourceTree = ""; }; - 836F6E6E18BDC2180095E648 /* ngc_bh2pcm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_bh2pcm.c; sourceTree = ""; }; 836F6E7118BDC2180095E648 /* ngc_dsp_konami.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_dsp_konami.c; sourceTree = ""; }; 836F6E7218BDC2180095E648 /* ngc_dsp_mpds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_dsp_mpds.c; sourceTree = ""; }; 836F6E7318BDC2180095E648 /* ngc_dsp_std.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_dsp_std.c; sourceTree = ""; }; @@ -1268,7 +1259,7 @@ 836F6E7A18BDC2180095E648 /* ngc_sck_dsp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_sck_dsp.c; sourceTree = ""; }; 836F6E7B18BDC2180095E648 /* ngc_ssm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_ssm.c; sourceTree = ""; }; 836F6E7C18BDC2180095E648 /* ngc_tydsp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_tydsp.c; sourceTree = ""; }; - 836F6E7E18BDC2180095E648 /* ngc_ymf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_ymf.c; sourceTree = ""; }; + 836F6E7E18BDC2180095E648 /* ymf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ymf.c; sourceTree = ""; }; 836F6E8118BDC2180095E648 /* nwa.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nwa.c; sourceTree = ""; }; 836F6E8318BDC2180095E648 /* otm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = otm.c; sourceTree = ""; }; 836F6E8418BDC2180095E648 /* p3d.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = p3d.c; sourceTree = ""; }; @@ -1283,44 +1274,38 @@ 836F6E9518BDC2180095E648 /* ps2_bg00.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_bg00.c; sourceTree = ""; }; 836F6E9618BDC2180095E648 /* ps2_bmdx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_bmdx.c; sourceTree = ""; }; 836F6E9818BDC2180095E648 /* hxd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hxd.c; sourceTree = ""; }; - 836F6E9918BDC2180095E648 /* ps2_enth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_enth.c; sourceTree = ""; }; + 836F6E9918BDC2180095E648 /* lp_ap_lep.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lp_ap_lep.c; sourceTree = ""; }; 836F6E9B18BDC2180095E648 /* ps2_filp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_filp.c; sourceTree = ""; }; 836F6E9C18BDC2180095E648 /* ps2_gbts.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_gbts.c; sourceTree = ""; }; 836F6E9D18BDC2180095E648 /* ps2_gcm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_gcm.c; sourceTree = ""; }; 836F6E9E18BDC2180095E648 /* ps2_hgc1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_hgc1.c; sourceTree = ""; }; 836F6E9F18BDC2180095E648 /* ps2_hsf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_hsf.c; sourceTree = ""; }; 836F6EA018BDC2180095E648 /* ps2_iab.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_iab.c; sourceTree = ""; }; - 836F6EA218BDC2180095E648 /* ps2_ild.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_ild.c; sourceTree = ""; }; + 836F6EA218BDC2180095E648 /* ild.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ild.c; sourceTree = ""; }; 836F6EA418BDC2180095E648 /* ps2_joe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_joe.c; sourceTree = ""; }; 836F6EA618BDC2180095E648 /* ps2_kces.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_kces.c; sourceTree = ""; }; - 836F6EA818BDC2180095E648 /* ps2_leg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_leg.c; sourceTree = ""; }; 836F6EAA18BDC2180095E648 /* ps2_mcg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_mcg.c; sourceTree = ""; }; 836F6EAC18BDC2180095E648 /* ps2_mic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_mic.c; sourceTree = ""; }; 836F6EAD18BDC2180095E648 /* ps2_mihb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_mihb.c; sourceTree = ""; }; - 836F6EAE18BDC2180095E648 /* ps2_msa.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_msa.c; sourceTree = ""; }; 836F6EB218BDC2180095E648 /* ps2_p2bt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_p2bt.c; sourceTree = ""; }; - 836F6EB318BDC2180095E648 /* ps2_pnb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_pnb.c; sourceTree = ""; }; 836F6EB618BDC2180095E648 /* ps2_rnd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_rnd.c; sourceTree = ""; }; - 836F6EB718BDC2180095E648 /* ps2_rstm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_rstm.c; sourceTree = ""; }; - 836F6EB818BDC2180095E648 /* rws.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rws.c; sourceTree = ""; }; + 836F6EB818BDC2180095E648 /* rws_80d.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rws_80d.c; sourceTree = ""; }; 836F6EBA18BDC2180095E648 /* ster.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ster.c; sourceTree = ""; }; 836F6EBB18BDC2180095E648 /* ps2_sl3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_sl3.c; sourceTree = ""; }; - 836F6EBC18BDC2180095E648 /* ps2_smpl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_smpl.c; sourceTree = ""; }; + 836F6EBC18BDC2180095E648 /* smpl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = smpl.c; sourceTree = ""; }; 836F6EBD18BDC2180095E648 /* ps2_snd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_snd.c; sourceTree = ""; }; 836F6EBE18BDC2190095E648 /* spm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spm.c; sourceTree = ""; }; 836F6EBF18BDC2190095E648 /* ps2_sps.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_sps.c; sourceTree = ""; }; 836F6EC518BDC2190095E648 /* ps2_tec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_tec.c; sourceTree = ""; }; - 836F6EC618BDC2190095E648 /* ps2_tk5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_tk5.c; sourceTree = ""; }; 836F6EC818BDC2190095E648 /* ps2_vas.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_vas.c; sourceTree = ""; }; 836F6EC918BDC2190095E648 /* ps2_vbk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_vbk.c; sourceTree = ""; }; 836F6ECA18BDC2190095E648 /* vgs_ps.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vgs_ps.c; sourceTree = ""; }; 836F6ECB18BDC2190095E648 /* ps2_vgv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_vgv.c; sourceTree = ""; }; 836F6ECC18BDC2190095E648 /* ps2_vms.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_vms.c; sourceTree = ""; }; - 836F6ECD18BDC2190095E648 /* ps2_voi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_voi.c; sourceTree = ""; }; + 836F6ECD18BDC2190095E648 /* voi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = voi.c; sourceTree = ""; }; 836F6ECF18BDC2190095E648 /* ps2_wad.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_wad.c; sourceTree = ""; }; 836F6ED018BDC2190095E648 /* ps2_wb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_wb.c; sourceTree = ""; }; 836F6ED118BDC2190095E648 /* ps2_wmus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_wmus.c; sourceTree = ""; }; - 836F6ED218BDC2190095E648 /* ps2_xa2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_xa2.c; sourceTree = ""; }; 836F6ED318BDC2190095E648 /* ps2_xa30.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_xa30.c; sourceTree = ""; }; 836F6ED918BDC2190095E648 /* ps3_past.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps3_past.c; sourceTree = ""; }; 836F6EE218BDC2190095E648 /* redspark.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = redspark.c; sourceTree = ""; }; @@ -1328,10 +1313,10 @@ 836F6EE418BDC2190095E648 /* rkv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rkv.c; sourceTree = ""; }; 836F6EE518BDC2190095E648 /* rs03.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rs03.c; sourceTree = ""; }; 836F6EE618BDC2190095E648 /* rsd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rsd.c; sourceTree = ""; }; - 836F6EE718BDC2190095E648 /* rsf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rsf.c; sourceTree = ""; }; + 836F6EE718BDC2190095E648 /* raw_rsf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = raw_rsf.c; sourceTree = ""; }; 836F6EE818BDC2190095E648 /* rwsd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rwsd.c; sourceTree = ""; }; - 836F6EE918BDC2190095E648 /* rwx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rwx.c; sourceTree = ""; }; - 836F6EEA18BDC2190095E648 /* s14_sss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s14_sss.c; sourceTree = ""; }; + 836F6EE918BDC2190095E648 /* rwax.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rwax.c; sourceTree = ""; }; + 836F6EEA18BDC2190095E648 /* raw_s14_sss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = raw_s14_sss.c; sourceTree = ""; }; 836F6EEB18BDC2190095E648 /* sat_baka.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sat_baka.c; sourceTree = ""; }; 836F6EEC18BDC2190095E648 /* sat_dvi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sat_dvi.c; sourceTree = ""; }; 836F6EED18BDC2190095E648 /* sat_sap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sat_sap.c; sourceTree = ""; }; @@ -1355,7 +1340,7 @@ 836F6F0118BDC2190095E648 /* wii_mus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wii_mus.c; sourceTree = ""; }; 836F6F0218BDC2190095E648 /* wii_ras.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wii_ras.c; sourceTree = ""; }; 836F6F0418BDC2190095E648 /* wii_sng.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wii_sng.c; sourceTree = ""; }; - 836F6F0618BDC2190095E648 /* wii_sts.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wii_sts.c; sourceTree = ""; }; + 836F6F0618BDC2190095E648 /* sts.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sts.c; sourceTree = ""; }; 836F6F0718BDC2190095E648 /* wpd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wpd.c; sourceTree = ""; }; 836F6F0818BDC2190095E648 /* ws_aud.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ws_aud.c; sourceTree = ""; }; 836F6F0918BDC2190095E648 /* wvs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wvs.c; sourceTree = ""; }; @@ -1481,7 +1466,7 @@ 83A8BADC256679C5000F5F3F /* wady_decoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wady_decoder.c; sourceTree = ""; }; 83A8BADE256679E3000F5F3F /* blocked_xwav.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = blocked_xwav.c; sourceTree = ""; }; 83A8BAE025667AA7000F5F3F /* wady.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wady.c; sourceTree = ""; }; - 83A8BAE125667AA7000F5F3F /* ps2_enth_streamfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ps2_enth_streamfile.h; sourceTree = ""; }; + 83A8BAE125667AA7000F5F3F /* lp_ap_lep_streamfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lp_ap_lep_streamfile.h; sourceTree = ""; }; 83A8BAE225667AA7000F5F3F /* sdrh.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sdrh.c; sourceTree = ""; }; 83A8BAE325667AA7000F5F3F /* xwav.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xwav.c; sourceTree = ""; }; 83A8BAE425667AA7000F5F3F /* cpk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cpk.c; sourceTree = ""; }; @@ -1493,7 +1478,7 @@ 83AA5D1B1F6E2F7F0020821C /* blocked_awc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = blocked_awc.c; sourceTree = ""; }; 83AA5D201F6E2F9B0020821C /* awc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = awc.c; sourceTree = ""; }; 83AA5D211F6E2F9C0020821C /* hca_keys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hca_keys.h; sourceTree = ""; }; - 83AA5D231F6E2F9C0020821C /* stm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stm.c; sourceTree = ""; }; + 83AA5D231F6E2F9C0020821C /* stma.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stma.c; sourceTree = ""; }; 83AA7D13279EBCF900087AA4 /* libavcodec.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavcodec.59.dylib; path = ../../ThirdParty/ffmpeg/lib/libavcodec.59.dylib; sourceTree = ""; }; 83AA7D14279EBCF900087AA4 /* libavformat.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavformat.59.dylib; path = ../../ThirdParty/ffmpeg/lib/libavformat.59.dylib; sourceTree = ""; }; 83AA7D15279EBCF900087AA4 /* libswresample.4.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswresample.4.dylib; path = ../../ThirdParty/ffmpeg/lib/libswresample.4.dylib; sourceTree = ""; }; @@ -1549,7 +1534,7 @@ 83D20077248DDB770048BD24 /* mups.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mups.c; sourceTree = ""; }; 83D20078248DDB770048BD24 /* sadf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sadf.c; sourceTree = ""; }; 83D20079248DDB770048BD24 /* sadl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sadl.c; sourceTree = ""; }; - 83D26A7626E66D98001A9475 /* adp_bos.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = adp_bos.c; sourceTree = ""; }; + 83D26A7626E66D98001A9475 /* adp_wildfire.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = adp_wildfire.c; sourceTree = ""; }; 83D26A7D26E66DC2001A9475 /* log.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = log.c; sourceTree = ""; }; 83D26A7E26E66DC2001A9475 /* chunks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chunks.h; sourceTree = ""; }; 83D26A7F26E66DC2001A9475 /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = ""; }; @@ -1582,6 +1567,15 @@ 83F2CCE125A5B41600F46FA8 /* acx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = acx.c; sourceTree = ""; }; 83F5F8821908D0A400C8E65F /* fsb5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fsb5.c; sourceTree = ""; }; 83FB238D27B14696003F3062 /* mpeg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mpeg.c; sourceTree = ""; }; + 83FBB16E2A4FF4EC00CD0580 /* xa2_acclaim.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xa2_acclaim.c; sourceTree = ""; }; + 83FBB16F2A4FF4EC00CD0580 /* ego_dic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ego_dic.c; sourceTree = ""; }; + 83FBB1702A4FF4EC00CD0580 /* awd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = awd.c; sourceTree = ""; }; + 83FBB1742A4FF59E00CD0580 /* pwb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pwb.c; sourceTree = ""; }; + 83FBB1762A4FF71B00CD0580 /* rws_809.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rws_809.c; sourceTree = ""; }; + 83FBB1772A4FF71B00CD0580 /* rstm_rockstar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rstm_rockstar.c; sourceTree = ""; }; + 83FBB17A2A4FF87200CD0580 /* sf_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sf_utils.h; sourceTree = ""; }; + 83FBB17B2A4FF87200CD0580 /* sf_utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sf_utils.c; sourceTree = ""; }; + 83FBB17E2A4FF94C00CD0580 /* msa.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = msa.c; sourceTree = ""; }; 83FBD502235D31F700D35BCD /* riff_ogg_streamfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = riff_ogg_streamfile.h; sourceTree = ""; }; 83FC176A23AC58D100E1025F /* xma_ue3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xma_ue3.c; sourceTree = ""; }; 83FC176B23AC58D100E1025F /* csb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = csb.c; sourceTree = ""; }; @@ -1940,7 +1934,6 @@ 8306B08E2098454E000302D4 /* blocked_adm.c */, 8306B0882098454C000302D4 /* blocked_ast.c */, 83AA5D1B1F6E2F7F0020821C /* blocked_awc.c */, - 8306B0872098454C000302D4 /* blocked_bdsp.c */, 8306B0922098454E000302D4 /* blocked_caf.c */, 8349A8E21FE6253800E26435 /* blocked_dec.c */, 8349A8E31FE6253800E26435 /* blocked_ea_1snh.c */, @@ -2001,8 +1994,8 @@ 836F6E2B18BDC2180095E648 /* acm.c */, 83F2CCE125A5B41600F46FA8 /* acx.c */, 836F46B12820874D005B9B87 /* adm3.c */, - 83D26A7626E66D98001A9475 /* adp_bos.c */, 83AA7F7A2519C042004C5298 /* adp_konami.c */, + 83D26A7626E66D98001A9475 /* adp_wildfire.c */, 834FE0CF215C79E8000A5D3D /* adpcm_capcom.c */, 83852B0A2680247900378854 /* ads_midway.c */, 836F6E8F18BDC2180095E648 /* ads.c */, @@ -2033,6 +2026,7 @@ 83A16D2722D2ADE700B90C4C /* awb.c */, 8306B0C32098458C000302D4 /* awc_xma_streamfile.h */, 83AA5D201F6E2F9B0020821C /* awc.c */, + 83FBB1702A4FF4EC00CD0580 /* awd.c */, 836F6E3618BDC2180095E648 /* baf.c */, 8349A8F81FE6257E00E26435 /* bar_streamfile.h */, 8349A9051FE6258100E26435 /* bar.c */, @@ -2077,7 +2071,6 @@ 83AA7F742519C041004C5298 /* dsb.c */, 8351F32C2212B57000A606E4 /* dsf.c */, 83299FCF1E7660C7003A3242 /* dsp_adx.c */, - 836F6E4418BDC2180095E648 /* dsp_bdsp.c */, 8349A8FF1FE6258000E26435 /* ea_1snh.c */, 83AFABBA23795202002F3947 /* ea_eaac_opus_streamfile.h */, 8306B0BD2098458B000302D4 /* ea_eaac_streamfile.h */, @@ -2088,6 +2081,7 @@ 83EED5D1203A8BC7008BEB45 /* ea_swvr.c */, 8306B0C42098458D000302D4 /* ea_wve_ad10.c */, 8306B0BF2098458C000302D4 /* ea_wve_au00.c */, + 83FBB16F2A4FF4EC00CD0580 /* ego_dic.c */, 83AF2CC826226BA500538240 /* encrypted_bgm_streamfile.h */, 832FC36E278FAE3E0056A860 /* encrypted_mc161_streamfile.h */, 83031ECE243C50DE00C3F3E0 /* encrypted.c */, @@ -2133,6 +2127,7 @@ 8346D97425BF838C00D1A8B0 /* idtech.c */, 8399335C2591E8C0001855AF /* ifs.c */, 83C7280922BC893C00678B4A /* ikm.c */, + 836F6EA218BDC2180095E648 /* ild.c */, 837CEAE623487F2B00E62A4A /* ima.c */, 832BF81121E05149006F50F1 /* imc.c */, 83F1EE2F245D4FC10076E182 /* imuse.c */, @@ -2155,6 +2150,8 @@ 830EBE122004656E0023AA10 /* ktss.c */, 8373342423F60CDB00DE14DC /* kwb.c */, 835B9B8C2730BF2C00F87EE3 /* lopu_fb.c */, + 83A8BAE125667AA7000F5F3F /* lp_ap_lep_streamfile.h */, + 836F6E9918BDC2180095E648 /* lp_ap_lep.c */, 839C3D22270D49FF00E13653 /* lpcm_fb.c */, 835B9B8E2730BF2D00F87EE3 /* lpcm_shade.c */, 8373341F23F60CDB00DE14DC /* lrmd_streamfile.h */, @@ -2172,6 +2169,7 @@ 839FBFF926C354E70016A78A /* mp4_faac.c */, 836F6E6018BDC2180095E648 /* mp4.c */, 83FB238D27B14696003F3062 /* mpeg.c */, + 83FBB17E2A4FF94C00CD0580 /* msa.c */, 8306B0CB2098458E000302D4 /* msb_msh.c */, 832BF81721E0514A006F50F1 /* msf_banpresto.c */, 83C7280D22BC893D00678B4A /* msf_konami.c */, @@ -2198,7 +2196,6 @@ 830165991F256BD000CA0941 /* nds_strm_ffta2.c */, 836F6E6B18BDC2180095E648 /* nds_strm.c */, 836F6E6D18BDC2180095E648 /* ngc_adpdtk.c */, - 836F6E6E18BDC2180095E648 /* ngc_bh2pcm.c */, 836F6E7118BDC2180095E648 /* ngc_dsp_konami.c */, 836F6E7218BDC2180095E648 /* ngc_dsp_mpds.c */, 836F6E7318BDC2180095E648 /* ngc_dsp_std.c */, @@ -2211,8 +2208,6 @@ 836F6E7B18BDC2180095E648 /* ngc_ssm.c */, 8306B0BE2098458C000302D4 /* ngc_str_cauldron.c */, 836F6E7C18BDC2180095E648 /* ngc_tydsp.c */, - 831BD11F1EEE1CF200198540 /* ngc_ulw.c */, - 836F6E7E18BDC2180095E648 /* ngc_ymf.c */, 83C727FC22BC893900678B4A /* nps.c */, 837CEAE223487F2A00E62A4A /* nub.c */, 832BF81B21E0514B006F50F1 /* nus3audio.c */, @@ -2250,53 +2245,43 @@ 836F6E9418BDC2180095E648 /* ps2_b1s.c */, 836F6E9518BDC2180095E648 /* ps2_bg00.c */, 836F6E9618BDC2180095E648 /* ps2_bmdx.c */, - 83A8BAE125667AA7000F5F3F /* ps2_enth_streamfile.h */, - 836F6E9918BDC2180095E648 /* ps2_enth.c */, 836F6E9B18BDC2180095E648 /* ps2_filp.c */, 836F6E9C18BDC2180095E648 /* ps2_gbts.c */, 836F6E9D18BDC2180095E648 /* ps2_gcm.c */, 836F6E9E18BDC2180095E648 /* ps2_hgc1.c */, 836F6E9F18BDC2180095E648 /* ps2_hsf.c */, 836F6EA018BDC2180095E648 /* ps2_iab.c */, - 836F6EA218BDC2180095E648 /* ps2_ild.c */, 836F6EA418BDC2180095E648 /* ps2_joe.c */, 836F6EA618BDC2180095E648 /* ps2_kces.c */, - 836F6EA818BDC2180095E648 /* ps2_leg.c */, 836F6EAA18BDC2180095E648 /* ps2_mcg.c */, 836F6EAC18BDC2180095E648 /* ps2_mic.c */, 836F6EAD18BDC2180095E648 /* ps2_mihb.c */, - 836F6EAE18BDC2180095E648 /* ps2_msa.c */, 836F6EB218BDC2180095E648 /* ps2_p2bt.c */, 8349A8F21FE6257D00E26435 /* ps2_pcm.c */, - 836F6EB318BDC2180095E648 /* ps2_pnb.c */, 836F6EB618BDC2180095E648 /* ps2_rnd.c */, - 836F6EB718BDC2180095E648 /* ps2_rstm.c */, 836F6EBB18BDC2180095E648 /* ps2_sl3.c */, - 836F6EBC18BDC2180095E648 /* ps2_smpl.c */, 836F6EBD18BDC2180095E648 /* ps2_snd.c */, 836F6EBF18BDC2190095E648 /* ps2_sps.c */, 836F6EC518BDC2190095E648 /* ps2_tec.c */, - 836F6EC618BDC2190095E648 /* ps2_tk5.c */, 832BF80D21E05148006F50F1 /* ps2_va3.c */, 836F6EC818BDC2190095E648 /* ps2_vas.c */, 836F6EC918BDC2190095E648 /* ps2_vbk.c */, 831BA6101EAC61A500CF89B0 /* ps2_vds_vdm.c */, 836F6ECB18BDC2190095E648 /* ps2_vgv.c */, 836F6ECC18BDC2190095E648 /* ps2_vms.c */, - 836F6ECD18BDC2190095E648 /* ps2_voi.c */, 836F6ECF18BDC2190095E648 /* ps2_wad.c */, 836F6ED018BDC2190095E648 /* ps2_wb.c */, 836F6ED118BDC2190095E648 /* ps2_wmus.c */, - 8349A8FC1FE6257F00E26435 /* ps2_xa2_rrp.c */, - 836F6ED218BDC2190095E648 /* ps2_xa2.c */, 836F6ED318BDC2190095E648 /* ps2_xa30.c */, 836F6ED918BDC2190095E648 /* ps3_past.c */, 8315868326F586E200803A3A /* psb.c */, 837CEAE823487F2B00E62A4A /* psf.c */, + 83FBB1742A4FF59E00CD0580 /* pwb.c */, 83997F5722D9569E00633184 /* rad.c */, - 8322ECE6240268BA009E9429 /* raw_al.c */, 837CEAED23487F2C00E62A4A /* raw_int.c */, 837CEADD23487F2A00E62A4A /* raw_pcm.c */, + 836F6EE718BDC2190095E648 /* raw_rsf.c */, + 836F6EEA18BDC2190095E648 /* raw_s14_sss.c */, 837CEAEA23487F2B00E62A4A /* raw_snds.c */, 837CEAE723487F2B00E62A4A /* raw_wavm.c */, 836F6EE218BDC2190095E648 /* redspark.c */, @@ -2306,13 +2291,13 @@ 836F6EE418BDC2190095E648 /* rkv.c */, 836F6EE518BDC2190095E648 /* rs03.c */, 836F6EE618BDC2190095E648 /* rsd.c */, - 836F6EE718BDC2190095E648 /* rsf.c */, - 836F6EB818BDC2180095E648 /* rws.c */, + 83FBB1772A4FF71B00CD0580 /* rstm_rockstar.c */, + 836F6EE918BDC2190095E648 /* rwax.c */, + 836F6EB818BDC2180095E648 /* rws_80d.c */, + 83FBB1762A4FF71B00CD0580 /* rws_809.c */, 836F6EE818BDC2190095E648 /* rwsd.c */, - 836F6EE918BDC2190095E648 /* rwx.c */, 83852B092680247900378854 /* rxws.c */, 8383A62B281203C50062E49E /* s3v.c */, - 836F6EEA18BDC2190095E648 /* s14_sss.c */, 83AA7F772519C042004C5298 /* sab_streamfile.h */, 8349A8F11FE6257D00E26435 /* sab.c */, 83D20078248DDB770048BD24 /* sadf.c */, @@ -2338,6 +2323,7 @@ 8306B0D32098458F000302D4 /* smc_smh.c */, 837CEAEB23487F2B00E62A4A /* smk.c */, 83F0AA5C21E2028B004BBC04 /* smp.c */, + 836F6EBC18BDC2180095E648 /* smpl.c */, 8306B0C72098458D000302D4 /* smv.c */, 835559FB2869102B005FE93A /* sndz.c */, 836F6EBE18BDC2190095E648 /* spm.c */, @@ -2354,10 +2340,11 @@ 8317C24826982CC1007DD0B8 /* sspr.c */, 836F6EBA18BDC2180095E648 /* ster.c */, 8306B0C12098458C000302D4 /* sthd.c */, - 83AA5D231F6E2F9C0020821C /* stm.c */, + 83AA5D231F6E2F9C0020821C /* stma.c */, 836F6EF718BDC2190095E648 /* str_snds.c */, 834FE0C2215C79E6000A5D3D /* str_wav.c */, 83C7280722BC893B00678B4A /* strm_abylight.c */, + 836F6F0618BDC2190095E648 /* sts.c */, 83AA7F752519C041004C5298 /* svag_kcet.c */, 83AA7F7B2519C042004C5298 /* svag_snk.c */, 834FE0D7215C79EA000A5D3D /* svg.c */, @@ -2393,6 +2380,7 @@ 836F6EFD18BDC2190095E648 /* vgs.c */, 83031ED7243C510400C3F3E0 /* vid1.c */, 834FE0CE215C79E8000A5D3D /* vis.c */, + 836F6ECD18BDC2190095E648 /* voi.c */, 834FE0D4215C79E9000A5D3D /* vpk.c */, 832BF81821E0514A006F50F1 /* vs_square.c */, 832BF81021E05149006F50F1 /* vs_str.c */, @@ -2412,7 +2400,6 @@ 836F6F0118BDC2190095E648 /* wii_mus.c */, 836F6F0218BDC2190095E648 /* wii_ras.c */, 836F6F0418BDC2190095E648 /* wii_sng.c */, - 836F6F0618BDC2190095E648 /* wii_sts.c */, 836F6F0718BDC2190095E648 /* wpd.c */, 836F6F0818BDC2190095E648 /* ws_aud.c */, 834FE0CB215C79E8000A5D3D /* wsi.c */, @@ -2424,6 +2411,7 @@ 837CEAE523487F2B00E62A4A /* xa_04sw.c */, 837CEADF23487F2A00E62A4A /* xa_xa30.c */, 832BF81521E0514A006F50F1 /* xa.c */, + 83FBB16E2A4FF4EC00CD0580 /* xa2_acclaim.c */, 834FE0D2215C79E9000A5D3D /* xau_konami.c */, 833A7A2D1ED11961003EC53E /* xau.c */, 837CEAEE23487F2C00E62A4A /* xavs_streamfile.h */, @@ -2454,6 +2442,7 @@ 832BF81621E0514A006F50F1 /* xwma.c */, 837CEAE323487F2A00E62A4A /* xwv_valve.c */, 836F6F1418BDC2190095E648 /* ydsp.c */, + 836F6E7E18BDC2180095E648 /* ymf.c */, 836F6F1518BDC2190095E648 /* zsd.c */, 832BF80E21E05149006F50F1 /* zsnd_streamfile.h */, 832BF80F21E05149006F50F1 /* zsnd.c */, @@ -2504,6 +2493,8 @@ 833E82F52A2858EF00CD0580 /* reader.c */, 833E82CD2A2856B200CD0580 /* samples_ops.c */, 833E82CE2A2856B200CD0580 /* samples_ops.h */, + 83FBB17B2A4FF87200CD0580 /* sf_utils.c */, + 83FBB17A2A4FF87200CD0580 /* sf_utils.h */, 8339B324280FDF4B0076F74B /* text_reader.c */, 8339B325280FDF4B0076F74B /* text_reader.h */, ); @@ -2565,6 +2556,7 @@ 836F46B8282087A6005B9B87 /* cri_utf.h in Headers */, 83A21F87201D8981000F04B9 /* fsb_keys.h in Headers */, 83E7FD6325EF2B0C00683FD2 /* tac_decoder_lib_data.h in Headers */, + 83FBB17C2A4FF87200CD0580 /* sf_utils.h in Headers */, 832FC36C278FA4CB0056A860 /* ubi_ckd_cwav_streamfile.h in Headers */, 83E7FD6125EF2B0C00683FD2 /* tac_decoder_lib.h in Headers */, 834FE0EC215C79ED000A5D3D /* kma9_streamfile.h in Headers */, @@ -2645,7 +2637,7 @@ 836F6F9A18BDC2190095E648 /* meta.h in Headers */, 8319017B28F67EE100B70711 /* miniz.h in Headers */, 833E82FA2A28595A00CD0580 /* bitstream_lsb.h in Headers */, - 83A8BAE625667AA8000F5F3F /* ps2_enth_streamfile.h in Headers */, + 83A8BAE625667AA8000F5F3F /* lp_ap_lep_streamfile.h in Headers */, 83256CE428666C620036D9C0 /* abi_align.h in Headers */, 8306B0D820984590000302D4 /* ea_eaac_streamfile.h in Headers */, 837CEB0523487F2C00E62A4A /* sqex_streamfile.h in Headers */, @@ -2848,10 +2840,9 @@ 8349A8DF1FE6251F00E26435 /* vorbis_custom_utils_vid1.c in Sources */, 83A21F8D201D8982000F04B9 /* sqex_sead.c in Sources */, 83EED5D3203A8BC7008BEB45 /* ea_swvr.c in Sources */, - 839B54521EEE1D9600048A2D /* ngc_ulw.c in Sources */, 8306B0EE20984590000302D4 /* smc_smh.c in Sources */, 836F6FAD18BDC2190095E648 /* ngc_dsp_konami.c in Sources */, - 836F6FF818BDC2190095E648 /* ps2_smpl.c in Sources */, + 836F6FF818BDC2190095E648 /* smpl.c in Sources */, 83D1189328B2F33400AF3370 /* vab.c in Sources */, 836F703818BDC2190095E648 /* ubi_ckd.c in Sources */, 8373341B23F60C7B00DE14DC /* g7221_decoder_lib.c in Sources */, @@ -2866,10 +2857,11 @@ 836F6F7D18BDC2190095E648 /* dc_str.c in Sources */, 83A5F75F198DF021009AF94C /* bfwav.c in Sources */, 8373341723F60C7B00DE14DC /* g7221_decoder_aes.c in Sources */, + 83FBB1792A4FF71B00CD0580 /* rstm_rockstar.c in Sources */, 8339B326280FDF4B0076F74B /* text_reader.c in Sources */, 836F702018BDC2190095E648 /* rkv.c in Sources */, 834FE0F4215C79ED000A5D3D /* wsi.c in Sources */, - 83D26A7A26E66D98001A9475 /* adp_bos.c in Sources */, + 83D26A7A26E66D98001A9475 /* adp_wildfire.c in Sources */, 836F703218BDC2190095E648 /* knon.c in Sources */, 837CEB0223487F2C00E62A4A /* raw_int.c in Sources */, 836F702818BDC2190095E648 /* sat_dvi.c in Sources */, @@ -2903,7 +2895,7 @@ 8306B0B320984552000302D4 /* blocked_thp.c in Sources */, 832BF80921E05135006F50F1 /* fag.c in Sources */, 834FE0B6215C798C000A5D3D /* derf_decoder.c in Sources */, - 836F702318BDC2190095E648 /* rsf.c in Sources */, + 836F702318BDC2190095E648 /* raw_rsf.c in Sources */, 834FE109215C79ED000A5D3D /* idsp_ie.c in Sources */, 83299FD01E7660C7003A3242 /* bik.c in Sources */, 8346D97C25BF838C00D1A8B0 /* mjb_mjh.c in Sources */, @@ -2926,7 +2918,6 @@ 836F6F8D18BDC2190095E648 /* gsp_gsb.c in Sources */, 836F704518BDC2190095E648 /* wvs.c in Sources */, 839FBFFB26C354E70016A78A /* wxd_wxh.c in Sources */, - 8322ECE7240268BB009E9429 /* raw_al.c in Sources */, 83EDE5D91A70951A005F5D84 /* btsnd.c in Sources */, 8306B0E420984590000302D4 /* wave.c in Sources */, 8349A9171FE6258200E26435 /* pc_adp_otns.c in Sources */, @@ -2948,6 +2939,7 @@ 83C7281922BC893D00678B4A /* fsb5_fev.c in Sources */, 8349A8EA1FE6253900E26435 /* blocked_ea_schl.c in Sources */, 836F705118BDC2190095E648 /* zsd.c in Sources */, + 83FBB17D2A4FF87200CD0580 /* sf_utils.c in Sources */, 8349A91F1FE6258200E26435 /* naac.c in Sources */, 83AFABBE23795202002F3947 /* isb.c in Sources */, 836F6FD218BDC2190095E648 /* ps2_bmdx.c in Sources */, @@ -2964,7 +2956,6 @@ 836F6F6E18BDC2190095E648 /* aix.c in Sources */, 836F6F8718BDC2190095E648 /* ffw.c in Sources */, 8349A9141FE6258200E26435 /* omu.c in Sources */, - 836F6FE418BDC2190095E648 /* ps2_leg.c in Sources */, 833E82E32A2857F700CD0580 /* render.c in Sources */, 836F705618BDC2190095E648 /* util.c in Sources */, 8306B0A820984552000302D4 /* blocked_ps2_iab.c in Sources */, @@ -3028,6 +3019,7 @@ 8319017C28F67EE100B70711 /* miniz.c in Sources */, 8346D97B25BF838C00D1A8B0 /* ktac.c in Sources */, 8349A8ED1FE6253900E26435 /* blocked_ea_sns.c in Sources */, + 83FBB1782A4FF71B00CD0580 /* rws_809.c in Sources */, 830595D8277EEAA500EBFAAE /* ffmpeg_decoder_custom_mp4.c in Sources */, 836F6F6F18BDC2190095E648 /* akb.c in Sources */, 83EED5D6203A8BD7008BEB45 /* blocked_ea_swvr.c in Sources */, @@ -3046,7 +3038,6 @@ 834FE0E9215C79ED000A5D3D /* ao.c in Sources */, 836F6FE218BDC2190095E648 /* ps2_kces.c in Sources */, 8306B08520984518000302D4 /* yamaha_decoder.c in Sources */, - 836F6FEF18BDC2190095E648 /* ps2_pnb.c in Sources */, 836F6FCB18BDC2190095E648 /* ads.c in Sources */, 834FE108215C79ED000A5D3D /* hd3_bd3.c in Sources */, 83C7281C22BC893D00678B4A /* sfh.c in Sources */, @@ -3065,7 +3056,6 @@ 836F46AE28208735005B9B87 /* blocked_tt_ad.c in Sources */, 836F6FF918BDC2190095E648 /* ps2_snd.c in Sources */, 836F6F2918BDC2190095E648 /* l5_555_decoder.c in Sources */, - 836F6FF318BDC2190095E648 /* ps2_rstm.c in Sources */, 8373342923F60CDC00DE14DC /* deblock_streamfile.c in Sources */, 836F6F7918BDC2190095E648 /* dc_asd.c in Sources */, 836F703B18BDC2190095E648 /* vsf.c in Sources */, @@ -3078,7 +3068,7 @@ 8350C0551E071881009E0A93 /* xma.c in Sources */, 837CEAF523487F2C00E62A4A /* ubi_hx.c in Sources */, 836F6F3218BDC2190095E648 /* ngc_dsp_decoder.c in Sources */, - 836F704218BDC2190095E648 /* wii_sts.c in Sources */, + 836F704218BDC2190095E648 /* sts.c in Sources */, 83C7281722BC893D00678B4A /* mtaf.c in Sources */, 836F703918BDC2190095E648 /* vgs.c in Sources */, 834FE0F8215C79ED000A5D3D /* adpcm_capcom.c in Sources */, @@ -3093,21 +3083,21 @@ 836F702B18BDC2190095E648 /* sdt.c in Sources */, 836F6FDA18BDC2190095E648 /* ps2_hgc1.c in Sources */, 836F702C18BDC2190095E648 /* seg.c in Sources */, - 836F700918BDC2190095E648 /* ps2_voi.c in Sources */, + 836F700918BDC2190095E648 /* voi.c in Sources */, 836F6FE018BDC2190095E648 /* ps2_joe.c in Sources */, 832BF82721E0514B006F50F1 /* xa.c in Sources */, 837CEAD823487E8300E62A4A /* bmp_konami.c in Sources */, - 8306B0A220984552000302D4 /* blocked_bdsp.c in Sources */, 836F700118BDC2190095E648 /* ps2_tec.c in Sources */, 8373341C23F60C7B00DE14DC /* relic_decoder.c in Sources */, 832BF82121E0514B006F50F1 /* zsnd.c in Sources */, 836F703018BDC2190095E648 /* sqex_scd.c in Sources */, 8306B0A320984552000302D4 /* blocked_ast.c in Sources */, - 836F6FD518BDC2190095E648 /* ps2_enth.c in Sources */, + 836F6FD518BDC2190095E648 /* lp_ap_lep.c in Sources */, 8306B0DC20984590000302D4 /* sthd.c in Sources */, 836F6FAE18BDC2190095E648 /* ngc_dsp_mpds.c in Sources */, 8315958720FEC832007002F0 /* asf_decoder.c in Sources */, 836F705218BDC2190095E648 /* zwdsp.c in Sources */, + 83FBB1722A4FF4EC00CD0580 /* ego_dic.c in Sources */, 836F6FFB18BDC2190095E648 /* ps2_sps.c in Sources */, 836F6F2018BDC2190095E648 /* adx_decoder.c in Sources */, 834FE0EA215C79ED000A5D3D /* aif_asobo.c in Sources */, @@ -3124,14 +3114,14 @@ 8349A90D1FE6258200E26435 /* ubi_sb.c in Sources */, 83C7281D22BC893D00678B4A /* ikm.c in Sources */, 834FE0BB215C798C000A5D3D /* celt_fsb_decoder.c in Sources */, - 836F702518BDC2190095E648 /* rwx.c in Sources */, + 836F702518BDC2190095E648 /* rwax.c in Sources */, 836F6F3A18BDC2190095E648 /* sdx2_decoder.c in Sources */, + 83FBB1752A4FF59E00CD0580 /* pwb.c in Sources */, 836F6FAF18BDC2190095E648 /* ngc_dsp_std.c in Sources */, 836F6F7118BDC2190095E648 /* ast.c in Sources */, 834FE0BF215C79A9000A5D3D /* flat.c in Sources */, 83AA7F7D2519C042004C5298 /* dsb.c in Sources */, 836F6F6B18BDC2190095E648 /* agsc.c in Sources */, - 836F700E18BDC2190095E648 /* ps2_xa2.c in Sources */, 837CEB0023487F2C00E62A4A /* smk.c in Sources */, 83C7281022BC893D00678B4A /* nps.c in Sources */, 83E7FD6025EF2B0C00683FD2 /* tac_decoder_lib.c in Sources */, @@ -3163,8 +3153,7 @@ 8373342B23F60CDC00DE14DC /* fwse.c in Sources */, 837CEAFF23487F2C00E62A4A /* raw_snds.c in Sources */, 83031EDC243C510500C3F3E0 /* vid1.c in Sources */, - 836F700218BDC2190095E648 /* ps2_tk5.c in Sources */, - 83AA5D271F6E2F9C0020821C /* stm.c in Sources */, + 83AA5D271F6E2F9C0020821C /* stma.c in Sources */, 831BA61D1EAC61A500CF89B0 /* ubi_raki.c in Sources */, 8306B0A520984552000302D4 /* blocked_ea_wve_au00.c in Sources */, 836F6FB818BDC2190095E648 /* ngc_tydsp.c in Sources */, @@ -3205,7 +3194,6 @@ 836F700D18BDC2190095E648 /* ps2_wmus.c in Sources */, 83031EC8243C50A800C3F3E0 /* circus_decoder_lib.c in Sources */, 831BA61C1EAC61A500CF89B0 /* sxd.c in Sources */, - 836F6F8018BDC2190095E648 /* dsp_bdsp.c in Sources */, 836F6F9618BDC2190095E648 /* lsf.c in Sources */, 8306B0AB20984552000302D4 /* layered.c in Sources */, 833E82E92A2857F700CD0580 /* mixing.c in Sources */, @@ -3258,7 +3246,7 @@ 837CEAFA23487F2C00E62A4A /* xa_04sw.c in Sources */, 836F6F8618BDC2190095E648 /* excitebots.c in Sources */, 8385D4E6245174C700FF8E67 /* diva.c in Sources */, - 836F6FF418BDC2190095E648 /* rws.c in Sources */, + 836F6FF418BDC2190095E648 /* rws_80d.c in Sources */, 834FE100215C79ED000A5D3D /* svg.c in Sources */, 833E82D22A2856B200CD0580 /* reader_put.c in Sources */, 836F6F2518BDC2190095E648 /* g721_decoder.c in Sources */, @@ -3268,12 +3256,13 @@ 8317C24C26982CC1007DD0B8 /* sspr.c in Sources */, 832BF82521E0514B006F50F1 /* ogg_opus.c in Sources */, 83709E091ECBC1A4005C03D3 /* aac_triace.c in Sources */, + 83FBB1732A4FF4EC00CD0580 /* awd.c in Sources */, 836F6F9118BDC2190095E648 /* ios_psnd.c in Sources */, 836F700618BDC2190095E648 /* vgs_ps.c in Sources */, 834FE10F215C79ED000A5D3D /* sdf.c in Sources */, 834FE0FF215C79ED000A5D3D /* sscf.c in Sources */, 8373341A23F60C7B00DE14DC /* relic_decoder_mixfft.c in Sources */, - 836F6FAA18BDC2190095E648 /* ngc_bh2pcm.c in Sources */, + 83FBB1712A4FF4EC00CD0580 /* xa2_acclaim.c in Sources */, 831BA6211EAC61A500CF89B0 /* pasx.c in Sources */, 832BF82621E0514B006F50F1 /* nwav.c in Sources */, 836F6F3018BDC2190095E648 /* nds_procyon_decoder.c in Sources */, @@ -3299,7 +3288,8 @@ 836DF627298F864100CD0580 /* cps.c in Sources */, 8319018128F67F1500B70711 /* ice_decoder_icelib.c in Sources */, 836F6FEE18BDC2190095E648 /* ps2_p2bt.c in Sources */, - 836F702618BDC2190095E648 /* s14_sss.c in Sources */, + 83FBB17F2A4FF94C00CD0580 /* msa.c in Sources */, + 836F702618BDC2190095E648 /* raw_s14_sss.c in Sources */, 834FE102215C79ED000A5D3D /* rfrm.c in Sources */, 835B9B8F2730BF2D00F87EE3 /* ast_mv.c in Sources */, 83AA5D1D1F6E2F800020821C /* blocked_vgs.c in Sources */, @@ -3307,10 +3297,9 @@ 8339B323280FDF250076F74B /* sspf.c in Sources */, 833E82D32A2856B200CD0580 /* samples_ops.c in Sources */, 83AA7F822519C042004C5298 /* ktsc.c in Sources */, - 836F6FDE18BDC2190095E648 /* ps2_ild.c in Sources */, + 836F6FDE18BDC2190095E648 /* ild.c in Sources */, 836F703E18BDC2190095E648 /* wii_ras.c in Sources */, 834FE0EE215C79ED000A5D3D /* ue4opus.c in Sources */, - 836F6FEA18BDC2190095E648 /* ps2_msa.c in Sources */, 836F6F3618BDC2190095E648 /* ogg_vorbis_decoder.c in Sources */, 8306B0E520984590000302D4 /* ubi_lyn.c in Sources */, 83D2007D248DDB770048BD24 /* kat.c in Sources */, @@ -3365,12 +3354,11 @@ 836F6F9218BDC2190095E648 /* ish_isd.c in Sources */, 833E82F12A28587D00CD0580 /* paths.c in Sources */, 836F6F2A18BDC2190095E648 /* lsf_decoder.c in Sources */, - 8349A9151FE6258200E26435 /* ps2_xa2_rrp.c in Sources */, 836F703518BDC2190095E648 /* svs.c in Sources */, 836F6FA318BDC2190095E648 /* spsd.c in Sources */, 8306B0B920984552000302D4 /* blocked_matx.c in Sources */, 83A21F7B201D895B000F04B9 /* blocked_xvag.c in Sources */, - 836F6FBA18BDC2190095E648 /* ngc_ymf.c in Sources */, + 836F6FBA18BDC2190095E648 /* ymf.c in Sources */, 83F1EE2E245D4FB20076E182 /* vadpcm_decoder.c in Sources */, 836F705018BDC2190095E648 /* ydsp.c in Sources */, 83D2007E248DDB770048BD24 /* pcm_success.c in Sources */, diff --git a/Frameworks/vgmstream/vgmstream/src/base/decode.c b/Frameworks/vgmstream/vgmstream/src/base/decode.c index f5feaa3dc..f55c3275c 100644 --- a/Frameworks/vgmstream/vgmstream/src/base/decode.c +++ b/Frameworks/vgmstream/vgmstream/src/base/decode.c @@ -449,7 +449,7 @@ int decode_get_samples_per_frame(VGMSTREAM* vgmstream) { return 28; case coding_PSX_cfg: case coding_PSX_pivotal: - return (vgmstream->interleave_block_size - 0x01) * 2; /* size 0x01 header */ + return (vgmstream->frame_size - 0x01) * 2; /* size 0x01 header */ case coding_EA_XA: case coding_EA_XA_int: @@ -669,7 +669,7 @@ int decode_get_frame_size(VGMSTREAM* vgmstream) { return 0x10; case coding_PSX_cfg: case coding_PSX_pivotal: - return vgmstream->interleave_block_size; + return vgmstream->frame_size; case coding_EA_XA: return 0x1E; @@ -998,14 +998,14 @@ void decode_vgmstream(VGMSTREAM* vgmstream, int samples_written, int samples_to_ for (ch = 0; ch < vgmstream->channels; ch++) { decode_psx_configurable(&vgmstream->ch[ch], buffer+ch, vgmstream->channels, vgmstream->samples_into_block, samples_to_do, - vgmstream->interleave_block_size, vgmstream->codec_config); + vgmstream->frame_size, vgmstream->codec_config); } break; case coding_PSX_pivotal: for (ch = 0; ch < vgmstream->channels; ch++) { decode_psx_pivotal(&vgmstream->ch[ch], buffer+ch, vgmstream->channels, vgmstream->samples_into_block, samples_to_do, - vgmstream->interleave_block_size); + vgmstream->frame_size); } break; case coding_HEVAG: diff --git a/Frameworks/vgmstream/vgmstream/src/base/info.c b/Frameworks/vgmstream/vgmstream/src/base/info.c index 5ee86a476..3f6d90a60 100644 --- a/Frameworks/vgmstream/vgmstream/src/base/info.c +++ b/Frameworks/vgmstream/vgmstream/src/base/info.c @@ -3,7 +3,7 @@ #include "../coding/coding.h" #include "mixing.h" #include "../util/channel_mappings.h" - +#include "../util/sf_utils.h" /*******************************************************************************/ /* TEXT */ diff --git a/Frameworks/vgmstream/vgmstream/src/base/render.c b/Frameworks/vgmstream/vgmstream/src/base/render.c index f5480efa9..a7cc29de7 100644 --- a/Frameworks/vgmstream/vgmstream/src/base/render.c +++ b/Frameworks/vgmstream/vgmstream/src/base/render.c @@ -285,7 +285,6 @@ int render_layout(sample_t* buf, int32_t sample_count, VGMSTREAM* vgmstream) { case layout_blocked_ivaud: case layout_blocked_ea_swvr: case layout_blocked_adm: - case layout_blocked_bdsp: case layout_blocked_ps2_iab: case layout_blocked_vs_str: case layout_blocked_rws: diff --git a/Frameworks/vgmstream/vgmstream/src/coding/circus_decoder_lzxpcm.h b/Frameworks/vgmstream/vgmstream/src/coding/circus_decoder_lzxpcm.h index b457f700d..c4d60f248 100644 --- a/Frameworks/vgmstream/vgmstream/src/coding/circus_decoder_lzxpcm.h +++ b/Frameworks/vgmstream/vgmstream/src/coding/circus_decoder_lzxpcm.h @@ -213,7 +213,7 @@ static int lzxpcm_decompress(lzxpcm_stream_t* strm) { default: goto fail; } - } + } buffer_end: strm->next_out += dst_pos; @@ -232,65 +232,65 @@ fail: #if 0 /* non-streamed form that XPCM originally uses, assumes buffers are big enough */ static int lzxpcm_decompress_full(uint8_t* dst, size_t dst_size, const uint8_t* src, size_t src_size) { - int src_pos = 0; - int dst_pos = 0; - uint32_t flags = 0; + int src_pos = 0; + int dst_pos = 0; + uint32_t flags = 0; - while (src_pos < src_size && dst_pos < dst_size) { - flags >>= 1; + while (src_pos < src_size && dst_pos < dst_size) { + flags >>= 1; - if ((flags & 0x0100) == 0) { - flags = 0xFF00 | src[src_pos++]; - } - - if (flags & 1) { + if ((flags & 0x0100) == 0) { + flags = 0xFF00 | src[src_pos++]; + } + + if (flags & 1) { /* uncompressed byte per bit */ - dst[dst_pos++] = src[src_pos++]; - } - else { + dst[dst_pos++] = src[src_pos++]; + } + else { /* compressed data */ - uint32_t length; - uint32_t offset; - const uint32_t token = src[src_pos++]; + uint32_t length; + uint32_t offset; + const uint32_t token = src[src_pos++]; - if (token >= 0xC0) { - length = ((token >> 2) & 0x0F) + 4; /* 6b */ + if (token >= 0xC0) { + length = ((token >> 2) & 0x0F) + 4; /* 6b */ - offset = ((token & 3) << 8) | src[src_pos++]; /* upper 2b + lower 8b */ - } - else if (token >= 0x80) { - length = ((token >> 5) & 3) + 2; /* 2b */ + offset = ((token & 3) << 8) | src[src_pos++]; /* upper 2b + lower 8b */ + } + else if (token >= 0x80) { + length = ((token >> 5) & 3) + 2; /* 2b */ - offset = token & 0x1F; /* 5b */ - if (offset == 0) { - offset = src[src_pos++]; - } - } - else if (token == 0x7F) { - length = (uint16_t)(src[src_pos] | src[src_pos+1] << 8u) + 2; - src_pos += 2; + offset = token & 0x1F; /* 5b */ + if (offset == 0) { + offset = src[src_pos++]; + } + } + else if (token == 0x7F) { + length = (uint16_t)(src[src_pos] | src[src_pos+1] << 8u) + 2; + src_pos += 2; - offset = (uint16_t)(src[src_pos] | src[src_pos+1] << 8u); - src_pos += 2; - } - else { - length = token + 4; + offset = (uint16_t)(src[src_pos] | src[src_pos+1] << 8u); + src_pos += 2; + } + else { + length = token + 4; - offset = (uint16_t)(src[src_pos] | src[src_pos+1] << 8u); - src_pos += 2; - } + offset = (uint16_t)(src[src_pos] | src[src_pos+1] << 8u); + src_pos += 2; + } - if (dst_pos + length > dst_size) { - length = dst_size - dst_pos; - } + if (dst_pos + length > dst_size) { + length = dst_size - dst_pos; + } - for (int i = 0; i < length; i++) { - dst[dst_pos] = dst[dst_pos - offset]; - dst_pos++; - } - } - } + for (int i = 0; i < length; i++) { + dst[dst_pos] = dst[dst_pos - offset]; + dst_pos++; + } + } + } return 0; } diff --git a/Frameworks/vgmstream/vgmstream/src/formats.c b/Frameworks/vgmstream/vgmstream/src/formats.c index 5133aa33d..8d17e398a 100644 --- a/Frameworks/vgmstream/vgmstream/src/formats.c +++ b/Frameworks/vgmstream/vgmstream/src/formats.c @@ -61,10 +61,9 @@ static const char* extension_list[] = { //"aiff", //common "aix", "akb", - "al", - "al2", + "al", //txth/raw [Dominions 3 - The Awakening (PC)] + "al2", //txth/raw [Conquest of Elysium 3 (PC)] "ams", //txth/reserved [Super Dragon Ball Z (PS2) ELF names] - "amts", //fake extension/header id for .stm (renamed? to be removed?) "an2", "ao", "ap", @@ -90,6 +89,7 @@ static const char* extension_list[] = { "awa", //txth/reserved [Missing Parts Side A (PS2)] "awb", "awc", + "awd", "b1s", "baf", @@ -99,14 +99,11 @@ static const char* extension_list[] = { "bcstm", "bcwav", "bcv", //txth/reserved [The Bigs (PSP)] - "bd3", - "bdsp", "bfstm", "bfwav", "bg00", "bgm", "bgw", - "bh2pcm", "bigrp", "bik", "bika", //fake extension for .bik (to be removed) @@ -163,6 +160,7 @@ static const char* extension_list[] = { "ddsp", "de2", "dec", + "dic", "diva", "dmsg", //fake extension/header id for .sgt (to be removed) "ds2", //txth/reserved [Star Wars Bounty Hunter (GC)] @@ -216,7 +214,9 @@ static const char* extension_list[] = { "h4m", "hab", "hca", + "hd3", "hdr", + "hdt", "hgc1", "his", "hps", @@ -230,6 +230,8 @@ static const char* extension_list[] = { "hxg", "hxx", "hwas", + "hwb", + "hwd", "iab", "iadp", @@ -246,6 +248,7 @@ static const char* extension_list[] = { "ilv", //txth/reserved [Star Wars Episode III (PS2)] "ima", "imc", + "imf", "imx", "int", "is14", @@ -289,6 +292,7 @@ static const char* extension_list[] = { "lasf", //fake extension for .asf (various) "lbin", //fake extension for .bin (various) "ldat", //fake extension for .dat + "ldt", "leg", "lep", "lflac", //fake extension for .flac, FFmpeg/not parsed @@ -311,11 +315,12 @@ static const char* extension_list[] = { "lpcm", "lpk", "lps", - "lrmb", + "lrmh", "lse", "lsf", "lstm", //fake extension for .stm "lwav", //fake extension for .wav + "lwd", "lwma", //fake extension for .wma, FFmpeg/not parsed "mab", @@ -338,6 +343,7 @@ static const char* extension_list[] = { "mogg", //"m4a", //common //"m4v", //common + //"mov", //common //"mp+", //common [Moonshine Runners (PC)] //"mp2", //common //"mp3", //common @@ -398,7 +404,7 @@ static const char* extension_list[] = { "opusx", "otm", "oto", //txth/reserved [Vampire Savior (SAT)] - "ovb", + "ovb", //txth/semi [namCollection: Tekken (PS2), Tekken 5: Tekken 1-3 (PS2)] "p04", //txth/reserved [Psychic Force 2012 (DC), Skies of Arcadia (DC)] "p16", //txth/reserved [Astal (SAT)] @@ -410,15 +416,14 @@ static const char* extension_list[] = { "pcm", "pdt", "pk", - "pnb", "pona", "pos", "ps3", - "ps2stm", //fake extension for .stm (renamed? to be removed?) "psb", "psf", "psh", //fake extension for .vsv (to be removed) "psnd", + "pwb", "r", "rac", //txth/reserved [Manhunt (Xbox)] @@ -502,7 +507,6 @@ static const char* extension_list[] = { "smc", "smk", "smp", - "smpl", //fake extension/header id for .v0/v1 (renamed, to be removed) "smv", "snb", "snd", @@ -529,7 +533,6 @@ static const char* extension_list[] = { "ster", "sth", "stm", - "stma", //fake extension/header id for .stm "str", "stream", "strm", @@ -556,9 +559,9 @@ static const char* extension_list[] = { "tgq", "tgv", "thp", - "tk5", "tmx", "tra", + "trk", "tun", "txth", "txtp", @@ -566,7 +569,7 @@ static const char* extension_list[] = { "u0", "ue4opus", - "ulw", + "ulw", //txth/raw [Burnout (GC)] "um3", "utk", "uv", @@ -704,6 +707,7 @@ static const char* common_extension_list[] = { "flac", //common "m4a", //common "m4v", //common + "mov", //common "mp+", //common [Moonshine Runners (PC)] "mp2", //common "mp3", //common @@ -840,7 +844,7 @@ static const coding_info coding_info_list[] = { {coding_TGC, "Tiger Game.com 4-bit ADPCM"}, {coding_NDS_PROCYON, "Procyon Studio Digital Sound Elements NDS 4-bit APDCM"}, {coding_L5_555, "Level-5 0x555 4-bit ADPCM"}, - {coding_LSF, "lsf 4-bit ADPCM"}, + {coding_LSF, "Gizmondo Studios Helsingborg LSF 4-bit ADPCM"}, {coding_MTAF, "Konami MTAF 4-bit ADPCM"}, {coding_MTA2, "Konami MTA2 4-bit ADPCM"}, {coding_MC3, "Paradigm MC3 3-bit ADPCM"}, @@ -937,7 +941,6 @@ static const layout_info layout_info_list[] = { {layout_blocked_filp, "blocked (FILP)"}, {layout_blocked_ea_swvr, "blocked (EA SWVR)"}, {layout_blocked_adm, "blocked (ADM)"}, - {layout_blocked_bdsp, "blocked (BDSP)"}, {layout_blocked_ivaud, "blocked (IVAUD)"}, {layout_blocked_ps2_iab, "blocked (IAB)"}, {layout_blocked_vs_str, "blocked (STR VS)"}, @@ -973,9 +976,9 @@ static const meta_info meta_info_list[] = { {meta_CSMP, "Retro Studios CSMP header"}, {meta_RFRM, "Retro Studios RFRM header"}, {meta_DTK, "Nintendo DTK raw header"}, - {meta_RSF, "Retro Studios RSF raw header"}, + {meta_RSF, "Retro Studios .RSF raw header"}, {meta_AFC, "Nintendo .AFC header"}, - {meta_AST, "Nintendo AST header"}, + {meta_AST, "Nintendo .AST header"}, {meta_HALPST, "HAL Laboratory HALPST header"}, {meta_DSP_RS03, "Retro Studios RS03 header"}, {meta_DSP_STD, "Nintendo DSP header"}, @@ -984,14 +987,14 @@ static const meta_info meta_info_list[] = { {meta_ADS, "Sony ADS header"}, {meta_NPS, "Namco NPSF header"}, {meta_RWSD, "Nintendo RWSD header (single stream)"}, - {meta_RWAR, "Nintendo RWAR header (single RWAV stream)"}, + {meta_RWAR, "Nintendo RWAR header (single stream)"}, {meta_RWAV, "Nintendo RWAV header"}, {meta_CWAV, "Nintendo CWAV header"}, {meta_FWAV, "Nintendo FWAV header"}, {meta_XA, "Sony XA header"}, {meta_RXWS, "Sony RXWS header"}, {meta_RAW_INT, "PS2 .int raw header"}, - {meta_PS2_OMU, "Alter Echo OMU Header"}, + {meta_OMU, "Outrage OMU Header"}, {meta_DSP_STM, "Intelligent Systems STM header"}, {meta_EXST, "Sony EXST header"}, {meta_SVAG_KCET, "Konami SVAG header"}, @@ -1004,16 +1007,15 @@ static const meta_info meta_info_list[] = { {meta_DSP_GCM, "Double DSP header stereo by .gcm extension"}, {meta_IDSP_TT, "Traveller's Tales IDSP header"}, {meta_RAW_PCM, "PC .raw raw header"}, - {meta_PS2_VAGi, "Sony VAGi header"}, - {meta_PS2_VAGp, "Sony VAGp header"}, - {meta_PS2_pGAV, "Sony pGAV header"}, - {meta_PS2_VAGp_AAAP, "Acclaim Austin AAAp VAG header"}, + {meta_VAG, "Sony VAG header"}, + {meta_VAG_custom, "Sony VAG header (custom)"}, + {meta_AAAP, "Acclaim Austin AAAp header"}, {meta_SEB, "Game Arts .SEB header"}, {meta_STR_WAV, "Blitz Games .STR+WAV header"}, {meta_ILD, "Tose ILD header"}, - {meta_PS2_PNB, "assumed PNB (PsychoNauts Bgm File) by .pnb extension"}, + {meta_PWB, "Double Fine WB header"}, {meta_RAW_WAVM, "Xbox .wavm raw header"}, - {meta_DSP_STR, "assumed Conan Gamecube STR File by .str extension"}, + {meta_DSP_STR, "Cauldron .STR header"}, {meta_EA_SCHL, "Electronic Arts SCHl header (variable)"}, {meta_EA_SCHL_fixed, "Electronic Arts SCHl header (fixed)"}, {meta_CAF, "tri-Crescendo CAF Header"}, @@ -1026,8 +1028,7 @@ static const meta_info meta_info_list[] = { {meta_AIFC, "Apple AIFF-C (Audio Interchange File Format) header"}, {meta_AIFF, "Apple AIFF (Audio Interchange File Format) header"}, {meta_STR_SNDS, "3DO SNDS header"}, - {meta_WS_AUD, "Westwood Studios .aud header"}, - {meta_WS_AUD_old, "Westwood Studios .aud (old) header"}, + {meta_WS_AUD, "Westwood Studios .AUD header"}, {meta_PS2_IVB, "IVB/BVII header"}, {meta_SVS, "Square SVS header"}, {meta_RIFF_WAVE, "RIFF WAVE header"}, @@ -1047,19 +1048,18 @@ static const meta_info meta_info_list[] = { {meta_FSB3, "FMOD FSB3 header"}, {meta_FSB4, "FMOD FSB4 header"}, {meta_FSB5, "FMOD FSB5 header"}, - {meta_RWX, "RWX Header"}, + {meta_RWAX, "Konami RWAX header"}, {meta_XWB, "Microsoft XWB header"}, {meta_PS2_XA30, "Reflections XA30 PS2 header"}, {meta_MUSC, "Krome MUSC header"}, {meta_MUSX, "Eurocom MUSX header"}, - {meta_LEG, "Legaia 2 - Duel Saga LEG Header"}, {meta_FILP, "Bio Hazard - Gun Survivor FILp Header"}, {meta_IKM, "MiCROViSiON IKM header"}, - {meta_STER, "ALCHEMY STER header"}, + {meta_STER, "ALCHEMY STER header"}, {meta_SAT_DVI, "Konami KCEN DVI. header"}, {meta_DC_KCEY, "Konami KCEY KCEYCOMP header"}, {meta_BG00, "Falcom BG00 Header"}, - {meta_PS2_RSTM, "Rockstar Games RSTM Header"}, + {meta_RSTM_ROCKSTAR, "Rockstar Games RSTM Header"}, {meta_ACM, "InterPlay ACM Header"}, {meta_MUS_ACM, "InterPlay MUS ACM header"}, {meta_PS2_KCES, "Konami KCES Header"}, @@ -1075,7 +1075,7 @@ static const meta_info meta_info_list[] = { {meta_PS2_PCM, "Konami KCEJ East .PCM header"}, {meta_PS2_RKV, "Legacy of Kain - Blood Omen 2 RKV PS2 header"}, {meta_PS2_VAS, "Konami .VAS header"}, - {meta_PS2_ENTH, ".enth Header"}, + {meta_LP_AP_LEP, "Konami LP/AP/LEP header"}, {meta_SDT, "High Voltage .sdt header"}, {meta_NGC_TYDSP, ".tydsp Header"}, {meta_WVS, "Swingin' Ape .WVS header"}, @@ -1086,11 +1086,11 @@ static const meta_info meta_info_list[] = { {meta_DC_STR_V2, "variant of Sega Stream Asset Builder header"}, {meta_XMU, "Outrage XMU header"}, {meta_XVAS, "Konami .XVAS header"}, - {meta_PS2_XA2, "Acclaim XA2 Header"}, + {meta_XA2_ACCLAIM, "Acclaim .XA2 Header"}, {meta_SAP, "VING .SAP header"}, {meta_DC_IDVI, "Capcom IDVI header"}, {meta_KRAW, "Geometry Wars: Galaxies KRAW header"}, - {meta_NGC_YMF, "YMF DSP Header"}, + {meta_YMF, "Yuke's .YMF Header"}, {meta_FAG, "Radical .FAG Header"}, {meta_PS2_MIHB, "Sony MultiStream MIC header"}, {meta_DSP_WII_MUS, "mus header"}, @@ -1113,7 +1113,7 @@ static const meta_info meta_info_list[] = { {meta_SPT_SPD, "SPT+SPD DSP Header"}, {meta_ISH_ISD, "ISH+ISD DSP Header"}, {meta_GSP_GSB, "Tecmo GSP+GSB Header"}, - {meta_YDSP, "Yuke's DSP (YDSP) Header"}, + {meta_YDSP, "Yuke's YDSP Header"}, {meta_NGC_SSM, "SSM DSP Header"}, {meta_PS2_JOE, "Asobo Studio .JOE header"}, {meta_VGS, "Guitar Hero VGS Header"}, @@ -1129,20 +1129,18 @@ static const meta_info meta_info_list[] = { {meta_FFCC_STR, "Final Fantasy: Crystal Chronicles STR header"}, {meta_SAT_BAKA, "Konami BAKA header"}, {meta_SWAV, "Nintendo SWAV header"}, - {meta_VSF, "Square-Enix VSF header"}, + {meta_VSF, "Square Enix VSF header"}, {meta_NDS_RRDS, "Ridger Racer DS Header"}, - {meta_PS2_TK5, "Tekken 5 Stream Header"}, {meta_PS2_SND, "Might and Magic SSND Header"}, {meta_PS2_VSF_TTA, "VSF with SMSS Header"}, {meta_ADS_MIDWAY, "Midway ADS header"}, {meta_PS2_MCG, "Gunvari MCG Header"}, - {meta_ZSD, "ZSD Header"}, + {meta_ZSD, "Konami ZSD header"}, {meta_REDSPARK, "RedSpark Header"}, {meta_IVAUD, "Rockstar .ivaud header"}, {meta_DSP_WII_WSD, ".WSD header"}, {meta_WII_NDP, "Icon Games NDP header"}, {meta_PS2_SPS, "Ape Escape 2 SPS Header"}, - {meta_PS2_XA2_RRP, "Acclaim XA2 Header"}, {meta_NDS_HWAS, "Vicarious Visions HWAS header"}, {meta_NGC_LPS, "Rave Master LPS Header"}, {meta_NAOMI_ADPCM, "NAOMI/NAOMI2 Arcade games ADPCM header"}, @@ -1160,7 +1158,7 @@ static const meta_info meta_info_list[] = { {meta_WII_BNS, "Nintendo BNS header"}, {meta_WII_WAS, "Sumo Digital iSWS header"}, {meta_XBOX_HLWAV, "Half-Life 2 .WAV header"}, - {meta_MYSPD, "U-Sing .MYSPD header"}, + {meta_MYSPD, "Punchers Impact .MYSPD header"}, {meta_HIS, "Her Interactive HIS header"}, {meta_AST_MV, "MicroVision AST header"}, {meta_AST_MMV, "Marvelous AST header"}, @@ -1174,13 +1172,13 @@ static const meta_info meta_info_list[] = { {meta_S14, "Namco .S14 raw header"}, {meta_SSS, "Namco .SSS raw header"}, {meta_PS2_GCM, "Namco GCM header"}, - {meta_PS2_SMPL, "Homura SMPL header"}, - {meta_PS2_MSA, "Success .MSA header"}, + {meta_SMPL, "Skonec SMPL header"}, + {meta_MSA, "Success .MSA header"}, + {meta_VOI, "Irem .VOI header"}, {meta_NGC_PDT, "Hudson .PDT header"}, {meta_NGC_RKV, "Legacy of Kain - Blood Omen 2 RKV GC header"}, {meta_DSP_DDSP, ".DDSP header"}, {meta_P3D, "Radical P3D header"}, - {meta_PS2_TK1, "Tekken TK5STRM1 Header"}, {meta_NGC_DSP_MPDS, "MPDS DSP header"}, {meta_DSP_STR_IG, "Infogrames .DSP header"}, {meta_EA_SWVR, "Electronic Arts SWVR header"}, @@ -1198,7 +1196,7 @@ static const meta_info meta_info_list[] = { {meta_PS2_JSTM, "JSTM Header"}, {meta_XVAG, "Sony XVAG header"}, {meta_CPS, "tri-Crescendo CPS Header"}, - {meta_SQEX_SCD, "Square-Enix SCD header"}, + {meta_SQEX_SCD, "Square Enix SCD header"}, {meta_NGC_NST_DSP, "Animaniacs NST header"}, {meta_BAF, "Bizarre Creations .baf header"}, {meta_MSF, "Sony MSF header"}, @@ -1208,20 +1206,18 @@ static const meta_info meta_info_list[] = { {meta_SPM, "Square SPM header"}, {meta_VGS_PS, "Princess Soft VGS header"}, {meta_PS2_IAB, "Runtime .IAB header"}, - {meta_VS_STR, "Square .VS STR* header"}, - {meta_LSF_N1NJ4N, ".lsf !n1nj4n header"}, + {meta_VS_STR, "Square .VS STRx header"}, + {meta_LSF_N1NJ4N, "Gizmondo Studios Helsingborg LSF header"}, {meta_XWAV, "feelplus XWAV header"}, {meta_RAW_SNDS, "PC .snds raw header"}, {meta_PS2_WMUS, "assumed The Warriors Sony ADPCM by .wmus extension"}, {meta_HYPERSCAN_KVAG, "Mattel Hyperscan KVAG"}, {meta_IOS_PSND, "PSND Header"}, - {meta_BOS_ADP, "ADP! header"}, + {meta_ADP_WILDFIRE, "Wildfire ADP! header"}, {meta_QD_ADP, "Quantic Dream .ADP header"}, {meta_EB_SFX, "Excitebots .sfx header"}, {meta_EB_SF0, "assumed Excitebots .sf0 by extension"}, {meta_MTAF, "Konami MTAF header"}, - {meta_PS2_VAG1, "Konami VAG1 header"}, - {meta_PS2_VAG2, "Konami VAG2 header"}, {meta_ALP, "High Voltage ALP header"}, {meta_WPD, "WPD 'DPW' header"}, {meta_MN_STR, "Mini Ninjas 'STR' header"}, @@ -1239,14 +1235,14 @@ static const meta_info meta_info_list[] = { {meta_IDSP_NAMCO, "Namco IDSP header"}, {meta_WIIU_BTSND, "Nintendo Wii U Menu Boot Sound"}, {meta_MCA, "Capcom MCA header"}, - {meta_XB3D_ADX, "Xenoblade 3D ADX header"}, + {meta_ADX_MONSTER, "Monster Games .ADX header"}, {meta_HCA, "CRI HCA header"}, {meta_SVAG_SNK, "SNK SVAG header"}, {meta_PS2_VDS_VDM, "Procyon Studio VDS/VDM header"}, {meta_FFMPEG, "FFmpeg supported format"}, {meta_FFMPEG_faulty, "FFmpeg supported format (check log)"}, {meta_CXS, "tri-Crescendo CXS header"}, - {meta_AKB, "Square-Enix AKB header"}, + {meta_AKB, "Square Enix AKB header"}, {meta_PASX, "Premium Agency PASX header"}, {meta_XMA_RIFF, "Microsoft XMA RIFF header"}, {meta_ASTB, "Capcom ASTB header"}, @@ -1258,19 +1254,17 @@ static const meta_info meta_info_list[] = { {meta_GHS, "Hexadrive GHS/S_P_STH header"}, {meta_AAC_TRIACE, "tri-Ace AAC header"}, {meta_MTA2, "Konami MTA2 header"}, - {meta_NGC_ULW, "Criterion ULW raw header"}, {meta_XA_XA30, "Reflections XA30 header"}, {meta_XA_04SW, "Reflections 04SW header"}, {meta_TXTH, "TXTH generic header"}, {meta_EA_BNK, "Electronic Arts BNK header"}, {meta_SK_AUD, "Silicon Knights AUD header"}, {meta_AHX, "CRI AHX header"}, - {meta_STM, "Angel Studios/Rockstar San Diego STMA header"}, + {meta_STMA, "Angel Studios/Rockstar San Diego STMA header"}, {meta_BINK, "RAD Game Tools Bink header"}, {meta_EA_SNU, "Electronic Arts SNU header"}, {meta_AWC, "Rockstar AWC header"}, {meta_OPUS, "Nintendo Switch OPUS header"}, - {meta_RAW_AL, "Illwinter Game Design .AL raw header"}, {meta_PC_AST, "Capcom AST (PC) header"}, {meta_UBI_SB, "Ubisoft SBx header"}, {meta_NAAC, "Namco NAAC header"}, @@ -1287,12 +1281,12 @@ static const meta_info meta_info_list[] = { {meta_OGG_encrypted, "Ogg Vorbis header (encrypted)"}, {meta_KMA9, "Koei Tecmo KMA9 header"}, {meta_XWC, "Starbreeze XWC header"}, - {meta_SQEX_SAB, "Square-Enix SAB header"}, - {meta_SQEX_MAB, "Square-Enix MAB header"}, + {meta_SQEX_SAB, "Square Enix SAB header"}, + {meta_SQEX_MAB, "Square Enix MAB header"}, {meta_WAF, "KID WAF header"}, {meta_WAVE, "EngineBlack .WAVE header"}, {meta_WAVE_segmented, "EngineBlack .WAVE header (segmented)"}, - {meta_SMV, "Cho Aniki Zero .SMV header"}, + {meta_SMV, "extreme .SMV header"}, {meta_NXAP, "Nex NXAP header"}, {meta_EA_WVE_AU00, "Electronic Arts WVE (au00) header"}, {meta_EA_WVE_AD10, "Electronic Arts WVE (Ad10) header"}, @@ -1318,7 +1312,7 @@ static const meta_info meta_info_list[] = { {meta_WAVEBATCH, "Firebrand Games WBAT header"}, {meta_HD3_BD3, "Sony HD3+BD3 header"}, {meta_BNK_SONY, "Sony BNK header"}, - {meta_SSCF, "Square-Enix SSCF header"}, + {meta_SSCF, "Square Enix SSCF header"}, {meta_DSP_VAG, ".VAG DSP header"}, {meta_DSP_ITL, ".ITL DSP header"}, {meta_A2M, "Artificial Mind & Movement A2M header"}, @@ -1339,7 +1333,7 @@ static const meta_info meta_info_list[] = { {meta_ADPCM_CAPCOM, "Capcom .ADPCM header"}, {meta_UE4OPUS, "Epic Games UE4OPUS header"}, {meta_XWMA, "Microsoft XWMA RIFF header"}, - {meta_VA3, "Konami VA3 header" }, + {meta_VA3, "Konami VA3 header"}, {meta_XOPUS, "Exient XOPUS header"}, {meta_VS_SQUARE, "Square VS header"}, {meta_NWAV, "Chunsoft NWAV header"}, @@ -1380,7 +1374,7 @@ static const meta_info meta_info_list[] = { {meta_KWB, "Koei Tecmo WaveBank header"}, {meta_LRMD, "Sony LRMD header"}, {meta_WWISE_FX, "Audiokinetic Wwise FX header"}, - {meta_DIVA, "DIVA header"}, + {meta_DIVA, "Sega DIVA header"}, {meta_IMUSE, "LucasArts iMUSE header"}, {meta_KTSR, "Koei Tecmo KTSR header"}, {meta_KAT, "Sega KAT header"}, @@ -1420,6 +1414,8 @@ static const meta_info meta_info_list[] = { {meta_SNDZ, "Sony SNDZ header"}, {meta_VAB, "Sony VAB header"}, {meta_BIGRP, "Inti Creates .BIGRP header"}, + {meta_DIC1, "Codemasters DIC1 header"}, + {meta_AWD, "RenderWare Audio Wave Dictionary header"}, }; void get_vgmstream_coding_description(VGMSTREAM* vgmstream, char* out, size_t out_size) { diff --git a/Frameworks/vgmstream/vgmstream/src/layout/blocked.c b/Frameworks/vgmstream/vgmstream/src/layout/blocked.c index d38a20533..bb7f65648 100644 --- a/Frameworks/vgmstream/vgmstream/src/layout/blocked.c +++ b/Frameworks/vgmstream/vgmstream/src/layout/blocked.c @@ -156,9 +156,6 @@ void block_update(off_t block_offset, VGMSTREAM* vgmstream) { case layout_blocked_adm: block_update_adm(block_offset,vgmstream); break; - case layout_blocked_bdsp: - block_update_bdsp(block_offset,vgmstream); - break; case layout_blocked_ps2_iab: block_update_ps2_iab(block_offset,vgmstream); break; diff --git a/Frameworks/vgmstream/vgmstream/src/layout/blocked_bdsp.c b/Frameworks/vgmstream/vgmstream/src/layout/blocked_bdsp.c deleted file mode 100644 index f5e763abd..000000000 --- a/Frameworks/vgmstream/vgmstream/src/layout/blocked_bdsp.c +++ /dev/null @@ -1,18 +0,0 @@ -#include "layout.h" -#include "../vgmstream.h" - -/* set up for the block at the given offset */ -void block_update_bdsp(off_t block_offset, VGMSTREAM * vgmstream) { - int i; - - vgmstream->current_block_offset = block_offset; - vgmstream->current_block_size = read_32bitBE(vgmstream->current_block_offset,vgmstream->ch[0].streamfile)/7*8; - vgmstream->next_block_offset = vgmstream->current_block_offset + vgmstream->current_block_size+0xC0; - - for (i=0;ichannels;i++) { - - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset=vgmstream->current_block_offset*i; - - } -} diff --git a/Frameworks/vgmstream/vgmstream/src/layout/layout.h b/Frameworks/vgmstream/vgmstream/src/layout/layout.h index 1eeda70b5..4f3e64d6f 100644 --- a/Frameworks/vgmstream/vgmstream/src/layout/layout.h +++ b/Frameworks/vgmstream/vgmstream/src/layout/layout.h @@ -31,7 +31,6 @@ void block_update_filp(off_t block_offset, VGMSTREAM* vgmstream); void block_update_ivaud(off_t block_offset, VGMSTREAM* vgmstream); void block_update_ea_swvr(off_t block_offset, VGMSTREAM* vgmstream); void block_update_adm(off_t block_offset, VGMSTREAM* vgmstream); -void block_update_bdsp(off_t block_offset, VGMSTREAM* vgmstream); void block_update_ps2_iab(off_t block_offset, VGMSTREAM* vgmstream); void block_update_vs_str(off_t block_offset, VGMSTREAM* vgmstream); void block_update_rws(off_t block_offset, VGMSTREAM* vgmstream); diff --git a/Frameworks/vgmstream/vgmstream/src/meta/adp_bos.c b/Frameworks/vgmstream/vgmstream/src/meta/adp_wildfire.c similarity index 79% rename from Frameworks/vgmstream/vgmstream/src/meta/adp_bos.c rename to Frameworks/vgmstream/vgmstream/src/meta/adp_wildfire.c index 38b05de20..0ce5b89d2 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/adp_bos.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/adp_wildfire.c @@ -1,18 +1,18 @@ #include "meta.h" -/* ADP - from Balls of Steel */ -VGMSTREAM* init_vgmstream_adp_bos(STREAMFILE* sf) { +/* ADP - from Wildfire Studios games [Balls of Steel (PC)] */ +VGMSTREAM* init_vgmstream_adp_wildfire(STREAMFILE* sf) { VGMSTREAM* vgmstream = NULL; - off_t start_offset; - int loop_flag = 0; - int channels; + uint32_t start_offset; + int channels, loop_flag = 0; /* checks */ - if (!check_extensions(sf,"adp")) - goto fail; - if (!is_id32be(0x00,sf, "ADP!")) - goto fail; + return NULL; + + if (!check_extensions(sf,"adp")) + return NULL; + loop_flag = (-1 != read_s32le(0x08,sf)); channels = 1; @@ -30,7 +30,7 @@ VGMSTREAM* init_vgmstream_adp_bos(STREAMFILE* sf) { vgmstream->coding_type = coding_DVI_IMA_int; vgmstream->layout_type = layout_none; - vgmstream->meta_type = meta_BOS_ADP; + vgmstream->meta_type = meta_ADP_WILDFIRE; // 0x10, 0x12 - both initial history? //vgmstream->ch[0].adpcm_history1_32 = read_16bitLE(0x10,sf); diff --git a/Frameworks/vgmstream/vgmstream/src/meta/awd.c b/Frameworks/vgmstream/vgmstream/src/meta/awd.c new file mode 100644 index 000000000..29591db9c --- /dev/null +++ b/Frameworks/vgmstream/vgmstream/src/meta/awd.c @@ -0,0 +1,159 @@ +#include "meta.h" +#include "../coding/coding.h" +#include "../util/endianness.h" + + +/* AWD - Audio Wave Dictionary (RenderWare) */ +VGMSTREAM* init_vgmstream_awd(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + char header_name[STREAM_NAME_SIZE], stream_name[STREAM_NAME_SIZE]; + int /*bit_depth = 0,*/ channels = 0, sample_rate = 0, stream_codec = -1, total_subsongs = 0, target_subsong = sf->stream_index; + int interleave, loop_flag; + off_t data_offset, header_name_offset, misc_data_offset, linked_list_offset, wavedict_offset; + off_t entry_info_offset, entry_name_offset, /*entry_uuid_offset,*/ next_entry_offset, prev_entry_offset, stream_offset = 0; + read_u32_t read_u32; + size_t /*data_size,*/ header_size, /*misc_data_size,*/ stream_size = 0; + + /* checks */ + if (read_u32le(0x00, sf) != 0x809 && read_u32be(0x00, sf) != 0x809) + goto fail; + + /* .awd: standard (Burnout series, Black, Call of Duty: Finest Hour) + * .hwd/lwd: high/low vehicle engine sounds (Burnout series) + * (Burnout 3: Takedown, Burnout Revenge, Burnout Dominator) */ + if (!check_extensions(sf, "awd,hwd,lwd")) + goto fail; + + read_u32 = read_u8(0x04, sf) ? read_u32be : read_u32le; + //read_u32 = guess_endian32(0x00, sf) ? read_u32be : read_u32le; + + data_offset = read_u32(0x08, sf); + wavedict_offset = read_u32(0x0C, sf); + //data_size = read_u32(0x14, sf); + /* Platform UUIDs in big endian + * {FD9D32D3-E179-426A-8424-14720AC7F648}: GameCube + * {ACC9EAAA-38FC-1749-AE81-64EADBC79353}: PlayStation 2 + * {042D3A45-5FE4-C84B-81F0-DF758B01F273}: Xbox */ + //platf_uuid_1 = read_u64be(0x18, sf); + //platf_uuid_2 = read_u64be(0x20, sf); + header_size = read_u32(0x28, sf); + + if (data_offset != header_size) + goto fail; + + header_name_offset = read_u32(wavedict_offset + 0x04, sf); + + if (header_name_offset) /* not used in Black */ + read_string(header_name, STREAM_NAME_SIZE, header_name_offset, sf); + + if (!target_subsong) + target_subsong = 1; + + /* Linked lists have no total subsong count; instead iterating + * through all of them until it returns to the 1st entry again */ + linked_list_offset = wavedict_offset + 0x0C; + + prev_entry_offset = read_u32(linked_list_offset + 0x00, sf); + next_entry_offset = read_u32(linked_list_offset + 0x04, sf); + + while (next_entry_offset != linked_list_offset) { + total_subsongs++; + + entry_info_offset = read_u32(next_entry_offset + 0x08, sf); + + if (total_subsongs > 1024 || /* in case it gets stuck in an infinite loop */ + entry_info_offset < wavedict_offset || entry_info_offset > header_size || + prev_entry_offset < wavedict_offset || prev_entry_offset > header_size || + next_entry_offset < wavedict_offset || next_entry_offset > header_size) + goto fail; + + prev_entry_offset = read_u32(next_entry_offset + 0x00, sf); + next_entry_offset = read_u32(next_entry_offset + 0x04, sf); + + /* is at the correct target song index */ + if (total_subsongs == target_subsong) { + //entry_uuid_offset = read_u32(entry_info_offset + 0x00, sf); /* only used in Burnout games */ + entry_name_offset = read_u32(entry_info_offset + 0x04, sf); + + sample_rate = read_u32(entry_info_offset + 0x10, sf); + stream_codec = read_u32(entry_info_offset + 0x14, sf); + stream_size = read_u32(entry_info_offset + 0x18, sf); + //bit_depth = read_u8(entry_info_offset + 0x1C, sf); + channels = read_u8(entry_info_offset + 0x1D, sf); /* always 1, don't think stereo entries exist */ + if (channels != 1) + goto fail; + + /* stores a "00: GCN ADPCM Header" chunk, otherwise empty */ + misc_data_offset = read_u32(entry_info_offset + 0x20, sf); + //misc_data_size = read_u32(entry_info_offset + 0x24, sf); + + /* entry_info_offset + 0x2C to +0x44 has the target format information, + * which in most cases would probably be identical to the input format + * variables (from sample_rate to misc_data_size) */ + + stream_offset = read_u32(entry_info_offset + 0x4C, sf) + data_offset; + + read_string(stream_name, STREAM_NAME_SIZE, entry_name_offset, sf); + } + } + + if (total_subsongs < 1 || target_subsong > total_subsongs) + goto fail; + + interleave = 0; + loop_flag = 0; + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels, loop_flag); + if (!vgmstream) + goto fail; + + vgmstream->meta_type = meta_AWD; + vgmstream->layout_type = layout_none; + vgmstream->sample_rate = sample_rate; + vgmstream->stream_size = stream_size; + vgmstream->num_streams = total_subsongs; + vgmstream->interleave_block_size = interleave; + + if (header_name_offset) + snprintf(vgmstream->stream_name, STREAM_NAME_SIZE, "%s/%s", header_name, stream_name); + else + snprintf(vgmstream->stream_name, STREAM_NAME_SIZE, "%s", stream_name); + + switch (stream_codec) { + case 0x00: /* PS2 (Burnout series, Black, Call of Duty: Finest Hour) */ + vgmstream->num_samples = ps_bytes_to_samples(stream_size, channels); + vgmstream->coding_type = coding_PSX; + break; + + case 0x01: /* Xbox (Burnout series, Black) */ + vgmstream->num_samples = pcm16_bytes_to_samples(stream_size, channels); + vgmstream->coding_type = coding_PCM16LE; + break; + + case 0x03: /* GCN (Call of Duty: Finest Hour) */ + vgmstream->num_samples = dsp_bytes_to_samples(stream_size, channels); + dsp_read_coefs_be(vgmstream, sf, misc_data_offset + 0x1C, 0); + dsp_read_hist_be(vgmstream, sf, misc_data_offset + 0x40, 0); + vgmstream->coding_type = coding_NGC_DSP; + break; + + case 0x04: /* Xbox (Black, Call of Duty: Finest Hour) */ + vgmstream->num_samples = xbox_ima_bytes_to_samples(stream_size, channels); + vgmstream->coding_type = coding_XBOX_IMA; + break; + + default: + VGM_LOG("AWD: unknown codec type %d\n", stream_codec); + goto fail; + } + + if (!vgmstream_open_stream(vgmstream, sf, stream_offset)) + goto fail; + + return vgmstream; + +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/bnk_sony.c b/Frameworks/vgmstream/vgmstream/src/meta/bnk_sony.c index 4f83ddb9c..56b66314d 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/bnk_sony.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/bnk_sony.c @@ -9,10 +9,9 @@ typedef enum { PSX, PCM16, ATRAC9, HEVAG } bnk_codec; VGMSTREAM* init_vgmstream_bnk_sony(STREAMFILE* sf) { VGMSTREAM* vgmstream = NULL; uint32_t start_offset, stream_offset, name_offset = 0; - uint32_t sblk_offset, data_offset; - uint32_t stream_size, data_size, interleave = 0; - int channels = 0, loop_flag, sample_rate, parts, sblk_version, big_endian; - int loop_start = 0, loop_end = 0; + uint32_t stream_size, interleave = 0; + int channels = 0, loop_flag, sample_rate, big_endian; + int32_t loop_start = 0, loop_end = 0; uint32_t center_note, center_fine, flags; uint32_t atrac9_info = 0; @@ -37,25 +36,35 @@ VGMSTREAM* init_vgmstream_bnk_sony(STREAMFILE* sf) { big_endian = 0; } else { - goto fail; + return NULL; } /* checks */ if (!check_extensions(sf, "bnk")) - goto fail; + return NULL; + uint32_t sblk_offset, data_offset, data_size; + int parts, sblk_version; parts = read_u32(0x04,sf); - if (parts < 2 || parts > 3) goto fail; + if (parts < 2 || parts > 3) + return NULL; /* in theory a bank can contain multiple blocks */ + /* section sizes don't include padding (sometimes aligned to 0x10/0x800) */ sblk_offset = read_u32(0x08,sf); - /* 0x0c: sblk size */ + //sblk_size = read_u32(0x0c,sf); data_offset = read_u32(0x10,sf); - data_size = read_u32(0x14,sf); - /* when sblk_offset >= 0x20: */ - /* 0x18: ZLSD small footer, rare in earlier versions [Yakuza 6's Puyo Puyo (PS4)] */ - /* 0x1c: ZLSD size */ + data_size = read_u32(0x14,sf); + + /* ZLSD small footer, rare in earlier versions and more common later [Yakuza 6's Puyo Puyo (PS4)] */ + //if (sblk_offset >= 0x20) { + // zlsd_offset = read_u32(0x18,sf); + // zlsd_size = read_u32(0x1c,sf); + //} + + if (sblk_offset > 0x20) + return NULL; /* SE banks, also used for music. Most table fields seems reserved/defaults and * don't change much between subsongs or files, so they aren't described in detail. @@ -64,7 +73,7 @@ VGMSTREAM* init_vgmstream_bnk_sony(STREAMFILE* sf) { /* SBlk part: parse header */ if (read_u32(sblk_offset+0x00,sf) != get_id32be("klBS")) /* SBlk = SFX block */ - goto fail; + return NULL; sblk_version = read_u32(sblk_offset+0x04,sf); /* 0x08: flags? (sblk_version>=0x0d?, 0x03=Vita, 0x06=PS4, 0x05=PS5) * - 04: non-fixed bank? @@ -146,6 +155,7 @@ VGMSTREAM* init_vgmstream_bnk_sony(STREAMFILE* sf) { break; case 0x1a: /* Demon's Souls (PS5) */ + case 0x23: /* The Last of Us (PC) */ default: vgm_logi("BNK: unknown version %x (report)\n", sblk_version); @@ -223,7 +233,7 @@ VGMSTREAM* init_vgmstream_bnk_sony(STREAMFILE* sf) { } - //;VGM_LOG("BNK: subsongs %i, table2_entry=%lx, table3_entry=%lx\n", total_subsongs,table2_entry_offset,table3_entry_offset); + //;VGM_LOG("BNK: subsongs %i, table2_entry=%x, table3_entry=%x\n", total_subsongs,table2_entry_offset,table3_entry_offset); if (target_subsong < 0 || target_subsong > total_subsongs || total_subsongs < 1) goto fail; /* this means some subsongs repeat streams, that can happen in some sfx banks, whatevs */ @@ -314,6 +324,7 @@ VGMSTREAM* init_vgmstream_bnk_sony(STREAMFILE* sf) { break; default: + VGM_LOG("BNK: missing version\n"); goto fail; } @@ -461,8 +472,10 @@ VGMSTREAM* init_vgmstream_bnk_sony(STREAMFILE* sf) { case 0x02: /* ATRAC9 mono */ case 0x05: /* ATRAC9 stereo */ - if (read_u32(start_offset+0x08,sf) + 0x08 != extradata_size) /* repeat? */ + if (read_u32(start_offset+0x08,sf) + 0x08 != extradata_size) { /* repeat? */ + VGM_LOG("BNK: unknown subtype\n"); goto fail; + } channels = (type == 0x02) ? 1 : 2; atrac9_info = read_u32be(start_offset+0x0c,sf); @@ -485,8 +498,10 @@ VGMSTREAM* init_vgmstream_bnk_sony(STREAMFILE* sf) { case 0x0f: case 0x10: type = read_u16(start_offset+0x00,sf); - if (read_u32(start_offset+0x04,sf) != 0x01) /* type? */ + if (read_u32(start_offset+0x04,sf) != 0x01) { /* type? */ + VGM_LOG("BNK: unknown subtype\n"); goto fail; + } extradata_size = 0x10 + read_u32(start_offset+0x08,sf); /* 0x80 for AT9, 0x10 for PCM/PS-ADPCM */ /* 0x0c: null? */ diff --git a/Frameworks/vgmstream/vgmstream/src/meta/bwav.c b/Frameworks/vgmstream/vgmstream/src/meta/bwav.c index 8cc39a368..b2f933cd8 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/bwav.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/bwav.c @@ -75,13 +75,15 @@ VGMSTREAM* init_vgmstream_bwav(STREAMFILE* sf) { vgmstream->allow_dual_stereo = 1; /* Animal Crossing: Happy Home Paradise */ break; - case 0x0002: /* Zelda TOTK (Switch) */ +#ifdef VGM_USE_FFMPEG + case 0x0002: /* The Legend of Zelda: Tears of the Kingdom (Switch) */ vgmstream->layout_data = build_layered_data(sf, channels); if (!vgmstream->layout_data) goto fail; vgmstream->coding_type = coding_FFmpeg; vgmstream->layout_type = layout_layered; break; +#endif default: goto fail; } diff --git a/Frameworks/vgmstream/vgmstream/src/meta/dsp_adx.c b/Frameworks/vgmstream/vgmstream/src/meta/dsp_adx.c index 42cbb3d8e..ac4564db3 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/dsp_adx.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/dsp_adx.c @@ -2,36 +2,38 @@ #include "../coding/coding.h" #include "../util.h" -/* .ADX - from Xenoblade 3D (3DS) */ -VGMSTREAM* init_vgmstream_dsp_adx(STREAMFILE *sf) { +/* .ADX - from Monster Games [Xenoblade 3D (3DS)] */ +VGMSTREAM* init_vgmstream_adx_monster(STREAMFILE *sf) { VGMSTREAM* vgmstream = NULL; int loop_flag, channels; int channel_header_spacing = 0x34; + /* checks */ - if (!check_extensions(sf,"adx")) - goto fail; - if (read_u32be(0x00,sf) != 0x02000000) + return NULL; + + /* .adx: reused from Wii version, but actually DSP */ + if (!check_extensions(sf,"adx")) + return NULL; + + channels = read_s32le(0x0, sf); + loop_flag = read_s16le(0x6e, sf); + if (channels > 2 || channels < 0) goto fail; - channels = read_32bitLE(0, sf); - loop_flag = read_16bitLE(0x6e, sf); - - if (channels > 2 || channels < 0) goto fail; - vgmstream = allocate_vgmstream(channels, loop_flag); if (!vgmstream) goto fail; + vgmstream->meta_type = meta_ADX_MONSTER; vgmstream->coding_type = coding_NGC_DSP; vgmstream->layout_type = layout_none; - vgmstream->meta_type = meta_XB3D_ADX; - vgmstream->sample_rate = read_32bitLE(0x70,sf); - vgmstream->num_samples = read_32bitLE(0x74, sf); - vgmstream->loop_start_sample = read_32bitLE(0x78, sf); - vgmstream->loop_end_sample = read_32bitLE(0x7c, sf); + vgmstream->sample_rate = read_s32le(0x70,sf); + vgmstream->num_samples = read_s32le(0x74, sf); + vgmstream->loop_start_sample = read_s32le(0x78, sf); + vgmstream->loop_end_sample = read_s32le(0x7c, sf); - dsp_read_coefs_le(vgmstream,sf, 0x4, channel_header_spacing); + dsp_read_coefs_le(vgmstream,sf, 0x04, channel_header_spacing); /* semi-interleave: manually open streams at offset */ { diff --git a/Frameworks/vgmstream/vgmstream/src/meta/dsp_bdsp.c b/Frameworks/vgmstream/vgmstream/src/meta/dsp_bdsp.c deleted file mode 100644 index a72dd7820..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/dsp_bdsp.c +++ /dev/null @@ -1,87 +0,0 @@ -#include "meta.h" -#include "../layout/layout.h" -#include "../util.h" - -VGMSTREAM * init_vgmstream_dsp_bdsp(STREAMFILE *streamFile) { - - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - int channel_count; - int loop_flag; - int i; - off_t start_offset; - - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("bdsp",filename_extension(filename))) goto fail; - - channel_count = 2; - loop_flag = 0; - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - /* fill in the vital statistics */ - vgmstream->channels = channel_count; - vgmstream->sample_rate = read_32bitBE(0x8,streamFile); - vgmstream->coding_type = coding_NGC_DSP; - -#if 0 - if(loop_flag) { - vgmstream->loop_start_sample = read_32bitBE(0x64,streamFile); - vgmstream->loop_end_sample = read_32bitBE(0x68,streamFile); - } -#endif - - - vgmstream->layout_type = layout_blocked_bdsp; - vgmstream->interleave_block_size = 0x8; - vgmstream->meta_type = meta_DSP_BDSP; - - /* open the file for reading by each channel */ - { - for (i=0;ich[i].streamfile = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); - - if (!vgmstream->ch[i].streamfile) goto fail; - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset=i*vgmstream->interleave_block_size; - } - } - - if (vgmstream->coding_type == coding_NGC_DSP) { - int i; - for (i=0;i<16;i++) { - vgmstream->ch[0].adpcm_coef[i] = read_16bitBE(0x1C+i*2,streamFile); - } - if (vgmstream->channels == 2) { - for (i=0;i<16;i++) { - vgmstream->ch[1].adpcm_coef[i] = read_16bitBE(0x7C+i*2,streamFile); - } - } - } - - /* Calc num_samples */ - start_offset = 0x0; - block_update_bdsp(start_offset,vgmstream); - vgmstream->num_samples=0; - - do - { - vgmstream->num_samples += vgmstream->current_block_size*14/8; - block_update_bdsp(vgmstream->next_block_offset,vgmstream); - } - while (vgmstream->next_block_offsetstream_index; + if (target_subsong == 0) target_subsong = 1; + + char container_name[0x10+1]; + char track_name[0x10+1]; + char ext[0x04+1]; + { + /* N containers (external files) that may have N tracks, so we'll map all to subsongs */ + + bool track_found = false; + uint32_t offset = 0x10; + for (int i = 0; i < containers; i++) { + uint32_t header_offset = read_u32le(offset + 0x00,sf); + int tracks = read_s32le(offset + 0x04,sf); + + /* target in container */ + if (!track_found && target_subsong >= total_subsongs + 1 && target_subsong < total_subsongs + 1 + tracks) { + read_string(container_name, 0x10, offset + 0x08, sf); + + int track_pos = target_subsong - total_subsongs - 1; + uint32_t track_offset = header_offset + track_pos * 0x18; + uint32_t curr_offset, flags, next_offset; + + curr_offset = read_u32le(track_offset + 0x00, sf); + sample_rate = read_u16le(track_offset + 0x04, sf); + flags = read_u16le(track_offset + 0x06, sf); + read_string(track_name, 0x10, track_offset + 0x08, sf); + next_offset = read_u32le(track_offset + 0x18, sf); /* always exists as even after last track */ + + /* 8ch seen in Race Driver Grid music*.WIM, 2ch in other music tracks */ + channels = ((flags >> 5) & 0x7) + 1; + loop_flag = flags & (1<<4); + /* flag 0x8000: ? (common) */ + /* others: not seen */ + + stream_offset = curr_offset; + stream_size = next_offset - curr_offset; + + /* after all tracks comes container size + extension/codec */ + uint32_t ext_offset = header_offset + tracks * 0x18 + 0x04; + codec = read_u32be(ext_offset + 0x00, sf); + read_string(ext, 0x04, ext_offset + 0x00, sf); + + track_found = true; + } + + total_subsongs += tracks; + offset += 0x18; + } + + if (target_subsong > total_subsongs || total_subsongs <= 0) goto fail; + if (!track_found) goto fail; + } + + { + char resource_name[255]; + snprintf(resource_name, sizeof(resource_name), "%s.%s", container_name, ext); + + sb = open_streamfile_by_filename(sf, resource_name); + if (sb == NULL) { + vgm_logi("DIC1: external file '%s' not found (put together)\n", resource_name); + /* allow missing as silence since some game use huge .dic that is a bit hard to get */ + //goto fail; + } + } + + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels, loop_flag); + if (!vgmstream) goto fail; + + vgmstream->meta_type = meta_DIC1; + vgmstream->sample_rate = sample_rate; + vgmstream->num_streams = total_subsongs; + vgmstream->stream_size = stream_size; + + + switch(codec) { + case 0x57495000: //WIP\0 + vgmstream->coding_type = coding_PCM16LE; + vgmstream->layout_type = layout_interleave; + vgmstream->interleave_block_size = 0x02; + + vgmstream->num_samples = pcm16_bytes_to_samples(stream_size, channels); + break; + + case 0x57494D00: //WIM\0 + vgmstream->coding_type = coding_ULAW; + vgmstream->layout_type = layout_interleave; + vgmstream->interleave_block_size = 0x01; + + vgmstream->num_samples = pcm8_bytes_to_samples(stream_size, channels); + break; + + case 0x57494100: //WIA\0 + vgmstream->coding_type = coding_XBOX_IMA; + vgmstream->layout_type = layout_none; + + vgmstream->num_samples = xbox_ima_bytes_to_samples(stream_size, channels); + stream_offset += 0x04; /* all streams start with 0xFFFFFFFF, may be some delimiter */ + break; + +#ifdef VGM_USE_VORBIS + case 0x57494F00: //WIO\0 + vgmstream->codec_data = init_ogg_vorbis(sb, stream_offset, stream_size, NULL); + if (!vgmstream->codec_data) goto fail; + vgmstream->coding_type = coding_OGG_VORBIS; + vgmstream->layout_type = layout_none; + + ogg_vorbis_get_samples(vgmstream->codec_data, &vgmstream->num_samples); + break; +#endif + + default: + VGM_LOG("DIC1: unknown codec\n"); + goto fail; + } + snprintf(vgmstream->stream_name, STREAM_NAME_SIZE, "%s.%s%s/%s", container_name, ext, sb ? "" : "[MISSING]", track_name); + + vgmstream->loop_start_sample = 0; + vgmstream->loop_end_sample = vgmstream->num_samples; + if (!sb) { + vgmstream->coding_type = coding_SILENCE; + vgmstream->layout_type = layout_none; + } + + if (!vgmstream_open_stream(vgmstream, sb, stream_offset)) + goto fail; + + close_streamfile(sb); + return vgmstream; + +fail: + close_vgmstream(vgmstream); + close_streamfile(sb); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/fsb.c b/Frameworks/vgmstream/vgmstream/src/meta/fsb.c index ab9961591..182b2da65 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/fsb.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/fsb.c @@ -119,8 +119,9 @@ VGMSTREAM* init_vgmstream_fsb(STREAMFILE* sf) { /* .fsb: standard * .bnk: Hard Corps Uprising (PS3) * .sfx: Geon Cube (Wii) - * .xen: Guitar Hero: World Tour (PC) */ - if ( !check_extensions(sf, "fsb,bnk,sfx,xen") ) + * .ps3: Neversoft games (PS3) + * .xen: Neversoft games (X360/PC) */ + if ( !check_extensions(sf, "fsb,bnk,sfx,ps3,xen") ) goto fail; fsb.id = read_u32be(0x00,sf); diff --git a/Frameworks/vgmstream/vgmstream/src/meta/fsb_keys.h b/Frameworks/vgmstream/vgmstream/src/meta/fsb_keys.h index 384ef26fe..b852a04ec 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/fsb_keys.h +++ b/Frameworks/vgmstream/vgmstream/src/meta/fsb_keys.h @@ -25,7 +25,7 @@ typedef struct { #define MODE_FSB4_STD (FLAG_FSB4 | FLAG_STD) #define MODE_FSB4_ALT (FLAG_FSB4 | FLAG_ALT) -#define MODE_FSB4_ALL (FLAG_FSB4 | FLAG_ALT) +#define MODE_FSB4_ALL (FLAG_FSB4 | FLAG_STD | FLAG_ALT) #define MODE_FSB5_STD (FLAG_FSB5 | FLAG_STD) #define MODE_FSB5_ALT (FLAG_FSB5 | FLAG_STD) #define MODE_FSB5_ALL (FLAG_FSB5 | FLAG_STD | FLAG_ALT) @@ -42,8 +42,8 @@ static const fsbkey_info fsbkey_list[] = { { MODE_FSB5_STD, FSBKEY_ADD("sTOoeJXI2LjK8jBMOk8h5IDRNZl3jq3I") }, // Slightly Mad Studios: Project CARS (PC?), World of Speed (PC) { MODE_FSB5_STD, FSBKEY_ADD("%lAn2{Pi*Lhw3T}@7*!kV=?qS$@iNlJ") }, // Ghost in the Shell: First Assault (PC) { MODE_FSB5_STD, FSBKEY_ADD("1^7%82#&5$~/8sz") }, // RevHeadz Engine Sounds (Mobile) - { MODE_FSB5_ALL, FSBKEY_ADD("FDPrVuT4fAFvdHJYAgyMzRF4EcBAnKg") }, // Dark Souls 3 (PC) [untested] - { MODE_FSB4_ALL, FSBKEY_ADD("p&oACY^c4LK5C2v^x5nIO6kg5vNH$tlj") }, // Need for Speed Shift 2 Unleashed (PC demo?)[untested] + { MODE_FSB5_STD, FSBKEY_ADD("FDPrVuT4fAFvdHJYAgyMzRF4EcBAnKg") }, // Dark Souls 3 (PC) + { MODE_FSB4_STD, FSBKEY_ADD("p&oACY^c4LK5C2v^x5nIO6kg5vNH$tlj") }, // Need for Speed Shift 2 Unleashed (PC) { MODE_FSB5_STD, FSBKEY_ADD("996164B5FC0F402983F61F220BB51DC6") }, // Mortal Kombat X/XL (PC) { MODE_FSB5_STD, FSBKEY_ADD("logicsounddesignmwsdev") }, // Mirror War: Reincarnation of Holiness (PC) { MODE_FSBS_ALL, FSBKEY_ADD("gat@tcqs2010") }, // Xian Xia Chuan (PC) [untested] @@ -56,8 +56,8 @@ static const fsbkey_info fsbkey_list[] = { { MODE_FSBS_ALL, FSBKEY_ADD("B2A7BB00") }, // Supreme Commander 2 [untested] { MODE_FSB4_STD, FSBKEY_ADD("ghfxhslrghfxhslr") }, // Cookie Run: Ovenbreak { MODE_FSB4_ALT, FSBKEY_ADD("truck/impact/carbody") },// Monster Jam (PS2) [FSB3] - { MODE_FSB4_ALT, FSBKEY_ADD("\xFC\xF9\xE4\xB3\xF5\x57\x5C\xA5\xAC\x13\xEC\x4A\x43\x19\x58\xEB\x4E\xF3\x84\x0B\x8B\x78\xFA\xFD\xBB\x18\x46\x7E\x31\xFB\xD0") }, - { MODE_FSB4_ALT, FSBKEY_ADD("\x8C\xFA\xF3\x14\xB1\x53\xDA\xAB\x2B\x82\x6B\xD5\x55\x16\xCF\x01\x90\x20\x28\x14\xB1\x53\xD8") }, + { MODE_FSB4_ALT, FSBKEY_ADD("\xFC\xF9\xE4\xB3\xF5\x57\x5C\xA5\xAC\x13\xEC\x4A\x43\x19\x58\xEB\x4E\xF3\x84\x0B\x8B\x78\xFA\xFD\xBB\x18\x46\x7E\x31\xFB\xD0") }, // Guitar Hero 5 (X360) + { MODE_FSB4_ALT, FSBKEY_ADD("\x8C\xFA\xF3\x14\xB1\x53\xDA\xAB\x2B\x82\x6B\xD5\x55\x16\xCF\x01\x90\x20\x28\x14\xB1\x53\xD8") }, // Guitar Hero: Metallica (X360) { MODE_FSB5_STD, FSBKEY_ADD("G0KTrWjS9syqF7vVD6RaVXlFD91gMgkC") }, // Sekiro: Shadows Die Twice (PC) { MODE_FSB5_STD, FSBKEY_ADD("BasicEncryptionKey") }, // SCP: Unity (PC) { MODE_FSB5_STD, FSBKEY_ADD("FXnTffGJ9LS855Gc") }, // Worms Rumble Beta (PC) diff --git a/Frameworks/vgmstream/vgmstream/src/meta/hca_keys.h b/Frameworks/vgmstream/vgmstream/src/meta/hca_keys.h index c50f1cc01..555f47a43 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/hca_keys.h +++ b/Frameworks/vgmstream/vgmstream/src/meta/hca_keys.h @@ -13,8 +13,8 @@ typedef struct { /** - * List of known keys, extracted from the game files (several found in 2ch.net, others from data analisys). - * CRI's tools expect an unsigned 64 bit number string, but keys are commonly found online in hex form. + * List of known keys, extracted from the game files (most from data analisys, some from 2ch.net/forums). + * CRI's tools expect an unsigned 64 bit numberic string, but keys are commonly found online in hex form. * Keys only use 56 bits though, so the upper 8 bits can be ignored. * * Some ACB+AWB after mid 2018 use a user seed key + a scramble subkey in the AWB (normally 16b LE at 0x0e) @@ -1181,9 +1181,12 @@ static const hcakey_info hcakey_list[] = { // Love Live! School Idol Festival 2 MIRACLE LIVE (Android) {5067530812966687744}, // 46537c6ceb39d400 - // 404 Game RE:SET Prologue Demo (Android) + // 404 Game RE:SET (Android) {21588207721978971}, // 004CB25C4C9B1C5B + // Disney Star Smash (Android) + {3941111674189632}, // 000E006B915C3740 + }; #endif/*_HCA_KEYS_H_*/ diff --git a/Frameworks/vgmstream/vgmstream/src/meta/hd3_bd3.c b/Frameworks/vgmstream/vgmstream/src/meta/hd3_bd3.c index c69f2ad94..44e0cc6f1 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/hd3_bd3.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/hd3_bd3.c @@ -1,120 +1,101 @@ -#include "meta.h" -#include "../coding/coding.h" - - /* HD3+BD3 - Sony PS3 bank format [Elevator Action Deluxe (PS3), R-Type Dimensions (PS3)] */ -VGMSTREAM * init_vgmstream_hd3_bd3(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - STREAMFILE * streamHeader = NULL; - off_t start_offset; - int channel_count, loop_flag, sample_rate; - size_t interleave, stream_size; - int total_subsongs, target_subsong = streamFile->stream_index; - - - /* checks */ - if (!check_extensions(streamFile, "bd3")) - goto fail; - - streamHeader = open_streamfile_by_ext(streamFile,"hd3"); - if (!streamHeader) goto fail; - - if (read_32bitBE(0x00,streamHeader) != 0x50334844) /* "P3HD" */ - goto fail; - - /* 0x04: section size (not including first 0x08) */ - /* 0x08: version? 0x00020000 */ - /* 0x10: "P3PG" offset (seems mostly empty and contains number of subsongs towards the end) */ - /* 0x14: "P3TN" offset (some kind of config?) */ - /* 0x18: "P3VA" offset (VAG headers) */ - { - off_t section_offset = read_32bitBE(0x18,streamHeader); - off_t header_offset; - size_t section_size; - int i, entries, is_bgm = 0; - - if (read_32bitBE(section_offset+0x00,streamHeader) != 0x50335641) /* "P3VA" */ - goto fail; - section_size = read_32bitBE(section_offset+0x04,streamHeader); /* (not including first 0x08) */ - /* 0x08 size of all subsong headers + 0x10 */ - - entries = read_32bitBE(section_offset+0x14,streamHeader); - /* often there is an extra subsong than written, but may be padding instead */ - if (read_32bitBE(section_offset + 0x20 + entries*0x10 + 0x04,streamHeader)) /* has sample rate */ - entries += 1; - - if (entries * 0x10 > section_size) /* just in case, padding after entries is possible */ - goto fail; - - /* autodetect use of N bank entries as channels [Elevator Action Deluxe (PS3)] */ - if (entries > 1) { - size_t channel_size = read_32bitBE(section_offset+0x20+0x08,streamHeader); - is_bgm = 1; - - for (i = 1; i < entries; i++) { - size_t next_size = read_32bitBE(section_offset+0x20+(i*0x10)+0x08,streamHeader); - if (channel_size != next_size) { - is_bgm = 0; - break; - } - } - } - - if (is_bgm) { - total_subsongs = 1; - if (target_subsong == 0) target_subsong = 1; - if (target_subsong < 0 || target_subsong > total_subsongs || total_subsongs < 1) goto fail; - - header_offset = section_offset+0x20+(0)*0x10; - start_offset = read_32bitBE(header_offset+0x00,streamHeader); /* 0x00 */ - sample_rate = read_32bitBE(header_offset+0x04,streamHeader); - stream_size = get_streamfile_size(streamFile); - if (read_32bitBE(header_offset+0x0c,streamHeader) != -1) - goto fail; - - channel_count = entries; - interleave = stream_size / channel_count; - } - else { - total_subsongs = entries; - if (target_subsong == 0) target_subsong = 1; - if (target_subsong < 0 || target_subsong > total_subsongs || total_subsongs < 1) goto fail; - - header_offset = section_offset+0x20+(target_subsong-1)*0x10; - start_offset = read_32bitBE(header_offset+0x00,streamHeader); - sample_rate = read_32bitBE(header_offset+0x04,streamHeader); - stream_size = read_32bitBE(header_offset+0x08,streamHeader); - if (read_32bitBE(header_offset+0x0c,streamHeader) != -1) - goto fail; - - channel_count = 1; - interleave = 0; - } - } - - loop_flag = 0; - - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - vgmstream->sample_rate = sample_rate; - vgmstream->num_samples = ps_bytes_to_samples(stream_size, channel_count); - vgmstream->num_streams = total_subsongs; - vgmstream->stream_size = stream_size; - - vgmstream->meta_type = meta_HD3_BD3; - vgmstream->coding_type = coding_PSX; - vgmstream->layout_type = (channel_count == 1) ? layout_none : layout_interleave; - vgmstream->interleave_block_size = interleave; - - if (!vgmstream_open_stream(vgmstream,streamFile,start_offset)) - goto fail; - - close_streamfile(streamHeader); - return vgmstream; -fail: - close_streamfile(streamHeader); - close_vgmstream(vgmstream); - return NULL; -} +#include "meta.h" +#include "../coding/coding.h" + + /* HD3+BD3 - Sony PS3 bank format [Elevator Action Deluxe (PS3), R-Type Dimensions (PS3)] */ +VGMSTREAM* init_vgmstream_hd3_bd3(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + STREAMFILE* sb = NULL; + uint32_t stream_offset, stream_size; + int channels, loop_flag, sample_rate, interleave; + int total_subsongs, target_subsong = sf->stream_index; + + + /* checks */ + if (!is_id32be(0x00,sf, "P3HD")) + return NULL; + if (!check_extensions(sf, "hd3")) + return NULL; + + sb = open_streamfile_by_ext(sf,"bd3"); + if (!sf) goto fail; + + /* 0x04: section size (not including first 0x08) */ + /* 0x08: version? 0x00020000 */ + /* 0x10: "P3PG" offset (seems mostly empty and contains number of subsongs towards the end) */ + /* 0x14: "P3TN" offset (some kind of config/volumes/etc?) */ + /* 0x18: "P3VA" offset (VAG headers) */ + { + uint32_t section_offset = read_u32be(0x18,sf); + uint32_t section_size; + int entries; + + if (!is_id32be(section_offset+0x00,sf, "P3VA")) + goto fail; + section_size = read_u32be(section_offset+0x04,sf); /* (not including first 0x08) */ + /* 0x08 size of all subsong headers + 0x10 */ + + entries = read_u32be(section_offset+0x14,sf); + /* often there is an extra subsong than written, but may be padding instead */ + if (read_u32be(section_offset + 0x20 + entries*0x10 + 0x04,sf)) /* has sample rate */ + entries += 1; + + if (entries * 0x10 > section_size) /* just in case, padding after entries is possible */ + goto fail; + + /* very often subsongs make stereo pairs (even with many), this detects simple cases */ //TODO check if there is some flag or remove hack + bool is_bgm = false; + if (entries == 2) { + uint32_t curr_size = read_u32be(section_offset+0x20+(0*0x10)+0x08,sf); + uint32_t next_size = read_u32be(section_offset+0x20+(1*0x10)+0x08,sf); + is_bgm = (curr_size == next_size); + } + + if (is_bgm) { + total_subsongs = 1; + channels = entries; + } + else { + total_subsongs = entries; + channels = 1; + } + if (target_subsong == 0) target_subsong = 1; + if (target_subsong < 0 || target_subsong > total_subsongs || total_subsongs < 1) goto fail; + if (target_subsong == 0) target_subsong = 1; + if (target_subsong < 0 || target_subsong > total_subsongs || total_subsongs < 1) goto fail; + + uint32_t header_offset = section_offset+0x20+(target_subsong-1)*0x10; + stream_offset = read_u32be(header_offset+0x00,sf); + sample_rate = read_u32be(header_offset+0x04,sf); + stream_size = read_u32be(header_offset+0x08,sf) * channels; + interleave = stream_size / channels; + if (read_s32be(header_offset+0x0c,sf) != -1) + goto fail; + } + + loop_flag = 0; + + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels, loop_flag); + if (!vgmstream) goto fail; + + vgmstream->sample_rate = sample_rate; + vgmstream->num_samples = ps_bytes_to_samples(stream_size, channels); + vgmstream->num_streams = total_subsongs; + vgmstream->stream_size = stream_size; + + vgmstream->meta_type = meta_HD3_BD3; + vgmstream->coding_type = coding_PSX; + vgmstream->layout_type = (channels == 1) ? layout_none : layout_interleave; + vgmstream->interleave_block_size = interleave; + + if (!vgmstream_open_stream(vgmstream, sb, stream_offset)) + goto fail; + + close_streamfile(sb); + return vgmstream; +fail: + close_streamfile(sb); + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ps2_ild.c b/Frameworks/vgmstream/vgmstream/src/meta/ild.c similarity index 97% rename from Frameworks/vgmstream/vgmstream/src/meta/ps2_ild.c rename to Frameworks/vgmstream/vgmstream/src/meta/ild.c index d7b1146ea..d961fd1c0 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/ps2_ild.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/ild.c @@ -10,10 +10,10 @@ VGMSTREAM* init_vgmstream_ild(STREAMFILE* sf) { /* check ILD Header */ if (!is_id32be(0x00,sf, "ILD\0")) - goto fail; + return NULL; if (!check_extensions(sf, "ild")) - goto fail; + return NULL; channels = read_u32le(0x04,sf); /* tracks (seen 2 and 4) */ start_offset = read_u32le(0x08,sf); diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ps2_enth.c b/Frameworks/vgmstream/vgmstream/src/meta/lp_ap_lep.c similarity index 91% rename from Frameworks/vgmstream/vgmstream/src/meta/ps2_enth.c rename to Frameworks/vgmstream/vgmstream/src/meta/lp_ap_lep.c index 4501a1f54..bf5231735 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/ps2_enth.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/lp_ap_lep.c @@ -1,9 +1,9 @@ #include "meta.h" #include "../coding/coding.h" -#include "ps2_enth_streamfile.h" +#include "lp_ap_lep_streamfile.h" /* LP/AP/LEP - from Konami (KCES)'s Enthusia: Professional Racing (PS2) */ -VGMSTREAM* init_vgmstream_ps2_enth(STREAMFILE* sf) { +VGMSTREAM* init_vgmstream_lp_ap_lep(STREAMFILE* sf) { VGMSTREAM* vgmstream = NULL; STREAMFILE* temp_sf = NULL; off_t start_offset; @@ -13,10 +13,13 @@ VGMSTREAM* init_vgmstream_ps2_enth(STREAMFILE* sf) { /* checks */ + if (!is_id32be(0x00,sf,"LP ") && !is_id32be(0x00,sf,"AP ") && !is_id32be(0x00,sf,"LEP ")) + return NULL; + /* .bin/lbin: internal (no names in bigfiles but exes mention "bgm%05d.bin" and "LEP data") * .lp/lep/ap: header ID */ if (!check_extensions(sf, "bin,lbin,lp,lep,ap")) - goto fail; + return NULL; id = read_u32be(0x00,sf); switch (id) { @@ -49,7 +52,7 @@ VGMSTREAM* init_vgmstream_ps2_enth(STREAMFILE* sf) { vgmstream = allocate_vgmstream(channels, loop_flag); if (!vgmstream) goto fail; - vgmstream->meta_type = meta_PS2_ENTH; + vgmstream->meta_type = meta_LP_AP_LEP; vgmstream->sample_rate = sample_rate; switch (id) { diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ps2_enth_streamfile.h b/Frameworks/vgmstream/vgmstream/src/meta/lp_ap_lep_streamfile.h similarity index 100% rename from Frameworks/vgmstream/vgmstream/src/meta/ps2_enth_streamfile.h rename to Frameworks/vgmstream/vgmstream/src/meta/lp_ap_lep_streamfile.h diff --git a/Frameworks/vgmstream/vgmstream/src/meta/lrmd.c b/Frameworks/vgmstream/vgmstream/src/meta/lrmd.c index 4792884ec..a5a1ab3c5 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/lrmd.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/lrmd.c @@ -3,9 +3,10 @@ #include "lrmd_streamfile.h" /* LRMD - Sony/SCEI's format (Loco Roco Music Data?) [LocoRoco 2 (PSP), LocoRoco: Midnight Carnival (PSP)] */ -VGMSTREAM * init_vgmstream_lrmd(STREAMFILE *sf) { - VGMSTREAM * vgmstream = NULL; - STREAMFILE * sf_h = NULL, *temp_sf = NULL; +VGMSTREAM* init_vgmstream_lrmd(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + STREAMFILE* sb = NULL; + STREAMFILE* temp_sf = NULL; off_t stream_offset, section1_offset, section2_offset, basename_offset, subname_offset; size_t stream_size, max_chunk, block_size = 0, chunk_start, chunk_size; int loop_flag, channel_count, sample_rate, layers; @@ -14,39 +15,41 @@ VGMSTREAM * init_vgmstream_lrmd(STREAMFILE *sf) { /* checks */ - if (!check_extensions(sf, "lrmb")) - goto fail; - sf_h = open_streamfile_by_ext(sf, "lrmh"); - if (!sf_h) goto fail; - - - if (read_u32be(0x00, sf_h) != 0x4C524D44) /* "LRMD" */ - goto fail; + if (!is_id32be(0x00, sf, "LRMD")) + return NULL; /* 0x00: version 1? */ /* 0x08: header size */ /* 0x0c: body size */ - if (read_u32be(0x10, sf_h) != 0x52455144) /* "REQD" */ - goto fail; + if (!is_id32be(0x10, sf, "REQD")) + return NULL; /* 0x14: chunk size */ /* 0x18: null? */ /* 0x1c: 1? */ + + /* .lrmh+lrmb: actual extensions */ + if (!check_extensions(sf, "lrmh")) + goto fail; + + sb = open_streamfile_by_ext(sf, "lrmb"); + if (!sb) goto fail; + /* 0x20: null */ - basename_offset = read_u32le(0x24, sf_h); - if (read_u16le(0x28, sf_h) != 0x4000) { /* pitch? */ + basename_offset = read_u32le(0x24, sf); + if (read_u16le(0x28, sf) != 0x4000) { /* pitch? */ VGM_LOG("LRMD: unknown value\n"); goto fail; } - max_chunk = read_u16le(0x2a, sf_h); - num_samples = read_u32le(0x2c, sf_h); + max_chunk = read_u16le(0x2a, sf); + num_samples = read_u32le(0x2c, sf); /* 0x30: null? */ /* 0x34: data size for all layers */ - layers = read_u32le(0x38, sf_h); - section1_offset = read_u32le(0x3c, sf_h); + layers = read_u32le(0x38, sf); + section1_offset = read_u32le(0x3c, sf); /* 0x40: lip table entries */ /* 0x44: lip table offset */ /* 0x48: section2 flag */ - section2_offset = read_u32le(0x4c, sf_h); + section2_offset = read_u32le(0x4c, sf); /* 0x40: section3 flag */ /* 0x44: section3 (unknown) */ @@ -68,11 +71,11 @@ VGMSTREAM * init_vgmstream_lrmd(STREAMFILE *sf) { int layer_channels; /* not too sure but needed for LR2's muihouse last 3 layers */ - layer_channels = read_u8(header_offset + 0x0d, sf_h) != 0 ? 1 : 2; + layer_channels = read_u8(header_offset + 0x0d, sf) != 0 ? 1 : 2; if (i + 1 == target_subsong) { /* 0x00: null */ - subname_offset = read_u32le(header_offset + 0x04, sf_h); + subname_offset = read_u32le(header_offset + 0x04, sf); /* 0x08: unk */ /* 0x0c: flags? */ /* 0x10: null? */ @@ -94,9 +97,9 @@ VGMSTREAM * init_vgmstream_lrmd(STREAMFILE *sf) { /* section2: loops */ /* 0x00: offset to "loop" name */ if (section2_offset > 0) { - loop_end = read_u32le(section2_offset + 0x04, sf_h); - loop_start = read_u32le(section2_offset + 0x08, sf_h); - loop_flag = read_u32le(section2_offset + 0x0c, sf_h); + loop_end = read_u32le(section2_offset + 0x04, sf); + loop_start = read_u32le(section2_offset + 0x08, sf); + loop_flag = read_u32le(section2_offset + 0x0c, sf); } else { loop_end = 0; @@ -106,7 +109,7 @@ VGMSTREAM * init_vgmstream_lrmd(STREAMFILE *sf) { /* data de-interleave */ - temp_sf = setup_lrmd_streamfile(sf, block_size, chunk_start, chunk_size); + temp_sf = setup_lrmd_streamfile(sb, block_size, chunk_start, chunk_size); if (!temp_sf) goto fail; stream_offset = 0x00; @@ -142,23 +145,23 @@ VGMSTREAM * init_vgmstream_lrmd(STREAMFILE *sf) { /* name custom main + layer name */ { - int name_len = read_string(vgmstream->stream_name, STREAM_NAME_SIZE - 1, basename_offset, sf_h); + int name_len = read_string(vgmstream->stream_name, STREAM_NAME_SIZE - 1, basename_offset, sf); strcat(vgmstream->stream_name, "/"); name_len++; - read_string(vgmstream->stream_name + name_len, STREAM_NAME_SIZE - name_len, subname_offset, sf_h); + read_string(vgmstream->stream_name + name_len, STREAM_NAME_SIZE - name_len, subname_offset, sf); } if (!vgmstream_open_stream(vgmstream, temp_sf, stream_offset)) goto fail; - close_streamfile(sf_h); + close_streamfile(sb); close_streamfile(temp_sf); return vgmstream; fail: - close_streamfile(sf_h); + close_streamfile(sb); close_streamfile(temp_sf); close_vgmstream(vgmstream); return NULL; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/lsf.c b/Frameworks/vgmstream/vgmstream/src/meta/lsf.c index 94f7741d9..f1446e7a1 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/lsf.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/lsf.c @@ -1,43 +1,85 @@ #include "meta.h" -#include "../util.h" +#include "../coding/coding.h" -/* .lsf - from Atod games [Fastlane Street Racing (iPhone), Chicane Street Racing prototype (Gizmondo)] */ -VGMSTREAM * init_vgmstream_lsf_n1nj4n(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - off_t start_offset; - int loop_flag, channel_count; - size_t file_size; +/* .lsf - from Gizmondo Studios Helsingborg/Atod AB games [Chicane Street Racing (Gizmondo), Fastlane Street Racing (iOS)] */ +VGMSTREAM* init_vgmstream_lsf_n1nj4n(STREAMFILE *sf) { + VGMSTREAM* vgmstream = NULL; + uint32_t start_offset, data_size, loop_start = 0, loop_end = 0; + int channels, loop_flag, sample_rate; + bool is_v2 = false; /* checks */ - if (!check_extensions(streamFile, "lsf")) + if ((read_u64be(0x00, sf) & 0xFFFFFFFFFFFFFF00) == get_id64be("!n1nj4n\0")) + is_v2 = false; + else if ((read_u64be(0x00, sf) & 0xFFFFFFFFFFFFFF00) == get_id64be("n1nj4n!\0")) + is_v2 = true; /* some files in Agaju: The Sacred Path (Gizmondo) */ + else + return NULL; + + /* .lsf: actual extension, exe strings seem to call this format "LSF" as well */ + if (!check_extensions(sf, "lsf")) + return NULL; + + uint8_t flags = read_u8(0x07, sf); + uint32_t offset = 0x08; + + if (flags & 0x01) { + loop_start = read_u32le(offset + 0x00,sf); + loop_end = read_u32le(offset + 0x04,sf); + offset += 0x08; + } + + if ((flags & 0x01) && (flags & 0x02)) { + //00: loop hist related? + offset += 0x04; + } + + if (flags & 0x02) { + int count = read_u32le(offset + 0x00,sf); /* not channels */ + // per entry: + // 00: channel related? + // 04: null? + // 0c: ~0x3130? + offset += 0x04 + 0x0c * count; + } + + sample_rate = read_u32le(offset + 0x00, sf); + data_size = read_u32le(offset + 0x04, sf); + offset += 0x08; + start_offset = offset; + + if (start_offset + data_size != get_streamfile_size(sf)) goto fail; - if (read_32bitBE(0x00, streamFile) != 0x216E316E || // "!n1n" - read_32bitBE(0x04, streamFile) != 0x6A346E00) // "j4n\0" - goto fail; - - file_size = get_streamfile_size(streamFile); - if (read_32bitLE(0x0C, streamFile) + 0x10 != file_size) - goto fail; - - loop_flag = 0; - channel_count = 1; - start_offset = 0x10; - + channels = 1; + loop_flag = loop_end > 0; /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count, loop_flag); + vgmstream = allocate_vgmstream(channels, loop_flag); if (!vgmstream) goto fail; vgmstream->meta_type = meta_LSF_N1NJ4N; - vgmstream->sample_rate = read_32bitLE(0x08, streamFile); - vgmstream->num_samples = (file_size-0x10)/0x1c*0x1b*2; - vgmstream->coding_type = coding_LSF; - vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = 0x1c; + vgmstream->sample_rate = sample_rate; - if (!vgmstream_open_stream(vgmstream,streamFile,start_offset)) + if (is_v2) { + vgmstream->coding_type = coding_PSX_cfg; + vgmstream->layout_type = layout_none; + vgmstream->frame_size = 0x10; + } + else { + /* custom codec but basically obfuscted PSX-cfg */ + vgmstream->coding_type = coding_LSF; + vgmstream->layout_type = layout_interleave; //TODO: flat but decoder doesn't handle it + vgmstream->interleave_block_size = 0x1c; + vgmstream->frame_size = 0x1c; /* fixed but used below */ + } + + vgmstream->num_samples = ps_cfg_bytes_to_samples(data_size, vgmstream->frame_size, channels); + vgmstream->loop_start_sample = ps_cfg_bytes_to_samples(loop_start, vgmstream->frame_size, channels); + vgmstream->loop_end_sample = ps_cfg_bytes_to_samples(loop_end, vgmstream->frame_size, channels); + + if (!vgmstream_open_stream(vgmstream,sf,start_offset)) goto fail; return vgmstream; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/meta.h b/Frameworks/vgmstream/vgmstream/src/meta/meta.h index c0d9c08ca..69b455cfa 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/meta.h +++ b/Frameworks/vgmstream/vgmstream/src/meta/meta.h @@ -4,6 +4,7 @@ #include "../vgmstream.h" #include "../util/reader_sf.h" #include "../util/reader_text.h" +#include "../util/sf_utils.h" typedef VGMSTREAM* (*init_vgmstream_t)(STREAMFILE* sf); @@ -80,7 +81,7 @@ VGMSTREAM * init_vgmstream_nps(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_rs03(STREAMFILE *streamFile); -VGMSTREAM* init_vgmstream_rsf(STREAMFILE* sf); +VGMSTREAM* init_vgmstream_raw_rsf(STREAMFILE* sf); VGMSTREAM * init_vgmstream_rwsd(STREAMFILE *streamFile); @@ -109,8 +110,6 @@ VGMSTREAM * init_vgmstream_seb(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_ild(STREAMFILE *streamFile); -VGMSTREAM * init_vgmstream_ps2_pnb(STREAMFILE *streamFile); - VGMSTREAM * init_vgmstream_raw_wavm(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_ngc_str(STREAMFILE *streamFile); @@ -209,7 +208,7 @@ VGMSTREAM * init_vgmstream_fsb4_wav(STREAMFILE * streamFile); VGMSTREAM * init_vgmstream_fsb5(STREAMFILE * streamFile); -VGMSTREAM * init_vgmstream_rwx(STREAMFILE * streamFile); +VGMSTREAM* init_vgmstream_rwax(STREAMFILE* sf); VGMSTREAM * init_vgmstream_xwb(STREAMFILE * streamFile); @@ -219,8 +218,6 @@ VGMSTREAM * init_vgmstream_musc(STREAMFILE * streamFile); VGMSTREAM * init_vgmstream_musx(STREAMFILE * streamFile); -VGMSTREAM * init_vgmstream_leg(STREAMFILE * streamFile); - VGMSTREAM * init_vgmstream_filp(STREAMFILE * streamFile); VGMSTREAM* init_vgmstream_ikm(STREAMFILE* sf); @@ -233,7 +230,7 @@ VGMSTREAM * init_vgmstream_bg00(STREAMFILE * streamFile); VGMSTREAM * init_vgmstream_dc_kcey(STREAMFILE * streamFile); -VGMSTREAM * init_vgmstream_ps2_rstm(STREAMFILE * streamFile); +VGMSTREAM* init_vgmstream_rstm_rockstar(STREAMFILE* sf); VGMSTREAM * init_vgmstream_acm(STREAMFILE * streamFile); @@ -254,7 +251,7 @@ VGMSTREAM * init_vgmstream_ps2_rkv(STREAMFILE * streamFile); VGMSTREAM * init_vgmstream_ps2_vas(STREAMFILE * streamFile); VGMSTREAM * init_vgmstream_ps2_vas_container(STREAMFILE * streamFile); -VGMSTREAM * init_vgmstream_ps2_enth(STREAMFILE * streamFile); +VGMSTREAM* init_vgmstream_lp_ap_lep(STREAMFILE* sf); VGMSTREAM * init_vgmstream_sdt(STREAMFILE * streamFile); @@ -278,8 +275,6 @@ VGMSTREAM * init_vgmstream_xmu(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_xvas(STREAMFILE *streamFile); -VGMSTREAM * init_vgmstream_ngc_bh2pcm(STREAMFILE *streamFile); - VGMSTREAM * init_vgmstream_sat_sap(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_dc_idvi(STREAMFILE *streamFile); @@ -288,13 +283,13 @@ VGMSTREAM * init_vgmstream_ps2_rnd(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_kraw(STREAMFILE *streamFile); -VGMSTREAM * init_vgmstream_ps2_omu(STREAMFILE *streamFile); +VGMSTREAM* init_vgmstream_omu(STREAMFILE* sf); -VGMSTREAM * init_vgmstream_ps2_xa2(STREAMFILE * streamFile); +VGMSTREAM* init_vgmstream_xa2_acclaim(STREAMFILE* sf); VGMSTREAM * init_vgmstream_idsp_ie(STREAMFILE * streamFile); -VGMSTREAM * init_vgmstream_ngc_ymf(STREAMFILE * streamFile); +VGMSTREAM* init_vgmstream_ymf(STREAMFILE* sf); VGMSTREAM * init_vgmstream_sadl(STREAMFILE * streamFile); @@ -371,9 +366,6 @@ VGMSTREAM * init_vgmstream_vsf(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_nds_rrds(STREAMFILE *streamFile); -VGMSTREAM * init_vgmstream_ps2_tk5(STREAMFILE *streamFile); -VGMSTREAM * init_vgmstream_ps2_tk1(STREAMFILE* streamFile); - VGMSTREAM * init_vgmstream_ps2_vsf_tta(STREAMFILE *streamFile); VGMSTREAM* init_vgmstream_ads_midway(STREAMFILE* sf); @@ -390,8 +382,6 @@ VGMSTREAM * init_vgmstream_ivaud(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_ps2_sps(STREAMFILE *streamFile); -VGMSTREAM * init_vgmstream_ps2_xa2_rrp(STREAMFILE *streamFile); - VGMSTREAM * init_vgmstream_nds_hwas(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_ngc_lps(STREAMFILE * streamFile); @@ -445,15 +435,15 @@ VGMSTREAM * init_vgmstream_bnsf(STREAMFILE* streamFile); VGMSTREAM * init_vgmstream_ps2_wb(STREAMFILE* streamFile); -VGMSTREAM * init_vgmstream_s14_sss(STREAMFILE* streamFile); +VGMSTREAM* init_vgmstream_raw_s14_sss(STREAMFILE* sf); VGMSTREAM * init_vgmstream_ps2_gcm(STREAMFILE* streamFile); -VGMSTREAM * init_vgmstream_ps2_smpl(STREAMFILE* streamFile); +VGMSTREAM* init_vgmstream_smpl(STREAMFILE* sf); -VGMSTREAM * init_vgmstream_ps2_msa(STREAMFILE* streamFile); +VGMSTREAM* init_vgmstream_msa(STREAMFILE* sf); -VGMSTREAM * init_vgmstream_ps2_voi(STREAMFILE* streamFile); +VGMSTREAM* init_vgmstream_voi(STREAMFILE* sf); VGMSTREAM * init_vgmstream_ngc_rkv(STREAMFILE* streamFile); @@ -471,8 +461,6 @@ VGMSTREAM * init_vgmstream_ps2_adm(STREAMFILE* streamFile); VGMSTREAM* init_vgmstream_lpcm_shade(STREAMFILE* sf); -VGMSTREAM * init_vgmstream_dsp_bdsp(STREAMFILE* streamFile); - VGMSTREAM * init_vgmstream_ps2_vms(STREAMFILE* streamFile); VGMSTREAM * init_vgmstream_xau(STREAMFILE* streamFile); @@ -520,7 +508,7 @@ VGMSTREAM * init_vgmstream_hyperscan_kvag(STREAMFILE* streamFile); VGMSTREAM * init_vgmstream_ios_psnd(STREAMFILE* streamFile); -VGMSTREAM* init_vgmstream_adp_bos(STREAMFILE* sf); +VGMSTREAM* init_vgmstream_adp_wildfire(STREAMFILE* sf); VGMSTREAM* init_vgmstream_adp_qd(STREAMFILE* sf); @@ -576,7 +564,7 @@ VGMSTREAM * init_vgmstream_ps2_vds_vdm(STREAMFILE* streamFile); VGMSTREAM * init_vgmstream_cxs(STREAMFILE* streamFile); -VGMSTREAM * init_vgmstream_dsp_adx(STREAMFILE *streamFile); +VGMSTREAM* init_vgmstream_adx_monster(STREAMFILE* sf); VGMSTREAM * init_vgmstream_akb(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_akb2(STREAMFILE *streamFile); @@ -606,8 +594,6 @@ VGMSTREAM * init_vgmstream_va3(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_mta2(STREAMFILE *streamFile); VGMSTREAM * init_vgmstream_mta2_container(STREAMFILE *streamFile); -VGMSTREAM * init_vgmstream_ngc_ulw(STREAMFILE * streamFile); - VGMSTREAM * init_vgmstream_xa_xa30(STREAMFILE * streamFile); VGMSTREAM * init_vgmstream_xa_04sw(STREAMFILE * streamFile); @@ -627,7 +613,7 @@ VGMSTREAM * init_vgmstream_ea_schl_fixed(STREAMFILE * streamFile); VGMSTREAM * init_vgmstream_sk_aud(STREAMFILE * streamFile); -VGMSTREAM * init_vgmstream_stm(STREAMFILE * streamFile); +VGMSTREAM* init_vgmstream_stma(STREAMFILE* sf); VGMSTREAM * init_vgmstream_awc(STREAMFILE * streamFile); @@ -646,8 +632,6 @@ VGMSTREAM* init_vgmstream_opus_nsopus(STREAMFILE* sf); VGMSTREAM* init_vgmstream_opus_sqex(STREAMFILE* sf); VGMSTREAM* init_vgmstream_opus_rsnd(STREAMFILE* sf); -VGMSTREAM * init_vgmstream_raw_al(STREAMFILE * streamFile); - VGMSTREAM * init_vgmstream_pc_ast(STREAMFILE * streamFile); VGMSTREAM * init_vgmstream_naac(STREAMFILE * streamFile); @@ -673,7 +657,7 @@ VGMSTREAM * init_vgmstream_ea_tmx(STREAMFILE * streamFile); VGMSTREAM * init_vgmstream_ea_sbr(STREAMFILE * streamFile); VGMSTREAM * init_vgmstream_ea_sbr_harmony(STREAMFILE * streamFile); -VGMSTREAM * init_vgmstream_ngc_vid1(STREAMFILE * streamFile); +VGMSTREAM* init_vgmstream_vid1(STREAMFILE* sf); VGMSTREAM * init_vgmstream_flx(STREAMFILE * streamFile); @@ -990,4 +974,12 @@ VGMSTREAM* init_vgmstream_bigrp(STREAMFILE* sf); VGMSTREAM* init_vgmstream_sscf_encrypted(STREAMFILE* sf); +VGMSTREAM* init_vgmstream_ego_dic(STREAMFILE* sf); + +VGMSTREAM* init_vgmstream_awd(STREAMFILE* sf); + +VGMSTREAM* init_vgmstream_rws_809(STREAMFILE* sf); + +VGMSTREAM* init_vgmstream_pwb(STREAMFILE* sf); + #endif /*_META_H*/ diff --git a/Frameworks/vgmstream/vgmstream/src/meta/mpeg.c b/Frameworks/vgmstream/vgmstream/src/meta/mpeg.c index 0e6de8ab3..95b08de02 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/mpeg.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/mpeg.c @@ -34,8 +34,11 @@ VGMSTREAM* init_vgmstream_mpeg(STREAMFILE* sf) { /* .mp3/mp2: standard * .lmp3/lmp2: for plugins - * .mus: Marc Ecko's Getting Up (PC) */ - if (!check_extensions(sf, "mp3,mp2,lmp3,lmp2,mus")) + * .mus: Marc Ecko's Getting Up (PC) + * .imf: Colors (Gizmondo) + * .aix: Classic Compendium 2 (Gizmondo) + * (extensionless): Interstellar Flames 2 (Gizmondo) */ + if (!check_extensions(sf, "mp3,mp2,lmp3,lmp2,mus,imf,aix,,")) goto fail; loop_flag = 0; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/msa.c b/Frameworks/vgmstream/vgmstream/src/meta/msa.c new file mode 100644 index 000000000..2c8683d91 --- /dev/null +++ b/Frameworks/vgmstream/vgmstream/src/meta/msa.c @@ -0,0 +1,62 @@ +#include "meta.h" +#include "../coding/coding.h" + +/* MSA - from Sucess games [Psyvariar -Complete Edition- (PS2), Konohana Pack: 3tsu no Jikenbo (PS2)]*/ +VGMSTREAM* init_vgmstream_msa(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + uint32_t start_offset, data_size, channel_size, file_size; + int loop_flag, channels; + + + /* checks */ + if (read_u32be(0x00,sf) != 0x00000000 || read_u32be(0x08,sf) != 0x00000000) + return NULL; + if (!check_extensions(sf, "msa")) + return NULL; + + loop_flag = 0; + channels = 2; + start_offset = 0x14; + + file_size = get_streamfile_size(sf); + data_size = read_u32le(0x04,sf); /* wrong, see below */ + channel_size = read_u32le(0x0c,sf); /* also wrong like data_size */ + + if (!ps_check_format(sf, start_offset, 0x100)) + return NULL; + + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels, loop_flag); + if (!vgmstream) goto fail; + + vgmstream->meta_type = meta_MSA; + vgmstream->sample_rate = read_s32le(0x10,sf); + if (vgmstream->sample_rate == 0) /* ex. Psyvariar's AME.MSA */ + vgmstream->sample_rate = 44100; + vgmstream->num_samples = ps_bytes_to_samples(data_size, channels); + + vgmstream->coding_type = coding_PSX; + vgmstream->layout_type = layout_interleave; + + if (channel_size) /* Konohana Pack */ + vgmstream->interleave_block_size = 0x6000; + else /* Psyvariar */ + vgmstream->interleave_block_size = 0x4000; + + /* MSAs are strangely truncated, so manually calculate samples. + * Data after last usable block is always silence or garbage. */ + if (data_size > file_size) { + uint32_t usable_size = file_size - start_offset; + usable_size -= usable_size % (vgmstream->interleave_block_size * channels); /* block-aligned */ + vgmstream->num_samples = ps_bytes_to_samples(usable_size, channels); + } + + if (!vgmstream_open_stream(vgmstream, sf, start_offset)) + goto fail; + return vgmstream; + +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/myspd.c b/Frameworks/vgmstream/vgmstream/src/meta/myspd.c index 373f23031..f4bf58b6c 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/myspd.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/myspd.c @@ -1,38 +1,39 @@ #include "meta.h" #include "../coding/coding.h" -/* .MYSPF - from U-Sing (Wii) */ -VGMSTREAM * init_vgmstream_myspd(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - int loop_flag = 0, channel_count; - off_t start_offset; - size_t channel_size; - /* check extension, case insensitive */ - if (!check_extensions(streamFile,"myspd")) - goto fail; +/* .MYSPD - from U-Sing (Wii) */ +VGMSTREAM* init_vgmstream_myspd(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + int loop_flag = 0, channels; + uint32_t start_offset, channel_size; - channel_count = 2; + /* checks */ + /* .myspd: actual extension */ + if (!check_extensions(sf,"myspd")) + return NULL; + + channels = 2; start_offset = 0x20; - channel_size = read_32bitBE(0x00,streamFile); + channel_size = read_s32be(0x00,sf); /* check size */ - if ((channel_size * channel_count + start_offset) != get_streamfile_size(streamFile)) - goto fail; + if (channel_size * channels + start_offset != get_streamfile_size(sf)) + goto fail; - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels,loop_flag); if (!vgmstream) goto fail; - vgmstream->num_samples = ima_bytes_to_samples(channel_size*channel_count, channel_count); - vgmstream->sample_rate = read_32bitBE(0x04,streamFile); + vgmstream->num_samples = ima_bytes_to_samples(channel_size*channels, channels); + vgmstream->sample_rate = read_s32be(0x04,sf); vgmstream->meta_type = meta_MYSPD; - vgmstream->coding_type = coding_IMA_int; + vgmstream->coding_type = coding_IMA_int; vgmstream->layout_type = layout_interleave; vgmstream->interleave_block_size = channel_size; - if (!vgmstream_open_stream(vgmstream,streamFile,start_offset)) + if (!vgmstream_open_stream(vgmstream,sf,start_offset)) goto fail; return vgmstream; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ngc_adpdtk.c b/Frameworks/vgmstream/vgmstream/src/meta/ngc_adpdtk.c index d57b30a3e..80c67dae2 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/ngc_adpdtk.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/ngc_adpdtk.c @@ -11,9 +11,10 @@ VGMSTREAM* init_vgmstream_dtk(STREAMFILE* sf) { /* checks */ /* .dtk: standard [XGRA (GC)] - * .adp: standard [Harvest Moon AWL (GC)] + * .adp: standard [Harvest Moon: AWL (GC)] + * .trk: Bloody Roar: Primal Fury (GC) * .wav/lwav: Alien Hominid (GC) */ - if (!check_extensions(sf,"dtk,adp,wav,lwav")) + if (!check_extensions(sf,"dtk,adp,trk,wav,lwav")) goto fail; /* check valid frames as files have no header, and .adp/wav are common */ diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ngc_bh2pcm.c b/Frameworks/vgmstream/vgmstream/src/meta/ngc_bh2pcm.c deleted file mode 100644 index 9fe0d3f77..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/ngc_bh2pcm.c +++ /dev/null @@ -1,87 +0,0 @@ -#include "meta.h" -#include "../util.h" - -/* BH2PCM (from Bio Hazard 2) */ -VGMSTREAM * init_vgmstream_ngc_bh2pcm(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - off_t start_offset; - int channel_count; - int format_detect; - int loop_flag; - - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("bh2pcm",filename_extension(filename))) goto fail; - -#if 0 - /* check header */ - if (read_32bitBE(0x00,streamFile) != 0x00000000) - goto fail; -#endif - - loop_flag = 0; - channel_count = 2; - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - /* fill in the vital statistics */ - format_detect=read_32bitLE(0x00,streamFile); - switch (format_detect) { - case 1: - start_offset = 0x20; - channel_count = 2; - vgmstream->channels = channel_count; - vgmstream->sample_rate = 32000; - vgmstream->num_samples = read_32bitLE(0x04,streamFile)/2; - vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = read_32bitLE(0x04,streamFile); - if (loop_flag) { - vgmstream->loop_start_sample = 0; - vgmstream->loop_end_sample = read_32bitLE(0x14,streamFile); - } - break; - case 0: - start_offset = 0x20; - channel_count = 1; - vgmstream->channels = channel_count; - vgmstream->sample_rate = 32000; - vgmstream->num_samples = read_32bitLE(0x0C,streamFile); - vgmstream->layout_type = layout_none; - if (loop_flag) { - vgmstream->loop_start_sample = read_32bitLE(0x08,streamFile); - vgmstream->loop_end_sample = read_32bitLE(0x0C,streamFile); - } - break; - default: - goto fail; - } - - vgmstream->coding_type = coding_PCM16BE; - vgmstream->meta_type = meta_NGC_BH2PCM; - - /* open the file for reading */ - { - int i; - STREAMFILE * file; - file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); - if (!file) goto fail; - for (i=0;ich[i].streamfile = file; - - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset=start_offset+ - vgmstream->interleave_block_size*i; - - } - } - - return vgmstream; - - /* clean up anything we may have opened */ -fail: - if (vgmstream) close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ngc_dsp_std.c b/Frameworks/vgmstream/vgmstream/src/meta/ngc_dsp_std.c index a15a4b1e3..f44c7a5a6 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/ngc_dsp_std.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/ngc_dsp_std.c @@ -301,13 +301,13 @@ VGMSTREAM* init_vgmstream_ngc_dsp_std(STREAMFILE* sf) { /* checks */ if (!read_dsp_header_be(&header, 0x00, sf)) - goto fail; + return NULL; /* .dsp: standard * .adp: Dr. Muto/Battalion Wars (GC), Tale of Despereaux (Wii) * (extensionless): Tony Hawk's Downhill Jam (Wii) */ if (!check_extensions(sf, "dsp,adp,")) - goto fail; + return NULL; channels = 1; start_offset = header_size; @@ -418,12 +418,11 @@ VGMSTREAM* init_vgmstream_ngc_dsp_std_le(STREAMFILE* sf) { int i, channels; /* checks */ + if (!read_dsp_header_le(&header, 0x00, sf)) + return NULL; /* .adpcm: LEGO Worlds */ if (!check_extensions(sf, "adpcm")) - goto fail; - - if (!read_dsp_header_le(&header, 0x00, sf)) - goto fail; + return NULL; channels = 1; start_offset = header_size; @@ -503,10 +502,9 @@ VGMSTREAM* init_vgmstream_ngc_mdsp_std(STREAMFILE* sf) { /* checks */ if (!read_dsp_header_be(&header, 0x00, sf)) - goto fail; - + return NULL; if (!check_extensions(sf, "dsp,mdsp")) - goto fail; + return NULL; channels = header.channels==0 ? 1 : header.channels; start_offset = header_size * channels; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ngc_ulw.c b/Frameworks/vgmstream/vgmstream/src/meta/ngc_ulw.c deleted file mode 100644 index e873ac1d6..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/ngc_ulw.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "meta.h" -#include "../coding/coding.h" - -/* ULW - headerless U-law, found in Burnout (GC) */ -VGMSTREAM * init_vgmstream_ngc_ulw(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - off_t start_offset; - int loop_flag = 0, channel_count; - - - /* check extension, case insensitive */ - if ( !check_extensions(streamFile,"ulw")) - goto fail; - - /* raw data, the info is in the filename (really!) */ - { - char filename[PATH_LIMIT] = {0}; - - get_streamfile_filename(streamFile, filename,PATH_LIMIT); - - /* first letter gives the channels */ - if (filename[0]=='M') /* Mono */ - channel_count = 1; - else if (filename[0]=='S' || filename[0]=='D') /* Stereo/Dolby */ - channel_count = 2; - else - goto fail; - - /* not very robust but meh (other tracks don't loop) */ - if (strcmp(filename,"MMenu.ulw")==0 || strcmp(filename,"DMenu.ulw")==0) { - loop_flag = 1; - } - } - - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - vgmstream->sample_rate = 32000; - vgmstream->coding_type = coding_ULAW; - vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = 0x01; - vgmstream->meta_type = meta_NGC_ULW; - vgmstream->num_samples = pcm_bytes_to_samples(get_streamfile_size(streamFile), channel_count, 8); - if (loop_flag) { - vgmstream->loop_start_sample = 0; - vgmstream->loop_end_sample = vgmstream->num_samples; - } - - start_offset = 0; - - if ( !vgmstream_open_stream(vgmstream, streamFile, start_offset) ) - goto fail; - return vgmstream; - -fail: - close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ngc_ymf.c b/Frameworks/vgmstream/vgmstream/src/meta/ngc_ymf.c deleted file mode 100644 index 9fad79ecb..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/ngc_ymf.c +++ /dev/null @@ -1,77 +0,0 @@ -#include "meta.h" -#include "../util.h" - -/* YMF (WWE WrestleMania X8) */ -VGMSTREAM * init_vgmstream_ngc_ymf(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - off_t start_offset; - int loop_flag; - int channel_count; - - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("ymf",filename_extension(filename))) goto fail; - - /* check header */ - if (read_32bitBE(0x00,streamFile) != 0x00000180) - goto fail; - - loop_flag = 0; - channel_count = 2; - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - /* fill in the vital statistics */ - start_offset = 0x180; - vgmstream->channels = channel_count; - vgmstream->sample_rate = read_32bitBE(0xA8,streamFile); - vgmstream->coding_type = coding_NGC_DSP; - vgmstream->num_samples = read_32bitBE(0xDC,streamFile); - if (loop_flag) { - vgmstream->loop_start_sample = 0; - vgmstream->loop_end_sample = read_32bitBE(0xDC,streamFile); - } - - vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = 0x20000; - vgmstream->meta_type = meta_NGC_YMF; - - - if (vgmstream->coding_type == coding_NGC_DSP) { - int i; - for (i=0;i<16;i++) { - vgmstream->ch[0].adpcm_coef[i] = read_16bitBE(0xAE +i*2,streamFile); - } - if (vgmstream->channels) { - for (i=0;i<16;i++) { - vgmstream->ch[1].adpcm_coef[i] = read_16bitBE(0x10E +i*2,streamFile); - } - } - } - - /* open the file for reading */ - { - int i; - STREAMFILE * file; - file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); - if (!file) goto fail; - for (i=0;ich[i].streamfile = file; - - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset=start_offset+ - vgmstream->interleave_block_size*i; - - } - } - - return vgmstream; - - /* clean up anything we may have opened */ -fail: - if (vgmstream) close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ogg_vorbis.c b/Frameworks/vgmstream/vgmstream/src/meta/ogg_vorbis.c index 4141b5332..d9e242895 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/ogg_vorbis.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/ogg_vorbis.c @@ -479,7 +479,7 @@ static int _init_vgmstream_ogg_vorbis_tests(STREAMFILE* sf, ogg_vorbis_io_config } } - /* "Ultramarine3" (???) */ + /* .um3: Ultramarine / Bruns Engine files */ if (check_extensions(sf,"um3")) { if (!is_id32be(0x00,sf, "OggS")) { ovmi->decryption_callback = um3_ogg_decryption_callback; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ogv_3rdeye.c b/Frameworks/vgmstream/vgmstream/src/meta/ogv_3rdeye.c index 20f3be375..579124688 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/ogv_3rdeye.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/ogv_3rdeye.c @@ -1,7 +1,7 @@ #include "meta.h" #include "../coding/coding.h" -/* OGV - .ogg container (not related to ogv video) [Bloody Rondo (PC)] */ +/* OGV - .ogg container (not related to ogv video) [Bloody Rondo (PC), Shinigami no Testament (PC)] */ VGMSTREAM* init_vgmstream_ogv_3rdeye(STREAMFILE* sf) { uint32_t subfile_offset, subfile_size; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/omu.c b/Frameworks/vgmstream/vgmstream/src/meta/omu.c index 387114108..61f6aee20 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/omu.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/omu.c @@ -1,7 +1,7 @@ #include "meta.h" /* IMU - found in Alter Echo (PS2) */ -VGMSTREAM* init_vgmstream_ps2_omu(STREAMFILE* sf) { +VGMSTREAM* init_vgmstream_omu(STREAMFILE* sf) { VGMSTREAM* vgmstream = NULL; off_t start_offset; int loop_flag, channels; @@ -9,13 +9,11 @@ VGMSTREAM* init_vgmstream_ps2_omu(STREAMFILE* sf) { /* checks */ if (!is_id32be(0x00,sf, "OMU ")) - goto fail; - + return NULL; if (!check_extensions(sf,"omu")) - goto fail; - + return NULL; if (!is_id32be(0x08,sf, "FRMT")) - goto fail; + return NULL; loop_flag = 1; channels = read_u8(0x14,sf); @@ -33,7 +31,7 @@ VGMSTREAM* init_vgmstream_ps2_omu(STREAMFILE* sf) { vgmstream->coding_type = coding_PCM16LE; vgmstream->layout_type = layout_interleave; vgmstream->interleave_block_size = 0x200; - vgmstream->meta_type = meta_PS2_OMU; + vgmstream->meta_type = meta_OMU; if (!vgmstream_open_stream(vgmstream, sf, start_offset)) goto fail; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/pos.c b/Frameworks/vgmstream/vgmstream/src/meta/pos.c index 5e499ce66..6e9a24271 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/pos.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/pos.c @@ -1,55 +1,43 @@ -#include "meta.h" - -/* .pos - loop points for .wav [Ys I Complete (PC); reused for manual looping] */ -VGMSTREAM * init_vgmstream_pos(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - STREAMFILE * streamData = NULL; - int32_t loop_start, loop_end; - - - /* checks */ - if (!check_extensions(streamFile, "pos")) - goto fail; - if (get_streamfile_size(streamFile) != 0x08) - goto fail; - - streamData = open_streamfile_by_ext(streamFile, "wav"); - if (streamData) { - vgmstream = init_vgmstream_riff(streamData); - if (!vgmstream) goto fail; - vgmstream->meta_type = meta_RIFF_WAVE_POS; - } - else { -#ifdef VGM_USE_VORBIS - /* hack for Ogg with external loops */ - streamData = open_streamfile_by_ext(streamFile, "ogg"); - if (streamData) { - vgmstream = init_vgmstream_ogg_vorbis(streamData); - if (!vgmstream) goto fail; - } - else { - goto fail; - } -#else - goto fail; -#endif - } - - close_streamfile(streamData); - streamData = NULL; - - /* install loops (wrong values are validated later) */ - loop_start = read_32bitLE(0x00, streamFile); - loop_end = read_32bitLE(0x04, streamFile); - if (loop_end <= 0 || (loop_end > vgmstream->num_samples)) { - loop_end = vgmstream->num_samples; - } - vgmstream_force_loop(vgmstream, 1, loop_start, loop_end); - - return vgmstream; - -fail: - close_streamfile(streamData); - close_vgmstream(vgmstream); - return NULL; +#include "meta.h" + +/* .pos - loop points for .wav [Ys I-II Complete (PC)] */ +VGMSTREAM* init_vgmstream_pos(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + STREAMFILE* sf_data = NULL; + int32_t loop_start, loop_end; + + + /* checks */ + if (get_streamfile_size(sf) != 0x08) + return NULL; + if (!check_extensions(sf, "pos")) + return NULL; + + sf_data = open_streamfile_by_ext(sf, "wav"); + if (sf_data) { + vgmstream = init_vgmstream_riff(sf_data); + if (!vgmstream) goto fail; + vgmstream->meta_type = meta_RIFF_WAVE_POS; + } + else { + goto fail; + } + + close_streamfile(sf_data); + sf_data = NULL; + + /* install loops (wrong values are validated later) */ + loop_start = read_s32le(0x00, sf); + loop_end = read_s32le(0x04, sf); + if (loop_end <= 0 || (loop_end > vgmstream->num_samples)) { + loop_end = vgmstream->num_samples; + } + vgmstream_force_loop(vgmstream, 1, loop_start, loop_end); + + return vgmstream; + +fail: + close_streamfile(sf_data); + close_vgmstream(vgmstream); + return NULL; } \ No newline at end of file diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ps2_leg.c b/Frameworks/vgmstream/vgmstream/src/meta/ps2_leg.c deleted file mode 100644 index 146bca55b..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/ps2_leg.c +++ /dev/null @@ -1,66 +0,0 @@ -#include "meta.h" -#include "../util.h" - -/* LEG - found in Legaia 2 - Duel Saga (PS2) -the headers are stored seperately in the main executable... */ -VGMSTREAM * init_vgmstream_leg(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - off_t start_offset; - int loop_flag = 0; - int channel_count; - - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("leg",filename_extension(filename))) goto fail; - - /* comparing the filesize with (num_samples*0x800) + headersize, - if it doesn't match, we will abort the vgmstream... */ - if ((read_32bitLE(0x48,streamFile)*0x800)+0x4C != get_streamfile_size(streamFile)) - goto fail; - - loop_flag = (read_32bitLE(0x44,streamFile)!=0); - channel_count = 2; - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - /* fill in the vital statistics */ - start_offset = 0x4C; - vgmstream->channels = channel_count; - vgmstream->sample_rate = read_32bitLE(0x40,streamFile); - vgmstream->coding_type = coding_PSX; - vgmstream->num_samples = (read_32bitLE(0x48,streamFile)*0x800)*28/16/channel_count; - if (loop_flag) { - vgmstream->loop_start_sample = (read_32bitLE(0x44,streamFile)*0x800)*28/16/channel_count; - vgmstream->loop_end_sample = (read_32bitLE(0x48,streamFile)*0x800)*28/16/channel_count; - } - - vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = 0x400; - vgmstream->meta_type = meta_LEG; - - /* open the file for reading */ - { - int i; - STREAMFILE * file; - file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); - if (!file) goto fail; - for (i=0;ich[i].streamfile = file; - - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset=start_offset+ - vgmstream->interleave_block_size*i; - - } - } - - return vgmstream; - - /* clean up anything we may have opened */ -fail: - if (vgmstream) close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ps2_msa.c b/Frameworks/vgmstream/vgmstream/src/meta/ps2_msa.c deleted file mode 100644 index c54146b5c..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/ps2_msa.c +++ /dev/null @@ -1,63 +0,0 @@ -#include "meta.h" -#include "../coding/coding.h" - -/* MSA - from Sucess games [Psyvariar -Complete Edition- (PS2), Konohana Pack: 3tsu no Jikenbo (PS2)]*/ -VGMSTREAM * init_vgmstream_ps2_msa(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - off_t start_offset; - int loop_flag, channel_count; - size_t data_size, channel_size, file_size; - - - /* checks */ - if (!check_extensions(streamFile, "msa")) - goto fail; - if (read_32bitBE(0x00,streamFile) != 0x00000000) - goto fail; - if (read_32bitBE(0x08,streamFile) != 0x00000000) - goto fail; - - loop_flag = 0; - channel_count = 2; - start_offset = 0x14; - - file_size = get_streamfile_size(streamFile); - data_size = read_32bitLE(0x04,streamFile); /* wrong, see below */ - channel_size = read_32bitLE(0x0c,streamFile); /* also wrong like data_size */ - - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - vgmstream->meta_type = meta_PS2_MSA; - vgmstream->sample_rate = read_32bitLE(0x10,streamFile); - if (vgmstream->sample_rate == 0) /* ex. Psyvariar's AME.MSA */ - vgmstream->sample_rate = 44100; - vgmstream->num_samples = ps_bytes_to_samples(data_size, channel_count); - - vgmstream->coding_type = coding_PSX; - vgmstream->layout_type = layout_interleave; - - if (channel_size) /* Konohana Pack */ - vgmstream->interleave_block_size = 0x6000; - else /* Psyvariar */ - vgmstream->interleave_block_size = 0x4000; - /* (could also test first frame in various interleaves, as it's always 0'ed) */ - - /* MSAs are strangely truncated, so manually calculate samples. - * Data after last usable block is always silence or garbage. */ - if (data_size > file_size) { - off_t usable_size = file_size - start_offset; - usable_size -= usable_size % (vgmstream->interleave_block_size*channel_count);/* block-aligned */ - vgmstream->num_samples = ps_bytes_to_samples(usable_size, channel_count);//usable_size * 28 / (16*channel_count); - } - - if (!vgmstream_open_stream(vgmstream, streamFile, start_offset)) - goto fail; - return vgmstream; - -fail: - close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ps2_pnb.c b/Frameworks/vgmstream/vgmstream/src/meta/ps2_pnb.c deleted file mode 100644 index 5d9d4696c..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/ps2_pnb.c +++ /dev/null @@ -1,66 +0,0 @@ -#include "meta.h" -#include "../util.h" - -/* PNB : PsychoNauts Bgm File */ - -VGMSTREAM * init_vgmstream_ps2_pnb(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - - int loop_flag=0; - int channel_count; - off_t start_offset; - int i; - - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("pnb",filename_extension(filename))) goto fail; - - /* check loop */ - loop_flag = (read_32bitLE(0x0C,streamFile)!=0xFFFFFFFF); - channel_count=1; - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - /* fill in the vital statistics */ - vgmstream->channels = 1; - vgmstream->sample_rate = 44100; - - /* Check for Compression Scheme */ - vgmstream->coding_type = coding_PSX; - vgmstream->num_samples = read_32bitBE(0x08,streamFile)/16*28; - - /* Get loop point values */ - if(vgmstream->loop_flag) { - vgmstream->loop_start_sample = read_32bitBE(0x0C,streamFile)/16*28; - vgmstream->loop_end_sample = vgmstream->num_samples; - } - - vgmstream->interleave_block_size = 0x10; - vgmstream->layout_type = layout_interleave; - vgmstream->meta_type = meta_PS2_PNB; - - start_offset = (off_t)read_32bitBE(0x00,streamFile); - - /* open the file for reading by each channel */ - { - for (i=0;ich[i].streamfile = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); - - if (!vgmstream->ch[i].streamfile) goto fail; - - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset= - (off_t)(start_offset+vgmstream->interleave_block_size*i); - } - } - - return vgmstream; - - /* clean up anything we may have opened */ -fail: - if (vgmstream) close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ps2_rstm.c b/Frameworks/vgmstream/vgmstream/src/meta/ps2_rstm.c deleted file mode 100644 index 664a24395..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/ps2_rstm.c +++ /dev/null @@ -1,44 +0,0 @@ -#include "meta.h" -#include "../coding/coding.h" - -/* RSTM - from Rockstar games [Midnight Club 3, Bully - Canis Canim Edit (PS2)] */ -VGMSTREAM * init_vgmstream_ps2_rstm(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - off_t start_offset; - int loop_flag, channel_count; - - /* check extension (.rsm: in filelist, .rstm: renamed to header id) */ - if ( !check_extensions(streamFile,"rsm,rstm") ) - goto fail; - - /* check header */ - if (read_32bitBE(0x00,streamFile) != 0x5253544D) /* "RSTM" */ - goto fail; - - loop_flag = (read_32bitLE(0x24,streamFile)!=0xFFFFFFFF); - channel_count = read_32bitLE(0x0C,streamFile); - start_offset = 0x800; - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - vgmstream->sample_rate = read_32bitLE(0x08,streamFile); - vgmstream->num_samples = ps_bytes_to_samples(read_32bitLE(0x20,streamFile),channel_count); - vgmstream->loop_start_sample = ps_bytes_to_samples(read_32bitLE(0x24,streamFile),channel_count); - vgmstream->loop_end_sample = vgmstream->num_samples; - - vgmstream->coding_type = coding_PSX; - vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = 0x10; - vgmstream->meta_type = meta_PS2_RSTM; - - /* open the file for reading */ - if ( !vgmstream_open_stream(vgmstream, streamFile, start_offset) ) - goto fail; - return vgmstream; - -fail: - close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ps2_smpl.c b/Frameworks/vgmstream/vgmstream/src/meta/ps2_smpl.c deleted file mode 100644 index b4a03712e..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/ps2_smpl.c +++ /dev/null @@ -1,47 +0,0 @@ -#include "meta.h" -#include "../coding/coding.h" - -/* SMPL - from Homura (PS2) */ -VGMSTREAM * init_vgmstream_ps2_smpl(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - off_t start_offset; - int loop_flag, channel_count; - size_t channel_size; - - /* checks*/ - /* .v0: left channel, .v1: right channel - * .smpl: header id */ - if ( !check_extensions(streamFile,"v0,v1,smpl") ) - goto fail; - if (read_32bitBE(0x00,streamFile) != 0x534D504C) /* "SMPL" */ - goto fail; - - channel_count = 1; - loop_flag = (read_32bitLE(0x30,streamFile) != 0); /* .v1 doesn't have loop points */ - start_offset = 0x40; - channel_size = read_32bitBE(0x0c,streamFile) - 0x10; - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - vgmstream->sample_rate = read_32bitBE(0x10,streamFile); - vgmstream->num_samples = ps_bytes_to_samples(channel_size*channel_count, channel_count); - vgmstream->loop_start_sample = read_32bitLE(0x30,streamFile); - vgmstream->loop_end_sample = vgmstream->num_samples; - - vgmstream->meta_type = meta_PS2_SMPL; - vgmstream->allow_dual_stereo = 1; - vgmstream->coding_type = coding_PSX; - vgmstream->layout_type = layout_none; - - read_string(vgmstream->stream_name,0x10+1, 0x20,streamFile); - - if ( !vgmstream_open_stream(vgmstream, streamFile, start_offset) ) - goto fail; - return vgmstream; - -fail: - close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ps2_tk5.c b/Frameworks/vgmstream/vgmstream/src/meta/ps2_tk5.c deleted file mode 100644 index aefb4f8e2..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/ps2_tk5.c +++ /dev/null @@ -1,108 +0,0 @@ -#include "meta.h" -#include "../coding/coding.h" - -/* TK5 (Tekken 5 Streams) */ -VGMSTREAM * init_vgmstream_ps2_tk5(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - off_t start_offset; - int loop_flag = 0; - int channel_count; - - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("tk5",filename_extension(filename))) goto fail; - - /* check header */ - if (read_32bitBE(0x00,streamFile) != 0x544B3553) - goto fail; - - loop_flag = (read_32bitLE(0x0C,streamFile)!=0); - channel_count = 2; - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - /* fill in the vital statistics */ - start_offset = 0x800; - vgmstream->channels = channel_count; - vgmstream->sample_rate = 48000; - vgmstream->coding_type = coding_PSX_badflags; - vgmstream->num_samples = ((get_streamfile_size(streamFile)-0x800))/16*28/2; - vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = 0x10; - vgmstream->meta_type = meta_PS2_TK5; - - if (vgmstream->loop_flag) - { - vgmstream->loop_start_sample = read_32bitLE(0x08,streamFile)/16*28; - vgmstream->loop_end_sample = vgmstream->loop_start_sample + (read_32bitLE(0x0C,streamFile)/16*28); - } - - /* open the file for reading */ - { - int i; - STREAMFILE * file; - file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); - if (!file) goto fail; - for (i=0;ich[i].streamfile = file; - - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset=start_offset+ - vgmstream->interleave_block_size*i; - - } - } - - return vgmstream; - - /* clean up anything we may have opened */ -fail: - if (vgmstream) close_vgmstream(vgmstream); - return NULL; -} - -/* OVB - Tekken 5 Streams from Tekken (NamCollection) */ -VGMSTREAM * init_vgmstream_ps2_tk1(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - off_t start_offset; - int loop_flag = 0, channel_count; - - /* checks */ - if (!check_extensions(streamFile, "ovb")) - goto fail; - - if (read_32bitBE(0x00,streamFile) != 0x544B3553) - goto fail; - - loop_flag = (read_32bitLE(0x0C,streamFile)!=0); - channel_count = 2; - start_offset = 0x800; - /* NamCollection uses 44100 while Tekken 5 48000, no apparent way to tell them apart */ - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - vgmstream->sample_rate = 44100; - vgmstream->num_samples = ps_bytes_to_samples(read_32bitLE(0x08,streamFile)*channel_count, channel_count); - if (vgmstream->loop_flag) { - vgmstream->loop_start_sample = read_32bitLE(0x08,streamFile)/16*28; - vgmstream->loop_end_sample = vgmstream->loop_start_sample + ps_bytes_to_samples(read_32bitLE(0x0c,streamFile)*channel_count, channel_count); - } - - vgmstream->coding_type = coding_PSX_badflags; - vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = 0x10; - vgmstream->meta_type = meta_PS2_TK1; - - if (!vgmstream_open_stream(vgmstream,streamFile,start_offset)) - goto fail; - return vgmstream; - -fail: - close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ps2_voi.c b/Frameworks/vgmstream/vgmstream/src/meta/ps2_voi.c deleted file mode 100644 index 2d5a38689..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/ps2_voi.c +++ /dev/null @@ -1,81 +0,0 @@ -#include "meta.h" -#include "../util.h" - -/* VOI - found in "RAW Danger" (PS2) */ -VGMSTREAM * init_vgmstream_ps2_voi(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - int loop_flag = 0; - int channel_count; - off_t start_offset; - - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("voi",filename_extension(filename))) goto fail; - - /* check header */ - if (((read_32bitLE(0x04,streamFile)*2)+0x800) != (get_streamfile_size(streamFile))) - { - goto fail; - } - - loop_flag = 0; - channel_count = read_32bitLE(0x00,streamFile); - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - /* fill in the vital statistics */ - start_offset = 0x800; - vgmstream->channels = channel_count; - vgmstream->coding_type = coding_PCM16LE; - vgmstream->num_samples = (get_streamfile_size(streamFile)-start_offset)/channel_count/2; - - if (loop_flag) - { - vgmstream->loop_start_sample = 0; - vgmstream->loop_end_sample = (read_32bitLE(0x04,streamFile)/2); - } - - if (read_32bitLE(0x08,streamFile) == 0) - { - vgmstream->sample_rate = 48000; - vgmstream->interleave_block_size = 0x200; - } - else if (read_32bitLE(0x08,streamFile) == 1) - { - vgmstream->sample_rate = 24000; - vgmstream->interleave_block_size = 0x100; - } - else - { - goto fail; - } - - vgmstream->layout_type = layout_interleave; - vgmstream->meta_type = meta_PS2_VOI; - - /* open the file for reading */ - { - int i; - STREAMFILE * file; - file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); - if (!file) goto fail; - for (i=0;ich[i].streamfile = file; - - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset=start_offset+ - vgmstream->interleave_block_size*i; - - } - } - - return vgmstream; - - /* clean up anything we may have opened */ -fail: - if (vgmstream) close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ps2_xa2.c b/Frameworks/vgmstream/vgmstream/src/meta/ps2_xa2.c deleted file mode 100644 index ffad6f751..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/ps2_xa2.c +++ /dev/null @@ -1,60 +0,0 @@ -#include "meta.h" -#include "../util.h" - -/* XA2 (XG3 Extreme-G Racing) */ -VGMSTREAM * init_vgmstream_ps2_xa2(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - off_t start_offset; - int loop_flag = 0; - int channel_count; - - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("xa2",filename_extension(filename))) goto fail; - - loop_flag = 0; - channel_count = read_32bitLE(0x0,streamFile); - - if (read_32bitLE(0x4,streamFile) > 0x1000) goto fail; - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - /* fill in the vital statistics */ - start_offset = 0x800; - vgmstream->channels = channel_count; - vgmstream->sample_rate = 44100; - vgmstream->coding_type = coding_PSX; - vgmstream->num_samples = (get_streamfile_size(streamFile)-start_offset)/channel_count/16*28; - if (loop_flag) { - vgmstream->loop_start_sample = 0; - vgmstream->loop_end_sample = vgmstream->num_samples; - } - vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = read_32bitLE(0x04,streamFile); - vgmstream->meta_type = meta_PS2_XA2; - - /* open the file for reading */ - { - int i; - STREAMFILE * file; - file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); - if (!file) goto fail; - for (i=0;ich[i].streamfile = file; - - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset=start_offset+ - vgmstream->interleave_block_size*i; - } - } - - return vgmstream; - -fail: - /* clean up anything we may have opened */ - if (vgmstream) close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ps2_xa2_rrp.c b/Frameworks/vgmstream/vgmstream/src/meta/ps2_xa2_rrp.c deleted file mode 100644 index 64091d17a..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/ps2_xa2_rrp.c +++ /dev/null @@ -1,62 +0,0 @@ -#include "meta.h" - - -/* XA2 (RC Revenge Pro) */ -VGMSTREAM * init_vgmstream_ps2_xa2_rrp(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - off_t start_offset; - - int loop_flag = 0; - int channel_count; - - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("xa2",filename_extension(filename))) goto fail; - - /* check header */ - if (read_32bitBE(0x50,streamFile) != 0x00000000) - goto fail; - - loop_flag = 0; - channel_count = read_32bitLE(0x0,streamFile); - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - /* fill in the vital statistics */ - start_offset = 0x800; - vgmstream->channels = channel_count; - vgmstream->sample_rate = 44100; - vgmstream->coding_type = coding_PSX; - vgmstream->num_samples = (get_streamfile_size(streamFile)-0x800)*28/16/channel_count; - vgmstream->layout_type = layout_interleave; - if (channel_count > 2) - vgmstream->interleave_block_size = 0x400; - else - vgmstream->interleave_block_size = 0x1000; - vgmstream->meta_type = meta_PS2_XA2_RRP; - - /* open the file for reading */ - { - int i; - STREAMFILE * file; - file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); - if (!file) goto fail; - for (i=0;ich[i].streamfile = file; - - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset=start_offset+ - vgmstream->interleave_block_size*i; - } - } - - return vgmstream; - -fail: - /* clean up anything we may have opened */ - if (vgmstream) close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/pwb.c b/Frameworks/vgmstream/vgmstream/src/meta/pwb.c new file mode 100644 index 000000000..408c7f779 --- /dev/null +++ b/Frameworks/vgmstream/vgmstream/src/meta/pwb.c @@ -0,0 +1,82 @@ +#include "meta.h" +#include "../coding/coding.h" + +/* WB - from Psychonauts (PS2) */ +VGMSTREAM* init_vgmstream_pwb(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + int channels, loop_flag; + uint32_t stream_offset, stream_size, loop_start, loop_end; + + + /* checks */ + if (!is_id32be(0x00, sf, "WB\2\0")) + return NULL; + + /* .pwb: actual extension (bigfile has only hashes but there are names in internal files) + * (some .pwb have a companion .psb, seems cue-related) */ + if (!check_extensions(sf, "pwb")) + return NULL; + + /* 00: ID + * 04: null + * 08: header offset? (0x20) + * 0c: header size? (0x20) + * 10: entries offset + * 14: entries size + * 18: data offset + * 1c: data size + * 20: always 1 (channels? codec?) + * 24: entries count + * 28: entry size + * 2c: data offset + */ + + + stream_offset = read_u32le(0x18, sf); + + int total_subsongs = read_s32le(0x24, sf); + int target_subsong = sf->stream_index; + if (target_subsong == 0) target_subsong = 1; + if (target_subsong > total_subsongs || total_subsongs <= 0) goto fail; + + + { + uint32_t offset = read_u32le(0x10, sf) + (target_subsong - 1) * read_u32le(0x28, sf); + + /* 0x00: flags? */ + /* 0x04: always 000AC449 */ + stream_offset = read_u32le(offset + 0x08, sf) + stream_offset; + stream_size = read_u32le(offset + 0x0c, sf); + loop_start = read_u32le(offset + 0x10, sf); + loop_end = read_u32le(offset + 0x14, sf) + loop_start; + loop_flag = loop_end; /* both 0 if no loop */ + channels = 1; + } + + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels, loop_flag); + if (!vgmstream) goto fail; + + vgmstream->meta_type = meta_PWB; + vgmstream->sample_rate = 24000; + + vgmstream->num_samples = ps_bytes_to_samples(stream_size, channels); + vgmstream->loop_start_sample = ps_bytes_to_samples(loop_start, channels); + vgmstream->loop_end_sample = ps_bytes_to_samples(loop_end, channels); + + vgmstream->coding_type = coding_PSX; + vgmstream->layout_type = layout_none; + vgmstream->num_streams = total_subsongs; + vgmstream->stream_size = stream_size; + + if (!vgmstream_open_stream(vgmstream, sf, stream_offset)) + goto fail; + + return vgmstream; + +fail: + close_vgmstream(vgmstream); + close_streamfile(sf); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/raw_al.c b/Frameworks/vgmstream/vgmstream/src/meta/raw_al.c deleted file mode 100644 index 717940df1..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/raw_al.c +++ /dev/null @@ -1,42 +0,0 @@ -#include "meta.h" -#include "../coding/coding.h" - -/* AL/AL2 - headerless a-law, from Illwinter Game Design games */ -VGMSTREAM * init_vgmstream_raw_al(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - off_t start_offset; - int loop_flag = 0, channel_count; - - /* checks */ - /* .al: Dominions 3 - The Awakening (PC) - * .al2: Conquest of Elysium 3 (PC) */ - if ( !check_extensions(streamFile,"al,al2")) - goto fail; - - channel_count = check_extensions(streamFile,"al") ? 1 : 2; - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - vgmstream->sample_rate = 22050; - vgmstream->coding_type = coding_ALAW; - vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = 0x01; - vgmstream->meta_type = meta_RAW_AL; - vgmstream->num_samples = pcm_bytes_to_samples(get_streamfile_size(streamFile), channel_count, 8); - if (loop_flag) { - vgmstream->loop_start_sample = 0; - vgmstream->loop_end_sample = vgmstream->num_samples; - } - - start_offset = 0; - - if ( !vgmstream_open_stream(vgmstream, streamFile, start_offset) ) - goto fail; - return vgmstream; - -fail: - close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/rsf.c b/Frameworks/vgmstream/vgmstream/src/meta/raw_rsf.c similarity index 94% rename from Frameworks/vgmstream/vgmstream/src/meta/rsf.c rename to Frameworks/vgmstream/vgmstream/src/meta/raw_rsf.c index d6fdeedff..22791b9ac 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/rsf.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/raw_rsf.c @@ -2,19 +2,17 @@ #include "../util.h" #include "../coding/coding.h" -/* .rsf - from Metroid Prime */ - -VGMSTREAM* init_vgmstream_rsf(STREAMFILE* sf) { +/* .rsf - from Metroid Prime (GC) */ +VGMSTREAM* init_vgmstream_raw_rsf(STREAMFILE* sf) { VGMSTREAM* vgmstream = NULL; int channels, loop_flag; uint32_t interleave, file_size; /* checks */ if (!check_extensions(sf,"rsf")) - goto fail; + return NULL; /* this is all we have to go on, rsf is completely headerless */ - file_size = get_streamfile_size(sf); interleave = (file_size + 1) / 2; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/s14_sss.c b/Frameworks/vgmstream/vgmstream/src/meta/raw_s14_sss.c similarity index 97% rename from Frameworks/vgmstream/vgmstream/src/meta/s14_sss.c rename to Frameworks/vgmstream/vgmstream/src/meta/raw_s14_sss.c index 921e4e0d3..a52c98b6a 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/s14_sss.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/raw_s14_sss.c @@ -6,7 +6,7 @@ static int test_interleave(STREAMFILE* sf, int channels, int interleave); /* .s14/.sss - headerless siren14 stream [The Idolm@ster (DS), Korogashi Puzzle Katamari Damacy (DS), Taiko no Tatsujin DS 1/2 (DS)] */ -VGMSTREAM* init_vgmstream_s14_sss(STREAMFILE* sf) { +VGMSTREAM* init_vgmstream_raw_s14_sss(STREAMFILE* sf) { VGMSTREAM* vgmstream = NULL; off_t start_offset = 0; int channels, loop_flag = 0, interleave; @@ -18,7 +18,7 @@ VGMSTREAM* init_vgmstream_s14_sss(STREAMFILE* sf) { } else if (check_extensions(sf,"s14")) { channels = 1; /* may have dual _0ch.s14 + _1ch.s14, needs .txtp */ } else { - goto fail; + return NULL; } /* raw siren comes in 3 frame sizes, try to guess the correct one */ diff --git a/Frameworks/vgmstream/vgmstream/src/meta/riff.c b/Frameworks/vgmstream/vgmstream/src/meta/riff.c index 8f7ffe813..2e5a73fde 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/riff.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/riff.c @@ -191,11 +191,11 @@ static int read_fmt(int big_endian, STREAMFILE* sf, off_t offset, riff_fmt_chunk break; #ifdef VGM_USE_MPEG - case 0x0055: /* MP3 [Bear in the Big Blue House: Bear's Imagine That! (PC)] (official) */ + case 0x0055: /* MP3 [Bear in the Big Blue House: Bear's Imagine That! (PC), Eclipse (PC)] (official) */ fmt->coding_type = coding_MPEG_custom; - /* some oddities, unsure if part of standard: + /* some oddities, unsure if part of standard: * - block size is 1 (in mono) - * - bps is 16 + * - bps is 16 for some games * - extra size 0x0c, has channels? and (possibly) approx frame size */ break; #endif diff --git a/Frameworks/vgmstream/vgmstream/src/meta/rsd.c b/Frameworks/vgmstream/vgmstream/src/meta/rsd.c index 84651d88c..58547fb4d 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/rsd.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/rsd.c @@ -5,7 +5,7 @@ /* RSD - from Radical Entertainment games */ VGMSTREAM* init_vgmstream_rsd(STREAMFILE* sf) { VGMSTREAM* vgmstream = NULL; - off_t start_offset, name_offset; + uint32_t start_offset, name_offset, coef_offset; size_t data_size; int loop_flag, channels, sample_rate, interleave; uint32_t codec; @@ -14,9 +14,9 @@ VGMSTREAM* init_vgmstream_rsd(STREAMFILE* sf) { /* checks */ if ((read_u32be(0x00,sf) & 0xFFFFFF00) != get_id32be("RSD\00")) - goto fail; + return NULL; if (!check_extensions(sf,"rsd,rsp")) - goto fail; + return NULL; loop_flag = 0; @@ -32,14 +32,19 @@ VGMSTREAM* init_vgmstream_rsd(STREAMFILE* sf) { interleave = read_u32le(0x14,sf); /* VAG only, 0x04 otherwise */ start_offset = read_u32le(0x18,sf); name_offset = 0; + coef_offset = 0x1C; + + if ((codec == get_id32be("GADP"))) + start_offset = 0xA0; break; case '4': /* known codecs: VAG/PCM/RADP/PCMB [The Simpsons: Hit & Run, Tetris Worlds, Hulk] */ - /* 0x14: padding */ + /* 0x14: padding/coefs */ /* 0x18: padding */ interleave = 0; start_offset = 0x800; name_offset = 0; + coef_offset = 0x14; /* PCMB/PCM/GADP normally start early but sometimes have padding [The Simpsons: Hit & Run (GC/Xbox)] */ if ((codec == get_id32be("PCM ") || codec == get_id32be("PCMB") || codec == get_id32be("GADP")) @@ -52,6 +57,7 @@ VGMSTREAM* init_vgmstream_rsd(STREAMFILE* sf) { name_offset = 0x18; /* dev file path */ interleave = 0; start_offset = 0x800; + coef_offset = 0x00; break; default: @@ -104,8 +110,8 @@ VGMSTREAM* init_vgmstream_rsd(STREAMFILE* sf) { vgmstream->coding_type = coding_NGC_DSP; vgmstream->layout_type = layout_interleave; vgmstream->interleave_block_size = 0x08; /* assumed, known files are mono */ - dsp_read_coefs_le(vgmstream,sf,0x14,0x2e); /* LE! */ - dsp_read_hist_le (vgmstream,sf,0x38,0x2e); + dsp_read_coefs_le(vgmstream,sf,coef_offset,0x2e); /* LE! */ + dsp_read_hist_le (vgmstream,sf,coef_offset + 0x24, 0x2e); vgmstream->num_samples = dsp_bytes_to_samples(data_size, channels); break; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/rstm_rockstar.c b/Frameworks/vgmstream/vgmstream/src/meta/rstm_rockstar.c new file mode 100644 index 000000000..abb77086d --- /dev/null +++ b/Frameworks/vgmstream/vgmstream/src/meta/rstm_rockstar.c @@ -0,0 +1,47 @@ +#include "meta.h" +#include "../coding/coding.h" + +/* RSTM - from Rockstar games [Midnight Club 3, Bully - Canis Canim Edit (PS2)] */ +VGMSTREAM* init_vgmstream_rstm_rockstar(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + uint32_t start_offset; + int channels, loop_flag; + + + /* checks */ + if (!is_id32be(0x00, sf, "RSTM")) + return NULL; + + /* .rsm: in filelist + * .rstm: header id */ + if (!check_extensions(sf,"rsm,rstm")) + return NULL; + + loop_flag = (read_s32le(0x24,sf) > 0); + channels = read_s32le(0x0C,sf); + start_offset = 0x800; + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels,loop_flag); + if (!vgmstream) goto fail; + + vgmstream->meta_type = meta_RSTM_ROCKSTAR; + + vgmstream->sample_rate = read_s32le(0x08,sf); + vgmstream->num_samples = ps_bytes_to_samples(read_u32le(0x20,sf),channels); + vgmstream->loop_start_sample = ps_bytes_to_samples(read_u32le(0x24,sf),channels); + vgmstream->loop_end_sample = vgmstream->num_samples; + + vgmstream->coding_type = coding_PSX; + vgmstream->layout_type = layout_interleave; + vgmstream->interleave_block_size = 0x10; + + /* open the file for reading */ + if ( !vgmstream_open_stream(vgmstream, sf, start_offset) ) + goto fail; + return vgmstream; + +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/rwax.c b/Frameworks/vgmstream/vgmstream/src/meta/rwax.c new file mode 100644 index 000000000..2bff7aabd --- /dev/null +++ b/Frameworks/vgmstream/vgmstream/src/meta/rwax.c @@ -0,0 +1,42 @@ +#include "meta.h" +#include "../util.h" + + +/* RWAX - from AirForce Delta Storm (Xbox) */ +VGMSTREAM* init_vgmstream_rwax(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + uint32_t start_offset; + int channels, loop_flag = 0; + + /* checks */ + if (!is_id32be(0x00,sf, "RAWX")) + return NULL; + if (!check_extensions(sf,"rwx")) + return NULL; + + start_offset = read_u32le(0x04,sf); + loop_flag = read_s32le(0x0C,sf); + channels = 2; + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels,loop_flag); + if (!vgmstream) goto fail; + + vgmstream->meta_type = meta_RWAX; + vgmstream->sample_rate = read_s32le(0x08,sf); + vgmstream->num_samples = read_s32le(0x10,sf); + vgmstream->loop_start_sample = read_s32le(0x0C,sf); + vgmstream->loop_end_sample = read_s32le(0x10,sf); + + vgmstream->coding_type = coding_PCM16LE; + vgmstream->layout_type = layout_interleave; + vgmstream->interleave_block_size = 0x2; + + if (!vgmstream_open_stream(vgmstream, sf, start_offset)) + goto fail; + return vgmstream; + +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/rws_809.c b/Frameworks/vgmstream/vgmstream/src/meta/rws_809.c new file mode 100644 index 000000000..e4cca9585 --- /dev/null +++ b/Frameworks/vgmstream/vgmstream/src/meta/rws_809.c @@ -0,0 +1,149 @@ +#include "meta.h" +#include "../coding/coding.h" +#include "../util/endianness.h" + + +/* RWS - RenderWare Stream (with the tag 0x809) */ +VGMSTREAM* init_vgmstream_rws_809(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + bool big_endian; + char header_name[STREAM_NAME_SIZE], stream_name[STREAM_NAME_SIZE]; + int channels = 0, idx, interleave, loop_flag, sample_rate = 0, total_subsongs, target_subsong = sf->stream_index; + read_u32_t read_u32; + off_t chunk_offset, header_offset, misc_data_offset = 0, stream_name_offset, stream_offset = 0; + size_t chunk_size, header_size, misc_data_size, stream_size = 0; + uint32_t codec_uuid = 0; + + + /* checks */ + if (read_u32le(0x00, sf) != 0x809) /* File ID */ + goto fail; + + /* Burnout 2: Point of Impact (PS2, GCN, Xbox), Neighbours from Hell (GCN, Xbox): + * Predecessor to the common 0x80D-0x80F tag RWS with some parts reworked into AWD? */ + if (!check_extensions(sf, "rws")) + goto fail; + + /* Uses the following chunk IDs across the file: + * 0x00000809: File ID + * 0x0000080A: File header ID + * 0x0000080C: File data ID + * + * 0x00000802: Stream ID + * 0x00000803: Stream header ID + * 0x00000804: Stream data ID + */ + + chunk_offset = 0x0C; + if (read_u32le(chunk_offset, sf) != 0x80A) /* File header ID */ + goto fail; + chunk_size = read_u32le(chunk_offset + 0x04, sf); /* usually 0x44 */ + + read_string(header_name, STREAM_NAME_SIZE, chunk_offset + 0x40, sf); + + chunk_offset += chunk_size + 0x0C; + if (read_u32le(chunk_offset, sf) != 0x80C) /* File data ID */ + goto fail; + + big_endian = guess_endian32(chunk_offset + 0x0C, sf); + read_u32 = big_endian ? read_u32be : read_u32le; + + total_subsongs = read_u32(chunk_offset + 0x0C, sf); + + if (!target_subsong) + target_subsong = 1; + + chunk_offset += 0x10; + for (idx = 1; idx <= total_subsongs; idx++) { + if (read_u32le(chunk_offset, sf) != 0x802) /* Stream ID */ + goto fail; + chunk_size = read_u32le(chunk_offset + 0x04, sf); + + if (idx == target_subsong) { + header_offset = chunk_offset + 0x0C; + if (read_u32le(header_offset, sf) != 0x803) /* Stream header ID */ + goto fail; + header_size = read_u32le(header_offset + 0x04, sf); + + sample_rate = read_u32(header_offset + 0x10, sf); + stream_size = read_u32(header_offset + 0x18, sf); + //bit_depth = read_u8(header_offset + 0x1C, sf); + channels = read_u8(header_offset + 0x1D, sf); /* always 1? */ + if (channels != 1) + goto fail; + + //misc_data_offset = read_u32(header_offset + 0x20, sf); /* assumed, but wrong? */ + misc_data_offset = header_offset + 0x3C; + misc_data_size = read_u32(header_offset + 0x24, sf); /* 0x60 in GCN if DSP-ADPCM, otherwise 0 */ + + codec_uuid = read_u32(header_offset + 0x2C, sf); + + /* (header_offset + 0x3C + misc_data_size) + 0x00 to +0x18 has the target format + * info which in most cases would probably be identical to the input format info */ + + /* (misc_data_size * 2) should be 0xC0 if it exists */ + stream_name_offset = header_offset + 0x7C + (misc_data_size * 2); + read_string(stream_name, STREAM_NAME_SIZE, stream_name_offset, sf); + + stream_offset = header_offset + header_size + 0x0C; + if (read_u32le(stream_offset, sf) != 0x804) /* Stream data ID */ + goto fail; + if (read_u32le(stream_offset + 0x04, sf) != stream_size) + goto fail; + } + chunk_offset += chunk_size + 0x0C; + } + + if (total_subsongs < 1 || target_subsong > total_subsongs) + goto fail; + + interleave = 0; + loop_flag = 0; + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels, loop_flag); + if (!vgmstream) + goto fail; + + vgmstream->meta_type = meta_RWS; + vgmstream->layout_type = layout_none; + vgmstream->sample_rate = sample_rate; + vgmstream->stream_size = stream_size; + vgmstream->num_streams = total_subsongs; + vgmstream->interleave_block_size = interleave; + + /* Seems to be the same as in rws_80d.c, maybe merge the two switches into one function? */ + switch (codec_uuid) { + case 0xD01BD217: /* {D01BD217-3587-4EED-B9D9-B8E86EA9B995}: PCM Signed 16-bit */ + vgmstream->num_samples = pcm16_bytes_to_samples(stream_size, channels); + vgmstream->coding_type = big_endian ? coding_PCM16BE : coding_PCM16LE; + break; + + case 0xD9EA9798: /* {D9EA9798-BBBC-447B-96B2-654759102E16}: PSX-ADPCM */ + vgmstream->num_samples = ps_bytes_to_samples(stream_size, channels); + vgmstream->coding_type = coding_PSX; + break; + + case 0xF86215B0: /* {F86215B0-31D5-4C29-BD37-CDBF9BD10C53}: DSP-ADPCM */ + vgmstream->num_samples = dsp_bytes_to_samples(stream_size, channels); + dsp_read_coefs_be(vgmstream, sf, misc_data_offset + 0x1C, 0); + dsp_read_hist_be(vgmstream, sf, misc_data_offset + 0x40, 0); + vgmstream->coding_type = coding_NGC_DSP; + break; + + default: + VGM_LOG("RWS: unknown codec 0x%08x\n", codec_uuid); + goto fail; + } + + snprintf(vgmstream->stream_name, STREAM_NAME_SIZE, "%s/%s", header_name, stream_name); + + if (!vgmstream_open_stream(vgmstream, sf, stream_offset + 0x0C)) + goto fail; + + return vgmstream; + +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/rws.c b/Frameworks/vgmstream/vgmstream/src/meta/rws_80d.c similarity index 100% rename from Frameworks/vgmstream/vgmstream/src/meta/rws.c rename to Frameworks/vgmstream/vgmstream/src/meta/rws_80d.c diff --git a/Frameworks/vgmstream/vgmstream/src/meta/rwx.c b/Frameworks/vgmstream/vgmstream/src/meta/rwx.c deleted file mode 100644 index ad61bcfba..000000000 --- a/Frameworks/vgmstream/vgmstream/src/meta/rwx.c +++ /dev/null @@ -1,66 +0,0 @@ -#include "meta.h" -#include "../util.h" -/* RWX (found in Air Force Delta Storm (XBOX)) */ -VGMSTREAM * init_vgmstream_rwx(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - off_t start_offset; - - int loop_flag = 0; - int channel_count; - - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("rwx",filename_extension(filename))) goto fail; - - /* check header */ - if (read_32bitBE(0x00,streamFile) != 0x52415758) - goto fail; - - - loop_flag = read_32bitLE(0x0C,streamFile); - channel_count = 2; - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - - /* fill in the vital statistics */ - start_offset = read_32bitLE(0x04,streamFile); - vgmstream->channels = channel_count; - vgmstream->sample_rate = read_32bitLE(0x08,streamFile); - vgmstream->coding_type = coding_PCM16LE; - vgmstream->num_samples = read_32bitLE(0x10,streamFile); - if (loop_flag) { - vgmstream->loop_start_sample = read_32bitLE(0x0C,streamFile); - vgmstream->loop_end_sample = read_32bitLE(0x10,streamFile); - } - - vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = 0x2; - vgmstream->meta_type = meta_RWX; - - /* open the file for reading */ - { - int i; - STREAMFILE * file; - file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); - if (!file) goto fail; - for (i=0;ich[i].streamfile = file; - - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset=start_offset+ - vgmstream->interleave_block_size*i; - - } - } - - return vgmstream; - - /* clean up anything we may have opened */ -fail: - if (vgmstream) close_vgmstream(vgmstream); - return NULL; -} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/seg.c b/Frameworks/vgmstream/vgmstream/src/meta/seg.c index 756c92834..43780ba37 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/seg.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/seg.c @@ -6,11 +6,10 @@ /* SEG - from Stormfront games [Eragon (multi), Forgotten Realms: Demon Stone (multi) */ VGMSTREAM* init_vgmstream_seg(STREAMFILE* sf) { VGMSTREAM* vgmstream = NULL; - off_t start_offset; - int loop_flag, channel_count; - size_t data_size; + uint32_t start_offset, data_size; + int loop_flag, channels; uint32_t codec; - int32_t (*read_32bit)(off_t,STREAMFILE*) = NULL; + read_u32_t read_u32; /* checks */ @@ -19,19 +18,16 @@ VGMSTREAM* init_vgmstream_seg(STREAMFILE* sf) { if (!check_extensions(sf, "seg")) goto fail; - codec = read_32bitBE(0x04,sf); - /* 0x08: version? (2: Eragon, Spiderwick Chronicles Wii / 3: Spiderwick Chronicles X360 / 4: Spiderwick Chronicles PC) */ - if (guess_endian32(0x08,sf)) { - read_32bit = read_32bitBE; - } else { - read_32bit = read_32bitLE; - } + codec = read_u32be(0x04,sf); + /* 0x08: version? (2: Eragon, Spiderwick Chronicles Wii / 3: Eragon X360, Spiderwick Chronicles X360 / 4: Spiderwick Chronicles PC) */ + read_u32 = guess_read_u32(0x08, sf); + /* 0x0c: file size */ - data_size = read_32bit(0x10, sf); /* including interleave padding */ + data_size = read_u32(0x10, sf); /* including interleave padding */ /* 0x14: null */ - loop_flag = read_32bit(0x20,sf); /* rare */ - channel_count = read_32bit(0x24,sf); + loop_flag = read_u32(0x20,sf); /* rare */ + channels = read_u32(0x24,sf); /* 0x28: extradata 1 entries (0x08 per entry, unknown) */ /* 0x2c: extradata 1 offset */ /* 0x30: extradata 2 entries (0x10 or 0x14 per entry, seek/hist table?) */ @@ -41,12 +37,12 @@ VGMSTREAM* init_vgmstream_seg(STREAMFILE* sf) { /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); + vgmstream = allocate_vgmstream(channels, loop_flag); if (!vgmstream) goto fail; vgmstream->meta_type = meta_SEG; - vgmstream->sample_rate = read_32bit(0x18,sf); - vgmstream->num_samples = read_32bit(0x1c,sf); + vgmstream->sample_rate = read_u32(0x18,sf); + vgmstream->num_samples = read_u32(0x1c,sf); if (loop_flag) { vgmstream->loop_start_sample = 0; vgmstream->loop_end_sample = vgmstream->num_samples; @@ -86,14 +82,29 @@ VGMSTREAM* init_vgmstream_seg(STREAMFILE* sf) { #ifdef VGM_USE_FFMPEG case 0x78623300: { /* "xb3\0" */ - int block_size = 0x4000; + /* no apparent flag */ + if (read_u32be(start_offset, sf) == 0) { + /* Eragon (PC) */ + start_offset += 0x20A; /* one frame */ - vgmstream->codec_data = init_ffmpeg_xma2_raw(sf, start_offset, data_size, vgmstream->num_samples, vgmstream->channels, vgmstream->sample_rate, block_size, 0); - if (!vgmstream->codec_data) goto fail; - vgmstream->coding_type = coding_FFmpeg; - vgmstream->layout_type = layout_none; + mpeg_custom_config cfg = {0}; + + vgmstream->codec_data = init_mpeg_custom(sf, start_offset, &vgmstream->coding_type, channels, MPEG_STANDARD, &cfg); + if (!vgmstream->codec_data) goto fail; + vgmstream->layout_type = layout_none; + } + else { + /* The Spiderwick Chronicles (X360) */ + int block_size = 0x4000; + + vgmstream->codec_data = init_ffmpeg_xma2_raw(sf, start_offset, data_size, vgmstream->num_samples, vgmstream->channels, vgmstream->sample_rate, block_size, 0); + if (!vgmstream->codec_data) goto fail; + vgmstream->coding_type = coding_FFmpeg; + vgmstream->layout_type = layout_none; + + xma_fix_raw_samples(vgmstream, sf, start_offset,data_size, 0, 0,0); /* samples are ok */ + } - xma_fix_raw_samples(vgmstream, sf, start_offset,data_size, 0, 0,0); /* samples are ok */ break; } #endif diff --git a/Frameworks/vgmstream/vgmstream/src/meta/sfh.c b/Frameworks/vgmstream/vgmstream/src/meta/sfh.c index b22a2205f..7ca7a902a 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/sfh.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/sfh.c @@ -1,46 +1,65 @@ -#include "meta.h" -#include "../coding/coding.h" -#include "sfh_streamfile.h" - - -/* .SFH - Capcom wrapper [Devil May Cry 4 Demo (PS3), Jojo's Bizarre Adventure HD (PS3)] */ -VGMSTREAM * init_vgmstream_sfh(STREAMFILE *streamFile) { - VGMSTREAM *vgmstream = NULL; - STREAMFILE *temp_streamFile = NULL; - uint32_t version; - size_t clean_size, block_size; - - /* check extensions */ - if ( !check_extensions(streamFile,"at3")) - goto fail; - - if (read_32bitBE(0x00, streamFile) != 0x00534648) /* "\0SFH" */ - goto fail; - if (read_32bitBE(0x10, streamFile) != 0x52494646) /* "RIFF" */ - goto fail; - - /* mini header */ - version = read_32bitBE(0x04,streamFile); - clean_size = read_32bitBE(0x08,streamFile); /* there is padding data at the end */ - /* 0x0c: always 0 */ - - switch(version) { - case 0x00010000: block_size = 0x10010; break; /* DMC4 Demo (not retail) */ - case 0x00010001: block_size = 0x20000; break; /* Jojo */ - default: goto fail; - } - - temp_streamFile = setup_sfh_streamfile(streamFile, 0x00, block_size, clean_size, "at3"); - if (!temp_streamFile) goto fail; - - vgmstream = init_vgmstream_riff(temp_streamFile); - if (!vgmstream) goto fail; - - close_streamfile(temp_streamFile); - return vgmstream; - -fail: - close_streamfile(temp_streamFile); - close_vgmstream(vgmstream); - return NULL; -} +#include "meta.h" +#include "../coding/coding.h" +#include "sfh_streamfile.h" + +typedef VGMSTREAM* (*init_vgmstream_t)(STREAMFILE*); + + +/* .SFH - Capcom wrapper used with common audio extensions [Devil May Cry 4 Demo (PS3), Jojo's Bizarre Adventure HD (PS3), Sengoku Basara 4 Sumeragi (PS3)] */ +VGMSTREAM* init_vgmstream_sfh(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + STREAMFILE* temp_sf = NULL; + init_vgmstream_t init_vgmstream = NULL; + + + /* checks */ + if (!is_id32be(0x00, sf, "\0SFH")) + return NULL; + if (!check_extensions(sf,"at3,sspr")) + return NULL; + + /* mini header */ + uint32_t version = read_u32be(0x04,sf); + uint32_t clean_size = read_u32be(0x08,sf); /* there is padding data at the end */ + /* 0x0c: always 0 */ + + char* extension; + uint32_t header_id = read_u32be(0x10,sf); + switch(header_id) { + case 0x52494646: // RIFF + init_vgmstream = init_vgmstream_riff; + extension = "at3"; + break; + + case 0x53535052: // SSPR + init_vgmstream = init_vgmstream_sspr; + extension = "sspr"; + break; + + case 0x00434C44: // \0CLD (.dlcp) + case 0x00435241: // \0CRA (.arc) + default: + goto fail; + } + + uint32_t block_size; + switch(version) { + case 0x00010000: block_size = 0x10010; break; /* DMC4 Demo (not retail) */ + case 0x00010001: block_size = 0x20000; break; /* Jojo, SB4 */ + default: goto fail; + } + + temp_sf = setup_sfh_streamfile(sf, 0x00, block_size, clean_size, extension); + if (!temp_sf) goto fail; + + vgmstream = init_vgmstream(temp_sf); + if (!vgmstream) goto fail; + + close_streamfile(temp_sf); + return vgmstream; + +fail: + close_streamfile(temp_sf); + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/sli.c b/Frameworks/vgmstream/vgmstream/src/meta/sli.c index d8b3ca795..11352e6ff 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/sli.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/sli.c @@ -12,8 +12,12 @@ VGMSTREAM* init_vgmstream_sli_loops(STREAMFILE* sf) { VGMSTREAM* (*init_vgmstream)(STREAMFILE* sf) = NULL; /* checks */ + /* V1: fixed to 0x900? + * V2: varies with text size but around 0xC0 */ + if (get_streamfile_size(sf) > 0x2000) + return NULL; if (!check_extensions(sf, "sli")) - goto fail; + return NULL; { /* try with file.ogg/opus/wav.sli=header and file.ogg/opus/wav=data */ diff --git a/Frameworks/vgmstream/vgmstream/src/meta/smpl.c b/Frameworks/vgmstream/vgmstream/src/meta/smpl.c new file mode 100644 index 000000000..359ef481b --- /dev/null +++ b/Frameworks/vgmstream/vgmstream/src/meta/smpl.c @@ -0,0 +1,48 @@ +#include "meta.h" +#include "../coding/coding.h" + +/* SMPL - from Homura (PS2) */ +VGMSTREAM* init_vgmstream_smpl(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + uint32_t start_offset, channel_size; + int loop_flag, channels; + + /* checks*/ + if (!is_id32be(0x00,sf, "SMPL")) + return NULL; + + /* .v0: left channel, .v1: right channel + * .smpl: header id */ + if (!check_extensions(sf,"v0,v1") ) + return NULL; + + /* 0x04: version (VAG-clone) */ + channels = 1; + loop_flag = (read_s32le(0x30,sf) != 0); /* .v1 doesn't have loop points */ + start_offset = 0x40; + channel_size = read_u32be(0x0c,sf) - 0x10; + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels,loop_flag); + if (!vgmstream) goto fail; + + vgmstream->sample_rate = read_s32be(0x10,sf); + vgmstream->num_samples = ps_bytes_to_samples(channel_size*channels, channels); + vgmstream->loop_start_sample = read_s32le(0x30,sf); + vgmstream->loop_end_sample = vgmstream->num_samples; + + vgmstream->meta_type = meta_SMPL; + vgmstream->allow_dual_stereo = 1; + vgmstream->coding_type = coding_PSX; + vgmstream->layout_type = layout_none; + + read_string(vgmstream->stream_name,0x10+1, 0x20,sf); + + if (!vgmstream_open_stream(vgmstream, sf, start_offset)) + goto fail; + return vgmstream; + +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/smv.c b/Frameworks/vgmstream/vgmstream/src/meta/smv.c index 6691a0846..bbb5c1c21 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/smv.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/smv.c @@ -1,50 +1,49 @@ -#include "meta.h" -#include "../coding/coding.h" - -/* .SMV - from Cho Aniki Zero (PSP) */ -VGMSTREAM * init_vgmstream_smv(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - off_t start_offset; - int loop_flag, channel_count; - size_t channel_size, loop_start; - - - /* check extension */ - if (!check_extensions(streamFile, "smv")) - goto fail; - - channel_size = read_32bitLE(0x00,streamFile); - /* 0x08: number of full interleave blocks */ - channel_count = read_16bitLE(0x0a,streamFile); - loop_start = read_32bitLE(0x18,streamFile); - loop_flag = (loop_start != -1); - start_offset = 0x800; - - if (channel_size * channel_count + start_offset != get_streamfile_size(streamFile)) - goto fail; - - channel_size -= 0x10; /* last value has SPU end frame without flag 0x7 as it should */ - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count, loop_flag); - if (!vgmstream) goto fail; - - vgmstream->sample_rate = read_32bitLE(0x10, streamFile); - vgmstream->num_samples = ps_bytes_to_samples(channel_size*channel_count, channel_count); - vgmstream->loop_start_sample = ps_bytes_to_samples(loop_start*channel_count, channel_count); - vgmstream->loop_end_sample = vgmstream->num_samples; - - vgmstream->meta_type = meta_SMV; - vgmstream->coding_type = coding_PSX; - vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = read_32bitLE(0x04, streamFile); - vgmstream->interleave_last_block_size = read_32bitLE(0x0c, streamFile); - - if (!vgmstream_open_stream(vgmstream,streamFile,start_offset)) - goto fail; - return vgmstream; - -fail: - close_vgmstream(vgmstream); - return NULL; -} +#include "meta.h" +#include "../coding/coding.h" + +/* .SMV - from Cho Aniki Zero (PSP) */ +VGMSTREAM* init_vgmstream_smv(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + uint32_t start_offset, channel_size, loop_start; + int loop_flag, channels; + + + /* check extension */ + if (!check_extensions(sf, "smv")) + goto fail; + + channel_size = read_u32le(0x00,sf); + /* 0x08: number of full interleave blocks */ + channels = read_u16le(0x0a,sf); + loop_start = read_u32le(0x18,sf); + loop_flag = (loop_start != -1); + start_offset = 0x800; + + if (channel_size * channels + start_offset != get_streamfile_size(sf)) + goto fail; + + channel_size -= 0x10; /* last value has SPU end frame without flag 0x7 as it should */ + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels, loop_flag); + if (!vgmstream) goto fail; + + vgmstream->sample_rate = read_s32le(0x10, sf); + vgmstream->num_samples = ps_bytes_to_samples(channel_size, 1); + vgmstream->loop_start_sample = ps_bytes_to_samples(loop_start, 1); + vgmstream->loop_end_sample = vgmstream->num_samples; + + vgmstream->meta_type = meta_SMV; + vgmstream->coding_type = coding_PSX; + vgmstream->layout_type = layout_interleave; + vgmstream->interleave_block_size = read_u32le(0x04, sf); + vgmstream->interleave_last_block_size = read_u32le(0x0c, sf); + + if (!vgmstream_open_stream(vgmstream,sf,start_offset)) + goto fail; + return vgmstream; + +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/sspr.c b/Frameworks/vgmstream/vgmstream/src/meta/sspr.c index c877be760..3a58b10ff 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/sspr.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/sspr.c @@ -6,23 +6,22 @@ VGMSTREAM* init_vgmstream_sspr(STREAMFILE* sf) { VGMSTREAM* vgmstream = NULL; STREAMFILE* temp_sf = NULL; - uint32_t name_offset, subfile_offset, subfile_size, name_size; - int big_endian; - int total_subsongs, target_subsong = sf->stream_index; - char* extension; - uint32_t (*read_u32)(off_t,STREAMFILE*) = NULL; - /* checks */ - if (!check_extensions(sf,"sspr")) - goto fail; if (!is_id32be(0x00,sf,"SSPR")) - goto fail; + return NULL; + if (!check_extensions(sf,"sspr")) + return NULL; + + uint32_t name_offset, subfile_offset, subfile_size, name_size; + int total_subsongs, target_subsong = sf->stream_index; + char* extension; + read_u32_t read_u32 = NULL; /* Simple (audio only) container used some Capcom games (common engine?). * Some files come with a .stqr with unknown data (cues?). */ - big_endian = guess_endian32(0x04, sf); /* 0x01 (version?) */ + int big_endian = guess_endian32(0x04, sf); /* 0x01 (version?) */ read_u32 = big_endian ? read_u32be : read_u32le; total_subsongs = read_u32(0x08,sf); diff --git a/Frameworks/vgmstream/vgmstream/src/meta/stm.c b/Frameworks/vgmstream/vgmstream/src/meta/stma.c similarity index 64% rename from Frameworks/vgmstream/vgmstream/src/meta/stm.c rename to Frameworks/vgmstream/vgmstream/src/meta/stma.c index 54146b5aa..33988bcae 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/stm.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/stma.c @@ -1,118 +1,119 @@ -#include "meta.h" -#include "../coding/coding.h" - -/* STM - from Angel Studios/Rockstar San Diego games (Red Dead Revolver, Midnight Club 2, TransWorld Surf) */ -VGMSTREAM * init_vgmstream_stm(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - off_t start_offset; - int loop_flag = 0, channel_count; - int big_endian, bps, interleave, data_size, loop_start = 0, loop_end = 0; - int32_t (*read_32bit)(off_t,STREAMFILE*) = NULL; - int16_t (*read_16bit)(off_t,STREAMFILE*) = NULL; - - /* check extension, case insensitive - * .stm is the real ext but common, rename to .lstm or .stma/amts/ps2stm (older) */ - if ( !check_extensions(streamFile,"stm,lstm,stma,amts,ps2stm")) - goto fail; - - /* check header */ - if ((read_32bitBE(0x00,streamFile) != 0x53544d41) && /* "SMTA" (LE) */ - (read_32bitBE(0x00,streamFile) != 0x414D5453)) /* "AMTS" (BE) */ - goto fail; - /* 0x04: revision (696F/696B/696A/6969) */ - - big_endian = (read_32bitBE(0x00,streamFile) == 0x414D5453); - if (big_endian) { - read_32bit = read_32bitBE; - read_16bit = read_16bitBE; - } else { - read_32bit = read_32bitLE; - read_16bit = read_16bitLE; - } - - start_offset = 0x800; - - interleave = read_32bit(0x08,streamFile); - bps = read_32bit(0x10,streamFile); - channel_count = read_32bit(0x14,streamFile); - data_size = read_32bit(0x18,streamFile); - loop_end = read_32bit(0x1c,streamFile); /* absolute offset */ - if (data_size + start_offset != get_streamfile_size(streamFile)) goto fail; - - if (big_endian) { - /* GC AMTS have a regular DSP header beyond 0x20, just use what we need, no point on validating all fields */ - loop_flag = read_16bit(0x2c,streamFile); - } - else { - /* PS2/Xbox STMA have either loop info or padding beyond 0x20 */ - if (read_32bit(0x20,streamFile) == 1) { /* may contain 0xCCCCCCCC garbage */ - loop_flag = 1; - loop_start = read_32bit(0x24,streamFile); - /* 0x28 (32b * ch): loop start hist+step per channel */ //todo setup - } -#if 0 - /* this works for some files that do full repeats, but also repeats many SFX */ - else if (data_size != loop_end && data_size != loop_end - 0x100) { /* data_size vs adjusted loop_end */ - loop_flag = 1; - } -#endif - } - - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - vgmstream->sample_rate = read_32bit(0xc,streamFile); - vgmstream->meta_type = meta_STM; - vgmstream->layout_type = (channel_count > 1) ? layout_interleave : layout_none; - - switch(bps) { - case 4: - if (big_endian) { /* GC DSP ADPCM (TransWorld Surf GC) */ - vgmstream->coding_type = coding_NGC_DSP; - vgmstream->interleave_block_size = interleave; - - vgmstream->num_samples = read_32bit(0x20,streamFile); - vgmstream->loop_start_sample = dsp_nibbles_to_samples(read_32bit(0x30,streamFile)); - vgmstream->loop_end_sample = dsp_nibbles_to_samples(read_32bit(0x34,streamFile))+1; - - dsp_read_coefs_be(vgmstream, streamFile, 0x3c, 0x60); - dsp_read_hist_be(vgmstream, streamFile, 0x60, 0x60); - } - else { /* DVI IMA ADPCM (Red Dead Revolver, Midnight Club 2) */ - vgmstream->coding_type = coding_DVI_IMA_int; - /* 'interleave not' reliable, strange values and rarely needs 0x80 */ - vgmstream->interleave_block_size = (interleave == 0xc000) ? 0x80 : 0x40; - - vgmstream->num_samples = ima_bytes_to_samples(data_size, vgmstream->channels); - vgmstream->loop_start_sample = loop_start; - vgmstream->loop_end_sample = ima_bytes_to_samples(loop_end - start_offset, vgmstream->channels); - } - - break; - - case 16: /* PCM (Spy Hunter 2 PS2, rare) */ - vgmstream->coding_type = big_endian ? coding_PCM16BE : coding_PCM16LE; - vgmstream->interleave_block_size = 0x02; /* interleave not always reliable */ - - vgmstream->num_samples = pcm_bytes_to_samples(data_size, vgmstream->channels, bps); - vgmstream->loop_start_sample = loop_start; - vgmstream->loop_end_sample = pcm_bytes_to_samples(loop_end - start_offset, vgmstream->channels, bps); - - break; - - default: - VGM_LOG("STM: unknown bps %i\n", bps); - goto fail; - } - - - if ( !vgmstream_open_stream(vgmstream,streamFile,start_offset) ) - goto fail; - return vgmstream; - -fail: - close_vgmstream(vgmstream); - return NULL; -} +#include "meta.h" +#include "../coding/coding.h" + +/* STM - from Angel Studios/Rockstar San Diego games [Red Dead Revolver (PS2), Spy Hunter 2 (PS2/Xbox)] */ +VGMSTREAM* init_vgmstream_stma(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + off_t start_offset; + int loop_flag = 0, channel_count; + int big_endian, bps, interleave, data_size, loop_start = 0, loop_end = 0; + int32_t (*read_32bit)(off_t,STREAMFILE*) = NULL; + int16_t (*read_16bit)(off_t,STREAMFILE*) = NULL; + + + /* checks */ + if (!is_id32be(0x00,sf, "STMA") && /* LE */ + !is_id32be(0x00,sf, "AMTS")) /* BE */ + goto fail; + /* .stm: real extension + * .lstm: for plugins */ + if (!check_extensions(sf,"stm,lstm")) + goto fail; + + /* 0x04: revision (696F/696B/696A/6969) */ + + big_endian = is_id32be(0x00,sf, "AMTS"); + if (big_endian) { + read_32bit = read_32bitBE; + read_16bit = read_16bitBE; + } else { + read_32bit = read_32bitLE; + read_16bit = read_16bitLE; + } + + start_offset = 0x800; + + interleave = read_32bit(0x08,sf); + bps = read_32bit(0x10,sf); + channel_count = read_32bit(0x14,sf); + data_size = read_32bit(0x18,sf); + loop_end = read_32bit(0x1c,sf); /* absolute offset */ + if (data_size + start_offset != get_streamfile_size(sf)) goto fail; + + if (big_endian) { + /* GC AMTS have a regular DSP header beyond 0x20, just use what we need, no point on validating all fields */ + loop_flag = read_16bit(0x2c,sf); + } + else { + /* PS2/Xbox STMA have either loop info or padding beyond 0x20 */ + if (read_32bit(0x20,sf) == 1) { /* may contain 0xCCCCCCCC garbage */ + loop_flag = 1; + loop_start = read_32bit(0x24,sf); + /* 0x28 (32b * ch): loop start hist+step per channel */ //todo setup + } +#if 0 + /* this works for some files that do full repeats, but also repeats many SFX */ + else if (data_size != loop_end && data_size != loop_end - 0x100) { /* data_size vs adjusted loop_end */ + loop_flag = 1; + } +#endif + } + + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channel_count,loop_flag); + if (!vgmstream) goto fail; + + vgmstream->sample_rate = read_32bit(0xc,sf); + vgmstream->meta_type = meta_STMA; + vgmstream->layout_type = (channel_count > 1) ? layout_interleave : layout_none; + + switch(bps) { + case 4: + if (big_endian) { /* GC DSP ADPCM (TransWorld Surf GC) */ + vgmstream->coding_type = coding_NGC_DSP; + vgmstream->interleave_block_size = interleave; + + vgmstream->num_samples = read_32bit(0x20,sf); + vgmstream->loop_start_sample = dsp_nibbles_to_samples(read_32bit(0x30,sf)); + vgmstream->loop_end_sample = dsp_nibbles_to_samples(read_32bit(0x34,sf))+1; + + dsp_read_coefs_be(vgmstream, sf, 0x3c, 0x60); + dsp_read_hist_be(vgmstream, sf, 0x60, 0x60); + } + else { /* DVI IMA ADPCM (Red Dead Revolver, Midnight Club 2) */ + vgmstream->coding_type = coding_DVI_IMA_int; + /* 'interleave not' reliable, strange values and rarely needs 0x80 */ + vgmstream->interleave_block_size = (interleave == 0xc000) ? 0x80 : 0x40; + + vgmstream->num_samples = ima_bytes_to_samples(data_size, vgmstream->channels); + vgmstream->loop_start_sample = loop_start; + vgmstream->loop_end_sample = ima_bytes_to_samples(loop_end - start_offset, vgmstream->channels); + } + + break; + + case 16: /* PCM (Spy Hunter 2 PS2, rare) */ + vgmstream->coding_type = big_endian ? coding_PCM16BE : coding_PCM16LE; + vgmstream->interleave_block_size = 0x02; /* interleave not always reliable */ + + vgmstream->num_samples = pcm_bytes_to_samples(data_size, vgmstream->channels, bps); + vgmstream->loop_start_sample = loop_start; + vgmstream->loop_end_sample = pcm_bytes_to_samples(loop_end - start_offset, vgmstream->channels, bps); + + break; + + default: + VGM_LOG("STM: unknown bps %i\n", bps); + goto fail; + } + + + if (!vgmstream_open_stream(vgmstream, sf, start_offset)) + goto fail; + return vgmstream; + +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/str_wav.c b/Frameworks/vgmstream/vgmstream/src/meta/str_wav.c index 84e9117ca..18fc59d9e 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/str_wav.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/str_wav.c @@ -639,6 +639,7 @@ static int parse_header(STREAMFILE* sf_h, STREAMFILE* sf_b, strwav_header* strwa } /* SpongeBob SquarePants: Creature from the Krusty Krab (PS2)[2006] */ + /* Big Bumpin' (Xbox)[2006] */ /* Sneak King (Xbox)[2006] */ if ( read_u32be(0x04,sf_h) == 0x00000800 && read_u32le(0x08,sf_h) == 0x00000000 && @@ -673,9 +674,9 @@ static int parse_header(STREAMFILE* sf_h, STREAMFILE* sf_b, strwav_header* strwa } else { strwav->codec = XBOX; - strwav->interleave = strwav->tracks > 1 ? 0xD800/2 : 0xD800; /* assumed for multitrack */ + strwav->interleave = strwav->tracks > 1 ? 0x9000 : 0xD800; } - ;VGM_LOG("STR+WAV: header SBCKK/SK (PS2)\n"); + ;VGM_LOG("STR+WAV: header SBCKK/BB/SK (PS2/Xbox)\n"); return 1; } diff --git a/Frameworks/vgmstream/vgmstream/src/meta/wii_sts.c b/Frameworks/vgmstream/vgmstream/src/meta/sts.c similarity index 70% rename from Frameworks/vgmstream/vgmstream/src/meta/wii_sts.c rename to Frameworks/vgmstream/vgmstream/src/meta/sts.c index b8f245f93..84f682241 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/wii_sts.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/sts.c @@ -9,18 +9,18 @@ VGMSTREAM* init_vgmstream_sts(STREAMFILE* sf) { /* checks */ - if (!check_extensions(sf, "sts")) - goto fail; - data_size = read_u32be(0x00,sf); if (data_size + 0x04 != get_streamfile_size(sf)) - goto fail; + return NULL; + + if (!check_extensions(sf, "sts")) + return NULL; channels = read_u8(0x08,sf) + 1; - sample_rate = read_u16be(0x0c,sf); - /* 0x10: dsp related? */ - /* 0x16: usable size */ - channel_size = read_u32be(0x1a,sf); + sample_rate = read_u16be(0x0c,sf); + /* 0x10: dsp related? */ + /* 0x16: usable size */ + channel_size = read_u32be(0x1a,sf); loop_flag = 0; //(read_s32be(0x4C,sf) != -1); /* not seen */ @@ -34,16 +34,16 @@ VGMSTREAM* init_vgmstream_sts(STREAMFILE* sf) { vgmstream->meta_type = meta_STS; vgmstream->sample_rate = sample_rate; - vgmstream->num_samples = dsp_bytes_to_samples(channel_size, 1); + vgmstream->num_samples = dsp_bytes_to_samples(channel_size, 1); vgmstream->loop_start_sample = 0; vgmstream->loop_end_sample = vgmstream->num_samples; vgmstream->coding_type = coding_NGC_DSP; vgmstream->layout_type = layout_interleave; - vgmstream->interleave_block_size = channel_size + 0x2e; + vgmstream->interleave_block_size = channel_size + 0x2e; - dsp_read_coefs_be(vgmstream, sf, 0x1e, start_offset - 0x1e + channel_size); - dsp_read_hist_be(vgmstream, sf, 0x1e + 0x24, start_offset - 0x1e + channel_size); + dsp_read_coefs_be(vgmstream, sf, 0x1e, start_offset - 0x1e + channel_size); + dsp_read_hist_be(vgmstream, sf, 0x1e + 0x24, start_offset - 0x1e + channel_size); if (!vgmstream_open_stream(vgmstream, sf, start_offset)) goto fail; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/thp.c b/Frameworks/vgmstream/vgmstream/src/meta/thp.c index 006399566..7ee541b2e 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/thp.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/thp.c @@ -14,8 +14,9 @@ VGMSTREAM* init_vgmstream_thp(STREAMFILE* sf) { /* checks */ /* .thp: actual extension * .dsp: fake extension? + * .mov: Dora the Explorer: JttPP (GC) * (extensionless): Fragile (Wii) */ - if (!check_extensions(sf, "thp,dsp,")) + if (!check_extensions(sf, "thp,dsp,mov,")) goto fail; if (!is_id32be(0x00,sf, "THP\0")) goto fail; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/txth.c b/Frameworks/vgmstream/vgmstream/src/meta/txth.c index a4a5d29e5..73995bf8c 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/txth.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/txth.c @@ -55,8 +55,10 @@ typedef enum { PCM8_SB, HEVAG, YMZ, + ULAW, + ALAW, - UNKNOWN = 99, + UNKNOWN = 255, } txth_codec_t; typedef enum { DEFAULT, NEGATIVE, POSITIVE, INVERTED } txth_loop_t; @@ -238,6 +240,8 @@ VGMSTREAM* init_vgmstream_txth(STREAMFILE* sf) { case PCM8_U: case PCM8_SB: interleave = 0x01; break; case PCM_FLOAT_LE: interleave = 0x04; break; + case ULAW: + case ALAW: interleave = 0x01; break; default: break; } @@ -260,6 +264,8 @@ VGMSTREAM* init_vgmstream_txth(STREAMFILE* sf) { case PCM8_U: coding = coding_PCM8_U; break; case PCM8_U_int: coding = coding_PCM8_U_int; break; case PCM8_SB: coding = coding_PCM8_SB; break; + case ULAW: coding = coding_ULAW; break; + case ALAW: coding = coding_ALAW; break; case PCM_FLOAT_LE: coding = coding_PCMFLOAT; break; case SDX2: coding = coding_SDX2; break; case DVI_IMA: coding = coding_DVI_IMA; break; @@ -333,6 +339,8 @@ VGMSTREAM* init_vgmstream_txth(STREAMFILE* sf) { case coding_PCM8: case coding_PCM8_U: case coding_PCM8_SB: + case coding_ULAW: + case coding_ALAW: case coding_PCMFLOAT: case coding_PCM4: case coding_PCM4_U: @@ -993,6 +1001,8 @@ static txth_codec_t parse_codec(txth_header* txth, const char* val) { else if (is_string(val,"PCM_FLOAT_LE")) return PCM_FLOAT_LE; else if (is_string(val,"IMA_HV")) return IMA_HV; else if (is_string(val,"HEVAG")) return HEVAG; + else if (is_string(val,"ULAW")) return ULAW; + else if (is_string(val,"ALAW")) return ALAW; /* special handling */ else if (is_string(val,"name_value")) return txth->name_values[0]; else if (is_string(val,"name_value1")) return txth->name_values[0]; @@ -2132,6 +2142,8 @@ static int get_bytes_to_samples(txth_header* txth, uint32_t bytes) { case PCM8_U_int: case PCM8_U: case PCM8_SB: + case ULAW: + case ALAW: return pcm8_bytes_to_samples(bytes, txth->channels); case PCM_FLOAT_LE: return pcm_bytes_to_samples(bytes, txth->channels, 32); diff --git a/Frameworks/vgmstream/vgmstream/src/meta/vag.c b/Frameworks/vgmstream/vgmstream/src/meta/vag.c index aed923c02..94c60593a 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/vag.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/vag.c @@ -5,8 +5,7 @@ /* VAGp - Sony SDK format, created by various official tools */ VGMSTREAM* init_vgmstream_vag(STREAMFILE* sf) { VGMSTREAM* vgmstream = NULL; - off_t start_offset; - size_t file_size, channel_size, interleave, interleave_first = 0, interleave_first_skip = 0; + uint32_t start_offset, file_size, channel_size, interleave, interleave_first = 0, interleave_first_skip = 0; meta_t meta_type; int channels = 0, loop_flag, sample_rate; uint32_t vag_id, version, reserved; @@ -17,7 +16,7 @@ VGMSTREAM* init_vgmstream_vag(STREAMFILE* sf) { /* checks */ if (((read_u32be(0x00,sf) & 0xFFFFFF00) != get_id32be("VAG\0")) && ((read_u32le(0x00,sf) & 0xFFFFFF00) != get_id32be("VAG\0"))) - goto fail; + return NULL; /* .vag: standard * .swag: Frantix (PSP) @@ -28,7 +27,7 @@ VGMSTREAM* init_vgmstream_vag(STREAMFILE* sf) { * .xa2: Shikigami no Shiro (PS2) * .snd: Alien Breed (Vita) */ if (!check_extensions(sf,"vag,swag,str,vig,l,r,vas,xa2,snd")) - goto fail; + return NULL; file_size = get_streamfile_size(sf); @@ -55,7 +54,7 @@ VGMSTREAM* init_vgmstream_vag(STREAMFILE* sf) { switch(vag_id) { case 0x56414731: /* "VAG1" [Metal Gear Solid 3 (PS2), Cabela's African Safari (PSP), Shamu's Deep Sea Adventures (PS2)] */ - meta_type = meta_PS2_VAG1; //TODO not always Konami (Sand Grain Studios) + meta_type = meta_VAG_custom; //TODO not always Konami (Sand Grain Studios) start_offset = 0x40; /* 0x30 is extra data in VAG1 */ interleave = 0x10; loop_flag = 0; @@ -67,7 +66,7 @@ VGMSTREAM* init_vgmstream_vag(STREAMFILE* sf) { break; case 0x56414732: /* "VAG2" (2 channels) [Metal Gear Solid 3 (PS2)] */ - meta_type = meta_PS2_VAG2; + meta_type = meta_VAG_custom; start_offset = 0x40; /* 0x30 is extra data in VAG2 */ channels = 2; interleave = 0x800; @@ -75,7 +74,7 @@ VGMSTREAM* init_vgmstream_vag(STREAMFILE* sf) { break; case 0x56414769: /* "VAGi" (interleaved) */ - meta_type = meta_PS2_VAGi; + meta_type = meta_VAG_custom; start_offset = 0x800; channels = 2; interleave = read_u32le(0x08,sf); @@ -83,7 +82,7 @@ VGMSTREAM* init_vgmstream_vag(STREAMFILE* sf) { break; case 0x70474156: /* pGAV (little endian / stereo) [Jak 3 (PS2), Jak X (PS2)] */ - meta_type = meta_PS2_pGAV; + meta_type = meta_VAG_custom; start_offset = 0x30; if (is_id32be(0x20,sf, "Ster")) { @@ -94,7 +93,7 @@ VGMSTREAM* init_vgmstream_vag(STREAMFILE* sf) { else if (is_id32be(0x1000,sf, "pGAV")) interleave = 0x1000; /* Jak X interleave, includes header */ else - interleave = 0x2000; /* Jak 3 interleave in rare files, no header */ + goto fail; interleave_first = interleave - start_offset; /* interleave includes header */ interleave_first_skip = start_offset; } @@ -110,7 +109,7 @@ VGMSTREAM* init_vgmstream_vag(STREAMFILE* sf) { break; case 0x56414770: /* "VAGp" (standard and variations) */ - meta_type = meta_PS2_VAGp; + meta_type = meta_VAG; if (check_extensions(sf,"vig")) { /* MX vs. ATV Untamed (PS2) */ @@ -289,6 +288,14 @@ VGMSTREAM* init_vgmstream_vag(STREAMFILE* sf) { goto fail; } + /* ignore bigfiles and bad extractions (approximate) */ + if (channel_size * channels + interleave * channels + start_offset * channels + 0x8000 < get_streamfile_size(sf) || + channel_size * channels > get_streamfile_size(sf)) { + vgm_logi("VAG: wrong expected (incorrect extraction? %x * %i + %x + %x + ~ vs %x)\n", + channel_size, channels, interleave * channels, start_offset * channels, (uint32_t)get_streamfile_size(sf)); + goto fail; + } + /* build the VGMSTREAM */ vgmstream = allocate_vgmstream(channels, loop_flag); @@ -332,12 +339,12 @@ VGMSTREAM* init_vgmstream_vag_aaap(STREAMFILE* sf) { int loop_flag; /* checks */ + if (!is_id32be(0x00, sf, "AAAp")) + return NULL; + /* .vag - assumed, we don't know the original filenames */ if (!check_extensions(sf, "vag")) - goto fail; - - if (read_u32be(0x00, sf) != 0x41414170) /* "AAAp" */ - goto fail; + return NULL; interleave = read_u16le(0x04, sf); channels = read_u16le(0x06, sf); @@ -362,7 +369,7 @@ VGMSTREAM* init_vgmstream_vag_aaap(STREAMFILE* sf) { vgmstream = allocate_vgmstream(channels, loop_flag); if (!vgmstream) goto fail; - vgmstream->meta_type = meta_PS2_VAGp_AAAP; + vgmstream->meta_type = meta_AAAP; vgmstream->sample_rate = sample_rate; vgmstream->num_samples = ps_bytes_to_samples(channel_size, 1); vgmstream->coding_type = coding_PSX; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/vid1.c b/Frameworks/vgmstream/vgmstream/src/meta/vid1.c index fedeb81a0..3bc12b152 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/vid1.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/vid1.c @@ -1,36 +1,38 @@ #include "meta.h" #include "../coding/coding.h" #include "../layout/layout.h" +#include "../util/endianness.h" /* VID1 - Factor 5/DivX format GC/Xbox games [Gun (GC), Tony Hawk's American Wasteland (GC), Enter The Matrix (Xbox)]*/ -VGMSTREAM * init_vgmstream_ngc_vid1(STREAMFILE* sf) { - VGMSTREAM * vgmstream = NULL; - off_t start_offset, header_offset; +VGMSTREAM* init_vgmstream_vid1(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + uint32_t start_offset, header_offset; int loop_flag = 0, channels, sample_rate; uint32_t codec; int big_endian; - uint32_t (*read_u32)(off_t,STREAMFILE*); + read_u32_t read_u32; /* checks */ - /* .vid: video + (often) audio - * .ogg: audio only [Gun (GC)], .logg: for plugins */ - if (!check_extensions(sf,"vid,ogg,logg")) - goto fail; - - /* chunked/blocked format containing video or audio frames */ - if (read_u32be(0x00, sf) == 0x56494431) { /* "VID1" BE (GC) */ + if (is_id32be(0x00, sf, "VID1")) { /* BE (GC) */ big_endian = 1; } - else if (read_u32le(0x00,sf) == 0x56494431) { /* "VID1" LE (Xbox) */ + else if (is_id32le(0x00,sf, "VID1")) { /* LE (Xbox) */ big_endian = 0; } else { - goto fail; + return NULL; } + + /* .vid: video + (often) audio + * .ogg: audio only [Gun (GC)], .logg: for plugins */ + if (!check_extensions(sf,"vid,ogg,logg")) + return NULL; + read_u32 = big_endian ? read_u32be : read_u32le; + /* chunked/blocked format containing video or audio frames */ /* find actual header start/size in the chunks (id + size + null) */ { diff --git a/Frameworks/vgmstream/vgmstream/src/meta/voi.c b/Frameworks/vgmstream/vgmstream/src/meta/voi.c new file mode 100644 index 000000000..7cae07964 --- /dev/null +++ b/Frameworks/vgmstream/vgmstream/src/meta/voi.c @@ -0,0 +1,56 @@ +#include "meta.h" +#include "../coding/coding.h" + + +/* .VOI - from Raw Danger (PS2) */ +VGMSTREAM* init_vgmstream_voi(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + int channels, loop_flag = 0; + off_t start_offset; + + + /* checks */ + if (read_u32le(0x00,sf) != 1 && read_u32le(0x00,sf) != 2) + return NULL; + + if (!check_extensions(sf, "voi")) + return NULL; + + /* probably number of samples of all channels */ + if ((read_u32le(0x04,sf) * 2 + 0x800) != get_streamfile_size(sf)) + return NULL; + + channels = read_s32le(0x00,sf); + loop_flag = 0; + start_offset = 0x800; + + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels, loop_flag); + if (!vgmstream) goto fail; + + vgmstream->meta_type = meta_VOI; + vgmstream->num_samples = pcm16_bytes_to_samples(get_streamfile_size(sf) - start_offset, channels); + vgmstream->coding_type = coding_PCM16LE; + vgmstream->layout_type = layout_interleave; + + if (read_32bitLE(0x08,sf) == 0) { + vgmstream->sample_rate = 48000; + vgmstream->interleave_block_size = 0x200; + } + else if (read_32bitLE(0x08,sf) == 1) { + vgmstream->sample_rate = 24000; + vgmstream->interleave_block_size = 0x100; + } + else { + goto fail; + } + + if (!vgmstream_open_stream(vgmstream, sf, start_offset)) + goto fail; + return vgmstream; + +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ws_aud.c b/Frameworks/vgmstream/vgmstream/src/meta/ws_aud.c index 41ae998af..cd468007c 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/ws_aud.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/ws_aud.c @@ -4,128 +4,108 @@ /* Westwood Studios .aud (WS-AUD) */ -VGMSTREAM * init_vgmstream_ws_aud(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - +VGMSTREAM* init_vgmstream_ws_aud(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; coding_t coding_type = -1; off_t format_offset; - - int channel_count; - int new_type = 0; /* if 0 is old type */ - + int channels; + bool new_type = false; int bytes_per_sample = 0; - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("aud",filename_extension(filename))) goto fail; + + /* checks **/ + if (!check_extensions(sf, "aud") ) + return NULL; /* check for 0x0000DEAF chunk marker for first chunk */ - if (read_32bitLE(0x10,streamFile)==0x0000DEAF) { /* new */ - new_type = 1; - } else if (read_32bitLE(0x0C,streamFile)==0x0000DEAF) { /* old */ - new_type = 0; - } else goto fail; + if (read_u32le(0x10,sf) == 0x0000DEAF) { /* new */ + new_type = true; + format_offset = 0x0A; + } + else if (read_u32le(0x0C,sf) == 0x0000DEAF) { /* old */ + new_type = false; + format_offset = 0x06; + } + else { + return NULL; + } - if (new_type) - format_offset = 0xa; + /* blocked format with a mini-header */ + + if (read_u8(format_offset + 0x00, sf) & 1) + channels = 2; else - format_offset = 0x6; + channels = 1; - /* get channel count */ - if (read_8bit(format_offset,streamFile) & 1) - channel_count = 2; - else - channel_count = 1; + if (channels == 2) + goto fail; /* not seen */ - if (channel_count == 2) goto fail; /* TODO: not yet supported (largely - because not yet seen) */ - - /* get output format */ - if (read_8bit(format_offset+1,streamFile) & 2) + if (read_u8(format_offset + 0x01,sf) & 2) bytes_per_sample = 2; else bytes_per_sample = 1; /* check codec type */ - switch (read_8bit(format_offset+1,streamFile)) { + switch (read_u8(format_offset + 0x01,sf)) { case 1: /* Westwood custom */ coding_type = coding_WS; - /* shouldn't happen? */ - if (bytes_per_sample != 1) goto fail; + if (bytes_per_sample != 1) goto fail; /* shouldn't happen? */ break; case 99: /* IMA ADPCM */ coding_type = coding_IMA_int; break; default: goto fail; - break; } /* build the VGMSTREAM */ - - vgmstream = allocate_vgmstream(channel_count,0); + vgmstream = allocate_vgmstream(channels, 0); if (!vgmstream) goto fail; - /* fill in the vital statistics */ if (new_type) { - vgmstream->num_samples = read_32bitLE(0x06,streamFile)/bytes_per_sample/channel_count; - } else { + vgmstream->num_samples = read_32bitLE(0x06,sf)/bytes_per_sample/channels; + } + else { /* Doh, no output size in old type files. We have to read through the * file looking at chunk headers! Crap! */ int32_t out_size = 0; off_t current_offset = 0x8; - off_t file_size = get_streamfile_size(streamFile); + off_t file_size = get_streamfile_size(sf); while (current_offset < file_size) { int16_t chunk_size; - chunk_size = read_16bitLE(current_offset,streamFile); - out_size += read_16bitLE(current_offset+2,streamFile); + chunk_size = read_16bitLE(current_offset,sf); + out_size += read_16bitLE(current_offset+2,sf); /* while we're here might as well check for valid chunks */ - if (read_32bitLE(current_offset+4,streamFile) != 0x0000DEAF) goto fail; + if (read_32bitLE(current_offset+4,sf) != 0x0000DEAF) goto fail; current_offset+=8+chunk_size; } - vgmstream->num_samples = out_size/bytes_per_sample/channel_count; + vgmstream->num_samples = out_size/bytes_per_sample/channels; } /* they tend to not actually have data for the last odd sample */ if (vgmstream->num_samples & 1) vgmstream->num_samples--; - vgmstream->sample_rate = (uint16_t)read_16bitLE(0x00,streamFile); + vgmstream->sample_rate = (uint16_t)read_16bitLE(0x00,sf); vgmstream->coding_type = coding_type; if (new_type) { vgmstream->meta_type = meta_WS_AUD; - } else { - vgmstream->meta_type = meta_WS_AUD_old; } vgmstream->layout_type = layout_blocked_ws_aud; - /* open the file for reading by each channel */ - { - int i; - STREAMFILE * file; + if (!vgmstream_open_stream(vgmstream, sf, 0x00) ) + goto fail; - file = streamFile->open(streamFile,filename, - STREAMFILE_DEFAULT_BUFFER_SIZE); - if (!file) goto fail; - - for (i=0;ich[i].streamfile = file; - } - } - - /* start me up */ if (new_type) { - block_update_ws_aud(0xc,vgmstream); + block_update(0x0c, vgmstream); } else { - block_update_ws_aud(0x8,vgmstream); + block_update(0x08, vgmstream); } return vgmstream; - /* clean up anything we may have opened */ fail: if (vgmstream) close_vgmstream(vgmstream); return NULL; diff --git a/Frameworks/vgmstream/vgmstream/src/meta/xa2_acclaim.c b/Frameworks/vgmstream/vgmstream/src/meta/xa2_acclaim.c new file mode 100644 index 000000000..b55e670f3 --- /dev/null +++ b/Frameworks/vgmstream/vgmstream/src/meta/xa2_acclaim.c @@ -0,0 +1,60 @@ +#include "meta.h" +#include "../coding/coding.h" + + +/* XA2 - from Acclaim games [RC Revenge Pro (PS2), XGIII: Extreme G Racing (PS2)] */ +VGMSTREAM* init_vgmstream_xa2_acclaim(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + uint32_t start_offset, sizes_offset; + int channels, loop_flag = 0, interleave; + + + /* checks */ + if (read_u32le(0x00,sf) > 0x10) + return NULL; + + if (!check_extensions(sf, "xa2")) + return NULL; + + channels = read_s32le(0x00, sf); /* seen +16 */ + loop_flag = 0; + + if (read_u32le(0x04,sf) > 0x1000) { /* RCRP (no interleave field) */ + interleave = (channels > 2) ? 0x400 : 0x1000; + sizes_offset = 0x04; + } + else { + interleave = read_s32le(0x04,sf); + sizes_offset = 0x08; + } + + /* N sizes that rougly sum data size (not all the same value), then empty */ + for (int i = 0; i < channels; i++) { + if (read_32bitBE(sizes_offset + 0x04 * i, sf) == 0) + goto fail; + } + + if (read_32bitBE(sizes_offset + 0x04 * channels, sf) != 0) + goto fail; + + start_offset = 0x800; + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels, loop_flag); + if (!vgmstream) goto fail; + + vgmstream->meta_type = meta_XA2_ACCLAIM; + vgmstream->sample_rate = 44100; + vgmstream->num_samples = ps_bytes_to_samples(get_streamfile_size(sf) - start_offset, channels); + + vgmstream->coding_type = coding_PSX; + vgmstream->layout_type = layout_interleave; + vgmstream->interleave_block_size = interleave; + + if (!vgmstream_open_stream(vgmstream, sf, start_offset)) + goto fail; + return vgmstream; +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/xnb_lz4mg.h b/Frameworks/vgmstream/vgmstream/src/meta/xnb_lz4mg.h index dc61510d0..e6833472a 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/xnb_lz4mg.h +++ b/Frameworks/vgmstream/vgmstream/src/meta/xnb_lz4mg.h @@ -79,6 +79,8 @@ static int lz4mg_decompress(lz4mg_stream_t* strm) { int src_pos = 0; uint8_t next_len, next_val; + /* MSVC 64 19.30+ has a /O2 bug where some states aren't handled properly unless a fallthrough is used. + * Seems related to src_pos and doesn't seem fixed by using sub-functions or avoiding gotos. */ while (1) { /* mostly linear state machine, but it may break anytime when reaching dst or src @@ -154,7 +156,7 @@ static int lz4mg_decompress(lz4mg_stream_t* strm) { } while (next_len == LZ4MG_VARLEN_CONTINUE); ctx->state = SET_MATCH; - break; + //break; // Falthrough for MSVC case SET_MATCH: ctx->match_len += LZ4MG_MIN_MATCH_LEN; @@ -164,7 +166,7 @@ static int lz4mg_decompress(lz4mg_stream_t* strm) { ctx->match_pos = LZ4MG_WINDOW_SIZE + ctx->match_pos; ctx->state = COPY_MATCH; - break; + //break; // Fallthrough for MSVC case COPY_MATCH: while (ctx->match_len > 0) { diff --git a/Frameworks/vgmstream/vgmstream/src/meta/xwb.c b/Frameworks/vgmstream/vgmstream/src/meta/xwb.c index 307719daf..9bd6da6cc 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/xwb.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/xwb.c @@ -95,9 +95,10 @@ VGMSTREAM* init_vgmstream_xwb(STREAMFILE* sf) { /* .xwb: standard * .xna: Touhou Makukasai ~ Fantasy Danmaku Festival (PC) - * (extensionless): Ikaruga (X360/PC), Grabbed by the Ghoulies (Xbox) + * (extensionless): Ikaruga (X360/PC), Grabbed by the Ghoulies (Xbox) + * .hwb: Burnout Revenge (X360) * .bd: Fatal Frame 2 (Xbox) */ - if (!check_extensions(sf,"xwb,xna,bd,")) + if (!check_extensions(sf,"xwb,xna,hwb,bd,")) goto fail; xwb.little_endian = is_id32be(0x00,sf, "WBND"); /* Xbox/PC */ diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ydsp.c b/Frameworks/vgmstream/vgmstream/src/meta/ydsp.c index d4c46aa0b..8b37f85fc 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/ydsp.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/ydsp.c @@ -1,92 +1,48 @@ #include "meta.h" -#include "../util.h" +#include "../coding/coding.h" -/* YDSP (from WWE Day of Reckoning) */ -VGMSTREAM * init_vgmstream_ydsp(STREAMFILE *streamFile) { - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - int loop_flag; - int channel_count; - off_t start_offset; - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("ydsp",filename_extension(filename))) goto fail; +/* YDSP - from Yuke's games [WWE Day of Reckoning (GC), WWE WrestleMania XIX (GC)] */ +VGMSTREAM* init_vgmstream_ydsp(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + int channels, loop_flag; + uint32_t start_offset; - /* check header */ - if (read_32bitBE(0x00,streamFile) != 0x59445350) /* "YDSP" */ - goto fail; + /* checks */ + if (!is_id32be(0x00,sf, "YDSP")) + return NULL; + + /* .ydsp: header id (in bigfile, .yds is the likely extension comparing similar files) */ + if (!check_extensions(sf, "ydsp")) + return NULL; + + loop_flag = (read_s32be(0xB0,sf) != 0x0); + channels = read_u16be(0x10,sf); + start_offset = 0x120; - loop_flag = (read_32bitBE(0xB0,streamFile)!=0x0); - channel_count = (uint16_t)read_16bitBE(0x10,streamFile); - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); + vgmstream = allocate_vgmstream(channels, loop_flag); if (!vgmstream) goto fail; - /* fill in the vital statistics */ - start_offset = 0x120; - vgmstream->channels = channel_count; - vgmstream->sample_rate = read_32bitBE(0x0C,streamFile); - vgmstream->coding_type = coding_NGC_DSP; vgmstream->meta_type = meta_YDSP; + vgmstream->sample_rate = read_s32be(0x0C,sf); - vgmstream->num_samples = (read_32bitBE(0x08,streamFile))*14/8/channel_count; + vgmstream->num_samples = dsp_bytes_to_samples(read_u32be(0x08,sf), channels); + vgmstream->loop_start_sample = read_s32be(0xB0,sf); + vgmstream->loop_end_sample = read_s32be(0xB4,sf); - if (loop_flag) - { - vgmstream->loop_start_sample = read_32bitBE(0xB0,streamFile); - vgmstream->loop_end_sample = read_32bitBE(0xB4,streamFile); - } + vgmstream->coding_type = coding_NGC_DSP; + vgmstream->layout_type = layout_interleave; + vgmstream->interleave_block_size = read_32bitBE(0x14,sf); - if (channel_count == 1) - { - vgmstream->layout_type = layout_none; - } - else if (channel_count == 2) - { - vgmstream->interleave_block_size = read_32bitBE(0x14,streamFile); - vgmstream->layout_type = layout_interleave; - } - - - - /* open the file for reading */ - - if (vgmstream->coding_type == coding_NGC_DSP) - { - int i; - for (i=0;i<16;i++) - { - vgmstream->ch[0].adpcm_coef[i] = read_16bitBE(0x20+i*2,streamFile); - } - if (vgmstream->channels == 2) - { - for (i=0;i<16;i++) - { - vgmstream->ch[1].adpcm_coef[i] = read_16bitBE(0x44+i*2,streamFile); - } - } - } - - { - int i; - STREAMFILE * file; - file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); - if (!file) goto fail; - for (i=0;ich[i].streamfile = file; - - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset=start_offset+ - vgmstream->interleave_block_size*i; - } - } + dsp_read_coefs_be(vgmstream, sf, 0x20, 0x24); + //dsp_read_hist_be(vgmstream, sf, 0x20 + 0x20, 0x24); + if (!vgmstream_open_stream(vgmstream, sf, start_offset)) + goto fail; return vgmstream; - /* clean up anything we may have opened */ fail: - if (vgmstream) close_vgmstream(vgmstream); + close_vgmstream(vgmstream); return NULL; } diff --git a/Frameworks/vgmstream/vgmstream/src/meta/ymf.c b/Frameworks/vgmstream/vgmstream/src/meta/ymf.c new file mode 100644 index 000000000..e326073ae --- /dev/null +++ b/Frameworks/vgmstream/vgmstream/src/meta/ymf.c @@ -0,0 +1,51 @@ +#include "meta.h" +#include "../coding/coding.h" + +/* YMF - from Yuke's games [WWE WrestleMania X8 (GC)] */ +VGMSTREAM* init_vgmstream_ymf(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + uint32_t start_offset; + int channels, loop_flag; + + + /* checks */ + if (read_u32be(0x00,sf) != 0x00000180 || + read_u32be(0x08,sf) != 0x00000003 || + read_u32be(0x0c,sf) != 0xCCCCCCCC) + return NULL; + /* 0x04: used data size? */ + + /* .ymf: actual extension */ + if (!check_extensions(sf, "ymf")) + return NULL; + + /* .ymf can contain audio or video, but not both (videos start with 0x100 and change minor values), + * though it's are found in ./movie/... and probably are considered so */ + + loop_flag = 0; + channels = 2; + start_offset = read_u32be(0x00,sf); + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels, loop_flag); + if (!vgmstream) goto fail; + + vgmstream->meta_type = meta_YMF; + vgmstream->sample_rate = read_32bitBE(0xA8,sf); + vgmstream->num_samples = read_32bitBE(0xDC,sf); + + vgmstream->coding_type = coding_NGC_DSP; + vgmstream->layout_type = layout_interleave; + vgmstream->interleave_block_size = 0x20000; + + dsp_read_coefs_be(vgmstream, sf, 0xAE, 0x60); + //dsp_read_hist_be(vgmstream, sf, 0xAE + 0x20, 0x60); + + if (!vgmstream_open_stream(vgmstream, sf, start_offset)) + goto fail; + return vgmstream; + +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/meta/zsd.c b/Frameworks/vgmstream/vgmstream/src/meta/zsd.c index 245e49ef7..c83bee2bd 100644 --- a/Frameworks/vgmstream/vgmstream/src/meta/zsd.c +++ b/Frameworks/vgmstream/vgmstream/src/meta/zsd.c @@ -1,60 +1,44 @@ -#include "meta.h" -#include "../util.h" - -/* ZSD (Dragon Booster) */ -VGMSTREAM * init_vgmstream_zsd(STREAMFILE *streamFile) { - - VGMSTREAM * vgmstream = NULL; - char filename[PATH_LIMIT]; - off_t start_offset; - - int loop_flag; - int channel_count; - - /* check extension, case insensitive */ - streamFile->get_name(streamFile,filename,sizeof(filename)); - if (strcasecmp("zsd",filename_extension(filename))) goto fail; - - /* check header */ - if (read_32bitBE(0x00,streamFile) != 0x5A534400) goto fail; - - loop_flag = 0; - channel_count = 1; - - /* build the VGMSTREAM */ - vgmstream = allocate_vgmstream(channel_count,loop_flag); - if (!vgmstream) goto fail; - - /* fill in the vital statistics */ - start_offset = read_32bitLE(0x20,streamFile); - vgmstream->channels = channel_count; - vgmstream->sample_rate = read_32bitLE(0x10,streamFile); - vgmstream->coding_type = coding_PCM8; - vgmstream->num_samples = read_32bitLE(0x18,streamFile)/channel_count; - vgmstream->interleave_block_size=0x0; - - vgmstream->layout_type = layout_none; - vgmstream->meta_type = meta_ZSD; - - - /* open the file for reading */ - { - int i; - STREAMFILE * file; - file = streamFile->open(streamFile,filename,STREAMFILE_DEFAULT_BUFFER_SIZE); - if (!file) goto fail; - for (i=0;ich[i].streamfile = file; - vgmstream->ch[i].channel_start_offset= - vgmstream->ch[i].offset=start_offset+ - vgmstream->interleave_block_size*i; - } - } - - return vgmstream; - - /* clean up anything we may have opened */ -fail: - if (vgmstream) close_vgmstream(vgmstream); - return NULL; -} +#include "meta.h" +#include "../util.h" + +/* ZSD - from Dragon Booster (DS) */ +VGMSTREAM* init_vgmstream_zsd(STREAMFILE* sf) { + VGMSTREAM* vgmstream = NULL; + uint32_t start_offset; + int channels, loop_flag; + + /* checks */ + if (!is_id32be(0x00,sf, "ZSD\0")) + return NULL; + + /* .zsd: actual extension */ + if (!check_extensions(sf, "zsd")) + return NULL; + + /* 0x04: 0x1000? */ + /* 0x08: 0x0c? */ + /* 0x14: 0x08? */ + /* 0x1c: 0x1000? */ + channels = read_s32le(0x0c,sf); + + loop_flag = 0; + start_offset = read_s32le(0x20,sf); + + /* build the VGMSTREAM */ + vgmstream = allocate_vgmstream(channels, loop_flag); + if (!vgmstream) goto fail; + + vgmstream->meta_type = meta_ZSD; + vgmstream->sample_rate = read_s32le(0x10,sf); + vgmstream->num_samples = read_s32le(0x18,sf) / channels; + vgmstream->coding_type = coding_PCM8; + vgmstream->layout_type = layout_none; + + if (!vgmstream_open_stream(vgmstream, sf, start_offset)) + goto fail; + return vgmstream; + +fail: + close_vgmstream(vgmstream); + return NULL; +} diff --git a/Frameworks/vgmstream/vgmstream/src/streamfile.c b/Frameworks/vgmstream/vgmstream/src/streamfile.c index af1e5bef7..46697a34a 100644 --- a/Frameworks/vgmstream/vgmstream/src/streamfile.c +++ b/Frameworks/vgmstream/vgmstream/src/streamfile.c @@ -1,8 +1,8 @@ #include "streamfile.h" #include "util.h" #include "vgmstream.h" -#include "util/reader_sf.h" #include "util/paths.h" +#include "util/sf_utils.h" #include /* for dup/fdopen in some systems */ @@ -10,6 +10,17 @@ #include #endif +/* Enables a minor optimization when reopening file descriptors. + * Some systems/compilers have issues though, and dupe'd FILEs may fread garbage data in rare cases, + * possibly due to underlying buffers that get shared/thrashed by dup(). Seen for example in some .HPS and Ubi + * bigfiles (some later MSVC versions) or PS2 .RSD (Mac), where 2nd channel = 2nd SF reads garbage at some points. + * + * Keep it for other systems since this is (probably) kinda useful, though a more sensible approach would be + * redoing SF/FILE/buffer handling to avoid re-opening as much. */ +#if !defined (_MSC_VER) && !defined (__ANDROID__) && !defined (__APPLE__) + #define USE_STDIO_FDUP 1 +#endif + /* For (rarely needed) +2GB file support we use fseek64/ftell64. Those are usually available * but may depend on compiler. * - MSVC: +VS2008 should work @@ -137,13 +148,9 @@ static size_t stdio_read(STDIO_STREAMFILE* sf, uint8_t* dst, offv_t offset, size break; /* this shouldn't happen in our code */ } -#ifdef _MSC_VER - /* Workaround a bug that appears when compiling with MSVC (later versions). - * This bug is deterministic and seemingly appears randomly after seeking. - * It results in fread returning data from the wrong area of the file. - * HPS is one format that is almost always affected by this. - * May be related/same as stdio_open's fixed bug when using dup(), try disabling */ - fseek_v(sf->infile, ftell_v(sf->infile), SEEK_SET); +#if 0 + /* old workaround for USE_STDIO_FDUP bug, keep it here for a while as a reminder just in case */ + //fseek_v(sf->infile, ftell_v(sf->infile), SEEK_SET); #endif /* fill the buffer (offset now is beyond buf_offset) */ @@ -198,11 +205,8 @@ static STREAMFILE* stdio_open(STDIO_STREAMFILE* sf, const char* const filename, if (!filename) return NULL; -#if !defined (__ANDROID__) && !defined (_MSC_VER) - /* when enabling this for MSVC it'll seemingly work, but there are issues possibly related to underlying - * IO buffers when using dup(), noticeable by re-opening the same streamfile with small buffer sizes - * (reads garbage). fseek bug in line 81 may be related/same thing and may be removed. - * this reportedly this causes issues in Android too */ +#ifdef USE_STDIO_FDUP + /* minor optimization when reopening files, see comment in #define above */ /* if same name, duplicate the file descriptor we already have open */ if (sf->infile && !strcmp(sf->name,filename)) { @@ -980,92 +984,10 @@ STREAMFILE* open_multifile_streamfile_f(STREAMFILE** sfs, size_t sfs_size) { /* **************************************************** */ -/* change pathname's extension to another (or add it if extensionless) */ -static void swap_extension(char* pathname, /*size_t*/ int pathname_len, const char* swap) { - char* extension = (char*)filename_extension(pathname); - //todo safeops - if (extension[0] == '\0') { - strcat(pathname, "."); - strcat(pathname, swap); - } - else { - strcpy(extension, swap); - } -} - STREAMFILE* open_streamfile(STREAMFILE* sf, const char* pathname) { return sf->open(sf, pathname, STREAMFILE_DEFAULT_BUFFER_SIZE); } -STREAMFILE* open_streamfile_by_ext(STREAMFILE* sf, const char* ext) { - char filename[PATH_LIMIT]; - - get_streamfile_name(sf, filename, sizeof(filename)); - - swap_extension(filename, sizeof(filename), ext); - - return open_streamfile(sf, filename); -} - -STREAMFILE* open_streamfile_by_filename(STREAMFILE* sf, const char* filename) { - char fullname[PATH_LIMIT]; - char partname[PATH_LIMIT]; - char *path, *name, *otherpath; - - if (!sf || !filename || !filename[0]) return NULL; - - get_streamfile_name(sf, fullname, sizeof(fullname)); - - //todo normalize separators in a better way, safeops, improve copying - - /* check for non-normalized paths first (ex. txth) */ - path = strrchr(fullname, '/'); - otherpath = strrchr(fullname, '\\'); - if (otherpath > path) { //todo cast to ptr? - /* foobar makes paths like "(fake protocol)://(windows path with \)". - * Hack to work around both separators, though probably foo_streamfile - * should just return and handle normalized paths without protocol. */ - path = otherpath; - } - - if (path) { - path[1] = '\0'; /* remove name after separator */ - - strcpy(partname, filename); - fix_dir_separators(partname); /* normalize to DIR_SEPARATOR */ - - /* normalize relative paths as don't work ok in some plugins */ - if (partname[0] == '.' && partname[1] == DIR_SEPARATOR) { /* './name' */ - name = partname + 2; /* ignore './' */ - } - else if (partname[0] == '.' && partname[1] == '.' && partname[2] == DIR_SEPARATOR) { /* '../name' */ - char* pathprev; - - path[0] = '\0'; /* remove last separator so next call works */ - pathprev = strrchr(fullname,DIR_SEPARATOR); - if (pathprev) { - pathprev[1] = '\0'; /* remove prev dir after separator */ - name = partname + 3; /* ignore '../' */ - } - else { /* let plugin handle? */ - path[0] = DIR_SEPARATOR; - name = partname; - } - /* could work with more relative paths but whatevs */ - } - else { - name = partname; - } - - strcat(fullname, name); - } - else { - strcpy(fullname, filename); - } - - return open_streamfile(sf, fullname); -} - STREAMFILE* reopen_streamfile(STREAMFILE* sf, size_t buffer_size) { char pathname[PATH_LIMIT]; @@ -1079,111 +1001,6 @@ STREAMFILE* reopen_streamfile(STREAMFILE* sf, size_t buffer_size) { /* ************************************************************************* */ -int check_extensions(STREAMFILE* sf, const char* cmp_exts) { - char filename[PATH_LIMIT]; - const char* ext = NULL; - const char* cmp_ext = NULL; - const char* ststr_res = NULL; - size_t ext_len, cmp_len; - - sf->get_name(sf, filename, sizeof(filename)); - ext = filename_extension(filename); - ext_len = strlen(ext); - - cmp_ext = cmp_exts; - do { - ststr_res = strstr(cmp_ext, ","); - cmp_len = ststr_res == NULL - ? strlen(cmp_ext) /* total length if more not found */ - : (intptr_t)ststr_res - (intptr_t)cmp_ext; /* find next ext; ststr_res should always be greater than cmp_ext, resulting in a positive cmp_len */ - - if (ext_len == cmp_len && strncasecmp(ext,cmp_ext, ext_len) == 0) - return 1; - - cmp_ext = ststr_res; - if (cmp_ext != NULL) - cmp_ext = cmp_ext + 1; /* skip comma */ - - } while (cmp_ext != NULL); - - return 0; -} - -/* ************************************************************************* */ - -/* copies name as-is (may include full path included) */ -void get_streamfile_name(STREAMFILE* sf, char* buffer, size_t size) { - sf->get_name(sf, buffer, size); -} - -/* copies the filename without path */ -void get_streamfile_filename(STREAMFILE* sf, char* buffer, size_t size) { - char foldername[PATH_LIMIT]; - const char* path; - - - get_streamfile_name(sf, foldername, sizeof(foldername)); - - //todo Windows CMD accepts both \\ and /, better way to handle this? - path = strrchr(foldername,'\\'); - if (!path) - path = strrchr(foldername,'/'); - if (path != NULL) - path = path+1; - - //todo validate sizes and copy sensible max - if (path) { - strcpy(buffer, path); - } else { - strcpy(buffer, foldername); - } -} - -/* copies the filename without path or extension */ -void get_streamfile_basename(STREAMFILE* sf, char* buffer, size_t size) { - char* ext; - - get_streamfile_filename(sf, buffer, size); - - ext = strrchr(buffer,'.'); - if (ext) { - ext[0] = '\0'; /* remove .ext from buffer */ - } -} - -/* copies path removing name (NULL when if filename has no path) */ -void get_streamfile_path(STREAMFILE* sf, char* buffer, size_t size) { - const char* path; - - get_streamfile_name(sf, buffer, size); - - path = strrchr(buffer,DIR_SEPARATOR); - if (path!=NULL) path = path+1; /* includes "/" */ - - if (path) { - buffer[path - buffer] = '\0'; - } else { - buffer[0] = '\0'; - } -} - -/* copies extension only */ -void get_streamfile_ext(STREAMFILE* sf, char* buffer, size_t size) { - char filename[PATH_LIMIT]; - const char* extension = NULL; - - get_streamfile_name(sf, filename, sizeof(filename)); - extension = filename_extension(filename); - if (!extension) { - buffer[0] = '\n'; - } - else { - strncpy(buffer, extension, size); //todo use something better - } -} - -/* ************************************************************************* */ - /* debug util, mainly for custom IO testing */ void dump_streamfile(STREAMFILE* sf, int num) { #ifdef VGM_DEBUG_OUTPUT diff --git a/Frameworks/vgmstream/vgmstream/src/streamfile.h b/Frameworks/vgmstream/vgmstream/src/streamfile.h index 476372c34..d3e890918 100644 --- a/Frameworks/vgmstream/vgmstream/src/streamfile.h +++ b/Frameworks/vgmstream/vgmstream/src/streamfile.h @@ -130,15 +130,6 @@ STREAMFILE* open_multifile_streamfile_f(STREAMFILE** sfs, size_t sfs_size); * Just a wrapper, to avoid having to access the STREAMFILE's callbacks directly. */ STREAMFILE* open_streamfile(STREAMFILE* sf, const char* pathname); -/* Opens a STREAMFILE from a base pathname + new extension - * Can be used to get companion headers. */ -STREAMFILE* open_streamfile_by_ext(STREAMFILE* sf, const char* ext); - -/* Opens a STREAMFILE from a base path + new filename. - * Can be used to get companion files. Relative paths like - * './filename', '../filename', 'dir/filename' also work. */ -STREAMFILE* open_streamfile_by_filename(STREAMFILE* sf, const char* filename); - /* Reopen a STREAMFILE with a different buffer size, for fine-tuned bigfile parsing. * Uses default buffer size when buffer_size is 0 */ STREAMFILE* reopen_streamfile(STREAMFILE* sf, size_t buffer_size); @@ -161,18 +152,6 @@ static inline size_t get_streamfile_size(STREAMFILE* sf) { } -/* various STREAMFILE helpers functions */ - -/* Checks if the stream filename is one of the extensions (comma-separated, ex. "adx" or "adx,aix"). - * Empty is ok to accept files without extension ("", "adx,,aix"). Returns 0 on failure */ -int check_extensions(STREAMFILE* sf, const char* cmp_exts); - -/* filename helpers */ -void get_streamfile_name(STREAMFILE* sf, char* buf, size_t size); -void get_streamfile_filename(STREAMFILE* sf, char* buf, size_t size); -void get_streamfile_basename(STREAMFILE* sf, char* buf, size_t size); -void get_streamfile_path(STREAMFILE* sf, char* buf, size_t size); -void get_streamfile_ext(STREAMFILE* sf, char* buf, size_t size); - void dump_streamfile(STREAMFILE* sf, int num); + #endif diff --git a/Frameworks/vgmstream/vgmstream/src/util/companion_files.c b/Frameworks/vgmstream/vgmstream/src/util/companion_files.c index 253b18e3f..b126a49e3 100644 --- a/Frameworks/vgmstream/vgmstream/src/util/companion_files.c +++ b/Frameworks/vgmstream/vgmstream/src/util/companion_files.c @@ -1,7 +1,8 @@ #include "companion_files.h" #include "paths.h" #include "../vgmstream.h" -#include "../util/reader_text.h" +#include "reader_text.h" +#include "sf_utils.h" size_t read_key_file(uint8_t* buf, size_t buf_size, STREAMFILE* sf) { diff --git a/Frameworks/vgmstream/vgmstream/src/util/cri_utf.c b/Frameworks/vgmstream/vgmstream/src/util/cri_utf.c index 36fb74da6..f2c5672d7 100644 --- a/Frameworks/vgmstream/vgmstream/src/util/cri_utf.c +++ b/Frameworks/vgmstream/vgmstream/src/util/cri_utf.c @@ -245,14 +245,14 @@ void utf_close(utf_context* utf) { } -int utf_get_column(utf_context* utf, const char* column) { +int utf_get_column(utf_context* utf, const char* column_name) { int i; /* find target column */ for (i = 0; i < utf->columns; i++) { struct utf_column_t* col = &utf->schema[i]; - if (col->name == NULL || strcmp(col->name, column) != 0) + if (col->name == NULL || strcmp(col->name, column_name) != 0) continue; return i; } diff --git a/Frameworks/vgmstream/vgmstream/src/util/cri_utf.h b/Frameworks/vgmstream/vgmstream/src/util/cri_utf.h index 3f73afc3c..798e52351 100644 --- a/Frameworks/vgmstream/vgmstream/src/util/cri_utf.h +++ b/Frameworks/vgmstream/vgmstream/src/util/cri_utf.h @@ -24,7 +24,7 @@ typedef struct utf_context utf_context; utf_context* utf_open(STREAMFILE* sf, uint32_t table_offset, int* p_rows, const char** p_row_name); void utf_close(utf_context* utf); -int utf_get_column(utf_context* utf, const char* column); +int utf_get_column(utf_context* utf, const char* column_name); /* query calls (passing column index is faster, when you have to read lots of rows) */ int utf_query_col_s8(utf_context* utf, int row, int column, int8_t* value); diff --git a/Frameworks/vgmstream/vgmstream/src/util/endianness.h b/Frameworks/vgmstream/vgmstream/src/util/endianness.h index 762d63e1b..ef67ef055 100644 --- a/Frameworks/vgmstream/vgmstream/src/util/endianness.h +++ b/Frameworks/vgmstream/vgmstream/src/util/endianness.h @@ -3,6 +3,7 @@ #include "../streamfile.h" #include "reader_get.h" +#include "reader_sf.h" typedef uint32_t (*read_u32_t)(off_t, STREAMFILE*); typedef int32_t (*read_s32_t)(off_t, STREAMFILE*); @@ -25,4 +26,8 @@ static inline int guess_endian32(off_t offset, STREAMFILE* sf) { return get_u32le(buf) > get_u32be(buf) ? 1 : 0; } +static inline read_u32_t guess_read_u32(off_t offset, STREAMFILE* sf) { + return guess_endian32(0x08,sf) ? read_u32be : read_u32le; +} + #endif diff --git a/Frameworks/vgmstream/vgmstream/src/util/m2_psb.c b/Frameworks/vgmstream/vgmstream/src/util/m2_psb.c index d38dcd774..f8e272450 100644 --- a/Frameworks/vgmstream/vgmstream/src/util/m2_psb.c +++ b/Frameworks/vgmstream/vgmstream/src/util/m2_psb.c @@ -103,20 +103,20 @@ typedef struct { } list_t; struct psb_context_t { - uint32_t header_id; - uint16_t version; - uint16_t encrypt_value; - uint32_t encrypt_offset; - uint32_t keys_offset; + uint32_t header_id; + uint16_t version; + uint16_t encrypt_value; + uint32_t encrypt_offset; + uint32_t keys_offset; - uint32_t strings_list_offset; - uint32_t strings_data_offset; - uint32_t data_offsets_offset; - uint32_t data_sizes_offset; + uint32_t strings_list_offset; + uint32_t strings_data_offset; + uint32_t data_offsets_offset; + uint32_t data_sizes_offset; - uint32_t data_offset; /* also "resources" */ - uint32_t root_offset; /* initial node */ - uint32_t unknown; /* hash/crc? (v3) */ + uint32_t data_offset; /* also "resources" */ + uint32_t root_offset; /* initial node */ + uint32_t unknown; /* hash/crc? (v3) */ /* main buf and derived stuff */ uint8_t* buf; @@ -328,19 +328,19 @@ psb_context_t* psb_init(STREAMFILE* sf) { bytes = read_streamfile(header, 0x00, sizeof(header), sf); if (bytes != sizeof(header)) goto fail; - ctx->header_id = get_u32be(header + 0x00); - ctx->version = get_u16le(header + 0x04); - ctx->encrypt_value = get_u32le(header + 0x06); - ctx->encrypt_offset = get_u32le(header + 0x08); - ctx->keys_offset = get_u32le(header + 0x0c); + ctx->header_id = get_u32be(header + 0x00); + ctx->version = get_u16le(header + 0x04); + ctx->encrypt_value = get_u32le(header + 0x06); + ctx->encrypt_offset = get_u32le(header + 0x08); + ctx->keys_offset = get_u32le(header + 0x0c); - ctx->strings_list_offset = get_u32le(header + 0x10); - ctx->strings_data_offset = get_u32le(header + 0x14); - ctx->data_offsets_offset = get_u32le(header + 0x18); - ctx->data_sizes_offset = get_u32le(header + 0x1c); + ctx->strings_list_offset = get_u32le(header + 0x10); + ctx->strings_data_offset = get_u32le(header + 0x14); + ctx->data_offsets_offset = get_u32le(header + 0x18); + ctx->data_sizes_offset = get_u32le(header + 0x1c); - ctx->data_offset = get_u32le(header + 0x20); - ctx->root_offset = get_u32le(header + 0x24); + ctx->data_offset = get_u32le(header + 0x20); + ctx->root_offset = get_u32le(header + 0x24); if (ctx->version >= PSB_VERSION3) ctx->unknown = get_u32le(header + 0x28); diff --git a/Frameworks/vgmstream/vgmstream/src/util/sf_utils.c b/Frameworks/vgmstream/vgmstream/src/util/sf_utils.c new file mode 100644 index 000000000..d0cd061ec --- /dev/null +++ b/Frameworks/vgmstream/vgmstream/src/util/sf_utils.c @@ -0,0 +1,192 @@ +#include "sf_utils.h" +#include "../vgmstream.h" +#include "reader_sf.h" +#include "paths.h" + + +/* change pathname's extension to another (or add it if extensionless) */ +static void swap_extension(char* pathname, /*size_t*/ int pathname_len, const char* swap) { + char* extension = (char*)filename_extension(pathname); + //todo safeops + if (extension[0] == '\0') { + strcat(pathname, "."); + strcat(pathname, swap); + } + else { + strcpy(extension, swap); + } +} + +STREAMFILE* open_streamfile_by_ext(STREAMFILE* sf, const char* ext) { + char filename[PATH_LIMIT]; + + get_streamfile_name(sf, filename, sizeof(filename)); + + swap_extension(filename, sizeof(filename), ext); + + return open_streamfile(sf, filename); +} + +STREAMFILE* open_streamfile_by_filename(STREAMFILE* sf, const char* filename) { + char fullname[PATH_LIMIT]; + char partname[PATH_LIMIT]; + char *path, *name, *otherpath; + + if (!sf || !filename || !filename[0]) return NULL; + + get_streamfile_name(sf, fullname, sizeof(fullname)); + + //todo normalize separators in a better way, safeops, improve copying + + /* check for non-normalized paths first (ex. txth) */ + path = strrchr(fullname, '/'); + otherpath = strrchr(fullname, '\\'); + if (otherpath > path) { //todo cast to ptr? + /* foobar makes paths like "(fake protocol)://(windows path with \)". + * Hack to work around both separators, though probably foo_streamfile + * should just return and handle normalized paths without protocol. */ + path = otherpath; + } + + if (path) { + path[1] = '\0'; /* remove name after separator */ + + strcpy(partname, filename); + fix_dir_separators(partname); /* normalize to DIR_SEPARATOR */ + + /* normalize relative paths as don't work ok in some plugins */ + if (partname[0] == '.' && partname[1] == DIR_SEPARATOR) { /* './name' */ + name = partname + 2; /* ignore './' */ + } + else if (partname[0] == '.' && partname[1] == '.' && partname[2] == DIR_SEPARATOR) { /* '../name' */ + char* pathprev; + + path[0] = '\0'; /* remove last separator so next call works */ + pathprev = strrchr(fullname,DIR_SEPARATOR); + if (pathprev) { + pathprev[1] = '\0'; /* remove prev dir after separator */ + name = partname + 3; /* ignore '../' */ + } + else { /* let plugin handle? */ + path[0] = DIR_SEPARATOR; + name = partname; + } + /* could work with more relative paths but whatevs */ + } + else { + name = partname; + } + + strcat(fullname, name); + } + else { + strcpy(fullname, filename); + } + + return open_streamfile(sf, fullname); +} + +/* ************************************************************************* */ + +int check_extensions(STREAMFILE* sf, const char* cmp_exts) { + char filename[PATH_LIMIT]; + const char* ext = NULL; + const char* cmp_ext = NULL; + const char* ststr_res = NULL; + size_t ext_len, cmp_len; + + sf->get_name(sf, filename, sizeof(filename)); + ext = filename_extension(filename); + ext_len = strlen(ext); + + cmp_ext = cmp_exts; + do { + ststr_res = strstr(cmp_ext, ","); + cmp_len = ststr_res == NULL + ? strlen(cmp_ext) /* total length if more not found */ + : (intptr_t)ststr_res - (intptr_t)cmp_ext; /* find next ext; ststr_res should always be greater than cmp_ext, resulting in a positive cmp_len */ + + if (ext_len == cmp_len && strncasecmp(ext,cmp_ext, ext_len) == 0) + return 1; + + cmp_ext = ststr_res; + if (cmp_ext != NULL) + cmp_ext = cmp_ext + 1; /* skip comma */ + + } while (cmp_ext != NULL); + + return 0; +} + +/* ************************************************************************* */ + +/* copies name as-is (may include full path included) */ +void get_streamfile_name(STREAMFILE* sf, char* buffer, size_t size) { + sf->get_name(sf, buffer, size); +} + +/* copies the filename without path */ +void get_streamfile_filename(STREAMFILE* sf, char* buffer, size_t size) { + char foldername[PATH_LIMIT]; + const char* path; + + + get_streamfile_name(sf, foldername, sizeof(foldername)); + + //todo Windows CMD accepts both \\ and /, better way to handle this? + path = strrchr(foldername,'\\'); + if (!path) + path = strrchr(foldername,'/'); + if (path != NULL) + path = path+1; + + //todo validate sizes and copy sensible max + if (path) { + strcpy(buffer, path); + } else { + strcpy(buffer, foldername); + } +} + +/* copies the filename without path or extension */ +void get_streamfile_basename(STREAMFILE* sf, char* buffer, size_t size) { + char* ext; + + get_streamfile_filename(sf, buffer, size); + + ext = strrchr(buffer,'.'); + if (ext) { + ext[0] = '\0'; /* remove .ext from buffer */ + } +} + +/* copies path removing name (NULL when if filename has no path) */ +void get_streamfile_path(STREAMFILE* sf, char* buffer, size_t size) { + const char* path; + + get_streamfile_name(sf, buffer, size); + + path = strrchr(buffer,DIR_SEPARATOR); + if (path!=NULL) path = path+1; /* includes "/" */ + + if (path) { + buffer[path - buffer] = '\0'; + } else { + buffer[0] = '\0'; + } +} + +/* copies extension only */ +void get_streamfile_ext(STREAMFILE* sf, char* buffer, size_t size) { + char filename[PATH_LIMIT]; + const char* extension = NULL; + + get_streamfile_name(sf, filename, sizeof(filename)); + extension = filename_extension(filename); + if (!extension) { + buffer[0] = '\n'; + } + else { + strncpy(buffer, extension, size); //todo use something better + } +} diff --git a/Frameworks/vgmstream/vgmstream/src/util/sf_utils.h b/Frameworks/vgmstream/vgmstream/src/util/sf_utils.h new file mode 100644 index 000000000..c1260bfe5 --- /dev/null +++ b/Frameworks/vgmstream/vgmstream/src/util/sf_utils.h @@ -0,0 +1,29 @@ +#ifndef _SF_UTILS_H +#define _SF_UTILS_H +#include "../streamfile.h" + + + +/* Opens a STREAMFILE from a base pathname + new extension + * Can be used to get companion headers. */ +STREAMFILE* open_streamfile_by_ext(STREAMFILE* sf, const char* ext); + +/* Opens a STREAMFILE from a base path + new filename. + * Can be used to get companion files. Relative paths like + * './filename', '../filename', 'dir/filename' also work. */ +STREAMFILE* open_streamfile_by_filename(STREAMFILE* sf, const char* filename); + +/* various STREAMFILE helpers functions */ + +/* Checks if the stream filename is one of the extensions (comma-separated, ex. "adx" or "adx,aix"). + * Empty is ok to accept files without extension ("", "adx,,aix"). Returns 0 on failure */ +int check_extensions(STREAMFILE* sf, const char* cmp_exts); + +/* filename helpers */ +void get_streamfile_name(STREAMFILE* sf, char* buf, size_t size); +void get_streamfile_filename(STREAMFILE* sf, char* buf, size_t size); +void get_streamfile_basename(STREAMFILE* sf, char* buf, size_t size); +void get_streamfile_path(STREAMFILE* sf, char* buf, size_t size); +void get_streamfile_ext(STREAMFILE* sf, char* buf, size_t size); + +#endif diff --git a/Frameworks/vgmstream/vgmstream/src/vgmstream.c b/Frameworks/vgmstream/vgmstream/src/vgmstream.c index c9b8a3997..866e40a71 100644 --- a/Frameworks/vgmstream/vgmstream/src/vgmstream.c +++ b/Frameworks/vgmstream/vgmstream/src/vgmstream.c @@ -12,6 +12,7 @@ #include "base/decode.h" #include "base/render.h" #include "base/mixing.h" +#include "util/sf_utils.h" typedef VGMSTREAM* (*init_vgmstream_t)(STREAMFILE*); @@ -67,7 +68,6 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_svs, init_vgmstream_riff, init_vgmstream_rifx, - init_vgmstream_pos, init_vgmstream_nwa, init_vgmstream_ea_1snh, init_vgmstream_ea_eacs, @@ -79,19 +79,18 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_fsb, init_vgmstream_fsb4_wav, init_vgmstream_fsb5, - init_vgmstream_rwx, + init_vgmstream_rwax, init_vgmstream_xwb, init_vgmstream_ps2_xa30, init_vgmstream_musc, init_vgmstream_musx, - init_vgmstream_leg, init_vgmstream_filp, init_vgmstream_ikm, init_vgmstream_ster, init_vgmstream_bg00, init_vgmstream_sat_dvi, init_vgmstream_dc_kcey, - init_vgmstream_ps2_rstm, + init_vgmstream_rstm_rockstar, init_vgmstream_acm, init_vgmstream_mus_acm, init_vgmstream_ps2_kces, @@ -101,7 +100,7 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_ps2_rkv, init_vgmstream_ps2_vas, init_vgmstream_ps2_vas_container, - init_vgmstream_ps2_enth, + init_vgmstream_lp_ap_lep, init_vgmstream_sdt, init_vgmstream_aix, init_vgmstream_ngc_tydsp, @@ -116,17 +115,16 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_dc_str_v2, init_vgmstream_xmu, init_vgmstream_xvas, - init_vgmstream_ngc_bh2pcm, init_vgmstream_sat_sap, init_vgmstream_dc_idvi, init_vgmstream_ps2_rnd, init_vgmstream_idsp_tt, init_vgmstream_kraw, - init_vgmstream_ps2_omu, - init_vgmstream_ps2_xa2, + init_vgmstream_omu, + init_vgmstream_xa2_acclaim, init_vgmstream_idsp_nl, init_vgmstream_idsp_ie, - init_vgmstream_ngc_ymf, + init_vgmstream_ymf, init_vgmstream_sadl, init_vgmstream_fag, init_vgmstream_ps2_mihb, @@ -167,7 +165,6 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_swav, init_vgmstream_vsf, init_vgmstream_nds_rrds, - init_vgmstream_ps2_tk5, init_vgmstream_ps2_vsf_tta, init_vgmstream_ads_midway, init_vgmstream_ps2_mcg, @@ -178,7 +175,6 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_wii_wsd, init_vgmstream_dsp_ndp, init_vgmstream_ps2_sps, - init_vgmstream_ps2_xa2_rrp, init_vgmstream_nds_hwas, init_vgmstream_ngc_lps, init_vgmstream_ps2_snd, @@ -208,13 +204,12 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_ps2_wb, init_vgmstream_bnsf, init_vgmstream_ps2_gcm, - init_vgmstream_ps2_smpl, - init_vgmstream_ps2_msa, - init_vgmstream_ps2_voi, + init_vgmstream_smpl, + init_vgmstream_msa, + init_vgmstream_voi, init_vgmstream_ngc_rkv, init_vgmstream_dsp_ddsp, init_vgmstream_p3d, - init_vgmstream_ps2_tk1, init_vgmstream_ngc_dsp_mpds, init_vgmstream_dsp_str_ig, init_vgmstream_ea_swvr, @@ -223,7 +218,6 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_dsp_xiii, init_vgmstream_dsp_cabelas, init_vgmstream_lpcm_shade, - init_vgmstream_dsp_bdsp, init_vgmstream_ps2_vms, init_vgmstream_xau, init_vgmstream_bar, @@ -247,7 +241,7 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_xwav_old, init_vgmstream_hyperscan_kvag, init_vgmstream_ios_psnd, - init_vgmstream_adp_bos, + init_vgmstream_adp_wildfire, init_vgmstream_adp_qd, init_vgmstream_eb_sfx, init_vgmstream_eb_sf0, @@ -280,7 +274,7 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_svag_snk, init_vgmstream_ps2_vds_vdm, init_vgmstream_cxs, - init_vgmstream_dsp_adx, + init_vgmstream_adx_monster, init_vgmstream_akb, init_vgmstream_akb2, #ifdef VGM_USE_FFMPEG @@ -310,7 +304,7 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_ea_mpf_mus, init_vgmstream_ea_schl_fixed, init_vgmstream_sk_aud, - init_vgmstream_stm, + init_vgmstream_stma, init_vgmstream_ea_snu, init_vgmstream_awc, init_vgmstream_opus_std, @@ -339,11 +333,10 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_ea_tmx, init_vgmstream_ea_sbr, init_vgmstream_ea_sbr_harmony, - init_vgmstream_ngc_vid1, + init_vgmstream_vid1, init_vgmstream_flx, init_vgmstream_mogg, init_vgmstream_kma9, - init_vgmstream_fsb_encrypted, init_vgmstream_xwc, init_vgmstream_atsl, init_vgmstream_sps_n1, @@ -382,7 +375,6 @@ init_vgmstream_t init_vgmstream_functions[] = { init_vgmstream_hd3_bd3, init_vgmstream_bnk_sony, init_vgmstream_nus3bank, - init_vgmstream_nus3bank_encrypted, init_vgmstream_sscf, init_vgmstream_dsp_sps_n1, init_vgmstream_dsp_itl_ch, @@ -527,34 +519,39 @@ init_vgmstream_t init_vgmstream_functions[] = { 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, /* lower priority metas (no clean header identity, somewhat ambiguous, or need extension/companion file to identify) */ init_vgmstream_scd_pcm, init_vgmstream_agsc, - init_vgmstream_rsf, init_vgmstream_ps2_wmus, init_vgmstream_mib_mih, init_vgmstream_mjb_mjh, init_vgmstream_mic_koei, init_vgmstream_seb, - init_vgmstream_ps2_pnb, - init_vgmstream_sli_loops, init_vgmstream_tgc, + /* 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_s14_sss, /* .s14/sss raw siren14 */ - init_vgmstream_raw_al, /* .al/al2 raw A-LAW */ - init_vgmstream_ngc_ulw, /* .ulw raw u-Law */ + 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 */ @@ -1026,7 +1023,7 @@ static void try_dual_file_stereo(VGMSTREAM* opened_vgmstream, STREAMFILE* sf, in /* check these even if there is no loop, because they should then be zero in both * (Homura PS2 right channel doesn't have loop points so this check is ignored) */ - if (new_vgmstream->meta_type != meta_PS2_SMPL && + if (new_vgmstream->meta_type != meta_SMPL && !(new_vgmstream->loop_flag == opened_vgmstream->loop_flag && new_vgmstream->loop_start_sample== opened_vgmstream->loop_start_sample && new_vgmstream->loop_end_sample == opened_vgmstream->loop_end_sample)) { @@ -1124,6 +1121,9 @@ int vgmstream_open_stream_bf(VGMSTREAM* vgmstream, STREAMFILE* sf, off_t start_o goto fail; } + /* no need to open anything */ + if (vgmstream->coding_type == coding_SILENCE) + return 1; /* stream/offsets not needed, managed by layout */ if (vgmstream->layout_type == layout_segmented || @@ -1148,13 +1148,6 @@ int vgmstream_open_stream_bf(VGMSTREAM* vgmstream, STREAMFILE* sf, off_t start_o return 1; #endif - if ((vgmstream->coding_type == coding_PSX_cfg || - vgmstream->coding_type == coding_PSX_pivotal) && - (vgmstream->interleave_block_size == 0 || vgmstream->interleave_block_size > 0x50)) { - VGM_LOG("VGMSTREAM: PSX-cfg decoder with wrong frame size %x\n", vgmstream->interleave_block_size); - goto fail; - } - if ((vgmstream->coding_type == coding_CRI_ADX || vgmstream->coding_type == coding_CRI_ADX_enc_8 || vgmstream->coding_type == coding_CRI_ADX_enc_9 || @@ -1167,16 +1160,24 @@ int vgmstream_open_stream_bf(VGMSTREAM* vgmstream, STREAMFILE* sf, off_t start_o if ((vgmstream->coding_type == coding_MSADPCM || vgmstream->coding_type == coding_MSADPCM_ck || vgmstream->coding_type == coding_MSADPCM_int || - vgmstream->coding_type == coding_MS_IMA || vgmstream->coding_type == coding_MS_IMA_mono + vgmstream->coding_type == coding_MS_IMA || vgmstream->coding_type == coding_MS_IMA_mono || + vgmstream->coding_type == coding_PSX_cfg || vgmstream->coding_type == coding_PSX_pivotal ) && vgmstream->frame_size == 0) { vgmstream->frame_size = vgmstream->interleave_block_size; } + if ((vgmstream->coding_type == coding_PSX_cfg || + vgmstream->coding_type == coding_PSX_pivotal) && + (vgmstream->frame_size == 0 || vgmstream->frame_size > 0x50)) { + VGM_LOG("VGMSTREAM: PSX-cfg decoder with wrong frame size %x\n", vgmstream->frame_size); + goto fail; + } + if ((vgmstream->coding_type == coding_MSADPCM || vgmstream->coding_type == coding_MSADPCM_ck || vgmstream->coding_type == coding_MSADPCM_int) && - (vgmstream->frame_size > MSADPCM_MAX_BLOCK_SIZE)) { + (vgmstream->frame_size == 0 || vgmstream->frame_size > MSADPCM_MAX_BLOCK_SIZE)) { VGM_LOG("VGMSTREAM: MSADPCM decoder with wrong frame size %x\n", vgmstream->frame_size); goto fail; } diff --git a/Frameworks/vgmstream/vgmstream/src/vgmstream_types.h b/Frameworks/vgmstream/vgmstream/src/vgmstream_types.h index 22180fb44..028730216 100644 --- a/Frameworks/vgmstream/vgmstream/src/vgmstream_types.h +++ b/Frameworks/vgmstream/vgmstream/src/vgmstream_types.h @@ -212,7 +212,6 @@ typedef enum { layout_blocked_filp, layout_blocked_ea_swvr, layout_blocked_adm, - layout_blocked_bdsp, layout_blocked_mxch, layout_blocked_ivaud, /* GTA IV .ivaud blocks */ layout_blocked_ps2_iab, @@ -305,14 +304,13 @@ typedef enum { meta_PS_HEADERLESS, /* headerless PS-ADPCM */ meta_MIB_MIH, meta_PS2_MIC, /* KOEI MIC File */ - meta_PS2_VAGi, /* VAGi Interleaved File */ - meta_PS2_VAGp, /* VAGp Mono File */ - meta_PS2_pGAV, /* VAGp with Little Endian Header */ - meta_PS2_VAGp_AAAP, /* Acclaim Austin Audio VAG header */ + meta_VAG, + meta_VAG_custom, + meta_AAAP, meta_SEB, meta_STR_WAV, /* Blitz Games STR+WAV files */ meta_ILD, - meta_PS2_PNB, /* PsychoNauts Bgm File */ + meta_PWB, meta_VPK, /* VPK Audio File */ meta_PS2_BMDX, /* Beatmania thing */ meta_PS2_IVB, /* Langrisser 3 IVB */ @@ -328,17 +326,16 @@ typedef enum { meta_FSB3, /* FMOD Sample Bank, version 3.0/3.1 */ meta_FSB4, /* FMOD Sample Bank, version 4 */ meta_FSB5, /* FMOD Sample Bank, version 5 */ - meta_RWX, /* Air Force Delta Storm (XBOX) */ + meta_RWAX, meta_XWB, /* Microsoft XACT framework (Xbox, X360, Windows) */ meta_PS2_XA30, /* Driver - Parallel Lines (PS2) */ meta_MUSC, /* Krome PS2 games */ meta_MUSX, - meta_LEG, /* Legaia 2 [no header_id] */ meta_FILP, /* Resident Evil - Dead Aim */ meta_IKM, meta_STER, meta_BG00, /* Ibara, Mushihimesama */ - meta_PS2_RSTM, /* Midnight Club 3 */ + meta_RSTM_ROCKSTAR, meta_PS2_KCES, /* Dance Dance Revolution */ meta_HXD, meta_VSV, @@ -346,17 +343,16 @@ typedef enum { meta_PS2_PCM, /* Konami KCEJ East: Ephemeral Fantasia, Yu-Gi-Oh! The Duelists of the Roses, 7 Blades */ meta_PS2_RKV, /* Legacy of Kain - Blood Omen 2 (PS2) */ meta_PS2_VAS, /* Pro Baseball Spirits 5 */ - meta_PS2_ENTH, /* Enthusia */ + meta_LP_AP_LEP, meta_SDT, /* Baldur's Gate - Dark Alliance */ meta_NGC_TYDSP, /* Ty - The Tasmanian Tiger */ meta_DC_STR, /* SEGA Stream Asset Builder */ meta_DC_STR_V2, /* variant of SEGA Stream Asset Builder */ - meta_NGC_BH2PCM, /* Bio Hazard 2 */ meta_SAP, meta_DC_IDVI, /* Eldorado Gate */ meta_KRAW, /* Geometry Wars - Galaxies */ - meta_PS2_OMU, /* PS2 Int file with Header */ - meta_PS2_XA2, /* XG3 Extreme-G Racing */ + meta_OMU, + meta_XA2_ACCLAIM, meta_NUB, meta_IDSP_NL, /* Mario Strikers Charged (Wii) */ meta_IDSP_IE, /* Defencer (GC) */ @@ -369,7 +365,7 @@ typedef enum { meta_GCA, /* Metal Slug Anthology */ meta_NGC_SSM, /* Golden Gashbell Full Power */ meta_PS2_JOE, /* Wall-E / Pixar games */ - meta_NGC_YMF, /* WWE WrestleMania X8 */ + meta_YMF, meta_SADL, meta_FAG, /* Jackie Chan - Stuntmaster */ meta_PS2_MIHB, /* Merged MIH+MIB */ @@ -392,7 +388,6 @@ typedef enum { meta_PS2_VSF_TTA, /* Tiny Toon Adventures: Defenders of the Universe */ meta_ADS_MIDWAY, meta_PS2_SPS, /* Ape Escape 2 */ - meta_PS2_XA2_RRP, /* RC Revenge Pro */ meta_NGC_DSP_KONAMI, /* Konami DSP header, found in various games */ meta_UBI_CKD, /* Ubisoft CKD RIFF header (Rayman Origins Wii) */ meta_RAW_WAVM, @@ -410,8 +405,7 @@ typedef enum { meta_AIFC, /* Audio Interchange File Format AIFF-C */ meta_AIFF, /* Audio Interchange File Format */ meta_STR_SNDS, /* .str with SNDS blocks and SHDR header */ - meta_WS_AUD, /* Westwood Studios .aud */ - meta_WS_AUD_old, /* Westwood Studios .aud, old style */ + meta_WS_AUD, meta_RIFF_WAVE, /* RIFF, for WAVs */ meta_RIFF_WAVE_POS, /* .wav + .pos for looping (Ys Complete PC) */ meta_RIFF_WAVE_labl, /* RIFF w/ loop Markers in LIST-adtl-labl */ @@ -438,7 +432,6 @@ typedef enum { meta_PS2_P2BT, /* Pop'n'Music 7 Audio File */ meta_PS2_GBTS, /* Pop'n'Music 9 Audio File */ meta_NGC_DSP_IADP, /* Gamecube Interleave DSP */ - meta_PS2_TK5, /* Tekken 5 Stream Files */ meta_PS2_MCG, /* Gunvari MCG Files (was name .GCM on disk) */ meta_ZSD, /* Dragon Booster ZSD */ meta_REDSPARK, /* "RedSpark" RSD (MadWorld) */ @@ -466,11 +459,10 @@ typedef enum { meta_S14, /* raw Siren 14, 24kbit mono */ meta_SSS, /* raw Siren 14, 48kbit stereo */ meta_PS2_GCM, /* NamCollection */ - meta_PS2_SMPL, /* Homura */ - meta_PS2_MSA, /* Psyvariar -Complete Edition- */ - meta_PS2_VOI, /* RAW Danger (Zettaizetsumei Toshi 2 - Itetsuita Kiokutachi) [PS2] */ + meta_SMPL, + meta_MSA, + meta_VOI, meta_P3D, /* Prototype P3D */ - meta_PS2_TK1, /* Tekken (NamCollection) */ meta_NGC_RKV, /* Legacy of Kain - Blood Omen 2 (GC) */ meta_DSP_DDSP, /* Various (2 dsp files stuck together */ meta_NGC_DSP_MPDS, /* Big Air Freestyle, Terminator 3 */ @@ -482,7 +474,6 @@ typedef enum { meta_DSP_CABELAS, /* Cabelas games */ meta_PS2_ADM, /* Dragon Quest V (PS2) */ meta_LPCM_SHADE, - meta_DSP_BDSP, /* Ah! My Goddess */ meta_PS2_VMS, /* Autobahn Raser - Police Madness */ meta_XAU, /* XPEC Entertainment (Beat Down (PS2 Xbox), Spectral Force Chronicle (PS2)) */ meta_GH3_BAR, /* Guitar Hero III Mobile .bar */ @@ -508,13 +499,11 @@ typedef enum { meta_PS2_WMUS, /* The Warriors (PS2) */ meta_HYPERSCAN_KVAG, /* Hyperscan KVAG/BVG */ meta_IOS_PSND, /* Crash Bandicoot Nitro Kart 2 (iOS) */ - meta_BOS_ADP, + meta_ADP_WILDFIRE, meta_QD_ADP, meta_EB_SFX, /* Excitebots .sfx */ meta_EB_SF0, /* Excitebots .sf0 */ meta_MTAF, - meta_PS2_VAG1, /* Metal Gear Solid 3 VAG1 */ - meta_PS2_VAG2, /* Metal Gear Solid 3 VAG2 */ meta_ALP, meta_WPD, /* Shuffle! (PC) */ meta_MN_STR, /* Mini Ninjas (PC/PS3/WII) */ @@ -530,7 +519,7 @@ typedef enum { meta_KT_WIIBGM, /* Koei Tecmo WiiBGM */ meta_KTSS, /* Koei Tecmo Nintendo Stream (KNS) */ meta_MCA, /* Capcom MCA "MADP" */ - meta_XB3D_ADX, /* Xenoblade Chronicles 3D ADX */ + meta_ADX_MONSTER, meta_HCA, /* CRI HCA */ meta_SVAG_SNK, meta_PS2_VDS_VDM, /* Graffiti Kingdom */ @@ -549,18 +538,16 @@ typedef enum { meta_GHS, meta_AAC_TRIACE, meta_MTA2, - meta_NGC_ULW, /* Burnout 1 (GC only) */ meta_XA_XA30, meta_XA_04SW, meta_TXTH, /* generic text header */ meta_SK_AUD, /* Silicon Knights .AUD (Eternal Darkness GC) */ meta_AHX, - meta_STM, /* Angel Studios/Rockstar San Diego Games */ + meta_STMA, meta_BINK, /* RAD Game Tools BINK audio/video */ meta_EA_SNU, /* Electronic Arts SNU (Dead Space) */ meta_AWC, /* Rockstar AWC (GTA5, RDR) */ meta_OPUS, /* Nintendo Opus [Lego City Undercover (Switch)] */ - meta_RAW_AL, meta_PC_AST, /* Dead Rising (PC) */ meta_NAAC, /* Namco AAC (3DS) */ meta_UBI_SB, /* Ubisoft banks */ @@ -584,7 +571,7 @@ typedef enum { meta_WAF, /* KID WAF [Ever 17 (PC)] */ meta_WAVE, /* EngineBlack games [Mighty Switch Force! (3DS)] */ meta_WAVE_segmented, /* EngineBlack games, segmented [Shantae and the Pirate's Curse (PC)] */ - meta_SMV, /* Cho Aniki Zero (PSP) */ + meta_SMV, meta_NXAP, /* Nex Entertainment games [Time Crisis 4 (PS3), Time Crisis Razing Storm (PS3)] */ meta_EA_WVE_AU00, /* Electronic Arts PS movies [Future Cop - L.A.P.D. (PS), Supercross 2000 (PS)] */ meta_EA_WVE_AD10, /* Electronic Arts PS movies [Wing Commander 3/4 (PS)] */ @@ -712,6 +699,8 @@ typedef enum { meta_SNDZ, meta_VAB, meta_BIGRP, + meta_DIC1, + meta_AWD, } meta_t; diff --git a/Info.plist.template b/Info.plist.template index 2efb0cb92..d23a2bef7 100644 --- a/Info.plist.template +++ b/Info.plist.template @@ -391,7 +391,6 @@ al al2 ams - amts an2 ao ap @@ -417,6 +416,7 @@ awa awb awc + awd b1s baf baka @@ -425,14 +425,11 @@ bcstm bcwav bcv - bd3 - bdsp bfstm bfwav bg00 bgm bgw - bh2pcm bigrp bik bika @@ -485,6 +482,7 @@ ddsp de2 dec + dic diva dmsg ds2 @@ -533,7 +531,9 @@ h4m hab hca + hd3 hdr + hdt hgc1 his hps @@ -547,6 +547,8 @@ hxg hxx hwas + hwb + hwd iab iadp idmsf @@ -562,6 +564,7 @@ ilv ima imc + imf imx int is14 @@ -602,6 +605,7 @@ lasf lbin ldat + ldt leg lep lflac @@ -624,11 +628,12 @@ lpcm lpk lps - lrmb + lrmh lse lsf lstm lwav + lwd lwma mab mad @@ -695,6 +700,7 @@ ogv oma omu + opu opusx otm oto @@ -709,15 +715,14 @@ pcm pdt pk - pnb pona pos ps3 - ps2stm psb psf psh psnd + pwb r rac rad @@ -799,7 +804,6 @@ smc smk smp - smpl smv snb snd @@ -826,7 +830,6 @@ ster sth stm - stma str stream strm @@ -852,9 +855,9 @@ tgq tgv thp - tk5 tmx tra + trk tun txth txtp @@ -930,6 +933,7 @@ wua wv2 wv6 + wvd wve wvs wvx