changeset 1627:6c80a3b4e634 draft

Cleanup mix.c.
author Rob Landley <rob@landley.net>
date Sat, 27 Dec 2014 13:52:03 -0600
parents 89384d54d49a
children 59a02a1c9f77
files toys/pending/mix.c
diffstat 1 files changed, 39 insertions(+), 36 deletions(-) [+]
line wrap: on
line diff
--- a/toys/pending/mix.c	Wed Dec 24 16:13:08 2014 -0600
+++ b/toys/pending/mix.c	Sat Dec 27 13:52:03 2014 -0600
@@ -3,62 +3,65 @@
  * Copyright 2014 Brad Conroy, dedicated to the Public Domain.
  *
 
-USE_MIX(NEWTOY(mix, "m:d:l#r#", TOYFLAG_USR|TOYFLAG_BIN))
+USE_MIX(NEWTOY(mix, "c:d:l#r#", TOYFLAG_USR|TOYFLAG_BIN))
+
 config MIX
   bool "mix"
   default n
   help
-   usage: mix [-m mixer] [-d device] [-l level / left level] [-r right level]
+   usage: mix [-m DEV] [-d CHANNEL] [-l VOL] [-r RIGHT]
+
+   List OSS sound channels (module snd-mixer-oss), or set volume(s).
 
-   Lists/sets mixer devices/levels.
+   -d DEV		Device node (default /dev/mixer)
+   -l VOL		Volume level
+   -c CHANNEL	Set/show volume of CHANNEL (default first channel found)
+   -r RIGHT	Volume of right stereo channel (with -r, -l sets left volume)
 */
 
 #define FOR_mix
+#include "toys.h"
 #include <linux/soundcard.h>
-#include "toys.h"
-
 
 GLOBALS(
-   int right;
-   int level;
-   char *device;
-   char *mixer;
+   long right;
+   long level;
+   char *dev;
+   char *chan;
 )
 
 void mix_main(void)
 {
-  const char *devices[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES;
-  char *mixer_name=(toys.optflags & FLAG_m)?TT.mixer:"/dev/mixer";
-  int i, mask, device=-1, level,
-      mixer=xopen(mixer_name, O_RDWR|O_NONBLOCK);
+  const char *channels[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES;
+  int mask, channel = -1, level, fd;
 
-  xioctl(mixer, SOUND_MIXER_READ_DEVMASK,&mask);
+  if (!TT.dev) TT.dev = "/dev/mixer";
+  fd = xopen(TT.dev, O_RDWR|O_NONBLOCK);
+  xioctl(fd, SOUND_MIXER_READ_DEVMASK, &mask);
 
-  if (!(toys.optflags & FLAG_d)){
-    for (i = 0; i < SOUND_MIXER_NRDEVICES; ++i)
-      if (1<<i & mask) printf("%s\n",devices[i]);
-    return;
-  }else{
-    for (i = 0; i < SOUND_MIXER_NRDEVICES; ++i){
-      if ((1<<i & mask) && !strcmp(devices[i], TT.device)){
-        device=i;
-        break;
-      }
+  for (channel = 0; channel < SOUND_MIXER_NRDEVICES; channel++) {
+    if ((1<<channel) & mask) {
+      if (TT.chan && !strcmp(channels[channel], TT.chan)) break;
+      else if (toys.optflags & FLAG_l) break;
+      else printf("%s\n", channels[channel]);
     }
-    if (-1==device) return; //with error
   }
 
-  if (!(toys.optflags & FLAG_l)){
-    xioctl(mixer, MIXER_READ(device),&level);
-    if (0xFF < level) printf("%s:%s = left:%d\t right:%d\n", mixer_name,
-                             devices[device], level>>8, level & 0xFF);
-    else printf("%s:%s = %d\n",mixer_name, devices[device], level);
-    return;
+  if (!(toys.optflags & (FLAG_c|FLAG_l))) return;
+  else if (channel == SOUND_MIXER_NRDEVICES) error_exit("bad -c '%s'", TT.chan);
+
+  if (!(toys.optflags & FLAG_l)) {
+    xioctl(fd, MIXER_READ(channel), &level);
+    if (level > 0xFF)
+      xprintf("%s:%s = left:%d\t right:%d\n",
+              TT.dev, channels[channel], level>>8, level & 0xFF);
+    else xprintf("%s:%s = %d\n", TT.dev, channels[channel], level);
+  } else {
+    level = TT.level;
+    if (!(toys.optflags & FLAG_r)) level = TT.right | (level<<8);
+
+    xioctl(fd, MIXER_WRITE(channel), &level);
   }
 
-  level=TT.level;
-  if (!(toys.optflags & FLAG_r)) level = TT.right | (level<<8);
-
-  xioctl(mixer, MIXER_WRITE(device),&level);
-  close(mixer);
+  if (CFG_TOYBOX_FREE) close(fd);
 }