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