Updated VGMStream to r1843-92-g740a4048

Signed-off-by: Christopher Snowhill <kode54@gmail.com>
This commit is contained in:
Christopher Snowhill 2023-06-30 23:17:55 -07:00
parent 270cf79bb7
commit 0be8dbe7c5
No known key found for this signature in database
92 changed files with 2351 additions and 2455 deletions

View file

@ -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 = "<group>"; };
8306B08220984517000302D4 /* yamaha_decoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yamaha_decoder.c; sourceTree = "<group>"; };
8306B08320984517000302D4 /* fadpcm_decoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fadpcm_decoder.c; sourceTree = "<group>"; };
8306B0872098454C000302D4 /* blocked_bdsp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = blocked_bdsp.c; sourceTree = "<group>"; };
8306B0882098454C000302D4 /* blocked_ast.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = blocked_ast.c; sourceTree = "<group>"; };
8306B0892098454D000302D4 /* segmented.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = segmented.c; sourceTree = "<group>"; };
8306B08A2098454D000302D4 /* blocked_ea_wve_au00.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = blocked_ea_wve_au00.c; sourceTree = "<group>"; };
@ -941,8 +937,6 @@
831BA6151EAC61A500CF89B0 /* cxs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cxs.c; sourceTree = "<group>"; };
831BA6171EAC61A500CF89B0 /* pasx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pasx.c; sourceTree = "<group>"; };
831BA6221EAC61CB00CF89B0 /* coding_utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = coding_utils.c; sourceTree = "<group>"; };
831BD11F1EEE1CF200198540 /* ngc_ulw.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = ngc_ulw.c; sourceTree = "<group>"; };
8322ECE6240268BA009E9429 /* raw_al.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = raw_al.c; sourceTree = "<group>"; };
8323894F1D2246C300482226 /* hca.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hca.c; sourceTree = "<group>"; };
832389511D224C0800482226 /* hca_decoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hca_decoder.c; sourceTree = "<group>"; };
83256BC7286662610036D9C0 /* libmpg123.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; path = libmpg123.0.dylib; sourceTree = "<group>"; };
@ -1081,7 +1075,6 @@
8349A8F81FE6257E00E26435 /* bar_streamfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bar_streamfile.h; sourceTree = "<group>"; };
8349A8F91FE6257E00E26435 /* vsf_tta.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vsf_tta.c; sourceTree = "<group>"; };
8349A8FB1FE6257F00E26435 /* omu.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = omu.c; sourceTree = "<group>"; };
8349A8FC1FE6257F00E26435 /* ps2_xa2_rrp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_xa2_rrp.c; sourceTree = "<group>"; };
8349A8FD1FE6257F00E26435 /* flx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = flx.c; sourceTree = "<group>"; };
8349A8FE1FE6257F00E26435 /* pc_adp_otns.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pc_adp_otns.c; sourceTree = "<group>"; };
8349A8FF1FE6258000E26435 /* ea_1snh.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ea_1snh.c; sourceTree = "<group>"; };
@ -1223,7 +1216,6 @@
836F6E4018BDC2180095E648 /* dc_kcey.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dc_kcey.c; sourceTree = "<group>"; };
836F6E4118BDC2180095E648 /* dc_str.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dc_str.c; sourceTree = "<group>"; };
836F6E4318BDC2180095E648 /* dmsg_segh.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dmsg_segh.c; sourceTree = "<group>"; };
836F6E4418BDC2180095E648 /* dsp_bdsp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dsp_bdsp.c; sourceTree = "<group>"; };
836F6E4618BDC2180095E648 /* ea_schl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ea_schl.c; sourceTree = "<group>"; };
836F6E4918BDC2180095E648 /* exakt_sc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = exakt_sc.c; sourceTree = "<group>"; };
836F6E4A18BDC2180095E648 /* excitebots.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = excitebots.c; sourceTree = "<group>"; };
@ -1256,7 +1248,6 @@
836F6E6918BDC2180095E648 /* nds_rrds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nds_rrds.c; sourceTree = "<group>"; };
836F6E6B18BDC2180095E648 /* nds_strm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nds_strm.c; sourceTree = "<group>"; };
836F6E6D18BDC2180095E648 /* ngc_adpdtk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_adpdtk.c; sourceTree = "<group>"; };
836F6E6E18BDC2180095E648 /* ngc_bh2pcm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_bh2pcm.c; sourceTree = "<group>"; };
836F6E7118BDC2180095E648 /* ngc_dsp_konami.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_dsp_konami.c; sourceTree = "<group>"; };
836F6E7218BDC2180095E648 /* ngc_dsp_mpds.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_dsp_mpds.c; sourceTree = "<group>"; };
836F6E7318BDC2180095E648 /* ngc_dsp_std.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_dsp_std.c; sourceTree = "<group>"; };
@ -1268,7 +1259,7 @@
836F6E7A18BDC2180095E648 /* ngc_sck_dsp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_sck_dsp.c; sourceTree = "<group>"; };
836F6E7B18BDC2180095E648 /* ngc_ssm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_ssm.c; sourceTree = "<group>"; };
836F6E7C18BDC2180095E648 /* ngc_tydsp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_tydsp.c; sourceTree = "<group>"; };
836F6E7E18BDC2180095E648 /* ngc_ymf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ngc_ymf.c; sourceTree = "<group>"; };
836F6E7E18BDC2180095E648 /* ymf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ymf.c; sourceTree = "<group>"; };
836F6E8118BDC2180095E648 /* nwa.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = nwa.c; sourceTree = "<group>"; };
836F6E8318BDC2180095E648 /* otm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = otm.c; sourceTree = "<group>"; };
836F6E8418BDC2180095E648 /* p3d.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = p3d.c; sourceTree = "<group>"; };
@ -1283,44 +1274,38 @@
836F6E9518BDC2180095E648 /* ps2_bg00.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_bg00.c; sourceTree = "<group>"; };
836F6E9618BDC2180095E648 /* ps2_bmdx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_bmdx.c; sourceTree = "<group>"; };
836F6E9818BDC2180095E648 /* hxd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hxd.c; sourceTree = "<group>"; };
836F6E9918BDC2180095E648 /* ps2_enth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_enth.c; sourceTree = "<group>"; };
836F6E9918BDC2180095E648 /* lp_ap_lep.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = lp_ap_lep.c; sourceTree = "<group>"; };
836F6E9B18BDC2180095E648 /* ps2_filp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_filp.c; sourceTree = "<group>"; };
836F6E9C18BDC2180095E648 /* ps2_gbts.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_gbts.c; sourceTree = "<group>"; };
836F6E9D18BDC2180095E648 /* ps2_gcm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_gcm.c; sourceTree = "<group>"; };
836F6E9E18BDC2180095E648 /* ps2_hgc1.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_hgc1.c; sourceTree = "<group>"; };
836F6E9F18BDC2180095E648 /* ps2_hsf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_hsf.c; sourceTree = "<group>"; };
836F6EA018BDC2180095E648 /* ps2_iab.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_iab.c; sourceTree = "<group>"; };
836F6EA218BDC2180095E648 /* ps2_ild.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_ild.c; sourceTree = "<group>"; };
836F6EA218BDC2180095E648 /* ild.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ild.c; sourceTree = "<group>"; };
836F6EA418BDC2180095E648 /* ps2_joe.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_joe.c; sourceTree = "<group>"; };
836F6EA618BDC2180095E648 /* ps2_kces.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_kces.c; sourceTree = "<group>"; };
836F6EA818BDC2180095E648 /* ps2_leg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_leg.c; sourceTree = "<group>"; };
836F6EAA18BDC2180095E648 /* ps2_mcg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_mcg.c; sourceTree = "<group>"; };
836F6EAC18BDC2180095E648 /* ps2_mic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_mic.c; sourceTree = "<group>"; };
836F6EAD18BDC2180095E648 /* ps2_mihb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_mihb.c; sourceTree = "<group>"; };
836F6EAE18BDC2180095E648 /* ps2_msa.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_msa.c; sourceTree = "<group>"; };
836F6EB218BDC2180095E648 /* ps2_p2bt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_p2bt.c; sourceTree = "<group>"; };
836F6EB318BDC2180095E648 /* ps2_pnb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_pnb.c; sourceTree = "<group>"; };
836F6EB618BDC2180095E648 /* ps2_rnd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_rnd.c; sourceTree = "<group>"; };
836F6EB718BDC2180095E648 /* ps2_rstm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_rstm.c; sourceTree = "<group>"; };
836F6EB818BDC2180095E648 /* rws.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rws.c; sourceTree = "<group>"; };
836F6EB818BDC2180095E648 /* rws_80d.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rws_80d.c; sourceTree = "<group>"; };
836F6EBA18BDC2180095E648 /* ster.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ster.c; sourceTree = "<group>"; };
836F6EBB18BDC2180095E648 /* ps2_sl3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_sl3.c; sourceTree = "<group>"; };
836F6EBC18BDC2180095E648 /* ps2_smpl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_smpl.c; sourceTree = "<group>"; };
836F6EBC18BDC2180095E648 /* smpl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = smpl.c; sourceTree = "<group>"; };
836F6EBD18BDC2180095E648 /* ps2_snd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_snd.c; sourceTree = "<group>"; };
836F6EBE18BDC2190095E648 /* spm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = spm.c; sourceTree = "<group>"; };
836F6EBF18BDC2190095E648 /* ps2_sps.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_sps.c; sourceTree = "<group>"; };
836F6EC518BDC2190095E648 /* ps2_tec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_tec.c; sourceTree = "<group>"; };
836F6EC618BDC2190095E648 /* ps2_tk5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_tk5.c; sourceTree = "<group>"; };
836F6EC818BDC2190095E648 /* ps2_vas.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_vas.c; sourceTree = "<group>"; };
836F6EC918BDC2190095E648 /* ps2_vbk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_vbk.c; sourceTree = "<group>"; };
836F6ECA18BDC2190095E648 /* vgs_ps.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vgs_ps.c; sourceTree = "<group>"; };
836F6ECB18BDC2190095E648 /* ps2_vgv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_vgv.c; sourceTree = "<group>"; };
836F6ECC18BDC2190095E648 /* ps2_vms.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_vms.c; sourceTree = "<group>"; };
836F6ECD18BDC2190095E648 /* ps2_voi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_voi.c; sourceTree = "<group>"; };
836F6ECD18BDC2190095E648 /* voi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = voi.c; sourceTree = "<group>"; };
836F6ECF18BDC2190095E648 /* ps2_wad.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_wad.c; sourceTree = "<group>"; };
836F6ED018BDC2190095E648 /* ps2_wb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_wb.c; sourceTree = "<group>"; };
836F6ED118BDC2190095E648 /* ps2_wmus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_wmus.c; sourceTree = "<group>"; };
836F6ED218BDC2190095E648 /* ps2_xa2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_xa2.c; sourceTree = "<group>"; };
836F6ED318BDC2190095E648 /* ps2_xa30.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps2_xa30.c; sourceTree = "<group>"; };
836F6ED918BDC2190095E648 /* ps3_past.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ps3_past.c; sourceTree = "<group>"; };
836F6EE218BDC2190095E648 /* redspark.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = redspark.c; sourceTree = "<group>"; };
@ -1328,10 +1313,10 @@
836F6EE418BDC2190095E648 /* rkv.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rkv.c; sourceTree = "<group>"; };
836F6EE518BDC2190095E648 /* rs03.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rs03.c; sourceTree = "<group>"; };
836F6EE618BDC2190095E648 /* rsd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rsd.c; sourceTree = "<group>"; };
836F6EE718BDC2190095E648 /* rsf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rsf.c; sourceTree = "<group>"; };
836F6EE718BDC2190095E648 /* raw_rsf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = raw_rsf.c; sourceTree = "<group>"; };
836F6EE818BDC2190095E648 /* rwsd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rwsd.c; sourceTree = "<group>"; };
836F6EE918BDC2190095E648 /* rwx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rwx.c; sourceTree = "<group>"; };
836F6EEA18BDC2190095E648 /* s14_sss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = s14_sss.c; sourceTree = "<group>"; };
836F6EE918BDC2190095E648 /* rwax.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rwax.c; sourceTree = "<group>"; };
836F6EEA18BDC2190095E648 /* raw_s14_sss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = raw_s14_sss.c; sourceTree = "<group>"; };
836F6EEB18BDC2190095E648 /* sat_baka.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sat_baka.c; sourceTree = "<group>"; };
836F6EEC18BDC2190095E648 /* sat_dvi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sat_dvi.c; sourceTree = "<group>"; };
836F6EED18BDC2190095E648 /* sat_sap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sat_sap.c; sourceTree = "<group>"; };
@ -1355,7 +1340,7 @@
836F6F0118BDC2190095E648 /* wii_mus.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wii_mus.c; sourceTree = "<group>"; };
836F6F0218BDC2190095E648 /* wii_ras.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wii_ras.c; sourceTree = "<group>"; };
836F6F0418BDC2190095E648 /* wii_sng.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wii_sng.c; sourceTree = "<group>"; };
836F6F0618BDC2190095E648 /* wii_sts.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wii_sts.c; sourceTree = "<group>"; };
836F6F0618BDC2190095E648 /* sts.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sts.c; sourceTree = "<group>"; };
836F6F0718BDC2190095E648 /* wpd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wpd.c; sourceTree = "<group>"; };
836F6F0818BDC2190095E648 /* ws_aud.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ws_aud.c; sourceTree = "<group>"; };
836F6F0918BDC2190095E648 /* wvs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wvs.c; sourceTree = "<group>"; };
@ -1481,7 +1466,7 @@
83A8BADC256679C5000F5F3F /* wady_decoder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wady_decoder.c; sourceTree = "<group>"; };
83A8BADE256679E3000F5F3F /* blocked_xwav.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = blocked_xwav.c; sourceTree = "<group>"; };
83A8BAE025667AA7000F5F3F /* wady.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = wady.c; sourceTree = "<group>"; };
83A8BAE125667AA7000F5F3F /* ps2_enth_streamfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ps2_enth_streamfile.h; sourceTree = "<group>"; };
83A8BAE125667AA7000F5F3F /* lp_ap_lep_streamfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lp_ap_lep_streamfile.h; sourceTree = "<group>"; };
83A8BAE225667AA7000F5F3F /* sdrh.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sdrh.c; sourceTree = "<group>"; };
83A8BAE325667AA7000F5F3F /* xwav.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xwav.c; sourceTree = "<group>"; };
83A8BAE425667AA7000F5F3F /* cpk.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cpk.c; sourceTree = "<group>"; };
@ -1493,7 +1478,7 @@
83AA5D1B1F6E2F7F0020821C /* blocked_awc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = blocked_awc.c; sourceTree = "<group>"; };
83AA5D201F6E2F9B0020821C /* awc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = awc.c; sourceTree = "<group>"; };
83AA5D211F6E2F9C0020821C /* hca_keys.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hca_keys.h; sourceTree = "<group>"; };
83AA5D231F6E2F9C0020821C /* stm.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stm.c; sourceTree = "<group>"; };
83AA5D231F6E2F9C0020821C /* stma.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = stma.c; sourceTree = "<group>"; };
83AA7D13279EBCF900087AA4 /* libavcodec.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavcodec.59.dylib; path = ../../ThirdParty/ffmpeg/lib/libavcodec.59.dylib; sourceTree = "<group>"; };
83AA7D14279EBCF900087AA4 /* libavformat.59.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libavformat.59.dylib; path = ../../ThirdParty/ffmpeg/lib/libavformat.59.dylib; sourceTree = "<group>"; };
83AA7D15279EBCF900087AA4 /* libswresample.4.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libswresample.4.dylib; path = ../../ThirdParty/ffmpeg/lib/libswresample.4.dylib; sourceTree = "<group>"; };
@ -1549,7 +1534,7 @@
83D20077248DDB770048BD24 /* mups.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mups.c; sourceTree = "<group>"; };
83D20078248DDB770048BD24 /* sadf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sadf.c; sourceTree = "<group>"; };
83D20079248DDB770048BD24 /* sadl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sadl.c; sourceTree = "<group>"; };
83D26A7626E66D98001A9475 /* adp_bos.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = adp_bos.c; sourceTree = "<group>"; };
83D26A7626E66D98001A9475 /* adp_wildfire.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = adp_wildfire.c; sourceTree = "<group>"; };
83D26A7D26E66DC2001A9475 /* log.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = log.c; sourceTree = "<group>"; };
83D26A7E26E66DC2001A9475 /* chunks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = chunks.h; sourceTree = "<group>"; };
83D26A7F26E66DC2001A9475 /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
@ -1582,6 +1567,15 @@
83F2CCE125A5B41600F46FA8 /* acx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = acx.c; sourceTree = "<group>"; };
83F5F8821908D0A400C8E65F /* fsb5.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fsb5.c; sourceTree = "<group>"; };
83FB238D27B14696003F3062 /* mpeg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mpeg.c; sourceTree = "<group>"; };
83FBB16E2A4FF4EC00CD0580 /* xa2_acclaim.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xa2_acclaim.c; sourceTree = "<group>"; };
83FBB16F2A4FF4EC00CD0580 /* ego_dic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ego_dic.c; sourceTree = "<group>"; };
83FBB1702A4FF4EC00CD0580 /* awd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = awd.c; sourceTree = "<group>"; };
83FBB1742A4FF59E00CD0580 /* pwb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pwb.c; sourceTree = "<group>"; };
83FBB1762A4FF71B00CD0580 /* rws_809.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rws_809.c; sourceTree = "<group>"; };
83FBB1772A4FF71B00CD0580 /* rstm_rockstar.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rstm_rockstar.c; sourceTree = "<group>"; };
83FBB17A2A4FF87200CD0580 /* sf_utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sf_utils.h; sourceTree = "<group>"; };
83FBB17B2A4FF87200CD0580 /* sf_utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sf_utils.c; sourceTree = "<group>"; };
83FBB17E2A4FF94C00CD0580 /* msa.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = msa.c; sourceTree = "<group>"; };
83FBD502235D31F700D35BCD /* riff_ogg_streamfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = riff_ogg_streamfile.h; sourceTree = "<group>"; };
83FC176A23AC58D100E1025F /* xma_ue3.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xma_ue3.c; sourceTree = "<group>"; };
83FC176B23AC58D100E1025F /* csb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = csb.c; sourceTree = "<group>"; };
@ -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 */,

View file

@ -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:

View file

@ -3,7 +3,7 @@
#include "../coding/coding.h"
#include "mixing.h"
#include "../util/channel_mappings.h"
#include "../util/sf_utils.h"
/*******************************************************************************/
/* TEXT */

View file

@ -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:

View file

@ -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;
}

View file

@ -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) {

View file

@ -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;

View file

@ -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;i<vgmstream->channels;i++) {
vgmstream->ch[i].channel_start_offset=
vgmstream->ch[i].offset=vgmstream->current_block_offset*i;
}
}

View file

@ -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);

View file

@ -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);

View file

@ -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;
}

View file

@ -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? */

View file

@ -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;
}

View file

@ -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 */
{

View file

@ -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;i<channel_count;i++) {
vgmstream->ch[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_offset<get_streamfile_size(streamFile));
block_update_bdsp(start_offset,vgmstream);
return vgmstream;
/* clean up anything we may have opened */
fail:
if (vgmstream) close_vgmstream(vgmstream);
return NULL;
}

View file

@ -294,10 +294,11 @@ VGMSTREAM* init_vgmstream_ea_bnk(STREAMFILE* sf) {
/* check extension */
/* .bnk: common
* .sdt: Harry Potter games
* .sdt: Harry Potter games, Burnout games (PSP)
* .hdt/ldt: Burnout games (PSP)
* .abk: GoldenEye - Rogue Agent
* .ast: FIFA 2004 (inside .big) */
if (!check_extensions(sf,"bnk,sdt,abk,ast"))
if (!check_extensions(sf,"bnk,sdt,hdt,ldt,abk,ast"))
goto fail;
if (target_stream == 0) target_stream = 1;

View file

@ -0,0 +1,161 @@
#include "meta.h"
#include "../coding/coding.h"
#include "../util/reader_text.h"
/* DIC1 - from Codemaster's Ego engine 'dictionaries' [DiRT (PC), F1 2011 (PC), Race Driver Grid (PC)] */
VGMSTREAM* init_vgmstream_ego_dic(STREAMFILE* sf) {
VGMSTREAM* vgmstream = NULL;
STREAMFILE* sb = NULL;
uint32_t stream_offset = 0, stream_size = 0, codec = 0;
int channels = 0, loop_flag = 0, sample_rate = 0;
/* checks */
if (!is_id32be(0x00, sf, "DIC1"))
return NULL;
if (!check_extensions(sf, "dic"))
return NULL;
/* 0x04: hash/info? */
/* 0x08: version ("0.46": DiRT, "2.00": DiRT 2+ (no diffs?) */
int containers = read_s32le(0x0c,sf);
int total_subsongs = 0;
int target_subsong = sf->stream_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;
}

View file

@ -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);

View file

@ -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)

View file

@ -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_*/

View file

@ -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;
}

View file

@ -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);

View file

@ -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) {

View file

@ -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;

View file

@ -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;

View file

@ -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*/

View file

@ -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;

View file

@ -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;
}

View file

@ -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;

View file

@ -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 */

View file

@ -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;i<channel_count;i++) {
vgmstream->ch[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;
}

View file

@ -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;

View file

@ -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;
}

View file

@ -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;i<channel_count;i++) {
vgmstream->ch[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;
}

View file

@ -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;

View file

@ -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;

View file

@ -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;

View file

@ -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;
}

View file

@ -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;i<channel_count;i++) {
vgmstream->ch[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;
}

View file

@ -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;
}

View file

@ -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;i<channel_count;i++) {
vgmstream->ch[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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;i<channel_count;i++) {
vgmstream->ch[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;
}

View file

@ -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;i<channel_count;i++) {
vgmstream->ch[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;
}

View file

@ -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;i<channel_count;i++) {
vgmstream->ch[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;
}

View file

@ -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;i<channel_count;i++) {
vgmstream->ch[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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;

View file

@ -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 */

View file

@ -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

View file

@ -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;

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;i<channel_count;i++) {
vgmstream->ch[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;
}

View file

@ -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

View file

@ -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;
}

View file

@ -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 */

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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);

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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;

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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) */
{

View file

@ -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;
}

View file

@ -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;i<channel_count;i++) {
vgmstream->ch[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;

View file

@ -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;
}

View file

@ -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) {

View file

@ -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 */

View file

@ -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;i<channel_count;i++) {
vgmstream->ch[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;
}

View file

@ -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;
}

View file

@ -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;i<channel_count;i++) {
vgmstream->ch[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;
}

View file

@ -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 <string.h>
/* for dup/fdopen in some systems */
@ -10,6 +10,17 @@
#include <unistd.h>
#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

View file

@ -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

View file

@ -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) {

View file

@ -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;
}

View file

@ -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);

View file

@ -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

View file

@ -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);

View file

@ -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
}
}

View file

@ -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

View file

@ -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;
}

View file

@ -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;

View file

@ -391,7 +391,6 @@
<string>al</string>
<string>al2</string>
<string>ams</string>
<string>amts</string>
<string>an2</string>
<string>ao</string>
<string>ap</string>
@ -417,6 +416,7 @@
<string>awa</string>
<string>awb</string>
<string>awc</string>
<string>awd</string>
<string>b1s</string>
<string>baf</string>
<string>baka</string>
@ -425,14 +425,11 @@
<string>bcstm</string>
<string>bcwav</string>
<string>bcv</string>
<string>bd3</string>
<string>bdsp</string>
<string>bfstm</string>
<string>bfwav</string>
<string>bg00</string>
<string>bgm</string>
<string>bgw</string>
<string>bh2pcm</string>
<string>bigrp</string>
<string>bik</string>
<string>bika</string>
@ -485,6 +482,7 @@
<string>ddsp</string>
<string>de2</string>
<string>dec</string>
<string>dic</string>
<string>diva</string>
<string>dmsg</string>
<string>ds2</string>
@ -533,7 +531,9 @@
<string>h4m</string>
<string>hab</string>
<string>hca</string>
<string>hd3</string>
<string>hdr</string>
<string>hdt</string>
<string>hgc1</string>
<string>his</string>
<string>hps</string>
@ -547,6 +547,8 @@
<string>hxg</string>
<string>hxx</string>
<string>hwas</string>
<string>hwb</string>
<string>hwd</string>
<string>iab</string>
<string>iadp</string>
<string>idmsf</string>
@ -562,6 +564,7 @@
<string>ilv</string>
<string>ima</string>
<string>imc</string>
<string>imf</string>
<string>imx</string>
<string>int</string>
<string>is14</string>
@ -602,6 +605,7 @@
<string>lasf</string>
<string>lbin</string>
<string>ldat</string>
<string>ldt</string>
<string>leg</string>
<string>lep</string>
<string>lflac</string>
@ -624,11 +628,12 @@
<string>lpcm</string>
<string>lpk</string>
<string>lps</string>
<string>lrmb</string>
<string>lrmh</string>
<string>lse</string>
<string>lsf</string>
<string>lstm</string>
<string>lwav</string>
<string>lwd</string>
<string>lwma</string>
<string>mab</string>
<string>mad</string>
@ -695,6 +700,7 @@
<string>ogv</string>
<string>oma</string>
<string>omu</string>
<string>opu</string>
<string>opusx</string>
<string>otm</string>
<string>oto</string>
@ -709,15 +715,14 @@
<string>pcm</string>
<string>pdt</string>
<string>pk</string>
<string>pnb</string>
<string>pona</string>
<string>pos</string>
<string>ps3</string>
<string>ps2stm</string>
<string>psb</string>
<string>psf</string>
<string>psh</string>
<string>psnd</string>
<string>pwb</string>
<string>r</string>
<string>rac</string>
<string>rad</string>
@ -799,7 +804,6 @@
<string>smc</string>
<string>smk</string>
<string>smp</string>
<string>smpl</string>
<string>smv</string>
<string>snb</string>
<string>snd</string>
@ -826,7 +830,6 @@
<string>ster</string>
<string>sth</string>
<string>stm</string>
<string>stma</string>
<string>str</string>
<string>stream</string>
<string>strm</string>
@ -852,9 +855,9 @@
<string>tgq</string>
<string>tgv</string>
<string>thp</string>
<string>tk5</string>
<string>tmx</string>
<string>tra</string>
<string>trk</string>
<string>tun</string>
<string>txth</string>
<string>txtp</string>
@ -930,6 +933,7 @@
<string>wua</string>
<string>wv2</string>
<string>wv6</string>
<string>wvd</string>
<string>wve</string>
<string>wvs</string>
<string>wvx</string>