From 3ab806198064978372b69f7c8cc2983fddbfd647 Mon Sep 17 00:00:00 2001 From: Stefanos Kornilios Mitsis Poiitidis Date: Tue, 11 Mar 2025 19:32:29 +0200 Subject: [PATCH] Pack stream lengths to a .bin file so we don't have to open them all on startup --- .gitignore | 2 + liberty/Makefile | 20 +- miami/Makefile | 26 +- src/liberty/audio/sampman.h | 201 +--- src/liberty/audio/sampman_dc.cpp | 24 +- src/liberty/audio/sampman_dc_streams.h | 200 ++++ src/miami/audio/sampman.h | 1231 +----------------------- src/miami/audio/sampman_dc.cpp | 20 +- src/miami/audio/sampman_dc_streams.h | 1228 +++++++++++++++++++++++ src/tools/streamheaderpack.cpp | 94 ++ 10 files changed, 1574 insertions(+), 1472 deletions(-) create mode 100644 src/liberty/audio/sampman_dc_streams.h create mode 100644 src/miami/audio/sampman_dc_streams.h create mode 100644 src/tools/streamheaderpack.cpp diff --git a/.gitignore b/.gitignore index 7514635d..32ef11d6 100644 --- a/.gitignore +++ b/.gitignore @@ -378,6 +378,7 @@ liberty/animtool* liberty/texconv* liberty/imgtool* liberty/coltool* +liberty/streamheaderpack* liberty/extract-sfx* liberty/pack-sfx* liberty/analyze-profile* @@ -397,6 +398,7 @@ miami/animtool* miami/texconv* miami/imgtool* miami/coltool* +miami/streamheaderpack* miami/extract-sfx* miami/pack-sfx* miami/analyze-profile* diff --git a/liberty/Makefile b/liberty/Makefile index 9fb805e4..719e19a7 100644 --- a/liberty/Makefile +++ b/liberty/Makefile @@ -29,6 +29,7 @@ REPACK_IMG_DC_DIR?=$(REPACK_DIR)/img-dc REPACK_SFX_ORIG_DIR?=$(REPACK_DIR)/sfx-orig REPACK_SFX_DC_DIR?=$(REPACK_DIR)/sfx-dc 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_DC_DIR?=$(REPACK_DIR)/cuts-dc @@ -299,6 +300,9 @@ animtool: ../src/tools/animtool.cpp coltool: ../src/tools/coltool.cpp $(CXX) -std=c++17 -o $@ -g -O0 $< +streamheaderpack: ../src/tools/streamheaderpack.cpp + $(CXX) -std=c++17 -o $@ -g -O0 $< + -include $(DEPS) #### Repacking #### @@ -380,8 +384,8 @@ LOOSE_FILES_DC = $(addprefix $(REPACK_GTA_DIR)/, $(MISC_FILES)) SFX_DC_DIR = $(REPACK_GTA_DIR)/sfx SFX_DC_RAW = $(SFX_DC_DIR)/sfx_all.raw SFX_DC_DSC = $(SFX_DC_DIR)/sfx_all.dsc -STREAM_ADPCM_DC = $(addprefix $(REPACK_GTA_DIR)/stream/, $(STREAM_WAV:.wav=.APM)) \ - $(addprefix $(REPACK_GTA_DIR)/stream/, $(STREAM_MP3:.mp3=.APM)) +STREAM_ADPCM_DC = $(addprefix $(REPACK_STREAM_DEST_DIR)/, $(STREAM_WAV:.wav=.APM)) \ + $(addprefix $(REPACK_STREAM_DEST_DIR)/, $(STREAM_MP3:.mp3=.APM)) IMG_TEXTURES_ORIG = $(addprefix $(REPACK_IMG_ORIG_DIR)/, $(IMG_TEXTURES)) 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) -$(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) +# $(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 @touch $@ @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 # 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) ./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) ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ # 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) ./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) ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ diff --git a/miami/Makefile b/miami/Makefile index 07b64011..2d7e94fa 100644 --- a/miami/Makefile +++ b/miami/Makefile @@ -29,6 +29,7 @@ REPACK_IMG_DC_DIR?=$(REPACK_DIR)/miami-img-dc REPACK_SFX_ORIG_DIR?=$(REPACK_DIR)/miami-sfx-orig REPACK_SFX_DC_DIR?=$(REPACK_DIR)/miami-sfx-dc 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_DC_DIR?=$(REPACK_DIR)/miami-cuts-dc @@ -305,6 +306,9 @@ animtool: ../src/tools/animtool.cpp coltool: ../src/tools/coltool.cpp $(CXX) -std=c++17 -o $@ -g -O0 $< +streamheaderpack: ../src/tools/streamheaderpack.cpp + $(CXX) -std=c++17 -o $@ -g -O0 $< + -include $(DEPS) #### Repacking #### @@ -371,9 +375,9 @@ LOOSE_FILES_DC = $(addprefix $(REPACK_GTA_DIR)/, $(MISC_FILES)) SFX_DC_DIR = $(REPACK_GTA_DIR)/sfx SFX_DC_RAW = $(SFX_DC_DIR)/sfx_all.raw SFX_DC_DSC = $(SFX_DC_DIR)/sfx_all.dsc -STREAM_ADPCM_DC = $(addprefix $(REPACK_GTA_DIR)/stream/, $(STREAM_WAV:.wav=.APM)) \ - $(addprefix $(REPACK_GTA_DIR)/stream/, $(STREAM_MP3:.mp3=.APM)) \ - $(addprefix $(REPACK_GTA_DIR)/stream/, $(STREAM_ADF:.adf=.APM)) +STREAM_ADPCM_DC = $(addprefix $(REPACK_STREAM_DEST_DIR)/, $(STREAM_WAV:.wav=.APM)) \ + $(addprefix $(REPACK_STREAM_DEST_DIR)/, $(STREAM_MP3:.mp3=.APM)) \ + $(addprefix $(REPACK_STREAM_DEST_DIR)/, $(STREAM_ADF:.adf=.APM)) IMG_TEXTURES_ORIG = $(addprefix $(REPACK_IMG_ORIG_DIR)/, $(IMG_TEXTURES)) 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) -$(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) +# $(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 @touch $@ @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 # 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) ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ @@ -600,16 +606,16 @@ $(REPACK_STREAM_DECODED_DIR)/%.mp3: $(GTA_MOD_LOOSE_DIR)/Audio/%.adf adf2mp3 @mkdir -p $(@D) ./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) ./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) ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ # 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) ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ @@ -617,11 +623,11 @@ $(REPACK_STREAM_DECODED_DIR)/%.mp3: $(GTA_DIR)/Audio/%.adf adf2mp3 @mkdir -p $(@D) ./adf2mp3 $< $@ -$(REPACK_GTA_DIR)/stream/%.APM: $(GTA_DIR)/Audio/%.mp3 aud2adpcm +$(REPACK_STREAM_DEST_DIR)/%.APM: $(GTA_DIR)/Audio/%.mp3 aud2adpcm @mkdir -p $(@D) ./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) ./aud2adpcm $(AUDIO_STREAM_OPTION) $< $@ diff --git a/src/liberty/audio/sampman.h b/src/liberty/audio/sampman.h index 99b8af43..00c445ae 100644 --- a/src/liberty/audio/sampman.h +++ b/src/liberty/audio/sampman.h @@ -478,6 +478,7 @@ static char PS2StreamedNameTable[][25]= }; #endif +#ifdef PC_AUDIO_PATHS static char StreamedNameTable[][25] = { "AUDIO\\HEAD.WAV", @@ -677,204 +678,6 @@ static char StreamedNameTable[][25] = "AUDIO\\k1_b.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 \ No newline at end of file diff --git a/src/liberty/audio/sampman_dc.cpp b/src/liberty/audio/sampman_dc.cpp index 55d46b30..e9e90650 100644 --- a/src/liberty/audio/sampman_dc.cpp +++ b/src/liberty/audio/sampman_dc.cpp @@ -15,6 +15,7 @@ #define debugf(...) // dbglog(DBG_CRITICAL, __VA_ARGS__) #include "sampman.h" +#include "sampman_dc_streams.h" #include "AudioManager.h" #include "MusicManager.h" #include "Frontend.h" @@ -172,6 +173,8 @@ file_t fdPedSfx; volatile uint32 nPedSfxReqReadId = 1; volatile uint32 nPedSfxReqNextId = 1; +static int32 DCStreamedLength[TOTAL_STREAMED_SOUNDS]; + struct WavHeader { // RIFF Header char riff[4]; // RIFF Header Magic header @@ -461,6 +464,12 @@ cSampleManager::Initialise(void) 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; return TRUE; } @@ -1212,21 +1221,10 @@ int32 cSampleManager::GetStreamedFileLength(uint8 nFile) { ASSERT( nFile < TOTAL_STREAMED_SOUNDS ); - int32 rv = 1; // Look in MusicManager.cpp:268 - 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); + auto rv = DCStreamedLength[nFile]; debugf("GetStreamedFileLength: %d %d\n", nFile, rv); - return rv <= 0 ? 1 : rv; + return rv; } bool8 diff --git a/src/liberty/audio/sampman_dc_streams.h b/src/liberty/audio/sampman_dc_streams.h new file mode 100644 index 00000000..696b07e0 --- /dev/null +++ b/src/liberty/audio/sampman_dc_streams.h @@ -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" +}; \ No newline at end of file diff --git a/src/miami/audio/sampman.h b/src/miami/audio/sampman.h index 6363bbfb..40cb8e0b 100644 --- a/src/miami/audio/sampman.h +++ b/src/miami/audio/sampman.h @@ -1499,6 +1499,7 @@ static char PS2StreamedNameTable[][40] = }; #endif +#ifdef PC_AUDIO_PATHS static char StreamedNameTable[][25] = { "AUDIO\\WILD.ADF", @@ -2726,1232 +2727,4 @@ static char StreamedNameTable[][25] = "AUDIO\\BUST_27.WAV", "AUDIO\\BUST_28.WAV", }; - - -static char DCStreamedNameTable[][25] = -{ - "stream/WILD.APM", - "stream/FLASH.APM", - "stream/KCHAT.APM", - "stream/FEVER.APM", - "stream/VROCK.APM", - "stream/VCPR.APM", - "stream/ESPANT.APM", - "stream/EMOTION.APM", - "stream/WAVE.APM", - "stream/MISCOM.APM", - "stream/CITY.APM", - "stream/WATER.APM", - "stream/BEACHAMB.APM", - "stream/HCITY.APM", - "stream/HWATER.APM", - "stream/HBEACH.APM", - "stream/MALLAMB.APM", - "stream/STRIP.APM", - "stream/MALIBU.APM", - "stream/HOTEL.APM", - "stream/DIRTRING.APM", - "stream/LAW4RIOT.APM", - "stream/AMBSIL.APM", - "stream/POLICE.APM", - "stream/TAXI.APM", - "stream/BCLOSED.APM", - "stream/BOPEN.APM", - "stream/ASS_1.APM", - "stream/ASS_2.APM", - "stream/BANK_1.APM", - "stream/BANK_2A.APM", - "stream/BANK_2B.APM", - "stream/BANK_3A.APM", - "stream/BANK_3B.APM", - "stream/BANK_4.APM", - "stream/BIKE_1.APM", - "stream/BIKE_2.APM", - "stream/BIKE_3.APM", - "stream/BUD_1.APM", - "stream/BUD_2.APM", - "stream/BUD_3.APM", - "stream/CAP_1.APM", - "stream/CAR_1.APM", - "stream/CNT_1A.APM", - "stream/CNT_1B.APM", - "stream/CNT_2.APM", - "stream/COK_1.APM", - "stream/COK_2A.APM", - "stream/COK_2B.APM", - "stream/COK_3.APM", - "stream/COK_4A.APM", - "stream/COK_4A2.APM", - "stream/COK_4B.APM", - "stream/COL_1.APM", - "stream/COL_2.APM", - "stream/COL_3A.APM", - "stream/COL_4A.APM", - "stream/COL_5A.APM", - "stream/COL_5B.APM", - "stream/CUB_1.APM", - "stream/CUB_2.APM", - "stream/CUB_3.APM", - "stream/CUB_4.APM", - "stream/DRUG_1.APM", - "stream/FIN.APM", - "stream/FIN2.APM", - "stream/FINALE.APM", - "stream/HAT_1.APM", - "stream/HAT_2.APM", - "stream/HAT_3.APM", - "stream/ICE_1.APM", - "stream/INT_A.APM", - "stream/INT_B.APM", - "stream/INT_D.APM", - "stream/INT_M.APM", - "stream/LAW_1A.APM", - "stream/LAW_1B.APM", - "stream/LAW_2A.APM", - "stream/LAW_2B.APM", - "stream/LAW_2C.APM", - "stream/LAW_3.APM", - "stream/LAW_4.APM", - "stream/PHIL_1.APM", - "stream/PHIL_2.APM", - "stream/PORN_1.APM", - "stream/PORN_2.APM", - "stream/PORN_3.APM", - "stream/PORN_4.APM", - "stream/RESC_1A.APM", - "stream/ROK_1.APM", - "stream/ROK_2.APM", - "stream/ROK_3A.APM", - "stream/STRIPA.APM", - "stream/TAX_1.APM", - "stream/TEX_1.APM", - "stream/TEX_2.APM", - "stream/TEX_3.APM", - "stream/GLIGHT.APM", - "stream/FIST.APM", - "stream/MISCOM.APM", - "stream/MISCOM.APM", - "stream/MISCOM.APM", - "stream/MISCOM.APM", - "stream/MOBR1.APM", - "stream/PAGER.APM", - "stream/CARREV.APM", - "stream/BIKEREV.APM", - "stream/LIFTOP.APM", - "stream/LIFTCL.APM", - "stream/LIFTRUN.APM", - "stream/LIFTBEL.APM", - "stream/INLIFT.APM", - "stream/SFX_01.APM", - "stream/SFX_02.APM", - "stream/CAMERAL.APM", - "stream/CAMERAR.APM", - "stream/CHEER1.APM", - "stream/CHEER2.APM", - "stream/CHEER3.APM", - "stream/CHEER4.APM", - "stream/OOH1.APM", - "stream/OOH2.APM", - "stream/RACE1.APM", - "stream/RACE2.APM", - "stream/RACE3.APM", - "stream/RACE4.APM", - "stream/RACE5.APM", - "stream/RACE6.APM", - "stream/RACE7.APM", - "stream/RACE8.APM", - "stream/RACE9.APM", - "stream/RACE10.APM", - "stream/RACE11.APM", - "stream/RACE12.APM", - "stream/RACE13.APM", - "stream/RACE14.APM", - "stream/RACE15.APM", - "stream/HOT1.APM", - "stream/HOT2.APM", - "stream/HOT3.APM", - "stream/HOT4.APM", - "stream/HOT5.APM", - "stream/HOT6.APM", - "stream/HOT7.APM", - "stream/HOT8.APM", - "stream/HOT9.APM", - "stream/HOT10.APM", - "stream/HOT11.APM", - "stream/HOT12.APM", - "stream/HOT13.APM", - "stream/HOT14.APM", - "stream/HOT15.APM", - "stream/LANSTP1.APM", - "stream/LANSTP2.APM", - "stream/LANAMU1.APM", - "stream/LANAMU2.APM", - "stream/AIRHORNL.APM", - "stream/AIRHORNR.APM", - "stream/SNIPSCRL.APM", - "stream/SNIPSHORT.APM", - "stream/BLOWROOF.APM", - "stream/ASS_1.APM", - "stream/ASS_2.APM", - "stream/ASS_3.APM", - "stream/ASS_4.APM", - "stream/ASS_5.APM", - "stream/ASS_6.APM", - "stream/ASS_7.APM", - "stream/ASS_8.APM", - "stream/ASS_9.APM", - "stream/ASS_10.APM", - "stream/ASS_11.APM", - "stream/ASS_12.APM", - "stream/ASS_13.APM", - "stream/ASS_14.APM", - "stream/BIKE1_1.APM", - "stream/BIKE1_2.APM", - "stream/BIKE1_3.APM", - "stream/BNK1_1.APM", - "stream/BNK1_2.APM", - "stream/BNK1_3.APM", - "stream/BNK1_4.APM", - "stream/BNK1_5.APM", - "stream/BNK1_6.APM", - "stream/BNK1_7.APM", - "stream/BNK1_8.APM", - "stream/BNK1_10.APM", - "stream/BNK1_11.APM", - "stream/BNK1_12.APM", - "stream/BNK1_13.APM", - "stream/BNK1_14.APM", - "stream/BNK2_1.APM", - "stream/BNK2_2.APM", - "stream/BNK2_3.APM", - "stream/BNK2_4.APM", - "stream/BNK2_5.APM", - "stream/BNK2_6.APM", - "stream/BNK2_7.APM", - "stream/BNK2_8.APM", - "stream/BNK2_9.APM", - "stream/BNK3_1.APM", - "stream/BNK3_2.APM", - "stream/BNK3_3A.APM", - "stream/BNK3_3B.APM", - "stream/BNK3_3C.APM", - "stream/BNK3_4A.APM", - "stream/BNK3_4B.APM", - "stream/BNK3_4C.APM", - "stream/BNK4_1.APM", - "stream/BNK4_2.APM", - "stream/BNK4_3A.APM", - "stream/BNK4_3B.APM", - "stream/BNK4_3C.APM", - "stream/BNK4_3D.APM", - "stream/BNK4_3E.APM", - "stream/BNK4_3F.APM", - "stream/BNK4_3G.APM", - "stream/BNK4_3H.APM", - "stream/BNK4_3I.APM", - "stream/BNK4_3J.APM", - "stream/BNK4_3K.APM", - "stream/BNK4_3M.APM", - "stream/BNK4_3O.APM", - "stream/BNK4_3P.APM", - "stream/BNK4_3Q.APM", - "stream/BNK4_3R.APM", - "stream/BNK4_3S.APM", - "stream/BNK4_3T.APM", - "stream/BNK4_3U.APM", - "stream/BNK4_3V.APM", - "stream/BNK4_4A.APM", - "stream/BNK4_4B.APM", - "stream/BNK4_5.APM", - "stream/BNK4_6.APM", - "stream/BNK4_7.APM", - "stream/BNK4_8.APM", - "stream/BNK4_9.APM", - "stream/BNK4_10.APM", - "stream/BNK4_11.APM", - "stream/BK4_12A.APM", - "stream/BK4_12B.APM", - "stream/BK4_12C.APM", - "stream/BNK4_13.APM", - "stream/BK4_14A.APM", - "stream/BK4_14B.APM", - "stream/BNK4_15.APM", - "stream/BNK4_16.APM", - "stream/BNK4_17.APM", - "stream/BNK4_18.APM", - "stream/BK4_19A.APM", - "stream/BK4_19B.APM", - "stream/BK4_20A.APM", - "stream/BK4_20B.APM", - "stream/BNK4_21.APM", - "stream/BNK422A.APM", - "stream/BNK422B.APM", - "stream/BK4_23A.APM", - "stream/BK4_23B.APM", - "stream/BK4_23C.APM", - "stream/BK4_23D.APM", - "stream/BK4_24A.APM", - "stream/BK4_24B.APM", - "stream/BNK4_25.APM", - "stream/BNK4_26.APM", - "stream/BNK4_27.APM", - "stream/BNK4_28.APM", - "stream/BNK4_29.APM", - "stream/BNK4_30.APM", - "stream/BK4_31A.APM", - "stream/BK4_31B.APM", - "stream/BNK4_32.APM", - "stream/BK4_34A.APM", - "stream/BK4_34B.APM", - "stream/BK4_35A.APM", - "stream/BK4_35B.APM", - "stream/BNK4_36.APM", - "stream/BNK4_37.APM", - "stream/BNK4_38.APM", - "stream/BNK4_39.APM", - "stream/BK4_40A.APM", - "stream/BK4_40B.APM", - "stream/BNK4_41.APM", - "stream/BNK4_42.APM", - "stream/BNK4_43.APM", - "stream/BNK4_44.APM", - "stream/BNK4_45.APM", - "stream/BNK4_46.APM", - "stream/BNK4_47.APM", - "stream/BNK4_48.APM", - "stream/BNK4_49.APM", - "stream/BNK450A.APM", - "stream/BNK450B.APM", - "stream/BNK4_51.APM", - "stream/BNK4_94.APM", - "stream/BNK4_95.APM", - "stream/BNK4_96.APM", - "stream/BNK4_97.APM", - "stream/BNK4_98.APM", - "stream/BNK4_99.APM", - "stream/BUD1_1.APM", - "stream/BUD1_2.APM", - "stream/BUD1_3.APM", - "stream/BUD1_4.APM", - "stream/BUD1_5.APM", - "stream/BUD1_9.APM", - "stream/BUD1_10.APM", - "stream/BUD2_1.APM", - "stream/BUD2_2.APM", - "stream/BUD2_3.APM", - "stream/BUD2_4.APM", - "stream/BUD2_5.APM", - "stream/BUD2_6.APM", - "stream/BUD2_7.APM", - "stream/BUD3_1.APM", - "stream/BUD3_1A.APM", - "stream/BUD3_1B.APM", - "stream/BUD3_1C.APM", - "stream/BUD3_2.APM", - "stream/BUD3_3.APM", - "stream/BUD3_4.APM", - "stream/BUD3_5.APM", - "stream/BUD3_6.APM", - "stream/BUD3_7.APM", - "stream/BUD3_8A.APM", - "stream/BUD3_8B.APM", - "stream/BUD3_8C.APM", - "stream/BUD3_9A.APM", - "stream/BUD3_9B.APM", - "stream/BUD3_9C.APM", - "stream/CAP1_2.APM", - "stream/CAP1_3.APM", - "stream/CAP1_4.APM", - "stream/CAP1_5.APM", - "stream/CAP1_6.APM", - "stream/CAP1_7.APM", - "stream/CAP1_8.APM", - "stream/CAP1_9.APM", - "stream/CAP1_10.APM", - "stream/CAP1_11.APM", - "stream/CAP1_12.APM", - "stream/CNT1_1.APM", - "stream/CNT1_2.APM", - "stream/CNT1_3.APM", - "stream/CNT1_4.APM", - "stream/CNT1_5.APM", - "stream/CNT2_1.APM", - "stream/CNT2_2.APM", - "stream/CNT2_3.APM", - "stream/CNT2_4.APM", - "stream/COK1_1.APM", - "stream/COK1_2.APM", - "stream/COK1_3.APM", - "stream/COK1_4.APM", - "stream/COK1_5.APM", - "stream/COK1_6.APM", - "stream/COK2_1.APM", - "stream/COK2_2.APM", - "stream/COK2_3.APM", - "stream/COK2_4.APM", - "stream/COK2_5.APM", - "stream/COK2_6.APM", - "stream/COK2_7A.APM", - "stream/COK2_7B.APM", - "stream/COK2_7C.APM", - "stream/COK2_8A.APM", - "stream/COK2_8B.APM", - "stream/COK2_8C.APM", - "stream/COK2_8D.APM", - "stream/COK2_9.APM", - "stream/COK210A.APM", - "stream/COK210B.APM", - "stream/COK210C.APM", - "stream/COK212A.APM", - "stream/COK212B.APM", - "stream/COK2_13.APM", - "stream/COK2_14.APM", - "stream/COK2_15.APM", - "stream/COK2_16.APM", - "stream/COK2_20.APM", - "stream/COK2_21.APM", - "stream/COK2_2.APM", // this is probably a typo of COK2_22 - "stream/COK3_1.APM", - "stream/COK3_2.APM", - "stream/COK3_3.APM", - "stream/COK3_4.APM", - "stream/COK4_1.APM", - "stream/COK4_2.APM", - "stream/COK4_3.APM", - "stream/COK4_4.APM", - "stream/COK4_5.APM", - "stream/COK4_6.APM", - "stream/COK4_7.APM", - "stream/COK4_8.APM", - "stream/COK4_9.APM", - "stream/COK4_9A.APM", - "stream/COK4_10.APM", - "stream/COK4_11.APM", - "stream/COK4_12.APM", - "stream/COK4_13.APM", - "stream/COK4_14.APM", - "stream/COK4_15.APM", - "stream/COK4_16.APM", - "stream/COK4_17.APM", - "stream/COK4_18.APM", - "stream/COK4_19.APM", - "stream/COK4_20.APM", - "stream/COK4_21.APM", - "stream/COK4_22.APM", - "stream/COK4_23.APM", - "stream/COK4_24.APM", - "stream/COK4_25.APM", - "stream/COK4_26.APM", - "stream/COK4_27.APM", - "stream/COL1_1.APM", - "stream/COL1_2.APM", - "stream/COL1_3.APM", - "stream/COL1_4.APM", - "stream/COL1_5.APM", - "stream/COL1_6.APM", - "stream/COL1_7.APM", - "stream/COL1_8.APM", - "stream/COL2_1.APM", - "stream/COL2_2.APM", - "stream/COL2_3.APM", - "stream/COL2_4.APM", - "stream/COL2_5.APM", - "stream/COL2_6A.APM", - "stream/COL2_7.APM", - "stream/COL2_8.APM", - "stream/COL2_9.APM", - "stream/COL2_10.APM", - "stream/COL2_11.APM", - "stream/COL2_12.APM", - "stream/COL2_13.APM", - "stream/COL2_14.APM", - "stream/COL2_15.APM", - "stream/COL2_16.APM", - "stream/COL3_1.APM", - "stream/COL3_2.APM", - "stream/COL3_2A.APM", - "stream/COL3_2B.APM", - "stream/COL3_3.APM", - "stream/COL3_4.APM", - "stream/COL3_5.APM", - "stream/COL3_6.APM", - "stream/COL3_7.APM", - "stream/COL3_8.APM", - "stream/COL3_9.APM", - "stream/COL3_10.APM", - "stream/COL3_11.APM", - "stream/COL3_12.APM", - "stream/COL3_13.APM", - "stream/COL3_14.APM", - "stream/COL3_15.APM", - "stream/COL3_16.APM", - "stream/COL3_17.APM", - "stream/COL3_18.APM", - "stream/COL3_19.APM", - "stream/COL3_20.APM", - "stream/COL3_21.APM", - "stream/COL3_23.APM", - "stream/COL3_24.APM", - "stream/COL3_25.APM", - "stream/COL4_1.APM", - "stream/COL4_2.APM", - "stream/COL4_3.APM", - "stream/COL4_4.APM", - "stream/COL4_5.APM", - "stream/COL4_6.APM", - "stream/COL4_7.APM", - "stream/COL4_8.APM", - "stream/COL4_9.APM", - "stream/COL4_10.APM", - "stream/COL4_11.APM", - "stream/COL4_12.APM", - "stream/COL4_13.APM", - "stream/COL4_14.APM", - "stream/COL4_15.APM", - "stream/COL4_16.APM", - "stream/COL4_17.APM", - "stream/COL4_18.APM", - "stream/COL4_19.APM", - "stream/COL4_20.APM", - "stream/COL4_21.APM", - "stream/COL4_22.APM", - "stream/COL4_23.APM", - "stream/COL4_24.APM", - "stream/COL4_25.APM", - "stream/COL4_26.APM", - "stream/COL5_1.APM", - "stream/COL5_2.APM", - "stream/COL5_3.APM", - "stream/COL5_4.APM", - "stream/COL5_5.APM", - "stream/COL5_6.APM", - "stream/COL5_7.APM", - "stream/COL5_8.APM", - "stream/COL5_9.APM", - "stream/COL5_10.APM", - "stream/COL5_11.APM", - "stream/COL5_12.APM", - "stream/COL5_13.APM", - "stream/COL5_14.APM", - "stream/COL5_15.APM", - "stream/COL5_16.APM", - "stream/COL5_17.APM", - "stream/COL5_18.APM", - "stream/COL5_19.APM", - "stream/COL5_20.APM", - "stream/COL5_21.APM", - "stream/COL5_22.APM", - "stream/CUB1_1.APM", - "stream/CUB1_2.APM", - "stream/CUB1_3.APM", - "stream/CUB1_4.APM", - "stream/CUB1_5.APM", - "stream/CUB1_6.APM", - "stream/CUB1_7.APM", - "stream/CUB1_8.APM", - "stream/CUB1_9.APM", - "stream/CUB1_10.APM", - "stream/CUB2_1.APM", - "stream/CUB2_2.APM", - "stream/CUB2_3A.APM", - "stream/CUB2_3B.APM", - "stream/CUB2_3C.APM", - "stream/CUB2_4A.APM", - "stream/CUB2_5.APM", - "stream/CUB2_6.APM", - "stream/CUB2_7.APM", - "stream/CUB2_8.APM", - "stream/CUB2_9.APM", - "stream/CUB2_10.APM", - "stream/CUB2_11.APM", - "stream/CUB3_1.APM", - "stream/CUB3_2.APM", - "stream/CUB3_3.APM", - "stream/CUB3_4.APM", - "stream/CUB4_1.APM", - "stream/CUB4_2.APM", - "stream/CUB4_3.APM", - "stream/CUB4_4.APM", - "stream/CUB4_5.APM", - "stream/CUB4_5A.APM", - "stream/CUB4_6.APM", - "stream/CUB4_7.APM", - "stream/CUB4_8.APM", - "stream/CUB4_9.APM", - "stream/CUB4_10.APM", - "stream/CUB4_11.APM", - "stream/CUB4_12.APM", - "stream/CUB4_13.APM", - "stream/CUB4_14.APM", - "stream/CUB4_15.APM", - "stream/CUB4_16.APM", - "stream/GOLF_1.APM", - "stream/GOLF_2.APM", - "stream/GOLF_3.APM", - "stream/BAR_1.APM", - "stream/BAR_2.APM", - "stream/BAR_3.APM", - "stream/BAR_4.APM", - "stream/BAR_5.APM", - "stream/BAR_6.APM", - "stream/BAR_7.APM", - "stream/BAR_8.APM", - "stream/STRIP_1.APM", - "stream/STRIP_2.APM", - "stream/STRIP_3.APM", - "stream/STRIP_4.APM", - "stream/STRIP_5.APM", - "stream/STRIP_6.APM", - "stream/STRIP_7.APM", - "stream/STRIP_8.APM", - "stream/STRIP_9.APM", - "stream/STAR_1.APM", - "stream/STAR_2.APM", - "stream/STAR_3.APM", - "stream/STAR_4.APM", - "stream/FIN_1A.APM", - "stream/FIN_1B.APM", - "stream/FIN_1C.APM", - "stream/FIN_2B.APM", - "stream/FIN_2C.APM", - "stream/FIN_3.APM", - "stream/FIN_4.APM", - "stream/FIN_5.APM", - "stream/FIN_6.APM", - "stream/FIN_10.APM", - "stream/FIN_11A.APM", - "stream/FIN_11B.APM", - "stream/FIN_12A.APM", - "stream/FIN_12B.APM", - "stream/FIN_12C.APM", - "stream/FIN_13.APM", - "stream/FINKILL.APM", - "stream/LAW1_1.APM", - "stream/LAW1_2.APM", - "stream/LAW1_3.APM", - "stream/LAW1_4.APM", - "stream/LAW1_5.APM", - "stream/LAW1_6.APM", - "stream/LAW1_7.APM", - "stream/LAW1_8.APM", - "stream/LAW1_9.APM", - "stream/LAW1_10.APM", - "stream/LAW2_1.APM", - "stream/LAW2_2.APM", - "stream/LAW2_3.APM", - "stream/LAW2_4.APM", - "stream/LAW2_5.APM", - "stream/LAW2_6.APM", - "stream/LAW2_7.APM", - "stream/LAW2_8.APM", - "stream/LAW2_9.APM", - "stream/LAW2_10.APM", - "stream/LAW3_1.APM", - "stream/LAW3_2.APM", - "stream/LAW3_3.APM", - "stream/LAW3_4.APM", - "stream/LAW3_5.APM", - "stream/LAW3_6.APM", - "stream/LAW3_10.APM", - "stream/LAW3_11.APM", - "stream/LAW3_12.APM", - "stream/LAW3_13.APM", - "stream/LAW3_14.APM", - "stream/LAW3_16.APM", - "stream/LAW3_17.APM", - "stream/LAW3_18.APM", - "stream/LAW3_19.APM", - "stream/LAW3_20.APM", - "stream/LAW3_21.APM", - "stream/LAW3_22.APM", - "stream/LAW3_23.APM", - "stream/LAW3_24.APM", - "stream/LAW3_25.APM", - "stream/LAW4_1A.APM", - "stream/LAW4_1B.APM", - "stream/LAW4_1C.APM", - "stream/LAW4_1D.APM", - "stream/LAW4_10.APM", - "stream/LAW4_3.APM", - "stream/LAW4_4.APM", - "stream/LAW4_5.APM", - "stream/LAW4_6.APM", - "stream/LAW4_7.APM", - "stream/LAW4_8.APM", - "stream/LAW4_9.APM", - "stream/PHIL1_2.APM", - "stream/PHIL1_3.APM", - "stream/PHIL2_1.APM", - "stream/PHIL2_2.APM", - "stream/PHIL2_3.APM", - "stream/PHIL2_4.APM", - "stream/PHIL2_5.APM", - "stream/PHIL2_6.APM", - "stream/PHIL2_7.APM", - "stream/PHIL2_8.APM", - "stream/PHIL2_9.APM", - "stream/PHIL210.APM", - "stream/PHIL211.APM", - "stream/PORN1_1.APM", - "stream/PORN1_2.APM", - "stream/PORN1_3.APM", - "stream/PRN1_3A.APM", - "stream/PORN1_4.APM", - "stream/PORN1_5.APM", - "stream/PORN1_6.APM", - "stream/PORN1_7.APM", - "stream/PORN1_8.APM", - "stream/PORN1_9.APM", - "stream/PRN1_10.APM", - "stream/PRN1_11.APM", - "stream/PRN1_12.APM", - "stream/PRN1_13.APM", - "stream/PRN1_14.APM", - "stream/PRN1_15.APM", - "stream/PRN1_16.APM", - "stream/PRN1_17.APM", - "stream/PRN1_18.APM", - "stream/PRN1_19.APM", - "stream/PRN1_20.APM", - "stream/PRN1_21.APM", - "stream/PORN3_1.APM", - "stream/PORN3_2.APM", - "stream/PORN3_3.APM", - "stream/PORN3_4.APM", - "stream/PSYCH_1.APM", - "stream/PSYCH_2.APM", - "stream/ROK2_01.APM", - "stream/ROK3_1.APM", - "stream/ROK3_2.APM", - "stream/ROK3_3.APM", - "stream/ROK3_4.APM", - "stream/ROK3_5.APM", - "stream/ROK3_6.APM", - "stream/ROK3_7.APM", - "stream/ROK3_8.APM", - "stream/ROK3_9.APM", - "stream/ROK3_10.APM", - "stream/ROK3_11.APM", - "stream/ROK3_12.APM", - "stream/ROK3_13.APM", - "stream/ROK3_14.APM", - "stream/ROK3_15.APM", - "stream/ROK3_16.APM", - "stream/ROK3_17.APM", - "stream/ROK3_18.APM", - "stream/ROK3_19.APM", - "stream/ROK3_20.APM", - "stream/ROK3_21.APM", - "stream/ROK3_22.APM", - "stream/ROK3_23.APM", - "stream/ROK3_24.APM", - "stream/ROK3_25.APM", - "stream/ROK3_26.APM", - "stream/ROK3_27.APM", - "stream/ROK3_62.APM", - "stream/ROK3_63.APM", - "stream/ROK3_64.APM", - "stream/ROK3_65.APM", - "stream/ROK3_66.APM", - "stream/ROK3_67.APM", - "stream/ROK3_68.APM", - "stream/ROK3_69.APM", - "stream/ROK3_70.APM", - "stream/ROK3_71.APM", - "stream/ROK3_73.APM", - "stream/RESC_1.APM", - "stream/RESC_2.APM", - "stream/RESC_3.APM", - "stream/RESC_4.APM", - "stream/RESC_5.APM", - "stream/RESC_6.APM", - "stream/RESC_7.APM", - "stream/RESC_8.APM", - "stream/RESC_9.APM", - "stream/RESC_10.APM", - "stream/ROK1_1A.APM", - "stream/ROK1_1B.APM", - "stream/ROK1_5.APM", - "stream/ROK1_6.APM", - "stream/ROK1_7.APM", - "stream/ROK1_8.APM", - "stream/ROK1_9.APM", - "stream/TAX1_1.APM", - "stream/TAX1_2.APM", - "stream/TAX1_3.APM", - "stream/TAX1_4.APM", - "stream/TAX1_5.APM", - "stream/TAX2_1.APM", - "stream/TAX2_2.APM", - "stream/TAX2_3.APM", - "stream/TAX2_4.APM", - "stream/TAX2_5.APM", - "stream/TAX2_6.APM", - "stream/TAX2_7.APM", - "stream/TAX3_1.APM", - "stream/TAX3_2.APM", - "stream/TAX3_3.APM", - "stream/TAX3_4.APM", - "stream/TAX3_5.APM", - "stream/TEX1_1.APM", - "stream/TEX1_2.APM", - "stream/TEX1_3.APM", - "stream/TEX1_4.APM", - "stream/TEX1_5.APM", - "stream/TEX1_6.APM", - "stream/TEX2_1.APM", - "stream/TEX3_1.APM", - "stream/TEX3_2.APM", - "stream/TEX3_3.APM", - "stream/TEX3_4.APM", - "stream/TEX3_5.APM", - "stream/TEX3_6.APM", - "stream/TEX3_7.APM", - "stream/TEX3_8.APM", - "stream/HAT_1A.APM", - "stream/INTRO1.APM", - "stream/INTRO2.APM", - "stream/INTRO3.APM", - "stream/INTRO4.APM", - "stream/MOB_01A.APM", - "stream/MOB_01B.APM", - "stream/MOB_01C.APM", - "stream/MOB_02A.APM", - "stream/MOB_02B.APM", - "stream/MOB_02C.APM", - "stream/MOB_03A.APM", - "stream/MOB_03B.APM", - "stream/MOB_03C.APM", - "stream/MOB_03D.APM", - "stream/MOB_03E.APM", - "stream/SHARK_1.APM", - "stream/SHARK_2.APM", - "stream/SHARK_3.APM", - "stream/SHARK_4.APM", - "stream/SHARK_5.APM", - "stream/MOB_04A.APM", - "stream/MOB_04B.APM", - "stream/MOB_04C.APM", - "stream/MOB_04D.APM", - "stream/MOB_05A.APM", - "stream/MOB_05B.APM", - "stream/MOB_05C.APM", - "stream/MOB_05D.APM", - "stream/MOB_06A.APM", - "stream/MOB_06B.APM", - "stream/MOB_06C.APM", - "stream/MOB_07A.APM", - "stream/MOB_07B.APM", - "stream/MOB_08A.APM", - "stream/MOB_08B.APM", - "stream/MOB_08C.APM", - "stream/MOB_08D.APM", - "stream/MOB_08E.APM", - "stream/MOB_08F.APM", - "stream/MOB_08G.APM", - "stream/MOB_09A.APM", - "stream/MOB_09B.APM", - "stream/MOB_09C.APM", - "stream/MOB_09D.APM", - "stream/MOB_09E.APM", - "stream/MOB_09F.APM", - "stream/MOB_10A.APM", - "stream/MOB_10B.APM", - "stream/MOB_10C.APM", - "stream/MOB_10D.APM", - "stream/MOB_10E.APM", - "stream/MOB_11A.APM", - "stream/MOB_11B.APM", - "stream/MOB_11C.APM", - "stream/MOB_11D.APM", - "stream/MOB_11E.APM", - "stream/MOB_11F.APM", - "stream/MOB_14A.APM", - "stream/MOB_14B.APM", - "stream/MOB_14C.APM", - "stream/MOB_14D.APM", - "stream/MOB_14E.APM", - "stream/MOB_14F.APM", - "stream/MOB_14G.APM", - "stream/MOB_14H.APM", - "stream/MOB_16A.APM", - "stream/MOB_16B.APM", - "stream/MOB_16C.APM", - "stream/MOB_16D.APM", - "stream/MOB_16E.APM", - "stream/MOB_16F.APM", - "stream/MOB_16G.APM", - "stream/MOB_17A.APM", - "stream/MOB_17B.APM", - "stream/MOB_17C.APM", - "stream/MOB_17D.APM", - "stream/MOB_17E.APM", - "stream/MOB_17G.APM", - "stream/MOB_17H.APM", - "stream/MOB_17I.APM", - "stream/MOB_17J.APM", - "stream/MOB_17K.APM", - "stream/MOB_17L.APM", - "stream/MOB_18A.APM", - "stream/MOB_18B.APM", - "stream/MOB_18C.APM", - "stream/MOB_18D.APM", - "stream/MOB_18E.APM", - "stream/MOB_18F.APM", - "stream/MOB_18G.APM", - "stream/MOB_20A.APM", - "stream/MOB_20B.APM", - "stream/MOB_20C.APM", - "stream/MOB_20D.APM", - "stream/MOB_20E.APM", - "stream/MOB_24A.APM", - "stream/MOB_24B.APM", - "stream/MOB_24C.APM", - "stream/MOB_24D.APM", - "stream/MOB_24E.APM", - "stream/MOB_24F.APM", - "stream/MOB_24G.APM", - "stream/MOB_24H.APM", - "stream/MOB_25A.APM", - "stream/MOB_25B.APM", - "stream/MOB_25C.APM", - "stream/MOB_25D.APM", - "stream/MOB_26A.APM", - "stream/MOB_26B.APM", - "stream/MOB_26C.APM", - "stream/MOB_26D.APM", - "stream/MOB_26E.APM", - "stream/MOB_29A.APM", - "stream/MOB_29B.APM", - "stream/MOB_29C.APM", - "stream/MOB_29D.APM", - "stream/MOB_29E.APM", - "stream/MOB_29F.APM", - "stream/MOB_29G.APM", - "stream/MOB_30A.APM", - "stream/MOB_30B.APM", - "stream/MOB_30C.APM", - "stream/MOB_30D.APM", - "stream/MOB_30E.APM", - "stream/MOB_30F.APM", - "stream/MOB_33A.APM", - "stream/MOB_33B.APM", - "stream/MOB_33C.APM", - "stream/MOB_33D.APM", - "stream/MOB_34A.APM", - "stream/MOB_34B.APM", - "stream/MOB_34C.APM", - "stream/MOB_34D.APM", - "stream/MOB_35A.APM", - "stream/MOB_35B.APM", - "stream/MOB_35C.APM", - "stream/MOB_35D.APM", - "stream/MOB_36A.APM", - "stream/MOB_36B.APM", - "stream/MOB_36C.APM", - "stream/MOB_40A.APM", - "stream/MOB_40B.APM", - "stream/MOB_40C.APM", - "stream/MOB_40D.APM", - "stream/MOB_40E.APM", - "stream/MOB_40F.APM", - "stream/MOB_40G.APM", - "stream/MOB_40H.APM", - "stream/MOB_40I.APM", - "stream/MOB_41A.APM", - "stream/MOB_41B.APM", - "stream/MOB_41C.APM", - "stream/MOB_41D.APM", - "stream/MOB_41E.APM", - "stream/MOB_41F.APM", - "stream/MOB_41G.APM", - "stream/MOB_41H.APM", - "stream/MOB_42A.APM", - "stream/MOB_42B.APM", - "stream/MOB_42C.APM", - "stream/MOB_42D.APM", - "stream/MOB_42E.APM", - "stream/MOB_43A.APM", - "stream/MOB_43B.APM", - "stream/MOB_43C.APM", - "stream/MOB_43D.APM", - "stream/MOB_43E.APM", - "stream/MOB_43F.APM", - "stream/MOB_43G.APM", - "stream/MOB_43H.APM", - "stream/MOB_45A.APM", - "stream/MOB_45B.APM", - "stream/MOB_45C.APM", - "stream/MOB_45D.APM", - "stream/MOB_45E.APM", - "stream/MOB_45F.APM", - "stream/MOB_45G.APM", - "stream/MOB_45H.APM", - "stream/MOB_45I.APM", - "stream/MOB_45J.APM", - "stream/MOB_45K.APM", - "stream/MOB_45L.APM", - "stream/MOB_45M.APM", - "stream/MOB_45N.APM", - "stream/MOB_46A.APM", - "stream/MOB_46B.APM", - "stream/MOB_46C.APM", - "stream/MOB_46D.APM", - "stream/MOB_46E.APM", - "stream/MOB_46F.APM", - "stream/MOB_46G.APM", - "stream/MOB_46H.APM", - "stream/MOB_47A.APM", - "stream/MOB_52A.APM", - "stream/MOB_52B.APM", - "stream/MOB_52C.APM", - "stream/MOB_52D.APM", - "stream/MOB_52E.APM", - "stream/MOB_52F.APM", - "stream/MOB_52G.APM", - "stream/MOB_52H.APM", - "stream/MOB_54A.APM", - "stream/MOB_54B.APM", - "stream/MOB_54C.APM", - "stream/MOB_54D.APM", - "stream/MOB_54E.APM", - "stream/MOB_55A.APM", - "stream/MOB_55B.APM", - "stream/MOB_55C.APM", - "stream/MOB_55D.APM", - "stream/MOB_55E.APM", - "stream/MOB_55F.APM", - "stream/MOB_56A.APM", - "stream/MOB_56B.APM", - "stream/MOB_56C.APM", - "stream/MOB_56D.APM", - "stream/MOB_56E.APM", - "stream/MOB_56F.APM", - "stream/MOB_57A.APM", - "stream/MOB_57B.APM", - "stream/MOB_57C.APM", - "stream/MOB_57D.APM", - "stream/MOB_57E.APM", - "stream/MOB_58A.APM", - "stream/MOB_58B.APM", - "stream/MOB_58C.APM", - "stream/MOB_58D.APM", - "stream/MOB_58E.APM", - "stream/MOB_58F.APM", - "stream/MOB_58G.APM", - "stream/MOB_61A.APM", - "stream/MOB_61B.APM", - "stream/MOB_62A.APM", - "stream/MOB_62B.APM", - "stream/MOB_62C.APM", - "stream/MOB_62D.APM", - "stream/MOB_63A.APM", - "stream/MOB_63B.APM", - "stream/MOB_63C.APM", - "stream/MOB_63D.APM", - "stream/MOB_63E.APM", - "stream/MOB_63F.APM", - "stream/MOB_63G.APM", - "stream/MOB_63H.APM", - "stream/MOB_63I.APM", - "stream/MOB_63J.APM", - "stream/MOB_66A.APM", - "stream/MOB_66B.APM", - "stream/MOB_68A.APM", - "stream/MOB_68B.APM", - "stream/MOB_68C.APM", - "stream/MOB_68D.APM", - "stream/MOB_70A.APM", - "stream/MOB_70B.APM", - "stream/MOB_71A.APM", - "stream/MOB_71B.APM", - "stream/MOB_71C.APM", - "stream/MOB_71D.APM", - "stream/MOB_71E.APM", - "stream/MOB_71F.APM", - "stream/MOB_71G.APM", - "stream/MOB_71H.APM", - "stream/MOB_71I.APM", - "stream/MOB_71J.APM", - "stream/MOB_71K.APM", - "stream/MOB_71L.APM", - "stream/MOB_71M.APM", - "stream/MOB_71N.APM", - "stream/MOB_72A.APM", - "stream/MOB_72B.APM", - "stream/MOB_72C.APM", - "stream/MOB_72D.APM", - "stream/MOB_72E.APM", - "stream/MOB_72F.APM", - "stream/MOB_72G.APM", - "stream/MOB_73A.APM", - "stream/MOB_73C.APM", - "stream/MOB_73D.APM", - "stream/MOB_73F.APM", - "stream/MOB_73G.APM", - "stream/MOB_73I.APM", - "stream/MOB_95A.APM", - "stream/MOB_96A.APM", - "stream/MOB_98A.APM", - "stream/MOB_99A.APM", - "stream/JOB1_1B.APM", - "stream/JOB1_1C.APM", - "stream/JOB1_1D.APM", - "stream/JOB2_1B.APM", - "stream/JOB2_2.APM", - "stream/JOB2_3.APM", - "stream/JOB2_4.APM", - "stream/JOB2_5.APM", - "stream/JOB2_6.APM", - "stream/JOB2_7.APM", - "stream/JOB2_8.APM", - "stream/JOB2_9.APM", - "stream/JOB3_1.APM", - "stream/JOB3_2.APM", - "stream/JOB3_3.APM", - "stream/JOB4_1.APM", - "stream/JOB4_2.APM", - "stream/JOB4_3.APM", - "stream/JOB5_1.APM", - "stream/JOB5_2.APM", - "stream/JOB5_3.APM", - "stream/BJM1_20.APM", - "stream/BJM1_4.APM", - "stream/BJM1_5.APM", - "stream/MERC_39.APM", - "stream/MONO_1.APM", - "stream/MONO_2.APM", - "stream/MONO_3.APM", - "stream/MONO_4.APM", - "stream/MONO_5.APM", - "stream/MONO_6.APM", - "stream/MONO_7.APM", - "stream/MONO_8.APM", - "stream/MONO_9.APM", - "stream/MONO10.APM", - "stream/MONO11.APM", - "stream/MONO12.APM", - "stream/MONO13.APM", - "stream/MONO14.APM", - "stream/MONO15.APM", - "stream/MONO16.APM", - "stream/FUD_01.APM", - "stream/FUD_02.APM", - "stream/FUD_03.APM", - "stream/FUD_04.APM", - "stream/FUD_05.APM", - "stream/FUD_06.APM", - "stream/FUD_07.APM", - "stream/FUD_08.APM", - "stream/FUD_09.APM", - "stream/FUD_10.APM", - "stream/FUD_11.APM", - "stream/FUD_12.APM", - "stream/FUD_13.APM", - "stream/FUD_14.APM", - "stream/FUD_15.APM", - "stream/FUD_16.APM", - "stream/FUD_17.APM", - "stream/FUD_18.APM", - "stream/FUD_19.APM", - "stream/FUD_20.APM", - "stream/BURG_01.APM", - "stream/BURG_02.APM", - "stream/BURG_03.APM", - "stream/BURG_04.APM", - "stream/BURG_05.APM", - "stream/BURG_06.APM", - "stream/BURG_07.APM", - "stream/BURG_08.APM", - "stream/BURG_09.APM", - "stream/BURG_10.APM", - "stream/BURG_11.APM", - "stream/BURG_12.APM", - "stream/CRUST01.APM", - "stream/CRUST02.APM", - "stream/CRUST03.APM", - "stream/CRUST04.APM", - "stream/CRUST05.APM", - "stream/CRUST06.APM", - "stream/CRUST07.APM", - "stream/CRUST08.APM", - "stream/CRUST09.APM", - "stream/BAND_01.APM", - "stream/BAND_02.APM", - "stream/BAND_03.APM", - "stream/BAND_04.APM", - "stream/BAND_05.APM", - "stream/BAND_06.APM", - "stream/BAND_07.APM", - "stream/BAND_08.APM", - "stream/SHAFT01.APM", - "stream/SHAFT02.APM", - "stream/SHAFT03.APM", - "stream/SHAFT04.APM", - "stream/SHAFT05.APM", - "stream/SHAFT06.APM", - "stream/SHAFT07.APM", - "stream/SHAFT08.APM", - "stream/PISS_01.APM", - "stream/PISS_02.APM", - "stream/PISS_03.APM", - "stream/PISS_04.APM", - "stream/PISS_05.APM", - "stream/PISS_06.APM", - "stream/PISS_07.APM", - "stream/PISS_08.APM", - "stream/PISS_09.APM", - "stream/PISS_10.APM", - "stream/PISS_11.APM", - "stream/PISS_12.APM", - "stream/PISS_13.APM", - "stream/PISS_14.APM", - "stream/PISS_15.APM", - "stream/PISS_16.APM", - "stream/PISS_17.APM", - "stream/PISS_18.APM", - "stream/PISS_19.APM", - "stream/GIMME01.APM", - "stream/GIMME02.APM", - "stream/GIMME03.APM", - "stream/GIMME04.APM", - "stream/GIMME05.APM", - "stream/GIMME06.APM", - "stream/GIMME07.APM", - "stream/GIMME08.APM", - "stream/GIMME09.APM", - "stream/GIMME10.APM", - "stream/GIMME11.APM", - "stream/GIMME12.APM", - "stream/GIMME13.APM", - "stream/GIMME14.APM", - "stream/GIMME15.APM", - "stream/BUST_01.APM", - "stream/BUST_02.APM", - "stream/BUST_03.APM", - "stream/BUST_04.APM", - "stream/BUST_05.APM", - "stream/BUST_06.APM", - "stream/BUST_07.APM", - "stream/BUST_08.APM", - "stream/BUST_09.APM", - "stream/BUST_10.APM", - "stream/BUST_11.APM", - "stream/BUST_12.APM", - "stream/BUST_13.APM", - "stream/BUST_14.APM", - "stream/BUST_15.APM", - "stream/BUST_16.APM", - "stream/BUST_17.APM", - "stream/BUST_18.APM", - "stream/BUST_19.APM", - "stream/BUST_20.APM", - "stream/BUST_21.APM", - "stream/BUST_22.APM", - "stream/BUST_23.APM", - "stream/BUST_24.APM", - "stream/BUST_25.APM", - "stream/BUST_26.APM", - "stream/BUST_27.APM", - "stream/BUST_28.APM", -}; \ No newline at end of file +#endif \ No newline at end of file diff --git a/src/miami/audio/sampman_dc.cpp b/src/miami/audio/sampman_dc.cpp index 58ca36c5..0f0cad55 100644 --- a/src/miami/audio/sampman_dc.cpp +++ b/src/miami/audio/sampman_dc.cpp @@ -15,6 +15,7 @@ #define debugf(...) // dbglog(DBG_CRITICAL, __VA_ARGS__) #include "sampman.h" +#include "sampman_dc_streams.h" #include "AudioManager.h" #include "MusicManager.h" #include "Frontend.h" @@ -469,20 +470,11 @@ cSampleManager::Initialise(void) assert(fdPedSfx >= 0); - for (unsigned nFile = 0; nFile < TOTAL_STREAMED_SOUNDS; 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); - DCStreamedLength[nFile] = (int32)rv64; - - fs_close(fd); - } + 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; return TRUE; diff --git a/src/miami/audio/sampman_dc_streams.h b/src/miami/audio/sampman_dc_streams.h new file mode 100644 index 00000000..74ca20f6 --- /dev/null +++ b/src/miami/audio/sampman_dc_streams.h @@ -0,0 +1,1228 @@ + +static char DCStreamedNameTable[][25] = +{ + "stream/WILD.APM", + "stream/FLASH.APM", + "stream/KCHAT.APM", + "stream/FEVER.APM", + "stream/VROCK.APM", + "stream/VCPR.APM", + "stream/ESPANT.APM", + "stream/EMOTION.APM", + "stream/WAVE.APM", + "stream/MISCOM.APM", + "stream/CITY.APM", + "stream/WATER.APM", + "stream/BEACHAMB.APM", + "stream/HCITY.APM", + "stream/HWATER.APM", + "stream/HBEACH.APM", + "stream/MALLAMB.APM", + "stream/STRIP.APM", + "stream/MALIBU.APM", + "stream/HOTEL.APM", + "stream/DIRTRING.APM", + "stream/LAW4RIOT.APM", + "stream/AMBSIL.APM", + "stream/POLICE.APM", + "stream/TAXI.APM", + "stream/BCLOSED.APM", + "stream/BOPEN.APM", + "stream/ASS_1.APM", + "stream/ASS_2.APM", + "stream/BANK_1.APM", + "stream/BANK_2A.APM", + "stream/BANK_2B.APM", + "stream/BANK_3A.APM", + "stream/BANK_3B.APM", + "stream/BANK_4.APM", + "stream/BIKE_1.APM", + "stream/BIKE_2.APM", + "stream/BIKE_3.APM", + "stream/BUD_1.APM", + "stream/BUD_2.APM", + "stream/BUD_3.APM", + "stream/CAP_1.APM", + "stream/CAR_1.APM", + "stream/CNT_1A.APM", + "stream/CNT_1B.APM", + "stream/CNT_2.APM", + "stream/COK_1.APM", + "stream/COK_2A.APM", + "stream/COK_2B.APM", + "stream/COK_3.APM", + "stream/COK_4A.APM", + "stream/COK_4A2.APM", + "stream/COK_4B.APM", + "stream/COL_1.APM", + "stream/COL_2.APM", + "stream/COL_3A.APM", + "stream/COL_4A.APM", + "stream/COL_5A.APM", + "stream/COL_5B.APM", + "stream/CUB_1.APM", + "stream/CUB_2.APM", + "stream/CUB_3.APM", + "stream/CUB_4.APM", + "stream/DRUG_1.APM", + "stream/FIN.APM", + "stream/FIN2.APM", + "stream/FINALE.APM", + "stream/HAT_1.APM", + "stream/HAT_2.APM", + "stream/HAT_3.APM", + "stream/ICE_1.APM", + "stream/INT_A.APM", + "stream/INT_B.APM", + "stream/INT_D.APM", + "stream/INT_M.APM", + "stream/LAW_1A.APM", + "stream/LAW_1B.APM", + "stream/LAW_2A.APM", + "stream/LAW_2B.APM", + "stream/LAW_2C.APM", + "stream/LAW_3.APM", + "stream/LAW_4.APM", + "stream/PHIL_1.APM", + "stream/PHIL_2.APM", + "stream/PORN_1.APM", + "stream/PORN_2.APM", + "stream/PORN_3.APM", + "stream/PORN_4.APM", + "stream/RESC_1A.APM", + "stream/ROK_1.APM", + "stream/ROK_2.APM", + "stream/ROK_3A.APM", + "stream/STRIPA.APM", + "stream/TAX_1.APM", + "stream/TEX_1.APM", + "stream/TEX_2.APM", + "stream/TEX_3.APM", + "stream/GLIGHT.APM", + "stream/FIST.APM", + "stream/MISCOM.APM", + "stream/MISCOM.APM", + "stream/MISCOM.APM", + "stream/MISCOM.APM", + "stream/MOBR1.APM", + "stream/PAGER.APM", + "stream/CARREV.APM", + "stream/BIKEREV.APM", + "stream/LIFTOP.APM", + "stream/LIFTCL.APM", + "stream/LIFTRUN.APM", + "stream/LIFTBEL.APM", + "stream/INLIFT.APM", + "stream/SFX_01.APM", + "stream/SFX_02.APM", + "stream/CAMERAL.APM", + "stream/CAMERAR.APM", + "stream/CHEER1.APM", + "stream/CHEER2.APM", + "stream/CHEER3.APM", + "stream/CHEER4.APM", + "stream/OOH1.APM", + "stream/OOH2.APM", + "stream/RACE1.APM", + "stream/RACE2.APM", + "stream/RACE3.APM", + "stream/RACE4.APM", + "stream/RACE5.APM", + "stream/RACE6.APM", + "stream/RACE7.APM", + "stream/RACE8.APM", + "stream/RACE9.APM", + "stream/RACE10.APM", + "stream/RACE11.APM", + "stream/RACE12.APM", + "stream/RACE13.APM", + "stream/RACE14.APM", + "stream/RACE15.APM", + "stream/HOT1.APM", + "stream/HOT2.APM", + "stream/HOT3.APM", + "stream/HOT4.APM", + "stream/HOT5.APM", + "stream/HOT6.APM", + "stream/HOT7.APM", + "stream/HOT8.APM", + "stream/HOT9.APM", + "stream/HOT10.APM", + "stream/HOT11.APM", + "stream/HOT12.APM", + "stream/HOT13.APM", + "stream/HOT14.APM", + "stream/HOT15.APM", + "stream/LANSTP1.APM", + "stream/LANSTP2.APM", + "stream/LANAMU1.APM", + "stream/LANAMU2.APM", + "stream/AIRHORNL.APM", + "stream/AIRHORNR.APM", + "stream/SNIPSCRL.APM", + "stream/SNIPSHORT.APM", + "stream/BLOWROOF.APM", + "stream/ASS_1.APM", + "stream/ASS_2.APM", + "stream/ASS_3.APM", + "stream/ASS_4.APM", + "stream/ASS_5.APM", + "stream/ASS_6.APM", + "stream/ASS_7.APM", + "stream/ASS_8.APM", + "stream/ASS_9.APM", + "stream/ASS_10.APM", + "stream/ASS_11.APM", + "stream/ASS_12.APM", + "stream/ASS_13.APM", + "stream/ASS_14.APM", + "stream/BIKE1_1.APM", + "stream/BIKE1_2.APM", + "stream/BIKE1_3.APM", + "stream/BNK1_1.APM", + "stream/BNK1_2.APM", + "stream/BNK1_3.APM", + "stream/BNK1_4.APM", + "stream/BNK1_5.APM", + "stream/BNK1_6.APM", + "stream/BNK1_7.APM", + "stream/BNK1_8.APM", + "stream/BNK1_10.APM", + "stream/BNK1_11.APM", + "stream/BNK1_12.APM", + "stream/BNK1_13.APM", + "stream/BNK1_14.APM", + "stream/BNK2_1.APM", + "stream/BNK2_2.APM", + "stream/BNK2_3.APM", + "stream/BNK2_4.APM", + "stream/BNK2_5.APM", + "stream/BNK2_6.APM", + "stream/BNK2_7.APM", + "stream/BNK2_8.APM", + "stream/BNK2_9.APM", + "stream/BNK3_1.APM", + "stream/BNK3_2.APM", + "stream/BNK3_3A.APM", + "stream/BNK3_3B.APM", + "stream/BNK3_3C.APM", + "stream/BNK3_4A.APM", + "stream/BNK3_4B.APM", + "stream/BNK3_4C.APM", + "stream/BNK4_1.APM", + "stream/BNK4_2.APM", + "stream/BNK4_3A.APM", + "stream/BNK4_3B.APM", + "stream/BNK4_3C.APM", + "stream/BNK4_3D.APM", + "stream/BNK4_3E.APM", + "stream/BNK4_3F.APM", + "stream/BNK4_3G.APM", + "stream/BNK4_3H.APM", + "stream/BNK4_3I.APM", + "stream/BNK4_3J.APM", + "stream/BNK4_3K.APM", + "stream/BNK4_3M.APM", + "stream/BNK4_3O.APM", + "stream/BNK4_3P.APM", + "stream/BNK4_3Q.APM", + "stream/BNK4_3R.APM", + "stream/BNK4_3S.APM", + "stream/BNK4_3T.APM", + "stream/BNK4_3U.APM", + "stream/BNK4_3V.APM", + "stream/BNK4_4A.APM", + "stream/BNK4_4B.APM", + "stream/BNK4_5.APM", + "stream/BNK4_6.APM", + "stream/BNK4_7.APM", + "stream/BNK4_8.APM", + "stream/BNK4_9.APM", + "stream/BNK4_10.APM", + "stream/BNK4_11.APM", + "stream/BK4_12A.APM", + "stream/BK4_12B.APM", + "stream/BK4_12C.APM", + "stream/BNK4_13.APM", + "stream/BK4_14A.APM", + "stream/BK4_14B.APM", + "stream/BNK4_15.APM", + "stream/BNK4_16.APM", + "stream/BNK4_17.APM", + "stream/BNK4_18.APM", + "stream/BK4_19A.APM", + "stream/BK4_19B.APM", + "stream/BK4_20A.APM", + "stream/BK4_20B.APM", + "stream/BNK4_21.APM", + "stream/BNK422A.APM", + "stream/BNK422B.APM", + "stream/BK4_23A.APM", + "stream/BK4_23B.APM", + "stream/BK4_23C.APM", + "stream/BK4_23D.APM", + "stream/BK4_24A.APM", + "stream/BK4_24B.APM", + "stream/BNK4_25.APM", + "stream/BNK4_26.APM", + "stream/BNK4_27.APM", + "stream/BNK4_28.APM", + "stream/BNK4_29.APM", + "stream/BNK4_30.APM", + "stream/BK4_31A.APM", + "stream/BK4_31B.APM", + "stream/BNK4_32.APM", + "stream/BK4_34A.APM", + "stream/BK4_34B.APM", + "stream/BK4_35A.APM", + "stream/BK4_35B.APM", + "stream/BNK4_36.APM", + "stream/BNK4_37.APM", + "stream/BNK4_38.APM", + "stream/BNK4_39.APM", + "stream/BK4_40A.APM", + "stream/BK4_40B.APM", + "stream/BNK4_41.APM", + "stream/BNK4_42.APM", + "stream/BNK4_43.APM", + "stream/BNK4_44.APM", + "stream/BNK4_45.APM", + "stream/BNK4_46.APM", + "stream/BNK4_47.APM", + "stream/BNK4_48.APM", + "stream/BNK4_49.APM", + "stream/BNK450A.APM", + "stream/BNK450B.APM", + "stream/BNK4_51.APM", + "stream/BNK4_94.APM", + "stream/BNK4_95.APM", + "stream/BNK4_96.APM", + "stream/BNK4_97.APM", + "stream/BNK4_98.APM", + "stream/BNK4_99.APM", + "stream/BUD1_1.APM", + "stream/BUD1_2.APM", + "stream/BUD1_3.APM", + "stream/BUD1_4.APM", + "stream/BUD1_5.APM", + "stream/BUD1_9.APM", + "stream/BUD1_10.APM", + "stream/BUD2_1.APM", + "stream/BUD2_2.APM", + "stream/BUD2_3.APM", + "stream/BUD2_4.APM", + "stream/BUD2_5.APM", + "stream/BUD2_6.APM", + "stream/BUD2_7.APM", + "stream/BUD3_1.APM", + "stream/BUD3_1A.APM", + "stream/BUD3_1B.APM", + "stream/BUD3_1C.APM", + "stream/BUD3_2.APM", + "stream/BUD3_3.APM", + "stream/BUD3_4.APM", + "stream/BUD3_5.APM", + "stream/BUD3_6.APM", + "stream/BUD3_7.APM", + "stream/BUD3_8A.APM", + "stream/BUD3_8B.APM", + "stream/BUD3_8C.APM", + "stream/BUD3_9A.APM", + "stream/BUD3_9B.APM", + "stream/BUD3_9C.APM", + "stream/CAP1_2.APM", + "stream/CAP1_3.APM", + "stream/CAP1_4.APM", + "stream/CAP1_5.APM", + "stream/CAP1_6.APM", + "stream/CAP1_7.APM", + "stream/CAP1_8.APM", + "stream/CAP1_9.APM", + "stream/CAP1_10.APM", + "stream/CAP1_11.APM", + "stream/CAP1_12.APM", + "stream/CNT1_1.APM", + "stream/CNT1_2.APM", + "stream/CNT1_3.APM", + "stream/CNT1_4.APM", + "stream/CNT1_5.APM", + "stream/CNT2_1.APM", + "stream/CNT2_2.APM", + "stream/CNT2_3.APM", + "stream/CNT2_4.APM", + "stream/COK1_1.APM", + "stream/COK1_2.APM", + "stream/COK1_3.APM", + "stream/COK1_4.APM", + "stream/COK1_5.APM", + "stream/COK1_6.APM", + "stream/COK2_1.APM", + "stream/COK2_2.APM", + "stream/COK2_3.APM", + "stream/COK2_4.APM", + "stream/COK2_5.APM", + "stream/COK2_6.APM", + "stream/COK2_7A.APM", + "stream/COK2_7B.APM", + "stream/COK2_7C.APM", + "stream/COK2_8A.APM", + "stream/COK2_8B.APM", + "stream/COK2_8C.APM", + "stream/COK2_8D.APM", + "stream/COK2_9.APM", + "stream/COK210A.APM", + "stream/COK210B.APM", + "stream/COK210C.APM", + "stream/COK212A.APM", + "stream/COK212B.APM", + "stream/COK2_13.APM", + "stream/COK2_14.APM", + "stream/COK2_15.APM", + "stream/COK2_16.APM", + "stream/COK2_20.APM", + "stream/COK2_21.APM", + "stream/COK2_2.APM", // this is probably a typo of COK2_22 + "stream/COK3_1.APM", + "stream/COK3_2.APM", + "stream/COK3_3.APM", + "stream/COK3_4.APM", + "stream/COK4_1.APM", + "stream/COK4_2.APM", + "stream/COK4_3.APM", + "stream/COK4_4.APM", + "stream/COK4_5.APM", + "stream/COK4_6.APM", + "stream/COK4_7.APM", + "stream/COK4_8.APM", + "stream/COK4_9.APM", + "stream/COK4_9A.APM", + "stream/COK4_10.APM", + "stream/COK4_11.APM", + "stream/COK4_12.APM", + "stream/COK4_13.APM", + "stream/COK4_14.APM", + "stream/COK4_15.APM", + "stream/COK4_16.APM", + "stream/COK4_17.APM", + "stream/COK4_18.APM", + "stream/COK4_19.APM", + "stream/COK4_20.APM", + "stream/COK4_21.APM", + "stream/COK4_22.APM", + "stream/COK4_23.APM", + "stream/COK4_24.APM", + "stream/COK4_25.APM", + "stream/COK4_26.APM", + "stream/COK4_27.APM", + "stream/COL1_1.APM", + "stream/COL1_2.APM", + "stream/COL1_3.APM", + "stream/COL1_4.APM", + "stream/COL1_5.APM", + "stream/COL1_6.APM", + "stream/COL1_7.APM", + "stream/COL1_8.APM", + "stream/COL2_1.APM", + "stream/COL2_2.APM", + "stream/COL2_3.APM", + "stream/COL2_4.APM", + "stream/COL2_5.APM", + "stream/COL2_6A.APM", + "stream/COL2_7.APM", + "stream/COL2_8.APM", + "stream/COL2_9.APM", + "stream/COL2_10.APM", + "stream/COL2_11.APM", + "stream/COL2_12.APM", + "stream/COL2_13.APM", + "stream/COL2_14.APM", + "stream/COL2_15.APM", + "stream/COL2_16.APM", + "stream/COL3_1.APM", + "stream/COL3_2.APM", + "stream/COL3_2A.APM", + "stream/COL3_2B.APM", + "stream/COL3_3.APM", + "stream/COL3_4.APM", + "stream/COL3_5.APM", + "stream/COL3_6.APM", + "stream/COL3_7.APM", + "stream/COL3_8.APM", + "stream/COL3_9.APM", + "stream/COL3_10.APM", + "stream/COL3_11.APM", + "stream/COL3_12.APM", + "stream/COL3_13.APM", + "stream/COL3_14.APM", + "stream/COL3_15.APM", + "stream/COL3_16.APM", + "stream/COL3_17.APM", + "stream/COL3_18.APM", + "stream/COL3_19.APM", + "stream/COL3_20.APM", + "stream/COL3_21.APM", + "stream/COL3_23.APM", + "stream/COL3_24.APM", + "stream/COL3_25.APM", + "stream/COL4_1.APM", + "stream/COL4_2.APM", + "stream/COL4_3.APM", + "stream/COL4_4.APM", + "stream/COL4_5.APM", + "stream/COL4_6.APM", + "stream/COL4_7.APM", + "stream/COL4_8.APM", + "stream/COL4_9.APM", + "stream/COL4_10.APM", + "stream/COL4_11.APM", + "stream/COL4_12.APM", + "stream/COL4_13.APM", + "stream/COL4_14.APM", + "stream/COL4_15.APM", + "stream/COL4_16.APM", + "stream/COL4_17.APM", + "stream/COL4_18.APM", + "stream/COL4_19.APM", + "stream/COL4_20.APM", + "stream/COL4_21.APM", + "stream/COL4_22.APM", + "stream/COL4_23.APM", + "stream/COL4_24.APM", + "stream/COL4_25.APM", + "stream/COL4_26.APM", + "stream/COL5_1.APM", + "stream/COL5_2.APM", + "stream/COL5_3.APM", + "stream/COL5_4.APM", + "stream/COL5_5.APM", + "stream/COL5_6.APM", + "stream/COL5_7.APM", + "stream/COL5_8.APM", + "stream/COL5_9.APM", + "stream/COL5_10.APM", + "stream/COL5_11.APM", + "stream/COL5_12.APM", + "stream/COL5_13.APM", + "stream/COL5_14.APM", + "stream/COL5_15.APM", + "stream/COL5_16.APM", + "stream/COL5_17.APM", + "stream/COL5_18.APM", + "stream/COL5_19.APM", + "stream/COL5_20.APM", + "stream/COL5_21.APM", + "stream/COL5_22.APM", + "stream/CUB1_1.APM", + "stream/CUB1_2.APM", + "stream/CUB1_3.APM", + "stream/CUB1_4.APM", + "stream/CUB1_5.APM", + "stream/CUB1_6.APM", + "stream/CUB1_7.APM", + "stream/CUB1_8.APM", + "stream/CUB1_9.APM", + "stream/CUB1_10.APM", + "stream/CUB2_1.APM", + "stream/CUB2_2.APM", + "stream/CUB2_3A.APM", + "stream/CUB2_3B.APM", + "stream/CUB2_3C.APM", + "stream/CUB2_4A.APM", + "stream/CUB2_5.APM", + "stream/CUB2_6.APM", + "stream/CUB2_7.APM", + "stream/CUB2_8.APM", + "stream/CUB2_9.APM", + "stream/CUB2_10.APM", + "stream/CUB2_11.APM", + "stream/CUB3_1.APM", + "stream/CUB3_2.APM", + "stream/CUB3_3.APM", + "stream/CUB3_4.APM", + "stream/CUB4_1.APM", + "stream/CUB4_2.APM", + "stream/CUB4_3.APM", + "stream/CUB4_4.APM", + "stream/CUB4_5.APM", + "stream/CUB4_5A.APM", + "stream/CUB4_6.APM", + "stream/CUB4_7.APM", + "stream/CUB4_8.APM", + "stream/CUB4_9.APM", + "stream/CUB4_10.APM", + "stream/CUB4_11.APM", + "stream/CUB4_12.APM", + "stream/CUB4_13.APM", + "stream/CUB4_14.APM", + "stream/CUB4_15.APM", + "stream/CUB4_16.APM", + "stream/GOLF_1.APM", + "stream/GOLF_2.APM", + "stream/GOLF_3.APM", + "stream/BAR_1.APM", + "stream/BAR_2.APM", + "stream/BAR_3.APM", + "stream/BAR_4.APM", + "stream/BAR_5.APM", + "stream/BAR_6.APM", + "stream/BAR_7.APM", + "stream/BAR_8.APM", + "stream/STRIP_1.APM", + "stream/STRIP_2.APM", + "stream/STRIP_3.APM", + "stream/STRIP_4.APM", + "stream/STRIP_5.APM", + "stream/STRIP_6.APM", + "stream/STRIP_7.APM", + "stream/STRIP_8.APM", + "stream/STRIP_9.APM", + "stream/STAR_1.APM", + "stream/STAR_2.APM", + "stream/STAR_3.APM", + "stream/STAR_4.APM", + "stream/FIN_1A.APM", + "stream/FIN_1B.APM", + "stream/FIN_1C.APM", + "stream/FIN_2B.APM", + "stream/FIN_2C.APM", + "stream/FIN_3.APM", + "stream/FIN_4.APM", + "stream/FIN_5.APM", + "stream/FIN_6.APM", + "stream/FIN_10.APM", + "stream/FIN_11A.APM", + "stream/FIN_11B.APM", + "stream/FIN_12A.APM", + "stream/FIN_12B.APM", + "stream/FIN_12C.APM", + "stream/FIN_13.APM", + "stream/FINKILL.APM", + "stream/LAW1_1.APM", + "stream/LAW1_2.APM", + "stream/LAW1_3.APM", + "stream/LAW1_4.APM", + "stream/LAW1_5.APM", + "stream/LAW1_6.APM", + "stream/LAW1_7.APM", + "stream/LAW1_8.APM", + "stream/LAW1_9.APM", + "stream/LAW1_10.APM", + "stream/LAW2_1.APM", + "stream/LAW2_2.APM", + "stream/LAW2_3.APM", + "stream/LAW2_4.APM", + "stream/LAW2_5.APM", + "stream/LAW2_6.APM", + "stream/LAW2_7.APM", + "stream/LAW2_8.APM", + "stream/LAW2_9.APM", + "stream/LAW2_10.APM", + "stream/LAW3_1.APM", + "stream/LAW3_2.APM", + "stream/LAW3_3.APM", + "stream/LAW3_4.APM", + "stream/LAW3_5.APM", + "stream/LAW3_6.APM", + "stream/LAW3_10.APM", + "stream/LAW3_11.APM", + "stream/LAW3_12.APM", + "stream/LAW3_13.APM", + "stream/LAW3_14.APM", + "stream/LAW3_16.APM", + "stream/LAW3_17.APM", + "stream/LAW3_18.APM", + "stream/LAW3_19.APM", + "stream/LAW3_20.APM", + "stream/LAW3_21.APM", + "stream/LAW3_22.APM", + "stream/LAW3_23.APM", + "stream/LAW3_24.APM", + "stream/LAW3_25.APM", + "stream/LAW4_1A.APM", + "stream/LAW4_1B.APM", + "stream/LAW4_1C.APM", + "stream/LAW4_1D.APM", + "stream/LAW4_10.APM", + "stream/LAW4_3.APM", + "stream/LAW4_4.APM", + "stream/LAW4_5.APM", + "stream/LAW4_6.APM", + "stream/LAW4_7.APM", + "stream/LAW4_8.APM", + "stream/LAW4_9.APM", + "stream/PHIL1_2.APM", + "stream/PHIL1_3.APM", + "stream/PHIL2_1.APM", + "stream/PHIL2_2.APM", + "stream/PHIL2_3.APM", + "stream/PHIL2_4.APM", + "stream/PHIL2_5.APM", + "stream/PHIL2_6.APM", + "stream/PHIL2_7.APM", + "stream/PHIL2_8.APM", + "stream/PHIL2_9.APM", + "stream/PHIL210.APM", + "stream/PHIL211.APM", + "stream/PORN1_1.APM", + "stream/PORN1_2.APM", + "stream/PORN1_3.APM", + "stream/PRN1_3A.APM", + "stream/PORN1_4.APM", + "stream/PORN1_5.APM", + "stream/PORN1_6.APM", + "stream/PORN1_7.APM", + "stream/PORN1_8.APM", + "stream/PORN1_9.APM", + "stream/PRN1_10.APM", + "stream/PRN1_11.APM", + "stream/PRN1_12.APM", + "stream/PRN1_13.APM", + "stream/PRN1_14.APM", + "stream/PRN1_15.APM", + "stream/PRN1_16.APM", + "stream/PRN1_17.APM", + "stream/PRN1_18.APM", + "stream/PRN1_19.APM", + "stream/PRN1_20.APM", + "stream/PRN1_21.APM", + "stream/PORN3_1.APM", + "stream/PORN3_2.APM", + "stream/PORN3_3.APM", + "stream/PORN3_4.APM", + "stream/PSYCH_1.APM", + "stream/PSYCH_2.APM", + "stream/ROK2_01.APM", + "stream/ROK3_1.APM", + "stream/ROK3_2.APM", + "stream/ROK3_3.APM", + "stream/ROK3_4.APM", + "stream/ROK3_5.APM", + "stream/ROK3_6.APM", + "stream/ROK3_7.APM", + "stream/ROK3_8.APM", + "stream/ROK3_9.APM", + "stream/ROK3_10.APM", + "stream/ROK3_11.APM", + "stream/ROK3_12.APM", + "stream/ROK3_13.APM", + "stream/ROK3_14.APM", + "stream/ROK3_15.APM", + "stream/ROK3_16.APM", + "stream/ROK3_17.APM", + "stream/ROK3_18.APM", + "stream/ROK3_19.APM", + "stream/ROK3_20.APM", + "stream/ROK3_21.APM", + "stream/ROK3_22.APM", + "stream/ROK3_23.APM", + "stream/ROK3_24.APM", + "stream/ROK3_25.APM", + "stream/ROK3_26.APM", + "stream/ROK3_27.APM", + "stream/ROK3_62.APM", + "stream/ROK3_63.APM", + "stream/ROK3_64.APM", + "stream/ROK3_65.APM", + "stream/ROK3_66.APM", + "stream/ROK3_67.APM", + "stream/ROK3_68.APM", + "stream/ROK3_69.APM", + "stream/ROK3_70.APM", + "stream/ROK3_71.APM", + "stream/ROK3_73.APM", + "stream/RESC_1.APM", + "stream/RESC_2.APM", + "stream/RESC_3.APM", + "stream/RESC_4.APM", + "stream/RESC_5.APM", + "stream/RESC_6.APM", + "stream/RESC_7.APM", + "stream/RESC_8.APM", + "stream/RESC_9.APM", + "stream/RESC_10.APM", + "stream/ROK1_1A.APM", + "stream/ROK1_1B.APM", + "stream/ROK1_5.APM", + "stream/ROK1_6.APM", + "stream/ROK1_7.APM", + "stream/ROK1_8.APM", + "stream/ROK1_9.APM", + "stream/TAX1_1.APM", + "stream/TAX1_2.APM", + "stream/TAX1_3.APM", + "stream/TAX1_4.APM", + "stream/TAX1_5.APM", + "stream/TAX2_1.APM", + "stream/TAX2_2.APM", + "stream/TAX2_3.APM", + "stream/TAX2_4.APM", + "stream/TAX2_5.APM", + "stream/TAX2_6.APM", + "stream/TAX2_7.APM", + "stream/TAX3_1.APM", + "stream/TAX3_2.APM", + "stream/TAX3_3.APM", + "stream/TAX3_4.APM", + "stream/TAX3_5.APM", + "stream/TEX1_1.APM", + "stream/TEX1_2.APM", + "stream/TEX1_3.APM", + "stream/TEX1_4.APM", + "stream/TEX1_5.APM", + "stream/TEX1_6.APM", + "stream/TEX2_1.APM", + "stream/TEX3_1.APM", + "stream/TEX3_2.APM", + "stream/TEX3_3.APM", + "stream/TEX3_4.APM", + "stream/TEX3_5.APM", + "stream/TEX3_6.APM", + "stream/TEX3_7.APM", + "stream/TEX3_8.APM", + "stream/HAT_1A.APM", + "stream/INTRO1.APM", + "stream/INTRO2.APM", + "stream/INTRO3.APM", + "stream/INTRO4.APM", + "stream/MOB_01A.APM", + "stream/MOB_01B.APM", + "stream/MOB_01C.APM", + "stream/MOB_02A.APM", + "stream/MOB_02B.APM", + "stream/MOB_02C.APM", + "stream/MOB_03A.APM", + "stream/MOB_03B.APM", + "stream/MOB_03C.APM", + "stream/MOB_03D.APM", + "stream/MOB_03E.APM", + "stream/SHARK_1.APM", + "stream/SHARK_2.APM", + "stream/SHARK_3.APM", + "stream/SHARK_4.APM", + "stream/SHARK_5.APM", + "stream/MOB_04A.APM", + "stream/MOB_04B.APM", + "stream/MOB_04C.APM", + "stream/MOB_04D.APM", + "stream/MOB_05A.APM", + "stream/MOB_05B.APM", + "stream/MOB_05C.APM", + "stream/MOB_05D.APM", + "stream/MOB_06A.APM", + "stream/MOB_06B.APM", + "stream/MOB_06C.APM", + "stream/MOB_07A.APM", + "stream/MOB_07B.APM", + "stream/MOB_08A.APM", + "stream/MOB_08B.APM", + "stream/MOB_08C.APM", + "stream/MOB_08D.APM", + "stream/MOB_08E.APM", + "stream/MOB_08F.APM", + "stream/MOB_08G.APM", + "stream/MOB_09A.APM", + "stream/MOB_09B.APM", + "stream/MOB_09C.APM", + "stream/MOB_09D.APM", + "stream/MOB_09E.APM", + "stream/MOB_09F.APM", + "stream/MOB_10A.APM", + "stream/MOB_10B.APM", + "stream/MOB_10C.APM", + "stream/MOB_10D.APM", + "stream/MOB_10E.APM", + "stream/MOB_11A.APM", + "stream/MOB_11B.APM", + "stream/MOB_11C.APM", + "stream/MOB_11D.APM", + "stream/MOB_11E.APM", + "stream/MOB_11F.APM", + "stream/MOB_14A.APM", + "stream/MOB_14B.APM", + "stream/MOB_14C.APM", + "stream/MOB_14D.APM", + "stream/MOB_14E.APM", + "stream/MOB_14F.APM", + "stream/MOB_14G.APM", + "stream/MOB_14H.APM", + "stream/MOB_16A.APM", + "stream/MOB_16B.APM", + "stream/MOB_16C.APM", + "stream/MOB_16D.APM", + "stream/MOB_16E.APM", + "stream/MOB_16F.APM", + "stream/MOB_16G.APM", + "stream/MOB_17A.APM", + "stream/MOB_17B.APM", + "stream/MOB_17C.APM", + "stream/MOB_17D.APM", + "stream/MOB_17E.APM", + "stream/MOB_17G.APM", + "stream/MOB_17H.APM", + "stream/MOB_17I.APM", + "stream/MOB_17J.APM", + "stream/MOB_17K.APM", + "stream/MOB_17L.APM", + "stream/MOB_18A.APM", + "stream/MOB_18B.APM", + "stream/MOB_18C.APM", + "stream/MOB_18D.APM", + "stream/MOB_18E.APM", + "stream/MOB_18F.APM", + "stream/MOB_18G.APM", + "stream/MOB_20A.APM", + "stream/MOB_20B.APM", + "stream/MOB_20C.APM", + "stream/MOB_20D.APM", + "stream/MOB_20E.APM", + "stream/MOB_24A.APM", + "stream/MOB_24B.APM", + "stream/MOB_24C.APM", + "stream/MOB_24D.APM", + "stream/MOB_24E.APM", + "stream/MOB_24F.APM", + "stream/MOB_24G.APM", + "stream/MOB_24H.APM", + "stream/MOB_25A.APM", + "stream/MOB_25B.APM", + "stream/MOB_25C.APM", + "stream/MOB_25D.APM", + "stream/MOB_26A.APM", + "stream/MOB_26B.APM", + "stream/MOB_26C.APM", + "stream/MOB_26D.APM", + "stream/MOB_26E.APM", + "stream/MOB_29A.APM", + "stream/MOB_29B.APM", + "stream/MOB_29C.APM", + "stream/MOB_29D.APM", + "stream/MOB_29E.APM", + "stream/MOB_29F.APM", + "stream/MOB_29G.APM", + "stream/MOB_30A.APM", + "stream/MOB_30B.APM", + "stream/MOB_30C.APM", + "stream/MOB_30D.APM", + "stream/MOB_30E.APM", + "stream/MOB_30F.APM", + "stream/MOB_33A.APM", + "stream/MOB_33B.APM", + "stream/MOB_33C.APM", + "stream/MOB_33D.APM", + "stream/MOB_34A.APM", + "stream/MOB_34B.APM", + "stream/MOB_34C.APM", + "stream/MOB_34D.APM", + "stream/MOB_35A.APM", + "stream/MOB_35B.APM", + "stream/MOB_35C.APM", + "stream/MOB_35D.APM", + "stream/MOB_36A.APM", + "stream/MOB_36B.APM", + "stream/MOB_36C.APM", + "stream/MOB_40A.APM", + "stream/MOB_40B.APM", + "stream/MOB_40C.APM", + "stream/MOB_40D.APM", + "stream/MOB_40E.APM", + "stream/MOB_40F.APM", + "stream/MOB_40G.APM", + "stream/MOB_40H.APM", + "stream/MOB_40I.APM", + "stream/MOB_41A.APM", + "stream/MOB_41B.APM", + "stream/MOB_41C.APM", + "stream/MOB_41D.APM", + "stream/MOB_41E.APM", + "stream/MOB_41F.APM", + "stream/MOB_41G.APM", + "stream/MOB_41H.APM", + "stream/MOB_42A.APM", + "stream/MOB_42B.APM", + "stream/MOB_42C.APM", + "stream/MOB_42D.APM", + "stream/MOB_42E.APM", + "stream/MOB_43A.APM", + "stream/MOB_43B.APM", + "stream/MOB_43C.APM", + "stream/MOB_43D.APM", + "stream/MOB_43E.APM", + "stream/MOB_43F.APM", + "stream/MOB_43G.APM", + "stream/MOB_43H.APM", + "stream/MOB_45A.APM", + "stream/MOB_45B.APM", + "stream/MOB_45C.APM", + "stream/MOB_45D.APM", + "stream/MOB_45E.APM", + "stream/MOB_45F.APM", + "stream/MOB_45G.APM", + "stream/MOB_45H.APM", + "stream/MOB_45I.APM", + "stream/MOB_45J.APM", + "stream/MOB_45K.APM", + "stream/MOB_45L.APM", + "stream/MOB_45M.APM", + "stream/MOB_45N.APM", + "stream/MOB_46A.APM", + "stream/MOB_46B.APM", + "stream/MOB_46C.APM", + "stream/MOB_46D.APM", + "stream/MOB_46E.APM", + "stream/MOB_46F.APM", + "stream/MOB_46G.APM", + "stream/MOB_46H.APM", + "stream/MOB_47A.APM", + "stream/MOB_52A.APM", + "stream/MOB_52B.APM", + "stream/MOB_52C.APM", + "stream/MOB_52D.APM", + "stream/MOB_52E.APM", + "stream/MOB_52F.APM", + "stream/MOB_52G.APM", + "stream/MOB_52H.APM", + "stream/MOB_54A.APM", + "stream/MOB_54B.APM", + "stream/MOB_54C.APM", + "stream/MOB_54D.APM", + "stream/MOB_54E.APM", + "stream/MOB_55A.APM", + "stream/MOB_55B.APM", + "stream/MOB_55C.APM", + "stream/MOB_55D.APM", + "stream/MOB_55E.APM", + "stream/MOB_55F.APM", + "stream/MOB_56A.APM", + "stream/MOB_56B.APM", + "stream/MOB_56C.APM", + "stream/MOB_56D.APM", + "stream/MOB_56E.APM", + "stream/MOB_56F.APM", + "stream/MOB_57A.APM", + "stream/MOB_57B.APM", + "stream/MOB_57C.APM", + "stream/MOB_57D.APM", + "stream/MOB_57E.APM", + "stream/MOB_58A.APM", + "stream/MOB_58B.APM", + "stream/MOB_58C.APM", + "stream/MOB_58D.APM", + "stream/MOB_58E.APM", + "stream/MOB_58F.APM", + "stream/MOB_58G.APM", + "stream/MOB_61A.APM", + "stream/MOB_61B.APM", + "stream/MOB_62A.APM", + "stream/MOB_62B.APM", + "stream/MOB_62C.APM", + "stream/MOB_62D.APM", + "stream/MOB_63A.APM", + "stream/MOB_63B.APM", + "stream/MOB_63C.APM", + "stream/MOB_63D.APM", + "stream/MOB_63E.APM", + "stream/MOB_63F.APM", + "stream/MOB_63G.APM", + "stream/MOB_63H.APM", + "stream/MOB_63I.APM", + "stream/MOB_63J.APM", + "stream/MOB_66A.APM", + "stream/MOB_66B.APM", + "stream/MOB_68A.APM", + "stream/MOB_68B.APM", + "stream/MOB_68C.APM", + "stream/MOB_68D.APM", + "stream/MOB_70A.APM", + "stream/MOB_70B.APM", + "stream/MOB_71A.APM", + "stream/MOB_71B.APM", + "stream/MOB_71C.APM", + "stream/MOB_71D.APM", + "stream/MOB_71E.APM", + "stream/MOB_71F.APM", + "stream/MOB_71G.APM", + "stream/MOB_71H.APM", + "stream/MOB_71I.APM", + "stream/MOB_71J.APM", + "stream/MOB_71K.APM", + "stream/MOB_71L.APM", + "stream/MOB_71M.APM", + "stream/MOB_71N.APM", + "stream/MOB_72A.APM", + "stream/MOB_72B.APM", + "stream/MOB_72C.APM", + "stream/MOB_72D.APM", + "stream/MOB_72E.APM", + "stream/MOB_72F.APM", + "stream/MOB_72G.APM", + "stream/MOB_73A.APM", + "stream/MOB_73C.APM", + "stream/MOB_73D.APM", + "stream/MOB_73F.APM", + "stream/MOB_73G.APM", + "stream/MOB_73I.APM", + "stream/MOB_95A.APM", + "stream/MOB_96A.APM", + "stream/MOB_98A.APM", + "stream/MOB_99A.APM", + "stream/JOB1_1B.APM", + "stream/JOB1_1C.APM", + "stream/JOB1_1D.APM", + "stream/JOB2_1B.APM", + "stream/JOB2_2.APM", + "stream/JOB2_3.APM", + "stream/JOB2_4.APM", + "stream/JOB2_5.APM", + "stream/JOB2_6.APM", + "stream/JOB2_7.APM", + "stream/JOB2_8.APM", + "stream/JOB2_9.APM", + "stream/JOB3_1.APM", + "stream/JOB3_2.APM", + "stream/JOB3_3.APM", + "stream/JOB4_1.APM", + "stream/JOB4_2.APM", + "stream/JOB4_3.APM", + "stream/JOB5_1.APM", + "stream/JOB5_2.APM", + "stream/JOB5_3.APM", + "stream/BJM1_20.APM", + "stream/BJM1_4.APM", + "stream/BJM1_5.APM", + "stream/MERC_39.APM", + "stream/MONO_1.APM", + "stream/MONO_2.APM", + "stream/MONO_3.APM", + "stream/MONO_4.APM", + "stream/MONO_5.APM", + "stream/MONO_6.APM", + "stream/MONO_7.APM", + "stream/MONO_8.APM", + "stream/MONO_9.APM", + "stream/MONO10.APM", + "stream/MONO11.APM", + "stream/MONO12.APM", + "stream/MONO13.APM", + "stream/MONO14.APM", + "stream/MONO15.APM", + "stream/MONO16.APM", + "stream/FUD_01.APM", + "stream/FUD_02.APM", + "stream/FUD_03.APM", + "stream/FUD_04.APM", + "stream/FUD_05.APM", + "stream/FUD_06.APM", + "stream/FUD_07.APM", + "stream/FUD_08.APM", + "stream/FUD_09.APM", + "stream/FUD_10.APM", + "stream/FUD_11.APM", + "stream/FUD_12.APM", + "stream/FUD_13.APM", + "stream/FUD_14.APM", + "stream/FUD_15.APM", + "stream/FUD_16.APM", + "stream/FUD_17.APM", + "stream/FUD_18.APM", + "stream/FUD_19.APM", + "stream/FUD_20.APM", + "stream/BURG_01.APM", + "stream/BURG_02.APM", + "stream/BURG_03.APM", + "stream/BURG_04.APM", + "stream/BURG_05.APM", + "stream/BURG_06.APM", + "stream/BURG_07.APM", + "stream/BURG_08.APM", + "stream/BURG_09.APM", + "stream/BURG_10.APM", + "stream/BURG_11.APM", + "stream/BURG_12.APM", + "stream/CRUST01.APM", + "stream/CRUST02.APM", + "stream/CRUST03.APM", + "stream/CRUST04.APM", + "stream/CRUST05.APM", + "stream/CRUST06.APM", + "stream/CRUST07.APM", + "stream/CRUST08.APM", + "stream/CRUST09.APM", + "stream/BAND_01.APM", + "stream/BAND_02.APM", + "stream/BAND_03.APM", + "stream/BAND_04.APM", + "stream/BAND_05.APM", + "stream/BAND_06.APM", + "stream/BAND_07.APM", + "stream/BAND_08.APM", + "stream/SHAFT01.APM", + "stream/SHAFT02.APM", + "stream/SHAFT03.APM", + "stream/SHAFT04.APM", + "stream/SHAFT05.APM", + "stream/SHAFT06.APM", + "stream/SHAFT07.APM", + "stream/SHAFT08.APM", + "stream/PISS_01.APM", + "stream/PISS_02.APM", + "stream/PISS_03.APM", + "stream/PISS_04.APM", + "stream/PISS_05.APM", + "stream/PISS_06.APM", + "stream/PISS_07.APM", + "stream/PISS_08.APM", + "stream/PISS_09.APM", + "stream/PISS_10.APM", + "stream/PISS_11.APM", + "stream/PISS_12.APM", + "stream/PISS_13.APM", + "stream/PISS_14.APM", + "stream/PISS_15.APM", + "stream/PISS_16.APM", + "stream/PISS_17.APM", + "stream/PISS_18.APM", + "stream/PISS_19.APM", + "stream/GIMME01.APM", + "stream/GIMME02.APM", + "stream/GIMME03.APM", + "stream/GIMME04.APM", + "stream/GIMME05.APM", + "stream/GIMME06.APM", + "stream/GIMME07.APM", + "stream/GIMME08.APM", + "stream/GIMME09.APM", + "stream/GIMME10.APM", + "stream/GIMME11.APM", + "stream/GIMME12.APM", + "stream/GIMME13.APM", + "stream/GIMME14.APM", + "stream/GIMME15.APM", + "stream/BUST_01.APM", + "stream/BUST_02.APM", + "stream/BUST_03.APM", + "stream/BUST_04.APM", + "stream/BUST_05.APM", + "stream/BUST_06.APM", + "stream/BUST_07.APM", + "stream/BUST_08.APM", + "stream/BUST_09.APM", + "stream/BUST_10.APM", + "stream/BUST_11.APM", + "stream/BUST_12.APM", + "stream/BUST_13.APM", + "stream/BUST_14.APM", + "stream/BUST_15.APM", + "stream/BUST_16.APM", + "stream/BUST_17.APM", + "stream/BUST_18.APM", + "stream/BUST_19.APM", + "stream/BUST_20.APM", + "stream/BUST_21.APM", + "stream/BUST_22.APM", + "stream/BUST_23.APM", + "stream/BUST_24.APM", + "stream/BUST_25.APM", + "stream/BUST_26.APM", + "stream/BUST_27.APM", + "stream/BUST_28.APM", +}; \ No newline at end of file diff --git a/src/tools/streamheaderpack.cpp b/src/tools/streamheaderpack.cpp new file mode 100644 index 00000000..c06c2a0e --- /dev/null +++ b/src/tools/streamheaderpack.cpp @@ -0,0 +1,94 @@ +#include +#include +#include +#include + +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 " << 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; +} \ No newline at end of file