From 49dc1e34953aa031e83b84a965aff7a4cd819a7d Mon Sep 17 00:00:00 2001 From: NoHomoBoi <36680385+KiritoDv@users.noreply.github.com> Date: Thu, 11 Jun 2020 22:39:13 -0500 Subject: [PATCH] Added music volume config --- include/text_options_strings.h.in | 1 + src/audio/external.c | 18 +++++++++++++++++- src/audio/external.h | 1 + src/game/options_menu.c | 2 ++ src/pc/configfile.c | 2 ++ src/pc/configfile.h | 1 + src/pc/pc_main.c | 15 +++++++++------ 7 files changed, 33 insertions(+), 7 deletions(-) diff --git a/include/text_options_strings.h.in b/include/text_options_strings.h.in index 2941bde1..9dbce068 100644 --- a/include/text_options_strings.h.in +++ b/include/text_options_strings.h.in @@ -105,6 +105,7 @@ #define TEXT_OPT_NEAREST _("Nearest") #define TEXT_OPT_LINEAR _("Linear") #define TEXT_OPT_MVOLUME _("Master Volume") +#define TEXT_OPT_TMUSIC _("Music Volume") #define TEXT_OPT_VSYNC _("Vertical Sync") #define TEXT_OPT_DOUBLE _("Double") #define TEXT_RESET_WINDOW _("Reset Window") diff --git a/src/audio/external.c b/src/audio/external.c index a059c0b5..4c37f8ad 100644 --- a/src/audio/external.c +++ b/src/audio/external.c @@ -15,6 +15,7 @@ #include "seq_ids.h" #include "dialog_ids.h" #include "level_table.h" +#include "pc/configfile.h" #ifdef VERSION_EU #define EU_FLOAT(x) x ## f @@ -2061,6 +2062,20 @@ void play_dialog_sound(u8 dialogID) { #endif } +void setBackgroundMusicVolume(f32 volume){ + bool needsToUpdate = false; + for(int i = 0; i < 16; i++){ + f32 currentVolume = gSequencePlayers[SEQ_PLAYER_LEVEL].channels[i]->volume; + if(volume != currentVolume){ + gSequencePlayers[SEQ_PLAYER_LEVEL].channels[i]->volume = volume; + needsToUpdate = true; + } + } + if(needsToUpdate){ + update_game_sound(); + } +} + void play_music(u8 player, u16 seqArgs, u16 fadeTimer) { u8 seqId = seqArgs & 0xff; u8 priority = seqArgs >> 8; @@ -2069,11 +2084,12 @@ void play_music(u8 player, u16 seqArgs, u16 fadeTimer) { // Except for the background music player, we don't support queued // sequences. Just play them immediately, stopping any old sequence. + if (player != 0) { play_sequence(player, seqId, fadeTimer); return; } - + // Abort if the queue is already full. if (sBackgroundMusicQueueSize == MAX_BG_MUSIC_QUEUE_SIZE) { return; diff --git a/src/audio/external.h b/src/audio/external.h index 2a8d0e6d..2cc97b1f 100644 --- a/src/audio/external.h +++ b/src/audio/external.h @@ -37,6 +37,7 @@ void sound_banks_disable(u8 player, u16 bankMask); void sound_banks_enable(u8 player, u16 bankMask); void func_80320A4C(u8 bankIndex, u8 arg1); void play_dialog_sound(u8 dialogID); +void setBackgroundMusicVolume(f32 volume); void play_music(u8 player, u16 seqArgs, u16 fadeTimer); void stop_background_music(u16 seqId); void fadeout_background_music(u16 arg0, u16 fadeOut); diff --git a/src/game/options_menu.c b/src/game/options_menu.c index d37b6afe..c0a0c847 100644 --- a/src/game/options_menu.c +++ b/src/game/options_menu.c @@ -84,6 +84,7 @@ static const u8 optsVideoStr[][32] = { static const u8 optsAudioStr[][32] = { { TEXT_OPT_MVOLUME }, + { TEXT_OPT_TMUSIC }, }; static const u8 optsCheatsStr[][64] = { @@ -251,6 +252,7 @@ static struct Option optsVideo[] = { static struct Option optsAudio[] = { DEF_OPT_SCROLL( optsAudioStr[0], &configMasterVolume, 0, MAX_VOLUME, 1 ), + DEF_OPT_SCROLL( optsAudioStr[1], &configMusicVolume, 0, 100, 1), }; static struct Option optsCheats[] = { diff --git a/src/pc/configfile.c b/src/pc/configfile.c index db420112..46e1ca5b 100644 --- a/src/pc/configfile.c +++ b/src/pc/configfile.c @@ -57,6 +57,7 @@ ConfigWindow configWindow = { }; unsigned int configFiltering = 1; // 0=force nearest, 1=linear, (TODO) 2=three-point unsigned int configMasterVolume = MAX_VOLUME; // 0 - MAX_VOLUME +unsigned int configMusicVolume = 100; // Keyboard mappings (VK_ values, by default keyboard/gamepad/mouse) unsigned int configKeyA[MAX_BINDS] = { 0x0026, 0x1000, 0x1103 }; @@ -105,6 +106,7 @@ static const struct ConfigOption options[] = { {.name = "vsync", .type = CONFIG_TYPE_UINT, .uintValue = &configWindow.vsync}, {.name = "texture_filtering", .type = CONFIG_TYPE_UINT, .uintValue = &configFiltering}, {.name = "master_volume", .type = CONFIG_TYPE_UINT, .uintValue = &configMasterVolume}, + {.name = "music_enabled", .type = CONFIG_TYPE_UINT, .uintValue = &configMasterVolume}, {.name = "key_a", .type = CONFIG_TYPE_BIND, .uintValue = configKeyA}, {.name = "key_b", .type = CONFIG_TYPE_BIND, .uintValue = configKeyB}, {.name = "key_start", .type = CONFIG_TYPE_BIND, .uintValue = configKeyStart}, diff --git a/src/pc/configfile.h b/src/pc/configfile.h index 48d65379..0c2960f8 100644 --- a/src/pc/configfile.h +++ b/src/pc/configfile.h @@ -21,6 +21,7 @@ typedef struct { extern ConfigWindow configWindow; extern unsigned int configFiltering; extern unsigned int configMasterVolume; +extern unsigned int configMusicVolume; extern unsigned int configKeyA[]; extern unsigned int configKeyB[]; extern unsigned int configKeyStart[]; diff --git a/src/pc/pc_main.c b/src/pc/pc_main.c index dc85b17e..3cab9eb8 100644 --- a/src/pc/pc_main.c +++ b/src/pc/pc_main.c @@ -67,11 +67,12 @@ void send_display_list(struct SPTask *spTask) { #define printf -void produce_one_frame(void) { +void produce_one_frame(void) { + gfx_start_frame(); game_loop_one_iteration(); - thread6_rumble_loop(NULL); - + thread6_rumble_loop(NULL); + int samples_left = audio_api->buffered(); u32 num_audio_samples = samples_left < audio_api->get_desired_buffered() ? 544 : 528; //printf("Audio samples: %d %u\n", samples_left, num_audio_samples); @@ -83,15 +84,17 @@ void produce_one_frame(void) { u32 num_audio_samples = audio_cnt < 2 ? 528 : 544;*/ create_next_audio_buffer(audio_buffer + i * (num_audio_samples * 2), num_audio_samples); } - //printf("Audio samples before submitting: %d\n", audio_api->buffered()); + //printf("Audio samples before submitting: %d\n", audio_api->buffered()); + + setBackgroundMusicVolume(configMusicVolume / 100.0); // scale by master volume (0-127) const s32 mod = (s32)configMasterVolume; for (u32 i = 0; i < num_audio_samples * 4; ++i) - audio_buffer[i] = ((s32)audio_buffer[i] * mod) >> VOLUME_SHIFT; + audio_buffer[i] = ((s32)audio_buffer[i] * mod) >> VOLUME_SHIFT; audio_api->play((u8*)audio_buffer, 2 * num_audio_samples * 4); - + gfx_end_frame(); }