From ae22060f6dbc84e9fe7f4ea6a8d2e29cc9c311dd Mon Sep 17 00:00:00 2001 From: Holger Schemel Date: Sat, 27 Jan 2018 20:58:00 +0100 Subject: [PATCH] added workaround for broken MIDI volume behaviour for Windows platform playing MIDI music is broken since Windows Vista, as it sets the volume for MIDI music also for all other sounds and music, which cannot be set back to normal unless playing MIDI music again with that desired volume (more details: https://www.artsoft.org/forum/viewtopic.php?f=7&t=2253) => workaround 1: always play MIDI music with maximum volume => workaround 2: never fade MIDI music to lower volume, but just stop it --- src/libgame/sound.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/libgame/sound.c b/src/libgame/sound.c index cb788e7e..8371b9b5 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -225,6 +225,16 @@ static void Mixer_PlayMusicChannel() // (this may happen when switching on music while playing the game) Mix_VolumeMusic(mixer[audio.music_channel].volume); Mix_FadeInMusic(mixer[audio.music_channel].data_ptr, -1, 100); + +#if defined(PLATFORM_WIN32) + // playing MIDI music is broken since Windows Vista, as it sets the volume + // for MIDI music also for all other sounds and music, which cannot be set + // back to normal unless playing MIDI music again with that desired volume + // (more details: https://www.artsoft.org/forum/viewtopic.php?f=7&t=2253) + // => workaround: always play MIDI music with maximum volume + if (Mix_GetMusicType(NULL) == MUS_MID) + Mix_VolumeMusic(SOUND_MAX_VOLUME); +#endif } } @@ -264,6 +274,16 @@ static void Mixer_FadeMusicChannel() Mix_FadeOutMusic(SOUND_FADING_INTERVAL); +#if defined(PLATFORM_WIN32) + // playing MIDI music is broken since Windows Vista, as it sets the volume + // for MIDI music also for all other sounds and music, which cannot be set + // back to normal unless playing MIDI music again with that desired volume + // (more details: https://www.artsoft.org/forum/viewtopic.php?f=7&t=2253) + // => workaround: never fade MIDI music to lower volume, but just stop it + if (Mix_GetMusicType(NULL) == MUS_MID) + Mixer_StopMusicChannel(); +#endif + setString(¤tly_playing_music_filename, NULL); } -- 2.34.1