You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.7 KiB
67 lines
1.7 KiB
/* mix.c - A very basic mixer.
|
|
*
|
|
* Copyright 2014 Brad Conroy, dedicated to the Public Domain.
|
|
*
|
|
|
|
USE_MIX(NEWTOY(mix, "c:d:l#r#", TOYFLAG_USR|TOYFLAG_BIN))
|
|
|
|
config MIX
|
|
bool "mix"
|
|
default y
|
|
help
|
|
usage: mix [-d DEV] [-c CHANNEL] [-l VOL] [-r RIGHT]
|
|
|
|
List OSS sound channels (module snd-mixer-oss), or set volume(s).
|
|
|
|
-c CHANNEL Set/show volume of CHANNEL (default first channel found)
|
|
-d DEV Device node (default /dev/mixer)
|
|
-l VOL Volume level
|
|
-r RIGHT Volume of right stereo channel (with -r, -l sets left volume)
|
|
*/
|
|
|
|
#define FOR_mix
|
|
#include "toys.h"
|
|
#include <linux/soundcard.h>
|
|
|
|
GLOBALS(
|
|
long r, l;
|
|
char *d, *c;
|
|
)
|
|
|
|
void mix_main(void)
|
|
{
|
|
const char *channels[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES;
|
|
int mask, channel = -1, level, fd;
|
|
|
|
if (!TT.d) TT.d = "/dev/mixer";
|
|
fd = xopen(TT.d, O_RDWR|O_NONBLOCK);
|
|
xioctl(fd, SOUND_MIXER_READ_DEVMASK, &mask);
|
|
|
|
for (channel = 0; channel < SOUND_MIXER_NRDEVICES; channel++) {
|
|
if ((1<<channel) & mask) {
|
|
if (TT.c) {
|
|
if (!strcmp(channels[channel], TT.c)) break;
|
|
} else if (toys.optflags & FLAG_l) break;
|
|
else printf("%s\n", channels[channel]);
|
|
}
|
|
}
|
|
|
|
if (!(toys.optflags & (FLAG_c|FLAG_l))) return;
|
|
else if (channel == SOUND_MIXER_NRDEVICES) error_exit("bad -c '%s'", TT.c);
|
|
|
|
if (!(toys.optflags & FLAG_l)) {
|
|
xioctl(fd, MIXER_READ(channel), &level);
|
|
if (level > 0xFF)
|
|
xprintf("%s:%s = left:%d\t right:%d\n",
|
|
TT.d, channels[channel], level>>8, level & 0xFF);
|
|
else xprintf("%s:%s = %d\n", TT.d, channels[channel], level);
|
|
} else {
|
|
level = TT.l;
|
|
if (!(toys.optflags & FLAG_r)) level = TT.r | (level<<8);
|
|
|
|
xioctl(fd, MIXER_WRITE(channel), &level);
|
|
}
|
|
|
|
if (CFG_TOYBOX_FREE) close(fd);
|
|
}
|