diff options
-rw-r--r-- | usr.bin/aucat/conf.h | 4 | ||||
-rw-r--r-- | usr.bin/aucat/dev_sun.c | 33 |
2 files changed, 14 insertions, 23 deletions
diff --git a/usr.bin/aucat/conf.h b/usr.bin/aucat/conf.h index ac5779d815e..0246e6f81a7 100644 --- a/usr.bin/aucat/conf.h +++ b/usr.bin/aucat/conf.h @@ -1,4 +1,4 @@ -/* $OpenBSD: conf.h,v 1.1 2008/05/23 07:15:46 ratchov Exp $ */ +/* $OpenBSD: conf.h,v 1.2 2008/05/28 07:36:23 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> * @@ -48,7 +48,7 @@ extern int debug_level; #define MIDI_TO_ADATA(m) ((ADATA_UNIT * (m) + 64) / 127) #define DEFAULT_NFR 0x400 /* buf size in frames */ -#define DEFAULT_NBLK 0x8 /* blocks per buffer */ +#define DEFAULT_NBLK 0x2 /* blocks per buffer */ #define DEFAULT_DEVICE "/dev/audio" /* defaul device */ #endif /* !defined(CONF_H) */ diff --git a/usr.bin/aucat/dev_sun.c b/usr.bin/aucat/dev_sun.c index 47abc6f06af..951a8a484f0 100644 --- a/usr.bin/aucat/dev_sun.c +++ b/usr.bin/aucat/dev_sun.c @@ -1,4 +1,4 @@ -/* $OpenBSD: dev_sun.c,v 1.1 2008/05/23 07:15:46 ratchov Exp $ */ +/* $OpenBSD: dev_sun.c,v 1.2 2008/05/28 07:36:23 ratchov Exp $ */ /* * Copyright (c) 2008 Alexandre Ratchov <alex@caoua.org> * @@ -108,6 +108,7 @@ dev_init(char *path, struct aparams *ipar, struct aparams *opar, int fd; int fullduplex; struct audio_info aui; + struct audio_bufinfo aubi; if (!ipar && !opar) errx(1, "%s: must at least play or record", path); @@ -140,7 +141,6 @@ dev_init(char *path, struct aparams *ipar, struct aparams *opar, */ AUDIO_INITINFO(&aui); aui.mode = 0; - aui.lowat = UINT_MAX / 2; /* will set lowat = hiwat - 1 */ if (opar) { sun_partoinfo(&aui.play, opar); aui.play.pause = 1; @@ -170,30 +170,16 @@ dev_init(char *path, struct aparams *ipar, struct aparams *opar, return -1; } if (opar) { - /* - * We _must_ ensure that write() will accept at most - * one block when it unblocks. Here is our definition - * of the block size: the minimum amount of data - * write() accepts immediately when it unblocks. If - * write() accepts more that 1 block, then this means - * that we failed to provide the first block early - * enough thus underrun happened. - * - * If we fail to ensure that lowat = hiwat - 1, then - * we will trigger the underrun detection mechanism. - * Recording doesn't use the water mark non-sense. - */ - if (aui.lowat != aui.hiwat - 1) { - warnx("%s: failed to disable lowat: hiwat = %u, " - "lowat = %u", path, aui.hiwat, aui.lowat); + if (!sun_infotopar(&aui.play, opar)) { close(fd); return -1; } - if (!sun_infotopar(&aui.play, opar)) { + if (ioctl(fd, AUDIO_GETPRINFO, &aubi) < 0) { + warn("%s: AUDIO_GETPRINFO", path); close(fd); return -1; } - *onfr = aui.play.block_size / + *onfr = aubi.blksize * aubi.hiwat / (aui.play.channels * aui.play.precision / 8); } if (ipar) { @@ -201,7 +187,12 @@ dev_init(char *path, struct aparams *ipar, struct aparams *opar, close(fd); return -1; } - *infr = aui.record.block_size / + if (ioctl(fd, AUDIO_GETRRINFO, &aubi) < 0) { + warn("%s: AUDIO_GETRRINFO", path); + close(fd); + return -1; + } + *infr = aubi.blksize * aubi.hiwat / (aui.record.channels * aui.record.precision / 8); } return fd; |