#include <fcntl.h>
#include <dirent.h>
#include <signal.h>
+#include <math.h>
+
+#include "platform.h"
+
+#if defined(PLATFORM_LINUX)
+#include <sys/ioctl.h>
+#include <linux/soundcard.h>
+#elif defined(PLATFORM_FREEBSD)
+#include <machine/soundcard.h>
+#elif defined(PLATFORM_NETBSD)
+#include <sys/ioctl.h>
+#include <sys/audioio.h>
+#elif defined(PLATFORM_HPUX)
+#include <sys/audio.h>
+#endif
#include "system.h"
#include "sound.h"
#include "misc.h"
#include "setup.h"
+#include "text.h"
+
+
+/* expiration time (in milliseconds) for sound loops */
+#define SOUND_LOOP_EXPIRATION_TIME 200
+
+/* one second fading interval == 1000 ticks (milliseconds) */
+#define SOUND_FADING_INTERVAL 1000
+
+#if defined(AUDIO_STREAMING_DSP)
+#define SOUND_FADING_VOLUME_STEP (SOUND_MAX_VOLUME / 40)
+#define SOUND_FADING_VOLUME_THRESHOLD (SOUND_FADING_VOLUME_STEP * 2)
+#endif
+
+#if !defined(PLATFORM_HPUX)
+#define SND_BLOCKSIZE 4096
+#else
+#define SND_BLOCKSIZE 32768
+#endif
+
+#define SND_TYPE_NONE 0
+#define SND_TYPE_WAV 1
+
+#define MUS_TYPE_NONE 0
+#define MUS_TYPE_WAV 1
+#define MUS_TYPE_MOD 2
+
+#define DEVICENAME_DSP "/dev/dsp"
+#define DEVICENAME_AUDIO "/dev/audio"
+#define DEVICENAME_AUDIOCTL "/dev/audioCtl"
+
+#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)
+
+#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
+{
+ unsigned short compression_code;
+ unsigned short num_channels;
+ unsigned long sample_rate;
+ unsigned long bytes_per_second;
+ unsigned short block_align;
+ unsigned short bits_per_sample;
+};
+#endif
+
+struct AudioFormatInfo
+{
+ boolean stereo; /* availability of stereo sound */
+ int format; /* size and endianess of sample data */
+ int sample_rate; /* sample frequency */
+ int fragment_size; /* audio device fragment size in bytes */
+};
+struct SampleInfo
+{
+ char *source_filename;
+ int num_references;
+
+ int type;
+ int format;
+ void *data_ptr; /* pointer to first sample (8 or 16 bit) */
+ long data_len; /* number of samples, NOT number of bytes */
+};
+typedef struct SampleInfo SoundInfo;
+typedef struct SampleInfo MusicInfo;
-#define IS_PARENT_PROCESS(pid) ((pid) > 0)
-#define IS_CHILD_PROCESS(pid) ((pid) == 0)
+struct SoundControl
+{
+ boolean active;
+
+ int nr;
+ int volume;
+ int stereo_position;
+
+ int state;
+
+ unsigned long playing_starttime;
+ unsigned long playing_pos;
+
+ int type;
+ int format;
+ void *data_ptr; /* pointer to first sample (8 or 16 bit) */
+ long data_len; /* number of samples, NOT number of bytes */
+
+#if defined(TARGET_ALLEGRO)
+ int voice;
+#endif
+};
+typedef struct SoundControl SoundControl;
struct ListNode
{
static SoundInfo **Sound = NULL;
static MusicInfo **Music = NULL;
static int num_sounds = 0, num_music = 0;
+static int stereo_volume[SOUND_MAX_LEFT2RIGHT + 1];
/* ========================================================================= */
mixer_active_channels = 0;
}
-static void Mixer_PlayChannel(int channel)
+static void Mixer_ResetChannelExpiration(int channel)
{
- /* start with inactive channel in case something goes wrong */
- mixer[channel].active = FALSE;
+ mixer[channel].playing_starttime = Counter();
- if (mixer[channel].type != MUS_TYPE_WAV)
- return;
+#if defined(TARGET_SDL)
+ if (IS_LOOP(mixer[channel]) && !IS_MUSIC(mixer[channel]))
+ Mix_ExpireChannel(channel, SOUND_LOOP_EXPIRATION_TIME);
+#endif
+}
- mixer[channel].playing_pos = 0;
- mixer[channel].playing_starttime = Counter();
+static boolean Mixer_ChannelExpired(int channel)
+{
+ if (!mixer[channel].active)
+ return TRUE;
+
+ if (IS_LOOP(mixer[channel]) && !IS_MUSIC(mixer[channel]) &&
+ DelayReached(&mixer[channel].playing_starttime,
+ SOUND_LOOP_EXPIRATION_TIME))
+ return TRUE;
#if defined(TARGET_SDL)
- Mix_Volume(channel, SOUND_MAX_VOLUME);
- Mix_PlayChannel(channel, mixer[channel].data_ptr,
- IS_LOOP(mixer[channel]) ? -1 : 0);
-#elif defined(PLATFORM_MSDOS)
+
+ 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 */
+
+ 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;
+ return FALSE;
+#endif
- if (IS_LOOP(mixer[channel]))
- voice_set_playmode(mixer[channel].voice, PLAYMODE_LOOP);
+ return TRUE;
+}
+static void Mixer_SetChannelProperties(int channel)
+{
+#if defined(TARGET_SDL)
+ Mix_Volume(channel, mixer[channel].volume);
+ 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
+}
+
+static void Mixer_StartChannel(int channel)
+{
+#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
+}
+static void Mixer_PlayChannel(int channel)
+{
+ /* start with inactive channel in case something goes wrong */
+ mixer[channel].active = FALSE;
+
+ if (mixer[channel].type != MUS_TYPE_WAV)
+ return;
+
+ if (!Mixer_AllocateChannel(channel))
+ return;
+
+ Mixer_SetChannelProperties(channel);
+ Mixer_StartChannel(channel);
+
+ Mixer_ResetChannelExpiration(channel);
+
+ mixer[channel].playing_pos = 0;
mixer[channel].active = TRUE;
mixer_active_channels++;
}
static void Mixer_StopChannel(int channel)
{
-#if 0
-#if defined(TARGET_SDL)
- printf("----------> %d [%d]\n", Mix_Playing(channel), Mix_Playing(0));
-#endif
-#endif
-
if (!mixer[channel].active)
return;
#if defined(TARGET_SDL)
Mix_HaltChannel(channel);
-#elif defined(PLATFORM_MSDOS)
+#elif defined(TARGET_ALLEGRO)
voice_set_volume(mixer[channel].voice, 0);
deallocate_voice(mixer[channel].voice);
#endif
#if defined(TARGET_SDL)
Mix_FadeOutChannel(channel, SOUND_FADING_INTERVAL);
-#elif defined(PLATFORM_MSDOS)
+#elif defined(TARGET_ALLEGRO)
if (voice_check(mixer[channel].voice))
voice_ramp_volume(mixer[channel].voice, SOUND_FADING_INTERVAL, 0);
#endif
return;
mixer[channel].state &= ~SND_CTRL_FADE;
- mixer[channel].volume = PSND_MAX_VOLUME;
+ mixer[channel].volume = SOUND_MAX_VOLUME;
#if defined(TARGET_SDL)
Mix_ExpireChannel(channel, -1);
- Mix_Volume(channel, SOUND_MAX_VOLUME);
+ 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,
/* play music samples on a dedicated music channel */
if (IS_MUSIC(snd_ctrl))
{
+#if 0
+ printf("PLAY MUSIC WITH VOLUME/STEREO %d/%d\n",
+ snd_ctrl.volume, snd_ctrl.stereo_position);
+#endif
+
mixer[audio.music_channel] = snd_ctrl;
Mixer_PlayMusicChannel();
return;
}
- /* check if sound is already being played (and how often) */
+ /* check if (and how often) this sound sample is already playing */
for (k=0, i=audio.first_sound_channel; i<audio.num_channels; i++)
- if (mixer[i].nr == snd_ctrl.nr)
+ if (mixer[i].active && SAME_SOUND_DATA(mixer[i], snd_ctrl))
k++;
- /* restart loop sounds only if they are just fading out */
- if (k >= 1 && IS_LOOP(snd_ctrl))
+#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))
{
for(i=audio.first_sound_channel; i<audio.num_channels; i++)
- if (mixer[i].nr == snd_ctrl.nr && IS_FADING(mixer[i]))
- Mixer_UnFadeChannel(i);
+ {
+ 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);
+
+ /* restore settings like volume and stereo position */
+ mixer[i].volume = snd_ctrl.volume;
+ mixer[i].stereo_position = snd_ctrl.stereo_position;
+
+ 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)
{
int playing_time = playing_current - mixer[i].playing_starttime;
int actual;
- if (!mixer[i].active || mixer[i].nr != snd_ctrl.nr)
+ if (!mixer[i].active || !SAME_SOUND_NR(mixer[i], snd_ctrl))
continue;
-#if 1
actual = 1000 * playing_time / mixer[i].data_len;
-#else
- actual = 100 * mixer[i].playing_pos / mixer[i].data_len;
-#endif
if (actual >= longest)
{
for (i=audio.first_sound_channel; i<audio.num_channels; i++)
{
-#if 1
int playing_time = playing_current - mixer[i].playing_starttime;
int actual = 1000 * playing_time / mixer[i].data_len;
-#else
- int actual = 100 * mixer[i].playing_pos / mixer[i].data_len;
-#endif
if (!IS_LOOP(mixer[i]) && actual > longest)
{
Mixer_StopChannel(longest_nr);
}
- /* add new sound to mixer */
+ /* add the new sound to the mixer */
for(i=0; i<audio.num_channels; i++)
{
#if 0
}
#endif
+ /* deactivate channels that have expired since the last request */
for (i=0; i<audio.num_channels; i++)
- {
- if (!mixer[i].active)
- continue;
-
- if (i != audio.music_channel &&
- DelayReached(&mixer[i].playing_starttime, SOUND_LOOP_EXPIRATION_TIME))
- {
+ if (mixer[i].active && Mixer_ChannelExpired(i))
Mixer_StopChannel(i);
- continue;
- }
-
-#if defined(TARGET_SDL)
-
- if (!Mix_Playing(i))
- Mixer_StopChannel(i);
-
-#elif defined(TARGET_ALLEGRO)
-
- mixer[i].playing_pos = voice_get_position(mixer[i].voice);
- mixer[i].volume = voice_get_volume(mixer[i].voice);
-
- /* sound sample has completed playing or was completely faded out */
- if (mixer[i].playing_pos == -1 || mixer[i].volume == 0)
- Mixer_StopChannel(i);
-
-#endif /* TARGET_ALLEGRO */
- }
if (IS_RELOADING(snd_ctrl)) /* load new sound or music files */
{
}
for(i=audio.first_sound_channel; i<audio.num_channels; i++)
- if (mixer[i].nr == snd_ctrl.nr || ALL_SOUNDS(snd_ctrl))
+ if (SAME_SOUND_NR(mixer[i], snd_ctrl) || ALL_SOUNDS(snd_ctrl))
Mixer_FadeChannel(i);
}
else if (IS_STOPPING(snd_ctrl)) /* stop existing sound or music */
}
for(i=audio.first_sound_channel; i<audio.num_channels; i++)
- if (mixer[i].nr == snd_ctrl.nr || ALL_SOUNDS(snd_ctrl))
+ if (SAME_SOUND_NR(mixer[i], snd_ctrl) || ALL_SOUNDS(snd_ctrl))
Mixer_StopChannel(i);
#if defined(AUDIO_UNIX_NATIVE)
void StartMixer(void)
{
+ int i;
+
#if 0
SDL_version compile_version;
const SDL_version *link_version;
if (!audio.sound_available)
return;
+ /* initialize stereo position conversion information */
+ for(i=0; i<=SOUND_MAX_LEFT2RIGHT; i++)
+ stereo_volume[i] =
+ (int)sqrt((float)(SOUND_MAX_LEFT2RIGHT * SOUND_MAX_LEFT2RIGHT - i * i));
+
#if defined(AUDIO_UNIX_NATIVE)
if (!ForkAudioProcess())
audio.sound_available = FALSE;
#if defined(AUDIO_STREAMING_DSP)
static void Mixer_Main_DSP()
{
- static int stereo_volume[PSND_MAX_LEFT2RIGHT + 1];
- static boolean stereo_volume_calculated = FALSE;
static short premix_first_buffer[SND_BLOCKSIZE];
static short premix_left_buffer[SND_BLOCKSIZE];
static short premix_right_buffer[SND_BLOCKSIZE];
int max_sample_size;
int i, j;
- if (!stereo_volume_calculated)
- {
- for(i=0; i<=PSND_MAX_LEFT2RIGHT; i++)
- stereo_volume[i] =
- (int)sqrt((float)(PSND_MAX_LEFT2RIGHT * PSND_MAX_LEFT2RIGHT - i * i));
-
- stereo_volume_calculated = TRUE;
- }
-
if (!mixer_active_channels)
return;
if (!mixer[i].active)
continue;
+ if (Mixer_ChannelExpired(i))
+ {
+ Mixer_StopChannel(i);
+ continue;
+ }
+
/* pointer, lenght and actual playing position of sound sample */
sample_ptr = mixer[i].data_ptr;
sample_len = mixer[i].data_len;
mixer[i].volume -= SOUND_FADING_VOLUME_STEP;
/* adjust volume of actual sound sample */
- if (mixer[i].volume != PSND_MAX_VOLUME)
+ if (mixer[i].volume != SOUND_MAX_VOLUME)
for(j=0; j<sample_size; j++)
premix_first_buffer[j] =
- (mixer[i].volume * (long)premix_first_buffer[j])
- >> PSND_MAX_VOLUME_BITS;
+ mixer[i].volume * (long)premix_first_buffer[j] / SOUND_MAX_VOLUME;
/* fill the last mixing buffer with stereo or mono sound */
if (stereo)
{
- int middle_pos = PSND_MAX_LEFT2RIGHT / 2;
- int left_volume = stereo_volume[middle_pos + mixer[i].stereo_position];
- int right_volume= stereo_volume[middle_pos - mixer[i].stereo_position];
+ int left_volume = SOUND_VOLUME_LEFT(mixer[i].stereo_position);
+ int right_volume = SOUND_VOLUME_RIGHT(mixer[i].stereo_position);
for(j=0; j<sample_size; j++)
{
premix_left_buffer[j] =
- (left_volume * premix_first_buffer[j])
- >> PSND_MAX_LEFT2RIGHT_BITS;
+ left_volume * premix_first_buffer[j] / SOUND_MAX_LEFT2RIGHT;
premix_right_buffer[j] =
- (right_volume * premix_first_buffer[j])
- >> PSND_MAX_LEFT2RIGHT_BITS;
+ right_volume * premix_first_buffer[j] / SOUND_MAX_LEFT2RIGHT;
premix_last_buffer[2 * j + 0] += premix_left_buffer[j];
premix_last_buffer[2 * j + 1] += premix_right_buffer[j];
premix_first_buffer);
/* adjust volume of actual sound sample */
- if (mixer[i].volume != PSND_MAX_VOLUME)
+ if (mixer[i].volume != SOUND_MAX_VOLUME)
for(j=0; j<sample_size; j++)
premix_first_buffer[j] =
- (mixer[i].volume * (long)premix_first_buffer[j])
- >> PSND_MAX_VOLUME_BITS;
+ mixer[i].volume * (long)premix_first_buffer[j] / SOUND_MAX_VOLUME;
/* might be needed for u-law /dev/audio */
#if 0
static SoundInfo *Load_WAV(char *filename)
{
SoundInfo *snd_info;
-#if !defined(TARGET_SDL) && !defined(PLATFORM_MSDOS)
+#if defined(AUDIO_UNIX_NATIVE)
+ struct SoundHeader_WAV header;
+#if 0
byte sound_header_buffer[WAV_HEADER_SIZE];
+ int i;
+#endif
char chunk_name[CHUNK_ID_LEN + 1];
int chunk_size;
FILE *file;
- int i;
#endif
if (!audio.sound_available)
}
/* read chunk id "RIFF" */
- getFileChunk(file, chunk_name, &chunk_size, BYTE_ORDER_LITTLE_ENDIAN);
+ getFileChunkLE(file, chunk_name, &chunk_size);
if (strcmp(chunk_name, "RIFF") != 0)
{
Error(ERR_WARN, "missing 'RIFF' chunk of sound file '%s'", filename);
}
/* read "RIFF" type id "WAVE" */
- getFileChunk(file, chunk_name, NULL, BYTE_ORDER_LITTLE_ENDIAN);
+ getFileChunkLE(file, chunk_name, NULL);
if (strcmp(chunk_name, "WAVE") != 0)
{
Error(ERR_WARN, "missing 'WAVE' type ID of sound file '%s'", filename);
return NULL;
}
- while (getFileChunk(file, chunk_name, &chunk_size, BYTE_ORDER_LITTLE_ENDIAN))
+ while (getFileChunkLE(file, chunk_name, &chunk_size))
{
if (strcmp(chunk_name, "fmt ") == 0)
{
- /* read header information */
- for (i=0; i < MIN(chunk_size, WAV_HEADER_SIZE); i++)
- sound_header_buffer[i] = fgetc(file);
+ if (chunk_size < WAV_HEADER_SIZE)
+ {
+ Error(ERR_WARN, "sound file '%s': chunk 'fmt ' too short", filename);
+ fclose(file);
+ free(snd_info);
+ return NULL;
+ }
+
+ header.compression_code = getFile16BitLE(file);
+ header.num_channels = getFile16BitLE(file);
+ header.sample_rate = getFile32BitLE(file);
+ header.bytes_per_second = getFile32BitLE(file);
+ header.block_align = getFile16BitLE(file);
+ header.bits_per_sample = getFile16BitLE(file);
if (chunk_size > WAV_HEADER_SIZE)
ReadUnusedBytesFromFile(file, chunk_size - WAV_HEADER_SIZE);
+
+ if (header.compression_code != 1)
+ {
+ Error(ERR_WARN, "sound file '%s': compression code %d not supported",
+ filename, header.compression_code);
+ fclose(file);
+ free(snd_info);
+ return NULL;
+ }
+
+ if (header.num_channels != 1)
+ {
+ Error(ERR_WARN, "sound file '%s': number of %d channels not supported",
+ filename, header.num_channels);
+ fclose(file);
+ free(snd_info);
+ return NULL;
+ }
+
+ if (header.bits_per_sample != 8 && header.bits_per_sample != 16)
+ {
+ Error(ERR_WARN, "sound file '%s': %d bits per sample not supported",
+ filename, header.bits_per_sample);
+ fclose(file);
+ free(snd_info);
+ return NULL;
+ }
+
+ /* warn, but accept wrong sample rate (may be only slightly different) */
+ if (header.sample_rate != DEFAULT_AUDIO_SAMPLE_RATE)
+ Error(ERR_WARN, "sound file '%s': wrong sample rate %d instead of %d",
+ filename, header.sample_rate, DEFAULT_AUDIO_SAMPLE_RATE);
+
+#if 0
+ printf("WAV file: '%s'\n", filename);
+ printf(" Compression code: %d'\n", header.compression_code);
+ printf(" Number of channels: %d'\n", header.num_channels);
+ printf(" Sample rate: %ld'\n", header.sample_rate);
+ printf(" Average bytes per second: %ld'\n", header.bytes_per_second);
+ printf(" Block align: %d'\n", header.block_align);
+ printf(" Significant bits per sample: %d'\n", header.bits_per_sample);
+#endif
}
else if (strcmp(chunk_name, "data") == 0)
{
return NULL;
}
- snd_info->format = AUDIO_FORMAT_U8;
+ if (header.bits_per_sample == 8)
+ snd_info->format = AUDIO_FORMAT_U8;
+ else /* header.bits_per_sample == 16 */
+ {
+ snd_info->format = AUDIO_FORMAT_S16;
+ snd_info->data_len /= 2; /* correct number of samples */
+ }
#endif /* AUDIO_UNIX_NATIVE */
{
char *filename = getCustomSoundFilename(basename);
+#if 0
+ printf("GOT CUSTOM SOUND FILE '%s'\n", filename);
+#endif
+
if (strcmp(basename, SND_FILE_UNDEFINED) == 0)
{
deleteSoundEntry(snd_info);
void LoadCustomMusic(void)
{
+ static boolean draw_init_text = TRUE; /* only draw at startup */
char *music_directory = getCustomMusicDirectory();
DIR *dir;
struct dirent *dir_entry;
return;
}
+ if (draw_init_text)
+ DrawInitText("Loading music:", 120, FC_GREEN);
+
while ((dir_entry = readdir(dir)) != NULL) /* loop until last dir entry */
{
char *basename = dir_entry->d_name;
char *filename = getPath2(music_directory, basename);
MusicInfo *mus_info = NULL;
+ if (draw_init_text)
+ DrawInitText(basename, 150, FC_YELLOW);
+
if (FileIsSound(basename))
mus_info = Load_WAV(filename);
else if (FileIsMusic(basename))
closedir(dir);
+ draw_init_text = FALSE;
+
if (num_music == 0)
Error(ERR_WARN, "cannot find any valid music files in directory '%s'",
music_directory);
void PlaySound(int nr)
{
- PlaySoundExt(nr, PSND_MAX_VOLUME, PSND_MIDDLE, SND_CTRL_PLAY_SOUND);
+ PlaySoundExt(nr, SOUND_MAX_VOLUME, SOUND_MIDDLE, SND_CTRL_PLAY_SOUND);
}
void PlaySoundStereo(int nr, int stereo_position)
{
- PlaySoundExt(nr, PSND_MAX_VOLUME, stereo_position, SND_CTRL_PLAY_SOUND);
+ PlaySoundExt(nr, SOUND_MAX_VOLUME, stereo_position, SND_CTRL_PLAY_SOUND);
}
void PlaySoundLoop(int nr)
{
- PlaySoundExt(nr, PSND_MAX_VOLUME, PSND_MIDDLE, SND_CTRL_PLAY_LOOP);
+ PlaySoundExt(nr, SOUND_MAX_VOLUME, SOUND_MIDDLE, SND_CTRL_PLAY_LOOP);
}
void PlaySoundMusic(int nr)
{
- PlaySoundExt(nr, PSND_MAX_VOLUME, PSND_MIDDLE, SND_CTRL_PLAY_MUSIC);
+ PlaySoundExt(nr, SOUND_MAX_VOLUME, SOUND_MIDDLE, SND_CTRL_PLAY_MUSIC);
}
void PlaySoundExt(int nr, int volume, int stereo_position, int state)
audio.sound_deactivated)
return;
- if (volume < PSND_MIN_VOLUME)
- volume = PSND_MIN_VOLUME;
- else if (volume > PSND_MAX_VOLUME)
- volume = PSND_MAX_VOLUME;
+ if (volume < SOUND_MIN_VOLUME)
+ volume = SOUND_MIN_VOLUME;
+ else if (volume > SOUND_MAX_VOLUME)
+ volume = SOUND_MAX_VOLUME;
- if (stereo_position < PSND_MAX_LEFT)
- stereo_position = PSND_MAX_LEFT;
- else if (stereo_position > PSND_MAX_RIGHT)
- stereo_position = PSND_MAX_RIGHT;
+ if (stereo_position < SOUND_MAX_LEFT)
+ stereo_position = SOUND_MAX_LEFT;
+ else if (stereo_position > SOUND_MAX_RIGHT)
+ stereo_position = SOUND_MAX_RIGHT;
snd_ctrl.active = TRUE;
snd_ctrl.nr = nr;
struct SetupFileList *setup_file_list;
int i;
+#if 0
+ printf("GOT CUSTOM SOUND CONFIG FILE '%s'\n", filename);
+#endif
+
/* always start with reliable default values */
for (i=0; i<num_sounds; i++)
sound_effect[i].filename = NULL;
freeSetupFileList(setup_file_list);
-#if 1
+#if 0
for (i=0; i<num_sounds; i++)
{
printf("'%s' ", sound_effect[i].text);
static void ReloadCustomSounds()
{
+ static boolean draw_init_text = TRUE; /* only draw at startup */
int i;
#if 0
LoadSoundsInfo();
+ if (draw_init_text)
+ DrawInitText("Loading sounds:", 120, FC_GREEN);
+
#if 0
printf("DEBUG: reloading %d sounds ...\n", num_sounds);
#endif
for(i=0; i<num_sounds; i++)
{
+ if (draw_init_text)
+ DrawInitText(sound_effect[i].text, 150, FC_YELLOW);
+
if (sound_effect[i].filename)
LoadSoundToList(sound_effect[i].filename, i);
else
LoadSoundToList(sound_effect[i].default_filename, i);
}
+ draw_init_text = FALSE;
+
/*
printf("list size == %d\n", getNumNodes(SoundFileList));
*/
if (!audio.sound_available)
return;
-#if defined(TARGET_SDL) || defined(TARGET_ALLEGRO)
- ReloadCustomSounds();
-#elif defined(AUDIO_UNIX_NATIVE)
+#if defined(AUDIO_UNIX_NATIVE)
WriteReloadInfoToPipe(set_name, SND_CTRL_RELOAD_SOUNDS);
+#else
+ ReloadCustomSounds();
#endif
}
if (!audio.music_available)
return;
-#if defined(TARGET_SDL) || defined(TARGET_ALLEGRO)
- ReloadCustomMusic();
-#elif defined(AUDIO_UNIX_NATIVE)
+#if defined(AUDIO_UNIX_NATIVE)
WriteReloadInfoToPipe(set_name, SND_CTRL_RELOAD_MUSIC);
+#else
+ ReloadCustomMusic();
#endif
}
if (Sound == NULL)
return;
+#if 0
printf("%s: FREEING SOUNDS ...\n",
IS_CHILD_PROCESS(audio.mixer_pid) ? "CHILD" : "PARENT");
+#endif
for(i=0; i<num_sounds; i++)
deleteSoundEntry(&Sound[i]);
FreeSound(Sound[i]);
*/
+#if 0
printf("%s: FREEING SOUNDS -- DONE\n",
IS_CHILD_PROCESS(audio.mixer_pid) ? "CHILD" : "PARENT");
+#endif
free(Sound);