rnd-20030416-1-src
[rocksndiamonds.git] / src / libgame / sound.c
index e5994e55c828346f3e8bdd380733d838ca27e8bc..0299521267dd802ccd5024467a15590fb286ed22 100644 (file)
@@ -149,9 +149,14 @@ struct SoundControl
 typedef struct SoundControl SoundControl;
 
 static struct ArtworkListInfo *sound_info = NULL;
+#if 0
 static SoundInfo **Sound = NULL;
+#endif
 static MusicInfo **Music = NULL;
-static int num_sounds = 0, num_music = 0;
+#if 0
+static int num_sounds = 0;
+#endif
+static int num_music = 0;
 static int stereo_volume[SOUND_MAX_LEFT2RIGHT + 1];
 
 
@@ -175,6 +180,8 @@ static void ReloadCustomSounds();
 static void ReloadCustomMusic();
 static void FreeSound(void *);
 
+static SoundInfo *getSoundInfoEntryFromSoundID(int);
+
 
 /* ------------------------------------------------------------------------- */
 /* functions for native (non-SDL) Unix audio/mixer support                   */
@@ -253,13 +260,15 @@ static boolean ForkAudioProcess(void)
     return FALSE;
   }
 
+  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(audio.mixer_pid) ? "child" : "parent"));
+  printf("PID: %d [%s]\n", getpid(),(IS_CHILD_PROCESS() ? "child" : "parent"));
   Delay(10000 * 0);
 #endif
 
-  if (IS_CHILD_PROCESS(audio.mixer_pid))
+  if (IS_CHILD_PROCESS())
     Mixer_Main();                      /* this function never returns */
   else
     close(audio.mixer_pipe[0]);                /* no reading from pipe needed */
@@ -290,7 +299,7 @@ void UnixCloseAudio(void)
   if (audio.device_fd)
     close(audio.device_fd);
 
-  if (IS_PARENT_PROCESS(audio.mixer_pid))
+  if (IS_PARENT_PROCESS() && HAS_CHILD_PROCESS())
     kill(audio.mixer_pid, SIGTERM);
 }
 
@@ -457,7 +466,7 @@ static void InitAudioDevice(struct AudioFormatInfo *afmt)
 
 static void SendSoundControlToMixerProcess(SoundControl *snd_ctrl)
 {
-  if (IS_CHILD_PROCESS(audio.mixer_pid))
+  if (IS_CHILD_PROCESS())
     return;
 
   if (write(audio.mixer_pipe[1], snd_ctrl, sizeof(SoundControl)) < 0)
@@ -470,7 +479,7 @@ static void SendSoundControlToMixerProcess(SoundControl *snd_ctrl)
 
 static void ReadSoundControlFromMainProcess(SoundControl *snd_ctrl)
 {
-  if (IS_PARENT_PROCESS(audio.mixer_pid))
+  if (IS_PARENT_PROCESS())
     return;
 
   if (read(audio.mixer_pipe[0], snd_ctrl, sizeof(SoundControl))
@@ -492,7 +501,7 @@ static void WriteReloadInfoToPipe(char *set_identifier, int type)
                                    setup.override_level_sounds :
                                    setup.override_level_music);
 
-  if (IS_CHILD_PROCESS(audio.mixer_pid))
+  if (IS_CHILD_PROCESS())
     return;
 
   if (leveldir_current == NULL)                /* should never happen */
@@ -814,6 +823,7 @@ static void Mixer_InsertSound(SoundControl snd_ctrl)
 {
   SoundInfo *snd_info;
   int i, k;
+  int num_sounds = getSoundListSize();
 
 #if 0
   printf("NEW SOUND %d ARRIVED [%d] [%d ACTIVE CHANNELS]\n",
@@ -830,7 +840,13 @@ static void Mixer_InsertSound(SoundControl snd_ctrl)
   else if (snd_ctrl.nr >= num_sounds)
     return;
 
+#if 0
   snd_info = (IS_MUSIC(snd_ctrl) ? Music[snd_ctrl.nr] : Sound[snd_ctrl.nr]);
+#else
+  snd_info = (IS_MUSIC(snd_ctrl) ? Music[snd_ctrl.nr] :
+             getSoundInfoEntryFromSoundID(snd_ctrl.nr));
+#endif
+
   if (snd_info == NULL)
     return;
 
@@ -1012,7 +1028,7 @@ static void HandleSoundRequest(SoundControl snd_ctrl)
   int i;
 
 #if defined(AUDIO_UNIX_NATIVE)
-  if (IS_PARENT_PROCESS(audio.mixer_pid))
+  if (IS_PARENT_PROCESS())
   {
     SendSoundControlToMixerProcess(&snd_ctrl);
     return;
@@ -1780,11 +1796,32 @@ struct FileInfo *getSoundListEntry(int pos)
          &sound_info->dynamic_file_list[list_pos]);
 }
 
+static SoundInfo *getSoundInfoEntryFromSoundID(int pos)
+{
+  int num_list_entries = sound_info->num_file_list_entries;
+  int list_pos = (pos < num_list_entries ? pos : pos - num_list_entries);
+  SoundInfo **snd_info =
+    (SoundInfo **)(pos < num_list_entries ? sound_info->artwork_list :
+                  sound_info->dynamic_artwork_list);
+
+  return snd_info[list_pos];
+}
+
+int getSoundListPropertyMappingSize()
+{
+  return sound_info->num_property_mapping_entries;
+}
+
+struct PropertyMapping *getSoundListPropertyMapping()
+{
+  return sound_info->property_mapping;
+}
+
 void InitSoundList(struct ConfigInfo *config_list, int num_file_list_entries,
                   struct ConfigInfo *config_suffix_list,
-                  char **base_prefixes,
-                  char **ext1_suffixes,
-                  char **ext2_suffixes)
+                  char **base_prefixes, char **ext1_suffixes,
+                  char **ext2_suffixes, char **ext3_suffixes,
+                  char **ignore_tokens)
 {
   int i;
 
@@ -1796,15 +1833,15 @@ void InitSoundList(struct ConfigInfo *config_list, int num_file_list_entries,
   sound_info->num_file_list_entries = num_file_list_entries;
   sound_info->num_dynamic_file_list_entries = 0;
 
-  sound_info->num_suffix_list_entries = 0;
-  for (i=0; config_suffix_list[i].token != NULL; i++)
-    sound_info->num_suffix_list_entries++;
-
   sound_info->file_list =
-    getFileListFromConfigList(config_list, config_suffix_list,
+    getFileListFromConfigList(config_list, config_suffix_list, ignore_tokens,
                              num_file_list_entries);
   sound_info->dynamic_file_list = NULL;
 
+  sound_info->num_suffix_list_entries = 0;
+  for (i=0; config_suffix_list[i].token != NULL; i++)
+    sound_info->num_suffix_list_entries++;
+
   sound_info->suffix_list = config_suffix_list;
 
   /* ---------- initialize base prefix and suffixes lists ---------- */
@@ -1821,9 +1858,23 @@ void InitSoundList(struct ConfigInfo *config_list, int num_file_list_entries,
   for (i=0; ext2_suffixes[i] != NULL; i++)
     sound_info->num_ext2_suffixes++;
 
+  sound_info->num_ext3_suffixes = 0;
+  for (i=0; ext3_suffixes[i] != NULL; i++)
+    sound_info->num_ext3_suffixes++;
+
+  sound_info->num_ignore_tokens = 0;
+  for (i=0; ignore_tokens[i] != NULL; i++)
+    sound_info->num_ignore_tokens++;
+
   sound_info->base_prefixes = base_prefixes;
   sound_info->ext1_suffixes = ext1_suffixes;
   sound_info->ext2_suffixes = ext2_suffixes;
+  sound_info->ext3_suffixes = ext3_suffixes;
+  sound_info->ignore_tokens = ignore_tokens;
+
+  sound_info->num_property_mapping_entries = 0;
+
+  sound_info->property_mapping = NULL;
 
   /* ---------- initialize artwork reference and content lists ---------- */
 
@@ -1840,8 +1891,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
 }
 
 static MusicInfo *Load_MOD(char *filename)
@@ -2054,6 +2107,10 @@ static void ReloadCustomSounds()
 
   LoadArtworkConfig(sound_info);
   ReloadCustomArtworkList(sound_info);
+
+#if 0
+  num_sounds = getSoundListSize();
+#endif
 }
 
 static void ReloadCustomMusic()