X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsound.c;h=d451e6ecf58616a0f5403a815059974bcb917a98;hb=6d37ddaaf9915af0f483f4fc04d07b98e99e091e;hp=20991570de7e00005ccdf1f900790e70f4429145;hpb=430aa8b71d2031eabc6341d4812363023105586e;p=rocksndiamonds.git diff --git a/src/libgame/sound.c b/src/libgame/sound.c index 20991570..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,39 +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]; - -#if 0 -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 -}; -#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(); @@ -147,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; } @@ -196,42 +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); +} + +static void SendSoundControlToMixerProcess(SoundControl *snd_ctrl) +{ + if (IS_CHILD_PROCESS(audio.mixer_pid)) + return; + + if (write(audio.mixer_pipe[1], snd_ctrl, sizeof(SoundControl)) < 0) + { + Error(ERR_WARN, "cannot pipe to child process -- no sounds"); + audio.sound_available = audio.sound_enabled = FALSE; + return; + } +} + +static void ReadSoundControlFromMainProcess(SoundControl *snd_ctrl) +{ + if (IS_PARENT_PROCESS(audio.mixer_pid)) + return; + + if (read(audio.mixer_pipe[0], snd_ctrl, sizeof(SoundControl)) + != sizeof(SoundControl)) + Error(ERR_EXIT_SOUND_SERVER, "broken pipe -- no sounds"); } static void WriteReloadInfoToPipe(char *set_name, int type) { - struct SoundControl snd_ctrl; + SoundControl snd_ctrl; TreeInfo *ti = (type == SND_CTRL_RELOAD_SOUNDS ? artwork.snd_current : artwork.mus_current); unsigned long str_size1 = strlen(leveldir_current->fullpath) + 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"); @@ -240,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; @@ -251,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)); @@ -264,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"); @@ -282,40 +288,125 @@ 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 */ -void InitPlaylist(void) +void Mixer_InitChannels() { int i; for(i=0; idata_ptr; + snd_ctrl.data_len = snd_info->data_len; + snd_ctrl.format = snd_info->format; + + if (IS_MUSIC(snd_ctrl)) { -#if 0 - printf("sound/music %d undefined\n", snd_ctrl.nr); -#endif + mixer[audio.music_channel] = snd_ctrl; + + Mixer_PlayChannel(audio.music_channel); + return; } #if 0 - printf("-> %d\n", playing_sounds); + printf("-> %d\n", mixer_active_channels); #endif - if (playing_sounds == audio.num_channels) + if (mixer_active_channels == audio.num_channels) { for (i=0; i longest) + if (!IS_LOOP(mixer[i]) && actual > longest) { longest = actual; longest_nr = i; } } -#if defined(PLATFORM_MSDOS) - voice_set_volume(playlist[longest_nr].voice, 0); - deallocate_voice(playlist[longest_nr].voice); -#endif - PlaylistRemoveSound(longest_nr); + + Mixer_StopChannel(longest_nr); } /* check if sound is already being played (and how often) */ for (k=0, i=audio.first_sound_channel; i= 2) { - int longest = 0, longest_nr = 0; + int longest = 0, longest_nr = audio.first_sound_channel; /* look for oldest equal sound */ for(i=audio.first_sound_channel; i= longest) { @@ -433,14 +530,10 @@ static void PlaylistInsertSound(struct SoundControl snd_ctrl) } } -#if defined(PLATFORM_MSDOS) - voice_set_volume(playlist[longest_nr].voice, 0); - deallocate_voice(playlist[longest_nr].voice); -#endif - PlaylistRemoveSound(longest_nr); + Mixer_StopChannel(longest_nr); } - /* add new sound to playlist */ + /* add new sound to mixer */ for(i=0; idata_ptr; - snd_ctrl.data_len = snd_info->data_len; - snd_ctrl.format = snd_info->format; +#if 0 + printf("ADDING NEW SOUND %d TO MIXER\n", snd_ctrl.nr); +#endif #if 1 if (snd_info->data_len == 0) @@ -466,46 +559,59 @@ static void PlaylistInsertSound(struct SoundControl snd_ctrl) #endif #if 1 - if (IS_MUSIC(snd_ctrl) && i == audio.music_channel && playlist[i].active) + if (IS_MUSIC(snd_ctrl) && i == audio.music_channel && mixer[i].active) { printf("THIS SHOULD NEVER HAPPEN! [adding music twice]\n"); #if 1 - PlaylistRemoveSound(i); + Mixer_StopChannel(i); #endif } #endif - playlist[i] = snd_ctrl; - playing_sounds++; - #if 0 - printf("NEW SOUND %d ADDED TO PLAYLIST\n", snd_ctrl.nr); + snd_ctrl.data_ptr = snd_info->data_ptr; + snd_ctrl.data_len = snd_info->data_len; + snd_ctrl.format = snd_info->format; #endif -#if defined(PLATFORM_MSDOS) - playlist[i].voice = allocate_voice((SAMPLE *)playlist[i].data_ptr); + mixer[i] = snd_ctrl; - if (snd_ctrl.loop) - voice_set_playmode(playlist[i].voice, PLAYMODE_LOOP); + Mixer_PlayChannel(i); - 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; } } } -static void HandleSoundRequest(struct SoundControl snd_ctrl) +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 */ @@ -748,13 +857,13 @@ 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 int Mixer_Main_SimpleAudio(SoundControl snd_ctrl) { static short premix_first_buffer[SND_BLOCKSIZE]; static byte playing_buffer[SND_BLOCKSIZE]; @@ -768,21 +877,21 @@ static int SoundServer_SimpleAudio(struct SoundControl snd_ctrl) 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_ptr = mixer[i].data_ptr; + sample_len = mixer[i].data_len; + sample_pos = mixer[i].playingpos; sample_size = MIN(max_sample_size, sample_len - sample_pos); - playlist[i].playingpos += sample_size; + mixer[i].playingpos += sample_size; /* copy original sample to first mixing buffer */ - CopySampleToMixingBuffer(&playlist[i], sample_pos, sample_size, + CopySampleToMixingBuffer(&mixer[i], sample_pos, sample_size, premix_first_buffer); /* 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; /* might be needed for u-law /dev/audio */ @@ -792,9 +901,9 @@ static int SoundServer_SimpleAudio(struct SoundControl snd_ctrl) linear_to_ulaw(premix_first_buffer[j]); #endif - /* delete completed sound entries from the playlist */ - if (playlist[i].playingpos >= playlist[i].data_len) - PlaylistRemoveSound(i); + /* delete completed sound entries from the mixer */ + if (mixer[i].playingpos >= mixer[i].data_len) + Mixer_StopChannel(i); for(i=0; i> 8) ^ 0x80; @@ -806,44 +915,44 @@ static int SoundServer_SimpleAudio(struct SoundControl snd_ctrl) } #endif /* !AUDIO_STREAMING_DSP */ -void SoundServer() +void Mixer_Main() { - struct SoundControl snd_ctrl; - fd_set sound_fdset; + SoundControl snd_ctrl; + fd_set mixer_fdset; - close(audio.soundserver_pipe[1]); /* no writing into pipe needed */ + close(audio.mixer_pipe[1]); /* no writing into pipe needed */ - InitPlaylist(); + Mixer_InitChannels(); #if defined(PLATFORM_HPUX) InitAudioDevice(&afmt); #endif - FD_ZERO(&sound_fdset); - FD_SET(audio.soundserver_pipe[0], &sound_fdset); + FD_ZERO(&mixer_fdset); + FD_SET(audio.mixer_pipe[0], &mixer_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)) + 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 (read(audio.soundserver_pipe[0], &snd_ctrl, sizeof(snd_ctrl)) - != sizeof(snd_ctrl)) - Error(ERR_EXIT_SOUND_SERVER, "broken pipe -- no sounds"); + + ReadSoundControlFromMainProcess(&snd_ctrl); HandleSoundRequest(snd_ctrl); #if defined(AUDIO_STREAMING_DSP) - while (playing_sounds && select(audio.soundserver_pipe[0] + 1, - &sound_fdset, NULL, NULL, &delay) < 1) + while (mixer_active_channels && + select(audio.mixer_pipe[0] + 1, + &mixer_fdset, NULL, NULL, &delay) < 1) { - FD_SET(audio.soundserver_pipe[0], &sound_fdset); + FD_SET(audio.mixer_pipe[0], &mixer_fdset); - SoundServer_Mixer(); + Mixer_Main_DSP(); } #else /* !AUDIO_STREAMING_DSP */ @@ -857,15 +966,16 @@ void SoundServer() delay.tv_sec = 0; delay.tv_usec = 0; - while (playing_sounds && select(audio.soundserver_pipe[0] + 1, - &sound_fdset, NULL, NULL, &delay) < 1) + while (mixer_active_channels && + select(audio.mixer_pipe[0] + 1, + &mixer_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); + FD_SET(audio.mixer_pipe[0], &mixer_fdset); - sample_size = SoundServer_SimpleAudio(snd_ctrl); + sample_size = Mixer_Main_SimpleAudio(snd_ctrl); delay.tv_sec = 0; delay.tv_usec = @@ -874,329 +984,13 @@ void SoundServer() CloseAudioDevice(&audio.device_fd); - /* delete all sounds from playlist */ - InitPlaylist(); + Mixer_InitChannels(); /* remove all sounds from mixer */ #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 - - if (playing_sounds == audio.num_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); -#endif - PlaylistRemoveSound(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 = 0; - - /* look for oldest equal sound */ - for(i=audio.first_sound_channel; 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); -#endif - PlaylistRemoveSound(longest_nr); - } - - /* add new sound to playlist */ - for(i=0; idata_ptr; - snd_ctrl.data_len = snd_info->data_len; - snd_ctrl.format = snd_info->format; - - snd_ctrl.playingpos = 0; - snd_ctrl.playingtime = 0; - -#if 1 - if (snd_info->data_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 && playlist[i].active) - { - printf("THIS SHOULD NEVER HAPPEN! [adding music twice]\n"); - -#if 1 - PlaylistRemoveSound(i); -#endif - } -#endif - - playlist[i] = snd_ctrl; - playing_sounds++; - -#if 0 - printf("NEW SOUND %d ADDED TO PLAYLIST\n", snd_ctrl.nr); -#endif - -#if defined(PLATFORM_MSDOS) - playlist[i].voice = allocate_voice((SAMPLE *)playlist[i].data_ptr); - - if (snd_ctrl.loop) - voice_set_playmode(playlist[i].voice, PLAYMODE_LOOP); - - 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 */ - -/* -void SoundServer_FadeSound(int nr) -{ - int i; - - if (!playing_sounds) - return; - - 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) @@ -1815,7 +1614,7 @@ void PlaySoundMusic(int nr) void PlaySoundExt(int nr, int volume, int stereo, int state) { - struct SoundControl snd_ctrl; + SoundControl snd_ctrl; if (!audio.sound_available || !audio.sound_enabled || @@ -1838,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) @@ -1909,7 +1690,7 @@ void StopSounds() void StopSoundExt(int nr, int state) { - struct SoundControl snd_ctrl; + SoundControl snd_ctrl; if (!audio.sound_available) return; @@ -1918,47 +1699,7 @@ void StopSoundExt(int nr, int state) snd_ctrl.nr = nr; snd_ctrl.state = state; -#if defined(TARGET_SDL) - - if (state & SND_CTRL_FADE) - { - int i; - - /* - for (i=audio.first_sound_channel; ifullpath, - 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; - } -#endif - + WriteReloadInfoToPipe(set_name, SND_CTRL_RELOAD_SOUNDS); #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) @@ -2231,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