0c0326ca21c8777f3cd99720df8df691ec854a80
[reactos.git] / reactos / drivers / wdm / audio / drivers / CMIDriver / minwavetables.hpp
1 /*
2 Copyright (c) 2006-2007 dogbert <dogber1@gmail.com>
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions
7 are met:
8 1. Redistributions of source code must retain the above copyright
9 notice, this list of conditions and the following disclaimer.
10 2. Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
13 3. The name of the author may not be used to endorse or promote products
14 derived from this software without specific prior written permission.
15
16 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28 #ifndef _MINWAVETABLES_HPP_
29 #define _MINWAVETABLES_HPP_
30
31 #define STATIC_KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF\
32 DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_DOLBY_AC3_SPDIF)
33 DEFINE_GUIDSTRUCT("00000092-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF);
34 #define KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF)
35
36 NTSTATUS NTAPI PropertyHandler_ChannelConfig(PPCPROPERTY_REQUEST PropertyRequest);
37
38
39 static KSDATARANGE_AUDIO WavePinDataRangesPCMStream[] =
40 {
41 {
42 {
43 sizeof(KSDATARANGE_AUDIO),
44 0,
45 0,
46 0,
47 STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
48 STATICGUIDOF(KSDATAFORMAT_SUBTYPE_PCM),
49 STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
50 },
51 MAX_CHANNELS_PCM,
52 MIN_BITS_PER_SAMPLE_PCM,
53 MAX_BITS_PER_SAMPLE_PCM,
54 MIN_SAMPLE_RATE,
55 MAX_SAMPLE_RATE
56 }
57 };
58
59 static KSDATARANGE_AUDIO WavePinDataRangesAC3Stream[] =
60 {
61 {
62 {
63 sizeof(KSDATARANGE_AUDIO),
64 0,
65 0,
66 0,
67 STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
68 STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF),
69 STATICGUIDOF(KSDATAFORMAT_SPECIFIER_WAVEFORMATEX)
70 },
71 MAX_CHANNELS_AC3,
72 MIN_BITS_PER_SAMPLE_AC3,
73 MAX_BITS_PER_SAMPLE_AC3,
74 MIN_SAMPLE_RATE_AC3,
75 MAX_SAMPLE_RATE_AC3
76 },
77 {
78 {
79 sizeof(KSDATARANGE_AUDIO),
80 0,
81 0,
82 0,
83 STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
84 STATICGUIDOF(KSDATAFORMAT_SUBTYPE_DOLBY_AC3_SPDIF),
85 STATICGUIDOF(KSDATAFORMAT_SPECIFIER_DSOUND)
86 },
87 MAX_CHANNELS_AC3,
88 MIN_BITS_PER_SAMPLE_AC3,
89 MAX_BITS_PER_SAMPLE_AC3,
90 MIN_SAMPLE_RATE_AC3,
91 MAX_SAMPLE_RATE_AC3
92 }
93 };
94
95 static PKSDATARANGE WavePinDataRangePointersPCMStream[] =
96 {
97 PKSDATARANGE(&WavePinDataRangesPCMStream[0])
98 };
99
100 static PKSDATARANGE WavePinDataRangePointersAC3Stream[] =
101 {
102 PKSDATARANGE(&WavePinDataRangesAC3Stream[0]),
103 PKSDATARANGE(&WavePinDataRangesAC3Stream[1]),
104 };
105
106
107
108 static KSDATARANGE WavePinDataRangesPCMBridge[] =
109 {
110 {
111 sizeof(KSDATARANGE),
112 0,
113 0,
114 0,
115 STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
116 STATICGUIDOF(KSDATAFORMAT_SUBTYPE_ANALOG),
117 STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
118 }
119 };
120
121 static KSDATARANGE WavePinDataRangesAC3Bridge[] =
122 {
123 {
124 sizeof(KSDATARANGE),
125 0,
126 0,
127 0,
128 STATICGUIDOF(KSDATAFORMAT_TYPE_AUDIO),
129 STATICGUIDOF(KSDATAFORMAT_SUBTYPE_AC3_AUDIO),
130 STATICGUIDOF(KSDATAFORMAT_SPECIFIER_NONE)
131 }
132 };
133
134 static PKSDATARANGE WavePinDataRangePointersPCMBridge[] =
135 {
136 &WavePinDataRangesPCMBridge[0]
137 };
138
139 static PKSDATARANGE WavePinDataRangePointersAC3Bridge[] =
140 {
141 &WavePinDataRangesAC3Bridge[0]
142 };
143
144 static PCPIN_DESCRIPTOR WaveMiniportPins[] =
145 {
146 // PIN_WAVE_CAPTURE_SINK - 0
147 {
148 MAX_OUTPUT_STREAMS,
149 MAX_OUTPUT_STREAMS,
150 0,
151 NULL,
152 {
153 0,
154 NULL,
155 0,
156 NULL,
157 SIZEOF_ARRAY(WavePinDataRangePointersPCMStream),
158 WavePinDataRangePointersPCMStream,
159 KSPIN_DATAFLOW_OUT,
160 KSPIN_COMMUNICATION_SINK,
161 &KSCATEGORY_AUDIO,
162 &KSAUDFNAME_RECORDING_CONTROL,
163 0
164 }
165 },
166
167 // PIN_WAVE_CAPTURE_SOURCE - 1
168 {
169 0,
170 0,
171 0,
172 NULL,
173 {
174 0,
175 NULL,
176 0,
177 NULL,
178 SIZEOF_ARRAY(WavePinDataRangePointersPCMBridge),
179 WavePinDataRangePointersPCMBridge,
180 KSPIN_DATAFLOW_IN,
181 KSPIN_COMMUNICATION_NONE,
182 &KSCATEGORY_AUDIO,
183 NULL,
184 0
185 }
186 },
187
188 // PIN_WAVE_RENDER_SINK - 2
189 {
190 MAX_INPUT_STREAMS,
191 MAX_INPUT_STREAMS,
192 0,
193 NULL,
194 {
195 0,
196 NULL,
197 0,
198 NULL,
199 SIZEOF_ARRAY(WavePinDataRangePointersPCMStream),
200 WavePinDataRangePointersPCMStream,
201 KSPIN_DATAFLOW_IN,
202 KSPIN_COMMUNICATION_SINK,
203 &KSCATEGORY_AUDIO,
204 &KSAUDFNAME_VOLUME_CONTROL,
205 0
206 }
207 },
208
209 // PIN_WAVE_RENDER_SOURCE - 3
210 {
211 0,
212 0,
213 0,
214 NULL,
215 {
216 0,
217 NULL,
218 0,
219 NULL,
220 SIZEOF_ARRAY(WavePinDataRangePointersPCMBridge),
221 WavePinDataRangePointersPCMBridge,
222 KSPIN_DATAFLOW_OUT,
223 KSPIN_COMMUNICATION_NONE,
224 &KSNODETYPE_SPEAKER,
225 NULL,
226 0
227 }
228 },
229
230 // PIN_WAVE_AC3_RENDER_SINK - 4
231 {
232 MAX_AC3_INPUT_STREAMS,
233 MAX_AC3_INPUT_STREAMS,
234 0,
235 NULL,
236 {
237 0,
238 NULL,
239 0,
240 NULL,
241 SIZEOF_ARRAY(WavePinDataRangePointersAC3Stream),
242 WavePinDataRangePointersAC3Stream,
243 KSPIN_DATAFLOW_IN,
244 KSPIN_COMMUNICATION_SINK,
245 &KSCATEGORY_AUDIO,
246 NULL,
247 0
248 }
249 },
250
251
252 // PIN_WAVE_AC3_RENDER_SOURCE - 5
253 {
254 0,
255 0,
256 0,
257 NULL,
258 {
259 0,
260 NULL,
261 0,
262 NULL,
263 SIZEOF_ARRAY(WavePinDataRangePointersAC3Bridge),
264 WavePinDataRangePointersAC3Bridge,
265 KSPIN_DATAFLOW_OUT,
266 KSPIN_COMMUNICATION_NONE,
267 &KSNODETYPE_SPDIF_INTERFACE,
268 NULL,
269 0
270 }
271 }
272 };
273
274 static PCPROPERTY_ITEM PropertiesChannels[] =
275 {
276 {
277 &KSPROPSETID_Audio,
278 KSPROPERTY_AUDIO_CHANNEL_CONFIG,
279 KSPROPERTY_TYPE_BASICSUPPORT | KSPROPERTY_TYPE_GET | KSPROPERTY_TYPE_SET,
280 (PCPFNPROPERTY_HANDLER)PropertyHandler_ChannelConfig
281 }
282 };
283 DEFINE_PCAUTOMATION_TABLE_PROP(AutomationChans,PropertiesChannels);
284
285 static PCNODE_DESCRIPTOR WaveMiniportNodes[] =
286 {// Flags AutomationTable Type Name
287 // 0 - KSNODE_WAVE_ADC
288 { 0, NULL, &KSNODETYPE_ADC, NULL },
289 // 1 - KSNODE_WAVE_VOLUME1
290 { 0, NULL, &KSNODETYPE_VOLUME, NULL },
291 // 2 - KSNODE_WAVE_3D_EFFECTS
292 { 0, NULL, &KSNODETYPE_3D_EFFECTS, NULL },
293 // 3 - KSNODE_WAVE_SUPERMIX
294 { 0, NULL, &KSNODETYPE_SUPERMIX, NULL },
295 // 4 - KSNODE_WAVE_VOLUME2
296 { 0, NULL, &KSNODETYPE_VOLUME, NULL },
297 // 5 - KSNODE_WAVE_SRC
298 { 0, NULL, &KSNODETYPE_SRC, NULL },
299 // 6 - KSNODE_WAVE_SUM
300 { 0, NULL, &KSNODETYPE_SUM, NULL },
301 // 7 - KSNODE_WAVE_DAC
302 { 0, &AutomationChans, &KSNODETYPE_DAC, NULL },
303 // 8 - KSNODE_WAVE_SPDIF (XP crashes if the pins are directly connected)
304 { 0, NULL, &KSNODETYPE_SPDIF_INTERFACE, NULL },
305 };
306
307 static PCCONNECTION_DESCRIPTOR WaveMiniportConnections[] =
308 {// FromNode, FromPin, ToNode, ToPin
309 { PCFILTER_NODE, PIN_WAVE_CAPTURE_SOURCE, KSNODE_WAVE_ADC, 1 },
310 { KSNODE_WAVE_ADC, 0, PCFILTER_NODE, PIN_WAVE_CAPTURE_SINK },
311
312 { PCFILTER_NODE, PIN_WAVE_RENDER_SINK, KSNODE_WAVE_VOLUME1, 1 },
313 { KSNODE_WAVE_VOLUME1, 0, KSNODE_WAVE_3D_EFFECTS, 1 },
314 { KSNODE_WAVE_3D_EFFECTS, 0, KSNODE_WAVE_SUPERMIX, 1 },
315 { KSNODE_WAVE_SUPERMIX, 0, KSNODE_WAVE_VOLUME2, 1 },
316 { KSNODE_WAVE_VOLUME2, 0, KSNODE_WAVE_SRC, 1 },
317 { KSNODE_WAVE_SRC, 0, KSNODE_WAVE_SUM, 1 },
318 { KSNODE_WAVE_SUM, 0, KSNODE_WAVE_DAC, 1 },
319 { KSNODE_WAVE_DAC, 0, PCFILTER_NODE, PIN_WAVE_RENDER_SOURCE },
320
321 { PCFILTER_NODE, PIN_WAVE_AC3_RENDER_SINK,KSNODE_WAVE_SPDIF, 1 },
322 { KSNODE_WAVE_SPDIF, 0, PCFILTER_NODE, PIN_WAVE_AC3_RENDER_SOURCE },
323 };
324
325 static PCFILTER_DESCRIPTOR WaveMiniportFilterDescriptor =
326 {
327 0, // Version
328 NULL, // AutomationTable
329 sizeof(PCPIN_DESCRIPTOR), // PinSize
330 SIZEOF_ARRAY(WaveMiniportPins), // PinCount
331 WaveMiniportPins, // Pins
332 sizeof(PCNODE_DESCRIPTOR), // NodeSize
333 SIZEOF_ARRAY(WaveMiniportNodes), // NodeCount
334 WaveMiniportNodes, // Nodes
335 SIZEOF_ARRAY(WaveMiniportConnections), // ConnectionCount
336 WaveMiniportConnections, // Connections
337 0, // CategoryCount
338 NULL // Categories - use the default categories (audio, render, capture)
339 };
340
341 #endif //_MINWAVETABLES_HPP_