aboutsummaryrefslogtreecommitdiffstats
path: root/mix.c
blob: cb9b1df8dbfb2310228b4bdb85b68acc7469f6e2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*
 * dump current mixer settings
 *
 *   (c) 1998 Gerd Knorr <kraxel@goldbach.in-berlin.de>
 *
 */
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <sys/soundcard.h>

char *labels[] = SOUND_DEVICE_LABELS;
char *names[]  = SOUND_DEVICE_NAMES;

int
dump_mixer(char *devname)
{
    struct mixer_info info;
    int               mix,i,devmask,recmask,recsrc,stereomask,volume;

    if (-1 == (mix = open(devname,O_RDONLY)))
	return -1;

    printf("%s",devname);
    if (-1 != ioctl(mix,SOUND_MIXER_INFO,&info))
	printf(" = %s (%s)",info.id,info.name);
    printf("\n");

    if (-1 == ioctl(mix,MIXER_READ(SOUND_MIXER_DEVMASK),&devmask) ||
	-1 == ioctl(mix,MIXER_READ(SOUND_MIXER_STEREODEVS),&stereomask) ||
	-1 == ioctl(mix,MIXER_READ(SOUND_MIXER_RECMASK),&recmask) ||
	-1 == ioctl(mix,MIXER_READ(SOUND_MIXER_RECSRC),&recsrc)) {
	perror("mixer ioctl");
	return -1;
    }

    for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
	if ((1<<i) & devmask) {
	    if (-1 == ioctl(mix,MIXER_READ(i),&volume)) {
		perror("mixer read volume");
		return -1;
	    }
	    printf("  %-10s (%2d) :  %s  %s%s",
		   names[i],i,
		   (1<<i) & stereomask ? "stereo" : "mono  ",
		   (1<<i) & recmask    ? "rec"    : "   ",
		   (1<<i) & recsrc     ? "*"      : " ");
	    if ((1<<i) & stereomask)
		printf("  %d/%d\n",volume & 0xff,(volume >> 8) & 0xff);
	    else
		printf("  %d\n",volume & 0xff);
	}
    }
    return 0;
}

int
main(int argc, char *argv[])
{
    char devname[32];
    int i;

    /* first mixer device.  If "mixer0" does'nt work, try "mixer" */
    if (-1 == dump_mixer("/dev/mixer0"))
	dump_mixer("/dev/mixer");
    /* other more devices */
    for (i = 1; i < 8; i++) {
	sprintf(devname,"/dev/mixer%d",i);
	dump_mixer(devname);
    }
    return 0;
}