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