From: Holger Schemel Date: Fri, 10 May 2002 13:20:03 +0000 (+0200) Subject: rnd-20020510-3-src X-Git-Tag: 2.1.0^2~30 X-Git-Url: https://git.artsoft.org/?p=rocksndiamonds.git;a=commitdiff_plain;h=40bb242e83c3e4df5da57a052d42e1d2c37bf69d rnd-20020510-3-src --- diff --git a/src/libgame/sound.c b/src/libgame/sound.c index 20991570..c876945f 100644 --- a/src/libgame/sound.c +++ b/src/libgame/sound.c @@ -49,24 +49,9 @@ 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 AudioFormatInfo afmt; 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 int playing_sounds = 0; /* forward declaration of internal functions */ static void SoundServer_InsertNewSound(struct SoundControl); @@ -311,6 +296,10 @@ static void PlaylistRemoveSound(int pos) if (!playing_sounds || !playlist[pos].active) return; +#if 0 + printf("REMOVING PLAYLIST SOUND %d\n", pos); +#endif + playlist[pos].active = FALSE; playing_sounds--; } @@ -360,7 +349,7 @@ static void PlaylistInsertSound(struct SoundControl snd_ctrl) /* if playlist is full, remove oldest sound */ if (playing_sounds == audio.num_channels) { - int longest = 0, longest_nr = 0; + int longest = 0, longest_nr = audio.first_sound_channel; for (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; idata_len; snd_ctrl.format = snd_info->format; + snd_ctrl.playingpos = 0; + snd_ctrl.playingtime = 0; + #if 1 if (snd_info->data_len == 0) { @@ -592,10 +584,10 @@ static void SoundServer_Mixer() static short premix_right_buffer[SND_BLOCKSIZE]; static long premix_last_buffer[SND_BLOCKSIZE]; static byte playing_buffer[SND_BLOCKSIZE]; + boolean stereo; + int fragment_size; + int sample_bytes; int max_sample_size; - int fragment_size = afmt.fragment_size; - int sample_bytes = (afmt.format & AUDIO_FORMAT_U8 ? 1 : 2); - boolean stereo = afmt.stereo; int i, j; if (!stereo_volume_calculated) @@ -618,6 +610,9 @@ static void SoundServer_Mixer() InitAudioDevice(&afmt); } + stereo = afmt.stereo; + fragment_size = afmt.fragment_size; + sample_bytes = (afmt.format & AUDIO_FORMAT_U8 ? 1 : 2); max_sample_size = fragment_size / ((stereo ? 2 : 1) * sample_bytes); /* first clear the last premixing buffer */ @@ -948,188 +943,7 @@ static void sound_handler_SDL(struct SoundControl snd_ctrl) #if !defined(PLATFORM_WIN32) static void SoundServer_InsertNewSound(struct SoundControl snd_ctrl) { - SoundInfo *snd_info; - int i, k; - -#if 0 - printf("NEW SOUND %d HAS ARRIVED [%d]\n", snd_ctrl.nr, num_sounds); -#endif - - if (IS_MUSIC(snd_ctrl)) - snd_ctrl.nr = snd_ctrl.nr % num_music; - else if (snd_ctrl.nr >= 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; - } - } + PlaylistInsertSound(snd_ctrl); } #endif /* !PLATFORM_WIN32 */ @@ -1338,6 +1152,11 @@ static void InitAudioDevice_HPUX(struct AudioFormatInfo *afmt) #if defined(PLATFORM_UNIX) static void InitAudioDevice(struct AudioFormatInfo *afmt) { + afmt->stereo = 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) diff --git a/src/libgame/sound.h b/src/libgame/sound.h index 945b88f8..5ad49a92 100644 --- a/src/libgame/sound.h +++ b/src/libgame/sound.h @@ -55,6 +55,7 @@ #define AUDIO_NUM_CHANNELS_MONO 1 #define AUDIO_NUM_CHANNELS_STEREO 2 +#define AUDIO_FORMAT_UNKNOWN (0) #define AUDIO_FORMAT_U8 (1 << 0) #define AUDIO_FORMAT_S16 (1 << 1) #define AUDIO_FORMAT_LE (1 << 2)