Add volume slider support (#201)

* Add volume slider support

* extern fix?
This commit is contained in:
Archez
2024-05-22 09:05:01 -05:00
committed by Garrett Cox
parent d8c2361986
commit 25864d1a92
7 changed files with 40 additions and 20 deletions
+12 -14
View File
@@ -6,21 +6,16 @@
#include "UIWidgets.hpp"
#include <unordered_map>
#include <string>
#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<int32_t, const char*> 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();
+2
View File
@@ -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);
+2
View File
@@ -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 {
+3 -1
View File
@@ -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;
}
+1 -1
View File
@@ -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;
+15
View File
@@ -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
+5 -4
View File
@@ -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);