rnd-20001129-1-src
[rocksndiamonds.git] / src / sound.c
index 185b1822d9bbe3213a927ba37c803a671897107a..628dc047c11c66d9c9eecada841222e335873f01 100644 (file)
@@ -91,9 +91,14 @@ int CheckAudio(char *audio_device_name)
   return SOUND_AVAILABLE;
 }
 
-boolean UnixInitAudio(void)
+void UnixInitAudio(struct AudioSystemInfo *audio)
 {
-  return TRUE;
+  if (!(audio->sound_available = CheckAudio(sound_device_name)))
+    return;
+
+#ifdef VOXWARE
+  audio->loops_available = TRUE;
+#endif
 }
 #endif /* PLATFORM_UNIX */
 
@@ -104,7 +109,7 @@ void SoundServer()
   struct SoundControl snd_ctrl;
   fd_set sound_fdset;
 
-  close(sysinfo.audio_process_pipe[1]);        /* no writing into pipe needed */
+  close(audio.soundserver_pipe[1]);    /* no writing into pipe needed */
 #endif
 
   for(i=0;i<MAX_SOUNDS_PLAYING;i++)
@@ -122,15 +127,15 @@ void SoundServer()
 #endif
 
   FD_ZERO(&sound_fdset); 
-  FD_SET(sysinfo.audio_process_pipe[0], &sound_fdset);
+  FD_SET(audio.soundserver_pipe[0], &sound_fdset);
 
   while(1)     /* wait for sound playing commands from client */
   {
-    FD_SET(sysinfo.audio_process_pipe[0], &sound_fdset);
-    select(sysinfo.audio_process_pipe[0] + 1, &sound_fdset, NULL, NULL, NULL);
-    if (!FD_ISSET(sysinfo.audio_process_pipe[0], &sound_fdset))
+    FD_SET(audio.soundserver_pipe[0], &sound_fdset);
+    select(audio.soundserver_pipe[0] + 1, &sound_fdset, NULL, NULL, NULL);
+    if (!FD_ISSET(audio.soundserver_pipe[0], &sound_fdset))
       continue;
-    if (read(sysinfo.audio_process_pipe[0], &snd_ctrl, sizeof(snd_ctrl))
+    if (read(audio.soundserver_pipe[0], &snd_ctrl, sizeof(snd_ctrl))
        != sizeof(snd_ctrl))
       Error(ERR_EXIT_SOUND_SERVER, "broken pipe - no sounds");
 
@@ -154,7 +159,7 @@ void SoundServer()
        playlist[i]=emptySoundControl;
       playing_sounds=0;
 
-      close(sysinfo.audio_fd);
+      close(audio.device_fd);
     }
     else if (snd_ctrl.stop_sound)
     {
@@ -169,7 +174,7 @@ void SoundServer()
        }
 
       if (!playing_sounds)
-       close(sysinfo.audio_fd);
+       close(audio.device_fd);
     }
 
     if (playing_sounds || snd_ctrl.active)
@@ -189,7 +194,7 @@ void SoundServer()
 #endif
 
       if (playing_sounds ||
-         (sysinfo.audio_fd = OpenAudio(sound_device_name)) >= 0)
+         (audio.device_fd = OpenAudio(sound_device_name)) >= 0)
       {
        if (!playing_sounds)    /* we just opened the audio device */
        {
@@ -197,13 +202,12 @@ void SoundServer()
          /* (with stereo the effective buffer size will shrink to 256) */
          fragment_size = 0x00020009;
 
-         if (ioctl(sysinfo.audio_fd, SNDCTL_DSP_SETFRAGMENT, &fragment_size)
-             < 0)
+         if (ioctl(audio.device_fd,SNDCTL_DSP_SETFRAGMENT,&fragment_size) < 0)
            Error(ERR_EXIT_SOUND_SERVER,
                  "cannot set fragment size of /dev/dsp - no sounds");
 
          /* try if we can use stereo sound */
-         if (ioctl(sysinfo.audio_fd, SNDCTL_DSP_STEREO, &stereo) < 0)
+         if (ioctl(audio.device_fd, SNDCTL_DSP_STEREO, &stereo) < 0)
          {
 #ifdef DEBUG
            static boolean reported = FALSE;
@@ -217,13 +221,12 @@ void SoundServer()
            stereo = FALSE;
          }
 
-         if (ioctl(sysinfo.audio_fd, SNDCTL_DSP_SPEED, &sample_rate) < 0)
+         if (ioctl(audio.device_fd, SNDCTL_DSP_SPEED, &sample_rate) < 0)
            Error(ERR_EXIT_SOUND_SERVER,
                  "cannot set sample rate of /dev/dsp - no sounds");
 
          /* get the real fragmentation size; this should return 512 */
-         if (ioctl(sysinfo.audio_fd, SNDCTL_DSP_GETBLKSIZE, &fragment_size)
-             < 0)
+         if (ioctl(audio.device_fd, SNDCTL_DSP_GETBLKSIZE,&fragment_size) < 0)
            Error(ERR_EXIT_SOUND_SERVER,
                  "cannot get fragment size of /dev/dsp - no sounds");
 
@@ -234,10 +237,10 @@ void SoundServer()
          SoundServer_InsertNewSound(snd_ctrl);
 
        while(playing_sounds &&
-             select(sysinfo.audio_process_pipe[0] + 1,
+             select(audio.soundserver_pipe[0] + 1,
                     &sound_fdset, NULL, NULL, &delay) < 1)
        {       
-         FD_SET(sysinfo.audio_process_pipe[0], &sound_fdset);
+         FD_SET(audio.soundserver_pipe[0], &sound_fdset);
 
          /* first clear the last premixing buffer */
          memset(premix_last_buffer,0,fragment_size*sizeof(int));
@@ -334,12 +337,12 @@ void SoundServer()
          }
 
          /* finally play the sound fragment */
-         write(sysinfo.audio_fd, playing_buffer,fragment_size);
+         write(audio.device_fd, playing_buffer,fragment_size);
        }
 
        /* if no sounds playing, free device for other sound programs */
        if (!playing_sounds)
-         close(sysinfo.audio_fd);
+         close(audio.device_fd);
       }
     }
 
@@ -354,15 +357,15 @@ void SoundServer()
       int wait_percent = 90;   /* wait 90% of the real playing time */
       int i;
 
-      if ((sysinfo.audio_fd = OpenAudio(sound_device_name)) >= 0)
+      if ((audio.device_fd = OpenAudio(sound_device_name)) >= 0)
       {
        playing_sounds = 1;
 
        while(playing_sounds &&
-             select(sysinfo.audio_process_pipe[0] + 1,
+             select(audio.soundserver_pipe[0] + 1,
                     &sound_fdset, NULL, NULL, &delay) < 1)
        {       
-         FD_SET(sysinfo.audio_process_pipe[0], &sound_fdset);
+         FD_SET(audio.soundserver_pipe[0], &sound_fdset);
 
          /* get pointer and size of the actual sound sample */
          sample_ptr = snd_ctrl.data_ptr + snd_ctrl.playingpos;
@@ -389,12 +392,12 @@ void SoundServer()
            playing_sounds = 0;
 
          /* finally play the sound fragment */
-         write(sysinfo.audio_fd,playing_buffer,sample_size);
+         write(audio.device_fd,playing_buffer,sample_size);
 
          delay.tv_sec = 0;
          delay.tv_usec = ((sample_size*10*wait_percent)/(sample_rate))*1000;
        }
-       close(sysinfo.audio_fd);
+       close(audio.device_fd);
       }
     }
 
@@ -608,7 +611,7 @@ static void SoundServer_StopSound(int nr)
 
 #if !defined(PLATFORM_MSDOS)
   if (!playing_sounds)
-    close(sysinfo.audio_fd);
+    close(audio.device_fd);
 #endif
 }
 
@@ -627,7 +630,7 @@ static void SoundServer_StopAllSounds()
   playing_sounds = 0;
 
 #if !defined(PLATFORM_MSDOS)
-  close(sysinfo.audio_fd);
+  close(audio.device_fd);
 #endif
 }
 #endif /* PLATFORM_MSDOS */
@@ -891,7 +894,7 @@ void PlaySoundExt(int nr, int volume, int stereo, boolean loop)
 {
   struct SoundControl snd_ctrl = emptySoundControl;
 
-  if (!sysinfo.audio_available || !setup.sound)
+  if (!audio.sound_available || !setup.sound)
     return;
 
   if (volume<PSND_MIN_VOLUME)
@@ -921,10 +924,10 @@ void PlaySoundExt(int nr, int volume, int stereo, boolean loop)
 
 #else
 #if !defined(PLATFORM_MSDOS)
-  if (write(sysinfo.audio_process_pipe[1], &snd_ctrl, sizeof(snd_ctrl)) < 0)
+  if (write(audio.soundserver_pipe[1], &snd_ctrl, sizeof(snd_ctrl)) < 0)
   {
     Error(ERR_WARN, "cannot pipe to child process - no sounds");
-    sysinfo.audio_available = FALSE;
+    audio.sound_available = FALSE;
     return;
   }
 #else
@@ -957,7 +960,7 @@ void StopSoundExt(int nr, int method)
 {
   struct SoundControl snd_ctrl = emptySoundControl;
 
-  if (!sysinfo.audio_available)
+  if (!audio.sound_available)
     return;
 
   if (SSND_FADING(method))
@@ -986,10 +989,10 @@ void StopSoundExt(int nr, int method)
 
 #else
 #if !defined(PLATFORM_MSDOS)
-  if (write(sysinfo.audio_process_pipe[1], &snd_ctrl, sizeof(snd_ctrl)) < 0)
+  if (write(audio.soundserver_pipe[1], &snd_ctrl, sizeof(snd_ctrl)) < 0)
   {
     Error(ERR_WARN, "cannot pipe to child process - no sounds");
-    sysinfo.audio_available = FALSE;
+    audio.sound_available = FALSE;
     return;
   }
 #else
@@ -1002,7 +1005,7 @@ void FreeSounds(int num_sounds)
 {
   int i;
 
-  if (!sysinfo.audio_available)
+  if (!audio.sound_available)
     return;
 
   for(i=0; i<num_sounds; i++)