X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsound.c;h=ac814e90f30a6fbcae9e2daea299796a9285037f;hb=71a1616f11627ab005c19fc6fc06ba23f6b4b633;hp=fbdbd87d9716fb569440219ccecac4bdaf861388;hpb=2eeb33b85d7394bd58f51bdc430894f97f8ee6f5;p=rocksndiamonds.git diff --git a/src/libgame/sound.c b/src/libgame/sound.c index fbdbd87d..ac814e90 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -49,36 +49,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 +126,27 @@ 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 */ + if (audio.mixer_pid == 0) /* we are child process */ { - SoundServer(); + Mixer_Main(); /* never reached */ exit(0); } else /* we are parent */ - close(audio.soundserver_pipe[0]); /* no reading from pipe needed */ + close(audio.mixer_pipe[0]); /* no reading from pipe needed */ return TRUE; } @@ -182,6 +164,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 +175,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 (audio.mixer_pid > 0) /* we are parent process */ + kill(audio.mixer_pid, SIGTERM); } -#endif /* PLATFORM_UNIX */ -void InitPlaylist(void) +static void WriteSoundControlToPipe(struct SoundControl snd_ctrl) { - int i; + if (audio.mixer_pid == 0) /* we are child process */ + return; - for(i=0; ifullpath) + 1; unsigned long str_size2 = strlen(ti->basepath) + 1; unsigned long str_size3 = strlen(ti->fullpath) + 1; + if (audio.mixer_pid == 0) /* we are child process */ + 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"); @@ -276,17 +272,17 @@ static void ReadReloadInfoFromPipe(struct SoundControl snd_ctrl) if (ti->fullpath != NULL) free(ti->fullpath); - if (read(audio.soundserver_pipe[0], set_name, + if (read(audio.mixer_pipe[0], set_name, snd_ctrl.data_len) != snd_ctrl.data_len || - read(audio.soundserver_pipe[0], leveldir_current, + 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,11 +290,11 @@ 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"); @@ -307,15 +303,261 @@ static void ReadReloadInfoFromPipe(struct SoundControl snd_ctrl) else artwork.music_set_current = set_name; } +#endif /* PLATFORM_UNIX */ + +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) + { +#if 0 + printf("sound/music %d undefined\n", snd_ctrl.nr); +#endif + 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_RemoveSound(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_RemoveSound(longest_nr); + } + + /* add new sound to mixer */ + 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 && mixer[i].active) + { + printf("THIS SHOULD NEVER HAPPEN! [adding music twice]\n"); + +#if 1 + Mixer_RemoveSound(i); +#endif + } +#endif + + mixer[i] = snd_ctrl; + mixer_active_channels++; + +#if 0 + printf("NEW SOUND %d ADDED TO MIXER\n", snd_ctrl.nr); +#endif + + Mixer_PlayChannel(i); + + break; + } + } +} static void HandleSoundRequest(struct SoundControl snd_ctrl) { int i; +#if defined(PLATFORM_MSDOS) + 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_RemoveSound(i); } - else if (playlist[i].volume <= SOUND_FADING_VOLUME_THRESHOLD) - PlaylistRemoveSound(i); + else if (mixer[i].volume <= SOUND_FADING_VOLUME_THRESHOLD) + Mixer_RemoveSound(i); } /* prepare final playing buffer according to system audio format */ @@ -559,13 +803,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(struct SoundControl snd_ctrl) { static short premix_first_buffer[SND_BLOCKSIZE]; static byte playing_buffer[SND_BLOCKSIZE]; @@ -579,21 +823,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 */ @@ -603,9 +847,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_RemoveSound(i); for(i=0; i> 8) ^ 0x80; @@ -617,44 +861,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; + 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"); + + ReadSoundControlFromPipe(&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 */ @@ -668,15 +912,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 = @@ -685,332 +930,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 == 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); -#endif - playlist[longest_nr] = emptySoundControl; - playing_sounds--; - } - - /* check if sound is already being played (and how often) */ - for (k=0, i=FIRST_SOUND_CHANNEL; i= 1 && IS_LOOP(snd_ctrl)) - { - for(i=FIRST_SOUND_CHANNEL; i= 2) - { - int longest = 0, longest_nr = 0; - - /* look for oldest equal sound */ - for(i=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 - 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; - -#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 == MUSIC_CHANNEL && playlist[i].active) - { - printf("THIS SHOULD NEVER HAPPEN! [adding music twice]\n"); - -#if 1 - playlist[i] = emptySoundControl; - playing_sounds--; -#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) @@ -1629,7 +1560,7 @@ void PlaySoundMusic(int nr) void PlaySoundExt(int nr, int volume, int stereo, int state) { - struct SoundControl snd_ctrl = emptySoundControl; + struct SoundControl snd_ctrl; if (!audio.sound_available || !audio.sound_enabled || @@ -1659,17 +1590,13 @@ void PlaySoundExt(int nr, int volume, int stereo, int state) 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; - } + WriteSoundControlToPipe(snd_ctrl); + #elif defined(PLATFORM_MSDOS) - sound_handler(snd_ctrl); + + HandleSoundRequest(snd_ctrl); + #endif } @@ -1723,13 +1650,14 @@ void StopSounds() void StopSoundExt(int nr, int state) { - struct SoundControl snd_ctrl = emptySoundControl; + struct SoundControl snd_ctrl; if (!audio.sound_available) return; - snd_ctrl.nr = nr; - snd_ctrl.state = state; + snd_ctrl.active = FALSE; + snd_ctrl.nr = nr; + snd_ctrl.state = state; #if defined(TARGET_SDL) @@ -1737,6 +1665,10 @@ void StopSoundExt(int nr, int state) { int i; + /* + for (i=audio.first_sound_channel; 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; - } -#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) @@ -2050,7 +1926,7 @@ void FreeAllSounds() return; printf("%s: FREEING SOUNDS ...\n", - audio.soundserver_pid == 0 ? "CHILD" : "PARENT"); + audio.mixer_pid == 0 ? "CHILD" : "PARENT"); for(i=0; i