X-Git-Url: https://git.artsoft.org/?a=blobdiff_plain;f=src%2Flibgame%2Fsound.c;h=6f48576667caf33254d8960e3338e51b9a55cf9c;hb=1e4d3fd0343fa76d5d1e2803b33bb6faa97403d4;hp=414ab122befa69174fd501a16ec44763f0a41797;hpb=86e110774e5210b326e6867b134bd638d93554d3;p=rocksndiamonds.git diff --git a/src/libgame/sound.c b/src/libgame/sound.c index 414ab122..6f485766 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -1,7 +1,7 @@ /*********************************************************** * Artsoft Retro-Game Library * *----------------------------------------------------------* -* (c) 1994-2001 Artsoft Entertainment * +* (c) 1994-2002 Artsoft Entertainment * * Holger Schemel * * Detmolder Strasse 189 * * 33604 Bielefeld * @@ -11,8 +11,9 @@ * sound.c * ***********************************************************/ -#include +#include #include +#include #include #include #include @@ -65,6 +66,7 @@ #define MUS_TYPE_MOD 2 #define DEVICENAME_DSP "/dev/dsp" +#define DEVICENAME_SOUND_DSP "/dev/sound/dsp" #define DEVICENAME_AUDIO "/dev/audio" #define DEVICENAME_AUDIOCTL "/dev/audioCtl" @@ -233,6 +235,7 @@ static boolean TestAudioDevices(void) static char *audio_device_name[] = { DEVICENAME_DSP, + DEVICENAME_SOUND_DSP, DEVICENAME_AUDIO }; int audio_device_fd = -1; @@ -349,7 +352,7 @@ static void InitAudioDevice_Linux(struct AudioFormatInfo *afmt) if (ioctl(audio.device_fd, SNDCTL_DSP_SETFRAGMENT, &fragment_spec) < 0) Error(ERR_EXIT_SOUND_SERVER, - "cannot set fragment size of /dev/dsp -- no sounds"); + "cannot set fragment size of audio device -- no sounds"); i = 0; afmt->format = 0; @@ -365,7 +368,7 @@ static void InitAudioDevice_Linux(struct AudioFormatInfo *afmt) if (afmt->format == 0) /* no supported audio format found */ Error(ERR_EXIT_SOUND_SERVER, - "cannot set audio format of /dev/dsp -- no sounds"); + "cannot set audio format of audio device -- no sounds"); /* try if we can use stereo sound */ afmt->stereo = TRUE; @@ -374,15 +377,15 @@ static void InitAudioDevice_Linux(struct AudioFormatInfo *afmt) if (ioctl(audio.device_fd, SNDCTL_DSP_SPEED, &afmt->sample_rate) < 0) Error(ERR_EXIT_SOUND_SERVER, - "cannot set sample rate of /dev/dsp -- no sounds"); + "cannot set sample rate of audio device -- no sounds"); /* get the real fragmentation size; this should return 512 */ if (ioctl(audio.device_fd, SNDCTL_DSP_GETBLKSIZE, &fragment_size_query) < 0) Error(ERR_EXIT_SOUND_SERVER, - "cannot get fragment size of /dev/dsp -- no sounds"); + "cannot get fragment size of audio device -- no sounds"); if (fragment_size_query != afmt->fragment_size) Error(ERR_EXIT_SOUND_SERVER, - "cannot set fragment size of /dev/dsp -- no sounds"); + "cannot set fragment size of audio device -- no sounds"); } #endif /* AUDIO_LINUX_IOCTL */ @@ -396,8 +399,8 @@ static void InitAudioDevice_NetBSD(struct AudioFormatInfo *afmt) a_info.play.encoding = AUDIO_ENCODING_LINEAR8; a_info.play.precision = 8; a_info.play.channels = 2; - a_info.play.sample_rate = sample_rate; - a_info.blocksize = fragment_size; + a_info.play.sample_rate = afmt->sample_rate; + a_info.blocksize = afmt->fragment_size; afmt->format = AUDIO_FORMAT_U8; afmt->stereo = TRUE; @@ -411,7 +414,7 @@ static void InitAudioDevice_NetBSD(struct AudioFormatInfo *afmt) if (ioctl(audio.device_fd, AUDIO_SETINFO, &a_info) < 0) Error(ERR_EXIT_SOUND_SERVER, - "cannot set sample rate of /dev/audio -- no sounds"); + "cannot set sample rate of audio device -- no sounds"); } } #endif /* PLATFORM_NETBSD */ @@ -424,7 +427,7 @@ static void InitAudioDevice_HPUX(struct AudioFormatInfo *afmt) audio_ctl = open("/dev/audioCtl", O_WRONLY | O_NDELAY); if (audio_ctl == -1) - Error(ERR_EXIT_SOUND_SERVER, "cannot open /dev/audioCtl -- no sounds"); + Error(ERR_EXIT_SOUND_SERVER, "cannot open audio device -- no sounds"); if (ioctl(audio_ctl, AUDIO_DESCRIBE, &ainfo) == -1) Error(ERR_EXIT_SOUND_SERVER, "no audio info -- no sounds"); @@ -497,6 +500,9 @@ static void WriteReloadInfoToPipe(char *set_name, int type) 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; + boolean override_level_artwork = (type == SND_CTRL_RELOAD_SOUNDS ? + setup.override_level_sounds : + setup.override_level_music); if (IS_CHILD_PROCESS(audio.mixer_pid)) return; @@ -512,6 +518,8 @@ static void WriteReloadInfoToPipe(char *set_name, int type) sizeof(snd_ctrl)) < 0 || write(audio.mixer_pipe[1], set_name, snd_ctrl.data_len) < 0 || + write(audio.mixer_pipe[1], &override_level_artwork, + sizeof(boolean)) < 0 || write(audio.mixer_pipe[1], leveldir_current, sizeof(TreeInfo)) < 0 || write(audio.mixer_pipe[1], ti, @@ -542,6 +550,9 @@ static void ReadReloadInfoFromPipe(SoundControl *snd_ctrl) TreeInfo *ti = *ti_ptr; unsigned long str_size1, str_size2, str_size3; static char *set_name = NULL; + boolean *override_level_artwork = (snd_ctrl->state & SND_CTRL_RELOAD_SOUNDS ? + &setup.override_level_sounds : + &setup.override_level_music); if (set_name) free(set_name); @@ -561,6 +572,8 @@ static void ReadReloadInfoFromPipe(SoundControl *snd_ctrl) if (read(audio.mixer_pipe[0], set_name, snd_ctrl->data_len) != snd_ctrl->data_len || + read(audio.mixer_pipe[0], override_level_artwork, + sizeof(boolean)) != sizeof(boolean) || read(audio.mixer_pipe[0], leveldir_current, sizeof(TreeInfo)) != sizeof(TreeInfo) || read(audio.mixer_pipe[0], ti, @@ -586,9 +599,9 @@ static void ReadReloadInfoFromPipe(SoundControl *snd_ctrl) Error(ERR_EXIT_SOUND_SERVER, "broken pipe -- no sounds"); if (snd_ctrl->state & SND_CTRL_RELOAD_SOUNDS) - artwork.sounds_set_current = set_name; + artwork.sounds_set_current_name = set_name; else - artwork.music_set_current = set_name; + artwork.music_set_current_name = set_name; } #endif /* AUDIO_UNIX_NATIVE */ @@ -792,15 +805,17 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) int i, k; #if 0 - printf("NEW SOUND %d HAS ARRIVED [%d]\n", snd_ctrl.nr, num_sounds); -#endif - -#if 0 - printf("%d ACTIVE CHANNELS\n", mixer_active_channels); + printf("NEW SOUND %d ARRIVED [%d] [%d ACTIVE CHANNELS]\n", + snd_ctrl.nr, num_sounds, mixer_active_channels); #endif if (IS_MUSIC(snd_ctrl)) + { + if (num_music == 0) + return; + snd_ctrl.nr = snd_ctrl.nr % num_music; + } else if (snd_ctrl.nr >= num_sounds) return; @@ -817,10 +832,7 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) /* 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_StopMusicChannel(); mixer[audio.music_channel] = snd_ctrl; Mixer_PlayMusicChannel(); @@ -905,12 +917,36 @@ static void Mixer_InsertSound(SoundControl snd_ctrl) of the channel's sound sample when compiling with the SDL mixer library, we use the current playing time (in milliseconds) instead. */ +#if DEBUG + /* channel allocation sanity check -- should not be needed */ + if (mixer_active_channels == + audio.num_channels - (mixer[audio.music_channel].active ? 0 : 1)) + { + for (i=audio.first_sound_channel; idata_len == 0) { printf("THIS SHOULD NEVER HAPPEN! [snd_info->data_len == 0]\n"); } #endif -#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 mixer[i] = snd_ctrl; Mixer_PlayChannel(i); @@ -1289,7 +1307,7 @@ static int Mixer_Main_SimpleAudio(SoundControl snd_ctrl) mixer[i].volume * (long)premix_first_buffer[j] / SOUND_MAX_VOLUME; /* might be needed for u-law /dev/audio */ -#if 0 +#if 1 for(j=0; j