rnd-20070913-1-src
[rocksndiamonds.git] / src / libgame / sound.c
index c8d61a828abbd877fee2c5d641132d970089a470..b80cccab57ca3636078e1d8af1e23fb376d2f97e 100644 (file)
@@ -1,7 +1,7 @@
 /***********************************************************
 * Artsoft Retro-Game Library                               *
 *----------------------------------------------------------*
-* (c) 1994-2002 Artsoft Entertainment                      *
+* (c) 1994-2006 Artsoft Entertainment                      *
 *               Holger Schemel                             *
 *               Detmolder Strasse 189                      *
 *               33604 Bielefeld                            *
 #define SAME_SOUND_NR(x,y)             ((x).nr == (y).nr)
 #define SAME_SOUND_DATA(x,y)           ((x).data_ptr == (y).data_ptr)
 
-#if 0
-struct SoundHeader_SUN
-{
-  unsigned long magic;
-  unsigned long hdr_size;
-  unsigned long data_size;
-  unsigned long encoding;
-  unsigned long sample_rate;
-  unsigned long channels;
-};
-
-struct SoundHeader_8SVX
-{
-  char magic_FORM[4];
-  unsigned long chunk_size;
-  char magic_8SVX[4];
-};
-#endif
-
 #if defined(AUDIO_UNIX_NATIVE)
 struct SoundHeader_WAV
 {
@@ -151,16 +132,8 @@ typedef struct SoundControl SoundControl;
 static struct ArtworkListInfo *sound_info = NULL;
 static struct ArtworkListInfo *music_info = NULL;
 
-#if 0
-static SoundInfo **Sound = NULL;
-#endif
-
 static MusicInfo **Music_NoConf = NULL;
 
-#if 0
-static int num_sounds = 0;
-#endif
-
 static int num_music_noconf = 0;
 static int stereo_volume[SOUND_MAX_LEFT2RIGHT + 1];
 
@@ -271,11 +244,6 @@ static boolean ForkAudioProcess(void)
   if (audio.mixer_pid == 0)            /* we are the child process */
     audio.mixer_pid = getpid();
 
-#if 0
-  printf("PID: %d [%s]\n", getpid(),(IS_CHILD_PROCESS() ? "child" : "parent"));
-  Delay(10000 * 0);
-#endif
-
   if (IS_CHILD_PROCESS())
     Mixer_Main();                      /* this function never returns */
   else
@@ -515,7 +483,7 @@ static void WriteReloadInfoToPipe(char *set_identifier, int type)
   if (leveldir_current == NULL)                /* should never happen */
     Error(ERR_EXIT, "leveldir_current == NULL");
 
-  memset(&snd_ctrl, 0, sizeof(SoundControl));  /* to make valgrind happy */
+  clear_mem(&snd_ctrl, sizeof(SoundControl));  /* to make valgrind happy */
 
   snd_ctrl.active = FALSE;
   snd_ctrl.state = type;
@@ -569,8 +537,7 @@ static void ReadReloadInfoFromPipe(SoundControl *snd_ctrl)
                                     &setup.override_level_sounds :
                                     &setup.override_level_music);
 
-  if (set_identifier)
-    free(set_identifier);
+  checked_free(set_identifier);
 
   set_identifier = checked_malloc(snd_ctrl->data_len);
 
@@ -579,16 +546,12 @@ static void ReadReloadInfoFromPipe(SoundControl *snd_ctrl)
 
   if (ti == NULL)
     ti = *ti_ptr = checked_calloc(sizeof(TreeInfo));
-  if (leveldir_current->fullpath != NULL)
-    free(leveldir_current->fullpath);
-  if (leveldir_current->sounds_path != NULL)
-    free(leveldir_current->sounds_path);
-  if (leveldir_current->music_path != NULL)
-    free(leveldir_current->music_path);
-  if (ti->basepath != NULL)
-    free(ti->basepath);
-  if (ti->fullpath != NULL)
-    free(ti->fullpath);
+
+  checked_free(leveldir_current->fullpath);
+  checked_free(leveldir_current->sounds_path);
+  checked_free(leveldir_current->music_path);
+  checked_free(ti->basepath);
+  checked_free(ti->fullpath);
 
   if (read(audio.mixer_pipe[0], set_identifier,
           snd_ctrl->data_len) != snd_ctrl->data_len ||
@@ -836,22 +799,6 @@ static void Mixer_InsertSound(SoundControl snd_ctrl)
   int num_sounds = getSoundListSize();
   int num_music  = getMusicListSize();
 
-#if 0
-  if (IS_MUSIC(snd_ctrl))
-    printf("NEW MUSIC %d ARRIVED [%d/%d] [%d ACTIVE CHANNELS]\n",
-          snd_ctrl.nr, num_music, num_music_noconf, mixer_active_channels);
-  else
-    printf("NEW SOUND %d ARRIVED [%d] [%d ACTIVE CHANNELS]\n",
-          snd_ctrl.nr, num_sounds, mixer_active_channels);
-#endif
-
-#if 0
-  /* !!! TEST ONLY !!! */
-  if (IS_MUSIC(snd_ctrl))
-    snd_ctrl.nr = 0;
-#endif
-
-#if 1
   if (IS_MUSIC(snd_ctrl))
   {
     if (snd_ctrl.nr >= num_music)      /* invalid music */
@@ -876,32 +823,6 @@ static void Mixer_InsertSound(SoundControl snd_ctrl)
     snd_info = getSoundInfoEntryFromSoundID(snd_ctrl.nr);
   }
 
-  /*
-  if (snd_ctrl.nr >= (IS_MUSIC(snd_ctrl) ? num_music : num_sounds))
-    return;
-  */
-#else
-  if (IS_MUSIC(snd_ctrl))
-  {
-    if (num_music_noconf == 0)
-      return;
-
-    snd_ctrl.nr = snd_ctrl.nr % num_music_noconf;
-  }
-  else if (snd_ctrl.nr >= num_sounds)
-    return;
-#endif
-
-#if 0
-#if 1
-  snd_info = (IS_MUSIC(snd_ctrl) ? getMusicInfoEntryFromMusicID(snd_ctrl.nr) :
-             getSoundInfoEntryFromSoundID(snd_ctrl.nr));
-#else
-  snd_info = (IS_MUSIC(snd_ctrl) ? Music_NoConf[snd_ctrl.nr] :
-             getSoundInfoEntryFromSoundID(snd_ctrl.nr));
-#endif
-#endif
-
   if (snd_info == NULL)
     return;
 
@@ -915,10 +836,6 @@ static void Mixer_InsertSound(SoundControl snd_ctrl)
   /* play music samples on a dedicated music channel */
   if (IS_MUSIC(snd_ctrl))
   {
-#if 0
-    printf("::: slot %d, ptr 0x%08x\n", snd_ctrl.nr, snd_ctrl.data_ptr);
-#endif
-
     Mixer_StopMusicChannel();
 
     mixer[audio.music_channel] = snd_ctrl;
@@ -932,10 +849,6 @@ static void Mixer_InsertSound(SoundControl snd_ctrl)
     if (mixer[i].active && SAME_SOUND_DATA(mixer[i], snd_ctrl))
       k++;
 
-#if 0
-  printf("SOUND %d [CURRENTLY PLAYING %d TIMES]\n", snd_ctrl.nr, k);
-#endif
-
   /* reset expiration delay for already playing loop sounds */
   if (k > 0 && IS_LOOP(snd_ctrl))
   {
@@ -943,10 +856,6 @@ static void Mixer_InsertSound(SoundControl snd_ctrl)
     {
       if (mixer[i].active && SAME_SOUND_DATA(mixer[i], snd_ctrl))
       {
-#if 0
-       printf("RESETTING EXPIRATION FOR SOUND %d\n", snd_ctrl.nr);
-#endif
-
        if (IS_FADING(mixer[i]))
          Mixer_UnFadeChannel(i);
 
@@ -956,21 +865,12 @@ static void Mixer_InsertSound(SoundControl snd_ctrl)
 
        Mixer_SetChannelProperties(i);
        Mixer_ResetChannelExpiration(i);
-
-#if 0
-       printf("RESETTING VOLUME/STEREO FOR SOUND %d TO %d/%d\n",
-              snd_ctrl.nr, snd_ctrl.volume, snd_ctrl.stereo_position);
-#endif
       }
     }
 
     return;
   }
 
-#if 0
-  printf("PLAYING NEW SOUND %d\n", snd_ctrl.nr);
-#endif
-
   /* don't play sound more than n times simultaneously (with n == 2 for now) */
   if (k >= 2)
   {
@@ -1013,8 +913,8 @@ static void Mixer_InsertSound(SoundControl snd_ctrl)
     {
       if (!mixer[i].active)
       {
-       Error(ERR_RETURN, "Mixer_InsertSound: Channel %d inactive", i);
-       Error(ERR_RETURN, "Mixer_InsertSound: This should never happen!");
+       Error(ERR_INFO, "Mixer_InsertSound: Channel %d inactive", i);
+       Error(ERR_INFO, "Mixer_InsertSound: This should never happen!");
 
        mixer_active_channels--;
       }
@@ -1033,7 +933,7 @@ static void Mixer_InsertSound(SoundControl snd_ctrl)
     /* print some debugging information about audio channel usage */
     for (i = audio.first_sound_channel; i < audio.num_channels; i++)
     {
-      Error(ERR_RETURN, "Mixer_InsertSound: %d [%d]: %ld (%ld)",
+      Error(ERR_INFO, "Mixer_InsertSound: %d [%d]: %ld (%ld)",
            i, mixer[i].active, mixer[i].data_len, (long)mixer[i].data_ptr);
     }
 #endif
@@ -1057,16 +957,8 @@ static void Mixer_InsertSound(SoundControl snd_ctrl)
   /* add the new sound to the mixer */
   for (i = audio.first_sound_channel; i < audio.num_channels; i++)
   {
-#if 0
-    printf("CHECKING CHANNEL %d FOR SOUND %d ...\n", i, snd_ctrl.nr);
-#endif
-
     if (!mixer[i].active)
     {
-#if 0
-      printf("ADDING NEW SOUND %d TO MIXER\n", snd_ctrl.nr);
-#endif
-
 #if defined(AUDIO_UNIX_NATIVE)
       if (snd_info->data_len == 0)
       {
@@ -1255,8 +1147,8 @@ static void Mixer_Main_DSP()
   max_sample_size = fragment_size / (num_output_channels * sample_bytes);
 
   /* first clear the last premixing buffer */
-  memset(premix_last_buffer, 0,
-        max_sample_size * num_output_channels * sizeof(long));
+  clear_mem(premix_last_buffer,
+           max_sample_size * num_output_channels * sizeof(long));
 
   for (i = 0; i < audio.num_channels; i++)
   {
@@ -1413,11 +1305,9 @@ static int Mixer_Main_SimpleAudio(SoundControl snd_ctrl)
        mixer[i].volume * (long)premix_first_buffer[j] / SOUND_MAX_VOLUME;
 
   /* might be needed for u-law /dev/audio */
-#if 1
   for (j = 0; j < sample_size; j++)
     playing_buffer[j] =
       linear_to_ulaw(premix_first_buffer[j]);
-#endif
 
   /* delete completed sound entries from the mixer */
   if (mixer[i].playing_pos >= mixer[i].data_len)
@@ -1643,10 +1533,6 @@ static void *Load_WAV(char *filename)
   if (!audio.sound_available)
     return NULL;
 
-#if 0
-  printf("loading WAV file '%s'\n", filename);
-#endif
-
   snd_info = checked_calloc(sizeof(SoundInfo));
 
 #if defined(TARGET_SDL)
@@ -1673,6 +1559,8 @@ static void *Load_WAV(char *filename)
 
 #else /* AUDIO_UNIX_NATIVE */
 
+  clear_mem(&header, sizeof(struct SoundHeader_WAV));  /* to make gcc happy */
+
   if ((file = fopen(filename, MODE_READ)) == NULL)
   {
     Error(ERR_WARN, "cannot open sound file '%s'", filename);
@@ -1682,7 +1570,7 @@ static void *Load_WAV(char *filename)
 
   /* read chunk id "RIFF" */
   getFileChunkLE(file, chunk_name, &chunk_size);
-  if (strcmp(chunk_name, "RIFF") != 0)
+  if (!strEqual(chunk_name, "RIFF"))
   {
     Error(ERR_WARN, "missing 'RIFF' chunk of sound file '%s'", filename);
     fclose(file);
@@ -1692,7 +1580,7 @@ static void *Load_WAV(char *filename)
 
   /* read "RIFF" type id "WAVE" */
   getFileChunkLE(file, chunk_name, NULL);
-  if (strcmp(chunk_name, "WAVE") != 0)
+  if (!strEqual(chunk_name, "WAVE"))
   {
     Error(ERR_WARN, "missing 'WAVE' type ID of sound file '%s'", filename);
     fclose(file);
@@ -1702,7 +1590,7 @@ static void *Load_WAV(char *filename)
 
   while (getFileChunkLE(file, chunk_name, &chunk_size))
   {
-    if (strcmp(chunk_name, "fmt ") == 0)
+    if (strEqual(chunk_name, "fmt "))
     {
       if (chunk_size < WAV_HEADER_SIZE)
       {
@@ -1766,7 +1654,7 @@ static void *Load_WAV(char *filename)
       printf("  Significant bits per sample: %d'\n", header.bits_per_sample);
 #endif
     }
-    else if (strcmp(chunk_name, "data") == 0)
+    else if (strEqual(chunk_name, "data"))
     {
       data_byte_len = chunk_size;
 
@@ -1885,20 +1773,11 @@ void LoadCustomMusic_NoConf(void)
   struct dirent *dir_entry;
   int num_music = getMusicListSize();
 
-#if 0
-  int ii;
-  for (ii = 0; ii < num_music; ii++)
-  {
-    struct FileInfo *music = getMusicListEntry(ii);
-    printf("sound process: music %d: '%s'\n", ii, music->filename);
-  }
-#endif
-
   if (!audio.sound_available)
     return;
 
   if (last_music_directory != NULL &&
-      strcmp(last_music_directory, music_directory) == 0)
+      strEqual(last_music_directory, music_directory))
     return;    /* old and new music directory are the same */
 
   if (last_music_directory != NULL)
@@ -1915,7 +1794,7 @@ void LoadCustomMusic_NoConf(void)
   }
 
   if (draw_init_text)
-    DrawInitText("Loading music:", 120, FC_GREEN);
+    DrawInitText("Loading music", 120, FC_GREEN);
 
   while ((dir_entry = readdir(dir)) != NULL)   /* loop until last dir entry */
   {
@@ -1925,15 +1804,12 @@ void LoadCustomMusic_NoConf(void)
     boolean music_already_used = FALSE;
     int i;
 
+    /* skip all music files that are configured in music config file */
     for (i = 0; i < num_music; i++)
     {
       struct FileInfo *music = getMusicListEntry(i);
 
-#if 0
-      printf("sound process: '%s'\n", music->filename);
-#endif
-
-      if (strcmp(basename, music->filename) == 0)
+      if (strEqual(basename, music->filename))
       {
        music_already_used = TRUE;
        break;
@@ -1943,25 +1819,13 @@ void LoadCustomMusic_NoConf(void)
     if (music_already_used)
       continue;
 
-#if 0
-    if (FileIsSound(basename) || FileIsMusic(basename))
-      printf("DEBUG: loading music '%s' ...\n", basename);
-#endif
-
     if (draw_init_text)
       DrawInitText(basename, 150, FC_YELLOW);
 
     filename = getPath2(music_directory, basename);
 
-#if 1
     if (FileIsMusic(basename))
       mus_info = Load_WAV_or_MOD(filename);
-#else
-    if (FileIsSound(basename))
-      mus_info = Load_WAV(filename);
-    else if (FileIsMusic(basename))
-      mus_info = Load_MOD(filename);
-#endif
 
     free(filename);
 
@@ -1977,10 +1841,6 @@ void LoadCustomMusic_NoConf(void)
   closedir(dir);
 
   draw_init_text = FALSE;
-
-  if (num_music_noconf == 0)
-    Error(ERR_WARN, "cannot find any valid music files in directory '%s'",
-         music_directory);
 }
 
 int getSoundListSize()
@@ -2056,7 +1916,7 @@ struct PropertyMapping *getMusicListPropertyMapping()
 }
 
 void InitSoundList(struct ConfigInfo *config_list, int num_file_list_entries,
-                  struct ConfigInfo *config_suffix_list,
+                  struct ConfigTypeInfo *config_suffix_list,
                   char **base_prefixes, char **ext1_suffixes,
                   char **ext2_suffixes, char **ext3_suffixes,
                   char **ignore_tokens)
@@ -2128,15 +1988,10 @@ void InitSoundList(struct ConfigInfo *config_list, int num_file_list_entries,
 
   sound_info->load_artwork = Load_WAV;
   sound_info->free_artwork = FreeSound;
-
-#if 0
-  num_sounds = sound_info->num_file_list_entries;
-  Sound = (SoundInfo **)sound_info->artwork_list;
-#endif
 }
 
 void InitMusicList(struct ConfigInfo *config_list, int num_file_list_entries,
-                  struct ConfigInfo *config_suffix_list,
+                  struct ConfigTypeInfo *config_suffix_list,
                   char **base_prefixes, char **ext1_suffixes,
                   char **ext2_suffixes, char **ext3_suffixes,
                   char **ignore_tokens)
@@ -2257,7 +2112,7 @@ void PlaySoundExt(int nr, int volume, int stereo_position, int state)
   else if (stereo_position > SOUND_MAX_RIGHT)
     stereo_position = SOUND_MAX_RIGHT;
 
-  memset(&snd_ctrl, 0, sizeof(SoundControl));  /* to make valgrind happy */
+  clear_mem(&snd_ctrl, sizeof(SoundControl));  /* to make valgrind happy */
 
   snd_ctrl.active = TRUE;
   snd_ctrl.nr = nr;
@@ -2318,7 +2173,7 @@ void StopSoundExt(int nr, int state)
   if (!audio.sound_available)
     return;
 
-  memset(&snd_ctrl, 0, sizeof(SoundControl));  /* to make valgrind happy */
+  clear_mem(&snd_ctrl, sizeof(SoundControl));  /* to make valgrind happy */
 
   snd_ctrl.active = FALSE;
   snd_ctrl.nr = nr;
@@ -2330,30 +2185,24 @@ void StopSoundExt(int nr, int state)
 static void ReloadCustomSounds()
 {
 #if 0
-  printf("DEBUG: reloading sounds '%s' ...\n", artwork.snd_current_identifier);
+  printf("::: reloading sounds '%s' ...\n", artwork.snd_current_identifier);
 #endif
 
   LoadArtworkConfig(sound_info);
   ReloadCustomArtworkList(sound_info);
-
-#if 0
-  num_sounds = getSoundListSize();
-#endif
 }
 
 static void ReloadCustomMusic()
 {
 #if 0
-  printf("DEBUG: reloading music '%s' ...\n", artwork.mus_current_identifier);
+  printf("::: reloading music '%s' ...\n", artwork.mus_current_identifier);
 #endif
 
   LoadArtworkConfig(music_info);
   ReloadCustomArtworkList(music_info);
 
-#if 1
   /* load all music files from directory not defined in "musicinfo.conf" */
   LoadCustomMusic_NoConf();
-#endif
 }
 
 void InitReloadCustomSounds(char *set_identifier)
@@ -2400,8 +2249,7 @@ void FreeSound(void *ptr)
 #endif
   }
 
-  if (sound->source_filename)
-    free(sound->source_filename);
+  checked_free(sound->source_filename);
 
   free(sound);
 }