Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
69 changes: 51 additions & 18 deletions game/kernel/common/kmachine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <random>
#include <thread>
#include <list>
#include <set>

#define MINIAUDIO_IMPLEMENTATION
// NOTE - this is needed, because on macOS, there is a file called `MacTypes.h`
Expand Down Expand Up @@ -76,7 +77,8 @@ u32 vblank_interrupt_handler = 0;
Timer ee_clock_timer;

MiniAudioLib::ma_engine maEngine;
std::map<std::string, std::list<MiniAudioLib::ma_sound>> maSoundMap;
std::map<std::string, std::list<MiniAudioLib::ma_sound*>> maSoundMap;
std::set<MiniAudioLib::ma_sound*> pausedSounds;
MiniAudioLib::ma_sound* mainMusicSound;

void kmachine_init_globals_common() {
Expand Down Expand Up @@ -160,8 +162,8 @@ void stopMP3(u32 filePathu32) {
std::cerr << "Couldn't find sound to stop: " << filePath << std::endl;
} else {
// stop all instances of this sound
for (auto sound : it->second) {
if (MiniAudioLib::ma_sound_stop(&sound) != MiniAudioLib::MA_SUCCESS) {
for (auto* sound : it->second) {
if (MiniAudioLib::ma_sound_stop(sound) != MiniAudioLib::MA_SUCCESS) {
std::cerr << "Failed to stop sound: " << filePath << std::endl;
}
// let the thread finish and handle ma_sound_uninit
Expand All @@ -175,14 +177,38 @@ void stopMP3(u32 filePathu32) {
void stopAllSounds() {
for (auto& pair : maSoundMap) {
// stop all instances of this sound
for (auto sound : pair.second) {
MiniAudioLib::ma_sound_stop(&sound);
for (auto* sound : pair.second) {
MiniAudioLib::ma_sound_stop(sound);
}
pair.second.clear();
}
maSoundMap.clear();
}

// Function to pause all currently playing sounds.
void pauseSoundFiles() {
std::lock_guard<std::mutex> lock(activeMusicsMutex);
for (auto& pair : maSoundMap) {
for (auto* sound : pair.second) {
if (sound && MiniAudioLib::ma_sound_is_playing(sound)) {
MiniAudioLib::ma_sound_stop(sound);
pausedSounds.insert(sound);
}
}
}
}

// Function to resume all paused sounds.
void resumeSoundFiles() {
std::lock_guard<std::mutex> lock(activeMusicsMutex);
for (auto* sound : pausedSounds) {
if (sound && !MiniAudioLib::ma_sound_is_playing(sound)) {
MiniAudioLib::ma_sound_start(sound);
}
}
pausedSounds.clear();
}

// Function to get the names of currently playing files.
std::vector<std::string> getPlayingFileNames() {
std::vector<std::string> playingFileNames;
Expand All @@ -207,50 +233,53 @@ u64 playMP3_internal(u32 filePathu32, u32 volume, bool isMainMusic) {
std::cout << "Playing file: " << filePath << std::endl;

MiniAudioLib::ma_result result;
MiniAudioLib::ma_sound sound;
MiniAudioLib::ma_sound* sound = new MiniAudioLib::ma_sound;

result = MiniAudioLib::ma_sound_init_from_file(&maEngine, fullFilePath.c_str(), 0, NULL, NULL,
&sound);
sound);
if (result != MiniAudioLib::MA_SUCCESS) {
std::cout << "Failed to load: " << filePath << std::endl;
delete sound;
return;
}

MiniAudioLib::ma_sound_set_volume(&sound, ((float)volume) / 100.0);
MiniAudioLib::ma_sound_set_volume(sound, ((float)volume) / 100.0);

if (isMainMusic) {
MiniAudioLib::ma_sound_set_looping(&sound, MA_TRUE);
MiniAudioLib::ma_sound_set_looping(sound, MA_TRUE);
mainMusicMutex.lock();
mainMusicSound = &sound;
mainMusicSound = sound;
mainMusicMutex.unlock();
}

MiniAudioLib::ma_sound_start(&sound);
MiniAudioLib::ma_sound_start(sound);

if (!isMainMusic) {
std::lock_guard<std::mutex> lock(activeMusicsMutex);
if (maSoundMap.find(filePath) == maSoundMap.end()) {
maSoundMap.insert(std::make_pair(filePath, std::list<MiniAudioLib::ma_sound>()));
maSoundMap.insert(std::make_pair(filePath, std::list<MiniAudioLib::ma_sound*>()));
}
maSoundMap[filePath].push_back(sound);
}

// sleep/loop until we're no longer main music, or non-looping sound is stopped/ends
while (mainMusicSound == &sound || MiniAudioLib::ma_sound_is_playing(&sound)) {
while (mainMusicSound == sound || MiniAudioLib::ma_sound_is_playing(sound) || pausedSounds.count(sound) > 0) {
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}

MiniAudioLib::ma_sound_stop(&sound);
MiniAudioLib::ma_sound_uninit(&sound);
MiniAudioLib::ma_sound_stop(sound);
MiniAudioLib::ma_sound_uninit(sound);
std::cout << "Finished playing file: " << filePath << std::endl;

if (!isMainMusic) {
std::lock_guard<std::mutex> lock(activeMusicsMutex);
if (maSoundMap.find(filePath) != maSoundMap.end()) {
maSoundMap[filePath].remove_if(
[&](MiniAudioLib::ma_sound l_sound) { return &sound == &l_sound; });
maSoundMap[filePath].remove(sound);
}
pausedSounds.erase(sound);
}

delete sound;
});

thread.detach();
Expand Down Expand Up @@ -1346,6 +1375,10 @@ void init_common_pc_port_functions(
// Stop all sounds
make_func_symbol_func("stop-all-sounds", (void*)stopAllSounds);

// Pause and resume all sounds
make_func_symbol_func("pause-sound-files", (void*)pauseSoundFiles);
make_func_symbol_func("resume-sound-files", (void*)resumeSoundFiles);

// Main music stuff
make_func_symbol_func("play-main-music", (void*)playMainMusic);
make_func_symbol_func("pause-main-music", (void*)pauseMainMusic);
Expand All @@ -1371,4 +1404,4 @@ void init_common_pc_port_functions(
make_func_symbol_func("pc-screen-shot", (void*)pc_screen_shot);
make_func_symbol_func("pc-register-screen-shot-settings",
(void*)pc_register_screen_shot_settings);
}
}
4 changes: 4 additions & 0 deletions goal_src/jak1/kernel-defs.gc
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,10 @@

(define-extern play-sound-file (function string int symbol))

(define-extern pause-sound-files (function none))

(define-extern resume-sound-files (function none))

(define-extern stop-sound-file (function string none))

(define-extern stop-all-sounds (function none))
Expand Down
4 changes: 3 additions & 1 deletion goal_src/jak2/kernel-defs.gc
Original file line number Diff line number Diff line change
Expand Up @@ -259,14 +259,16 @@
(define-extern pc-init-autosplitter-struct (function none))

;;main music start
(define-extern play-sound-file (function string int symbol))
(define-extern play-main-music (function string int none))
(define-extern pause-main-music (function none))
(define-extern stop-main-music (function none))
(define-extern resume-main-music (function none))
(define-extern main-music-volume (function int none))
;;main music end

(define-extern play-sound-file (function string int symbol))
(define-extern pause-sound-files (function none))
(define-extern resume-sound-files (function none))
(define-extern stop-sound-file (function string none))
(define-extern stop-all-sounds (function none))

Expand Down
2 changes: 2 additions & 0 deletions goal_src/jak3/kernel-defs.gc
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,8 @@
(define-extern main-music-volume (function int none))
;;main music end
(define-extern play-sound-file (function string int symbol))
(define-extern pause-sound-files (function none))
(define-extern resume-sound-files (function none))
(define-extern stop-sound-file (function string none))
(define-extern stop-all-sounds (function none))
(define-extern pc-init-autosplitter-struct (function none))
Expand Down
Binary file modified out/build/Release/bin/decompiler.exe
Binary file not shown.
Binary file modified out/build/Release/bin/extractor.exe
Binary file not shown.
Binary file modified out/build/Release/bin/gk.exe
Binary file not shown.
Binary file modified out/build/Release/bin/goalc.exe
Binary file not shown.