/* mix.c - A very basic mixer. * * Copyright 2014 Brad Conroy, dedicated to the Public Domain. * USE_MIX(NEWTOY(mix, "m: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] Lists/sets mixer devices/levels. */ #define FOR_mix #include <linux/soundcard.h> #include "toys.h" GLOBALS( int right; int level; char *device; char *mixer; ) 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); xioctl(mixer, 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; } } 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; } level=TT.level; if (!(toys.optflags & FLAG_r)) level = TT.right | (level<<8); xioctl(mixer, MIXER_WRITE(device),&level); close(mixer); }