From 25864d1a92793df0bb98bd921968d296eacb531b Mon Sep 17 00:00:00 2001 From: Archez Date: Mon, 15 Apr 2024 23:24:57 -0400 Subject: [PATCH] Add volume slider support (#201) * Add volume slider support * extern fix? --- mm/2s2h/BenGui/BenMenuBar.cpp | 26 ++++++++++++-------------- mm/include/functions.h | 2 ++ mm/include/z64audio.h | 2 ++ mm/src/audio/lib/effects.c | 4 +++- mm/src/audio/lib/playback.c | 2 +- mm/src/audio/sequence.c | 15 +++++++++++++++ mm/src/code/audio_thread_manager.c | 9 +++++---- 7 files changed, 40 insertions(+), 20 deletions(-) diff --git a/mm/2s2h/BenGui/BenMenuBar.cpp b/mm/2s2h/BenGui/BenMenuBar.cpp index ab327ba87..418c30021 100644 --- a/mm/2s2h/BenGui/BenMenuBar.cpp +++ b/mm/2s2h/BenGui/BenMenuBar.cpp @@ -6,21 +6,16 @@ #include "UIWidgets.hpp" #include #include -#include "z64.h" #include "2s2h/Enhancements/Enhancements.h" #include "HudEditor.h" extern bool ShouldClearTextureCacheAtEndOfFrame; -extern "C" PlayState* gPlayState; - -enum SeqPlayers { - /* 0 */ SEQ_BGM_MAIN, - /* 1 */ SEQ_FANFARE, - /* 2 */ SEQ_SFX, - /* 3 */ SEQ_BGM_SUB, - /* 4 */ SEQ_MAX -}; +extern "C" { +#include "z64.h" +#include "functions.h" +extern PlayState* gPlayState; +} static const std::unordered_map textureFilteringMap = { { FILTER_THREE_POINT, "Three-Point" }, @@ -118,16 +113,19 @@ void DrawSettingsMenu() { UIWidgets::CVarSliderFloat("Master Volume: %.0f %%", "gSettings.Audio.MasterVolume", 0.0f, 1.0f, 1.0f, { .showButtons = false, .format = "", .isPercentage = true }); if (UIWidgets::CVarSliderFloat("Main Music Volume: %.0f %%", "gSettings.Audio.MainMusicVolume", 0.0f, 1.0f, 1.0f, { .showButtons = false, .format = "", .isPercentage = true })) { - // Audio_SetGameVolume(SEQ_BGM_MAIN, CVarGetFloat("gSettings.Audio.MainMusicVolume", 1.0f)); + AudioSeq_SetPortVolumeScale(SEQ_PLAYER_BGM_MAIN, CVarGetFloat("gSettings.Audio.MainMusicVolume", 1.0f)); } if (UIWidgets::CVarSliderFloat("Sub Music Volume: %.0f %%", "gSettings.Audio.SubMusicVolume", 0.0f, 1.0f, 1.0f, { .showButtons = false, .format = "", .isPercentage = true })) { - // Audio_SetGameVolume(SEQ_BGM_SUB, CVarGetFloat("gSettings.Audio.SubMusicVolume", 1.0f)); + AudioSeq_SetPortVolumeScale(SEQ_PLAYER_BGM_SUB, CVarGetFloat("gSettings.Audio.SubMusicVolume", 1.0f)); } if (UIWidgets::CVarSliderFloat("Sound Effects Volume: %.0f %%", "gSettings.Audio.SoundEffectsVolume", 0.0f, 1.0f, 1.0f, { .showButtons = false, .format = "", .isPercentage = true })) { - // Audio_SetGameVolume(SEQ_SFX, CVarGetFloat("gSettings.Audio.SoundEffectsVolume", 1.0f)); + AudioSeq_SetPortVolumeScale(SEQ_PLAYER_SFX, CVarGetFloat("gSettings.Audio.SoundEffectsVolume", 1.0f)); } if (UIWidgets::CVarSliderFloat("Fanfare Volume: %.0f %%", "gSettings.Audio.FanfareVolume", 0.0f, 1.0f, 1.0f, { .showButtons = false, .format = "", .isPercentage = true })) { - // Audio_SetGameVolume(SEQ_FANFARE, CVarGetFloat("gSettings.Audio.FanfareVolume", 1.0f)); + AudioSeq_SetPortVolumeScale(SEQ_PLAYER_FANFARE, CVarGetFloat("gSettings.Audio.FanfareVolume", 1.0f)); + } + if (UIWidgets::CVarSliderFloat("Ambience Volume: %.0f %%", "gSettings.Audio.AmbienceVolume", 0.0f, 1.0f, 1.0f, { .showButtons = false, .format = "", .isPercentage = true })) { + AudioSeq_SetPortVolumeScale(SEQ_PLAYER_AMBIENCE, CVarGetFloat("gSettings.Audio.AmbienceVolume", 1.0f)); } auto currentAudioBackend = LUS::Context::GetInstance()->GetAudio()->GetAudioBackend(); diff --git a/mm/include/functions.h b/mm/include/functions.h index 4f9da7113..b4a37ae9e 100644 --- a/mm/include/functions.h +++ b/mm/include/functions.h @@ -1328,6 +1328,8 @@ void PadMgr_ThreadEntry(); void Heaps_Alloc(void); // #endregion // #region 2S2H [Port] New methods added for porting +void AudioSeq_SetPortVolumeScale(u8 seqPlayerIndex, f32 volume); +float AudioSeq_GetPortVolumeScale(u8 seqPlayerIndex); void Graph_OpenDisps(Gfx** dispRefs, Gfx* dispVals, GraphicsContext* gfxCtx, const char* file, s32 line); void Graph_CloseDisps(Gfx** dispRefs, Gfx* dispVals, GraphicsContext* gfxCtx, const char* file, s32 line); void Lights_GlowCheckPrepare(PlayState* play); diff --git a/mm/include/z64audio.h b/mm/include/z64audio.h index 5834c5890..fe315ee3c 100644 --- a/mm/include/z64audio.h +++ b/mm/include/z64audio.h @@ -253,6 +253,8 @@ typedef struct SequencePlayer { /* 0x0E0 */ u32 scriptCounter; /* 0x0E4 */ UNK_TYPE1 unk_E4[0x74]; // unused struct members for sequence/sound font dma management, according to sm64 decomp /* 0x158 */ s8 seqScriptIO[8]; + // #region 2S2H [Port][Audio] + /* */ f32 portVolumeScale; // volume from the sliders in the menubar } SequencePlayer; // size = 0x160 typedef union { diff --git a/mm/src/audio/lib/effects.c b/mm/src/audio/lib/effects.c index 0fd631462..b660cdeb7 100644 --- a/mm/src/audio/lib/effects.c +++ b/mm/src/audio/lib/effects.c @@ -19,7 +19,9 @@ void AudioScript_SequenceChannelProcessSound(SequenceChannel* channel, s32 recal s32 i; if (channel->changes.s.volume || recalculateVolume) { - channelVolume = channel->volume * channel->volumeScale * channel->seqPlayer->appliedFadeVolume; + // 2S2H [Port][Audio] Scale volume by our sequence player volume sliders + channelVolume = channel->volume * channel->volumeScale * channel->seqPlayer->appliedFadeVolume * + channel->seqPlayer->portVolumeScale; if (channel->seqPlayer->muted && (channel->muteFlags & MUTE_FLAGS_SOFTEN)) { channelVolume = channelVolume * channel->seqPlayer->muteVolumeScale; } diff --git a/mm/src/audio/lib/playback.c b/mm/src/audio/lib/playback.c index d947954d2..5d87f22d7 100644 --- a/mm/src/audio/lib/playback.c +++ b/mm/src/audio/lib/playback.c @@ -108,7 +108,7 @@ void AudioPlayback_InitSampleState(Note* note, NoteSampleState* sampleState, Not vel = 0.0f > vel ? 0.0f : vel; vel = 1.0f < vel ? 1.0f : vel; - float master_vol = CVarGetFloat("gGameMasterVolume", 1.0f); + float master_vol = CVarGetFloat("gSettings.Audio.MasterVolume", 1.0f); sampleState->targetVolLeft = (s32)((vel * volLeft) * (0x1000 - 0.001f)) * master_vol; sampleState->targetVolRight = (s32)((vel * volRight) * (0x1000 - 0.001f)) * master_vol; diff --git a/mm/src/audio/sequence.c b/mm/src/audio/sequence.c index 834bb8f0b..a0cf65a10 100644 --- a/mm/src/audio/sequence.c +++ b/mm/src/audio/sequence.c @@ -927,3 +927,18 @@ void AudioSeq_ResetActiveSequencesAndVolume(void) { } AudioSeq_ResetActiveSequences(); } + +// #region 2S2H [Port][Audio] Setter/Getter funcs for controlling the port volume sliders for each sequence player +void AudioSeq_SetPortVolumeScale(u8 seqPlayerIndex, f32 volume) { + if (seqPlayerIndex >= SEQ_PLAYER_MAX) { + return; + } + + gAudioCtx.seqPlayers[seqPlayerIndex].portVolumeScale = volume; + gAudioCtx.seqPlayers[seqPlayerIndex].recalculateVolume = true; +} + +float AudioSeq_GetPortVolumeScale(u8 seqPlayerIndex) { + return gAudioCtx.seqPlayers[seqPlayerIndex].portVolumeScale; +} +// #endregion diff --git a/mm/src/code/audio_thread_manager.c b/mm/src/code/audio_thread_manager.c index ac7ed2e5b..8843f75dd 100644 --- a/mm/src/code/audio_thread_manager.c +++ b/mm/src/code/audio_thread_manager.c @@ -122,10 +122,11 @@ void AudioMgr_Init(AudioMgr* audioMgr, void* stack, OSPri pri, OSId id, SchedCon Audio_InitSound(); osSendMesg(&audioMgr->lockQueue, OS_MESG_PTR(NULL), OS_MESG_BLOCK); - // Audio_SetGameVolume(SEQ_PLAYER_BGM_MAIN, CVarGetFloat("gMainMusicVolume", 1.0f)); - // Audio_SetGameVolume(SEQ_PLAYER_BGM_SUB, CVarGetFloat("gSubMusicVolume", 1.0f)); - // Audio_SetGameVolume(SEQ_PLAYER_FANFARE, CVarGetFloat("gFanfareVolume", 1.0f)); - // Audio_SetGameVolume(SEQ_PLAYER_SFX, CVarGetFloat("gSFXMusicVolume", 1.0f)); + AudioSeq_SetPortVolumeScale(SEQ_PLAYER_BGM_MAIN, CVarGetFloat("gSettings.Audio.MainMusicVolume", 1.0f)); + AudioSeq_SetPortVolumeScale(SEQ_PLAYER_BGM_SUB, CVarGetFloat("gSettings.Audio.SubMusicVolume", 1.0f)); + AudioSeq_SetPortVolumeScale(SEQ_PLAYER_SFX, CVarGetFloat("gSettings.Audio.SoundEffectsVolume", 1.0f)); + AudioSeq_SetPortVolumeScale(SEQ_PLAYER_FANFARE, CVarGetFloat("gSettings.Audio.FanfareVolume", 1.0f)); + AudioSeq_SetPortVolumeScale(SEQ_PLAYER_AMBIENCE, CVarGetFloat("gSettings.Audio.AmbienceVolume", 1.0f)); // osCreateThread(&audioMgr->thread, id, AudioMgr_ThreadEntry, audioMgr, stack, pri); // osStartThread(&audioMgr->thread);