summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorKiritoDv <kiritodev01@gmail.com>2024-11-30 22:46:29 -0600
committerKiritoDv <kiritodev01@gmail.com>2024-11-30 22:46:29 -0600
commit1bcfb17f8b9664dbce8d232f291544e7a280bbca (patch)
tree8d7aaaa4d8e752f38a7822bd2c9edc16d2f996e1 /src
parent5e2c338fc7de5dbeb7248bf54a13d96354922753 (diff)
Implemented audio sliders
Diffstat (limited to 'src')
-rw-r--r--src/audio/effects.c2
-rw-r--r--src/audio/external.c5
-rw-r--r--src/audio/external.h2
-rw-r--r--src/audio/internal.h1
-rw-r--r--src/audio/load.c6
-rw-r--r--src/audio/playback.c4
-rw-r--r--src/port/ui/ImguiUI.cpp110
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<Ship::AudioBackend, const char*> 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<Ship::AudioBackend, const char*> 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);