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;
}
|