- while (mixer_active_channels &&
- select(audio.mixer_pipe[0] + 1,
- &mixer_fdset, NULL, NULL, &delay) < 1)
- {
- FD_SET(audio.mixer_pipe[0], &mixer_fdset);
-
- Mixer_Main_DSP();
- }
-
-#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 (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.mixer_pipe[0], &mixer_fdset);
-
- sample_size = Mixer_Main_SimpleAudio(snd_ctrl);
-
- delay.tv_sec = 0;
- delay.tv_usec =
- ((sample_size * 10 * wait_percent) / afmt.sample_rate) * 1000;
- }
-
- CloseAudioDevice(&audio.device_fd);
-
- 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)
-{
- for (i=0; i<audio.num_channels; i++)
- {
- if (!mixer[i].active || mixer[i].loop)
- continue;
-
- mixer[i].playingpos = voice_get_position(mixer[i].voice);
- mixer[i].volume = voice_get_volume(mixer[i].voice);
- if (mixer[i].playingpos == -1 || !mixer[i].volume)
- {
- deallocate_voice(mixer[i].voice);
- Mixer_RemoveSound(i);
- }
- }
-
- HandleSoundRequest(snd_ctrl);
-}
-#endif /* PLATFORM_MSDOS */
-
-
-/* ------------------------------------------------------------------------- */
-/* platform dependant audio initialization code */
-/* ------------------------------------------------------------------------- */
-
-#if defined(AUDIO_LINUX_IOCTL)
-static void InitAudioDevice_Linux(struct AudioFormatInfo *afmt)
-{
- /* "ioctl()" expects pointer to 'int' value for stereo flag
- (boolean is defined as 'char', which will not work here) */
- unsigned int fragment_spec = 0;
- int fragment_size_query;
- int stereo = TRUE;
- struct
- {
- int format_ioctl;
- int format_result;
- }
- formats[] =
- {
- /* supported audio format in preferred order */
- { AFMT_S16_LE, AUDIO_FORMAT_S16 | AUDIO_FORMAT_LE },
- { AFMT_S16_BE, AUDIO_FORMAT_S16 | AUDIO_FORMAT_BE },
- { AFMT_U8, AUDIO_FORMAT_U8 },
- { -1, -1 }
- };
- int i;
-
- /* determine logarithm (log2) of the fragment size */
- while ((1 << fragment_spec) < afmt->fragment_size)
- fragment_spec++;
-
- /* use two fragments (play one fragment, prepare the other);
- one fragment would result in interrupted audio output, more
- than two fragments would raise audio output latency to much */
- fragment_spec |= 0x00020000;
-
- /* Example for fragment specification:
- - 2 buffers / 512 bytes (giving 1/16 second resolution for 8 kHz)
- - (with stereo the effective buffer size will shrink to 256)
- => fragment_size = 0x00020009 */
-
- 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");
-
- i = 0;
- afmt->format = 0;
- while (formats[i].format_result != -1)
- {
- unsigned int audio_format = formats[i].format_ioctl;
- if (ioctl(audio.device_fd, SNDCTL_DSP_SETFMT, &audio_format) == 0)
- {
- afmt->format = formats[i].format_result;
- break;
- }
- }
-
- if (afmt->format == 0) /* no supported audio format found */
- Error(ERR_EXIT_SOUND_SERVER,
- "cannot set audio format of /dev/dsp -- no sounds");
-
- /* try if we can use stereo sound */
- afmt->stereo = TRUE;
- if (ioctl(audio.device_fd, SNDCTL_DSP_STEREO, &stereo) < 0)
- afmt->stereo = FALSE;
-
- 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");
-
- /* 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");
- if (fragment_size_query != afmt->fragment_size)
- Error(ERR_EXIT_SOUND_SERVER,
- "cannot set fragment size of /dev/dsp -- no sounds");
-}
-#endif /* AUDIO_LINUX_IOCTL */
-
-#if defined(PLATFORM_NETBSD)
-static void InitAudioDevice_NetBSD(struct AudioFormatInfo *afmt)
-{
- audio_info_t a_info;
- boolean stereo = TRUE;
-
- AUDIO_INITINFO(&a_info);
- 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;
-
- afmt->format = AUDIO_FORMAT_U8;
- afmt->stereo = TRUE;