rnd-20020313-3-src
[rocksndiamonds.git] / src / libgame / sound.c
index 757a7bd5d8aff67305563fa72a5970534f891c2b..d97a4255664f7f83a8a1512b763fd0ce9d6285a2 100644 (file)
@@ -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                            *
@@ -117,6 +117,7 @@ static boolean TestAudioDevices(void)
   return TRUE;
 }
 
+#if !defined(TARGET_SDL)
 static boolean ForkAudioProcess(void)
 {
   if (pipe(audio.soundserver_pipe) < 0)
@@ -143,6 +144,7 @@ static boolean ForkAudioProcess(void)
 
   return TRUE;
 }
+#endif
 
 void UnixOpenAudio(void)
 {
@@ -179,6 +181,9 @@ void InitPlaylist(void)
 
 void StartSoundserver(void)
 {
+  if (!audio.sound_available)
+    return;
+
 #if defined(PLATFORM_UNIX) && !defined(TARGET_SDL)
   if (!ForkAudioProcess())
     audio.sound_available = FALSE;
@@ -866,11 +871,14 @@ static boolean LoadSoundExt(char *sound_name, boolean is_music)
 #if !defined(TARGET_SDL) && !defined(PLATFORM_MSDOS)
   byte sound_header_buffer[WAV_HEADER_SIZE];
   char chunk[CHUNK_ID_LEN + 1];
-  int chunk_length, dummy;
+  int chunk_size, dummy;
   FILE *file;
   int i;
 #endif
 
+  if (!audio.sound_available)
+    return FALSE;
+
   num_sounds++;
   Sound = checked_realloc(Sound, num_sounds * sizeof(struct SampleInfo));
 
@@ -897,7 +905,7 @@ static boolean LoadSoundExt(char *sound_name, boolean is_music)
   }
 
   /* read chunk "RIFF" */
-  getFileChunk(file, chunk, &chunk_length, BYTE_ORDER_LITTLE_ENDIAN);
+  getFileChunk(file, chunk, &chunk_size, BYTE_ORDER_LITTLE_ENDIAN);
   if (strcmp(chunk, "RIFF") != 0)
   {
     Error(ERR_WARN, "missing 'RIFF' chunk of sound file '%s'", filename);
@@ -919,7 +927,7 @@ static boolean LoadSoundExt(char *sound_name, boolean is_music)
     sound_header_buffer[i] = fgetc(file);
 
   /* read chunk "data" */
-  getFileChunk(file, chunk, &chunk_length, BYTE_ORDER_LITTLE_ENDIAN);
+  getFileChunk(file, chunk, &chunk_size, BYTE_ORDER_LITTLE_ENDIAN);
   if (strcmp(chunk, "data") != 0)
   {
     Error(ERR_WARN, "missing 'data' chunk of sound file '%s'", filename);
@@ -927,7 +935,7 @@ static boolean LoadSoundExt(char *sound_name, boolean is_music)
     return FALSE;
   }
 
-  snd_info->data_len = chunk_length;
+  snd_info->data_len = chunk_size;
   snd_info->data_ptr = checked_malloc(snd_info->data_len);
 
   /* read sound data */
@@ -998,6 +1006,9 @@ int LoadMusic(void)
   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);
@@ -1054,8 +1065,8 @@ void PlayMusic(int nr)
 #if defined(TARGET_SDL)
   if (audio.mods_available)    /* play MOD music */
   {
-    Mix_VolumeMusic(SOUND_MAX_VOLUME);
     Mix_PlayMusic(Mod[nr].mix_music, -1);
+    Mix_VolumeMusic(SOUND_MAX_VOLUME); /* must be _after_ Mix_PlayMusic()! */
   }
   else                         /* play WAV music loop */
   {
@@ -1126,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
@@ -1142,6 +1156,7 @@ void FadeSound(int nr)
 
 void FadeSounds()
 {
+  FadeMusic();
   StopSoundExt(-1, SSND_FADE_ALL_SOUNDS);
 }