X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsound.c;h=8a5ab84eb71b153d780973be1bed2fe3149cef6c;hb=380e92ce7e5befac890b63be28e534e4c8b545be;hp=cb788e7e573769a7efeec3e8ff1fbeaec7692fc3;hpb=8d71e6fb8309bd90ce5f2900d84c686b17950492;p=rocksndiamonds.git diff --git a/src/libgame/sound.c b/src/libgame/sound.c index cb788e7e..8a5ab84e 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); } @@ -667,44 +687,70 @@ int getMusicListSize() struct FileInfo *getSoundListEntry(int pos) { + int num_sounds = getSoundListSize(); int num_list_entries = sound_info->num_file_list_entries; int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries); + if (pos < 0 || pos >= num_sounds) /* invalid sound */ + return NULL; + return (pos < num_list_entries ? &sound_info->file_list[list_pos] : &sound_info->dynamic_file_list[list_pos]); } struct FileInfo *getMusicListEntry(int pos) { + int num_music = getMusicListSize(); int num_list_entries = music_info->num_file_list_entries; int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries); + if (pos < 0 || pos >= num_music) /* invalid music */ + return NULL; + return (pos < num_list_entries ? &music_info->file_list[list_pos] : &music_info->dynamic_file_list[list_pos]); } static SoundInfo *getSoundInfoEntryFromSoundID(int pos) { + int num_sounds = getSoundListSize(); int num_list_entries = sound_info->num_file_list_entries; int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries); SoundInfo **snd_info = (SoundInfo **)(pos < num_list_entries ? sound_info->artwork_list : sound_info->dynamic_artwork_list); + if (pos < 0 || pos >= num_sounds) /* invalid sound */ + return NULL; + return snd_info[list_pos]; } static MusicInfo *getMusicInfoEntryFromMusicID(int pos) { + int num_music = getMusicListSize(); int num_list_entries = music_info->num_file_list_entries; int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries); MusicInfo **mus_info = (MusicInfo **)(pos < num_list_entries ? music_info->artwork_list : music_info->dynamic_artwork_list); + if (pos < 0 || pos >= num_music) /* invalid music */ + return NULL; + return mus_info[list_pos]; } +char *getMusicInfoEntryFilename(int pos) +{ + MusicInfo *mus_info = getMusicInfoEntryFromMusicID(pos); + + if (mus_info == NULL) + return NULL; + + return getBaseNamePtr(mus_info->source_filename); +} + char *getCurrentlyPlayingMusicFilename() { return currently_playing_music_filename;