Create a branch for audio work
[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
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 ULONG MixerListCount;
134 LIST_ENTRY MixerList;
135 ULONG MixerDataCount;
136 LIST_ENTRY MixerData;
137 ULONG WaveInListCount;
138 LIST_ENTRY WaveInList;
139 ULONG WaveOutListCount;
140 LIST_ENTRY WaveOutList;
141 }MIXER_LIST, *PMIXER_LIST;
142
143 typedef struct
144 {
145 LIST_ENTRY Entry;
146 PVOID MixerEventContext;
147 PMIXER_EVENT MixerEventRoutine;
148
149 }EVENT_NOTIFICATION_ENTRY, *PEVENT_NOTIFICATION_ENTRY;
150
151 #define DESTINATION_LINE 0xFFFF0000
152
153 ULONG
154 MMixerGetFilterPinCount(
155 IN PMIXER_CONTEXT MixerContext,
156 IN HANDLE hMixer);
157
158 LPGUID
159 MMixerGetNodeType(
160 IN PKSMULTIPLE_ITEM MultipleItem,
161 IN ULONG Index);
162
163 MIXER_STATUS
164 MMixerGetNodeIndexes(
165 IN PMIXER_CONTEXT MixerContext,
166 IN PKSMULTIPLE_ITEM MultipleItem,
167 IN ULONG NodeIndex,
168 IN ULONG bNode,
169 IN ULONG bFrom,
170 OUT PULONG NodeReferenceCount,
171 OUT PULONG *NodeReference);
172
173 PKSTOPOLOGY_CONNECTION
174 MMixerGetConnectionByIndex(
175 IN PKSMULTIPLE_ITEM MultipleItem,
176 IN ULONG Index);
177
178 ULONG
179 MMixerGetControlTypeFromTopologyNode(
180 IN LPGUID NodeType);
181
182 LPMIXERLINE_EXT
183 MMixerGetSourceMixerLineByLineId(
184 LPMIXER_INFO MixerInfo,
185 DWORD dwLineID);
186
187 MIXER_STATUS
188 MMixerGetFilterTopologyProperty(
189 IN PMIXER_CONTEXT MixerContext,
190 IN HANDLE hMixer,
191 IN ULONG PropertyId,
192 OUT PKSMULTIPLE_ITEM * OutMultipleItem);
193
194 VOID
195 MMixerFreeMixerInfo(
196 IN PMIXER_CONTEXT MixerContext,
197 IN LPMIXER_INFO MixerInfo);
198
199 MIXER_STATUS
200 MMixerGetTargetPins(
201 IN PMIXER_CONTEXT MixerContext,
202 IN PKSMULTIPLE_ITEM NodeTypes,
203 IN PKSMULTIPLE_ITEM NodeConnections,
204 IN ULONG NodeIndex,
205 IN ULONG bUpDirection,
206 OUT PULONG Pins,
207 IN ULONG PinCount);
208
209 MIXER_STATUS
210 MMixerGetPhysicalConnection(
211 IN PMIXER_CONTEXT MixerContext,
212 IN HANDLE hMixer,
213 IN ULONG PinId,
214 OUT PKSPIN_PHYSICALCONNECTION *OutConnection);
215
216 ULONG
217 MMixerGetIndexOfGuid(
218 PKSMULTIPLE_ITEM MultipleItem,
219 LPCGUID NodeType);
220
221 MIXER_STATUS
222 MMixerSetupFilter(
223 IN PMIXER_CONTEXT MixerContext,
224 IN PMIXER_LIST MixerList,
225 IN LPMIXER_DATA MixerData,
226 IN PULONG DeviceCount);
227
228 MIXER_STATUS
229 MMixerGetTargetPinsByNodeConnectionIndex(
230 IN PMIXER_CONTEXT MixerContext,
231 IN PKSMULTIPLE_ITEM NodeConnections,
232 IN PKSMULTIPLE_ITEM NodeTypes,
233 IN ULONG bUpDirection,
234 IN ULONG NodeConnectionIndex,
235 IN ULONG PinCount,
236 OUT PULONG Pins);
237
238 MIXER_STATUS
239 MMixerGetControlsFromPin(
240 IN PMIXER_CONTEXT MixerContext,
241 IN PKSMULTIPLE_ITEM NodeConnections,
242 IN PKSMULTIPLE_ITEM NodeTypes,
243 IN ULONG PinId,
244 IN ULONG bUpDirection,
245 OUT PULONG Nodes);
246
247 MIXER_STATUS
248 MMixerVerifyContext(
249 IN PMIXER_CONTEXT MixerContext);
250
251 LPMIXER_INFO
252 MMixerGetMixerInfoByIndex(
253 IN PMIXER_CONTEXT MixerContext,
254 IN ULONG MixerIndex);
255
256 LPMIXERLINE_EXT
257 MMixerGetSourceMixerLineByComponentType(
258 LPMIXER_INFO MixerInfo,
259 DWORD dwComponentType);
260
261 MIXER_STATUS
262 MMixerGetMixerControlById(
263 LPMIXER_INFO MixerInfo,
264 DWORD dwControlID,
265 LPMIXERLINE_EXT *MixerLine,
266 LPMIXERCONTROLW *MixerControl,
267 PULONG NodeId);
268
269 MIXER_STATUS
270 MMixerSetGetMuteControlDetails(
271 IN PMIXER_CONTEXT MixerContext,
272 IN LPMIXER_INFO MixerInfo,
273 IN ULONG NodeId,
274 IN ULONG dwLineID,
275 IN LPMIXERCONTROLDETAILS MixerControlDetails,
276 IN ULONG bSet);
277
278 MIXER_STATUS
279 MMixerSetGetVolumeControlDetails(
280 IN PMIXER_CONTEXT MixerContext,
281 IN LPMIXER_INFO MixerInfo,
282 IN ULONG NodeId,
283 IN ULONG bSet,
284 LPMIXERCONTROLW MixerControl,
285 IN LPMIXERCONTROLDETAILS MixerControlDetails,
286 LPMIXERLINE_EXT MixerLine);
287
288 MIXER_STATUS
289 MMixerSetGetControlDetails(
290 IN PMIXER_CONTEXT MixerContext,
291 IN HANDLE hMixer,
292 IN ULONG NodeId,
293 IN ULONG bSet,
294 IN ULONG PropertyId,
295 IN ULONG Channel,
296 IN PLONG InputValue);
297
298 LPMIXER_DATA
299 MMixerGetDataByDeviceId(
300 IN PMIXER_LIST MixerList,
301 IN ULONG DeviceId);
302
303 LPMIXER_DATA
304 MMixerGetDataByDeviceName(
305 IN PMIXER_LIST MixerList,
306 IN LPWSTR DeviceName);
307
308 MIXER_STATUS
309 MMixerCreateMixerData(
310 IN PMIXER_CONTEXT MixerContext,
311 IN PMIXER_LIST MixerList,
312 IN ULONG DeviceId,
313 IN LPWSTR DeviceName,
314 IN HANDLE hDevice,
315 IN HANDLE hKey);
316
317 MIXER_STATUS
318 MMixerGetDeviceName(
319 IN PMIXER_CONTEXT MixerContext,
320 IN LPMIXER_INFO MixerInfo,
321 IN HANDLE hKey);
322
323 MIXER_STATUS
324 MMixerInitializeWaveInfo(
325 IN PMIXER_CONTEXT MixerContext,
326 IN PMIXER_LIST MixerList,
327 IN LPMIXER_DATA MixerData,
328 IN LPWSTR DeviceName,
329 IN ULONG bWaveIn,
330 IN ULONG PinCount,
331 IN PULONG Pins);
332
333 MIXER_STATUS
334 MMixerAddEvent(
335 IN PMIXER_CONTEXT MixerContext,
336 IN OUT LPMIXER_INFO MixerInfo,
337 IN PVOID MixerEvent,
338 IN PMIXER_EVENT MixerEventRoutine);
339
340 /* topology.c */
341
342 MIXER_STATUS
343 MMixerCreateTopology(
344 IN PMIXER_CONTEXT MixerContext,
345 IN ULONG PinCount,
346 IN PKSMULTIPLE_ITEM NodeConnections,
347 IN PKSMULTIPLE_ITEM NodeTypes,
348 OUT PTOPOLOGY *OutTopology);
349
350 VOID
351 MMixerGetAllUpOrDownstreamPinsFromNodeIndex(
352 IN PMIXER_CONTEXT MixerContext,
353 IN PTOPOLOGY Topology,
354 IN ULONG NodeIndex,
355 IN ULONG bUpStream,
356 OUT PULONG OutPinsCount,
357 OUT PULONG OutPins);
358
359 MIXER_STATUS
360 MMixerGetAllUpOrDownstreamPinsFromPinIndex(
361 IN PMIXER_CONTEXT MixerContext,
362 IN PTOPOLOGY Topology,
363 IN ULONG PinIndex,
364 IN ULONG bUpStream,
365 OUT PULONG OutPinsCount,
366 OUT PULONG OutPins);
367
368 VOID
369 MMixerGetNextNodesFromPinIndex(
370 IN PMIXER_CONTEXT MixerContext,
371 IN PTOPOLOGY Topology,
372 IN ULONG PinIndex,
373 IN ULONG bUpStream,
374 OUT PULONG OutNodesCount,
375 OUT PULONG OutNodes);
376
377 MIXER_STATUS
378 MMixerAllocateTopologyPinArray(
379 IN PMIXER_CONTEXT MixerContext,
380 IN PTOPOLOGY Topology,
381 OUT PULONG * OutPins);
382
383 MIXER_STATUS
384 MMixerAllocateTopologyNodeArray(
385 IN PMIXER_CONTEXT MixerContext,
386 IN PTOPOLOGY Topology,
387 OUT PULONG * OutPins);
388
389 VOID
390 MMixerGetAllUpOrDownstreamNodesFromPinIndex(
391 IN PMIXER_CONTEXT MixerContext,
392 IN PTOPOLOGY Topology,
393 IN ULONG PinIndex,
394 IN ULONG bUpStream,
395 OUT PULONG OutNodesCount,
396 OUT PULONG OutNodes);
397
398 VOID
399 MMixerIsNodeTerminator(
400 IN PTOPOLOGY Topology,
401 IN ULONG NodeIndex,
402 OUT ULONG * bTerminator);
403
404 VOID
405 MMixerGetNextNodesFromNodeIndex(
406 IN PMIXER_CONTEXT MixerContext,
407 IN PTOPOLOGY Topology,
408 IN ULONG NodeIndex,
409 IN ULONG bUpStream,
410 OUT PULONG OutNodesCount,
411 OUT PULONG OutNodes);
412
413 LPGUID
414 MMixerGetNodeTypeFromTopology(
415 IN PTOPOLOGY Topology,
416 IN ULONG NodeIndex);
417
418 MIXER_STATUS
419 MMixerGetAllUpOrDownstreamNodesFromNodeIndex(
420 IN PMIXER_CONTEXT MixerContext,
421 IN PTOPOLOGY Topology,
422 IN ULONG NodeIndex,
423 IN ULONG bUpStream,
424 OUT PULONG OutNodesCount,
425 OUT PULONG OutNodes);
426
427 MIXER_STATUS
428 MMixerIsNodeConnectedToPin(
429 IN PMIXER_CONTEXT MixerContext,
430 IN PTOPOLOGY Topology,
431 IN ULONG NodeIndex,
432 IN ULONG PinId,
433 IN ULONG bUpStream,
434 OUT PULONG bConnected);
435
436 ULONG
437 MMixerGetNodeIndexFromGuid(
438 IN PTOPOLOGY Topology,
439 IN const GUID *NodeType);
440
441 VOID
442 MMixerSetTopologyNodeReserved(
443 IN PTOPOLOGY Topology,
444 IN ULONG NodeIndex);
445
446 VOID
447 MMixerIsTopologyNodeReserved(
448 IN PTOPOLOGY Topology,
449 IN ULONG NodeIndex,
450 OUT PULONG bReserved);