rnd-19980930-1
[rocksndiamonds.git] / src / sound.c
index b234a89069f001bf31ea19869248d10b88ffc386..af9af974c33c8540c028cbfef04269f4c53946a4 100644 (file)
@@ -1,23 +1,24 @@
 /***********************************************************
 *  Rocks'n'Diamonds -- McDuffin Strikes Back!              *
 *----------------------------------------------------------*
-*  ©1995 Artsoft Development                               *
-*        Holger Schemel                                    *
-*        33659 Bielefeld-Senne                             *
-*        Telefon: (0521) 493245                            *
-*        eMail: aeglos@valinor.owl.de                      *
-*               aeglos@uni-paderborn.de                    *
-*               q99492@pbhrzx.uni-paderborn.de             *
+*  (c) 1995-98 Artsoft Entertainment                       *
+*              Holger Schemel                              *
+*              Oststrasse 11a                              *
+*              33604 Bielefeld                             *
+*              phone: ++49 +521 290471                     *
+*              email: aeglos@valinor.owl.de                *
 *----------------------------------------------------------*
 *  sound.c                                                 *
-*                                                          *
-*  Letzte Aenderung: 15.06.1995                            *
 ***********************************************************/
 
 #include "sound.h"
+#ifdef MSDOS
+extern void sound_handler(struct SoundControl);
+#endif
 
 /*** THE STUFF BELOW IS ONLY USED BY THE SOUND SERVER CHILD PROCESS ***/
 
+#ifndef MSDOS
 static struct SoundControl playlist[MAX_SOUNDS_PLAYING];
 static struct SoundControl emptySoundControl =
 {
@@ -30,18 +31,27 @@ static char premix_right_buffer[SND_BLOCKSIZE];
 static int premix_last_buffer[SND_BLOCKSIZE];
 static unsigned char playing_buffer[SND_BLOCKSIZE];
 static int playing_sounds = 0;
+#else
+struct SoundControl playlist[MAX_SOUNDS_PLAYING];
+struct SoundControl emptySoundControl;
+int playing_sounds;
+#endif
 
 void SoundServer()
 {
+  int i;
+#ifndef MSDOS
   struct SoundControl snd_ctrl;
   fd_set sound_fdset;
-  int i;
 
   close(sound_pipe[1]);                /* no writing into pipe needed */
+#endif
 
   for(i=0;i<MAX_SOUNDS_PLAYING;i++)
     playlist[i] = emptySoundControl;
+  playing_sounds = 0;
 
+#ifndef MSDOS
   stereo_volume[PSND_MAX_LEFT2RIGHT] = 0;
   for(i=0;i<PSND_MAX_LEFT2RIGHT;i++)
     stereo_volume[i] =
@@ -297,6 +307,7 @@ void SoundServer()
 #endif /* von '#ifdef VOXWARE' */
 
   }
+#endif
 }
 
 void SoundServer_InsertNewSound(struct SoundControl snd_ctrl)
@@ -310,8 +321,11 @@ void SoundServer_InsertNewSound(struct SoundControl snd_ctrl)
 
     for(i=0;i<MAX_SOUNDS_PLAYING;i++)
     {
-      int actual =
-       100 * playlist[i].playingpos / playlist[i].data_len;
+#ifndef MSDOS
+      int actual = 100 * playlist[i].playingpos / playlist[i].data_len;
+#else
+      int actual = playlist[i].playingpos;
+#endif
 
       if (!playlist[i].loop && actual>longest)
       {
@@ -319,6 +333,10 @@ void SoundServer_InsertNewSound(struct SoundControl snd_ctrl)
        longest_nr=i;
       }
     }
+#ifdef MSDOS
+    voice_set_volume(playlist[longest_nr].voice, 0);
+    deallocate_voice(playlist[longest_nr].voice);
+#endif
     playlist[longest_nr] = emptySoundControl;
     playing_sounds--;
   }
@@ -339,6 +357,11 @@ void SoundServer_InsertNewSound(struct SoundControl snd_ctrl)
       {
        playlist[i].fade_sound = FALSE;
        playlist[i].volume = PSND_MAX_VOLUME;
+#ifdef MSDOS
+        playlist[i].loop = PSND_LOOP;
+        voice_stop_volumeramp(playlist[i].voice);
+        voice_ramp_volume(playlist[i].voice, playlist[i].volume, 1000);
+#endif
       }
     }
     return;
@@ -357,13 +380,21 @@ void SoundServer_InsertNewSound(struct SoundControl snd_ctrl)
       if (!playlist[i].active || playlist[i].nr != snd_ctrl.nr)
        continue;
 
+#ifndef MSDOS
       actual = 100 * playlist[i].playingpos / playlist[i].data_len;
+#else
+      actual = playlist[i].playingpos;
+#endif
       if (actual>=longest)
       {
        longest=actual;
        longest_nr=i;
       }
     }
+#ifdef MSDOS
+    voice_set_volume(playlist[longest_nr].voice, 0);
+    deallocate_voice(playlist[longest_nr].voice);
+#endif
     playlist[longest_nr] = emptySoundControl;
     playing_sounds--;
   }
@@ -375,6 +406,14 @@ void SoundServer_InsertNewSound(struct SoundControl snd_ctrl)
     {
       playlist[i] = snd_ctrl;
       playing_sounds++;
+#ifdef MSDOS
+      playlist[i].voice = allocate_voice(Sound[snd_ctrl.nr].sample_ptr);
+      if(snd_ctrl.loop)
+        voice_set_playmode(playlist[i].voice, PLAYMODE_LOOP);
+      voice_set_volume(playlist[i].voice, snd_ctrl.volume);
+      voice_set_pan(playlist[i].voice, snd_ctrl.stereo);
+      voice_start(playlist[i].voice);       
+#endif
       break;
     }
   }
@@ -404,12 +443,18 @@ void SoundServer_StopSound(int nr)
   for(i=0;i<MAX_SOUNDS_PLAYING;i++)
     if (playlist[i].nr == nr)
     {
+#ifdef MSDOS
+      voice_set_volume(playlist[i].voice, 0);
+      deallocate_voice(playlist[i].voice);
+#endif
       playlist[i] = emptySoundControl;
       playing_sounds--;
     }
 
+#ifndef MSDOS
   if (!playing_sounds)
     close(sound_device);
+#endif
 }
 
 void SoundServer_StopAllSounds()
@@ -417,10 +462,18 @@ void SoundServer_StopAllSounds()
   int i;
 
   for(i=0;i<MAX_SOUNDS_PLAYING;i++)
+  {
+#ifdef MSDOS
+    voice_set_volume(playlist[i].voice, 0);
+    deallocate_voice(playlist[i].voice);
+#endif
     playlist[i]=emptySoundControl;
-  playing_sounds=0;
+  }
+  playing_sounds = 0;
 
+#ifndef MSDOS
   close(sound_device);
+#endif
 }
 
 #ifdef HPUX_AUDIO
@@ -565,16 +618,28 @@ int ulaw_to_linear(unsigned char ulawbyte)
 
 /*** THE STUFF BELOW IS ONLY USED BY THE MAIN PROCESS ***/
 
+static unsigned long be2long(unsigned long *be)        /* big-endian -> longword */
+{
+  unsigned char *ptr = (unsigned char *)be;
+
+  return(ptr[0]<<24 | ptr[1]<<16 | ptr[2]<<8 | ptr[3]);
+}
+
 BOOL LoadSound(struct SoundInfo *snd_info)
 {
   FILE *file;
   char filename[256];
+#ifndef MSDOS
   char *sound_ext = "8svx";
-  struct SoundHeader_8SVX *snd_hdr;
+#else
+  char *sound_ext = "wav";
+#endif
+  struct SoundHeader_8SVX *sound_header;
   unsigned char *ptr;
 
   sprintf(filename,"%s/%s.%s",SND_PATH,snd_info->name,sound_ext);
 
+#ifndef MSDOS
   if (!(file=fopen(filename,"r")))
   {
     fprintf(stderr,"%s: cannot open sound file '%s' - no sounds\n",
@@ -611,43 +676,62 @@ BOOL LoadSound(struct SoundInfo *snd_info)
 
   fclose(file);
 
-  snd_hdr = (struct SoundHeader_8SVX *)snd_info->file_ptr;
+  sound_header = (struct SoundHeader_8SVX *)snd_info->file_ptr;
 
-  if (strncmp(snd_hdr->magic_FORM,"FORM",4) ||
-      snd_info->file_len!=be2long(&snd_hdr->chunk_size)+8 ||
-      strncmp(snd_hdr->magic_8SVX,"8SVX",4))
+  if (strncmp(sound_header->magic_FORM,"FORM",4) ||
+      snd_info->file_len != be2long(&sound_header->chunk_size)+8 ||
+      strncmp(sound_header->magic_8SVX,"8SVX",4))
   {
     fprintf(stderr,"%s: '%s' is not an IFF/8SVX file or broken- no sounds\n",
            progname,filename);
     return(FALSE);
   }
 
-  ptr = (unsigned char *)snd_info->file_ptr;
+  ptr = snd_info->file_ptr + 12;
 
-  while(ptr<(unsigned char *)snd_info->file_ptr+snd_info->file_len)
+  while(ptr < (unsigned char *)(snd_info->file_ptr + snd_info->file_len))
   {
     if (!strncmp(ptr,"VHDR",4))
     {
-      ptr+=be2long((unsigned long *)(ptr+4));
+      ptr += be2long((unsigned long *)(ptr + 4)) + 8;
+      continue;
     }
-    if (!strncmp(ptr,"ANNO",4))
+    else if (!strncmp(ptr,"ANNO",4))
     {
-      ptr+=be2long((unsigned long *)(ptr+4));
+      ptr += be2long((unsigned long *)(ptr + 4)) + 8;
+      continue;
     }
-    if (!strncmp(ptr,"CHAN",4))
+    else if (!strncmp(ptr,"CHAN",4))
     {
-      ptr+=be2long((unsigned long *)(ptr+4));
+      ptr += be2long((unsigned long *)(ptr + 4)) + 8;
+      continue;
     }
-    if (!strncmp(ptr,"BODY",4))
+    else if (!strncmp(ptr,"BODY",4))
     {
-      snd_info->data_ptr = ptr+8;
-      snd_info->data_len = be2long((unsigned long *)(ptr+4));
+      snd_info->data_ptr = ptr + 8;
+      snd_info->data_len = be2long((unsigned long *)(ptr + 4));
       return(TRUE);
     }
-    ptr++;
+    else
+    {
+      /* other chunk not recognized here */
+      ptr += be2long((unsigned long *)(ptr + 4)) + 8;
+      continue;
+    }
   }
 
   return(FALSE);
+#else
+  snd_info->sample_ptr = load_sample(filename);
+  if(!snd_info->sample_ptr)
+  {
+    fprintf(stderr,"%s: cannot read sound file '%s' - no sounds\n",
+           progname,filename);
+    fclose(file);
+    return(FALSE);
+  }
+  return(TRUE);
+#endif  // von  #ifndef MSDOS
 }
 
 void PlaySound(int nr)
@@ -690,12 +774,16 @@ void PlaySoundExt(int nr, int volume, int stereo, BOOL loop)
   snd_ctrl.data_ptr    = Sound[nr].data_ptr;
   snd_ctrl.data_len    = Sound[nr].data_len;
 
+#ifndef MSDOS
   if (write(sound_pipe[1], &snd_ctrl, sizeof(snd_ctrl))<0)
   {
     fprintf(stderr,"%s: cannot pipe to child process - no sounds\n",progname);
     sound_status=SOUND_OFF;
     return;
   }
+#else
+  sound_handler(snd_ctrl);
+#endif
 }
 
 void FadeSound(int nr)
@@ -736,12 +824,16 @@ void StopSoundExt(int nr, int method)
     snd_ctrl.stop_sound = TRUE;
   }
 
+#ifndef MSDOS
   if (write(sound_pipe[1], &snd_ctrl, sizeof(snd_ctrl))<0)
   {
     fprintf(stderr,"%s: cannot pipe to child process - no sounds\n",progname);
     sound_status=SOUND_OFF;
     return;
   }
+#else
+  sound_handler(snd_ctrl);
+#endif
 }
 
 void FreeSounds(int max)
@@ -752,7 +844,11 @@ void FreeSounds(int max)
     return;
 
   for(i=0;i<max;i++)
+#ifndef MSDOS
     free(Sound[i].file_ptr);
+#else
+    destroy_sample(Sound[i].sample_ptr);
+#endif
 }
 
 /*** THE STUFF ABOVE IS ONLY USED BY THE MAIN PROCESS ***/