diff --git a/src/d_main.c b/src/d_main.c index f53761d6d..95af1f754 100644 --- a/src/d_main.c +++ b/src/d_main.c @@ -1212,7 +1212,7 @@ void D_SRB2Main(void) } I_StartupSound(); I_InitMusic(); - S_Init(cv_soundvolume.value, cv_digmusicvolume.value); + S_Init(cv_soundvolume.value, cv_digmusicvolume.value, cv_midimusicvolume.value); CONS_Printf("ST_Init(): Init status bar.\n"); ST_Init(); diff --git a/src/d_netcmd.c b/src/d_netcmd.c index f1130f736..0cb1d4497 100644 --- a/src/d_netcmd.c +++ b/src/d_netcmd.c @@ -790,6 +790,7 @@ void D_RegisterClientCommands(void) CV_RegisterVar(&cv_soundvolume); CV_RegisterVar(&cv_closedcaptioning); CV_RegisterVar(&cv_digmusicvolume); + CV_RegisterVar(&cv_midimusicvolume); CV_RegisterVar(&cv_numChannels); // i_cdmus.c @@ -4057,6 +4058,7 @@ static void Command_RestartAudio_f(void) I_SetSfxVolume(cv_soundvolume.value); I_SetDigMusicVolume(cv_digmusicvolume.value); + I_SetMIDIMusicVolume(cv_midimusicvolume.value); if (Playing()) // Gotta make sure the player is in a level P_RestoreMusic(&players[consoleplayer]); diff --git a/src/i_sound.h b/src/i_sound.h index 99e343491..5368f3fd6 100644 --- a/src/i_sound.h +++ b/src/i_sound.h @@ -136,6 +136,14 @@ void I_ResumeSong(INT32 handle); // MIDI I/O // +/** \brief The I_SetMIDIMusicVolume function + + \param volume volume to set at + + \return void +*/ +void I_SetMIDIMusicVolume(UINT8 volume); + /** \brief Registers a song handle to song data. \param data pointer to song data diff --git a/src/m_menu.c b/src/m_menu.c index 9764cd728..fd3deab84 100644 --- a/src/m_menu.c +++ b/src/m_menu.c @@ -1314,6 +1314,9 @@ static menuitem_t OP_SoundOptionsMenu[] = {IT_STRING | IT_KEYHANDLER, NULL, "Digital Music", M_ToggleDigital, 40}, {IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "Digital Music Volume", &cv_digmusicvolume, 50}, + {IT_STRING | IT_KEYHANDLER, NULL, "MIDI Music", M_ToggleMIDI, 70}, + {IT_STRING | IT_CVAR | IT_CV_SLIDER, NULL, "MIDI Music Volume", &cv_midimusicvolume, 80}, + {IT_STRING | IT_CVAR, NULL, "Closed Captioning", &cv_closedcaptioning, 100}, }; @@ -9418,7 +9421,7 @@ static void M_ToggleSFX(INT32 choice) nosound = false; I_StartupSound(); if (nosound) return; - S_Init(cv_soundvolume.value, cv_digmusicvolume.value); + S_Init(cv_soundvolume.value, cv_digmusicvolume.value, cv_midimusicvolume.value); S_StartSound(NULL, sfx_strpst); OP_SoundOptionsMenu[6].status = IT_STRING | IT_CVAR; //M_StartMessage(M_GetText("SFX Enabled\n"), NULL, MM_NOTHING); @@ -9471,7 +9474,7 @@ static void M_ToggleDigital(INT32 choice) nodigimusic = false; I_InitMusic(); if (nodigimusic) return; - S_Init(cv_soundvolume.value, cv_digmusicvolume.value); + S_Init(cv_soundvolume.value, cv_digmusicvolume.value, cv_midimusicvolume.value); S_StopMusic(); if (Playing()) P_RestoreMusic(&players[consoleplayer]); @@ -9528,7 +9531,7 @@ static void M_ToggleMIDI(INT32 choice) nomidimusic = false; I_InitMusic(); if (nomidimusic) return; - S_Init(cv_soundvolume.value, cv_digmusicvolume.value); + S_Init(cv_soundvolume.value, cv_digmusicvolume.value, cv_midimusicvolume.value); if (Playing()) P_RestoreMusic(&players[consoleplayer]); else diff --git a/src/s_sound.c b/src/s_sound.c index 531eb7642..81e3e78e6 100644 --- a/src/s_sound.c +++ b/src/s_sound.c @@ -77,6 +77,7 @@ static consvar_t precachesound = {"precachesound", "Off", CV_SAVE, CV_OnOff, NUL // actual general (maximum) sound & music volume, saved into the config consvar_t cv_soundvolume = {"soundvolume", "18", CV_SAVE, soundvolume_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; consvar_t cv_digmusicvolume = {"digmusicvolume", "18", CV_SAVE, soundvolume_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; +consvar_t cv_midimusicvolume = {"midimusicvolume", "18", CV_SAVE, soundvolume_cons_t, NULL, 0, NULL, NULL, 0, 0, NULL}; static void Captioning_OnChange(void) { @@ -787,6 +788,7 @@ void S_StopSound(void *origin) // static INT32 actualsfxvolume; // check for change through console static INT32 actualdigmusicvolume; +static INT32 actualmidimusicvolume; void S_UpdateSounds(void) { @@ -807,7 +809,9 @@ void S_UpdateSounds(void) if (actualsfxvolume != cv_soundvolume.value) S_SetSfxVolume (cv_soundvolume.value); if (actualdigmusicvolume != cv_digmusicvolume.value) - S_SetMusicVolume (cv_digmusicvolume.value); + S_SetDigMusicVolume (cv_digmusicvolume.value); + if (actualmidimusicvolume != cv_midimusicvolume.value) + S_SetMIDIMusicVolume (cv_midimusicvolume.value); // We're done now, if we're not in a level. if (gamestate != GS_LEVEL) @@ -1444,6 +1448,20 @@ void S_SetMusicVolume(INT32 volume) I_SetDigMusicVolume(volume&31); } +void S_SetMIDIMusicVolume(INT32 volume) +{ + if (volume < 0 || volume > 31) + CONS_Alert(CONS_WARNING, "musicvolume should be between 0-31\n"); + + CV_SetValue(&cv_midimusicvolume, volume&0x1f); + actualmidimusicvolume = cv_midimusicvolume.value; //check for change of var + +#ifdef DJGPPDOS + I_SetMIDIMusicVolume(31); // Trick for buggy dos drivers. Win32 doesn't need this. +#endif + I_SetMIDIMusicVolume(volume&0x1f); +} + /// ------------------------ /// Init & Others /// ------------------------ @@ -1453,7 +1471,7 @@ void S_SetMusicVolume(INT32 volume) // Sets channels, SFX and music volume, // allocates channel buffer, sets S_sfx lookup. // -void S_Init(INT32 sfxVolume, INT32 digMusicVolume) +void S_Init(INT32 sfxVolume, INT32 digMusicVolume, INT32 midiMusicVolume) { INT32 i; @@ -1461,7 +1479,8 @@ void S_Init(INT32 sfxVolume, INT32 digMusicVolume) return; S_SetSfxVolume(sfxVolume); - S_SetMusicVolume(digMusicVolume); + S_SetDigMusicVolume(digMusicVolume); + S_SetMIDIMusicVolume(midiMusicVolume); SetChannelsNum(); diff --git a/src/s_sound.h b/src/s_sound.h index 053f58669..4b9735480 100644 --- a/src/s_sound.h +++ b/src/s_sound.h @@ -23,7 +23,7 @@ #define PICKUP_SOUND 0x8000 extern consvar_t stereoreverse; -extern consvar_t cv_soundvolume, cv_closedcaptioning, cv_digmusicvolume; +extern consvar_t cv_soundvolume, cv_closedcaptioning, cv_digmusicvolume, cv_midimusicvolume; extern consvar_t cv_numChannels; #ifdef SNDSERV @@ -99,7 +99,7 @@ void S_RegisterSoundStuff(void); // Initializes sound stuff, including volume // Sets channels, SFX and music volume, allocates channel buffer, sets S_sfx lookup. // -void S_Init(INT32 sfxVolume, INT32 digMusicVolume); +void S_Init(INT32 sfxVolume, INT32 digMusicVolume, INT32 midiMusicVolume); // // Per level startup code. @@ -149,7 +149,8 @@ void S_UpdateSounds(void); FUNCMATH fixed_t S_CalculateSoundDistance(fixed_t px1, fixed_t py1, fixed_t pz1, fixed_t px2, fixed_t py2, fixed_t pz2); -void S_SetMusicVolume(INT32 volume); +void S_SetDigMusicVolume(INT32 volume); +void S_SetMIDIMusicVolume(INT32 volume); void S_SetSfxVolume(INT32 volume); INT32 S_OriginPlaying(void *origin); diff --git a/src/sdl/mixer_sound.c b/src/sdl/mixer_sound.c index 7e9bd4bde..113c75d63 100644 --- a/src/sdl/mixer_sound.c +++ b/src/sdl/mixer_sound.c @@ -764,6 +764,19 @@ void I_StopSong(void) music = NULL; } +void I_SetMIDIMusicVolume(UINT8 volume) +{ + // HACK: Until we stop using native MIDI, + // disable volume changes + (void)volume; + midi_volume = 31; + //midi_volume = volume; + + if (!midimode || !music) + return; + Mix_VolumeMusic((UINT32)midi_volume*128/31); +} + void I_UnloadSong(void) { if (!midimode || !music)