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