X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsound.c;h=d451e6ecf58616a0f5403a815059974bcb917a98;hb=6d37ddaaf9915af0f483f4fc04d07b98e99e091e;hp=fbdbd87d9716fb569440219ccecac4bdaf861388;hpb=2eeb33b85d7394bd58f51bdc430894f97f8ee6f5;p=rocksndiamonds.git diff --git a/src/libgame/sound.c b/src/libgame/sound.c index fbdbd87d..d451e6ec 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -24,6 +24,9 @@ #include "setup.h" +#define IS_PARENT_PROCESS(pid) ((pid) > 0) +#define IS_CHILD_PROCESS(pid) ((pid) == 0) + struct ListNode { char *key; @@ -49,36 +52,18 @@ static int num_sounds = 0, num_music = 0; /* ========================================================================= */ /* THE STUFF BELOW IS ONLY USED BY THE SOUND SERVER CHILD PROCESS */ -static struct AudioFormatInfo afmt = -{ - TRUE, 0, DEFAULT_AUDIO_SAMPLE_RATE, DEFAULT_AUDIO_FRAGMENT_SIZE -}; - -static int playing_sounds = 0; -static struct SoundControl playlist[NUM_MIXER_CHANNELS]; -static struct SoundControl emptySoundControl = -{ -#if 1 - FALSE, -1, 0, 0, FALSE, 0, 0, 0, NULL -#else - -1,0,0, FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE,FALSE, 0,0, 0,NULL -#endif -}; +static struct AudioFormatInfo afmt; +static struct SoundControl mixer[NUM_MIXER_CHANNELS]; +static int mixer_active_channels = 0; /* forward declaration of internal functions */ -static void SoundServer_InsertNewSound(struct SoundControl); static void InitAudioDevice(struct AudioFormatInfo *); +static void Mixer_Main(void); -#if defined(PLATFORM_UNIX) -#if !defined(AUDIO_STREAMING_DSP) +#if defined(PLATFORM_UNIX) && !defined(AUDIO_STREAMING_DSP) static unsigned char linear_to_ulaw(int); static int ulaw_to_linear(unsigned char); #endif -#elif defined(PLATFORM_MSDOS) -static void SoundServer_InsertNewSound(struct SoundControl); -static void SoundServer_StopSound(struct SoundControl); -static void SoundServer_StopAllSounds(); -#endif static void ReloadCustomSounds(); static void ReloadCustomMusic(); @@ -144,27 +129,22 @@ static boolean TestAudioDevices(void) #if !defined(TARGET_SDL) static boolean ForkAudioProcess(void) { - if (pipe(audio.soundserver_pipe) < 0) + if (pipe(audio.mixer_pipe) < 0) { Error(ERR_WARN, "cannot create pipe -- no sounds"); return FALSE; } - if ((audio.soundserver_pid = fork()) < 0) + if ((audio.mixer_pid = fork()) < 0) { Error(ERR_WARN, "cannot create sound server process -- no sounds"); return FALSE; } - if (audio.soundserver_pid == 0) /* we are child process */ - { - SoundServer(); - - /* never reached */ - exit(0); - } - else /* we are parent */ - close(audio.soundserver_pipe[0]); /* no reading from pipe needed */ + if (IS_CHILD_PROCESS(audio.mixer_pid)) + Mixer_Main(); /* this function never returns */ + else + close(audio.mixer_pipe[0]); /* no reading from pipe needed */ return TRUE; } @@ -182,6 +162,10 @@ void UnixOpenAudio(void) audio.music_available = TRUE; audio.loops_available = TRUE; #endif + + audio.num_channels = NUM_MIXER_CHANNELS; + audio.music_channel = MUSIC_CHANNEL; + audio.first_sound_channel = FIRST_SOUND_CHANNEL; } void UnixCloseAudio(void) @@ -189,61 +173,71 @@ void UnixCloseAudio(void) if (audio.device_fd) close(audio.device_fd); - if (audio.soundserver_pid > 0) /* we are parent process */ - kill(audio.soundserver_pid, SIGTERM); + if (IS_PARENT_PROCESS(audio.mixer_pid)) + kill(audio.mixer_pid, SIGTERM); } -#endif /* PLATFORM_UNIX */ -void InitPlaylist(void) +static void SendSoundControlToMixerProcess(SoundControl *snd_ctrl) { - int i; + if (IS_CHILD_PROCESS(audio.mixer_pid)) + return; - for(i=0; ifullpath) + 1; unsigned long str_size2 = strlen(ti->basepath) + 1; unsigned long str_size3 = strlen(ti->fullpath) + 1; + if (IS_CHILD_PROCESS(audio.mixer_pid)) + return; + + if (leveldir_current == NULL) /* should never happen */ + Error(ERR_EXIT, "leveldir_current == NULL"); + + snd_ctrl.active = FALSE; snd_ctrl.state = type; snd_ctrl.data_len = strlen(set_name) + 1; - if (write(audio.soundserver_pipe[1], &snd_ctrl, + if (write(audio.mixer_pipe[1], &snd_ctrl, sizeof(snd_ctrl)) < 0 || - write(audio.soundserver_pipe[1], set_name, + write(audio.mixer_pipe[1], set_name, snd_ctrl.data_len) < 0 || - write(audio.soundserver_pipe[1], leveldir_current, + write(audio.mixer_pipe[1], leveldir_current, sizeof(TreeInfo)) < 0 || - write(audio.soundserver_pipe[1], ti, + write(audio.mixer_pipe[1], ti, sizeof(TreeInfo)) < 0 || - write(audio.soundserver_pipe[1], &str_size1, + write(audio.mixer_pipe[1], &str_size1, sizeof(unsigned long)) < 0 || - write(audio.soundserver_pipe[1], &str_size2, + write(audio.mixer_pipe[1], &str_size2, sizeof(unsigned long)) < 0 || - write(audio.soundserver_pipe[1], &str_size3, + write(audio.mixer_pipe[1], &str_size3, sizeof(unsigned long)) < 0 || - write(audio.soundserver_pipe[1], leveldir_current->fullpath, + write(audio.mixer_pipe[1], leveldir_current->fullpath, str_size1) < 0 || - write(audio.soundserver_pipe[1], ti->basepath, + write(audio.mixer_pipe[1], ti->basepath, str_size2) < 0 || - write(audio.soundserver_pipe[1], ti->fullpath, + write(audio.mixer_pipe[1], ti->fullpath, str_size3) < 0) { Error(ERR_WARN, "cannot pipe to child process -- no sounds"); @@ -252,9 +246,9 @@ static void WriteReloadInfoToPipe(char *set_name, int type) } } -static void ReadReloadInfoFromPipe(struct SoundControl snd_ctrl) +static void ReadReloadInfoFromPipe(SoundControl *snd_ctrl) { - TreeInfo **ti_ptr = ((snd_ctrl.state & SND_CTRL_RELOAD_SOUNDS) ? + TreeInfo **ti_ptr = ((snd_ctrl->state & SND_CTRL_RELOAD_SOUNDS) ? &artwork.snd_current : &artwork.mus_current); TreeInfo *ti = *ti_ptr; unsigned long str_size1, str_size2, str_size3; @@ -263,7 +257,7 @@ static void ReadReloadInfoFromPipe(struct SoundControl snd_ctrl) if (set_name) free(set_name); - set_name = checked_malloc(snd_ctrl.data_len); + set_name = checked_malloc(snd_ctrl->data_len); if (leveldir_current == NULL) leveldir_current = checked_calloc(sizeof(TreeInfo)); @@ -276,17 +270,17 @@ static void ReadReloadInfoFromPipe(struct SoundControl snd_ctrl) if (ti->fullpath != NULL) free(ti->fullpath); - if (read(audio.soundserver_pipe[0], set_name, - snd_ctrl.data_len) != snd_ctrl.data_len || - read(audio.soundserver_pipe[0], leveldir_current, + if (read(audio.mixer_pipe[0], set_name, + snd_ctrl->data_len) != snd_ctrl->data_len || + read(audio.mixer_pipe[0], leveldir_current, sizeof(TreeInfo)) != sizeof(TreeInfo) || - read(audio.soundserver_pipe[0], ti, + read(audio.mixer_pipe[0], ti, sizeof(TreeInfo)) != sizeof(TreeInfo) || - read(audio.soundserver_pipe[0], &str_size1, + read(audio.mixer_pipe[0], &str_size1, sizeof(unsigned long)) != sizeof(unsigned long) || - read(audio.soundserver_pipe[0], &str_size2, + read(audio.mixer_pipe[0], &str_size2, sizeof(unsigned long)) != sizeof(unsigned long) || - read(audio.soundserver_pipe[0], &str_size3, + read(audio.mixer_pipe[0], &str_size3, sizeof(unsigned long)) != sizeof(unsigned long)) Error(ERR_EXIT_SOUND_SERVER, "broken pipe -- no sounds"); @@ -294,28 +288,330 @@ static void ReadReloadInfoFromPipe(struct SoundControl snd_ctrl) ti->basepath = checked_calloc(str_size2); ti->fullpath = checked_calloc(str_size3); - if (read(audio.soundserver_pipe[0], leveldir_current->fullpath, + if (read(audio.mixer_pipe[0], leveldir_current->fullpath, str_size1) != str_size1 || - read(audio.soundserver_pipe[0], ti->basepath, + read(audio.mixer_pipe[0], ti->basepath, str_size2) != str_size2 || - read(audio.soundserver_pipe[0], ti->fullpath, + read(audio.mixer_pipe[0], ti->fullpath, str_size3) != str_size3) Error(ERR_EXIT_SOUND_SERVER, "broken pipe -- no sounds"); - if (snd_ctrl.state & SND_CTRL_RELOAD_SOUNDS) + if (snd_ctrl->state & SND_CTRL_RELOAD_SOUNDS) artwork.sounds_set_current = set_name; else artwork.music_set_current = set_name; } +#endif /* PLATFORM_UNIX */ -static void HandleSoundRequest(struct SoundControl snd_ctrl) +void Mixer_InitChannels() { int i; + for(i=0; i= num_sounds) + return; + + snd_info = (IS_MUSIC(snd_ctrl) ? Music[snd_ctrl.nr] : Sound[snd_ctrl.nr]); + if (snd_info == NULL) + return; + + /* copy sound sample and format information */ + snd_ctrl.data_ptr = snd_info->data_ptr; + snd_ctrl.data_len = snd_info->data_len; + snd_ctrl.format = snd_info->format; + + if (IS_MUSIC(snd_ctrl)) + { + mixer[audio.music_channel] = snd_ctrl; + + Mixer_PlayChannel(audio.music_channel); + + return; + } + +#if 0 + printf("-> %d\n", mixer_active_channels); +#endif + + if (mixer_active_channels == audio.num_channels) + { + for (i=0; i longest) + { + longest = actual; + longest_nr = i; + } + } + + Mixer_StopChannel(longest_nr); + } + + /* check if sound is already being played (and how often) */ + for (k=0, i=audio.first_sound_channel; i= 1 && IS_LOOP(snd_ctrl)) + { + for(i=audio.first_sound_channel; i= 2) + { + int longest = 0, longest_nr = audio.first_sound_channel; + + /* look for oldest equal sound */ + for(i=audio.first_sound_channel; i= longest) + { + longest = actual; + longest_nr = i; + } + } + + Mixer_StopChannel(longest_nr); + } + + /* add new sound to mixer */ + for(i=0; idata_len == 0) + { + printf("THIS SHOULD NEVER HAPPEN! [snd_info->data_len == 0]\n"); + } +#endif + +#if 1 + if (IS_MUSIC(snd_ctrl) && i == audio.music_channel && mixer[i].active) + { + printf("THIS SHOULD NEVER HAPPEN! [adding music twice]\n"); + +#if 1 + Mixer_StopChannel(i); +#endif + } +#endif + +#if 0 + snd_ctrl.data_ptr = snd_info->data_ptr; + snd_ctrl.data_len = snd_info->data_len; + snd_ctrl.format = snd_info->format; +#endif + + mixer[i] = snd_ctrl; + + Mixer_PlayChannel(i); + + break; + } + } +} + +static void HandleSoundRequest(SoundControl snd_ctrl) +{ + int i; + +#if defined(AUDIO_UNIX_NATIVE) + if (IS_PARENT_PROCESS(audio.mixer_pid)) + { + SendSoundControlToMixerProcess(&snd_ctrl); + return; + } +#elif defined(TARGET_ALLEGRO) + for (i=0; i= SOUND_FADING_VOLUME_THRESHOLD) - playlist[i].volume -= SOUND_FADING_VOLUME_STEP; + if (IS_FADING(mixer[i]) && + mixer[i].volume >= SOUND_FADING_VOLUME_THRESHOLD) + mixer[i].volume -= SOUND_FADING_VOLUME_STEP; /* adjust volume of actual sound sample */ - if (playlist[i].volume != PSND_MAX_VOLUME) + if (mixer[i].volume != PSND_MAX_VOLUME) for(j=0; j> PSND_MAX_VOLUME_BITS; /* 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 + playlist[i].stereo]; - int right_volume= stereo_volume[middle_pos - playlist[i].stereo]; + int left_volume = stereo_volume[middle_pos + mixer[i].stereo]; + int right_volume= stereo_volume[middle_pos - mixer[i].stereo]; for(j=0; j= playlist[i].data_len) + /* delete completed sound entries from the mixer */ + if (mixer[i].playingpos >= mixer[i].data_len) { - if (IS_LOOP(playlist[i])) - playlist[i].playingpos = 0; + if (IS_LOOP(mixer[i])) + mixer[i].playingpos = 0; else - PlaylistRemoveSound(i); + Mixer_StopChannel(i); } - else if (playlist[i].volume <= SOUND_FADING_VOLUME_THRESHOLD) - PlaylistRemoveSound(i); + else if (mixer[i].volume <= SOUND_FADING_VOLUME_THRESHOLD) + Mixer_StopChannel(i); } /* prepare final playing buffer according to system audio format */ @@ -559,457 +857,139 @@ static void SoundServer_Mixer() /* finally play the sound fragment */ write(audio.device_fd, playing_buffer, fragment_size); - if (!playing_sounds) + if (!mixer_active_channels) CloseAudioDevice(&audio.device_fd); } -#else /* !AUDIO_STREAMING_DSP */ - -static int SoundServer_SimpleAudio(struct SoundControl snd_ctrl) -{ - static short premix_first_buffer[SND_BLOCKSIZE]; - static byte playing_buffer[SND_BLOCKSIZE]; - int max_sample_size = SND_BLOCKSIZE; - void *sample_ptr; - int sample_len; - int sample_pos; - int sample_size; - int i, j; - - i = 1; - - /* pointer, lenght and actual playing position of sound sample */ - sample_ptr = playlist[i].data_ptr; - sample_len = playlist[i].data_len; - sample_pos = playlist[i].playingpos; - sample_size = MIN(max_sample_size, sample_len - sample_pos); - playlist[i].playingpos += sample_size; - - /* copy original sample to first mixing buffer */ - CopySampleToMixingBuffer(&playlist[i], sample_pos, sample_size, - premix_first_buffer); - - /* adjust volume of actual sound sample */ - if (playlist[i].volume != PSND_MAX_VOLUME) - for(j=0; j> PSND_MAX_VOLUME_BITS; - - /* might be needed for u-law /dev/audio */ -#if 0 - for(j=0; j= playlist[i].data_len) - PlaylistRemoveSound(i); - - for(i=0; i> 8) ^ 0x80; - - /* finally play the sound fragment */ - write(audio.device_fd, playing_buffer, sample_size); - - return sample_size; -} -#endif /* !AUDIO_STREAMING_DSP */ - -void SoundServer() -{ - struct SoundControl snd_ctrl; - fd_set sound_fdset; - - close(audio.soundserver_pipe[1]); /* no writing into pipe needed */ - - InitPlaylist(); - -#if defined(PLATFORM_HPUX) - InitAudioDevice(&afmt); -#endif - - FD_ZERO(&sound_fdset); - FD_SET(audio.soundserver_pipe[0], &sound_fdset); - - while(1) /* wait for sound playing commands from client */ - { - struct timeval delay = { 0, 0 }; - - FD_SET(audio.soundserver_pipe[0], &sound_fdset); - select(audio.soundserver_pipe[0] + 1, &sound_fdset, NULL, NULL, NULL); - if (!FD_ISSET(audio.soundserver_pipe[0], &sound_fdset)) - continue; - if (read(audio.soundserver_pipe[0], &snd_ctrl, sizeof(snd_ctrl)) - != sizeof(snd_ctrl)) - Error(ERR_EXIT_SOUND_SERVER, "broken pipe -- no sounds"); - - HandleSoundRequest(snd_ctrl); - -#if defined(AUDIO_STREAMING_DSP) - - while (playing_sounds && select(audio.soundserver_pipe[0] + 1, - &sound_fdset, NULL, NULL, &delay) < 1) - { - FD_SET(audio.soundserver_pipe[0], &sound_fdset); - - SoundServer_Mixer(); - } - -#else /* !AUDIO_STREAMING_DSP */ - - if (!snd_ctrl.active || IS_LOOP(snd_ctrl) || - (audio.device_fd = OpenAudioDevice(audio.device_name)) < 0) - continue; - - InitAudioDevice(&afmt); - - delay.tv_sec = 0; - delay.tv_usec = 0; - - while (playing_sounds && select(audio.soundserver_pipe[0] + 1, - &sound_fdset, NULL, NULL, &delay) < 1) - { - int wait_percent = 90; /* wait 90% of the real playing time */ - int sample_size; - - FD_SET(audio.soundserver_pipe[0], &sound_fdset); - - sample_size = SoundServer_SimpleAudio(snd_ctrl); - - delay.tv_sec = 0; - delay.tv_usec = - ((sample_size * 10 * wait_percent) / afmt.sample_rate) * 1000; - } - - CloseAudioDevice(&audio.device_fd); - - /* delete all sounds from playlist */ - InitPlaylist(); - -#endif /* !AUDIO_STREAMING_DSP */ - } -} -#endif /* PLATFORM_UNIX */ - -#if defined(PLATFORM_MSDOS) -static void sound_handler(struct SoundControl snd_ctrl) -{ - int i; - - if (snd_ctrl.fade_sound) - { - if (!playing_sounds) - return; - - for (i=0; i= num_sounds) - return; - - snd_info = (IS_MUSIC(snd_ctrl) ? Music[snd_ctrl.nr] : Sound[snd_ctrl.nr]); - if (snd_info == NULL) - { -#if 0 - printf("sound/music %d undefined\n", snd_ctrl.nr); -#endif - return; - } - -#if 0 - printf("-> %d\n", playing_sounds); -#endif +#else /* !AUDIO_STREAMING_DSP */ - if (playing_sounds == NUM_MIXER_CHANNELS) - { - for (i=0; i longest) - { - longest = actual; - longest_nr = i; - } - } -#if defined(PLATFORM_MSDOS) - voice_set_volume(playlist[longest_nr].voice, 0); - deallocate_voice(playlist[longest_nr].voice); + /* adjust volume of actual sound sample */ + if (mixer[i].volume != PSND_MAX_VOLUME) + for(j=0; j> PSND_MAX_VOLUME_BITS; + + /* might be needed for u-law /dev/audio */ +#if 0 + for(j=0; j= mixer[i].data_len) + Mixer_StopChannel(i); - /* restart loop sounds only if they are just fading out */ - if (k >= 1 && IS_LOOP(snd_ctrl)) - { - for(i=FIRST_SOUND_CHANNEL; i> 8) ^ 0x80; - return; - } + /* finally play the sound fragment */ + write(audio.device_fd, playing_buffer, sample_size); - /* don't play sound more than n times simultaneously (with n == 2 for now) */ - if (k >= 2) - { - int longest = 0, longest_nr = 0; + return sample_size; +} +#endif /* !AUDIO_STREAMING_DSP */ - /* look for oldest equal sound */ - for(i=FIRST_SOUND_CHANNEL; i= longest) - { - longest = actual; - longest_nr = i; - } - } + Mixer_InitChannels(); -#if defined(PLATFORM_MSDOS) - voice_set_volume(playlist[longest_nr].voice, 0); - deallocate_voice(playlist[longest_nr].voice); +#if defined(PLATFORM_HPUX) + InitAudioDevice(&afmt); #endif - playlist[longest_nr] = emptySoundControl; - playing_sounds--; - } - /* add new sound to playlist */ - for(i=0; idata_ptr; - snd_ctrl.data_len = snd_info->data_len; - snd_ctrl.format = snd_info->format; + while(1) /* wait for sound playing commands from client */ + { + struct timeval delay = { 0, 0 }; -#if 1 - if (snd_info->data_len == 0) - { - printf("THIS SHOULD NEVER HAPPEN! [snd_info->data_len == 0]\n"); - } -#endif + FD_SET(audio.mixer_pipe[0], &mixer_fdset); + select(audio.mixer_pipe[0] + 1, &mixer_fdset, NULL, NULL, NULL); + if (!FD_ISSET(audio.mixer_pipe[0], &mixer_fdset)) + continue; -#if 1 - if (IS_MUSIC(snd_ctrl) && i == MUSIC_CHANNEL && playlist[i].active) - { - printf("THIS SHOULD NEVER HAPPEN! [adding music twice]\n"); + ReadSoundControlFromMainProcess(&snd_ctrl); -#if 1 - playlist[i] = emptySoundControl; - playing_sounds--; -#endif - } -#endif + HandleSoundRequest(snd_ctrl); - playlist[i] = snd_ctrl; - playing_sounds++; +#if defined(AUDIO_STREAMING_DSP) -#if 0 - printf("NEW SOUND %d ADDED TO PLAYLIST\n", snd_ctrl.nr); -#endif + while (mixer_active_channels && + select(audio.mixer_pipe[0] + 1, + &mixer_fdset, NULL, NULL, &delay) < 1) + { + FD_SET(audio.mixer_pipe[0], &mixer_fdset); -#if defined(PLATFORM_MSDOS) - playlist[i].voice = allocate_voice((SAMPLE *)playlist[i].data_ptr); + Mixer_Main_DSP(); + } - if (snd_ctrl.loop) - voice_set_playmode(playlist[i].voice, PLAYMODE_LOOP); +#else /* !AUDIO_STREAMING_DSP */ - voice_set_volume(playlist[i].voice, snd_ctrl.volume); - voice_set_pan(playlist[i].voice, snd_ctrl.stereo); - voice_start(playlist[i].voice); -#endif - break; - } - } -} -#endif /* !PLATFORM_WIN32 */ + if (!snd_ctrl.active || IS_LOOP(snd_ctrl) || + (audio.device_fd = OpenAudioDevice(audio.device_name)) < 0) + continue; -/* -void SoundServer_FadeSound(int nr) -{ - int i; + InitAudioDevice(&afmt); - if (!playing_sounds) - return; + delay.tv_sec = 0; + delay.tv_usec = 0; - for(i=0;istereo = TRUE; + afmt->format = AUDIO_FORMAT_UNKNOWN; + afmt->sample_rate = DEFAULT_AUDIO_SAMPLE_RATE; + afmt->fragment_size = DEFAULT_AUDIO_FRAGMENT_SIZE; + #if defined(AUDIO_LINUX_IOCTL) InitAudioDevice_Linux(afmt); #elif defined(PLATFORM_NETBSD) @@ -1629,7 +1614,7 @@ void PlaySoundMusic(int nr) void PlaySoundExt(int nr, int volume, int stereo, int state) { - struct SoundControl snd_ctrl = emptySoundControl; + SoundControl snd_ctrl; if (!audio.sound_available || !audio.sound_enabled || @@ -1652,25 +1637,7 @@ void PlaySoundExt(int nr, int volume, int stereo, int state) snd_ctrl.stereo = stereo; snd_ctrl.state = state; -#if defined(TARGET_SDL) - if (Sound[nr]) - { - Mix_Volume(-1, SOUND_MAX_VOLUME); - Mix_PlayChannel(-1, Sound[nr]->data_ptr, (state & SND_CTRL_LOOP ? -1 : 0)); - } -#elif defined(PLATFORM_UNIX) - if (audio.soundserver_pid == 0) /* we are child process */ - return; - - if (write(audio.soundserver_pipe[1], &snd_ctrl, sizeof(snd_ctrl)) < 0) - { - Error(ERR_WARN, "cannot pipe to child process -- no sounds"); - audio.sound_available = audio.sound_enabled = FALSE; - return; - } -#elif defined(PLATFORM_MSDOS) - sound_handler(snd_ctrl); -#endif + HandleSoundRequest(snd_ctrl); } void FadeMusic(void) @@ -1723,51 +1690,16 @@ void StopSounds() void StopSoundExt(int nr, int state) { - struct SoundControl snd_ctrl = emptySoundControl; + SoundControl snd_ctrl; if (!audio.sound_available) return; - snd_ctrl.nr = nr; - snd_ctrl.state = state; - -#if defined(TARGET_SDL) - - if (state & SND_CTRL_FADE) - { - int i; - - for (i=0; ifullpath) + 1; - unsigned long str_size2 = strlen(ti->basepath) + 1; - unsigned long str_size3 = strlen(ti->fullpath) + 1; -#endif -#endif - if (!audio.sound_available) return; #if defined(TARGET_SDL) || defined(TARGET_ALLEGRO) - if (type == SND_CTRL_RELOAD_SOUNDS) - ReloadCustomSounds(); - else - ReloadCustomMusic(); + ReloadCustomSounds(); #elif defined(PLATFORM_UNIX) - if (audio.soundserver_pid == 0) /* we are child process */ - return; - - if (leveldir_current == NULL) /* should never happen */ - Error(ERR_EXIT, "leveldir_current == NULL"); - -#if 1 - WriteReloadInfoToPipe(set_name, type); -#else - - snd_ctrl.state = type; - snd_ctrl.data_len = strlen(set_name) + 1; - - if (write(audio.soundserver_pipe[1], &snd_ctrl, - sizeof(snd_ctrl)) < 0 || - write(audio.soundserver_pipe[1], set_name, - snd_ctrl.data_len) < 0 || - write(audio.soundserver_pipe[1], leveldir_current, - sizeof(TreeInfo)) < 0 || - write(audio.soundserver_pipe[1], ti, - sizeof(TreeInfo)) < 0 || - write(audio.soundserver_pipe[1], &str_size1, - sizeof(unsigned long)) < 0 || - write(audio.soundserver_pipe[1], &str_size2, - sizeof(unsigned long)) < 0 || - write(audio.soundserver_pipe[1], &str_size3, - sizeof(unsigned long)) < 0 || - write(audio.soundserver_pipe[1], leveldir_current->fullpath, - str_size1) < 0 || - write(audio.soundserver_pipe[1], ti->basepath, - str_size2) < 0 || - write(audio.soundserver_pipe[1], ti->fullpath, - str_size3) < 0) - { - Error(ERR_WARN, "cannot pipe to child process -- no sounds"); - audio.sound_available = audio.sound_enabled = FALSE; - return; - } + WriteReloadInfoToPipe(set_name, SND_CTRL_RELOAD_SOUNDS); #endif - -#endif -} - -void InitReloadSounds(char *set_name) -{ - InitReloadSoundsOrMusic(set_name, SND_CTRL_RELOAD_SOUNDS); } void InitReloadMusic(char *set_name) { - InitReloadSoundsOrMusic(set_name, SND_CTRL_RELOAD_MUSIC); + if (!audio.music_available) + return; + +#if defined(TARGET_SDL) || defined(TARGET_ALLEGRO) + ReloadCustomMusic(); +#elif defined(PLATFORM_UNIX) + WriteReloadInfoToPipe(set_name, SND_CTRL_RELOAD_MUSIC); +#endif } void FreeSound(void *ptr) @@ -2050,7 +1931,7 @@ void FreeAllSounds() return; printf("%s: FREEING SOUNDS ...\n", - audio.soundserver_pid == 0 ? "CHILD" : "PARENT"); + IS_CHILD_PROCESS(audio.mixer_pid) ? "CHILD" : "PARENT"); for(i=0; i