added workaround for broken MIDI volume behaviour for Windows platform
authorHolger Schemel <info@artsoft.org>
Sat, 27 Jan 2018 19:58:00 +0000 (20:58 +0100)
committerHolger Schemel <info@artsoft.org>
Sat, 27 Jan 2018 19:58:08 +0000 (20:58 +0100)
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

index cb788e7e573769a7efeec3e8ff1fbeaec7692fc3..8371b9b5cd879d02b56fabe8ab4487faa2da3fe3 100644 (file)
@@ -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(&currently_playing_music_filename, NULL);
 }