#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))
static int mixer_active_channels = 0;
static boolean expire_loop_sounds = FALSE;
-static void ReloadCustomSounds();
-static void ReloadCustomMusic();
+static void ReloadCustomSounds(void);
+static void ReloadCustomMusic(void);
static void FreeSound(void *);
static void FreeMusic(void *);
-static void FreeAllMusic_NoConf();
+static void FreeAllMusic_NoConf(void);
static SoundInfo *getSoundInfoEntryFromSoundID(int);
static MusicInfo *getMusicInfoEntryFromMusicID(int);
/* mixer functions */
/* ------------------------------------------------------------------------- */
-void Mixer_InitChannels()
+void Mixer_InitChannels(void)
{
int i;
mixer_active_channels++;
}
-static void Mixer_PlayMusicChannel()
+static void Mixer_PlayMusicChannel(void)
{
Mixer_PlayChannel(audio.music_channel);
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
mixer_active_channels--;
}
-static void Mixer_StopMusicChannel()
+static void Mixer_StopMusicChannel(void)
{
Mixer_StopChannel(audio.music_channel);
Mix_FadeOutChannel(channel, SOUND_FADING_INTERVAL);
}
-static void Mixer_FadeMusicChannel()
+static void Mixer_FadeMusicChannel(void)
{
Mixer_FadeChannel(audio.music_channel);
{
SoundInfo *snd_info;
int i, k;
- int num_sounds = getSoundListSize();
- int num_music = getMusicListSize();
if (IS_MUSIC(snd_ctrl))
- {
- if (snd_ctrl.nr >= num_music) /* invalid music */
- return;
-
- if (snd_ctrl.nr < 0) /* undefined music */
- {
- if (num_music_noconf == 0) /* no fallback music available */
- return;
-
- snd_ctrl.nr = UNMAP_NOCONF_MUSIC(snd_ctrl.nr) % num_music_noconf;
- snd_info = Music_NoConf[snd_ctrl.nr];
- }
- else
- snd_info = getMusicInfoEntryFromMusicID(snd_ctrl.nr);
- }
+ snd_info = getMusicInfoEntryFromMusicID(snd_ctrl.nr);
else
- {
- if (snd_ctrl.nr < 0 || snd_ctrl.nr >= num_sounds)
- return;
-
snd_info = getSoundInfoEntryFromSoundID(snd_ctrl.nr);
- }
if (snd_info == NULL)
return;
return NULL;
}
-void LoadCustomMusic_NoConf(void)
+static void LoadCustomMusic_NoConf(void)
{
static boolean draw_init_text = TRUE; /* only draw at startup */
static char *last_music_directory = NULL;
draw_init_text = FALSE;
}
-int getSoundListSize()
+int getSoundListSize(void)
{
return (sound_info->num_file_list_entries +
sound_info->num_dynamic_file_list_entries);
}
-int getMusicListSize()
+int getMusicListSize(void)
{
return (music_info->num_file_list_entries +
music_info->num_dynamic_file_list_entries);
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 >= num_music) /* invalid music */
+ return NULL;
+
+ if (pos < 0) /* undefined music */
+ {
+ if (num_music_noconf == 0) /* no fallback music available */
+ return NULL;
+
+ pos = UNMAP_NOCONF_MUSIC(pos) % num_music_noconf;
+
+ return Music_NoConf[pos];
+ }
+
return mus_info[list_pos];
}
return getBaseNamePtr(mus_info->source_filename);
}
-char *getCurrentlyPlayingMusicFilename()
+char *getCurrentlyPlayingMusicFilename(void)
{
return currently_playing_music_filename;
}
-int getSoundListPropertyMappingSize()
+int getSoundListPropertyMappingSize(void)
{
return sound_info->num_property_mapping_entries;
}
-int getMusicListPropertyMappingSize()
+int getMusicListPropertyMappingSize(void)
{
return music_info->num_property_mapping_entries;
}
-struct PropertyMapping *getSoundListPropertyMapping()
+struct PropertyMapping *getSoundListPropertyMapping(void)
{
return sound_info->property_mapping;
}
-struct PropertyMapping *getMusicListPropertyMapping()
+struct PropertyMapping *getMusicListPropertyMapping(void)
{
return music_info->property_mapping;
}
PlaySoundMusic(nr);
}
+void PlayMusicLoop(int nr)
+{
+ if (!audio.music_available)
+ return;
+
+ PlaySoundMusicLoop(nr);
+}
+
void PlaySound(int nr)
{
if (!setup.sound_simple)
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;
StopSoundExt(nr, SND_CTRL_FADE_SOUND);
}
-void FadeSounds()
+void FadeSounds(void)
{
StopSoundExt(-1, SND_CTRL_FADE_ALL);
}
-void FadeSoundsAndMusic()
+void FadeSoundsAndMusic(void)
{
FadeSounds();
FadeMusic();
StopSoundExt(nr, SND_CTRL_STOP_SOUND);
}
-void StopSounds()
+void StopSounds(void)
{
StopMusic();
StopSoundExt(-1, SND_CTRL_STOP_ALL);
HandleSoundRequest(snd_ctrl);
}
-static void ReloadCustomSounds()
+static void ReloadCustomSounds(void)
{
LoadArtworkConfig(sound_info);
ReloadCustomArtworkList(sound_info);
}
-static void ReloadCustomMusic()
+static void ReloadCustomMusic(void)
{
LoadArtworkConfig(music_info);
ReloadCustomArtworkList(music_info);
free(music);
}
-static void FreeAllMusic_NoConf()
+static void FreeAllMusic_NoConf(void)
{
int i;
num_music_noconf = 0;
}
-void FreeAllSounds()
+void FreeAllSounds(void)
{
FreeCustomArtworkLists(sound_info);
}
-void FreeAllMusic()
+void FreeAllMusic(void)
{
FreeCustomArtworkLists(music_info);
FreeAllMusic_NoConf();