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