#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
{
void *data_ptr; /* pointer to first sample (8 or 16 bit) */
int data_len; /* number of samples, NOT number of bytes */
int num_channels; /* mono: 1 channel, stereo: 2 channels */
-
-#if defined(TARGET_ALLEGRO)
- int voice;
-#endif
};
typedef struct SoundControl SoundControl;
return TRUE;
#if defined(TARGET_SDL)
-
if (!Mix_Playing(channel))
return TRUE;
-
-#elif defined(TARGET_ALLEGRO)
-
- mixer[channel].playing_pos = voice_get_position(mixer[channel].voice);
- mixer[channel].volume = voice_get_volume(mixer[channel].voice);
-
- /* sound sample has completed playing or was completely faded out */
- if (mixer[channel].playing_pos == -1 || mixer[channel].volume == 0)
- return TRUE;
-
-#endif /* TARGET_ALLEGRO */
+#endif
return FALSE;
}
static boolean Mixer_AllocateChannel(int channel)
{
-#if defined(TARGET_ALLEGRO)
- mixer[channel].voice = allocate_voice((SAMPLE *)mixer[channel].data_ptr);
- if (mixer[channel].voice < 0)
- return FALSE;
-#endif
-
return TRUE;
}
Mix_SetPanning(channel,
SOUND_VOLUME_LEFT(mixer[channel].stereo_position),
SOUND_VOLUME_RIGHT(mixer[channel].stereo_position));
-#elif defined(TARGET_ALLEGRO)
- voice_set_volume(mixer[channel].voice, mixer[channel].volume);
- voice_set_pan(mixer[channel].voice, mixer[channel].stereo_position);
#endif
}
#if defined(TARGET_SDL)
Mix_PlayChannel(channel, mixer[channel].data_ptr,
IS_LOOP(mixer[channel]) ? -1 : 0);
-#elif defined(TARGET_ALLEGRO)
- if (IS_LOOP(mixer[channel]))
- voice_set_playmode(mixer[channel].voice, PLAYMODE_LOOP);
-
- voice_start(mixer[channel].voice);
#endif
}
/* 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
}
#if defined(TARGET_SDL)
Mix_HaltChannel(channel);
-#elif defined(TARGET_ALLEGRO)
- voice_set_volume(mixer[channel].voice, 0);
- deallocate_voice(mixer[channel].voice);
#endif
mixer[channel].active = FALSE;
#if defined(TARGET_SDL)
Mix_FadeOutChannel(channel, SOUND_FADING_INTERVAL);
-#elif defined(TARGET_ALLEGRO)
- if (voice_check(mixer[channel].voice))
- voice_ramp_volume(mixer[channel].voice, SOUND_FADING_INTERVAL, 0);
#endif
}
#if defined(TARGET_SDL)
Mix_ExpireChannel(channel, -1);
Mix_Volume(channel, mixer[channel].volume);
-#elif defined(TARGET_ALLEGRO)
- voice_stop_volumeramp(mixer[channel].voice);
- voice_ramp_volume(mixer[channel].voice, SOUND_FADING_INTERVAL,
- mixer[channel].volume);
#endif
}
snd_info->data_len = ((Mix_Chunk *)snd_info->data_ptr)->alen;
-#elif defined(TARGET_ALLEGRO)
-
- if ((snd_info->data_ptr = load_sample(filename)) == NULL)
- {
- Error(ERR_WARN, "cannot read sound file '%s'", filename);
- free(snd_info);
- return NULL;
- }
-
- snd_info->data_len = ((SAMPLE *)snd_info->data_ptr)->len;
-
#else /* AUDIO_UNIX_NATIVE */
clear_mem(&header, sizeof(struct SoundHeader_WAV)); /* to make gcc happy */
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
+}
+
+#if 1
+
+void LoadCustomMusic_NoConf(void)
+{
+ static boolean draw_init_text = TRUE; /* only draw at startup */
+ static char *last_music_directory = NULL;
+ char *music_directory = getCustomMusicDirectory();
+ Directory *dir;
+ DirectoryEntry *dir_entry;
+ int num_music = getMusicListSize();
+
+ if (!audio.sound_available)
+ return;
+
+ if (last_music_directory != NULL &&
+ strEqual(last_music_directory, music_directory))
+ return; /* old and new music directory are the same */
+
+ if (last_music_directory != NULL)
+ free(last_music_directory);
+ last_music_directory = getStringCopy(music_directory);
+
+ FreeAllMusic_NoConf();
+
+ if ((dir = openDirectory(music_directory)) == NULL)
+ {
+ Error(ERR_WARN, "cannot read music directory '%s'", music_directory);
+
+ audio.music_available = FALSE;
+
+ return;
+ }
+
+ if (draw_init_text)
+ DrawInitText("Loading music", 120, FC_GREEN);
+
+ while ((dir_entry = readDirectory(dir)) != NULL) /* loop all entries */
+ {
+ char *basename = dir_entry->basename;
+ char *filename = NULL;
+ MusicInfo *mus_info = NULL;
+ 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 (strEqual(basename, music->filename))
+ {
+ music_already_used = TRUE;
+ break;
+ }
+ }
+
+ if (music_already_used)
+ continue;
+
+ if (draw_init_text)
+ DrawInitText(basename, 150, FC_YELLOW);
+
+ filename = getPath2(music_directory, basename);
+
+ if (FileIsMusic(basename))
+ mus_info = Load_WAV_or_MOD(filename);
+
+ free(filename);
+
+ if (mus_info)
+ {
+ num_music_noconf++;
+ Music_NoConf = checked_realloc(Music_NoConf,
+ num_music_noconf * sizeof(MusicInfo *));
+ Music_NoConf[num_music_noconf - 1] = mus_info;
+ }
+ }
+
+ closeDirectory(dir);
+
+ draw_init_text = FALSE;
}
+#else
+
void LoadCustomMusic_NoConf(void)
{
static boolean draw_init_text = TRUE; /* only draw at startup */
if ((dir = opendir(music_directory)) == NULL)
{
Error(ERR_WARN, "cannot read music directory '%s'", music_directory);
+
audio.music_available = FALSE;
+
return;
}
draw_init_text = FALSE;
}
+#endif
+
int getSoundListSize()
{
return (sound_info->num_file_list_entries +
void PlaySound(int nr)
{
+ if (!setup.sound_simple)
+ return;
+
PlaySoundExt(nr, SOUND_MAX_VOLUME, SOUND_MIDDLE, SND_CTRL_PLAY_SOUND);
}
void PlaySoundStereo(int nr, int stereo_position)
{
+ if (!setup.sound_simple)
+ return;
+
PlaySoundExt(nr, SOUND_MAX_VOLUME, stereo_position, SND_CTRL_PLAY_SOUND);
}
void PlaySoundLoop(int nr)
{
+ if (!setup.sound_loops)
+ return;
+
PlaySoundExt(nr, SOUND_MAX_VOLUME, SOUND_MIDDLE, SND_CTRL_PLAY_LOOP);
}
void PlaySoundMusic(int nr)
{
+ if (!setup.sound_music)
+ return;
+
PlaySoundExt(nr, SOUND_MAX_VOLUME, SOUND_MIDDLE, SND_CTRL_PLAY_MUSIC);
}
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)
{
#if defined(TARGET_SDL)
Mix_FreeChunk(sound->data_ptr);
-#elif defined(TARGET_ALLEGRO)
- destroy_sample(sound->data_ptr);
#else /* AUDIO_UNIX_NATIVE */
free(sound->data_ptr);
#endif
Mix_FreeMusic(music->data_ptr);
else
Mix_FreeChunk(music->data_ptr);
-#elif defined(TARGET_ALLEGRO)
- destroy_sample(music->data_ptr);
#else /* AUDIO_UNIX_NATIVE */
free(music->data_ptr);
#endif