X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsound.c;h=3e9c7112da72c573e71c8d75ae047e137dc97a24;hb=681721dddc91bcdaef50002d1e861cc8d484e938;hp=c690993ca6b39921f1536f53a0407e3b7e6fae07;hpb=e0560b41a1796a02b15937b0ae5453bca745e5ff;p=rocksndiamonds.git diff --git a/src/libgame/sound.c b/src/libgame/sound.c index c690993c..3e9c7112 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -1,7 +1,7 @@ /*********************************************************** * Artsoft Retro-Game Library * *----------------------------------------------------------* -* (c) 1994-2000 Artsoft Entertainment * +* (c) 1994-2001 Artsoft Entertainment * * Holger Schemel * * Detmolder Strasse 189 * * 33604 Bielefeld * @@ -11,17 +11,24 @@ * sound.c * ***********************************************************/ +#include #include #include #include +#include +#include #include "system.h" #include "sound.h" #include "misc.h" -static int num_sounds = 0; +static int num_sounds = 0, num_music = 0; static struct SampleInfo *Sound = NULL; +#if defined(TARGET_SDL) +static int num_mods = 0; +static struct SampleInfo *Mod = NULL; +#endif /*** THE STUFF BELOW IS ONLY USED BY THE SOUND SERVER CHILD PROCESS ***/ @@ -63,7 +70,7 @@ static void SoundServer_StopAllSounds(); #endif #if defined(PLATFORM_UNIX) -int OpenAudioDevice(char *audio_device_name) +static int OpenAudioDevice(char *audio_device_name) { int audio_fd; @@ -82,7 +89,7 @@ int OpenAudioDevice(char *audio_device_name) return audio_fd; } -void UnixOpenAudio(void) +static boolean TestAudioDevices(void) { static char *audio_device_name[] = { @@ -100,12 +107,50 @@ void UnixOpenAudio(void) if (audio_fd < 0) { Error(ERR_WARN, "cannot open audio device - no sound"); - return; + return FALSE; } close(audio_fd); audio.device_name = audio_device_name[i]; + + return TRUE; +} + +#if !defined(TARGET_SDL) +static boolean ForkAudioProcess(void) +{ + if (pipe(audio.soundserver_pipe) < 0) + { + Error(ERR_WARN, "cannot create pipe - no sounds"); + return FALSE; + } + + if ((audio.soundserver_pid = fork()) < 0) + { + Error(ERR_WARN, "cannot create sound server process - no sounds"); + return FALSE; + } + + if (audio.soundserver_pid == 0) /* we are child */ + { + SoundServer(); + + /* never reached */ + exit(0); + } + else /* we are parent */ + close(audio.soundserver_pipe[0]); /* no reading from pipe needed */ + + return TRUE; +} +#endif + +void UnixOpenAudio(void) +{ + if (!TestAudioDevices()) + return; + audio.sound_available = TRUE; audio.sound_enabled = TRUE; @@ -119,25 +164,44 @@ void UnixCloseAudio(void) { if (audio.device_fd) close(audio.device_fd); -} + if (audio.soundserver_pid) + kill(audio.soundserver_pid, SIGTERM); +} #endif /* PLATFORM_UNIX */ -void SoundServer() +void InitPlaylist(void) { int i; + + for(i=0;i=PSND_MAX_VOLUME/10) - playlist[i].volume-=PSND_MAX_VOLUME/20; + playlist[i].volume >= SOUND_FADING_VOLUME_THRESHOLD) + playlist[i].volume -= SOUND_FADING_VOLUME_STEP; /* adjust volume of actual sound sample */ if (playlist[i].volume != PSND_MAX_VOLUME) @@ -347,7 +411,7 @@ void SoundServer() playing_sounds--; } } - else if (playlist[i].volume <= PSND_MAX_VOLUME/10) + else if (playlist[i].volume <= SOUND_FADING_VOLUME_THRESHOLD) { playlist[i] = emptySoundControl; playing_sounds--; @@ -429,14 +493,10 @@ void SoundServer() close(audio.device_fd); } } - #endif /* !AUDIO_STREAMING_DSP */ - } - -#endif /* PLATFORM_UNIX */ - } +#endif /* PLATFORM_UNIX */ #if defined(PLATFORM_MSDOS) static void sound_handler(struct SoundControl snd_ctrl) @@ -801,48 +861,42 @@ static int ulaw_to_linear(unsigned char ulawbyte) /*** THE STUFF BELOW IS ONLY USED BY THE MAIN PROCESS ***/ -void AllocSoundArray(int num) -{ - num_sounds = num; - Sound = checked_calloc(num_sounds * sizeof(struct SampleInfo)); -} - #define CHUNK_ID_LEN 4 /* IFF style chunk id length */ #define WAV_HEADER_SIZE 20 /* size of WAV file header */ -boolean LoadSound(int sound_nr, char *sound_name) +static boolean LoadSoundExt(char *sound_name, boolean is_music) { - struct SampleInfo *snd_info = &Sound[sound_nr]; + struct SampleInfo *snd_info; char filename[256]; - char *sound_ext = "wav"; -#if !defined(TARGET_SDL) -#if !defined(PLATFORM_MSDOS) +#if !defined(TARGET_SDL) && !defined(PLATFORM_MSDOS) byte sound_header_buffer[WAV_HEADER_SIZE]; char chunk[CHUNK_ID_LEN + 1]; int chunk_length, dummy; FILE *file; int i; #endif -#endif + if (!audio.sound_available) + return FALSE; + + num_sounds++; + Sound = checked_realloc(Sound, num_sounds * sizeof(struct SampleInfo)); + + snd_info = &Sound[num_sounds - 1]; snd_info->name = sound_name; - sprintf(filename, "%s/%s/%s.%s", - options.ro_base_directory, SOUNDS_DIRECTORY, - snd_info->name, sound_ext); + sprintf(filename, "%s/%s/%s", options.ro_base_directory, + (is_music ? MUSIC_DIRECTORY : SOUNDS_DIRECTORY), snd_info->name); #if defined(TARGET_SDL) - snd_info->mix_chunk = Mix_LoadWAV(filename); - if (snd_info->mix_chunk == NULL) + if ((snd_info->mix_chunk = Mix_LoadWAV(filename)) == NULL) { Error(ERR_WARN, "cannot read sound file '%s' - no sounds", filename); return FALSE; } -#else /* !TARGET_SDL */ - -#if !defined(PLATFORM_MSDOS) +#elif defined(PLATFORM_UNIX) if ((file = fopen(filename, MODE_READ)) == NULL) { @@ -907,24 +961,114 @@ boolean LoadSound(int sound_nr, char *sound_name) return FALSE; } -#endif /* PLATFORM_MSDOS */ -#endif /* !TARGET_SDL */ +#endif return TRUE; } +boolean LoadSound(char *sound_name) +{ + return LoadSoundExt(sound_name, FALSE); +} + +boolean LoadMod(char *mod_name) +{ +#if defined(TARGET_SDL) + struct SampleInfo *mod_info; + char filename[256]; + + num_mods++; + Mod = checked_realloc(Mod, num_mods * sizeof(struct SampleInfo)); + + mod_info = &Mod[num_mods - 1]; + mod_info->name = mod_name; + + sprintf(filename, "%s/%s/%s", options.ro_base_directory, + MUSIC_DIRECTORY, mod_info->name); + + if ((mod_info->mix_music = Mix_LoadMUS(filename)) == NULL) + { + Error(ERR_WARN, "cannot read music file '%s' - no music", filename); + return FALSE; + } + + return TRUE; +#else + return FALSE; +#endif +} + +int LoadMusic(void) +{ + DIR *dir; + struct dirent *dir_entry; + char *music_directory = getPath2(options.ro_base_directory, MUSIC_DIRECTORY); + int num_wav_music = 0; + int num_mod_music = 0; + + if (!audio.sound_available) + return 0; + + if ((dir = opendir(music_directory)) == NULL) + { + Error(ERR_WARN, "cannot read music directory '%s'", music_directory); + audio.music_available = FALSE; + free(music_directory); + return 0; + } + + while ((dir_entry = readdir(dir)) != NULL) /* loop until last dir entry */ + { + char *filename = dir_entry->d_name; + + if (strlen(filename) > 4 && + strcmp(&filename[strlen(filename) - 4], ".wav") == 0) + { + if (LoadSoundExt(filename, TRUE)) + num_wav_music++; + } + else if (strlen(filename) > 4 && + (strcmp(&filename[strlen(filename) - 4], ".mod") == 0 || + strcmp(&filename[strlen(filename) - 4], ".MOD") == 0 || + strncmp(filename, "mod.", 4) == 0 || + strncmp(filename, "MOD.", 4) == 0)) + { + if (LoadMod(filename)) + num_mod_music++; + } + } + + closedir(dir); + + if (num_wav_music == 0 && num_mod_music == 0) + Error(ERR_WARN, "cannot find any valid music files in directory '%s'", + music_directory); + + free(music_directory); + + num_music = (num_mod_music > 0 ? num_mod_music : num_wav_music); + + audio.mods_available = (num_mod_music > 0); + audio.music_available = (num_music > 0); + + return num_music; +} + void PlayMusic(int nr) { if (!audio.music_available) return; + if (!audio.mods_available) + nr = num_sounds - num_music + nr; + #if defined(TARGET_SDL) - if (audio.mods_available) + if (audio.mods_available) /* play MOD music */ { Mix_VolumeMusic(SOUND_MAX_VOLUME); - /* start playing module */ + Mix_PlayMusic(Mod[nr].mix_music, -1); } - else /* play music loop */ + else /* play WAV music loop */ { Mix_Volume(audio.music_channel, SOUND_MAX_VOLUME); Mix_PlayChannel(audio.music_channel, Sound[nr].mix_chunk, -1); @@ -993,6 +1137,9 @@ void PlaySoundExt(int nr, int volume, int stereo, boolean loop) void FadeMusic(void) { #if defined(TARGET_SDL) + if (!audio.sound_available) + return; + if (audio.mods_available) Mix_FadeOutMusic(SOUND_FADING_INTERVAL); else @@ -1009,6 +1156,7 @@ void FadeSound(int nr) void FadeSounds() { + FadeMusic(); StopSoundExt(-1, SSND_FADE_ALL_SOUNDS); } @@ -1097,7 +1245,9 @@ void FreeSounds(int num_sounds) return; for(i=0; i