The following attributes are always the same for play
and record directions (this is a kernel constraint):
  - sample rate
  - encoding (including precision, msb and bps)
  - block size (in frames per block, not bytes)
  - pause
  - active

The diff below makes audioctl display a single attribute (which
makes the output shorter and nicer).  We don't maintain backward
compatibility of field names as this is mostly a developper tool.
As we're at it drop unused/duplicate fields.

OK?

Index: audioctl.c
===================================================================
RCS file: /cvs/src/usr.bin/audioctl/audioctl.c,v
retrieving revision 1.29
diff -u -p -u -p -r1.29 audioctl.c
--- audioctl.c  28 Jul 2015 20:51:10 -0000      1.29
+++ audioctl.c  21 Jan 2016 07:48:13 -0000
@@ -63,6 +63,8 @@ int properties, fullduplex;
 
 struct audio_pos getpos;
 
+unsigned int block_size;
+
 struct field {
        const char *name;
        void *valp;
@@ -85,30 +87,19 @@ struct field {
        { "encodings",          encbuf,                 STRING, READONLY },
        { "properties",         &properties,            PROPS,  READONLY },
        { "hiwat",              &info.hiwat,            UINT,   0 },
-       { "lowat",              &info.lowat,            UINT,   0 },
        { "mode",               &info.mode,             P_R,    READONLY },
-       { "play.rate",          &info.play.sample_rate, UINT,   0 },
-       { "play.sample_rate",   &info.play.sample_rate, UINT,   ALIAS },
+       { "rate",               &info.play.sample_rate, UINT,   0 },
+       { "precision",          &info.play.precision,   UINT,   0 },
+       { "bps",                &info.play.bps,         UINT,   0 },
+       { "msb",                &info.play.msb,         UINT,   0 },
+       { "encoding",           &info.play.encoding,    ENC,    0 },
+       { "pause",              &info.play.pause,       UCHAR,  0 },
+       { "active",             &info.play.active,      UCHAR,  READONLY },
+       { "block_size",         &block_size,            UINT,   0 },
        { "play.channels",      &info.play.channels,    UINT,   0 },
-       { "play.precision",     &info.play.precision,   UINT,   0 },
-       { "play.bps",           &info.play.bps,         UINT,   0 },
-       { "play.msb",           &info.play.msb,         UINT,   0 },
-       { "play.encoding",      &info.play.encoding,    ENC,    0 },
-       { "play.pause",         &info.play.pause,       UCHAR,  0 },
-       { "play.active",        &info.play.active,      UCHAR,  READONLY },
-       { "play.block_size",    &info.play.block_size,  UINT,   0 },
        { "play.bytes",         &getpos.play_pos,       UINT,   READONLY },
        { "play.errors",        &getpos.play_xrun,      UINT,   READONLY },
-       { "record.rate",        &info.record.sample_rate,UINT,  0 },
-       { "record.sample_rate", &info.record.sample_rate,UINT,  ALIAS },
        { "record.channels",    &info.record.channels,  UINT,   0 },
-       { "record.precision",   &info.record.precision, UINT,   0 },
-       { "record.bps",         &info.record.bps,       UINT,   0 },
-       { "record.msb",         &info.record.msb,       UINT,   0 },
-       { "record.encoding",    &info.record.encoding,  ENC,    0 },
-       { "record.pause",       &info.record.pause,     UCHAR,  0 },
-       { "record.active",      &info.record.active,    UCHAR,  READONLY },
-       { "record.block_size",  &info.record.block_size,UINT,   0 },
        { "record.bytes",       &getpos.rec_pos,        UINT,   READONLY },
        { "record.errors",      &getpos.rec_xrun,       UINT,   READONLY },
        { 0 }
@@ -303,6 +294,8 @@ getinfo(int fd)
                err(1, "AUDIO_GETINFO");
        if (ioctl(fd, AUDIO_GETPOS, &getpos) < 0)
                err(1, "AUDIO_GETPOS");
+       block_size = info.play.block_size /
+           (info.play.channels * info.play.bps);
 }
 
 void
@@ -419,8 +412,19 @@ main(int argc, char **argv)
                        }
                        argv++;
                }
-               if (writeinfo && ioctl(fd, AUDIO_SETINFO, &info) < 0)
-                       err(1, "set failed");
+               if (writeinfo) {
+                       info.record.sample_rate = info.play.sample_rate;
+                       info.record.encoding = info.play.encoding;
+                       info.record.precision = info.play.precision;
+                       info.record.bps = info.play.bps;
+                       info.record.msb = info.play.msb;
+                       info.record.block_size = block_size *
+                               info.record.bps * info.record.channels;
+                       info.play.block_size = block_size *
+                               info.play.bps * info.play.channels;
+                       if (ioctl(fd, AUDIO_SETINFO, &info) < 0)
+                               err(1, "set failed");
+               }
                getinfo(fd);
                for (i = 0; fields[i].name; i++) {
                        if (fields[i].flags & SET) {

Reply via email to