Pack stream lengths to a .bin file so we don't have to open them all on startup

This commit is contained in:
Stefanos Kornilios Mitsis Poiitidis 2025-03-11 19:32:29 +02:00
parent 162de2aab4
commit 3ab8061980
10 changed files with 1574 additions and 1472 deletions

2
.gitignore vendored
View file

@ -378,6 +378,7 @@ liberty/animtool*
liberty/texconv* liberty/texconv*
liberty/imgtool* liberty/imgtool*
liberty/coltool* liberty/coltool*
liberty/streamheaderpack*
liberty/extract-sfx* liberty/extract-sfx*
liberty/pack-sfx* liberty/pack-sfx*
liberty/analyze-profile* liberty/analyze-profile*
@ -397,6 +398,7 @@ miami/animtool*
miami/texconv* miami/texconv*
miami/imgtool* miami/imgtool*
miami/coltool* miami/coltool*
miami/streamheaderpack*
miami/extract-sfx* miami/extract-sfx*
miami/pack-sfx* miami/pack-sfx*
miami/analyze-profile* miami/analyze-profile*

View file

@ -29,6 +29,7 @@ REPACK_IMG_DC_DIR?=$(REPACK_DIR)/img-dc
REPACK_SFX_ORIG_DIR?=$(REPACK_DIR)/sfx-orig REPACK_SFX_ORIG_DIR?=$(REPACK_DIR)/sfx-orig
REPACK_SFX_DC_DIR?=$(REPACK_DIR)/sfx-dc REPACK_SFX_DC_DIR?=$(REPACK_DIR)/sfx-dc
REPACK_STREAM_DECODED_DIR?=$(REPACK_DIR)/stream-decoded REPACK_STREAM_DECODED_DIR?=$(REPACK_DIR)/stream-decoded
REPACK_STREAM_DEST_DIR=$(REPACK_GTA_DIR)/stream
REPACK_CUTS_ORIG_DIR?=$(REPACK_DIR)/cuts-orig REPACK_CUTS_ORIG_DIR?=$(REPACK_DIR)/cuts-orig
REPACK_CUTS_DC_DIR?=$(REPACK_DIR)/cuts-dc REPACK_CUTS_DC_DIR?=$(REPACK_DIR)/cuts-dc
@ -299,6 +300,9 @@ animtool: ../src/tools/animtool.cpp
coltool: ../src/tools/coltool.cpp coltool: ../src/tools/coltool.cpp
$(CXX) -std=c++17 -o $@ -g -O0 $< $(CXX) -std=c++17 -o $@ -g -O0 $<
streamheaderpack: ../src/tools/streamheaderpack.cpp
$(CXX) -std=c++17 -o $@ -g -O0 $<
-include $(DEPS) -include $(DEPS)
#### Repacking #### #### Repacking ####
@ -380,8 +384,8 @@ LOOSE_FILES_DC = $(addprefix $(REPACK_GTA_DIR)/, $(MISC_FILES))
SFX_DC_DIR = $(REPACK_GTA_DIR)/sfx SFX_DC_DIR = $(REPACK_GTA_DIR)/sfx
SFX_DC_RAW = $(SFX_DC_DIR)/sfx_all.raw SFX_DC_RAW = $(SFX_DC_DIR)/sfx_all.raw
SFX_DC_DSC = $(SFX_DC_DIR)/sfx_all.dsc SFX_DC_DSC = $(SFX_DC_DIR)/sfx_all.dsc
STREAM_ADPCM_DC = $(addprefix $(REPACK_GTA_DIR)/stream/, $(STREAM_WAV:.wav=.APM)) \ STREAM_ADPCM_DC = $(addprefix $(REPACK_STREAM_DEST_DIR)/, $(STREAM_WAV:.wav=.APM)) \
$(addprefix $(REPACK_GTA_DIR)/stream/, $(STREAM_MP3:.mp3=.APM)) $(addprefix $(REPACK_STREAM_DEST_DIR)/, $(STREAM_MP3:.mp3=.APM))
IMG_TEXTURES_ORIG = $(addprefix $(REPACK_IMG_ORIG_DIR)/, $(IMG_TEXTURES)) IMG_TEXTURES_ORIG = $(addprefix $(REPACK_IMG_ORIG_DIR)/, $(IMG_TEXTURES))
IMG_MODELS_ORIG = $(addprefix $(REPACK_IMG_ORIG_DIR)/, $(IMG_MODELS)) IMG_MODELS_ORIG = $(addprefix $(REPACK_IMG_ORIG_DIR)/, $(IMG_MODELS))
@ -398,8 +402,10 @@ STREAM_WAV_DECODED = $(addprefix $(REPACK_STREAM_DECODED_DIR)/, $(STREAM_WAV))
.PRECIOUS: $(SFX_ORIG) $(SFX_REPACK_DC) $(STREAM_MP3_DECODED) $(STREAM_WAV_DECODED) .PRECIOUS: $(SFX_ORIG) $(SFX_REPACK_DC) $(STREAM_MP3_DECODED) $(STREAM_WAV_DECODED)
$(REPACK_DIR)/repacked: $(REPACK_GTA_DIR)/models/gta3.img $(REPACK_GTA_DIR)/models/gta3.dir $(LOOSE_FILES_DC) $(STREAM_ADPCM_DC) $(SFX_DC_RAW) $(SFX_DC_DSC) $(REPACK_DIR)/repacked: $(REPACK_GTA_DIR)/models/gta3.img $(REPACK_GTA_DIR)/models/gta3.dir $(LOOSE_FILES_DC) $(STREAM_ADPCM_DC) $(SFX_DC_RAW) $(SFX_DC_DSC) streamheaderpack
mkdir -p $(@D) mkdir -p $(@D)
# $(REPACK_GTA_DIR) needed as first argument as paths in the game prefix with stream/
./streamheaderpack liberty $(REPACK_GTA_DIR) $(REPACK_STREAM_DEST_DIR)/hdr.bin
@git archive --format zip --output "$(REPACK_GTA_DIR)/DCA3-$(GIT_VERSION).zip" HEAD @git archive --format zip --output "$(REPACK_GTA_DIR)/DCA3-$(GIT_VERSION).zip" HEAD
@touch $@ @touch $@
@echo && echo && echo "*** Repack Completed Successfully ($(PROJECT_NAME)) ***" && echo && echo @echo && echo && echo "*** Repack Completed Successfully ($(PROJECT_NAME)) ***" && echo && echo
@ -586,20 +592,20 @@ $(REPACK_SFX_DC_DIR)/%.pcm: $(REPACK_SFX_ORIG_DIR)/%.wav aud2adpcm
# stream processing # stream processing
# first try the mods loose directory # first try the mods loose directory
$(REPACK_GTA_DIR)/stream/%.APM: $(GTA_MOD_LOOSE_DIR)/audio/%.wav aud2adpcm $(REPACK_STREAM_DEST_DIR)/%.APM: $(GTA_MOD_LOOSE_DIR)/audio/%.wav aud2adpcm
@mkdir -p $(@D) @mkdir -p $(@D)
./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@
$(REPACK_GTA_DIR)/stream/%.APM: $(GTA_MOD_LOOSE_DIR)/audio/%.mp3 aud2adpcm $(REPACK_STREAM_DEST_DIR)/%.APM: $(GTA_MOD_LOOSE_DIR)/audio/%.mp3 aud2adpcm
@mkdir -p $(@D) @mkdir -p $(@D)
./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@
# then original folder # then original folder
$(REPACK_GTA_DIR)/stream/%.APM: $(GTA_DIR)/audio/%.wav aud2adpcm $(REPACK_STREAM_DEST_DIR)/%.APM: $(GTA_DIR)/audio/%.wav aud2adpcm
@mkdir -p $(@D) @mkdir -p $(@D)
./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@
$(REPACK_GTA_DIR)/stream/%.APM: $(GTA_DIR)/audio/%.mp3 aud2adpcm $(REPACK_STREAM_DEST_DIR)/%.APM: $(GTA_DIR)/audio/%.mp3 aud2adpcm
@mkdir -p $(@D) @mkdir -p $(@D)
./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@

View file

@ -29,6 +29,7 @@ REPACK_IMG_DC_DIR?=$(REPACK_DIR)/miami-img-dc
REPACK_SFX_ORIG_DIR?=$(REPACK_DIR)/miami-sfx-orig REPACK_SFX_ORIG_DIR?=$(REPACK_DIR)/miami-sfx-orig
REPACK_SFX_DC_DIR?=$(REPACK_DIR)/miami-sfx-dc REPACK_SFX_DC_DIR?=$(REPACK_DIR)/miami-sfx-dc
REPACK_STREAM_DECODED_DIR?=$(REPACK_DIR)/miami-stream-decoded REPACK_STREAM_DECODED_DIR?=$(REPACK_DIR)/miami-stream-decoded
REPACK_STREAM_DEST_DIR=$(REPACK_GTA_DIR)/stream
REPACK_CUTS_ORIG_DIR?=$(REPACK_DIR)/miami-cuts-orig REPACK_CUTS_ORIG_DIR?=$(REPACK_DIR)/miami-cuts-orig
REPACK_CUTS_DC_DIR?=$(REPACK_DIR)/miami-cuts-dc REPACK_CUTS_DC_DIR?=$(REPACK_DIR)/miami-cuts-dc
@ -305,6 +306,9 @@ animtool: ../src/tools/animtool.cpp
coltool: ../src/tools/coltool.cpp coltool: ../src/tools/coltool.cpp
$(CXX) -std=c++17 -o $@ -g -O0 $< $(CXX) -std=c++17 -o $@ -g -O0 $<
streamheaderpack: ../src/tools/streamheaderpack.cpp
$(CXX) -std=c++17 -o $@ -g -O0 $<
-include $(DEPS) -include $(DEPS)
#### Repacking #### #### Repacking ####
@ -371,9 +375,9 @@ LOOSE_FILES_DC = $(addprefix $(REPACK_GTA_DIR)/, $(MISC_FILES))
SFX_DC_DIR = $(REPACK_GTA_DIR)/sfx SFX_DC_DIR = $(REPACK_GTA_DIR)/sfx
SFX_DC_RAW = $(SFX_DC_DIR)/sfx_all.raw SFX_DC_RAW = $(SFX_DC_DIR)/sfx_all.raw
SFX_DC_DSC = $(SFX_DC_DIR)/sfx_all.dsc SFX_DC_DSC = $(SFX_DC_DIR)/sfx_all.dsc
STREAM_ADPCM_DC = $(addprefix $(REPACK_GTA_DIR)/stream/, $(STREAM_WAV:.wav=.APM)) \ STREAM_ADPCM_DC = $(addprefix $(REPACK_STREAM_DEST_DIR)/, $(STREAM_WAV:.wav=.APM)) \
$(addprefix $(REPACK_GTA_DIR)/stream/, $(STREAM_MP3:.mp3=.APM)) \ $(addprefix $(REPACK_STREAM_DEST_DIR)/, $(STREAM_MP3:.mp3=.APM)) \
$(addprefix $(REPACK_GTA_DIR)/stream/, $(STREAM_ADF:.adf=.APM)) $(addprefix $(REPACK_STREAM_DEST_DIR)/, $(STREAM_ADF:.adf=.APM))
IMG_TEXTURES_ORIG = $(addprefix $(REPACK_IMG_ORIG_DIR)/, $(IMG_TEXTURES)) IMG_TEXTURES_ORIG = $(addprefix $(REPACK_IMG_ORIG_DIR)/, $(IMG_TEXTURES))
IMG_MODELS_ORIG = $(addprefix $(REPACK_IMG_ORIG_DIR)/, $(IMG_MODELS)) IMG_MODELS_ORIG = $(addprefix $(REPACK_IMG_ORIG_DIR)/, $(IMG_MODELS))
@ -391,8 +395,10 @@ STREAM_ADF_DECODED = $(addprefix $(REPACK_STREAM_DECODED_DIR)/, $(STREAM_ADF:.ad
.PRECIOUS: $(SFX_ORIG) $(SFX_REPACK_DC) $(STREAM_ADF_DECODED) .PRECIOUS: $(SFX_ORIG) $(SFX_REPACK_DC) $(STREAM_ADF_DECODED)
$(REPACK_DIR)/repacked: $(REPACK_GTA_DIR)/models/gta3.img $(REPACK_GTA_DIR)/models/gta3.dir $(REPACK_GTA_DIR)/anim/cuts.img $(REPACK_GTA_DIR)/anim/cuts.dir $(LOOSE_FILES_DC) $(STREAM_ADPCM_DC) $(SFX_DC_RAW) $(SFX_DC_DSC) $(REPACK_DIR)/repacked: $(REPACK_GTA_DIR)/models/gta3.img $(REPACK_GTA_DIR)/models/gta3.dir $(REPACK_GTA_DIR)/anim/cuts.img $(REPACK_GTA_DIR)/anim/cuts.dir $(LOOSE_FILES_DC) $(STREAM_ADPCM_DC) $(SFX_DC_RAW) $(SFX_DC_DSC) streamheaderpack
mkdir -p $(@D) mkdir -p $(@D)
# $(REPACK_GTA_DIR) needed as first argument as paths in the game prefix with stream/
./streamheaderpack miami $(REPACK_GTA_DIR) $(REPACK_STREAM_DEST_DIR)/hdr.bin
@git archive --format zip --output "$(REPACK_GTA_DIR)/DCA3-$(GIT_VERSION).zip" HEAD @git archive --format zip --output "$(REPACK_GTA_DIR)/DCA3-$(GIT_VERSION).zip" HEAD
@touch $@ @touch $@
@echo && echo && echo "*** Repack Completed Successfully ($(PROJECT_NAME)) ***" && echo && echo @echo && echo && echo "*** Repack Completed Successfully ($(PROJECT_NAME)) ***" && echo && echo
@ -592,7 +598,7 @@ $(REPACK_SFX_DC_DIR)/%.pcm: $(REPACK_SFX_ORIG_DIR)/%.wav aud2adpcm
# stream processing # stream processing
# first try the mods loose directory # first try the mods loose directory
$(REPACK_GTA_DIR)/stream/%.APM: $(GTA_MOD_LOOSE_DIR)/Audio/%.wav aud2adpcm $(REPACK_STREAM_DEST_DIR)/%.APM: $(GTA_MOD_LOOSE_DIR)/Audio/%.wav aud2adpcm
@mkdir -p $(@D) @mkdir -p $(@D)
./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@
@ -600,16 +606,16 @@ $(REPACK_STREAM_DECODED_DIR)/%.mp3: $(GTA_MOD_LOOSE_DIR)/Audio/%.adf adf2mp3
@mkdir -p $(@D) @mkdir -p $(@D)
./adf2mp3 $< $@ ./adf2mp3 $< $@
$(REPACK_GTA_DIR)/stream/%.APM: $(GTA_MOD_LOOSE_DIR)/Audio/%.mp3 aud2adpcm $(REPACK_STREAM_DEST_DIR)/%.APM: $(GTA_MOD_LOOSE_DIR)/Audio/%.mp3 aud2adpcm
@mkdir -p $(@D) @mkdir -p $(@D)
./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@
$(REPACK_GTA_DIR)/stream/%.APM: $(REPACK_STREAM_DECODED_DIR)/%.mp3 aud2adpcm $(REPACK_STREAM_DEST_DIR)/%.APM: $(REPACK_STREAM_DECODED_DIR)/%.mp3 aud2adpcm
@mkdir -p $(@D) @mkdir -p $(@D)
./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@
# then original folder # then original folder
$(REPACK_GTA_DIR)/stream/%.APM: $(GTA_DIR)/Audio/%.wav aud2adpcm $(REPACK_STREAM_DEST_DIR)/%.APM: $(GTA_DIR)/Audio/%.wav aud2adpcm
@mkdir -p $(@D) @mkdir -p $(@D)
./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@
@ -617,11 +623,11 @@ $(REPACK_STREAM_DECODED_DIR)/%.mp3: $(GTA_DIR)/Audio/%.adf adf2mp3
@mkdir -p $(@D) @mkdir -p $(@D)
./adf2mp3 $< $@ ./adf2mp3 $< $@
$(REPACK_GTA_DIR)/stream/%.APM: $(GTA_DIR)/Audio/%.mp3 aud2adpcm $(REPACK_STREAM_DEST_DIR)/%.APM: $(GTA_DIR)/Audio/%.mp3 aud2adpcm
@mkdir -p $(@D) @mkdir -p $(@D)
./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@
$(REPACK_GTA_DIR)/stream/%.APM: $(REPACK_STREAM_DECODED_DIR)/%.mp3 aud2adpcm $(REPACK_STREAM_DEST_DIR)/%.APM: $(REPACK_STREAM_DECODED_DIR)/%.mp3 aud2adpcm
@mkdir -p $(@D) @mkdir -p $(@D)
./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@

View file

@ -478,6 +478,7 @@ static char PS2StreamedNameTable[][25]=
}; };
#endif #endif
#ifdef PC_AUDIO_PATHS
static char StreamedNameTable[][25] = static char StreamedNameTable[][25] =
{ {
"AUDIO\\HEAD.WAV", "AUDIO\\HEAD.WAV",
@ -677,204 +678,6 @@ static char StreamedNameTable[][25] =
"AUDIO\\k1_b.WAV", "AUDIO\\k1_b.WAV",
"AUDIO\\cat1.WAV" "AUDIO\\cat1.WAV"
}; };
#endif
static char DCStreamedNameTable[][25] =
{
"stream/HEAD.APM",
"stream/CLASS.APM",
"stream/KJAH.APM",
"stream/RISE.APM",
"stream/LIPS.APM",
"stream/GAME.APM",
"stream/MSX.APM",
"stream/FLASH.APM",
"stream/CHAT.APM",
"stream/HEAD.APM",
"stream/POLICE.APM",
"stream/CITY.APM",
"stream/WATER.APM",
"stream/COMOPEN.APM",
"stream/SUBOPEN.APM",
"stream/JB.APM",
"stream/BET.APM",
"stream/L1_LG.APM",
"stream/L2_DSB.APM",
"stream/L3_DM.APM",
"stream/L4_PAP.APM",
"stream/L5_TFB.APM",
"stream/J0_DM2.APM",
"stream/J1_LFL.APM",
"stream/J2_KCL.APM",
"stream/J3_VH.APM",
"stream/J4_ETH.APM",
"stream/J5_DST.APM",
"stream/J6_TBJ.APM",
"stream/T1_TOL.APM",
"stream/T2_TPU.APM",
"stream/T3_MAS.APM",
"stream/T4_TAT.APM",
"stream/T5_BF.APM",
"stream/S0_MAS.APM",
"stream/S1_PF.APM",
"stream/S2_CTG.APM",
"stream/S3_RTC.APM",
"stream/S5_LRQ.APM",
"stream/S4_BDBA.APM",
"stream/S4_BDBB.APM",
"stream/S2_CTG2.APM",
"stream/S4_BDBD.APM",
"stream/S5_LRQB.APM",
"stream/S5_LRQC.APM",
"stream/A1_SSO.APM",
"stream/A2_PP.APM",
"stream/A3_SS.APM",
"stream/A4_PDR.APM",
"stream/A5_K2FT.APM",
"stream/K1_KBO.APM",
"stream/K2_GIS.APM",
"stream/K3_DS.APM",
"stream/K4_SHI.APM",
"stream/K5_SD.APM",
"stream/R0_PDR2.APM",
"stream/R1_SW.APM",
"stream/R2_AP.APM",
"stream/R3_ED.APM",
"stream/R4_GF.APM",
"stream/R5_PB.APM",
"stream/R6_MM.APM",
"stream/D1_STOG.APM",
"stream/D2_KK.APM",
"stream/D3_ADO.APM",
"stream/D5_ES.APM",
"stream/D7_MLD.APM",
"stream/D4_GTA.APM",
"stream/D4_GTA2.APM",
"stream/D6_STS.APM",
"stream/A6_BAIT.APM",
"stream/A7_ETG.APM",
"stream/A8_PS.APM",
"stream/A9_ASD.APM",
"stream/K4_SHI2.APM",
"stream/C1_TEX.APM",
"stream/EL_PH1.APM",
"stream/EL_PH2.APM",
"stream/EL_PH3.APM",
"stream/EL_PH4.APM",
"stream/YD_PH1.APM",
"stream/YD_PH2.APM",
"stream/YD_PH3.APM",
"stream/YD_PH4.APM",
"stream/HD_PH1.APM",
"stream/HD_PH2.APM",
"stream/HD_PH3.APM",
"stream/HD_PH4.APM",
"stream/HD_PH5.APM",
"stream/MT_PH1.APM",
"stream/MT_PH2.APM",
"stream/MT_PH3.APM",
"stream/MT_PH4.APM",
"stream/MISCOM.APM",
"stream/END.APM",
"stream/lib_a1.APM",
"stream/lib_a2.APM",
"stream/lib_a.APM",
"stream/lib_b.APM",
"stream/lib_c.APM",
"stream/lib_d.APM",
"stream/l2_a.APM",
"stream/j4t_1.APM",
"stream/j4t_2.APM",
"stream/j4t_3.APM",
"stream/j4t_4.APM",
"stream/j4_a.APM",
"stream/j4_b.APM",
"stream/j4_c.APM",
"stream/j4_d.APM",
"stream/j4_e.APM",
"stream/j4_f.APM",
"stream/j6_1.APM",
"stream/j6_a.APM",
"stream/j6_b.APM",
"stream/j6_c.APM",
"stream/j6_d.APM",
"stream/t4_a.APM",
"stream/s1_a.APM",
"stream/s1_a1.APM",
"stream/s1_b.APM",
"stream/s1_c.APM",
"stream/s1_c1.APM",
"stream/s1_d.APM",
"stream/s1_e.APM",
"stream/s1_f.APM",
"stream/s1_g.APM",
"stream/s1_h.APM",
"stream/s1_i.APM",
"stream/s1_j.APM",
"stream/s1_k.APM",
"stream/s1_l.APM",
"stream/s3_a.APM",
"stream/s3_b.APM",
"stream/el3_a.APM",
"stream/mf1_a.APM",
"stream/mf2_a.APM",
"stream/mf3_a.APM",
"stream/mf3_b.APM",
"stream/mf3_b1.APM",
"stream/mf3_c.APM",
"stream/mf4_a.APM",
"stream/mf4_b.APM",
"stream/mf4_c.APM",
"stream/a1_a.APM",
"stream/a3_a.APM",
"stream/a5_a.APM",
"stream/a4_a.APM",
"stream/a4_b.APM",
"stream/a4_c.APM",
"stream/a4_d.APM",
"stream/k1_a.APM",
"stream/k3_a.APM",
"stream/r1_a.APM",
"stream/r2_a.APM",
"stream/r2_b.APM",
"stream/r2_c.APM",
"stream/r2_d.APM",
"stream/r2_e.APM",
"stream/r2_f.APM",
"stream/r2_g.APM",
"stream/r2_h.APM",
"stream/r5_a.APM",
"stream/r6_a.APM",
"stream/r6_a1.APM",
"stream/r6_b.APM",
"stream/lo2_a.APM",
"stream/lo6_a.APM",
"stream/yd2_a.APM",
"stream/yd2_b.APM",
"stream/yd2_c.APM",
"stream/yd2_c1.APM",
"stream/yd2_d.APM",
"stream/yd2_e.APM",
"stream/yd2_f.APM",
"stream/yd2_g.APM",
"stream/yd2_h.APM",
"stream/yd2_ass.APM",
"stream/yd2_ok.APM",
"stream/h5_a.APM",
"stream/h5_b.APM",
"stream/h5_c.APM",
"stream/ammu_a.APM",
"stream/ammu_b.APM",
"stream/ammu_c.APM",
"stream/door_1.APM",
"stream/door_2.APM",
"stream/door_3.APM",
"stream/door_4.APM",
"stream/door_5.APM",
"stream/door_6.APM",
"stream/t3_a.APM",
"stream/t3_b.APM",
"stream/t3_c.APM",
"stream/k1_b.APM",
"stream/cat1.APM"
};
#endif #endif

View file

@ -15,6 +15,7 @@
#define debugf(...) // dbglog(DBG_CRITICAL, __VA_ARGS__) #define debugf(...) // dbglog(DBG_CRITICAL, __VA_ARGS__)
#include "sampman.h" #include "sampman.h"
#include "sampman_dc_streams.h"
#include "AudioManager.h" #include "AudioManager.h"
#include "MusicManager.h" #include "MusicManager.h"
#include "Frontend.h" #include "Frontend.h"
@ -172,6 +173,8 @@ file_t fdPedSfx;
volatile uint32 nPedSfxReqReadId = 1; volatile uint32 nPedSfxReqReadId = 1;
volatile uint32 nPedSfxReqNextId = 1; volatile uint32 nPedSfxReqNextId = 1;
static int32 DCStreamedLength[TOTAL_STREAMED_SOUNDS];
struct WavHeader { struct WavHeader {
// RIFF Header // RIFF Header
char riff[4]; // RIFF Header Magic header char riff[4]; // RIFF Header Magic header
@ -461,6 +464,12 @@ cSampleManager::Initialise(void)
assert(fdPedSfx >= 0); assert(fdPedSfx >= 0);
file_t fd = fs_open("stream/hdr.bin", O_RDONLY);
assert(fd >= 0);
static_assert(sizeof(DCStreamedLength) == TOTAL_STREAMED_SOUNDS*sizeof(int32));
assert(fs_read(fd, DCStreamedLength, sizeof(DCStreamedLength)) == sizeof(DCStreamedLength));
fs_close(fd);
_bSampmanInitialised = true; _bSampmanInitialised = true;
return TRUE; return TRUE;
} }
@ -1212,21 +1221,10 @@ int32
cSampleManager::GetStreamedFileLength(uint8 nFile) cSampleManager::GetStreamedFileLength(uint8 nFile)
{ {
ASSERT( nFile < TOTAL_STREAMED_SOUNDS ); ASSERT( nFile < TOTAL_STREAMED_SOUNDS );
int32 rv = 1; // Look in MusicManager.cpp:268 auto rv = DCStreamedLength[nFile];
file_t fd = fs_open(DCStreamedNameTable[nFile], O_RDONLY);
assert(fd >= 0);
WavHeader hdr;
assert(fs_read(fd, &hdr, sizeof(hdr)) == sizeof(hdr));
uint64_t rv64 = (uint64_t)hdr.dataSize * 2000 / hdr.numOfChan / hdr.samplesPerSec;
assert(rv64 <= INT32_MAX);
rv = (int32)rv64;
fs_close(fd);
debugf("GetStreamedFileLength: %d %d\n", nFile, rv); debugf("GetStreamedFileLength: %d %d\n", nFile, rv);
return rv <= 0 ? 1 : rv; return rv;
} }
bool8 bool8

View file

@ -0,0 +1,200 @@
static char DCStreamedNameTable[][25] =
{
"stream/HEAD.APM",
"stream/CLASS.APM",
"stream/KJAH.APM",
"stream/RISE.APM",
"stream/LIPS.APM",
"stream/GAME.APM",
"stream/MSX.APM",
"stream/FLASH.APM",
"stream/CHAT.APM",
"stream/HEAD.APM",
"stream/POLICE.APM",
"stream/CITY.APM",
"stream/WATER.APM",
"stream/COMOPEN.APM",
"stream/SUBOPEN.APM",
"stream/JB.APM",
"stream/BET.APM",
"stream/L1_LG.APM",
"stream/L2_DSB.APM",
"stream/L3_DM.APM",
"stream/L4_PAP.APM",
"stream/L5_TFB.APM",
"stream/J0_DM2.APM",
"stream/J1_LFL.APM",
"stream/J2_KCL.APM",
"stream/J3_VH.APM",
"stream/J4_ETH.APM",
"stream/J5_DST.APM",
"stream/J6_TBJ.APM",
"stream/T1_TOL.APM",
"stream/T2_TPU.APM",
"stream/T3_MAS.APM",
"stream/T4_TAT.APM",
"stream/T5_BF.APM",
"stream/S0_MAS.APM",
"stream/S1_PF.APM",
"stream/S2_CTG.APM",
"stream/S3_RTC.APM",
"stream/S5_LRQ.APM",
"stream/S4_BDBA.APM",
"stream/S4_BDBB.APM",
"stream/S2_CTG2.APM",
"stream/S4_BDBD.APM",
"stream/S5_LRQB.APM",
"stream/S5_LRQC.APM",
"stream/A1_SSO.APM",
"stream/A2_PP.APM",
"stream/A3_SS.APM",
"stream/A4_PDR.APM",
"stream/A5_K2FT.APM",
"stream/K1_KBO.APM",
"stream/K2_GIS.APM",
"stream/K3_DS.APM",
"stream/K4_SHI.APM",
"stream/K5_SD.APM",
"stream/R0_PDR2.APM",
"stream/R1_SW.APM",
"stream/R2_AP.APM",
"stream/R3_ED.APM",
"stream/R4_GF.APM",
"stream/R5_PB.APM",
"stream/R6_MM.APM",
"stream/D1_STOG.APM",
"stream/D2_KK.APM",
"stream/D3_ADO.APM",
"stream/D5_ES.APM",
"stream/D7_MLD.APM",
"stream/D4_GTA.APM",
"stream/D4_GTA2.APM",
"stream/D6_STS.APM",
"stream/A6_BAIT.APM",
"stream/A7_ETG.APM",
"stream/A8_PS.APM",
"stream/A9_ASD.APM",
"stream/K4_SHI2.APM",
"stream/C1_TEX.APM",
"stream/EL_PH1.APM",
"stream/EL_PH2.APM",
"stream/EL_PH3.APM",
"stream/EL_PH4.APM",
"stream/YD_PH1.APM",
"stream/YD_PH2.APM",
"stream/YD_PH3.APM",
"stream/YD_PH4.APM",
"stream/HD_PH1.APM",
"stream/HD_PH2.APM",
"stream/HD_PH3.APM",
"stream/HD_PH4.APM",
"stream/HD_PH5.APM",
"stream/MT_PH1.APM",
"stream/MT_PH2.APM",
"stream/MT_PH3.APM",
"stream/MT_PH4.APM",
"stream/MISCOM.APM",
"stream/END.APM",
"stream/lib_a1.APM",
"stream/lib_a2.APM",
"stream/lib_a.APM",
"stream/lib_b.APM",
"stream/lib_c.APM",
"stream/lib_d.APM",
"stream/l2_a.APM",
"stream/j4t_1.APM",
"stream/j4t_2.APM",
"stream/j4t_3.APM",
"stream/j4t_4.APM",
"stream/j4_a.APM",
"stream/j4_b.APM",
"stream/j4_c.APM",
"stream/j4_d.APM",
"stream/j4_e.APM",
"stream/j4_f.APM",
"stream/j6_1.APM",
"stream/j6_a.APM",
"stream/j6_b.APM",
"stream/j6_c.APM",
"stream/j6_d.APM",
"stream/t4_a.APM",
"stream/s1_a.APM",
"stream/s1_a1.APM",
"stream/s1_b.APM",
"stream/s1_c.APM",
"stream/s1_c1.APM",
"stream/s1_d.APM",
"stream/s1_e.APM",
"stream/s1_f.APM",
"stream/s1_g.APM",
"stream/s1_h.APM",
"stream/s1_i.APM",
"stream/s1_j.APM",
"stream/s1_k.APM",
"stream/s1_l.APM",
"stream/s3_a.APM",
"stream/s3_b.APM",
"stream/el3_a.APM",
"stream/mf1_a.APM",
"stream/mf2_a.APM",
"stream/mf3_a.APM",
"stream/mf3_b.APM",
"stream/mf3_b1.APM",
"stream/mf3_c.APM",
"stream/mf4_a.APM",
"stream/mf4_b.APM",
"stream/mf4_c.APM",
"stream/a1_a.APM",
"stream/a3_a.APM",
"stream/a5_a.APM",
"stream/a4_a.APM",
"stream/a4_b.APM",
"stream/a4_c.APM",
"stream/a4_d.APM",
"stream/k1_a.APM",
"stream/k3_a.APM",
"stream/r1_a.APM",
"stream/r2_a.APM",
"stream/r2_b.APM",
"stream/r2_c.APM",
"stream/r2_d.APM",
"stream/r2_e.APM",
"stream/r2_f.APM",
"stream/r2_g.APM",
"stream/r2_h.APM",
"stream/r5_a.APM",
"stream/r6_a.APM",
"stream/r6_a1.APM",
"stream/r6_b.APM",
"stream/lo2_a.APM",
"stream/lo6_a.APM",
"stream/yd2_a.APM",
"stream/yd2_b.APM",
"stream/yd2_c.APM",
"stream/yd2_c1.APM",
"stream/yd2_d.APM",
"stream/yd2_e.APM",
"stream/yd2_f.APM",
"stream/yd2_g.APM",
"stream/yd2_h.APM",
"stream/yd2_ass.APM",
"stream/yd2_ok.APM",
"stream/h5_a.APM",
"stream/h5_b.APM",
"stream/h5_c.APM",
"stream/ammu_a.APM",
"stream/ammu_b.APM",
"stream/ammu_c.APM",
"stream/door_1.APM",
"stream/door_2.APM",
"stream/door_3.APM",
"stream/door_4.APM",
"stream/door_5.APM",
"stream/door_6.APM",
"stream/t3_a.APM",
"stream/t3_b.APM",
"stream/t3_c.APM",
"stream/k1_b.APM",
"stream/cat1.APM"
};

File diff suppressed because it is too large Load diff

View file

@ -15,6 +15,7 @@
#define debugf(...) // dbglog(DBG_CRITICAL, __VA_ARGS__) #define debugf(...) // dbglog(DBG_CRITICAL, __VA_ARGS__)
#include "sampman.h" #include "sampman.h"
#include "sampman_dc_streams.h"
#include "AudioManager.h" #include "AudioManager.h"
#include "MusicManager.h" #include "MusicManager.h"
#include "Frontend.h" #include "Frontend.h"
@ -469,20 +470,11 @@ cSampleManager::Initialise(void)
assert(fdPedSfx >= 0); assert(fdPedSfx >= 0);
for (unsigned nFile = 0; nFile < TOTAL_STREAMED_SOUNDS; nFile++) { file_t fd = fs_open("stream/hdr.bin", O_RDONLY);
file_t fd = fs_open(DCStreamedNameTable[nFile], O_RDONLY); assert(fd >= 0);
static_assert(sizeof(DCStreamedLength) == TOTAL_STREAMED_SOUNDS*sizeof(int32));
assert(fd >= 0); assert(fs_read(fd, DCStreamedLength, sizeof(DCStreamedLength)) == sizeof(DCStreamedLength));
WavHeader hdr; fs_close(fd);
assert(fs_read(fd, &hdr, sizeof(hdr)) == sizeof(hdr));
uint64_t rv64 = (uint64_t)hdr.dataSize * 2000 / hdr.numOfChan / hdr.samplesPerSec;
assert(rv64 <= INT32_MAX);
DCStreamedLength[nFile] = (int32)rv64;
fs_close(fd);
}
_bSampmanInitialised = true; _bSampmanInitialised = true;
return TRUE; return TRUE;

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,94 @@
#include <cstdint>
#include <iostream>
#include <cassert>
#include <string>
struct WavHeader {
// RIFF Header
char riff[4]; // RIFF Header Magic header
uint32_t chunkSize; // RIFF Chunk Size
char wave[4]; // WAVE Header
// "fmt" sub-chunk
char fmt[4]; // FMT header
uint32_t subchunk1Size; // Size of the fmt chunk
uint16_t audioFormat; // Audio format 1=PCM, other values indicate compression
uint16_t numOfChan; // Number of channels 1=Mono, 2=Stereo
uint32_t samplesPerSec; // Sampling Frequency in Hz
uint32_t bytesPerSec; // bytes per second
uint16_t blockAlign; // 2=16-bit mono, 4=16-bit stereo
uint16_t bitsPerSample; // Number of bits per sample
// "data" sub-chunk
char data[4]; // "data" string
uint32_t dataSize; // Size of the data section
};
#define DCStreamedNameTable DCStreamedNameTable_liberty
#include "../liberty/audio/sampman_dc_streams.h"
#undef DCStreamedNameTable
#define DCStreamedNameTable DCStreamedNameTable_miami
#include "../miami/audio/sampman_dc_streams.h"
#undef DCStreamedNameTable
int main(int argc, const char** argv) {
size_t table_len = 0;
const char (* table)[25] = nullptr;
if (argc != 4) {
std::cerr << "Usage: " << argv[0] << "liberty|miami <input_dir> <output_file>" << std::endl;
return 1;
}
if (strcmp(argv[1], "miami") == 0) {
table = DCStreamedNameTable_miami;
table_len = sizeof(DCStreamedNameTable_miami)/sizeof(DCStreamedNameTable_miami[0]);
} else if (strcmp(argv[1], "liberty") == 0) {
table = DCStreamedNameTable_liberty;
table_len = sizeof(DCStreamedNameTable_liberty)/sizeof(DCStreamedNameTable_liberty[0]);
} else {
std::cerr << "Invalid game name" << std::endl;
return 1;
}
FILE* fout=fopen(argv[3], "wb");
if (!fout) {
std::cerr << "Failed to open " << argv[3] << " for writing" << std::endl;
return 1;
}
for (int i = 0; i < table_len; i++) {
std::string filename = std::string(argv[2]) + "/" + table[i];
FILE* f = fopen(filename.c_str(), "rb");
if (!f) {
std::cerr << "Failed to open " << filename << std::endl;
fclose(fout);
return 1;
}
WavHeader hdr;
auto rv = fread(&hdr, sizeof(hdr), 1, f);
if (rv != 1) {
std::cerr << "Failed to read header from " << filename << std::endl;
fclose(f);
fclose(fout);
return 1;
}
uint64_t sl64 = (uint64_t)hdr.dataSize * 2000 / hdr.numOfChan / hdr.samplesPerSec;
assert(sl64 <= INT32_MAX);
int32_t sl32 = (int32_t)sl64;
rv = fwrite(&sl32, sizeof(sl32), 1, fout);
if (rv != 1) {
std::cerr << "Failed to write to " << argv[2] << std::endl;
fclose(f);
fclose(fout);
return 1;
}
fclose(f);
}
fclose(fout);
return 0;
}