source: trunk/testapp/mixer/test.cpp

Last change on this file was 8497, checked in by sandervl, 23 years ago

added test app for mixer functions (winmm)

File size: 8.8 KB
Line 
1// test.cpp : Defines the entry point for the console application.
2//
3
4#define UNICODE
5#include <windows.h>
6#include <mmsystem.h>
7
8#include <stdio.h>
9
10int mixertypes[] = {
11 MIXERCONTROL_CONTROLTYPE_CUSTOM ,
12 MIXERCONTROL_CONTROLTYPE_BOOLEANMETER ,
13 MIXERCONTROL_CONTROLTYPE_SIGNEDMETER ,
14 MIXERCONTROL_CONTROLTYPE_PEAKMETER ,
15 MIXERCONTROL_CONTROLTYPE_UNSIGNEDMETER ,
16 MIXERCONTROL_CONTROLTYPE_BOOLEAN ,
17 MIXERCONTROL_CONTROLTYPE_ONOFF ,
18 MIXERCONTROL_CONTROLTYPE_MUTE ,
19 MIXERCONTROL_CONTROLTYPE_MONO ,
20 MIXERCONTROL_CONTROLTYPE_LOUDNESS ,
21 MIXERCONTROL_CONTROLTYPE_STEREOENH ,
22 MIXERCONTROL_CONTROLTYPE_BUTTON ,
23 MIXERCONTROL_CONTROLTYPE_DECIBELS ,
24 MIXERCONTROL_CONTROLTYPE_SIGNED ,
25 MIXERCONTROL_CONTROLTYPE_UNSIGNED ,
26 MIXERCONTROL_CONTROLTYPE_PERCENT ,
27 MIXERCONTROL_CONTROLTYPE_SLIDER ,
28 MIXERCONTROL_CONTROLTYPE_PAN ,
29 MIXERCONTROL_CONTROLTYPE_QSOUNDPAN ,
30 MIXERCONTROL_CONTROLTYPE_FADER ,
31 MIXERCONTROL_CONTROLTYPE_VOLUME ,
32 MIXERCONTROL_CONTROLTYPE_BASS ,
33 MIXERCONTROL_CONTROLTYPE_TREBLE ,
34 MIXERCONTROL_CONTROLTYPE_EQUALIZER ,
35 MIXERCONTROL_CONTROLTYPE_SINGLESELECT ,
36 MIXERCONTROL_CONTROLTYPE_MUX ,
37 MIXERCONTROL_CONTROLTYPE_MULTIPLESELECT ,
38 MIXERCONTROL_CONTROLTYPE_MIXER ,
39 MIXERCONTROL_CONTROLTYPE_MICROTIME ,
40 MIXERCONTROL_CONTROLTYPE_MILLITIME
41};
42
43
44int MixGetControls(MIXERLINE &line);
45
46int main(int argc, char* argv[])
47{
48 UINT mixid;
49 MMRESULT ret;
50 int i;
51
52 ret = mixerGetID(0, &mixid, 0x10000000);
53
54 MIXERCAPS caps;
55
56 ret = mixerGetDevCaps(0, &caps, sizeof(caps));
57 printf("Nr of destination %d\n", caps.cDestinations);
58
59 for(i=0;i<caps.cDestinations;i++) {
60 MIXERLINE line = {0};
61 line.cbStruct = sizeof(MIXERLINE);
62 line.dwDestination = i;
63 ret = mixerGetLineInfo(0, &line, MIXER_GETLINEINFOF_DESTINATION);
64 if(ret != MMSYSERR_NOERROR) {
65 printf("mixerGetLineInfo returned error %d\n", ret);
66 return 1;
67 }
68
69 printf("\nDestination %d (%ls) (source %d) connections %d controls %d\n", i, line.szName, line.dwSource, line.cConnections, line.cControls);
70
71 MixGetControls(line);
72 for(int j=0;j<line.cConnections;j++) {
73 MIXERLINE src = {0};
74 src.cbStruct = sizeof(MIXERLINE);
75 src.dwSource = j;
76 src.dwDestination = line.dwDestination;
77 ret = mixerGetLineInfo(0, &src, MIXER_GETLINEINFOF_SOURCE);
78 if(ret != MMSYSERR_NOERROR) {
79 printf("mixerGetLineInfo returned error %d\n", ret);
80 return 1;
81 }
82
83 printf("Source %d (%ls) connections %d controls %d\n", j, src.szName, src.cConnections, src.cControls);
84 MixGetControls(src);
85 }
86 }
87
88 return 0;
89}
90
91int MixGetControls(MIXERLINE &line)
92{
93 MMRESULT ret;
94
95 for(int j=0;j<sizeof(mixertypes)/sizeof(int);j++) {
96 MIXERLINECONTROLS mxlc;
97 MIXERCONTROL mctrl;
98
99 mxlc.cbStruct = sizeof(mxlc);
100 mxlc.pamxctrl = &mctrl;
101 mxlc.dwControlType = mixertypes[j];
102 mxlc.dwLineID = line.dwLineID;
103 mxlc.cControls = 1;
104 mxlc.cbmxctrl = sizeof(MIXERCONTROL);
105
106 mctrl.cbStruct = sizeof(MIXERCONTROL);
107
108 ret = mixerGetLineControls(0, &mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE);
109 if(ret == MMSYSERR_NOERROR) {
110 printf("Control %d (%ls) type %x mitems %d min/max (%d,%d) step %d\n", mctrl.dwControlID, mctrl.szName, mctrl.dwControlType, mctrl.cMultipleItems, mctrl.Bounds.dwMinimum, mctrl.Bounds.dwMaximum, mctrl.Metrics.cSteps);
111 MIXERLINECONTROLS mxlc1;
112 MIXERCONTROL mctrl1;
113
114 mxlc1.cbStruct = sizeof(mxlc);
115 mxlc1.pamxctrl = &mctrl1;
116 mxlc1.dwControlID = mctrl.dwControlID ;
117 mxlc1.dwLineID = line.dwLineID;
118 mxlc1.cControls = 1;
119 mxlc1.cbmxctrl = sizeof(MIXERCONTROL);
120
121 mctrl1.cbStruct = sizeof(MIXERCONTROL);
122
123 ret = mixerGetLineControls(0, &mxlc1, MIXER_GETLINECONTROLSF_ONEBYID);
124 if(ret != MMSYSERR_NOERROR) {
125 printf("mixerGetLineControls returned error %d\n", ret);
126 return 1;
127 }
128
129 switch(mctrl.dwControlType) {
130 case MIXERCONTROL_CONTROLTYPE_VOLUME:
131 {
132 MIXERCONTROLDETAILS mxcd = {0};
133 MIXERCONTROLDETAILS_UNSIGNED val[2] = {0};
134
135 mxcd.cbStruct = sizeof(mxcd);
136 mxcd.cChannels = line.cChannels;
137 mxcd.dwControlID = mctrl.dwControlID;
138 mxcd.paDetails = &val[0];
139 mxcd.cbDetails = sizeof(val);
140 ret = mixerGetControlDetails(0, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
141 if(ret != MMSYSERR_NOERROR) {
142 printf("mixerGetControlDetails returned error %d\n", ret);
143 return 1;
144 }
145 if(line.cChannels == 2) {
146 printf("Volume (%d,%d)\n", val[0].dwValue, val[1].dwValue);
147 }
148 else printf("Volume %d\n", val[0].dwValue);
149
150 break;
151 }
152 case MIXERCONTROL_CONTROLTYPE_MUTE:
153 {
154 MIXERCONTROLDETAILS mxcd = {0};
155 MIXERCONTROLDETAILS_BOOLEAN val;
156
157 mxcd.cbStruct = sizeof(mxcd);
158 mxcd.cChannels = 1;
159 mxcd.dwControlID = mctrl.dwControlID;
160 mxcd.paDetails = &val;
161 mxcd.cbDetails = sizeof(val);
162 ret = mixerGetControlDetails(0, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
163 if(ret != MMSYSERR_NOERROR) {
164 printf("mixerGetControlDetails returned error %d\n", ret);
165 return 1;
166 }
167 printf("Mute %d\n", val.fValue);
168 break;
169 }
170 case MIXERCONTROL_CONTROLTYPE_MUX:
171 {
172 MIXERCONTROLDETAILS mxcd = {0};
173 MIXERCONTROLDETAILS_BOOLEAN val[16];
174
175 mxcd.cbStruct = sizeof(mxcd);
176 mxcd.cChannels = 1;
177 mxcd.dwControlID = mctrl.dwControlID;
178 mxcd.cMultipleItems = line.cConnections;
179 mxcd.paDetails = &val[0];
180 mxcd.cbDetails = sizeof(val[0]);
181 ret = mixerGetControlDetails(0, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
182 if(ret != MMSYSERR_NOERROR) {
183 printf("mixerGetControlDetails returned error %d\n", ret);
184 return 1;
185 }
186 MIXERCONTROLDETAILS_LISTTEXT tval[16] = {0};
187 mxcd.cbDetails = sizeof(tval[0]);
188 mxcd.paDetails = &tval[0];
189 mxcd.cChannels = 1;
190
191 ret = mixerGetControlDetails(0, &mxcd, MIXER_GETCONTROLDETAILSF_LISTTEXT);
192
193 for(int k=0;k<line.cConnections;k++) {
194 printf("Mux %d %d (%ls)\n", k, val[k].fValue, tval[k].szName);
195 }
196 break;
197 }
198 case MIXERCONTROL_CONTROLTYPE_BASS:
199 {
200 MIXERCONTROLDETAILS mxcd = {0};
201 MIXERCONTROLDETAILS_UNSIGNED val;
202
203 mxcd.cbStruct = sizeof(mxcd);
204 mxcd.cChannels = line.cChannels;
205 mxcd.dwControlID = mctrl.dwControlID;
206 mxcd.paDetails = &val;
207 mxcd.cbDetails = sizeof(val);
208 ret = mixerGetControlDetails(0, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
209 if(ret != MMSYSERR_NOERROR) {
210 printf("mixerGetControlDetails returned error %d\n", ret);
211 return 1;
212 }
213 printf("Bass %d\n", val.dwValue);
214 break;
215 }
216 case MIXERCONTROL_CONTROLTYPE_LOUDNESS:
217 {
218 MIXERCONTROLDETAILS mxcd = {0};
219 MIXERCONTROLDETAILS_UNSIGNED val;
220
221 mxcd.cbStruct = sizeof(mxcd);
222 mxcd.cChannels = line.cChannels;
223 mxcd.dwControlID = mctrl.dwControlID;
224 mxcd.paDetails = &val;
225 mxcd.cbDetails = sizeof(val);
226 ret = mixerGetControlDetails(0, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
227 if(ret != MMSYSERR_NOERROR) {
228 printf("mixerGetControlDetails returned error %d\n", ret);
229 return 1;
230 }
231 printf("Loudness %d\n", val.dwValue);
232 break;
233 }
234 case MIXERCONTROL_CONTROLTYPE_TREBLE:
235 {
236 MIXERCONTROLDETAILS mxcd = {0};
237 MIXERCONTROLDETAILS_UNSIGNED val;
238
239 mxcd.cbStruct = sizeof(mxcd);
240 mxcd.cChannels = line.cChannels;
241 mxcd.dwControlID = mctrl.dwControlID;
242 mxcd.paDetails = &val;
243 mxcd.cbDetails = sizeof(val);
244 ret = mixerGetControlDetails(0, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
245 if(ret != MMSYSERR_NOERROR) {
246 printf("mixerGetControlDetails returned error %d\n", ret);
247 return 1;
248 }
249 printf("Treble %d\n", val.dwValue);
250 break;
251 }
252 case MIXERCONTROL_CONTROLTYPE_ONOFF:
253 {
254 MIXERCONTROLDETAILS mxcd = {0};
255 MIXERCONTROLDETAILS_BOOLEAN val;
256
257 mxcd.cbStruct = sizeof(mxcd);
258 mxcd.cChannels = line.cChannels;
259 mxcd.dwControlID = mctrl.dwControlID;
260 mxcd.paDetails = &val;
261 mxcd.cbDetails = sizeof(val);
262 ret = mixerGetControlDetails(0, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
263 if(ret != MMSYSERR_NOERROR) {
264 printf("mixerGetControlDetails returned error %d\n", ret);
265 return 1;
266 }
267 printf("OnOff %d\n", val.fValue);
268 break;
269 }
270 case MIXERCONTROL_CONTROLTYPE_FADER:
271 {
272 MIXERCONTROLDETAILS mxcd = {0};
273 MIXERCONTROLDETAILS_UNSIGNED val;
274
275 mxcd.cbStruct = sizeof(mxcd);
276 mxcd.cChannels = line.cChannels;
277 mxcd.dwControlID = mctrl.dwControlID;
278 mxcd.paDetails = &val;
279 mxcd.cbDetails = sizeof(val);
280 ret = mixerGetControlDetails(0, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE);
281 if(ret != MMSYSERR_NOERROR) {
282 printf("mixerGetControlDetails returned error %d\n", ret);
283 return 1;
284 }
285 printf("Fader %d\n", val.dwValue);
286 break;
287 }
288
289 }
290 }
291 }
292 return 0;
293}
Note: See TracBrowser for help on using the repository browser.