From: Holger Schemel Date: Wed, 12 Sep 2018 07:04:51 +0000 (+0200) Subject: fixed bug with not recognizing ".mode_loop: false" for music X-Git-Tag: 4.1.1.0~39 X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=commitdiff_plain;h=39fb4fecfb8d4647d3563bdb18ce0065f6129522 fixed bug with not recognizing ".mode_loop: false" for music Before, music was always played in loop mode, even if it was defined with option ".mode_loop: false". Now, disabling loop mode for music in config files will indeed cause music to be played only once. Note: This commit changed the behaviour of the existing function "PlayMusic()" (which always played music in loop mode before), which will now play music only once, while a new function "PlayMusicLoop()" was added, which always plays music in loop mode. --- diff --git a/src/anim.c b/src/anim.c index 0a278aa3..1623cdc4 100644 --- a/src/anim.c +++ b/src/anim.c @@ -917,7 +917,10 @@ static void PlayGlobalAnimMusic(struct GlobalAnimPartControlInfo *part) if (!setup.sound_music) return; - PlayMusic(music); + if (IS_LOOP_MUSIC(music)) + PlayMusicLoop(music); + else + PlayMusic(music); #if 0 printf("::: PLAY MUSIC %d.%d.%d: %d\n", diff --git a/src/game.c b/src/game.c index 965e4230..4c9c56e8 100644 --- a/src/game.c +++ b/src/game.c @@ -14594,7 +14594,7 @@ static void PlayLevelMusic() char *next_music = getMusicInfoEntryFilename(music_nr); if (!strEqual(curr_music, next_music)) - PlayMusic(music_nr); + PlayMusicLoop(music_nr); } void PlayLevelSound_EM(int xx, int yy, int element_em, int sample) diff --git a/src/libgame/sound.c b/src/libgame/sound.c index 15354b68..c9a74eb1 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -59,9 +59,9 @@ #define SOUND_VOLUME_LOOPS(v) SOUND_VOLUME_FROM_PERCENT(v, setup.volume_loops) #define SOUND_VOLUME_MUSIC(v) SOUND_VOLUME_FROM_PERCENT(v, setup.volume_music) -#define SETUP_SOUND_VOLUME(v,s) ((s) == SND_CTRL_PLAY_MUSIC ? \ +#define SETUP_SOUND_VOLUME(v,s) ((s) & SND_CTRL_MUSIC ? \ SOUND_VOLUME_MUSIC(v) : \ - (s) == SND_CTRL_PLAY_LOOP ? \ + (s) & SND_CTRL_LOOP ? \ SOUND_VOLUME_LOOPS(v) : \ SOUND_VOLUME_SIMPLE(v)) @@ -221,10 +221,12 @@ static void Mixer_PlayMusicChannel() if (mixer[audio.music_channel].type != MUS_TYPE_WAV) { + int loops = (IS_LOOP(mixer[audio.music_channel]) ? -1 : 1); + // use short fade-in to prevent "plop" sound for certain music files // (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); + Mix_FadeInMusic(mixer[audio.music_channel].data_ptr, loops, 100); #if defined(PLATFORM_WIN32) // playing MIDI music is broken since Windows Vista, as it sets the volume @@ -923,6 +925,14 @@ void PlayMusic(int nr) PlaySoundMusic(nr); } +void PlayMusicLoop(int nr) +{ + if (!audio.music_available) + return; + + PlaySoundMusicLoop(nr); +} + void PlaySound(int nr) { if (!setup.sound_simple) @@ -955,6 +965,14 @@ void PlaySoundMusic(int nr) PlaySoundExt(nr, SOUND_MAX_VOLUME, SOUND_MIDDLE, SND_CTRL_PLAY_MUSIC); } +void PlaySoundMusicLoop(int nr) +{ + if (!setup.sound_music) + return; + + PlaySoundExt(nr, SOUND_MAX_VOLUME, SOUND_MIDDLE, SND_CTRL_PLAY_MUSIC_LOOP); +} + void PlaySoundExt(int nr, int volume, int stereo_position, int state) { SoundControl snd_ctrl; diff --git a/src/libgame/sound.h b/src/libgame/sound.h index 9d496c3c..e2d2054a 100644 --- a/src/libgame/sound.h +++ b/src/libgame/sound.h @@ -60,7 +60,8 @@ #define SND_CTRL_PLAY_SOUND (SND_CTRL_NONE) #define SND_CTRL_PLAY_LOOP (SND_CTRL_LOOP) -#define SND_CTRL_PLAY_MUSIC (SND_CTRL_LOOP | SND_CTRL_MUSIC) +#define SND_CTRL_PLAY_MUSIC (SND_CTRL_MUSIC) +#define SND_CTRL_PLAY_MUSIC_LOOP (SND_CTRL_MUSIC | SND_CTRL_LOOP) #define SND_CTRL_FADE_SOUND (SND_CTRL_FADE) #define SND_CTRL_FADE_MUSIC (SND_CTRL_FADE | SND_CTRL_MUSIC) @@ -102,10 +103,12 @@ void StartMixer(void); /* sound client functions */ void PlayMusic(int); +void PlayMusicLoop(int); void PlaySound(int); void PlaySoundStereo(int, int); void PlaySoundLoop(int); void PlaySoundMusic(int); +void PlaySoundMusicLoop(int); void PlaySoundExt(int, int, int, int); void FadeMusic(void); void FadeSound(int); diff --git a/src/main.h b/src/main.h index f722f9c4..3c6e492c 100644 --- a/src/main.h +++ b/src/main.h @@ -905,6 +905,7 @@ #define IS_NEXT_FRAME(f, g) (IS_NEW_FRAME(f, g) && (f) > 0) #define IS_LOOP_SOUND(s) (sound_info[s].loop) +#define IS_LOOP_MUSIC(s) (music_info[s].loop) #define IS_SPECIAL_GFX_ARG(a) ((a) >= 0 && (a) < NUM_SPECIAL_GFX_ARGS) diff --git a/src/screens.c b/src/screens.c index 337bd565..5e0740b6 100644 --- a/src/screens.c +++ b/src/screens.c @@ -3096,7 +3096,12 @@ void HandleInfoScreen_Music(int button) } else { - PlayMusic(list->music); + int music = list->music; + + if (music_info[music].loop) + PlayMusicLoop(music); + else + PlayMusic(music); DrawTextSCentered(ystart, font_title, "The Game Background Music:"); } diff --git a/src/tools.c b/src/tools.c index e6f09e1c..a11f692e 100644 --- a/src/tools.c +++ b/src/tools.c @@ -9215,7 +9215,10 @@ void PlayMenuMusicExt(int music) if (!setup.sound_music) return; - PlayMusic(music); + if (IS_LOOP_MUSIC(music)) + PlayMusicLoop(music); + else + PlayMusic(music); } void PlayMenuMusic()