diff --git a/include/audio.h b/include/audio.h index 10d5d90..282b4b9 100644 --- a/include/audio.h +++ b/include/audio.h @@ -89,5 +89,6 @@ int wav_get_group_num_from_data_num(int no); // Takes ownership of dfile. int wav_prepare_from_archive_data(int id, struct archive_data *dfile); +int bgm_prepare_from_archive_data(int id, struct archive_data *dfile); #endif /* SYSTEM4_AUDIO_H */ diff --git a/src/audio.c b/src/audio.c index 9f29b7e..9f7dd2f 100644 --- a/src/audio.c +++ b/src/audio.c @@ -419,6 +419,10 @@ int wav_prepare_from_archive_data(int id, struct archive_data *dfile) { return audio_prepare_from_archive_data(&wav, id, dfile); } +int bgm_prepare_from_archive_data(int id, struct archive_data *dfile) { + return audio_prepare_from_archive_data(&bgm, id, dfile); +} + int wav_get_group_num_from_data_num(int no) { struct wai *wai = wai_get(no); diff --git a/src/hll/KiwiSoundEngine.c b/src/hll/KiwiSoundEngine.c index c512f48..0b61f8d 100644 --- a/src/hll/KiwiSoundEngine.c +++ b/src/hll/KiwiSoundEngine.c @@ -14,9 +14,14 @@ * along with this program; if not, see . */ -#include "system4.h" +#include +#include "system4.h" +#include "system4/ain.h" + +#include "vm.h" #include "hll.h" +#include "asset_manager.h" #include "audio.h" HLL_WARN_UNIMPLEMENTED( , void, KiwiSoundEngine, SetGlobalFocus, possibly_unused int nNum); @@ -54,7 +59,44 @@ static int KiwiSoundEngine_GetBackVoiceGroup(void) return 0; } +static bool rance9_bgm_exists(int num) +{ + char name[16]; + snprintf(name, sizeof(name), "%05d", num); + return asset_exists_by_name(ASSET_BGM, name, NULL); +} + +static int rance9_bgm_prepare(int ch, int num) +{ + char name[16]; + snprintf(name, sizeof(name), "%05d", num); + struct archive_data *dfile = asset_get_by_name(ASSET_BGM, name, NULL); + if (!dfile) + return 0; + return bgm_prepare_from_archive_data(ch, dfile); +} + +static bool rance9_wav_exists(int num) +{ + char name[16]; + snprintf(name, sizeof(name), "%05d", num); + return asset_exists_by_name(ASSET_SOUND, name, NULL); +} + +static int rance9_wav_prepare(int ch, int num) +{ + char name[16]; + snprintf(name, sizeof(name), "%05d", num); + struct archive_data *dfile = asset_get_by_name(ASSET_SOUND, name, NULL); + if (!dfile) + return 0; + return wav_prepare_from_archive_data(ch, dfile); +} + +static void KiwiSoundEngine_PreLink(void); + HLL_LIBRARY(KiwiSoundEngine, + HLL_EXPORT(_PreLink, KiwiSoundEngine_PreLink), HLL_EXPORT(SetGlobalFocus, KiwiSoundEngine_SetGlobalFocus), HLL_EXPORT(Music_IsExist, bgm_exists), HLL_EXPORT(Music_Prepare, bgm_prepare), @@ -100,3 +142,16 @@ HLL_LIBRARY(KiwiSoundEngine, HLL_EXPORT(GetGimicSEGroup, KiwiSoundEngine_GetGimicSEGroup), HLL_EXPORT(GetBackVoiceGroup, KiwiSoundEngine_GetBackVoiceGroup) ); + +static void KiwiSoundEngine_PreLink(void) +{ + int libno = ain_get_library(ain, "KiwiSoundEngine"); + if (libno < 0) + return; + if (ain_get_library_function(ain, libno, "Sound_Seek") >= 0) { + static_library_replace(&lib_KiwiSoundEngine, "Music_IsExist", rance9_bgm_exists); + static_library_replace(&lib_KiwiSoundEngine, "Music_Prepare", rance9_bgm_prepare); + static_library_replace(&lib_KiwiSoundEngine, "Sound_IsExist", rance9_wav_exists); + static_library_replace(&lib_KiwiSoundEngine, "Sound_Prepare", rance9_wav_prepare); + } +}