X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsound.c;h=12b01c382b8f1c50cd62403b9ce65317fa9e8840;hb=HEAD;hp=15354b68575dbc6b95b97563b996905ed17f24cb;hpb=eb017c47e0685e8a43fe8b3a022429017c67c6bc;p=rocksndiamonds.git diff --git a/src/libgame/sound.c b/src/libgame/sound.c index 15354b68..473850dd 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -4,7 +4,7 @@ // (c) 1995-2014 by Artsoft Entertainment // Holger Schemel // info@artsoft.org -// http://www.artsoft.org/ +// https://www.artsoft.org/ // ---------------------------------------------------------------------------- // sound.c // ============================================================================ @@ -27,10 +27,10 @@ #include "text.h" -/* expiration time (in milliseconds) for sound loops */ +// expiration time (in milliseconds) for sound loops #define SOUND_LOOP_EXPIRATION_TIME 200 -/* one second fading interval == 1000 ticks (milliseconds) */ +// one second fading interval == 1000 ticks (milliseconds) #define SOUND_FADING_INTERVAL 1000 #define SND_TYPE_NONE 0 @@ -48,10 +48,10 @@ #define SOUND_VOLUME_LEFT(x) (stereo_volume[x]) #define SOUND_VOLUME_RIGHT(x) (stereo_volume[SOUND_MAX_LEFT2RIGHT-x]) -#define SAME_SOUND_NR(x,y) ((x).nr == (y).nr) -#define SAME_SOUND_DATA(x,y) ((x).data_ptr == (y).data_ptr) +#define SAME_SOUND_NR(x, y) ((x).nr == (y).nr) +#define SAME_SOUND_DATA(x, y) ((x).data_ptr == (y).data_ptr) -#define SOUND_VOLUME_FROM_PERCENT(v,p) ((p) < 0 ? SOUND_MIN_VOLUME : \ +#define SOUND_VOLUME_FROM_PERCENT(v, p) ((p) < 0 ? SOUND_MIN_VOLUME : \ (p) > 100 ? (v) : \ (p) * (v) / 100) @@ -59,18 +59,18 @@ #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)) struct AudioFormatInfo { - boolean stereo; /* availability of stereo sound */ - int format; /* size and endianess of sample data */ - int sample_rate; /* sample frequency */ - int fragment_size; /* audio device fragment size in bytes */ + boolean stereo; // availability of stereo sound + int format; // size and endianess of sample data + int sample_rate; // sample frequency + int fragment_size; // audio device fragment size in bytes }; struct SampleInfo @@ -80,9 +80,9 @@ struct SampleInfo int type; int format; - void *data_ptr; /* pointer to first sample (8 or 16 bit) */ - int data_len; /* number of samples, NOT number of bytes */ - int num_channels; /* mono: 1 channel, stereo: 2 channels */ + void *data_ptr; // pointer to first sample (8 or 16 bit) + int data_len; // number of samples, NOT number of bytes + int num_channels; // mono: 1 channel, stereo: 2 channels }; typedef struct SampleInfo SoundInfo; typedef struct SampleInfo MusicInfo; @@ -102,9 +102,9 @@ struct SoundControl int type; int format; - void *data_ptr; /* pointer to first sample (8 or 16 bit) */ - int data_len; /* number of samples, NOT number of bytes */ - int num_channels; /* mono: 1 channel, stereo: 2 channels */ + void *data_ptr; // pointer to first sample (8 or 16 bit) + int data_len; // number of samples, NOT number of bytes + int num_channels; // mono: 1 channel, stereo: 2 channels }; typedef struct SoundControl SoundControl; @@ -119,28 +119,29 @@ static int stereo_volume[SOUND_MAX_LEFT2RIGHT + 1]; static char *currently_playing_music_filename = NULL; -/* ========================================================================= */ -/* THE STUFF BELOW IS ONLY USED BY THE SOUND SERVER CHILD PROCESS */ +// ============================================================================ +// THE STUFF BELOW IS ONLY USED BY THE SOUND SERVER CHILD PROCESS static struct SoundControl mixer[NUM_MIXER_CHANNELS]; 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 void Mixer_StopMusicChannel(void); static SoundInfo *getSoundInfoEntryFromSoundID(int); static MusicInfo *getMusicInfoEntryFromMusicID(int); -/* ------------------------------------------------------------------------- */ -/* mixer functions */ -/* ------------------------------------------------------------------------- */ +// ---------------------------------------------------------------------------- +// mixer functions +// ---------------------------------------------------------------------------- -void Mixer_InitChannels() +void Mixer_InitChannels(void) { int i; @@ -165,8 +166,8 @@ static boolean Mixer_ChannelExpired(int channel) if (expire_loop_sounds && IS_LOOP(mixer[channel]) && !IS_MUSIC(mixer[channel]) && - DelayReached(&mixer[channel].playing_starttime, - SOUND_LOOP_EXPIRATION_TIME)) + DelayReachedExt2(&mixer[channel].playing_starttime, + SOUND_LOOP_EXPIRATION_TIME, Counter())) return TRUE; if (!Mix_Playing(channel)) @@ -196,7 +197,7 @@ static void Mixer_StartChannel(int channel) static void Mixer_PlayChannel(int channel) { - /* start with inactive channel in case something goes wrong */ + // start with inactive channel in case something goes wrong mixer[channel].active = FALSE; if (mixer[channel].type != MUS_TYPE_WAV) @@ -215,18 +216,24 @@ static void Mixer_PlayChannel(int channel) 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); + + // stopping music channel before playing next track seems to be needed to + // prevent audio problems that may occur when playing MP3 files on Windows + Mixer_StopMusicChannel(); + // 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) +#if defined(PLATFORM_WINDOWS) // 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 @@ -249,7 +256,7 @@ static void Mixer_StopChannel(int channel) mixer_active_channels--; } -static void Mixer_StopMusicChannel() +static void Mixer_StopMusicChannel(void) { Mixer_StopChannel(audio.music_channel); @@ -268,13 +275,13 @@ static void Mixer_FadeChannel(int channel) Mix_FadeOutChannel(channel, SOUND_FADING_INTERVAL); } -static void Mixer_FadeMusicChannel() +static void Mixer_FadeMusicChannel(void) { Mixer_FadeChannel(audio.music_channel); Mix_FadeOutMusic(SOUND_FADING_INTERVAL); -#if defined(PLATFORM_WIN32) +#if defined(PLATFORM_WINDOWS) // 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 @@ -312,14 +319,14 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) if (snd_info == NULL) return; - /* copy sound sample and format information */ + // copy sound sample and format information snd_ctrl.type = snd_info->type; snd_ctrl.format = snd_info->format; snd_ctrl.data_ptr = snd_info->data_ptr; snd_ctrl.data_len = snd_info->data_len; snd_ctrl.num_channels = snd_info->num_channels; - /* play music samples on a dedicated music channel */ + // play music samples on a dedicated music channel if (IS_MUSIC(snd_ctrl)) { Mixer_StopMusicChannel(); @@ -333,12 +340,12 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) return; } - /* check if (and how often) this sound sample is already playing */ + // check if (and how often) this sound sample is already playing for (k = 0, i = audio.first_sound_channel; i < audio.num_channels; i++) if (mixer[i].active && SAME_SOUND_DATA(mixer[i], snd_ctrl)) k++; - /* reset expiration delay for already playing loop sounds */ + // reset expiration delay for already playing loop sounds if (k > 0 && IS_LOOP(snd_ctrl)) { for (i = audio.first_sound_channel; i < audio.num_channels; i++) @@ -348,7 +355,7 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) if (IS_FADING(mixer[i])) Mixer_UnFadeChannel(i); - /* restore settings like volume and stereo position */ + // restore settings like volume and stereo position mixer[i].volume = snd_ctrl.volume; mixer[i].stereo_position = snd_ctrl.stereo_position; @@ -360,13 +367,13 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) return; } - /* don't play sound more than n times simultaneously (with n == 2 for now) */ + // don't play sound more than n times simultaneously (with n == 2 for now) if (k >= 2) { unsigned int playing_current = Counter(); int longest = 0, longest_nr = audio.first_sound_channel; - /* look for oldest equal sound */ + // look for oldest equal sound for (i = audio.first_sound_channel; i < audio.num_channels; i++) { int playing_time = playing_current - mixer[i].playing_starttime; @@ -394,7 +401,7 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) library, we use the current playing time (in milliseconds) instead. */ #if DEBUG - /* channel allocation sanity check -- should not be needed */ + // channel allocation sanity check -- should not be needed if (mixer_active_channels == audio.num_channels - (mixer[audio.music_channel].active ? 0 : 1)) { @@ -402,8 +409,8 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) { if (!mixer[i].active) { - Error(ERR_INFO, "Mixer_InsertSound: Channel %d inactive", i); - Error(ERR_INFO, "Mixer_InsertSound: This should never happen!"); + Debug("audio", "Mixer_InsertSound: Channel %d inactive", i); + Debug("audio", "Mixer_InsertSound: This should never happen!"); mixer_active_channels--; } @@ -432,7 +439,7 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) Mixer_StopChannel(longest_nr); } - /* add the new sound to the mixer */ + // add the new sound to the mixer for (i = audio.first_sound_channel; i < audio.num_channels; i++) { if (!mixer[i].active) @@ -449,12 +456,12 @@ static void HandleSoundRequest(SoundControl snd_ctrl) { int i; - /* deactivate channels that have expired since the last request */ + // deactivate channels that have expired since the last request for (i = 0; i < audio.num_channels; i++) if (mixer[i].active && Mixer_ChannelExpired(i)) Mixer_StopChannel(i); - if (IS_RELOADING(snd_ctrl)) /* load new sound or music files */ + if (IS_RELOADING(snd_ctrl)) // load new sound or music files { Mixer_StopMusicChannel(); for (i = audio.first_sound_channel; i < audio.num_channels; i++) @@ -465,7 +472,7 @@ static void HandleSoundRequest(SoundControl snd_ctrl) else ReloadCustomMusic(); } - else if (IS_FADING(snd_ctrl)) /* fade out existing sound or music */ + else if (IS_FADING(snd_ctrl)) // fade out existing sound or music { if (IS_MUSIC(snd_ctrl)) { @@ -477,7 +484,7 @@ static void HandleSoundRequest(SoundControl snd_ctrl) if (SAME_SOUND_NR(mixer[i], snd_ctrl) || ALL_SOUNDS(snd_ctrl)) Mixer_FadeChannel(i); } - else if (IS_STOPPING(snd_ctrl)) /* stop existing sound or music */ + else if (IS_STOPPING(snd_ctrl)) // stop existing sound or music { if (IS_MUSIC(snd_ctrl)) { @@ -489,11 +496,11 @@ static void HandleSoundRequest(SoundControl snd_ctrl) if (SAME_SOUND_NR(mixer[i], snd_ctrl) || ALL_SOUNDS(snd_ctrl)) Mixer_StopChannel(i); } - else if (SET_EXPIRE_LOOPS(snd_ctrl)) /* set loop expiration on or off */ + else if (SET_EXPIRE_LOOPS(snd_ctrl)) // set loop expiration on or off { expire_loop_sounds = snd_ctrl.active; } - else if (snd_ctrl.active) /* add new sound to mixer */ + else if (snd_ctrl.active) // add new sound to mixer { Mixer_InsertSound(snd_ctrl); } @@ -506,19 +513,19 @@ void StartMixer(void) if (!audio.sound_available) return; - /* initialize stereo position conversion information */ + // initialize stereo position conversion information for (i = 0; i <= SOUND_MAX_LEFT2RIGHT; i++) stereo_volume[i] = (int)sqrt((float)(SOUND_MAX_LEFT2RIGHT * SOUND_MAX_LEFT2RIGHT - i * i)); } -/* THE STUFF ABOVE IS ONLY USED BY THE SOUND SERVER CHILD PROCESS */ -/* ========================================================================= */ -/* THE STUFF BELOW IS ONLY USED BY THE MAIN PROCESS */ +// THE STUFF ABOVE IS ONLY USED BY THE SOUND SERVER CHILD PROCESS +// ============================================================================ +// THE STUFF BELOW IS ONLY USED BY THE MAIN PROCESS -#define CHUNK_ID_LEN 4 /* IFF style chunk id length */ -#define WAV_HEADER_SIZE 16 /* size of WAV file header */ +#define CHUNK_ID_LEN 4 // IFF style chunk id length +#define WAV_HEADER_SIZE 16 // size of WAV file header static void *Load_WAV(char *filename) { @@ -531,8 +538,10 @@ static void *Load_WAV(char *filename) if ((snd_info->data_ptr = Mix_LoadWAV(filename)) == NULL) { - Error(ERR_WARN, "cannot read sound file '%s': %s", filename, Mix_GetError()); + Warn("cannot read sound file '%s': %s", filename, Mix_GetError()); + free(snd_info); + return NULL; } @@ -555,8 +564,10 @@ static void *Load_MOD(char *filename) if ((mod_info->data_ptr = Mix_LoadMUS(filename)) == NULL) { - Error(ERR_WARN, "cannot read music file '%s': %s", filename, Mix_GetError()); + Warn("cannot read music file '%s': %s", filename, Mix_GetError()); + free(mod_info); + return NULL; } @@ -576,11 +587,19 @@ static void *Load_WAV_or_MOD(char *filename) return NULL; } -void LoadCustomMusic_NoConf(void) +static int compareMusicInfo(const void *object1, const void *object2) { - static boolean draw_init_text = TRUE; /* only draw at startup */ + const MusicInfo *mi1 = *((MusicInfo **)object1); + const MusicInfo *mi2 = *((MusicInfo **)object2); + + return strcmp(mi1->source_filename, mi2->source_filename); +} + +static void LoadCustomMusic_NoConf(void) +{ + static boolean draw_init_text = TRUE; // only draw at startup static char *last_music_directory = NULL; - char *music_directory = getCustomMusicDirectory(); + char *music_directory = getCustomMusicDirectory_NoConf(); Directory *dir; DirectoryEntry *dir_entry; int num_music = getMusicListSize(); @@ -590,7 +609,7 @@ void LoadCustomMusic_NoConf(void) if (last_music_directory != NULL && strEqual(last_music_directory, music_directory)) - return; /* old and new music directory are the same */ + return; // old and new music directory are the same if (last_music_directory != NULL) free(last_music_directory); @@ -598,26 +617,30 @@ void LoadCustomMusic_NoConf(void) FreeAllMusic_NoConf(); - if ((dir = openDirectory(music_directory)) == NULL) + if (music_directory == NULL) { - Error(ERR_WARN, "cannot read music directory '%s'", music_directory); + Warn("cannot find music directory with unconfigured music"); - audio.music_available = FALSE; + return; + } + else if ((dir = openDirectory(music_directory)) == NULL) + { + Warn("cannot read music directory '%s'", music_directory); return; } if (draw_init_text) - DrawInitText("Loading music", 120, FC_GREEN); + DrawInitTextHead("Loading music"); - while ((dir_entry = readDirectory(dir)) != NULL) /* loop all entries */ + while ((dir_entry = readDirectory(dir)) != NULL) // loop all entries { char *basename = dir_entry->basename; MusicInfo *mus_info = NULL; boolean music_already_used = FALSE; int i; - /* skip all music files that are configured in music config file */ + // skip all music files that are configured in music config file for (i = 0; i < num_music; i++) { struct FileInfo *music = getMusicListEntry(i); @@ -633,7 +656,7 @@ void LoadCustomMusic_NoConf(void) continue; if (draw_init_text) - DrawInitText(basename, 150, FC_YELLOW); + DrawInitTextItem(basename); if (FileIsMusic(dir_entry->filename)) mus_info = Load_WAV_or_MOD(dir_entry->filename); @@ -649,28 +672,36 @@ void LoadCustomMusic_NoConf(void) closeDirectory(dir); + // sort music files by filename + qsort(Music_NoConf, num_music_noconf, sizeof(MusicInfo *), compareMusicInfo); + 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); } +int getMusicListSize_NoConf(void) +{ + return num_music_noconf; +} + 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 */ + if (pos < 0 || pos >= num_sounds) // invalid sound return NULL; return (pos < num_list_entries ? &sound_info->file_list[list_pos] : @@ -683,7 +714,7 @@ struct FileInfo *getMusicListEntry(int pos) 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 */ + if (pos < 0 || pos >= num_music) // invalid music return NULL; return (pos < num_list_entries ? &music_info->file_list[list_pos] : @@ -699,7 +730,7 @@ static SoundInfo *getSoundInfoEntryFromSoundID(int pos) (SoundInfo **)(pos < num_list_entries ? sound_info->artwork_list : sound_info->dynamic_artwork_list); - if (pos < 0 || pos >= num_sounds) /* invalid sound */ + if (pos < 0 || pos >= num_sounds) // invalid sound return NULL; return snd_info[list_pos]; @@ -714,12 +745,12 @@ static MusicInfo *getMusicInfoEntryFromMusicID(int pos) (MusicInfo **)(pos < num_list_entries ? music_info->artwork_list : music_info->dynamic_artwork_list); - if (pos >= num_music) /* invalid music */ + if (pos >= num_music) // invalid music return NULL; - if (pos < 0) /* undefined music */ + if (pos < 0) // undefined music { - if (num_music_noconf == 0) /* no fallback music available */ + if (num_music_noconf == 0) // no fallback music available return NULL; pos = UNMAP_NOCONF_MUSIC(pos) % num_music_noconf; @@ -730,6 +761,16 @@ static MusicInfo *getMusicInfoEntryFromMusicID(int pos) return mus_info[list_pos]; } +char *getSoundInfoEntryFilename(int pos) +{ + SoundInfo *snd_info = getSoundInfoEntryFromSoundID(pos); + + if (snd_info == NULL) + return NULL; + + return getBaseNamePtr(snd_info->source_filename); +} + char *getMusicInfoEntryFilename(int pos) { MusicInfo *mus_info = getMusicInfoEntryFromMusicID(pos); @@ -740,27 +781,27 @@ char *getMusicInfoEntryFilename(int 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; } @@ -776,7 +817,7 @@ void InitSoundList(struct ConfigInfo *config_list, int num_file_list_entries, sound_info = checked_calloc(sizeof(struct ArtworkListInfo)); sound_info->type = ARTWORK_TYPE_SOUNDS; - /* ---------- initialize file list and suffix lists ---------- */ + // ---------- initialize file list and suffix lists ---------- sound_info->num_file_list_entries = num_file_list_entries; sound_info->num_dynamic_file_list_entries = 0; @@ -792,7 +833,7 @@ void InitSoundList(struct ConfigInfo *config_list, int num_file_list_entries, sound_info->suffix_list = config_suffix_list; - /* ---------- initialize base prefix and suffixes lists ---------- */ + // ---------- initialize base prefix and suffixes lists ---------- sound_info->num_base_prefixes = 0; for (i = 0; base_prefixes[i] != NULL; i++) @@ -824,7 +865,7 @@ void InitSoundList(struct ConfigInfo *config_list, int num_file_list_entries, sound_info->property_mapping = NULL; - /* ---------- initialize artwork reference and content lists ---------- */ + // ---------- initialize artwork reference and content lists ---------- sound_info->sizeof_artwork_list_entry = sizeof(SoundInfo *); @@ -834,7 +875,7 @@ void InitSoundList(struct ConfigInfo *config_list, int num_file_list_entries, sound_info->content_list = NULL; - /* ---------- initialize artwork loading/freeing functions ---------- */ + // ---------- initialize artwork loading/freeing functions ---------- sound_info->load_artwork = Load_WAV; sound_info->free_artwork = FreeSound; @@ -851,7 +892,7 @@ void InitMusicList(struct ConfigInfo *config_list, int num_file_list_entries, music_info = checked_calloc(sizeof(struct ArtworkListInfo)); music_info->type = ARTWORK_TYPE_MUSIC; - /* ---------- initialize file list and suffix lists ---------- */ + // ---------- initialize file list and suffix lists ---------- music_info->num_file_list_entries = num_file_list_entries; music_info->num_dynamic_file_list_entries = 0; @@ -867,7 +908,7 @@ void InitMusicList(struct ConfigInfo *config_list, int num_file_list_entries, music_info->suffix_list = config_suffix_list; - /* ---------- initialize base prefix and suffixes lists ---------- */ + // ---------- initialize base prefix and suffixes lists ---------- music_info->num_base_prefixes = 0; for (i = 0; base_prefixes[i] != NULL; i++) @@ -899,7 +940,7 @@ void InitMusicList(struct ConfigInfo *config_list, int num_file_list_entries, music_info->property_mapping = NULL; - /* ---------- initialize artwork reference and content lists ---------- */ + // ---------- initialize artwork reference and content lists ---------- music_info->sizeof_artwork_list_entry = sizeof(MusicInfo *); @@ -909,7 +950,7 @@ void InitMusicList(struct ConfigInfo *config_list, int num_file_list_entries, music_info->content_list = NULL; - /* ---------- initialize artwork loading/freeing functions ---------- */ + // ---------- initialize artwork loading/freeing functions ---------- music_info->load_artwork = Load_WAV_or_MOD; music_info->free_artwork = FreeMusic; @@ -923,6 +964,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 +1004,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; @@ -976,7 +1033,7 @@ void PlaySoundExt(int nr, int volume, int stereo_position, int state) else if (stereo_position > SOUND_MAX_RIGHT) stereo_position = SOUND_MAX_RIGHT; - clear_mem(&snd_ctrl, sizeof(SoundControl)); /* to make valgrind happy */ + clear_mem(&snd_ctrl, sizeof(SoundControl)); // to make valgrind happy snd_ctrl.active = TRUE; snd_ctrl.nr = nr; @@ -1000,12 +1057,12 @@ void FadeSound(int nr) StopSoundExt(nr, SND_CTRL_FADE_SOUND); } -void FadeSounds() +void FadeSounds(void) { StopSoundExt(-1, SND_CTRL_FADE_ALL); } -void FadeSoundsAndMusic() +void FadeSoundsAndMusic(void) { FadeSounds(); FadeMusic(); @@ -1024,7 +1081,7 @@ void StopSound(int nr) StopSoundExt(nr, SND_CTRL_STOP_SOUND); } -void StopSounds() +void StopSounds(void) { StopMusic(); StopSoundExt(-1, SND_CTRL_STOP_ALL); @@ -1037,7 +1094,7 @@ void StopSoundExt(int nr, int state) if (!audio.sound_available) return; - clear_mem(&snd_ctrl, sizeof(SoundControl)); /* to make valgrind happy */ + clear_mem(&snd_ctrl, sizeof(SoundControl)); // to make valgrind happy snd_ctrl.active = FALSE; snd_ctrl.nr = nr; @@ -1053,7 +1110,7 @@ void ExpireSoundLoops(boolean active) if (!audio.sound_available) return; - clear_mem(&snd_ctrl, sizeof(SoundControl)); /* to make valgrind happy */ + clear_mem(&snd_ctrl, sizeof(SoundControl)); // to make valgrind happy snd_ctrl.active = active; snd_ctrl.state = SND_CTRL_EXPIRE_LOOPS; @@ -1061,22 +1118,22 @@ void ExpireSoundLoops(boolean active) 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); - /* load all music files from directory not defined in "musicinfo.conf" */ + // load all music files from directory not defined in "musicinfo.conf" LoadCustomMusic_NoConf(); } -void InitReloadCustomSounds(char *set_identifier) +void InitReloadCustomSounds(void) { if (!audio.sound_available) return; @@ -1084,7 +1141,7 @@ void InitReloadCustomSounds(char *set_identifier) ReloadCustomSounds(); } -void InitReloadCustomMusic(char *set_identifier) +void InitReloadCustomMusic(void) { if (!audio.music_available) return; @@ -1127,7 +1184,7 @@ void FreeMusic(void *ptr) free(music); } -static void FreeAllMusic_NoConf() +static void FreeAllMusic_NoConf(void) { int i; @@ -1143,16 +1200,16 @@ static void FreeAllMusic_NoConf() num_music_noconf = 0; } -void FreeAllSounds() +void FreeAllSounds(void) { FreeCustomArtworkLists(sound_info); } -void FreeAllMusic() +void FreeAllMusic(void) { FreeCustomArtworkLists(music_info); FreeAllMusic_NoConf(); } -/* THE STUFF ABOVE IS ONLY USED BY THE MAIN PROCESS */ -/* ========================================================================= */ +// THE STUFF ABOVE IS ONLY USED BY THE MAIN PROCESS +// ============================================================================