1: /*
2: * audio-pcm.c - Scope out the PCM audio stuff
3: */
4: #ifdef HAVE_CONFIG_H
5: # include <config.h>
6: #endif
7:
8: #if defined(HAVE_MACHINE_SOUNDCARD_H) || defined(HAVE_SYS_SOUNDCARD_H)
9:
10: #include "audio.h"
11: #include "ntp_stdlib.h"
12: #include "ntp_syslog.h"
13: #ifdef HAVE_UNISTD_H
14: # include <unistd.h>
15: #endif
16: #include <stdio.h>
17: #include "ntp_string.h"
18:
19: #ifdef HAVE_SYS_IOCTL_H
20: #include <sys/ioctl.h>
21: #endif /* HAVE_SYS_IOCTL_H */
22:
23: #include <fcntl.h>
24:
25: #ifdef HAVE_MACHINE_SOUNDCARD_H
26: # include <machine/soundcard.h>
27: # define PCM_STYLE_SOUND
28: #else
29: # ifdef HAVE_SYS_SOUNDCARD_H
30: # include <sys/soundcard.h>
31: # define PCM_STYLE_SOUND
32: # endif
33: #endif
34:
35: /*
36: * Global variables
37: */
38: static int ctl_fd; /* audio control file descriptor */
39:
40: const char *m_names[SOUND_MIXER_NRDEVICES] = SOUND_DEVICE_NAMES ;
41:
42: void
43: d_fmt(
44: unsigned int format
45: )
46: {
47:
48: if (format & AFMT_MU_LAW) printf("MU_LAW ");
49: if (format & AFMT_A_LAW) printf("A_LAW ");
50: if (format & AFMT_IMA_ADPCM) printf("IMA_ADPCM ");
51: if (format & AFMT_U8) printf("U8 ");
52: if (format & AFMT_S16_LE) printf("S16_LE ");
53: if (format & AFMT_S16_BE) printf("S16_BE ");
54: if (format & AFMT_S8) printf("S8 ");
55: if (format & AFMT_U16_LE) printf("U16_LE ");
56: if (format & AFMT_U16_BE) printf("U16_BE ");
57: if (format & AFMT_MPEG) printf("MPEG ");
58: if (format & AFMT_AC3) printf("AC3 ");
59: printf("\n");
60: }
61:
62: void
63: d_mixer(
64: unsigned int mixer
65: )
66: {
67: int i;
68: int n = 0;
69:
70: for (i = 0; i < SOUND_MIXER_NRDEVICES; ++i)
71: if ((1 << i) & mixer) {
72: if (n)
73: printf(", ");
74: printf("%s", m_names[i]);
75: n = 1;
76: }
77: printf("\n");
78: }
79:
80: int
81: main( )
82: {
83: int unit = 0; /* device unit (0-3) */
84: # define AI_DEV "/dev/audio%d"
85: # define AC_DEV "/dev/mixer%d"
86: char ai_dev[30];
87: char ac_dev[30];
88: struct snd_size s_size;
89: snd_chan_param s_c_p;
90: snd_capabilities s_c;
91: int fd;
92: int rval;
93: char *dname = ai_dev; /* device name */
94: char *actl = ac_dev;
95: int devmask = 0, recmask = 0, recsrc = 0;
96:
97: (void)sprintf(ai_dev, AI_DEV, unit);
98: (void)sprintf(ac_dev, AC_DEV, unit);
99:
100: /*
101: * Open audio device. Do not complain if not there.
102: */
103: fd = open(dname, O_RDWR | O_NONBLOCK, 0777);
104: if (fd < 0)
105: return (fd);
106:
107: /*
108: * Open audio control device.
109: */
110: ctl_fd = open(actl, O_RDWR);
111: if (ctl_fd < 0) {
112: fprintf(stderr, "invalid control device <%s>\n", actl);
113: close(fd);
114: return(ctl_fd);
115: }
116:
117: printf("input: <%s> %d\n", dname, fd);
118: printf("control: <%s> %d\n", actl, ctl_fd);
119:
120: if (ioctl(ctl_fd, SOUND_MIXER_READ_DEVMASK, &devmask) == -1)
121: printf("SOUND_MIXER_READ_DEVMASK: %s\n", strerror(errno));
122: if (ioctl(ctl_fd, SOUND_MIXER_READ_RECMASK, &recmask) == -1)
123: printf("SOUND_MIXER_READ_RECMASK: %s\n", strerror(errno));
124: if (ioctl(ctl_fd, SOUND_MIXER_READ_RECSRC, &recsrc) == -1)
125: printf("SOUND_MIXER_READ_RECSRC: %s\n", strerror(errno));
126:
127: printf("devmask: %#x recmask: %#x recsrc: %#x\n",
128: devmask, recmask, recsrc);
129: printf("Devmask: "); d_mixer(devmask);
130: printf("Recmask: "); d_mixer(recmask);
131: printf("RecSrc: "); d_mixer(recsrc);
132:
133: /*
134: * Set audio device parameters.
135: */
136: rval = fd;
137:
138: if (ioctl(fd, AIOGSIZE, &s_size) == -1)
139: printf("AIOGSIZE: %s\n", strerror(errno));
140: else
141: printf("play_size %d, rec_size %d\n",
142: s_size.play_size, s_size.rec_size);
143:
144: if (ioctl(fd, AIOGFMT, &s_c_p) == -1)
145: printf("AIOGFMT: %s\n", strerror(errno));
146: else {
147: printf("play_rate %lu, rec_rate %lu, play_format %#lx, rec_format %#lx\n",
148: s_c_p.play_rate, s_c_p.rec_rate, s_c_p.play_format, s_c_p.rec_format);
149: printf("Play format: "); d_fmt(s_c_p.play_format);
150: printf("Rec format: "); d_fmt(s_c_p.rec_format);
151: }
152:
153: }
154: #endif /* HAVE_{MACHINE_SOUNDCARD,SYS_SOUNDCARD}_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>