X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=blobdiff_plain;f=src%2Flibgame%2Fsound.c;h=f1c4aaf7fb5e259678d54ac3e4e345edf06e2f69;hp=fed5e3e9a2a3dd8546d0daa75ab91edc9aa15c73;hb=abe44529b439ad39b4d8dbf19cbd67c9b9844279;hpb=3d81daa33f1c59045b731ea422b5cd5505b7048e diff --git a/src/libgame/sound.c b/src/libgame/sound.c index fed5e3e9..f1c4aaf7 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -1,15 +1,13 @@ -/*********************************************************** -* Artsoft Retro-Game Library * -*----------------------------------------------------------* -* (c) 1994-2006 Artsoft Entertainment * -* Holger Schemel * -* Detmolder Strasse 189 * -* 33604 Bielefeld * -* Germany * -* e-mail: info@artsoft.org * -*----------------------------------------------------------* -* sound.c * -***********************************************************/ +// ============================================================================ +// Artsoft Retro-Game Library +// ---------------------------------------------------------------------------- +// (c) 1995-2014 by Artsoft Entertainment +// Holger Schemel +// info@artsoft.org +// http://www.artsoft.org/ +// ---------------------------------------------------------------------------- +// sound.c +// ============================================================================ #include #include @@ -138,10 +136,6 @@ struct SoundControl 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 */ - -#if defined(TARGET_ALLEGRO) - int voice; -#endif }; typedef struct SoundControl SoundControl; @@ -650,32 +644,15 @@ static boolean Mixer_ChannelExpired(int channel) return TRUE; #if defined(TARGET_SDL) - if (!Mix_Playing(channel)) return TRUE; - -#elif defined(TARGET_ALLEGRO) - - mixer[channel].playing_pos = voice_get_position(mixer[channel].voice); - mixer[channel].volume = voice_get_volume(mixer[channel].voice); - - /* sound sample has completed playing or was completely faded out */ - if (mixer[channel].playing_pos == -1 || mixer[channel].volume == 0) - return TRUE; - -#endif /* TARGET_ALLEGRO */ +#endif return FALSE; } static boolean Mixer_AllocateChannel(int channel) { -#if defined(TARGET_ALLEGRO) - mixer[channel].voice = allocate_voice((SAMPLE *)mixer[channel].data_ptr); - if (mixer[channel].voice < 0) - return FALSE; -#endif - return TRUE; } @@ -686,9 +663,6 @@ static void Mixer_SetChannelProperties(int channel) Mix_SetPanning(channel, SOUND_VOLUME_LEFT(mixer[channel].stereo_position), SOUND_VOLUME_RIGHT(mixer[channel].stereo_position)); -#elif defined(TARGET_ALLEGRO) - voice_set_volume(mixer[channel].voice, mixer[channel].volume); - voice_set_pan(mixer[channel].voice, mixer[channel].stereo_position); #endif } @@ -697,11 +671,6 @@ static void Mixer_StartChannel(int channel) #if defined(TARGET_SDL) Mix_PlayChannel(channel, mixer[channel].data_ptr, IS_LOOP(mixer[channel]) ? -1 : 0); -#elif defined(TARGET_ALLEGRO) - if (IS_LOOP(mixer[channel])) - voice_set_playmode(mixer[channel].voice, PLAYMODE_LOOP); - - voice_start(mixer[channel].voice); #endif } @@ -748,9 +717,6 @@ static void Mixer_StopChannel(int channel) #if defined(TARGET_SDL) Mix_HaltChannel(channel); -#elif defined(TARGET_ALLEGRO) - voice_set_volume(mixer[channel].voice, 0); - deallocate_voice(mixer[channel].voice); #endif mixer[channel].active = FALSE; @@ -775,9 +741,6 @@ static void Mixer_FadeChannel(int channel) #if defined(TARGET_SDL) Mix_FadeOutChannel(channel, SOUND_FADING_INTERVAL); -#elif defined(TARGET_ALLEGRO) - if (voice_check(mixer[channel].voice)) - voice_ramp_volume(mixer[channel].voice, SOUND_FADING_INTERVAL, 0); #endif } @@ -801,10 +764,6 @@ static void Mixer_UnFadeChannel(int channel) #if defined(TARGET_SDL) Mix_ExpireChannel(channel, -1); Mix_Volume(channel, mixer[channel].volume); -#elif defined(TARGET_ALLEGRO) - voice_stop_volumeramp(mixer[channel].voice); - voice_ramp_volume(mixer[channel].voice, SOUND_FADING_INTERVAL, - mixer[channel].volume); #endif } @@ -1563,17 +1522,6 @@ static void *Load_WAV(char *filename) snd_info->data_len = ((Mix_Chunk *)snd_info->data_ptr)->alen; -#elif defined(TARGET_ALLEGRO) - - if ((snd_info->data_ptr = load_sample(filename)) == NULL) - { - Error(ERR_WARN, "cannot read sound file '%s'", filename); - free(snd_info); - return NULL; - } - - snd_info->data_len = ((SAMPLE *)snd_info->data_ptr)->len; - #else /* AUDIO_UNIX_NATIVE */ clear_mem(&header, sizeof(struct SoundHeader_WAV)); /* to make gcc happy */ @@ -1773,14 +1721,108 @@ static void *Load_MOD(char *filename) static void *Load_WAV_or_MOD(char *filename) { +#if 1 + if (FileIsMusic(filename)) + return Load_MOD(filename); + else if (FileIsSound(filename)) + return Load_WAV(filename); + else + return NULL; +#else if (FileIsSound(filename)) return Load_WAV(filename); else if (FileIsMusic(filename)) return Load_MOD(filename); else return NULL; +#endif } +#if 1 + +void LoadCustomMusic_NoConf(void) +{ + static boolean draw_init_text = TRUE; /* only draw at startup */ + static char *last_music_directory = NULL; + char *music_directory = getCustomMusicDirectory(); + Directory *dir; + DirectoryEntry *dir_entry; + int num_music = getMusicListSize(); + + if (!audio.sound_available) + return; + + if (last_music_directory != NULL && + strEqual(last_music_directory, music_directory)) + return; /* old and new music directory are the same */ + + if (last_music_directory != NULL) + free(last_music_directory); + last_music_directory = getStringCopy(music_directory); + + FreeAllMusic_NoConf(); + + if ((dir = openDirectory(music_directory)) == NULL) + { + Error(ERR_WARN, "cannot read music directory '%s'", music_directory); + + audio.music_available = FALSE; + + return; + } + + if (draw_init_text) + DrawInitText("Loading music", 120, FC_GREEN); + + while ((dir_entry = readDirectory(dir)) != NULL) /* loop all entries */ + { + char *basename = dir_entry->basename; + char *filename = NULL; + MusicInfo *mus_info = NULL; + boolean music_already_used = FALSE; + int i; + + /* skip all music files that are configured in music config file */ + for (i = 0; i < num_music; i++) + { + struct FileInfo *music = getMusicListEntry(i); + + if (strEqual(basename, music->filename)) + { + music_already_used = TRUE; + break; + } + } + + if (music_already_used) + continue; + + if (draw_init_text) + DrawInitText(basename, 150, FC_YELLOW); + + filename = getPath2(music_directory, basename); + + if (FileIsMusic(basename)) + mus_info = Load_WAV_or_MOD(filename); + + free(filename); + + if (mus_info) + { + num_music_noconf++; + Music_NoConf = checked_realloc(Music_NoConf, + num_music_noconf * sizeof(MusicInfo *)); + Music_NoConf[num_music_noconf - 1] = mus_info; + } + } + + closeDirectory(dir); + + draw_init_text = FALSE; +} + +#else + void LoadCustomMusic_NoConf(void) { static boolean draw_init_text = TRUE; /* only draw at startup */ @@ -1806,7 +1848,9 @@ void LoadCustomMusic_NoConf(void) if ((dir = opendir(music_directory)) == NULL) { Error(ERR_WARN, "cannot read music directory '%s'", music_directory); + audio.music_available = FALSE; + return; } @@ -1860,6 +1904,8 @@ void LoadCustomMusic_NoConf(void) draw_init_text = FALSE; } +#endif + int getSoundListSize() { return (sound_info->num_file_list_entries + @@ -2092,21 +2138,33 @@ void PlayMusic(int nr) void PlaySound(int nr) { + if (!setup.sound_simple) + return; + PlaySoundExt(nr, SOUND_MAX_VOLUME, SOUND_MIDDLE, SND_CTRL_PLAY_SOUND); } void PlaySoundStereo(int nr, int stereo_position) { + if (!setup.sound_simple) + return; + PlaySoundExt(nr, SOUND_MAX_VOLUME, stereo_position, SND_CTRL_PLAY_SOUND); } void PlaySoundLoop(int nr) { + if (!setup.sound_loops) + return; + PlaySoundExt(nr, SOUND_MAX_VOLUME, SOUND_MIDDLE, SND_CTRL_PLAY_LOOP); } void PlaySoundMusic(int nr) { + if (!setup.sound_music) + return; + PlaySoundExt(nr, SOUND_MAX_VOLUME, SOUND_MIDDLE, SND_CTRL_PLAY_MUSIC); } @@ -2261,8 +2319,6 @@ void FreeSound(void *ptr) { #if defined(TARGET_SDL) Mix_FreeChunk(sound->data_ptr); -#elif defined(TARGET_ALLEGRO) - destroy_sample(sound->data_ptr); #else /* AUDIO_UNIX_NATIVE */ free(sound->data_ptr); #endif @@ -2287,8 +2343,6 @@ void FreeMusic(void *ptr) Mix_FreeMusic(music->data_ptr); else Mix_FreeChunk(music->data_ptr); -#elif defined(TARGET_ALLEGRO) - destroy_sample(music->data_ptr); #else /* AUDIO_UNIX_NATIVE */ free(music->data_ptr); #endif