7447d6cbda6f4888fa7a2de118029622ab8b5413
[reactos.git] / reactos / lib / drivers / sound / mmixer / precomp.h
1 #include <wdm.h>
2 #include <windef.h>
3 #define NOBITMAP
4 #include <mmreg.h>
5 #include <ksmedia.h>
6 #include <mmsystem.h>
7
8 #include "mmixer.h"
9
10 typedef struct __TOPOLOGY_NODE__
11 {
12 GUID NodeType;
13 ULONG NodeIndex;
14
15 ULONG NodeConnectedToCount;
16 struct __TOPOLOGY_NODE__ ** NodeConnectedTo;
17
18 ULONG NodeConnectedFromCount;
19 struct __TOPOLOGY_NODE__ ** NodeConnectedFrom;
20 PULONG LogicalPinNodeConnectedFrom;
21
22 ULONG PinConnectedFromCount;
23 PULONG PinConnectedFrom;
24
25 ULONG PinConnectedToCount;
26 PULONG PinConnectedTo;
27
28 ULONG Visited;
29 ULONG Reserved;
30 }TOPOLOGY_NODE, *PTOPOLOGY_NODE;
31
32 typedef struct
33 {
34 ULONG PinId;
35
36 ULONG NodesConnectedToCount;
37 PTOPOLOGY_NODE * NodesConnectedTo;
38
39 ULONG NodesConnectedFromCount;
40 PTOPOLOGY_NODE * NodesConnectedFrom;
41
42 ULONG PinConnectedFromCount;
43 PULONG PinConnectedFrom;
44
45 ULONG PinConnectedToCount;
46 PULONG PinConnectedTo;
47
48 ULONG Visited;
49 ULONG Reserved;
50 }PIN, *PPIN;
51
52
53 typedef struct
54 {
55 ULONG TopologyPinsCount;
56 PPIN TopologyPins;
57
58 ULONG TopologyNodesCount;
59 PTOPOLOGY_NODE TopologyNodes;
60
61 }TOPOLOGY, *PTOPOLOGY;
62
63 typedef struct
64 {
65 LIST_ENTRY Entry;
66 MIXERCAPSW MixCaps;
67 LIST_ENTRY LineList;
68 ULONG ControlId;
69 LIST_ENTRY EventList;
70 }MIXER_INFO, *LPMIXER_INFO;
71
72 typedef struct
73 {
74 LIST_ENTRY Entry;
75 MIXERCONTROLW Control;
76 ULONG NodeID;
77 HANDLE hDevice;
78 PVOID ExtraData;
79 }MIXERCONTROL_EXT, *LPMIXERCONTROL_EXT;
80
81 typedef struct
82 {
83 LIST_ENTRY Entry;
84 ULONG PinId;
85 MIXERLINEW Line;
86 LIST_ENTRY ControlsList;
87
88 }MIXERLINE_EXT, *LPMIXERLINE_EXT;
89
90 typedef struct
91 {
92 LIST_ENTRY Entry;
93 ULONG dwControlID;
94 }MIXERCONTROL_DATA, *LPMIXERCONTROL_DATA;
95
96 typedef struct
97 {
98 MIXERCONTROL_DATA Header;
99 LONG SignedMinimum;
100 LONG SignedMaximum;
101 LONG SteppingDelta;
102 ULONG InputSteppingDelta;
103 ULONG ValuesCount;
104 PLONG Values;
105 }MIXERVOLUME_DATA, *LPMIXERVOLUME_DATA;
106
107 typedef struct
108 {
109 LIST_ENTRY Entry;
110 ULONG DeviceId;
111 HANDLE hDevice;
112 HANDLE hDeviceInterfaceKey;
113 LPWSTR DeviceName;
114 PTOPOLOGY Topology;
115 LPMIXER_INFO MixerInfo;
116 }MIXER_DATA, *LPMIXER_DATA;
117
118 typedef struct
119 {
120 LIST_ENTRY Entry;
121 ULONG DeviceId;
122 ULONG PinId;
123 union
124 {
125 WAVEOUTCAPSW OutCaps;
126 WAVEINCAPSW InCaps;
127 }u;
128 }WAVE_INFO, *LPWAVE_INFO;
129
130 typedef struct
131 {
132 LIST_ENTRY Entry;
133 ULONG DeviceId;
134 ULONG PinId;
135 union
136 {
137 MIDIOUTCAPSW OutCaps;
138 MIDIINCAPSW InCaps;
139 }u;
140
141 }MIDI_INFO, *LPMIDI_INFO;
142
143 typedef struct
144 {
145 ULONG MixerListCount;
146 LIST_ENTRY MixerList;
147
148 ULONG MixerDataCount;
149 LIST_ENTRY MixerData;
150
151 ULONG WaveInListCount;
152 LIST_ENTRY WaveInList;
153
154 ULONG WaveOutListCount;
155 LIST_ENTRY WaveOutList;
156
157 ULONG MidiInListCount;
158 LIST_ENTRY MidiInList;
159
160 ULONG MidiOutListCount;
161 LIST_ENTRY MidiOutList;
162 }MIXER_LIST, *PMIXER_LIST;
163
164 typedef struct
165 {
166 LIST_ENTRY Entry;
167 PVOID MixerEventContext;
168 PMIXER_EVENT MixerEventRoutine;
169
170 }EVENT_NOTIFICATION_ENTRY, *PEVENT_NOTIFICATION_ENTRY;
171
172 #define DESTINATION_LINE (0xFFFF0000)
173 #define SOURCE_LINE (0x10000)
174 ULONG
175 MMixerGetFilterPinCount(
176 IN PMIXER_CONTEXT MixerContext,
177 IN HANDLE hMixer);
178
179 LPGUID
180 MMixerGetNodeType(
181 IN PKSMULTIPLE_ITEM MultipleItem,
182 IN ULONG Index);
183
184 MIXER_STATUS
185 MMixerGetNodeIndexes(
186 IN PMIXER_CONTEXT MixerContext,
187 IN PKSMULTIPLE_ITEM MultipleItem,
188 IN ULONG NodeIndex,
189 IN ULONG bNode,
190 IN ULONG bFrom,
191 OUT PULONG NodeReferenceCount,
192 OUT PULONG *NodeReference);
193
194 PKSTOPOLOGY_CONNECTION
195 MMixerGetConnectionByIndex(
196 IN PKSMULTIPLE_ITEM MultipleItem,
197 IN ULONG Index);
198
199 ULONG
200 MMixerGetControlTypeFromTopologyNode(
201 IN LPGUID NodeType);
202
203 LPMIXERLINE_EXT
204 MMixerGetSourceMixerLineByLineId(
205 LPMIXER_INFO MixerInfo,
206 DWORD dwLineID);
207
208 MIXER_STATUS
209 MMixerGetFilterTopologyProperty(
210 IN PMIXER_CONTEXT MixerContext,
211 IN HANDLE hMixer,
212 IN ULONG PropertyId,
213 OUT PKSMULTIPLE_ITEM * OutMultipleItem);
214
215 VOID
216 MMixerFreeMixerInfo(
217 IN PMIXER_CONTEXT MixerContext,
218 IN LPMIXER_INFO MixerInfo);
219
220 MIXER_STATUS
221 MMixerGetPhysicalConnection(
222 IN PMIXER_CONTEXT MixerContext,
223 IN HANDLE hMixer,
224 IN ULONG PinId,
225 OUT PKSPIN_PHYSICALCONNECTION *OutConnection);
226
227 MIXER_STATUS
228 MMixerSetupFilter(
229 IN PMIXER_CONTEXT MixerContext,
230 IN PMIXER_LIST MixerList,
231 IN LPMIXER_DATA MixerData,
232 IN PULONG DeviceCount);
233
234 PKSPIN_CONNECT
235 MMixerAllocatePinConnect(
236 IN PMIXER_CONTEXT MixerContext,
237 ULONG DataFormatSize);
238
239 MIXER_STATUS
240 MMixerGetAudioPinDataRanges(
241 IN PMIXER_CONTEXT MixerContext,
242 IN HANDLE hDevice,
243 IN ULONG PinId,
244 IN OUT PKSMULTIPLE_ITEM * OutMultipleItem);
245
246 VOID
247 MMixerInitializeMidiForFilter(
248 IN PMIXER_CONTEXT MixerContext,
249 IN PMIXER_LIST MixerList,
250 IN LPMIXER_DATA MixerData,
251 IN PTOPOLOGY Topology);
252
253 MIXER_STATUS
254 MMixerVerifyContext(
255 IN PMIXER_CONTEXT MixerContext);
256
257 LPMIXER_INFO
258 MMixerGetMixerInfoByIndex(
259 IN PMIXER_CONTEXT MixerContext,
260 IN ULONG MixerIndex);
261
262 LPMIXERLINE_EXT
263 MMixerGetSourceMixerLineByComponentType(
264 LPMIXER_INFO MixerInfo,
265 DWORD dwComponentType);
266
267 MIXER_STATUS
268 MMixerGetMixerControlById(
269 LPMIXER_INFO MixerInfo,
270 DWORD dwControlID,
271 LPMIXERLINE_EXT *MixerLine,
272 LPMIXERCONTROL_EXT *MixerControl,
273 PULONG NodeId);
274
275 MIXER_STATUS
276 MMixerSetGetMuteControlDetails(
277 IN PMIXER_CONTEXT MixerContext,
278 IN LPMIXER_INFO MixerInfo,
279 IN LPMIXERCONTROL_EXT MixerControl,
280 IN ULONG dwLineID,
281 IN LPMIXERCONTROLDETAILS MixerControlDetails,
282 IN ULONG bSet);
283
284 MIXER_STATUS
285 MMixerSetGetVolumeControlDetails(
286 IN PMIXER_CONTEXT MixerContext,
287 IN LPMIXER_INFO MixerInfo,
288 IN ULONG NodeId,
289 IN ULONG bSet,
290 LPMIXERCONTROL_EXT MixerControl,
291 IN LPMIXERCONTROLDETAILS MixerControlDetails,
292 LPMIXERLINE_EXT MixerLine);
293
294 MIXER_STATUS
295 MMixerSetGetMuxControlDetails(
296 IN PMIXER_CONTEXT MixerContext,
297 IN LPMIXER_INFO MixerInfo,
298 IN ULONG NodeId,
299 IN ULONG bSet,
300 IN ULONG Flags,
301 LPMIXERCONTROL_EXT MixerControl,
302 IN LPMIXERCONTROLDETAILS MixerControlDetails,
303 LPMIXERLINE_EXT MixerLine);
304
305
306 MIXER_STATUS
307 MMixerSetGetControlDetails(
308 IN PMIXER_CONTEXT MixerContext,
309 IN HANDLE hMixer,
310 IN ULONG NodeId,
311 IN ULONG bSet,
312 IN ULONG PropertyId,
313 IN ULONG Channel,
314 IN PLONG InputValue);
315
316 LPMIXER_DATA
317 MMixerGetDataByDeviceId(
318 IN PMIXER_LIST MixerList,
319 IN ULONG DeviceId);
320
321 LPMIXER_DATA
322 MMixerGetDataByDeviceName(
323 IN PMIXER_LIST MixerList,
324 IN LPWSTR DeviceName);
325
326 MIXER_STATUS
327 MMixerCreateMixerData(
328 IN PMIXER_CONTEXT MixerContext,
329 IN PMIXER_LIST MixerList,
330 IN ULONG DeviceId,
331 IN LPWSTR DeviceName,
332 IN HANDLE hDevice,
333 IN HANDLE hKey);
334
335 MIXER_STATUS
336 MMixerInitializeWaveInfo(
337 IN PMIXER_CONTEXT MixerContext,
338 IN PMIXER_LIST MixerList,
339 IN LPMIXER_DATA MixerData,
340 IN LPWSTR DeviceName,
341 IN ULONG bWaveIn,
342 IN ULONG PinCount,
343 IN PULONG Pins);
344
345 MIXER_STATUS
346 MMixerAddEvent(
347 IN PMIXER_CONTEXT MixerContext,
348 IN OUT LPMIXER_INFO MixerInfo,
349 IN PVOID MixerEvent,
350 IN PMIXER_EVENT MixerEventRoutine);
351
352 MIXER_STATUS
353 MMixerGetDeviceName(
354 IN PMIXER_CONTEXT MixerContext,
355 OUT LPWSTR DeviceName,
356 IN HANDLE hKey);
357
358 VOID
359 MMixerInitializePinConnect(
360 IN OUT PKSPIN_CONNECT PinConnect,
361 IN ULONG PinId);
362
363 MIXER_STATUS
364 MMixerGetPinDataFlowAndCommunication(
365 IN PMIXER_CONTEXT MixerContext,
366 IN HANDLE hDevice,
367 IN ULONG PinId,
368 OUT PKSPIN_DATAFLOW DataFlow,
369 OUT PKSPIN_COMMUNICATION Communication);
370
371 VOID
372 MMixerHandleAlternativeMixers(
373 IN PMIXER_CONTEXT MixerContext,
374 IN PMIXER_LIST MixerList,
375 IN LPMIXER_DATA MixerData,
376 IN PTOPOLOGY Topology);
377
378 MIXER_STATUS
379 MMixerGetMixerByName(
380 IN PMIXER_LIST MixerList,
381 IN LPWSTR MixerName,
382 OUT LPMIXER_INFO *MixerInfo);
383
384 /* topology.c */
385
386 MIXER_STATUS
387 MMixerCreateTopology(
388 IN PMIXER_CONTEXT MixerContext,
389 IN ULONG PinCount,
390 IN PKSMULTIPLE_ITEM NodeConnections,
391 IN PKSMULTIPLE_ITEM NodeTypes,
392 OUT PTOPOLOGY *OutTopology);
393
394 VOID
395 MMixerGetAllUpOrDownstreamPinsFromNodeIndex(
396 IN PMIXER_CONTEXT MixerContext,
397 IN PTOPOLOGY Topology,
398 IN ULONG NodeIndex,
399 IN ULONG bUpStream,
400 OUT PULONG OutPinsCount,
401 OUT PULONG OutPins);
402
403 MIXER_STATUS
404 MMixerGetAllUpOrDownstreamPinsFromPinIndex(
405 IN PMIXER_CONTEXT MixerContext,
406 IN PTOPOLOGY Topology,
407 IN ULONG PinIndex,
408 IN ULONG bUpStream,
409 OUT PULONG OutPinsCount,
410 OUT PULONG OutPins);
411
412 VOID
413 MMixerGetNextNodesFromPinIndex(
414 IN PMIXER_CONTEXT MixerContext,
415 IN PTOPOLOGY Topology,
416 IN ULONG PinIndex,
417 IN ULONG bUpStream,
418 OUT PULONG OutNodesCount,
419 OUT PULONG OutNodes);
420
421 MIXER_STATUS
422 MMixerAllocateTopologyPinArray(
423 IN PMIXER_CONTEXT MixerContext,
424 IN PTOPOLOGY Topology,
425 OUT PULONG * OutPins);
426
427 MIXER_STATUS
428 MMixerAllocateTopologyNodeArray(
429 IN PMIXER_CONTEXT MixerContext,
430 IN PTOPOLOGY Topology,
431 OUT PULONG * OutPins);
432
433 VOID
434 MMixerGetAllUpOrDownstreamNodesFromPinIndex(
435 IN PMIXER_CONTEXT MixerContext,
436 IN PTOPOLOGY Topology,
437 IN ULONG PinIndex,
438 IN ULONG bUpStream,
439 OUT PULONG OutNodesCount,
440 OUT PULONG OutNodes);
441
442 VOID
443 MMixerIsNodeTerminator(
444 IN PTOPOLOGY Topology,
445 IN ULONG NodeIndex,
446 OUT ULONG * bTerminator);
447
448 VOID
449 MMixerGetNextNodesFromNodeIndex(
450 IN PMIXER_CONTEXT MixerContext,
451 IN PTOPOLOGY Topology,
452 IN ULONG NodeIndex,
453 IN ULONG bUpStream,
454 OUT PULONG OutNodesCount,
455 OUT PULONG OutNodes);
456
457 LPGUID
458 MMixerGetNodeTypeFromTopology(
459 IN PTOPOLOGY Topology,
460 IN ULONG NodeIndex);
461
462 MIXER_STATUS
463 MMixerGetAllUpOrDownstreamNodesFromNodeIndex(
464 IN PMIXER_CONTEXT MixerContext,
465 IN PTOPOLOGY Topology,
466 IN ULONG NodeIndex,
467 IN ULONG bUpStream,
468 OUT PULONG OutNodesCount,
469 OUT PULONG OutNodes);
470
471 MIXER_STATUS
472 MMixerIsNodeConnectedToPin(
473 IN PMIXER_CONTEXT MixerContext,
474 IN PTOPOLOGY Topology,
475 IN ULONG NodeIndex,
476 IN ULONG PinId,
477 IN ULONG bUpStream,
478 OUT PULONG bConnected);
479
480 ULONG
481 MMixerGetNodeIndexFromGuid(
482 IN PTOPOLOGY Topology,
483 IN const GUID *NodeType);
484
485 VOID
486 MMixerSetTopologyNodeReserved(
487 IN PTOPOLOGY Topology,
488 IN ULONG NodeIndex);
489
490 VOID
491 MMixerIsTopologyNodeReserved(
492 IN PTOPOLOGY Topology,
493 IN ULONG NodeIndex,
494 OUT PULONG bReserved);
495
496 VOID
497 MMixerSetTopologyPinReserved(
498 IN PTOPOLOGY Topology,
499 IN ULONG PinId);
500
501 VOID
502 MMixerIsTopologyPinReserved(
503 IN PTOPOLOGY Topology,
504 IN ULONG PinId,
505 OUT PULONG bReserved);
506
507 VOID
508 MMixerGetTopologyPinCount(
509 IN PTOPOLOGY Topology,
510 OUT PULONG PinCount);
511
512 VOID
513 MMixerGetConnectedFromLogicalTopologyPins(
514 IN PTOPOLOGY Topology,
515 IN ULONG NodeIndex,
516 OUT PULONG OutPinCount,
517 OUT PULONG OutPins);
518
519 VOID
520 MMixerPrintTopology();