mirror of
https://github.com/open-goal/jak-project
synced 2026-07-10 07:07:04 -04:00
[jak2] Fix unicode issue with GAME.CGO load (#3254)
Fix for https://github.com/open-goal/jak-project/issues/3244
This commit is contained in:
@@ -70,7 +70,7 @@ void load_and_link_dgo_from_c_fast(const char* name,
|
||||
// open the DGO file:
|
||||
auto file_path = file_util::get_jak_project_dir() / "out" / game_version_names[g_game_version] /
|
||||
"iso" / name_on_cd;
|
||||
auto fp = fopen(file_path.string().c_str(), "rb");
|
||||
auto fp = file_util::open_file(file_path, "rb");
|
||||
if (!fp) {
|
||||
lg::die("Failed to open DGO: {}, path {}\n", name, file_path.string());
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#include "srpc.h"
|
||||
|
||||
#include <cstring>
|
||||
|
||||
#include "game/sound/sndshim.h"
|
||||
|
||||
// added
|
||||
|
||||
+1
-1
@@ -235,7 +235,7 @@ void ee_runner(SystemThreadInterface& iface) {
|
||||
void ee_worker_runner(SystemThreadInterface& iface) {
|
||||
iface.initialization_complete();
|
||||
while (!iface.get_want_exit()) {
|
||||
const auto queues_weres_empty = g_background_worker.process_queues();
|
||||
const auto queues_weres_empty = !g_background_worker.process_queues();
|
||||
if (queues_weres_empty) {
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(50));
|
||||
}
|
||||
|
||||
@@ -13,11 +13,11 @@ u64 SoundFlavaHack = 0;
|
||||
u8 GlobalExcite = 0;
|
||||
|
||||
AmeHandler::AmeHandler(MultiMidi* block,
|
||||
VoiceManager& vm,
|
||||
MusicBank::MIDISound& sound,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SoundBank& bank)
|
||||
VoiceManager& vm,
|
||||
MusicBank::MIDISound& sound,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SoundBank& bank)
|
||||
: m_sound(sound), m_bank(bank), m_header(block), m_vm(vm), m_repeats(sound.Repeats) {
|
||||
if (vol == VOLUME_DONT_CHANGE) {
|
||||
vol = 1024;
|
||||
@@ -59,7 +59,7 @@ void AmeHandler::StartSegment(u32 id) {
|
||||
u32 type = (midi.SoundHandle >> 24) & 0xf;
|
||||
if (type == 1 || type == 3) {
|
||||
m_midis.emplace(id, std::make_unique<MidiHandler>(static_cast<Midi*>(&midi), m_vm, m_sound,
|
||||
m_vol, m_pan, m_bank, this));
|
||||
m_vol, m_pan, m_bank, this));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,9 +5,9 @@
|
||||
|
||||
#include "loader.h"
|
||||
#include "midi_handler.h"
|
||||
#include "musicbank.h"
|
||||
#include "sound_handler.h"
|
||||
#include "vagvoice.h"
|
||||
#include "musicbank.h"
|
||||
|
||||
#include "common/common_types.h"
|
||||
|
||||
@@ -24,11 +24,11 @@ class AmeHandler : public SoundHandler {
|
||||
|
||||
public:
|
||||
AmeHandler(MultiMidi* block,
|
||||
VoiceManager& vm,
|
||||
MusicBank::MIDISound& sound,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SoundBank& bank);
|
||||
VoiceManager& vm,
|
||||
MusicBank::MIDISound& sound,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SoundBank& bank);
|
||||
bool Tick() override;
|
||||
SoundBank& Bank() override { return m_bank; };
|
||||
|
||||
|
||||
@@ -11,11 +11,11 @@ namespace snd {
|
||||
std::array<s8, 32> g_block_reg{};
|
||||
|
||||
BlockSoundHandler::BlockSoundHandler(SoundBank& bank,
|
||||
SFXBlock::SFX& sfx,
|
||||
VoiceManager& vm,
|
||||
s32 sfx_vol,
|
||||
s32 sfx_pan,
|
||||
SndPlayParams& params)
|
||||
SFXBlock::SFX& sfx,
|
||||
VoiceManager& vm,
|
||||
s32 sfx_vol,
|
||||
s32 sfx_pan,
|
||||
SndPlayParams& params)
|
||||
: m_group(sfx.VolGroup), m_sfx(sfx), m_vm(vm), m_bank(bank) {
|
||||
s32 vol, pan, pitch_mod, pitch_bend;
|
||||
if (sfx_vol == -1) {
|
||||
|
||||
@@ -23,11 +23,11 @@ namespace snd {
|
||||
*/
|
||||
|
||||
MidiHandler::MidiHandler(Midi* block,
|
||||
VoiceManager& vm,
|
||||
MusicBank::MIDISound& sound,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SoundBank& bank)
|
||||
VoiceManager& vm,
|
||||
MusicBank::MIDISound& sound,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SoundBank& bank)
|
||||
: m_sound(sound), m_repeats(sound.Repeats), m_bank(bank), m_header(block), m_vm(vm) {
|
||||
if (vol == VOLUME_DONT_CHANGE) {
|
||||
vol = 1024;
|
||||
@@ -48,12 +48,12 @@ MidiHandler::MidiHandler(Midi* block,
|
||||
}
|
||||
|
||||
MidiHandler::MidiHandler(Midi* block,
|
||||
VoiceManager& vm,
|
||||
MusicBank::MIDISound& sound,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SoundBank& bank,
|
||||
std::optional<AmeHandler*> parent)
|
||||
VoiceManager& vm,
|
||||
MusicBank::MIDISound& sound,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SoundBank& bank,
|
||||
std::optional<AmeHandler*> parent)
|
||||
: m_parent(parent),
|
||||
m_sound(sound),
|
||||
m_vol(vol),
|
||||
@@ -163,7 +163,7 @@ void MidiHandler::SetVolPan(s32 vol, s32 pan) {
|
||||
|
||||
voice->basevol =
|
||||
m_vm.MakeVolumeB(m_vol, voice->velocity * m_chanvol[voice->channel] / 127, pan,
|
||||
voice->prog.Vol, voice->prog.Pan, voice->tone.Vol, voice->tone.Pan);
|
||||
voice->prog.Vol, voice->prog.Pan, voice->tone.Vol, voice->tone.Pan);
|
||||
|
||||
auto left = m_vm.AdjustVolToGroup(voice->basevol.left, voice->group);
|
||||
auto right = m_vm.AdjustVolToGroup(voice->basevol.right, voice->group);
|
||||
@@ -232,7 +232,7 @@ void MidiHandler::NoteOn() {
|
||||
|
||||
auto voice = std::make_shared<midi_voice>(t, program);
|
||||
voice->basevol = m_vm.MakeVolumeB(m_vol, (velocity * m_chanvol[channel]) / 0x7f, pan,
|
||||
program.Vol, program.Pan, t.Vol, t.Pan);
|
||||
program.Vol, program.Pan, t.Vol, t.Pan);
|
||||
|
||||
voice->note = note;
|
||||
voice->channel = channel;
|
||||
|
||||
@@ -30,19 +30,19 @@ class AmeHandler;
|
||||
class MidiHandler : public SoundHandler {
|
||||
public:
|
||||
MidiHandler(Midi* block,
|
||||
VoiceManager& vm,
|
||||
MusicBank::MIDISound& sound,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SoundBank& bank);
|
||||
VoiceManager& vm,
|
||||
MusicBank::MIDISound& sound,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SoundBank& bank);
|
||||
|
||||
MidiHandler(Midi* block,
|
||||
VoiceManager& vm,
|
||||
MusicBank::MIDISound& sound,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SoundBank& bank,
|
||||
std::optional<AmeHandler*> parent);
|
||||
VoiceManager& vm,
|
||||
MusicBank::MIDISound& sound,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SoundBank& bank,
|
||||
std::optional<AmeHandler*> parent);
|
||||
|
||||
~MidiHandler() override {
|
||||
for (auto& p : m_voices) {
|
||||
|
||||
@@ -8,11 +8,11 @@
|
||||
namespace snd {
|
||||
|
||||
std::optional<std::unique_ptr<SoundHandler>> MusicBank::MakeHandler(VoiceManager& vm,
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
s32 pm,
|
||||
s32 pb) {
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
s32 pm,
|
||||
s32 pb) {
|
||||
auto& sound = Sounds[sound_id];
|
||||
|
||||
// FIXME: global midi list
|
||||
@@ -39,10 +39,10 @@ std::optional<std::unique_ptr<SoundHandler>> MusicBank::MakeHandler(VoiceManager
|
||||
}
|
||||
|
||||
std::optional<std::unique_ptr<SoundHandler>> MusicBank::MakeHandler(VoiceManager& vm,
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SndPlayParams& params) {
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SndPlayParams& params) {
|
||||
return std::nullopt;
|
||||
}
|
||||
|
||||
|
||||
@@ -68,16 +68,16 @@ class MusicBank : public SoundBank {
|
||||
nonstd::span<u8> midi_data);
|
||||
|
||||
std::optional<std::unique_ptr<SoundHandler>> MakeHandler(VoiceManager& vm,
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
s32 pm,
|
||||
s32 pb) override;
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
s32 pm,
|
||||
s32 pb) override;
|
||||
|
||||
std::optional<std::unique_ptr<SoundHandler>> MakeHandler(VoiceManager& vm,
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SndPlayParams& params) override;
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SndPlayParams& params) override;
|
||||
};
|
||||
} // namespace snd
|
||||
|
||||
@@ -55,8 +55,8 @@ void Player::InitCubeb() {
|
||||
return;
|
||||
}
|
||||
|
||||
err = cubeb_stream_init(mCtx, &mStream, "OpenGOAL", nullptr, nullptr, nullptr, &outparam,
|
||||
latency, &sound_callback, &state_callback, this);
|
||||
err = cubeb_stream_init(mCtx, &mStream, "OpenGOAL", nullptr, nullptr, nullptr, &outparam, latency,
|
||||
&sound_callback, &state_callback, this);
|
||||
if (err != CUBEB_OK) {
|
||||
lg::error("Cubeb init failed");
|
||||
return;
|
||||
@@ -150,12 +150,12 @@ u32 Player::PlaySound(BankHandle bank_id, u32 sound_id, s32 vol, s32 pan, s32 pm
|
||||
}
|
||||
|
||||
u32 Player::PlaySoundByName(BankHandle bank_id,
|
||||
char* bank_name,
|
||||
char* sound_name,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
s32 pm,
|
||||
s32 pb) {
|
||||
char* bank_name,
|
||||
char* sound_name,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
s32 pm,
|
||||
s32 pb) {
|
||||
std::scoped_lock lock(mTickLock);
|
||||
SoundBank* bank = nullptr;
|
||||
if (bank_id == 0 && bank_name != nullptr) {
|
||||
@@ -331,10 +331,10 @@ void Player::StopAllSounds() {
|
||||
}
|
||||
|
||||
s32 Player::GetSoundUserData(BankHandle block_handle,
|
||||
char* block_name,
|
||||
s32 sound_id,
|
||||
char* sound_name,
|
||||
SFXUserData* dst) {
|
||||
char* block_name,
|
||||
s32 sound_id,
|
||||
char* sound_name,
|
||||
SFXUserData* dst) {
|
||||
std::scoped_lock lock(mTickLock);
|
||||
SoundBank* bank = nullptr;
|
||||
if (block_handle == nullptr && block_name != nullptr) {
|
||||
|
||||
+10
-10
@@ -36,12 +36,12 @@ class Player {
|
||||
|
||||
u32 PlaySound(BankHandle bank, u32 sound, s32 vol, s32 pan, s32 pm, s32 pb);
|
||||
u32 PlaySoundByName(BankHandle bank,
|
||||
char* bank_name,
|
||||
char* sound_name,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
s32 pm,
|
||||
s32 pb);
|
||||
char* bank_name,
|
||||
char* sound_name,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
s32 pm,
|
||||
s32 pb);
|
||||
void SetSoundReg(u32 sound_id, u8 reg, u8 value);
|
||||
void SetGlobalExcite(u8 value) { GlobalExcite = value; };
|
||||
bool SoundStillActive(u32 sound_id);
|
||||
@@ -62,10 +62,10 @@ class Player {
|
||||
s32 GetTick() { return mTick; };
|
||||
void StopAllSounds();
|
||||
s32 GetSoundUserData(BankHandle block_handle,
|
||||
char* block_name,
|
||||
s32 sound_id,
|
||||
char* sound_name,
|
||||
SFXUserData* dst);
|
||||
char* block_name,
|
||||
s32 sound_id,
|
||||
char* sound_name,
|
||||
SFXUserData* dst);
|
||||
|
||||
private:
|
||||
std::recursive_mutex mTickLock; // TODO does not need to recursive with some light restructuring
|
||||
|
||||
@@ -8,10 +8,10 @@
|
||||
namespace snd {
|
||||
|
||||
std::optional<std::unique_ptr<SoundHandler>> SFXBlock::MakeHandler(VoiceManager& vm,
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SndPlayParams& params) {
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SndPlayParams& params) {
|
||||
auto& SFX = Sounds[sound_id];
|
||||
|
||||
if (SFX.Grains.empty()) {
|
||||
|
||||
@@ -49,10 +49,10 @@ class SFXBlock : public SoundBank {
|
||||
static SFXBlock* ReadBlock(nonstd::span<u8> bank_data, nonstd::span<u8> samples);
|
||||
|
||||
std::optional<std::unique_ptr<SoundHandler>> MakeHandler(VoiceManager& vm,
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SndPlayParams& params) override;
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SndPlayParams& params) override;
|
||||
|
||||
std::optional<std::string_view> GetName() override { return Name; };
|
||||
std::optional<u32> GetSoundByName(const char* name) override;
|
||||
|
||||
@@ -69,7 +69,7 @@ int main(int argc, char* argv[]) {
|
||||
printf("invalid args\n");
|
||||
} else {
|
||||
player.SetSoundReg(std::atoi(parts[1].c_str()), std::atoi(parts[2].c_str()),
|
||||
std::atoi(parts[3].c_str()));
|
||||
std::atoi(parts[3].c_str()));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -54,11 +54,11 @@ class SoundBank {
|
||||
s8 BankNum;
|
||||
|
||||
virtual std::optional<std::unique_ptr<SoundHandler>> MakeHandler(VoiceManager& vm,
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
s32 pm,
|
||||
s32 pb) {
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
s32 pm,
|
||||
s32 pb) {
|
||||
SndPlayParams params{};
|
||||
params.vol = vol;
|
||||
params.pan = pan;
|
||||
@@ -69,10 +69,10 @@ class SoundBank {
|
||||
};
|
||||
|
||||
virtual std::optional<std::unique_ptr<SoundHandler>> MakeHandler(VoiceManager& vm,
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SndPlayParams& params) = 0;
|
||||
u32 sound_id,
|
||||
s32 vol,
|
||||
s32 pan,
|
||||
SndPlayParams& params) = 0;
|
||||
|
||||
virtual std::optional<std::string_view> GetName() { return std::nullopt; };
|
||||
virtual std::optional<u32> GetSoundByName(const char* /*name*/) { return std::nullopt; };
|
||||
|
||||
@@ -98,12 +98,12 @@ VolPair VoiceManager::MakeVolume(int vol1, int pan1, int vol2, int pan2, int vol
|
||||
}
|
||||
|
||||
VolPair VoiceManager::MakeVolumeB(int sound_vol,
|
||||
int velocity_volume,
|
||||
int pan,
|
||||
int prog_vol,
|
||||
int prog_pan,
|
||||
int tone_vol,
|
||||
int tone_pan) {
|
||||
int velocity_volume,
|
||||
int pan,
|
||||
int prog_vol,
|
||||
int prog_pan,
|
||||
int tone_vol,
|
||||
int tone_pan) {
|
||||
// Scale up as close as we can to max positive 16bit volume
|
||||
// I'd have just used shifting but I guess this does get closer
|
||||
|
||||
|
||||
@@ -57,12 +57,12 @@ class VoiceManager {
|
||||
|
||||
// This is super silly, but it's what 989snd does
|
||||
VolPair MakeVolumeB(int sound_vol,
|
||||
int velocity_volume,
|
||||
int pan,
|
||||
int prog_vol,
|
||||
int prog_pan,
|
||||
int tone_vol,
|
||||
int tone_pan);
|
||||
int velocity_volume,
|
||||
int pan,
|
||||
int prog_vol,
|
||||
int prog_pan,
|
||||
int tone_vol,
|
||||
int tone_pan);
|
||||
|
||||
void SetMasterVol(u8 group, s32 volume);
|
||||
void SetPlaybackMode(s32 mode) { mStereoOrMono = mode; }
|
||||
|
||||
@@ -167,7 +167,7 @@ s32 snd_PlaySoundByNameVolPanPMPB(snd::BankHandle bank_handle,
|
||||
s32 pitch_bend) {
|
||||
if (player) {
|
||||
return player->PlaySoundByName(bank_handle, bank_name, sound_name, vol, pan, pitch_mod,
|
||||
pitch_bend);
|
||||
pitch_bend);
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
@@ -248,7 +248,7 @@ s32 snd_GetSoundUserData(snd::BankHandle block_handle,
|
||||
SFXUserData* dst) {
|
||||
if (player) {
|
||||
return player->GetSoundUserData(block_handle, block_name, sound_id, sound_name,
|
||||
(snd::SFXUserData*)dst);
|
||||
(snd::SFXUserData*)dst);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user