diff options
author | 2008-11-20 08:32:03 +0000 | |
---|---|---|
committer | 2008-11-20 08:32:03 +0000 | |
commit | 53d5f25fadc69731fbd590a0a532c8d1acfa468d (patch) | |
tree | 77beec926b7c46adcc1fe645266d6b35b388b74c | |
parent | Many ALC88x codecs have a fifth DAC at NID 0x25 for 7.1+2 multistreaming. (diff) | |
download | wireguard-openbsd-53d5f25fadc69731fbd590a0a532c8d1acfa468d.tar.xz wireguard-openbsd-53d5f25fadc69731fbd590a0a532c8d1acfa468d.zip |
while setting the block size, try smaller blocks half of the retries and
larger blocks the other half. That's because shrinking the block size may
not be the right direction to go to find a common block size for play and
record.
-rw-r--r-- | lib/libsndio/sun.c | 32 |
1 files changed, 27 insertions, 5 deletions
diff --git a/lib/libsndio/sun.c b/lib/libsndio/sun.c index 7755d46c4ed..079ec9a5391 100644 --- a/lib/libsndio/sun.c +++ b/lib/libsndio/sun.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sun.c,v 1.5 2008/11/11 19:39:35 ratchov Exp $ */ +/* $OpenBSD: sun.c,v 1.6 2008/11/20 08:32:03 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> * @@ -612,6 +612,7 @@ sun_stop(struct sio_hdl *sh) int sun_setpar(struct sio_hdl *sh, struct sio_par *par) { +#define NRETRIES 8 struct sun_hdl *hdl = (struct sun_hdl *)sh; struct audio_info aui; unsigned i, infr, ibpf, onfr, obpf; @@ -665,11 +666,15 @@ sun_setpar(struct sio_hdl *sh, struct sio_par *par) obpf = (hdl->sa.mode & SIO_PLAY) ? aui.play.channels * aui.play.precision / 8 : 1; +#ifdef DEBUG + if (hdl->sa.debug) + fprintf(stderr, "sun_setpar: bpf = (%u, %u)\n", ibpf, obpf); +#endif /* * try to set parameters until the device accepts * a common block size for play and record */ - for (i = 0; i < 5; i++) { + for (i = 0; i < NRETRIES; i++) { AUDIO_INITINFO(&aui); aui.hiwat = (bufsz + round - 1) / round; aui.lowat = aui.hiwat; @@ -689,21 +694,38 @@ sun_setpar(struct sio_hdl *sh, struct sio_par *par) } infr = aui.record.block_size / ibpf; onfr = aui.play.block_size / obpf; +#ifdef DEBUG + if (hdl->sa.debug) { + fprintf(stderr, + "sun_setpar: %i: trying rond = %u -> (%u, %u)\n", + i, round, infr, onfr); + } +#endif /* * if half-duplex or both block sizes match, we're done */ - if (hdl->sa.mode != (SIO_REC | SIO_PLAY) || infr == onfr) + if (hdl->sa.mode != (SIO_REC | SIO_PLAY) || infr == onfr) { +#ifdef DEBUG + if (hdl->sa.debug) + fprintf(stderr, "sun_setpar: blocksize ok\n"); +#endif return 1; + } /* - * retry with the smaller returned value + * half of the retries, retry with the smaller value, + * then with the larger returned value */ - round = infr < onfr ? infr : onfr; + if (i < NRETRIES / 2) + round = infr < onfr ? infr : onfr; + else + round = infr < onfr ? onfr : infr; } fprintf(stderr, "sun_setpar: couldn't find a working blocksize\n"); hdl->sa.eof = 1; return 0; +#undef NRETRIES } int |