static gint oss_input_select_format(Dataformat *format, gboolean silent, GVoidFunc ready_func) { return oss_try_format(format,TRUE,silent); }
static gboolean oss_open (void *dp) { oss_driver * const d = dp; int mf; int i; audio_buf_info info; /* O_NONBLOCK is required for the es1370 driver in Linux 2.2.9, for example. It's open() behaviour is not OSS-conformant (though Thomas Sailer says it's okay). */ if((d->soundfd = open(d->p_devdsp, O_WRONLY | O_NONBLOCK)) < 0) { char buf[256]; g_sprintf(buf, _("Couldn't open %s for sound output:\n%s"), d->p_devdsp, strerror(errno)); error_error(buf); goto out; } // Clear O_NONBLOCK again fcntl(d->soundfd, F_SETFL, 0); d->bits = 0; mf = 0; if(d->p_resolution == 16) { if(oss_try_format(d, AFMT_S16_LE)) { d->bits = 16; mf = ST_MIXER_FORMAT_S16_LE; } else if(oss_try_format(d, AFMT_S16_BE)) { d->bits = 16; mf = ST_MIXER_FORMAT_S16_BE; } else if(oss_try_format(d, AFMT_U16_LE)) { d->bits = 16; mf = ST_MIXER_FORMAT_U16_LE; } else if(oss_try_format(d, AFMT_U16_BE)) { d->bits = 16; mf = ST_MIXER_FORMAT_U16_BE; } } if(d->bits != 16) { if(oss_try_format(d, AFMT_S8)) { d->bits = 8; mf = ST_MIXER_FORMAT_S8; } else if(oss_try_format(d, AFMT_U8)) { d->bits = 8; mf = ST_MIXER_FORMAT_U8; } else { error_error(_("Required sound output format not supported.\n")); goto out; } } if(d->p_channels == 2 && oss_try_stereo(d, 1)) { d->stereo = 1; mf |= ST_MIXER_FORMAT_STEREO; } else if(oss_try_stereo(d, 0)) { d->stereo = 0; } d->mf = mf; d->playrate = d->p_mixfreq; ioctl(d->soundfd, SNDCTL_DSP_SPEED, &d->playrate); i = 0x00020000 + d->p_fragsize + d->stereo + (d->bits / 8 - 1); ioctl(d->soundfd, SNDCTL_DSP_SETFRAGMENT, &i); // Find out how many fragments OSS actually uses and how large they are. ioctl(d->soundfd, SNDCTL_DSP_GETOSPACE, &info); d->fragsize = info.fragsize; d->numfrags = info.fragstotal; ioctl(d->soundfd, SNDCTL_DSP_GETCAPS, &i); d->realtimecaps = i & DSP_CAP_REALTIME; d->sndbuf = calloc(1, d->fragsize); if(d->stereo == 1) { d->fragsize /= 2; } if(d->bits == 16) { d->fragsize /= 2; } d->polltag = audio_poll_add(d->soundfd, GDK_INPUT_WRITE, oss_poll_ready_playing, d); d->firstpoll = TRUE; d->playtime = 0; return TRUE; out: oss_release(dp); return FALSE; }