From 1bcfb17f8b9664dbce8d232f291544e7a280bbca Mon Sep 17 00:00:00 2001 From: KiritoDv Date: Sat, 30 Nov 2024 22:46:29 -0600 Subject: [PATCH] Implemented audio sliders --- src/audio/effects.c | 2 +- src/audio/external.c | 5 ++ src/audio/external.h | 2 + src/audio/internal.h | 1 + src/audio/load.c | 6 +++ src/audio/playback.c | 4 ++ src/port/ui/ImguiUI.cpp | 110 ++++++++++++++++++++-------------------- 7 files changed, 74 insertions(+), 56 deletions(-) diff --git a/src/audio/effects.c b/src/audio/effects.c index 4a5c2dcc3..822ca29be 100644 --- a/src/audio/effects.c +++ b/src/audio/effects.c @@ -12,7 +12,7 @@ void sequence_channel_process_sound(struct SequenceChannel* seqChannel, s32 reca s32 i; if (seqChannel->changes.as_bitfields.volume || recalculateVolume) { - channelVolume = seqChannel->volume * seqChannel->volumeScale * seqChannel->seqPlayer->appliedFadeVolume; + channelVolume = (seqChannel->volume * (seqChannel->volumeScale * seqChannel->seqPlayer->fadeVolume)) * seqChannel->seqPlayer->gameVolume; if (seqChannel->seqPlayer->muted && (seqChannel->muteBehavior & MUTE_BEHAVIOR_SOFTEN) != 0) { channelVolume = seqChannel->seqPlayer->muteVolumeScale * channelVolume; } diff --git a/src/audio/external.c b/src/audio/external.c index 032e25c19..e840e478d 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -3547,6 +3547,11 @@ void func_800CB14C() { } } +void audio_set_player_volume(u8 player, f32 volume) { + gSequencePlayers[player].gameVolume = volume; + gSequencePlayers[player].recalculateVolume = 1; +} + // run audio? void func_800CB2C4() { func_800C1F8C(); diff --git a/src/audio/external.h b/src/audio/external.h index f09f456ed..01022cd8f 100644 --- a/src/audio/external.h +++ b/src/audio/external.h @@ -322,6 +322,8 @@ void func_800CB14C(void); void func_800CB2C4(void); void func_800CBC24(void); +extern void audio_set_player_volume(u8 player, f32 volume); + // This is some from other file, its definitely not part of audio's data/bss extern s8 D_801657E5; diff --git a/src/audio/internal.h b/src/audio/internal.h index 9b7fb37b4..8d0dfbc17 100644 --- a/src/audio/internal.h +++ b/src/audio/internal.h @@ -228,6 +228,7 @@ struct SequencePlayer { /*0x130, 0x13C*/ u8* bankDmaCurrMemAddr; /*0x138, 0x140*/ uintptr_t bankDmaCurrDevAddr; /*0x13C, 0x144*/ size_t bankDmaRemaining; + f32 gameVolume; }; // size = 0x140, 0x148 on EU, 0x14C on SH struct AdsrSettings { diff --git a/src/audio/load.c b/src/audio/load.c index 0a3a15536..4ed6ed5a4 100644 --- a/src/audio/load.c +++ b/src/audio/load.c @@ -5,6 +5,7 @@ #include "audio/data.h" #include "audio/heap.h" #include "audio/internal.h" +#include "audio/external.h" #include "audio/playback.h" #include "audio/synthesis.h" #include "audio/seqplayer.h" @@ -803,6 +804,11 @@ void audio_init(void) { sound_alloc_pool_init(&gUnkPool1.pool, soundAlloc(&gAudioInitPool, (u32) D_800EA5D8), (u32) D_800EA5D8); init_sequence_players(); gAudioLoadLock = 0x76557364; + + audio_set_player_volume(SEQ_PLAYER_LEVEL, CVarGetFloat("gMainMusicVolume", 1.0f)); + audio_set_player_volume(SEQ_PLAYER_ENV, CVarGetFloat("gEnvironmentVolume", 1.0f)); + audio_set_player_volume(SEQ_PLAYER_SFX, CVarGetFloat("gSFXMusicVolume", 1.0f)); + } #else #ifdef VERSION_EU diff --git a/src/audio/playback.c b/src/audio/playback.c index 671a38260..30dcb388d 100644 --- a/src/audio/playback.c +++ b/src/audio/playback.c @@ -71,6 +71,10 @@ void note_set_vel_pan_reverb(struct Note* note, f32 velocity, u8 pan, u8 reverbV velocity = 1.0f; } + float master_vol = CVarGetFloat("gGameMasterVolume", 1.0f); + volLeft *= master_vol; + volRight *= master_vol; + sub->targetVolLeft = ((s32) (velocity * volLeft * 4095.999f)); sub->targetVolRight = ((s32) (velocity * volRight * 4095.999f)); diff --git a/src/port/ui/ImguiUI.cpp b/src/port/ui/ImguiUI.cpp index 2284346bb..95d862a83 100644 --- a/src/port/ui/ImguiUI.cpp +++ b/src/port/ui/ImguiUI.cpp @@ -18,6 +18,7 @@ extern "C" { extern s32 gGamestateNext; extern s32 gMenuSelection; + #include "audio/external.h" #include "defines.h" } @@ -125,61 +126,60 @@ static const char* filters[3] = { void DrawSettingsMenu() { if (UIWidgets::BeginMenu("Settings")) { - // if (UIWidgets::BeginMenu("Audio")) { - // UIWidgets::CVarSliderFloat("Master Volume", "gGameMasterVolume", 0.0f, 1.0f, 1.0f, { - // .format = "%.0f%%", - // .isPercentage = true, - // }); - // if (UIWidgets::CVarSliderFloat("Main Music Volume", "gMainMusicVolume", 0.0f, 1.0f, 1.0f, - // { - // .format = "%.0f%%", - // .isPercentage = true, - // })) { - // audio_set_player_volume(SEQ_PLAYER_LEVEL, CVarGetFloat("gMainMusicVolume", 1.0f)); - // } - // if (UIWidgets::CVarSliderFloat("Sound Effects Volume", "gSFXMusicVolume", - // 0.0f, 1.0f, 1.0f, { - // .format = "%.0f%%", - // .isPercentage = true, - // })) { - // audio_set_player_volume(SEQ_PLAYER_SFX, CVarGetFloat("gSFXMusicVolume", 1.0f)); - // } - // if (UIWidgets::CVarSliderFloat("Environment Volume", "gEnvironmentVolume", - // 0.0f, 1.0f, 1.0f, { - // .format = "%.0f%%", - // .isPercentage = true, - // })) { - // audio_set_player_volume(SEQ_PLAYER_ENV, CVarGetFloat("gEnvironmentVolume", 1.0f)); - // } - // - // static std::unordered_map audioBackendNames = { - // { Ship::AudioBackend::WASAPI, "Windows Audio Session API" }, - // { Ship::AudioBackend::PULSE, "PulseAudio" }, - // { Ship::AudioBackend::SDL, "SDL" }, - // }; - // - // ImGui::Text("Audio API (Needs reload)"); - // auto currentAudioBackend = Ship::Context::GetInstance()->GetAudio()->GetAudioBackend(); - // - // if (Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { - // UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); - // } - // if (ImGui::BeginCombo("##AApi", audioBackendNames[currentAudioBackend])) { - // for (uint8_t i = 0; i < - // Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size(); i++) { - // auto backend = Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->data()[i]; - // if (ImGui::Selectable(audioBackendNames[backend], backend == currentAudioBackend)) { - // Ship::Context::GetInstance()->GetAudio()->SetAudioBackend(backend); - // } - // } - // ImGui::EndCombo(); - // } - // if (Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { - // UIWidgets::ReEnableComponent(""); - // } - // - // ImGui::EndMenu(); - // } + if (UIWidgets::BeginMenu("Audio")) { + UIWidgets::CVarSliderFloat("Master Volume", "gGameMasterVolume", 0.0f, 1.0f, 1.0f, { + .format = "%.0f%%", + .isPercentage = true, + }); + if (UIWidgets::CVarSliderFloat("Main Music Volume", "gMainMusicVolume", 0.0f, 1.0f, 1.0f, + { + .format = "%.0f%%", + .isPercentage = true, + })) { + audio_set_player_volume(SEQ_PLAYER_LEVEL, CVarGetFloat("gMainMusicVolume", 1.0f)); + } + if (UIWidgets::CVarSliderFloat("Sound Effects Volume", "gSFXMusicVolume", + 0.0f, 1.0f, 1.0f, { + .format = "%.0f%%", + .isPercentage = true, + })) { + audio_set_player_volume(SEQ_PLAYER_SFX, CVarGetFloat("gSFXMusicVolume", 1.0f)); + } + if (UIWidgets::CVarSliderFloat("Environment Volume", "gEnvironmentVolume", + 0.0f, 1.0f, 1.0f, { + .format = "%.0f%%", + .isPercentage = true, + })) { + audio_set_player_volume(SEQ_PLAYER_ENV, CVarGetFloat("gEnvironmentVolume", 1.0f)); + } + + static std::unordered_map audioBackendNames = { + { Ship::AudioBackend::WASAPI, "Windows Audio Session API" }, + { Ship::AudioBackend::SDL, "SDL" }, + }; + + ImGui::Text("Audio API (Needs reload)"); + auto currentAudioBackend = Ship::Context::GetInstance()->GetAudio()->GetCurrentAudioBackend(); + + if (Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { + UIWidgets::DisableComponent(ImGui::GetStyle().Alpha * 0.5f); + } + if (ImGui::BeginCombo("##AApi", audioBackendNames[currentAudioBackend])) { + for (uint8_t i = 0; i < + Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size(); i++) { + auto backend = Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->data()[i]; + if (ImGui::Selectable(audioBackendNames[backend], backend == currentAudioBackend)) { + Ship::Context::GetInstance()->GetAudio()->SetCurrentAudioBackend(backend); + } + } + ImGui::EndCombo(); + } + if (Ship::Context::GetInstance()->GetAudio()->GetAvailableAudioBackends()->size() <= 1) { + UIWidgets::ReEnableComponent(""); + } + + ImGui::EndMenu(); + } UIWidgets::Spacer(0);