blob: 4a51fb9eddddb6758156b1e554188ba3ef8ce4a2 [file] [log] [blame]
/* 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);
}