mirror of https://github.com/sm64pc/sm64pc.git
[WIP] Added sound pack hot reload
This commit is contained in:
parent
3138b85ca4
commit
a6a5e29dc5
|
@ -0,0 +1,424 @@
|
|||
diff --git a/src/audio/external.c b/src/audio/external.c
|
||||
index 7644204f..0fc3256d 100644
|
||||
--- a/src/audio/external.c
|
||||
+++ b/src/audio/external.c
|
||||
@@ -60,6 +60,9 @@ struct SequenceQueueItem {
|
||||
s32 gAudioErrorFlags = 0;
|
||||
s32 sGameLoopTicked = 0;
|
||||
|
||||
+u16 lastPlayedArgs = -1;
|
||||
+u16 lastPlayedFade = -1;
|
||||
+
|
||||
// Dialog sounds
|
||||
// The US difference is the sound for DIALOG_037 ("I win! You lose! Ha ha ha ha!
|
||||
// You're no slouch, but I'm a better sledder! Better luck next time!"), spoken
|
||||
@@ -1887,6 +1890,7 @@ u8 is_playing(u16 seqId){
|
||||
* Called from threads: thread5_game_loop
|
||||
*/
|
||||
void play_music(u8 player, u16 seqArgs, u16 fadeTimer) {
|
||||
+
|
||||
u8 seqId = seqArgs & 0xff;
|
||||
u8 priority = seqArgs >> 8;
|
||||
u8 i;
|
||||
diff --git a/src/audio/external.h b/src/audio/external.h
|
||||
index 769f5739..d4237d2f 100644
|
||||
--- a/src/audio/external.h
|
||||
+++ b/src/audio/external.h
|
||||
@@ -23,9 +23,10 @@ extern f32 gGlobalSoundSource[3];
|
||||
|
||||
// defined in data.c, used by the game
|
||||
extern u32 gAudioRandom;
|
||||
-
|
||||
extern u8 gAudioSPTaskYieldBuffer[]; // ucode yield data ptr; only used in JP
|
||||
|
||||
+extern u8 sBackgroundMusicQueueSize;
|
||||
+
|
||||
struct SPTask *create_next_audio_frame_task(void);
|
||||
void play_sound(s32 soundBits, f32 *pos);
|
||||
void audio_signal_game_loop_tick(void);
|
||||
diff --git a/src/audio/load.c b/src/audio/load.c
|
||||
index 5475c11c..21026f04 100644
|
||||
--- a/src/audio/load.c
|
||||
+++ b/src/audio/load.c
|
||||
@@ -8,7 +8,6 @@
|
||||
|
||||
#include "pc/platform.h"
|
||||
#include "pc/fs/fs.h"
|
||||
-#include "moon/mod-engine/audio/mod-audio.h"
|
||||
|
||||
#define ALIGN16(val) (((val) + 0xF) & ~0xF)
|
||||
|
||||
@@ -674,17 +673,6 @@ void load_sequence_internal(u32 player, u32 seqId, s32 loadAsync) {
|
||||
seqPlayer->scriptState.pc = sequenceData;
|
||||
}
|
||||
|
||||
-# define LOAD_DATA(x) load_sound_res((const char *)x)
|
||||
-# include <stdio.h>
|
||||
-# include <stdlib.h>
|
||||
-static inline void *load_sound_res(const char *path) {
|
||||
- void *data = loadSoundData(path);
|
||||
- if (!data) sys_fatal("could not load sound data from '%s'", path);
|
||||
- // FIXME: figure out where it is safe to free this shit
|
||||
- // can't free it immediately after in audio_init()
|
||||
- return data;
|
||||
-}
|
||||
-
|
||||
void audio_init() {
|
||||
UNUSED s8 pad[32];
|
||||
u8 buf[0x10];
|
||||
@@ -692,7 +680,6 @@ void audio_init() {
|
||||
s32 lim1, lim2, lim3;
|
||||
u32 size;
|
||||
UNUSED u64 *ptr64;
|
||||
- void *data;
|
||||
UNUSED s32 pad2;
|
||||
gAudioLoadLock = AUDIO_LOCK_UNINITIALIZED;
|
||||
|
||||
@@ -736,49 +723,6 @@ void audio_init() {
|
||||
}
|
||||
audio_reset_session(&gAudioSessionPresets[0]);
|
||||
|
||||
- // Load header for sequence data (assets/music_data.sbk.s)
|
||||
- gSeqFileHeader = (ALSeqFile *) buf;
|
||||
- data = LOAD_DATA(gMusicData); //audio_dma_copy_immediate((uintptr_t) data, , 0x10);
|
||||
- gSeqFileHeader = data;
|
||||
-
|
||||
- gSequenceCount = gSeqFileHeader->seqCount;
|
||||
- size = ALIGN16(gSequenceCount * sizeof(ALSeqData) + 4);
|
||||
- gSeqFileHeader = soundAlloc(&gAudioInitPool, size);
|
||||
- gSeqFileHeader = data; // audio_dma_copy_immediate((uintptr_t) data, , size);
|
||||
- alSeqFileNew(gSeqFileHeader, data);
|
||||
-
|
||||
- // Load header for CTL (assets/sound_data.ctl.s, i.e. ADSR)
|
||||
- gAlCtlHeader = (ALSeqFile *) buf;
|
||||
- data = LOAD_DATA(gSoundDataADSR);
|
||||
- audio_dma_copy_immediate((uintptr_t) data, gAlCtlHeader, 0x10);
|
||||
- size = gAlCtlHeader->seqCount * sizeof(ALSeqData) + 4;
|
||||
- size = ALIGN16(size);
|
||||
- gCtlEntries = soundAlloc(&gAudioInitPool, gAlCtlHeader->seqCount * sizeof(struct CtlEntry));
|
||||
- gAlCtlHeader = soundAlloc(&gAudioInitPool, size);
|
||||
- gAlCtlHeader = data; // audio_dma_copy_immediate((uintptr_t) data, , size);
|
||||
- alSeqFileNew(gAlCtlHeader, data);
|
||||
-
|
||||
- // Load header for TBL (assets/sound_data.tbl.s, i.e. raw data)
|
||||
- gAlTbl = (ALSeqFile *) buf;
|
||||
- gAlTbl = data; // audio_dma_copy_immediate((uintptr_t) data, , 0x10);
|
||||
- size = gAlTbl->seqCount * sizeof(ALSeqData) + 4;
|
||||
- size = ALIGN16(size);
|
||||
- gAlTbl = soundAlloc(&gAudioInitPool, size);
|
||||
-
|
||||
- data = LOAD_DATA(gSoundDataRaw);
|
||||
- if(data == NULL || gAlTbl == NULL) {
|
||||
- printf("Unhandled exception null");
|
||||
- return;
|
||||
- }
|
||||
-
|
||||
- gAlTbl = data; // audio_dma_copy_immediate((uintptr_t) data, , size);
|
||||
- alSeqFileNew(gAlTbl, data);
|
||||
-
|
||||
- // Load bank sets for each sequence (assets/bank_sets.s)
|
||||
- data = LOAD_DATA(gBankSetsData);
|
||||
- gAlBankSets = soundAlloc(&gAudioInitPool, 0x100);
|
||||
- gAlBankSets = data; // audio_dma_copy_immediate((uintptr_t) data, , 0x100);
|
||||
-
|
||||
init_sequence_players();
|
||||
gAudioLoadLock = AUDIO_LOCK_NOT_LOADING;
|
||||
}
|
||||
\ No newline at end of file
|
||||
diff --git a/src/audio/load.h b/src/audio/load.h
|
||||
index 5549f862..06b97725 100644
|
||||
--- a/src/audio/load.h
|
||||
+++ b/src/audio/load.h
|
||||
@@ -34,6 +34,7 @@ extern ALSeqFile *gAlCtlHeader;
|
||||
extern ALSeqFile *gAlTbl;
|
||||
extern ALSeqFile *gSeqFileHeader;
|
||||
extern u8 *gAlBankSets;
|
||||
+extern u16 gSequenceCount;
|
||||
|
||||
extern struct CtlEntry *gCtlEntries;
|
||||
extern s32 gAiFrequency;
|
||||
diff --git a/src/game/sound_init.c b/src/game/sound_init.c
|
||||
index e24bfda8..c58542d7 100644
|
||||
--- a/src/game/sound_init.c
|
||||
+++ b/src/game/sound_init.c
|
||||
@@ -25,7 +25,8 @@ static struct VblankHandler sSoundVblankHandler;
|
||||
|
||||
static u8 D_8032C6C0 = 0;
|
||||
static u8 D_8032C6C4 = 0;
|
||||
-static u16 sCurrentMusic = MUSIC_NONE;
|
||||
+u16 sCurrentMusic = MUSIC_NONE;
|
||||
+s16 sCurrentFade = 0;
|
||||
static u16 sCurrentShellMusic = MUSIC_NONE;
|
||||
static u16 sCurrentCapMusic = MUSIC_NONE;
|
||||
static u8 sPlayingInfiniteStairs = FALSE;
|
||||
@@ -207,6 +208,7 @@ void set_background_music(u16 a, u16 seqArgs, s16 fadeTimer) {
|
||||
|
||||
if (!(gShouldNotPlayCastleMusic && seqArgs == SEQ_LEVEL_INSIDE_CASTLE)) {
|
||||
play_music(SEQ_PLAYER_LEVEL, seqArgs, fadeTimer);
|
||||
+ sCurrentFade = fadeTimer;
|
||||
sCurrentMusic = seqArgs;
|
||||
}
|
||||
}
|
||||
diff --git a/src/game/sound_init.h b/src/game/sound_init.h
|
||||
index a03c5d84..d8027bad 100644
|
||||
--- a/src/game/sound_init.h
|
||||
+++ b/src/game/sound_init.h
|
||||
@@ -18,6 +18,9 @@
|
||||
#define SOUND_MENU_MODE_MONO 1
|
||||
#define SOUND_MENU_MODE_HEADSET 2
|
||||
|
||||
+extern u16 sCurrentMusic;
|
||||
+extern s16 sCurrentFade;
|
||||
+
|
||||
void reset_volume(void);
|
||||
void raise_background_noise(s32 a);
|
||||
void lower_background_noise(s32 a);
|
||||
diff --git a/src/moon/mod-engine/audio/mod-audio.cpp b/src/moon/mod-engine/audio/mod-audio.cpp
|
||||
index 472341ba..6bbaea56 100644
|
||||
--- a/src/moon/mod-engine/audio/mod-audio.cpp
|
||||
+++ b/src/moon/mod-engine/audio/mod-audio.cpp
|
||||
@@ -4,11 +4,15 @@
|
||||
#include "moon/libs/nlohmann/json.hpp"
|
||||
#include "moon/mod-engine/engine.h"
|
||||
#include "moon/mod-engine/hooks/hook.h"
|
||||
+#include "moon/mod-engine/interfaces/sound-entry.h"
|
||||
|
||||
extern "C" {
|
||||
#include "text/libs/io_utils.h"
|
||||
#include "pc/platform.h"
|
||||
#include "pc/fs/fs.h"
|
||||
+#include "PR/libaudio.h"
|
||||
+#include "audio/load.h"
|
||||
+#include "audio/external.h"
|
||||
}
|
||||
|
||||
#include <iostream>
|
||||
@@ -18,71 +22,78 @@ extern "C" {
|
||||
using namespace std;
|
||||
using json = nlohmann::json;
|
||||
|
||||
-map<string, BitModule*> soundCache;
|
||||
+u8 backgroundQueueSize = 0;
|
||||
|
||||
-namespace Moon {
|
||||
- void saveAddonSound(BitModule *addon, std::string soundPath, EntryFileData* data){
|
||||
- addon->sounds.insert(pair<string, EntryFileData*>(soundPath, data));
|
||||
- }
|
||||
-}
|
||||
|
||||
-namespace MoonInternal {
|
||||
+vector<BitModule*> soundCache;
|
||||
|
||||
- EntryFileData *getSoundData(const char *fullpath){
|
||||
- char *actualname = sys_strdup(fullpath);
|
||||
+namespace Moon {
|
||||
+ void saveAddonSound(BitModule *addon, std::string soundPath, EntryFileData* data){
|
||||
+ if(addon->sounds == nullptr)
|
||||
+ addon->sounds = new SoundEntry();
|
||||
|
||||
- auto cacheEntry = soundCache.find(actualname);
|
||||
+ SoundEntry* soundEntry = addon->sounds;
|
||||
+ ALSeqFile* header = (ALSeqFile*) data->data;
|
||||
|
||||
- if(cacheEntry == soundCache.end()) {
|
||||
- cout << "Failed to read sound file" << fullpath << endl;
|
||||
+ if(soundPath == "sound/sequences.bin"){
|
||||
+ soundEntry->seqHeader = header;
|
||||
+ alSeqFileNew(soundEntry->seqHeader, (u8*) data->data);
|
||||
+ soundEntry->seqCount = header->seqCount;
|
||||
+ return;
|
||||
}
|
||||
+ if(soundPath == "sound/sound_data.ctl"){
|
||||
+ soundEntry->ctlHeader = header;
|
||||
+ alSeqFileNew(soundEntry->ctlHeader, (u8*) data->data);
|
||||
+ soundEntry->ctlEntries = new CtlEntry[header->seqCount];
|
||||
+ return;
|
||||
+ }
|
||||
+ if(soundPath == "sound/sound_data.tbl"){
|
||||
+ soundEntry->tblHeader = header;
|
||||
+ alSeqFileNew(soundEntry->tblHeader, (u8*) data->data);
|
||||
+ return;
|
||||
+ }
|
||||
+ if(soundPath == "sound/bank_sets"){
|
||||
+ soundEntry->bankSets = (u8*) data->data;
|
||||
+ return;
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
|
||||
- BitModule *addon = cacheEntry->second;
|
||||
-
|
||||
- EntryFileData * data = NULL;
|
||||
+namespace Moon {
|
||||
+ void setSoundEntry(SoundEntry *entry) {
|
||||
+ gSeqFileHeader = entry->seqHeader;
|
||||
+ gSequenceCount = entry->seqCount;
|
||||
|
||||
- if(addon != NULL){
|
||||
- EntryFileData *fileEntry = addon->sounds.find(actualname)->second;
|
||||
+ gAlCtlHeader = entry->ctlHeader;
|
||||
+ gCtlEntries = entry->ctlEntries;
|
||||
|
||||
- if(fileEntry != NULL){
|
||||
- if(fileEntry->data != NULL) data = fileEntry;
|
||||
- else if(!fileEntry->path.empty()){
|
||||
- MoonFS file(addon->path);
|
||||
- file.open();
|
||||
- EntryFileData *newData = new EntryFileData();
|
||||
- file.read(fileEntry->path, newData);
|
||||
- data = newData;
|
||||
- }
|
||||
- }
|
||||
- }
|
||||
- return data;
|
||||
+ gAlTbl = entry->tblHeader;
|
||||
+ gAlBankSets = entry->bankSets;
|
||||
}
|
||||
+}
|
||||
+
|
||||
+namespace MoonInternal {
|
||||
|
||||
void buildAudioCache(vector<int> order){
|
||||
soundCache.clear();
|
||||
|
||||
for(int i=0; i < order.size(); i++){
|
||||
- BitModule *addon = Moon::addons[order[i]];
|
||||
-
|
||||
- for (map<string, EntryFileData*>::iterator entry = addon->sounds.begin(); entry != addon->sounds.end(); ++entry)
|
||||
- soundCache.insert(pair<string, BitModule*>(entry->first, addon));
|
||||
+ soundCache.push_back(Moon::addons[order[i]]);
|
||||
}
|
||||
+
|
||||
+ Moon::setSoundEntry(soundCache[soundCache.size() - 1]->sounds);
|
||||
+ }
|
||||
+
|
||||
+ void resetSound(){
|
||||
+ backgroundQueueSize = sBackgroundMusicQueueSize;
|
||||
+
|
||||
}
|
||||
|
||||
void setupSoundEngine( string state ){
|
||||
if(state == "Exit"){
|
||||
for(auto &addon : Moon::addons){
|
||||
- addon->sounds.clear();
|
||||
+ delete addon->sounds;
|
||||
}
|
||||
}
|
||||
}
|
||||
-}
|
||||
-
|
||||
-extern "C" {
|
||||
-void* loadSoundData(const char* fullpath){
|
||||
- EntryFileData *data = MoonInternal::getSoundData(fullpath);
|
||||
- if(data != NULL)
|
||||
- return data->data;
|
||||
- return NULL;
|
||||
-}
|
||||
}
|
||||
\ No newline at end of file
|
||||
diff --git a/src/moon/mod-engine/audio/mod-audio.h b/src/moon/mod-engine/audio/mod-audio.h
|
||||
index 78394524..b93d493b 100644
|
||||
--- a/src/moon/mod-engine/audio/mod-audio.h
|
||||
+++ b/src/moon/mod-engine/audio/mod-audio.h
|
||||
@@ -1,6 +1,5 @@
|
||||
#ifndef ModEngineSoundModule
|
||||
#define ModEngineSoundModule
|
||||
-#ifdef __cplusplus
|
||||
|
||||
#include "moon/mod-engine/interfaces/file-entry.h"
|
||||
#include "moon/mod-engine/interfaces/bit-module.h"
|
||||
@@ -20,7 +19,4 @@ namespace MoonInternal {
|
||||
void buildAudioCache(std::vector<int> order);
|
||||
}
|
||||
|
||||
-#else
|
||||
-void* loadSoundData(const char* fullpath);
|
||||
-#endif
|
||||
#endif
|
||||
\ No newline at end of file
|
||||
diff --git a/src/moon/mod-engine/interfaces/bit-module.h b/src/moon/mod-engine/interfaces/bit-module.h
|
||||
index d25f5671..6ff164f8 100644
|
||||
--- a/src/moon/mod-engine/interfaces/bit-module.h
|
||||
+++ b/src/moon/mod-engine/interfaces/bit-module.h
|
||||
@@ -2,6 +2,7 @@
|
||||
#define Moon64BitModule
|
||||
#include "file-entry.h"
|
||||
#include "shader-entry.h"
|
||||
+#include "sound-entry.h"
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
@@ -22,8 +23,8 @@ struct BitModule{
|
||||
std::string main;
|
||||
std::string path;
|
||||
std::map<std::string, EntryFileData*> textures;
|
||||
- std::map<std::string, EntryFileData*> sounds;
|
||||
std::map<std::string, Shader*> shaders;
|
||||
+ SoundEntry* sounds;
|
||||
bool readOnly;
|
||||
bool enabled;
|
||||
};
|
||||
diff --git a/src/moon/mod-engine/interfaces/sound-entry.h b/src/moon/mod-engine/interfaces/sound-entry.h
|
||||
new file mode 100644
|
||||
index 00000000..b5ea36c8
|
||||
--- /dev/null
|
||||
+++ b/src/moon/mod-engine/interfaces/sound-entry.h
|
||||
@@ -0,0 +1,22 @@
|
||||
+#ifndef Moon64AudioEntry
|
||||
+#define Moon64AudioEntry
|
||||
+#include <string>
|
||||
+
|
||||
+extern "C" {
|
||||
+#include "types.h"
|
||||
+#include "PR/libaudio.h"
|
||||
+#include "audio/internal.h"
|
||||
+}
|
||||
+
|
||||
+struct SoundEntry {
|
||||
+ ALSeqFile* seqHeader;
|
||||
+ u16 seqCount;
|
||||
+
|
||||
+ ALSeqFile* ctlHeader;
|
||||
+ CtlEntry* ctlEntries;
|
||||
+
|
||||
+ ALSeqFile* tblHeader;
|
||||
+ u8* bankSets;
|
||||
+};
|
||||
+
|
||||
+#endif
|
||||
\ No newline at end of file
|
||||
diff --git a/src/moon/ui/screens/addons/addons-view.cpp b/src/moon/ui/screens/addons/addons-view.cpp
|
||||
index bfe08ec7..a4952daf 100644
|
||||
--- a/src/moon/ui/screens/addons/addons-view.cpp
|
||||
+++ b/src/moon/ui/screens/addons/addons-view.cpp
|
||||
@@ -4,6 +4,7 @@
|
||||
#include "moon/ui/moon-ui-manager.h"
|
||||
#include "moon/mod-engine/engine.h"
|
||||
#include "moon/mod-engine/textures/mod-texture.h"
|
||||
+#include "moon/mod-engine/audio/mod-audio.h"
|
||||
#include <cstring>
|
||||
|
||||
using namespace std;
|
||||
@@ -12,6 +13,10 @@ extern "C" {
|
||||
#include "sm64.h"
|
||||
#include "gfx_dimensions.h"
|
||||
#include "pc/configfile.h"
|
||||
+#include "game/sound_init.h"
|
||||
+#include "audio/external.h"
|
||||
+#include "game/level_update.h"
|
||||
+#include "game/area.h"
|
||||
}
|
||||
|
||||
BitModule* currentPack;
|
||||
@@ -55,6 +60,11 @@ void rebuildTextureCache(){
|
||||
}
|
||||
reverse(order.begin(), order.end());
|
||||
MoonInternal::buildTextureCache(order);
|
||||
+ MoonInternal::buildAudioCache(order);
|
||||
+
|
||||
+ sound_reset(0);
|
||||
+ play_music(SEQ_PLAYER_LEVEL, gCurrentArea->musicParam2, 0);
|
||||
+ lower_background_noise(1);
|
||||
}
|
||||
|
||||
void MoonAddonsScreen::changeScroll(int idx){
|
|
@ -60,6 +60,9 @@ struct SequenceQueueItem {
|
|||
s32 gAudioErrorFlags = 0;
|
||||
s32 sGameLoopTicked = 0;
|
||||
|
||||
u16 lastPlayedArgs = -1;
|
||||
u16 lastPlayedFade = -1;
|
||||
|
||||
// Dialog sounds
|
||||
// The US difference is the sound for DIALOG_037 ("I win! You lose! Ha ha ha ha!
|
||||
// You're no slouch, but I'm a better sledder! Better luck next time!"), spoken
|
||||
|
@ -1887,6 +1890,7 @@ u8 is_playing(u16 seqId){
|
|||
* Called from threads: thread5_game_loop
|
||||
*/
|
||||
void play_music(u8 player, u16 seqArgs, u16 fadeTimer) {
|
||||
|
||||
u8 seqId = seqArgs & 0xff;
|
||||
u8 priority = seqArgs >> 8;
|
||||
u8 i;
|
||||
|
|
|
@ -23,9 +23,10 @@ extern f32 gGlobalSoundSource[3];
|
|||
|
||||
// defined in data.c, used by the game
|
||||
extern u32 gAudioRandom;
|
||||
|
||||
extern u8 gAudioSPTaskYieldBuffer[]; // ucode yield data ptr; only used in JP
|
||||
|
||||
extern u8 sBackgroundMusicQueueSize;
|
||||
|
||||
struct SPTask *create_next_audio_frame_task(void);
|
||||
void play_sound(s32 soundBits, f32 *pos);
|
||||
void audio_signal_game_loop_tick(void);
|
||||
|
|
|
@ -8,7 +8,6 @@
|
|||
|
||||
#include "pc/platform.h"
|
||||
#include "pc/fs/fs.h"
|
||||
#include "moon/mod-engine/audio/mod-audio.h"
|
||||
|
||||
#define ALIGN16(val) (((val) + 0xF) & ~0xF)
|
||||
|
||||
|
@ -674,17 +673,6 @@ void load_sequence_internal(u32 player, u32 seqId, s32 loadAsync) {
|
|||
seqPlayer->scriptState.pc = sequenceData;
|
||||
}
|
||||
|
||||
# define LOAD_DATA(x) load_sound_res((const char *)x)
|
||||
# include <stdio.h>
|
||||
# include <stdlib.h>
|
||||
static inline void *load_sound_res(const char *path) {
|
||||
void *data = loadSoundData(path);
|
||||
if (!data) sys_fatal("could not load sound data from '%s'", path);
|
||||
// FIXME: figure out where it is safe to free this shit
|
||||
// can't free it immediately after in audio_init()
|
||||
return data;
|
||||
}
|
||||
|
||||
void audio_init() {
|
||||
UNUSED s8 pad[32];
|
||||
u8 buf[0x10];
|
||||
|
@ -692,7 +680,6 @@ void audio_init() {
|
|||
s32 lim1, lim2, lim3;
|
||||
u32 size;
|
||||
UNUSED u64 *ptr64;
|
||||
void *data;
|
||||
UNUSED s32 pad2;
|
||||
gAudioLoadLock = AUDIO_LOCK_UNINITIALIZED;
|
||||
|
||||
|
@ -736,49 +723,6 @@ void audio_init() {
|
|||
}
|
||||
audio_reset_session(&gAudioSessionPresets[0]);
|
||||
|
||||
// Load header for sequence data (assets/music_data.sbk.s)
|
||||
gSeqFileHeader = (ALSeqFile *) buf;
|
||||
data = LOAD_DATA(gMusicData); //audio_dma_copy_immediate((uintptr_t) data, , 0x10);
|
||||
gSeqFileHeader = data;
|
||||
|
||||
gSequenceCount = gSeqFileHeader->seqCount;
|
||||
size = ALIGN16(gSequenceCount * sizeof(ALSeqData) + 4);
|
||||
gSeqFileHeader = soundAlloc(&gAudioInitPool, size);
|
||||
gSeqFileHeader = data; // audio_dma_copy_immediate((uintptr_t) data, , size);
|
||||
alSeqFileNew(gSeqFileHeader, data);
|
||||
|
||||
// Load header for CTL (assets/sound_data.ctl.s, i.e. ADSR)
|
||||
gAlCtlHeader = (ALSeqFile *) buf;
|
||||
data = LOAD_DATA(gSoundDataADSR);
|
||||
audio_dma_copy_immediate((uintptr_t) data, gAlCtlHeader, 0x10);
|
||||
size = gAlCtlHeader->seqCount * sizeof(ALSeqData) + 4;
|
||||
size = ALIGN16(size);
|
||||
gCtlEntries = soundAlloc(&gAudioInitPool, gAlCtlHeader->seqCount * sizeof(struct CtlEntry));
|
||||
gAlCtlHeader = soundAlloc(&gAudioInitPool, size);
|
||||
gAlCtlHeader = data; // audio_dma_copy_immediate((uintptr_t) data, , size);
|
||||
alSeqFileNew(gAlCtlHeader, data);
|
||||
|
||||
// Load header for TBL (assets/sound_data.tbl.s, i.e. raw data)
|
||||
gAlTbl = (ALSeqFile *) buf;
|
||||
gAlTbl = data; // audio_dma_copy_immediate((uintptr_t) data, , 0x10);
|
||||
size = gAlTbl->seqCount * sizeof(ALSeqData) + 4;
|
||||
size = ALIGN16(size);
|
||||
gAlTbl = soundAlloc(&gAudioInitPool, size);
|
||||
|
||||
data = LOAD_DATA(gSoundDataRaw);
|
||||
if(data == NULL || gAlTbl == NULL) {
|
||||
printf("Unhandled exception null");
|
||||
return;
|
||||
}
|
||||
|
||||
gAlTbl = data; // audio_dma_copy_immediate((uintptr_t) data, , size);
|
||||
alSeqFileNew(gAlTbl, data);
|
||||
|
||||
// Load bank sets for each sequence (assets/bank_sets.s)
|
||||
data = LOAD_DATA(gBankSetsData);
|
||||
gAlBankSets = soundAlloc(&gAudioInitPool, 0x100);
|
||||
gAlBankSets = data; // audio_dma_copy_immediate((uintptr_t) data, , 0x100);
|
||||
|
||||
init_sequence_players();
|
||||
gAudioLoadLock = AUDIO_LOCK_NOT_LOADING;
|
||||
}
|
|
@ -34,6 +34,7 @@ extern ALSeqFile *gAlCtlHeader;
|
|||
extern ALSeqFile *gAlTbl;
|
||||
extern ALSeqFile *gSeqFileHeader;
|
||||
extern u8 *gAlBankSets;
|
||||
extern u16 gSequenceCount;
|
||||
|
||||
extern struct CtlEntry *gCtlEntries;
|
||||
extern s32 gAiFrequency;
|
||||
|
|
|
@ -25,7 +25,8 @@ static struct VblankHandler sSoundVblankHandler;
|
|||
|
||||
static u8 D_8032C6C0 = 0;
|
||||
static u8 D_8032C6C4 = 0;
|
||||
static u16 sCurrentMusic = MUSIC_NONE;
|
||||
u16 sCurrentMusic = MUSIC_NONE;
|
||||
s16 sCurrentFade = 0;
|
||||
static u16 sCurrentShellMusic = MUSIC_NONE;
|
||||
static u16 sCurrentCapMusic = MUSIC_NONE;
|
||||
static u8 sPlayingInfiniteStairs = FALSE;
|
||||
|
@ -207,6 +208,7 @@ void set_background_music(u16 a, u16 seqArgs, s16 fadeTimer) {
|
|||
|
||||
if (!(gShouldNotPlayCastleMusic && seqArgs == SEQ_LEVEL_INSIDE_CASTLE)) {
|
||||
play_music(SEQ_PLAYER_LEVEL, seqArgs, fadeTimer);
|
||||
sCurrentFade = fadeTimer;
|
||||
sCurrentMusic = seqArgs;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,6 +18,9 @@
|
|||
#define SOUND_MENU_MODE_MONO 1
|
||||
#define SOUND_MENU_MODE_HEADSET 2
|
||||
|
||||
extern u16 sCurrentMusic;
|
||||
extern s16 sCurrentFade;
|
||||
|
||||
void reset_volume(void);
|
||||
void raise_background_noise(s32 a);
|
||||
void lower_background_noise(s32 a);
|
||||
|
|
|
@ -4,11 +4,15 @@
|
|||
#include "moon/libs/nlohmann/json.hpp"
|
||||
#include "moon/mod-engine/engine.h"
|
||||
#include "moon/mod-engine/hooks/hook.h"
|
||||
#include "moon/mod-engine/interfaces/sound-entry.h"
|
||||
|
||||
extern "C" {
|
||||
#include "text/libs/io_utils.h"
|
||||
#include "pc/platform.h"
|
||||
#include "pc/fs/fs.h"
|
||||
#include "PR/libaudio.h"
|
||||
#include "audio/load.h"
|
||||
#include "audio/external.h"
|
||||
}
|
||||
|
||||
#include <iostream>
|
||||
|
@ -18,71 +22,78 @@ extern "C" {
|
|||
using namespace std;
|
||||
using json = nlohmann::json;
|
||||
|
||||
map<string, BitModule*> soundCache;
|
||||
u8 backgroundQueueSize = 0;
|
||||
|
||||
|
||||
vector<BitModule*> soundCache;
|
||||
|
||||
namespace Moon {
|
||||
void saveAddonSound(BitModule *addon, std::string soundPath, EntryFileData* data){
|
||||
addon->sounds.insert(pair<string, EntryFileData*>(soundPath, data));
|
||||
if(addon->sounds == nullptr)
|
||||
addon->sounds = new SoundEntry();
|
||||
|
||||
SoundEntry* soundEntry = addon->sounds;
|
||||
ALSeqFile* header = (ALSeqFile*) data->data;
|
||||
|
||||
if(soundPath == "sound/sequences.bin"){
|
||||
soundEntry->seqHeader = header;
|
||||
alSeqFileNew(soundEntry->seqHeader, (u8*) data->data);
|
||||
soundEntry->seqCount = header->seqCount;
|
||||
return;
|
||||
}
|
||||
if(soundPath == "sound/sound_data.ctl"){
|
||||
soundEntry->ctlHeader = header;
|
||||
alSeqFileNew(soundEntry->ctlHeader, (u8*) data->data);
|
||||
soundEntry->ctlEntries = new CtlEntry[header->seqCount];
|
||||
return;
|
||||
}
|
||||
if(soundPath == "sound/sound_data.tbl"){
|
||||
soundEntry->tblHeader = header;
|
||||
alSeqFileNew(soundEntry->tblHeader, (u8*) data->data);
|
||||
return;
|
||||
}
|
||||
if(soundPath == "sound/bank_sets"){
|
||||
soundEntry->bankSets = (u8*) data->data;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
namespace Moon {
|
||||
void setSoundEntry(SoundEntry *entry) {
|
||||
gSeqFileHeader = entry->seqHeader;
|
||||
gSequenceCount = entry->seqCount;
|
||||
|
||||
gAlCtlHeader = entry->ctlHeader;
|
||||
gCtlEntries = entry->ctlEntries;
|
||||
|
||||
gAlTbl = entry->tblHeader;
|
||||
gAlBankSets = entry->bankSets;
|
||||
}
|
||||
}
|
||||
|
||||
namespace MoonInternal {
|
||||
|
||||
EntryFileData *getSoundData(const char *fullpath){
|
||||
char *actualname = sys_strdup(fullpath);
|
||||
|
||||
auto cacheEntry = soundCache.find(actualname);
|
||||
|
||||
if(cacheEntry == soundCache.end()) {
|
||||
cout << "Failed to read sound file" << fullpath << endl;
|
||||
}
|
||||
|
||||
BitModule *addon = cacheEntry->second;
|
||||
|
||||
EntryFileData * data = NULL;
|
||||
|
||||
if(addon != NULL){
|
||||
EntryFileData *fileEntry = addon->sounds.find(actualname)->second;
|
||||
|
||||
if(fileEntry != NULL){
|
||||
if(fileEntry->data != NULL) data = fileEntry;
|
||||
else if(!fileEntry->path.empty()){
|
||||
MoonFS file(addon->path);
|
||||
file.open();
|
||||
EntryFileData *newData = new EntryFileData();
|
||||
file.read(fileEntry->path, newData);
|
||||
data = newData;
|
||||
}
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
void buildAudioCache(vector<int> order){
|
||||
soundCache.clear();
|
||||
|
||||
for(int i=0; i < order.size(); i++){
|
||||
BitModule *addon = Moon::addons[order[i]];
|
||||
|
||||
for (map<string, EntryFileData*>::iterator entry = addon->sounds.begin(); entry != addon->sounds.end(); ++entry)
|
||||
soundCache.insert(pair<string, BitModule*>(entry->first, addon));
|
||||
soundCache.push_back(Moon::addons[order[i]]);
|
||||
}
|
||||
|
||||
Moon::setSoundEntry(soundCache[soundCache.size() - 1]->sounds);
|
||||
}
|
||||
|
||||
void resetSound(){
|
||||
backgroundQueueSize = sBackgroundMusicQueueSize;
|
||||
|
||||
}
|
||||
|
||||
void setupSoundEngine( string state ){
|
||||
if(state == "Exit"){
|
||||
for(auto &addon : Moon::addons){
|
||||
addon->sounds.clear();
|
||||
delete addon->sounds;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
extern "C" {
|
||||
void* loadSoundData(const char* fullpath){
|
||||
EntryFileData *data = MoonInternal::getSoundData(fullpath);
|
||||
if(data != NULL)
|
||||
return data->data;
|
||||
return NULL;
|
||||
}
|
||||
}
|
|
@ -1,6 +1,5 @@
|
|||
#ifndef ModEngineSoundModule
|
||||
#define ModEngineSoundModule
|
||||
#ifdef __cplusplus
|
||||
|
||||
#include "moon/mod-engine/interfaces/file-entry.h"
|
||||
#include "moon/mod-engine/interfaces/bit-module.h"
|
||||
|
@ -20,7 +19,4 @@ namespace MoonInternal {
|
|||
void buildAudioCache(std::vector<int> order);
|
||||
}
|
||||
|
||||
#else
|
||||
void* loadSoundData(const char* fullpath);
|
||||
#endif
|
||||
#endif
|
|
@ -2,6 +2,7 @@
|
|||
#define Moon64BitModule
|
||||
#include "file-entry.h"
|
||||
#include "shader-entry.h"
|
||||
#include "sound-entry.h"
|
||||
#include <map>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
|
@ -22,8 +23,8 @@ struct BitModule{
|
|||
std::string main;
|
||||
std::string path;
|
||||
std::map<std::string, EntryFileData*> textures;
|
||||
std::map<std::string, EntryFileData*> sounds;
|
||||
std::map<std::string, Shader*> shaders;
|
||||
SoundEntry* sounds;
|
||||
bool readOnly;
|
||||
bool enabled;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
#ifndef Moon64AudioEntry
|
||||
#define Moon64AudioEntry
|
||||
#include <string>
|
||||
|
||||
extern "C" {
|
||||
#include "types.h"
|
||||
#include "PR/libaudio.h"
|
||||
#include "audio/internal.h"
|
||||
}
|
||||
|
||||
struct SoundEntry {
|
||||
ALSeqFile* seqHeader;
|
||||
u16 seqCount;
|
||||
|
||||
ALSeqFile* ctlHeader;
|
||||
CtlEntry* ctlEntries;
|
||||
|
||||
ALSeqFile* tblHeader;
|
||||
u8* bankSets;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -4,6 +4,7 @@
|
|||
#include "moon/ui/moon-ui-manager.h"
|
||||
#include "moon/mod-engine/engine.h"
|
||||
#include "moon/mod-engine/textures/mod-texture.h"
|
||||
#include "moon/mod-engine/audio/mod-audio.h"
|
||||
#include <cstring>
|
||||
|
||||
using namespace std;
|
||||
|
@ -12,6 +13,10 @@ extern "C" {
|
|||
#include "sm64.h"
|
||||
#include "gfx_dimensions.h"
|
||||
#include "pc/configfile.h"
|
||||
#include "game/sound_init.h"
|
||||
#include "audio/external.h"
|
||||
#include "game/level_update.h"
|
||||
#include "game/area.h"
|
||||
}
|
||||
|
||||
BitModule* currentPack;
|
||||
|
@ -55,6 +60,11 @@ void rebuildTextureCache(){
|
|||
}
|
||||
reverse(order.begin(), order.end());
|
||||
MoonInternal::buildTextureCache(order);
|
||||
MoonInternal::buildAudioCache(order);
|
||||
|
||||
sound_reset(0);
|
||||
play_music(SEQ_PLAYER_LEVEL, gCurrentArea->musicParam2, 0);
|
||||
lower_background_noise(1);
|
||||
}
|
||||
|
||||
void MoonAddonsScreen::changeScroll(int idx){
|
||||
|
|
Loading…
Reference in New Issue