rnd-20020428-1-src
authorHolger Schemel <info@artsoft.org>
Sun, 28 Apr 2002 16:04:07 +0000 (18:04 +0200)
committerHolger Schemel <info@artsoft.org>
Sat, 30 Aug 2014 08:37:11 +0000 (10:37 +0200)
src/libgame/sound.c
src/libgame/sound.h

index 7858f1f539b65bf19a126593088ee8a4cac11e8b..20a1978ee4465d7e108d96c84a90a2cc8bacb9ec 100644 (file)
@@ -357,7 +357,7 @@ void SoundServer(void)
               select(audio.soundserver_pipe[0] + 1,
                      &sound_fdset, NULL, NULL, &delay) < 1)
        {       
-         short *sample_ptr;
+         void *sample_ptr;
          int sample_size;
          int max_sample_size;
          int fragment_size = afmt.fragment_size;
@@ -380,23 +380,60 @@ void SoundServer(void)
              continue;
 
            /* get pointer and size of the actual sound sample */
-           sample_ptr = (short *)playlist[i].data_ptr +playlist[i].playingpos;
+           if (playlist[i].format == AUDIO_FORMAT_U8)
+             sample_ptr =
+               (byte *)playlist[i].data_ptr + playlist[i].playingpos;
+           else
+             sample_ptr =
+               (short *)playlist[i].data_ptr + playlist[i].playingpos;
+
            sample_size = MIN(max_sample_size,
                              playlist[i].data_len - playlist[i].playingpos);
            playlist[i].playingpos += sample_size;
 
            /* fill the first mixing buffer with original sample */
+#if 1
+           if (playlist[i].format == AUDIO_FORMAT_U8)
+             for (j=0; j<sample_size; j++)
+               premix_first_buffer[j] =
+                 ((short)(((byte *)sample_ptr)[j] ^ 0x80)) << 8;
+           else
+             for (j=0; j<sample_size; j++)
+               premix_first_buffer[j] = ((short *)sample_ptr)[j];
+#else
            memcpy(premix_first_buffer, sample_ptr,
-                  sample_size * sizeof(short));
+                  sample_size * (playlist[i].format == AUDIO_FORMAT_U8 ?
+                                 sizeof(byte) : sizeof(short)));
+#endif
 
            /* are we about to restart a looping sound? */
            if (playlist[i].loop && sample_size < max_sample_size)
            {
+#if 1
+             while (sample_size < max_sample_size)
+             {
+               int restarted_sample_size =
+                 MIN(max_sample_size - sample_size, playlist[i].data_len);
+
+               if (playlist[i].format == AUDIO_FORMAT_U8)
+                 for (j=0; j<restarted_sample_size; j++)
+                   premix_first_buffer[sample_size + j] =
+                     ((short)(((byte *)playlist[i].data_ptr)[j] ^ 0x80)) << 8;
+               else
+                 for (j=0; j<restarted_sample_size; j++)
+                   premix_first_buffer[sample_size + j] =
+                     ((short *)playlist[i].data_ptr)[j];
+
+               playlist[i].playingpos = restarted_sample_size;
+               sample_size += restarted_sample_size;
+             }
+#else
              playlist[i].playingpos = max_sample_size - sample_size;
              memcpy(premix_first_buffer + sample_size * sizeof(short),
                     playlist[i].data_ptr,
                     (max_sample_size - sample_size) * sizeof(short));
              sample_size = max_sample_size;
+#endif
            }
 
            /* decrease volume if sound is fading out */
@@ -713,6 +750,7 @@ static void SoundServer_InsertNewSound(struct SoundControl snd_ctrl)
 
       snd_ctrl.data_ptr = snd_info->data_ptr;
       snd_ctrl.data_len = snd_info->data_len;
+      snd_ctrl.format   = snd_info->format;
 
       playlist[i] = snd_ctrl;
       playing_sounds++;
@@ -1172,15 +1210,24 @@ static SoundInfo *Load_WAV(char *filename)
     return NULL;
   }
 
-  /* convert unsigned 8 bit sample data to signed 16 bit sample data */
+  if (0)
+  {
+    /* convert unsigned 8 bit sample data to signed 16 bit sample data */
+
+    data_ptr = checked_malloc(snd_info->data_len * sizeof(short));
 
-  data_ptr = checked_malloc(snd_info->data_len * sizeof(short));
+    for (i=0; i<snd_info->data_len; i++)
+      data_ptr[i] = ((short)(((byte *)snd_info->data_ptr)[i] ^ 0x80)) << 8;
 
-  for (i=0; i<snd_info->data_len; i++)
-    data_ptr[i] = ((short)(((byte *)snd_info->data_ptr)[i] ^ 0x80)) << 8;
+    free(snd_info->data_ptr);
+    snd_info->data_ptr = data_ptr;
 
-  free(snd_info->data_ptr);
-  snd_info->data_ptr = data_ptr;
+    snd_info->format = AUDIO_FORMAT_S16;
+  }
+  else
+  {
+    snd_info->format = AUDIO_FORMAT_U8;
+  }
 
 #endif /* PLATFORM_UNIX */
 
index 3986194ebfe687c496a13bb372381f4369227e4f..146623433f4c2a997e19ee20c99e3be41a3236a4 100644 (file)
@@ -199,6 +199,7 @@ struct SampleInfo
 
   long data_len;
   void *data_ptr;
+  int format;
 };
 
 typedef struct SampleInfo      SoundInfo;
@@ -224,6 +225,7 @@ struct SoundControl
 
   long data_len;
   void *data_ptr;
+  int format;
 
 #if defined(PLATFORM_MSDOS)
   int voice;