cleanup of unnecessarily convoluted function call
[rocksndiamonds.git] / src / libgame / sound.c
index 6ca95ea47de709bce3727f24bed5315fe753550c..5f497c386c56c6dda9088ecfd87940cd3bcfd36c 100644 (file)
 #define SOUND_VOLUME_LEFT(x)           (stereo_volume[x])
 #define SOUND_VOLUME_RIGHT(x)          (stereo_volume[SOUND_MAX_LEFT2RIGHT-x])
 
-#define SAME_SOUND_NR(x,y)             ((x).nr == (y).nr)
-#define SAME_SOUND_DATA(x,y)           ((x).data_ptr == (y).data_ptr)
+#define SAME_SOUND_NR(x, y)            ((x).nr == (y).nr)
+#define SAME_SOUND_DATA(x, y)          ((x).data_ptr == (y).data_ptr)
 
-#define SOUND_VOLUME_FROM_PERCENT(v,p) ((p) < 0   ? SOUND_MIN_VOLUME : \
+#define SOUND_VOLUME_FROM_PERCENT(v, p)        ((p) < 0   ? SOUND_MIN_VOLUME : \
                                         (p) > 100 ? (v) :              \
                                         (p) * (v) / 100)
 
@@ -59,7 +59,7 @@
 #define SOUND_VOLUME_LOOPS(v)  SOUND_VOLUME_FROM_PERCENT(v, setup.volume_loops)
 #define SOUND_VOLUME_MUSIC(v)  SOUND_VOLUME_FROM_PERCENT(v, setup.volume_music)
 
-#define SETUP_SOUND_VOLUME(v,s)                ((s) & SND_CTRL_MUSIC ?         \
+#define SETUP_SOUND_VOLUME(v, s)       ((s) & SND_CTRL_MUSIC ?         \
                                         SOUND_VOLUME_MUSIC(v) :        \
                                         (s) & SND_CTRL_LOOP ?          \
                                         SOUND_VOLUME_LOOPS(v) :        \
@@ -141,6 +141,15 @@ static MusicInfo *getMusicInfoEntryFromMusicID(int);
 // mixer functions
 // ----------------------------------------------------------------------------
 
+static void Mixer_ChannelFinished(int channel)
+{
+  if (!mixer[channel].active)
+    return;
+
+  mixer[channel].active = FALSE;
+  mixer_active_channels--;
+}
+
 void Mixer_InitChannels(void)
 {
   int i;
@@ -148,6 +157,8 @@ void Mixer_InitChannels(void)
   for (i = 0; i < audio.num_channels; i++)
     mixer[i].active = FALSE;
   mixer_active_channels = 0;
+
+  Mix_ChannelFinished(Mixer_ChannelFinished);
 }
 
 static void Mixer_ResetChannelExpiration(int channel)
@@ -247,13 +258,7 @@ static void Mixer_PlayMusicChannel(void)
 
 static void Mixer_StopChannel(int channel)
 {
-  if (!mixer[channel].active)
-    return;
-
   Mix_HaltChannel(channel);
-
-  mixer[channel].active = FALSE;
-  mixer_active_channels--;
 }
 
 static void Mixer_StopMusicChannel(void)
@@ -519,6 +524,17 @@ void StartMixer(void)
       (int)sqrt((float)(SOUND_MAX_LEFT2RIGHT * SOUND_MAX_LEFT2RIGHT - i * i));
 }
 
+boolean isSoundPlaying(int nr)
+{
+  int i;
+
+  for (i = audio.first_sound_channel; i < audio.num_channels; i++)
+    if (mixer[i].active && mixer[i].nr == nr)
+      return TRUE;
+
+  return FALSE;
+}
+
 
 // THE STUFF ABOVE IS ONLY USED BY THE SOUND SERVER CHILD PROCESS
 // ============================================================================
@@ -587,11 +603,19 @@ static void *Load_WAV_or_MOD(char *filename)
     return NULL;
 }
 
+static int compareMusicInfo(const void *object1, const void *object2)
+{
+  const MusicInfo *mi1 = *((MusicInfo **)object1);
+  const MusicInfo *mi2 = *((MusicInfo **)object2);
+
+  return strcmp(mi1->source_filename, mi2->source_filename);
+}
+
 static void LoadCustomMusic_NoConf(void)
 {
   static boolean draw_init_text = TRUE;                // only draw at startup
   static char *last_music_directory = NULL;
-  char *music_directory = getCustomMusicDirectory();
+  char *music_directory = getCustomMusicDirectory_NoConf();
   Directory *dir;
   DirectoryEntry *dir_entry;
   int num_music = getMusicListSize();
@@ -609,11 +633,15 @@ static void LoadCustomMusic_NoConf(void)
 
   FreeAllMusic_NoConf();
 
-  if ((dir = openDirectory(music_directory)) == NULL)
+  if (music_directory == NULL)
   {
-    Warn("cannot read music directory '%s'", music_directory);
+    Warn("cannot find music directory with unconfigured music");
 
-    audio.music_available = FALSE;
+    return;
+  }
+  else if ((dir = openDirectory(music_directory)) == NULL)
+  {
+    Warn("cannot read music directory '%s'", music_directory);
 
     return;
   }
@@ -660,6 +688,9 @@ static void LoadCustomMusic_NoConf(void)
 
   closeDirectory(dir);
 
+  // sort music files by filename
+  qsort(Music_NoConf, num_music_noconf, sizeof(MusicInfo *), compareMusicInfo);
+
   draw_init_text = FALSE;
 }
 
@@ -675,6 +706,11 @@ int getMusicListSize(void)
          music_info->num_dynamic_file_list_entries);
 }
 
+int getMusicListSize_NoConf(void)
+{
+  return num_music_noconf;
+}
+
 struct FileInfo *getSoundListEntry(int pos)
 {
   int num_sounds = getSoundListSize();