mirror of
https://github.com/open-goal/jak-project.git
synced 2024-10-20 21:27:52 -04:00
199 lines
4.7 KiB
C++
199 lines
4.7 KiB
C++
#include "iso_api.h"
|
|
#include "game/overlord/srpc.h"
|
|
#include "game/sce/iop.h"
|
|
#include "common/log/log.h"
|
|
#include "sbank.h"
|
|
#include "common/util/Assert.h"
|
|
#include "iso_queue.h"
|
|
|
|
using namespace iop;
|
|
|
|
/*!
|
|
* Load a File to IOP memory (blocking)
|
|
*/
|
|
s32 LoadISOFileToIOP(FileRecord* file, void* addr, uint32_t length) {
|
|
lg::debug("[OVERLORD] LoadISOFileToIOP {}, {}/{} bytes", file->name, length, (s32)file->size);
|
|
IsoCommandLoadSingle cmd;
|
|
cmd.cmd_id = LOAD_TO_IOP_CMD_ID;
|
|
cmd.messagebox_to_reply = 0;
|
|
cmd.thread_id = GetThreadId();
|
|
cmd.file_record = file;
|
|
cmd.dest_addr = (u8*)addr;
|
|
cmd.length = length;
|
|
SendMbx(iso_mbx, &cmd);
|
|
SleepThread();
|
|
|
|
if (cmd.status) {
|
|
cmd.length_to_copy = 0;
|
|
}
|
|
|
|
return cmd.length_to_copy;
|
|
}
|
|
|
|
/*!
|
|
* Load a File to IOP memory (blocking)
|
|
*/
|
|
s32 LoadISOFileToEE(FileRecord* file, uint32_t addr, uint32_t length) {
|
|
lg::debug("[OVERLORD] LoadISOFileToEE {}, {}/{} bytes", file->name, length, (s32)file->size);
|
|
IsoCommandLoadSingle cmd;
|
|
cmd.cmd_id = LOAD_TO_EE_CMD_ID;
|
|
cmd.messagebox_to_reply = 0;
|
|
cmd.thread_id = GetThreadId();
|
|
cmd.file_record = file;
|
|
cmd.dest_addr = (u8*)(u64)addr;
|
|
cmd.length = length;
|
|
SendMbx(iso_mbx, &cmd);
|
|
SleepThread();
|
|
|
|
if (cmd.status) {
|
|
cmd.length_to_copy = 0;
|
|
}
|
|
|
|
return cmd.length_to_copy;
|
|
}
|
|
|
|
s32 LoadISOFileChunkToEE(FileRecord* file, uint32_t dest_addr, uint32_t length, uint32_t offset) {
|
|
lg::debug("[OVERLORD] LoadISOFileChunkToEE {} : {} offset {}\n", file->name, length, offset);
|
|
IsoCommandLoadSingle cmd;
|
|
cmd.cmd_id = LOAD_TO_EE_OFFSET_CMD_ID;
|
|
cmd.messagebox_to_reply = 0;
|
|
cmd.thread_id = GetThreadId();
|
|
cmd.file_record = file;
|
|
cmd.dest_addr = (u8*)(u64)dest_addr;
|
|
cmd.length = length;
|
|
cmd.offset = offset;
|
|
SendMbx(iso_mbx, &cmd);
|
|
SleepThread();
|
|
if (cmd.status) {
|
|
cmd.length_to_copy = 0;
|
|
}
|
|
return cmd.length_to_copy;
|
|
}
|
|
|
|
/*!
|
|
* Send a command to the ISO thread to load a sound bank. This will sleep the calling thread
|
|
* until the load has completed.
|
|
*/
|
|
void LoadSoundBank(const char* bank_name, SoundBank* bank) {
|
|
(void)bank;
|
|
ASSERT(strlen(bank_name) < 16);
|
|
SoundBankLoadCommand cmd;
|
|
cmd.cmd_id = LOAD_SOUND_BANK;
|
|
cmd.messagebox_to_reply = 0;
|
|
cmd.thread_id = GetThreadId();
|
|
strcpy(cmd.bank_name, bank_name);
|
|
cmd.bank = bank;
|
|
SendMbx(iso_mbx, &cmd);
|
|
SleepThread(); // wait for finish.
|
|
}
|
|
|
|
void LoadMusic(const char* music_name, s32* bank) {
|
|
ASSERT(strlen(music_name) < 16);
|
|
MusicLoadCommand cmd;
|
|
cmd.cmd_id = LOAD_MUSIC;
|
|
cmd.messagebox_to_reply = 0;
|
|
cmd.thread_id = GetThreadId();
|
|
strcpy(cmd.music_name, music_name);
|
|
cmd.music_handle = bank;
|
|
SendMbx(iso_mbx, &cmd);
|
|
SleepThread();
|
|
|
|
for (u32 i = 0; i < gMusicTweakInfo.TweakCount; i++) {
|
|
if (!strcmp(gMusicTweakInfo.MusicTweak[i].MusicName, music_name)) {
|
|
gMusicTweak = gMusicTweakInfo.MusicTweak[i].VolumeAdjust;
|
|
return;
|
|
}
|
|
}
|
|
|
|
gMusicTweak = 0x80;
|
|
}
|
|
|
|
void QueueVAGStream(FileRecord* file, VagDirEntry* vag, u32 sound_id, u32 priority) {
|
|
if (vag == nullptr) {
|
|
return;
|
|
}
|
|
|
|
auto* cmd = GetVAGCommand();
|
|
cmd->cmd_id = QUEUE_VAG_STREAM;
|
|
cmd->messagebox_to_reply = 0;
|
|
cmd->thread_id = 0;
|
|
cmd->file = file;
|
|
cmd->vag = vag;
|
|
cmd->sound_id = sound_id;
|
|
cmd->priority = priority;
|
|
cmd->positioned = 0;
|
|
|
|
SendMbx(iso_mbx, cmd);
|
|
}
|
|
|
|
void PlayVAGStream(FileRecord* file,
|
|
VagDirEntry* vag,
|
|
u32 sound_id,
|
|
s32 volume,
|
|
u32 priority,
|
|
Vec3w* trans) {
|
|
auto cmd = GetVAGCommand();
|
|
cmd->cmd_id = PLAY_VAG_STREAM;
|
|
cmd->messagebox_to_reply = 0;
|
|
cmd->thread_id = 0;
|
|
cmd->file = file;
|
|
cmd->vag = vag;
|
|
cmd->sound_id = sound_id;
|
|
cmd->volume = volume;
|
|
cmd->priority = priority;
|
|
|
|
if (trans) {
|
|
cmd->trans = *trans;
|
|
cmd->positioned = 1;
|
|
} else {
|
|
cmd->positioned = 0;
|
|
}
|
|
|
|
SendMbx(iso_mbx, cmd);
|
|
}
|
|
|
|
void SetVAGStreamVolume(s32 volume) {
|
|
auto cmd = GetVAGCommand();
|
|
cmd->cmd_id = 1029;
|
|
cmd->messagebox_to_reply = 0;
|
|
cmd->thread_id = 0;
|
|
cmd->volume = volume;
|
|
SendMbx(iso_mbx, cmd);
|
|
}
|
|
|
|
void SetDialogVolume(s32 volume) {
|
|
auto cmd = GetVAGCommand();
|
|
cmd->cmd_id = 1030;
|
|
cmd->messagebox_to_reply = 0;
|
|
cmd->thread_id = 0;
|
|
cmd->volume = volume;
|
|
SendMbx(iso_mbx, cmd);
|
|
}
|
|
|
|
void StopVAGStream(VagDirEntry* vag, u32 priority) {
|
|
auto cmd = GetVAGCommand();
|
|
cmd->cmd_id = STOP_VAG_STREAM;
|
|
cmd->messagebox_to_reply = 0;
|
|
cmd->thread_id = 0;
|
|
cmd->vag = vag;
|
|
cmd->priority = priority;
|
|
|
|
SendMbx(iso_mbx, cmd);
|
|
}
|
|
|
|
void PauseVAGStream() {
|
|
auto cmd = GetVAGCommand();
|
|
cmd->cmd_id = 1027;
|
|
cmd->messagebox_to_reply = 0;
|
|
cmd->thread_id = 0;
|
|
SendMbx(iso_mbx, cmd);
|
|
}
|
|
|
|
void UnpauseVAGStream() {
|
|
auto cmd = GetVAGCommand();
|
|
cmd->cmd_id = 1028;
|
|
cmd->messagebox_to_reply = 0;
|
|
cmd->thread_id = 0;
|
|
SendMbx(iso_mbx, cmd);
|
|
}
|