rnd-20131212-1-src
[rocksndiamonds.git] / src / libgame / sound.c
index 0d7ed67cf8255c8fdd3cd5ac8aafb399097bfe44..2712fa4c92970aefb7a98a5da4cd7071c5b4fad3 100644 (file)
@@ -19,6 +19,7 @@
 #include <dirent.h>
 #include <signal.h>
 #include <math.h>
+#include <errno.h>
 
 #include "platform.h"
 
 #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 : \
+                                        (p) > 100 ? (v) :              \
+                                        (p) * (v) / 100)
+
+#define SOUND_VOLUME_SIMPLE(v) SOUND_VOLUME_FROM_PERCENT(v, setup.volume_simple)
+#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_PLAY_MUSIC ?   \
+                                        SOUND_VOLUME_MUSIC(v) :        \
+                                        (s) == SND_CTRL_PLAY_LOOP ?    \
+                                        SOUND_VOLUME_LOOPS(v) :        \
+                                        SOUND_VOLUME_SIMPLE(v))
+
+
 #if defined(AUDIO_UNIX_NATIVE)
 struct SoundHeader_WAV
 {
@@ -720,7 +736,7 @@ static void Mixer_PlayMusicChannel()
     /* Mix_VolumeMusic() must be called _after_ Mix_PlayMusic() --
        this looks like a bug in the SDL_mixer library */
     Mix_PlayMusic(mixer[audio.music_channel].data_ptr, -1);
-    Mix_VolumeMusic(SOUND_MAX_VOLUME);
+    Mix_VolumeMusic(mixer[audio.music_channel].volume);
   }
 #endif
 }
@@ -1152,7 +1168,7 @@ static void Mixer_Main_DSP()
 
   for (i = 0; i < audio.num_channels; i++)
   {
-    void *sample_ptr;
+    // void *sample_ptr;
     int sample_len;
     int sample_pos;
     int sample_size;
@@ -1167,7 +1183,7 @@ static void Mixer_Main_DSP()
     }
 
     /* pointer, lenght and actual playing position of sound sample */
-    sample_ptr = mixer[i].data_ptr;
+    // sample_ptr = mixer[i].data_ptr;
     sample_len = mixer[i].data_len;
     sample_pos = mixer[i].playing_pos;
     sample_size = MIN(max_sample_size, sample_len - sample_pos);
@@ -1265,7 +1281,8 @@ static void Mixer_Main_DSP()
   }
 
   /* finally play the sound fragment */
-  write(audio.device_fd, playing_buffer, fragment_size);
+  if (write(audio.device_fd, playing_buffer, fragment_size) == -1)
+    Error(ERR_WARN, "write() failed; %s", strerror(errno));
 
   if (!mixer_active_channels)
     CloseAudioDevice(&audio.device_fd);
@@ -1756,12 +1773,21 @@ static void *Load_MOD(char *filename)
 
 static void *Load_WAV_or_MOD(char *filename)
 {
+#if 1
+  if (FileIsMusic(filename))
+    return Load_MOD(filename);
+  else if (FileIsSound(filename))
+    return Load_WAV(filename);
+  else
+    return NULL;
+#else
   if (FileIsSound(filename))
     return Load_WAV(filename);
   else if (FileIsMusic(filename))
     return Load_MOD(filename);
   else
     return NULL;
+#endif
 }
 
 void LoadCustomMusic_NoConf(void)
@@ -2102,6 +2128,8 @@ void PlaySoundExt(int nr, int volume, int stereo_position, int state)
       audio.sound_deactivated)
     return;
 
+  volume = SETUP_SOUND_VOLUME(volume, state);
+
   if (volume < SOUND_MIN_VOLUME)
     volume = SOUND_MIN_VOLUME;
   else if (volume > SOUND_MAX_VOLUME)