[PSDK]
[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 VOID
363 MMixerInitializePinConnect(
364 IN OUT PKSPIN_CONNECT PinConnect,
365 IN ULONG PinId);
366
367 MIXER_STATUS
368 MMixerGetPinDataFlowAndCommunication(
369 IN PMIXER_CONTEXT MixerContext,
370 IN HANDLE hDevice,
371 IN ULONG PinId,
372 OUT PKSPIN_DATAFLOW DataFlow,
373 OUT PKSPIN_COMMUNICATION Communication);
374
375 VOID
376 MMixerHandleAlternativeMixers(
377 IN PMIXER_CONTEXT MixerContext,
378 IN PMIXER_LIST MixerList,
379 IN LPMIXER_DATA MixerData,
380 IN PTOPOLOGY Topology);
381
382 MIXER_STATUS
383 MMixerGetMixerByName(
384 IN PMIXER_LIST MixerList,
385 IN LPWSTR MixerName,
386 OUT LPMIXER_INFO *MixerInfo);
387
388 /* topology.c */
389
390 MIXER_STATUS
391 MMixerCreateTopology(
392 IN PMIXER_CONTEXT MixerContext,
393 IN ULONG PinCount,
394 IN PKSMULTIPLE_ITEM NodeConnections,
395 IN PKSMULTIPLE_ITEM NodeTypes,
396 OUT PTOPOLOGY *OutTopology);
397
398 VOID
399 MMixerGetAllUpOrDownstreamPinsFromNodeIndex(
400 IN PMIXER_CONTEXT MixerContext,
401 IN PTOPOLOGY Topology,
402 IN ULONG NodeIndex,
403 IN ULONG bUpStream,
404 OUT PULONG OutPinsCount,
405 OUT PULONG OutPins);
406
407 MIXER_STATUS
408 MMixerGetAllUpOrDownstreamPinsFromPinIndex(
409 IN PMIXER_CONTEXT MixerContext,
410 IN PTOPOLOGY Topology,
411 IN ULONG PinIndex,
412 IN ULONG bUpStream,
413 OUT PULONG OutPinsCount,
414 OUT PULONG OutPins);
415
416 VOID
417 MMixerGetNextNodesFromPinIndex(
418 IN PMIXER_CONTEXT MixerContext,
419 IN PTOPOLOGY Topology,
420 IN ULONG PinIndex,
421 IN ULONG bUpStream,
422 OUT PULONG OutNodesCount,
423 OUT PULONG OutNodes);
424
425 MIXER_STATUS
426 MMixerAllocateTopologyPinArray(
427 IN PMIXER_CONTEXT MixerContext,
428 IN PTOPOLOGY Topology,
429 OUT PULONG * OutPins);
430
431 MIXER_STATUS
432 MMixerAllocateTopologyNodeArray(
433 IN PMIXER_CONTEXT MixerContext,
434 IN PTOPOLOGY Topology,
435 OUT PULONG * OutPins);
436
437 VOID
438 MMixerGetAllUpOrDownstreamNodesFromPinIndex(
439 IN PMIXER_CONTEXT MixerContext,
440 IN PTOPOLOGY Topology,
441 IN ULONG PinIndex,
442 IN ULONG bUpStream,
443 OUT PULONG OutNodesCount,
444 OUT PULONG OutNodes);
445
446 VOID
447 MMixerIsNodeTerminator(
448 IN PTOPOLOGY Topology,
449 IN ULONG NodeIndex,
450 OUT ULONG * bTerminator);
451
452 VOID
453 MMixerGetNextNodesFromNodeIndex(
454 IN PMIXER_CONTEXT MixerContext,
455 IN PTOPOLOGY Topology,
456 IN ULONG NodeIndex,
457 IN ULONG bUpStream,
458 OUT PULONG OutNodesCount,
459 OUT PULONG OutNodes);
460
461 LPGUID
462 MMixerGetNodeTypeFromTopology(
463 IN PTOPOLOGY Topology,
464 IN ULONG NodeIndex);
465
466 MIXER_STATUS
467 MMixerGetAllUpOrDownstreamNodesFromNodeIndex(
468 IN PMIXER_CONTEXT MixerContext,
469 IN PTOPOLOGY Topology,
470 IN ULONG NodeIndex,
471 IN ULONG bUpStream,
472 OUT PULONG OutNodesCount,
473 OUT PULONG OutNodes);
474
475 MIXER_STATUS
476 MMixerIsNodeConnectedToPin(
477 IN PMIXER_CONTEXT MixerContext,
478 IN PTOPOLOGY Topology,
479 IN ULONG NodeIndex,
480 IN ULONG PinId,
481 IN ULONG bUpStream,
482 OUT PULONG bConnected);
483
484 ULONG
485 MMixerGetNodeIndexFromGuid(
486 IN PTOPOLOGY Topology,
487 IN const GUID *NodeType);
488
489 VOID
490 MMixerSetTopologyNodeReserved(
491 IN PTOPOLOGY Topology,
492 IN ULONG NodeIndex);
493
494 VOID
495 MMixerIsTopologyNodeReserved(
496 IN PTOPOLOGY Topology,
497 IN ULONG NodeIndex,
498 OUT PULONG bReserved);
499
500 VOID
501 MMixerSetTopologyPinReserved(
502 IN PTOPOLOGY Topology,
503 IN ULONG PinId);
504
505 VOID
506 MMixerIsTopologyPinReserved(
507 IN PTOPOLOGY Topology,
508 IN ULONG PinId,
509 OUT PULONG bReserved);
510
511 VOID
512 MMixerGetTopologyPinCount(
513 IN PTOPOLOGY Topology,
514 OUT PULONG PinCount);
515
516 VOID
517 MMixerGetConnectedFromLogicalTopologyPins(
518 IN PTOPOLOGY Topology,
519 IN ULONG NodeIndex,
520 OUT PULONG OutPinCount,
521 OUT PULONG OutPins);
522
523 VOID
524 MMixerPrintTopology();
525
526 #endif /* _MMIXER_PCH_ */