2 * PROJECT: ReactOS Universal Audio Class Driver
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/usb/usbaudio/filter.c
5 * PURPOSE: USB Audio device driver.
7 * Johannes Anderwald (johannes.anderwald@reactos.org)
12 GUID NodeTypeMicrophone
= { STATIC_KSNODETYPE_MICROPHONE
};
13 GUID NodeTypeDesktopMicrophone
= { STATIC_KSNODETYPE_DESKTOP_MICROPHONE
};
14 GUID NodeTypePersonalMicrophone
= { STATIC_KSNODETYPE_PERSONAL_MICROPHONE
};
15 GUID NodeTypeOmmniMicrophone
= { STATIC_KSNODETYPE_OMNI_DIRECTIONAL_MICROPHONE
};
16 GUID NodeTypeArrayMicrophone
= { STATIC_KSNODETYPE_MICROPHONE_ARRAY
};
17 GUID NodeTypeProcessingArrayMicrophone
= { STATIC_KSNODETYPE_PROCESSING_MICROPHONE_ARRAY
};
18 GUID NodeTypeSpeaker
= { STATIC_KSNODETYPE_SPEAKER
};
19 GUID NodeTypeHeadphonesSpeaker
= { STATIC_KSNODETYPE_HEADPHONES
};
20 GUID NodeTypeHMDA
= { STATIC_KSNODETYPE_HEAD_MOUNTED_DISPLAY_AUDIO
};
21 GUID NodeTypeDesktopSpeaker
= { STATIC_KSNODETYPE_DESKTOP_SPEAKER
};
22 GUID NodeTypeRoomSpeaker
= { STATIC_KSNODETYPE_ROOM_SPEAKER
};
23 GUID NodeTypeCommunicationSpeaker
= { STATIC_KSNODETYPE_COMMUNICATION_SPEAKER
};
24 GUID NodeTypeSubwoofer
= { STATIC_KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER
};
25 GUID NodeTypeCapture
= { STATIC_PINNAME_CAPTURE
};
26 GUID NodeTypePlayback
= { STATIC_KSCATEGORY_AUDIO
};
27 GUID GUID_KSCATEGORY_AUDIO
= { STATIC_KSCATEGORY_AUDIO
};
28 GUID GUID_KSDATAFORMAT_TYPE_AUDIO
= { STATIC_KSDATAFORMAT_TYPE_AUDIO
};
29 GUID GUID_KSDATAFORMAT_SUBTYPE_PCM
= { STATIC_KSDATAFORMAT_SUBTYPE_PCM
};
30 GUID GUID_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX
= { STATIC_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX
};
31 KSPIN_INTERFACE StandardPinInterface
=
33 {STATIC_KSINTERFACESETID_Standard
},
34 KSINTERFACE_STANDARD_STREAMING
,
38 KSPIN_MEDIUM StandardPinMedium
=
40 {STATIC_KSMEDIUMSETID_Standard
},
41 KSMEDIUM_TYPE_ANYINSTANCE
,
45 KSDATARANGE BridgePinAudioFormat
[] =
53 {STATIC_KSDATAFORMAT_TYPE_AUDIO
},
54 {STATIC_KSDATAFORMAT_SUBTYPE_ANALOG
},
55 {STATIC_KSDATAFORMAT_SPECIFIER_NONE
}
60 static PKSDATARANGE BridgePinAudioFormats
[] =
62 &BridgePinAudioFormat
[0]
65 static LPWSTR ReferenceString
= L
"global";
73 static KSFILTER_DISPATCH USBAudioFilterDispatch
=
82 BuildUSBAudioFilterTopology(
86 return STATUS_NOT_IMPLEMENTED
;
96 return STATUS_SUCCESS
;
102 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
103 OUT PULONG NonStreamingTerminalDescriptorCount
,
104 OUT PULONG TotalTerminalDescriptorCount
)
106 PUSB_INTERFACE_DESCRIPTOR Descriptor
;
107 PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR InterfaceHeaderDescriptor
;
108 PUSB_COMMON_DESCRIPTOR CommonDescriptor
;
109 PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR InputTerminalDescriptor
;
110 ULONG NonStreamingTerminalCount
= 0;
111 ULONG TotalTerminalCount
= 0;
113 for(Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, ConfigurationDescriptor
, -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1);
115 Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, (PVOID
)((ULONG_PTR
)Descriptor
+ Descriptor
->bLength
), -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1))
117 if (Descriptor
->bInterfaceSubClass
== 0x01) /* AUDIO_CONTROL */
119 InterfaceHeaderDescriptor
= (PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR
)USBD_ParseDescriptors(ConfigurationDescriptor
, ConfigurationDescriptor
->wTotalLength
, Descriptor
, USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
120 if (InterfaceHeaderDescriptor
!= NULL
)
122 CommonDescriptor
= USBD_ParseDescriptors(InterfaceHeaderDescriptor
, InterfaceHeaderDescriptor
->wTotalLength
, (PVOID
)((ULONG_PTR
)InterfaceHeaderDescriptor
+ InterfaceHeaderDescriptor
->bLength
), USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
123 while (CommonDescriptor
)
125 InputTerminalDescriptor
= (PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR
)CommonDescriptor
;
126 if (InputTerminalDescriptor
->bDescriptorSubtype
== 0x02 /* INPUT TERMINAL*/ || InputTerminalDescriptor
->bDescriptorSubtype
== 0x03 /* OUTPUT_TERMINAL*/)
128 if (InputTerminalDescriptor
->wTerminalType
!= USB_AUDIO_STREAMING_TERMINAL_TYPE
)
130 NonStreamingTerminalCount
++;
132 TotalTerminalCount
++;
134 CommonDescriptor
= (PUSB_COMMON_DESCRIPTOR
)((ULONG_PTR
)CommonDescriptor
+ CommonDescriptor
->bLength
);
135 if ((ULONG_PTR
)CommonDescriptor
>= ((ULONG_PTR
)InterfaceHeaderDescriptor
+ InterfaceHeaderDescriptor
->wTotalLength
))
140 else if (Descriptor
->bInterfaceSubClass
== 0x03) /* MIDI_STREAMING */
145 *NonStreamingTerminalDescriptorCount
= NonStreamingTerminalCount
;
146 *TotalTerminalDescriptorCount
= TotalTerminalCount
;
150 UsbAudioGetPinCategoryFromTerminalDescriptor(
151 IN PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR TerminalDescriptor
)
153 if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_MICROPHONE_TERMINAL_TYPE
)
154 return &NodeTypeMicrophone
;
155 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_DESKTOP_MICROPHONE_TERMINAL_TYPE
)
156 return &NodeTypeDesktopMicrophone
;
157 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_PERSONAL_MICROPHONE_TERMINAL_TYPE
)
158 return &NodeTypePersonalMicrophone
;
159 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_OMMNI_MICROPHONE_TERMINAL_TYPE
)
160 return &NodeTypeOmmniMicrophone
;
161 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_ARRAY_MICROPHONE_TERMINAL_TYPE
)
162 return &NodeTypeArrayMicrophone
;
163 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_ARRAY_PROCESSING_MICROPHONE_TERMINAL_TYPE
)
164 return &NodeTypeProcessingArrayMicrophone
;
167 if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_SPEAKER_TERMINAL_TYPE
)
168 return &NodeTypeSpeaker
;
169 else if (TerminalDescriptor
->wTerminalType
== USB_HEADPHONES_SPEAKER_TERMINAL_TYPE
)
170 return &NodeTypeHeadphonesSpeaker
;
171 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_HMDA_TERMINAL_TYPE
)
172 return &NodeTypeHMDA
;
173 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_DESKTOP_SPEAKER_TERMINAL_TYPE
)
174 return &NodeTypeDesktopSpeaker
;
175 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_ROOM_SPEAKER_TERMINAL_TYPE
)
176 return &NodeTypeRoomSpeaker
;
177 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_COMMUNICATION_SPEAKER_TERMINAL_TYPE
)
178 return &NodeTypeCommunicationSpeaker
;
179 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_SUBWOOFER_TERMINAL_TYPE
)
180 return &NodeTypeSubwoofer
;
182 if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_STREAMING_TERMINAL_TYPE
)
184 if (TerminalDescriptor
->bDescriptorSubtype
== USB_AUDIO_OUTPUT_TERMINAL
)
185 return &NodeTypeCapture
;
186 else if (TerminalDescriptor
->bDescriptorSubtype
== USB_AUDIO_INPUT_TERMINAL
)
187 return &NodeTypePlayback
;
193 PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR
194 UsbAudioGetStreamingTerminalDescriptorByIndex(
195 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
198 PUSB_INTERFACE_DESCRIPTOR Descriptor
;
199 PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR InterfaceHeaderDescriptor
;
200 PUSB_COMMON_DESCRIPTOR CommonDescriptor
;
201 PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR InputTerminalDescriptor
;
202 ULONG TerminalCount
= 0;
204 for (Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, ConfigurationDescriptor
, -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1);
206 Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, (PVOID
)((ULONG_PTR
)Descriptor
+ Descriptor
->bLength
), -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1))
208 if (Descriptor
->bInterfaceSubClass
== 0x01) /* AUDIO_CONTROL */
210 InterfaceHeaderDescriptor
= (PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR
)USBD_ParseDescriptors(ConfigurationDescriptor
, ConfigurationDescriptor
->wTotalLength
, Descriptor
, USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
211 if (InterfaceHeaderDescriptor
!= NULL
)
213 CommonDescriptor
= USBD_ParseDescriptors(InterfaceHeaderDescriptor
, InterfaceHeaderDescriptor
->wTotalLength
, (PVOID
)((ULONG_PTR
)InterfaceHeaderDescriptor
+ InterfaceHeaderDescriptor
->bLength
), USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
214 while (CommonDescriptor
)
216 InputTerminalDescriptor
= (PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR
)CommonDescriptor
;
217 if (InputTerminalDescriptor
->bDescriptorSubtype
== 0x02 /* INPUT TERMINAL*/ || InputTerminalDescriptor
->bDescriptorSubtype
== 0x03 /* OUTPUT_TERMINAL*/)
219 if (InputTerminalDescriptor
->wTerminalType
== USB_AUDIO_STREAMING_TERMINAL_TYPE
)
221 if (TerminalCount
== Index
)
223 return InputTerminalDescriptor
;
228 CommonDescriptor
= (PUSB_COMMON_DESCRIPTOR
)((ULONG_PTR
)CommonDescriptor
+ CommonDescriptor
->bLength
);
229 if ((ULONG_PTR
)CommonDescriptor
>= ((ULONG_PTR
)InterfaceHeaderDescriptor
+ InterfaceHeaderDescriptor
->wTotalLength
))
238 PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR
239 UsbAudioGetNonStreamingTerminalDescriptorByIndex(
240 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
244 PUSB_INTERFACE_DESCRIPTOR Descriptor
;
245 PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR InterfaceHeaderDescriptor
;
246 PUSB_COMMON_DESCRIPTOR CommonDescriptor
;
247 PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR InputTerminalDescriptor
;
248 ULONG TerminalCount
= 0;
250 for (Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, ConfigurationDescriptor
, -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1);
252 Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, (PVOID
)((ULONG_PTR
)Descriptor
+ Descriptor
->bLength
), -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1))
254 if (Descriptor
->bInterfaceSubClass
== 0x01) /* AUDIO_CONTROL */
256 InterfaceHeaderDescriptor
= (PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR
)USBD_ParseDescriptors(ConfigurationDescriptor
, ConfigurationDescriptor
->wTotalLength
, Descriptor
, USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
257 if (InterfaceHeaderDescriptor
!= NULL
)
259 CommonDescriptor
= USBD_ParseDescriptors(InterfaceHeaderDescriptor
, InterfaceHeaderDescriptor
->wTotalLength
, (PVOID
)((ULONG_PTR
)InterfaceHeaderDescriptor
+ InterfaceHeaderDescriptor
->bLength
), USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
260 while (CommonDescriptor
)
262 InputTerminalDescriptor
= (PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR
)CommonDescriptor
;
263 if (InputTerminalDescriptor
->bDescriptorSubtype
== 0x02 /* INPUT TERMINAL*/ || InputTerminalDescriptor
->bDescriptorSubtype
== 0x03 /* OUTPUT_TERMINAL*/)
265 if (InputTerminalDescriptor
->wTerminalType
!= USB_AUDIO_STREAMING_TERMINAL_TYPE
)
267 if (TerminalCount
== Index
)
269 return InputTerminalDescriptor
;
274 CommonDescriptor
= (PUSB_COMMON_DESCRIPTOR
)((ULONG_PTR
)CommonDescriptor
+ CommonDescriptor
->bLength
);
275 if ((ULONG_PTR
)CommonDescriptor
>= ((ULONG_PTR
)InterfaceHeaderDescriptor
+ InterfaceHeaderDescriptor
->wTotalLength
))
285 UsbAudioGetDataRanges(
286 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
287 IN UCHAR bTerminalID
,
288 OUT PKSDATARANGE
** OutDataRanges
,
289 OUT PULONG OutDataRangesCount
)
291 PUSB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR StreamingInterfaceDescriptor
;
292 PUSB_AUDIO_STREAMING_FORMAT_TYPE_DESCRIPTOR StreamingFormatDescriptor
;
293 PUSB_INTERFACE_DESCRIPTOR Descriptor
;
294 PKSDATARANGE_AUDIO DataRangeAudio
;
295 PKSDATARANGE
*DataRangeAudioArray
;
298 for (Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, ConfigurationDescriptor
, -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1);
300 Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, (PVOID
)((ULONG_PTR
)Descriptor
+ Descriptor
->bLength
), -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1))
302 if (Descriptor
->bInterfaceSubClass
== 0x02) /* AUDIO_STREAMING */
304 StreamingInterfaceDescriptor
= (PUSB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR
)USBD_ParseDescriptors(ConfigurationDescriptor
, ConfigurationDescriptor
->wTotalLength
, Descriptor
, USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
305 if (StreamingInterfaceDescriptor
!= NULL
)
307 ASSERT(StreamingInterfaceDescriptor
->bDescriptorSubtype
== 0x01);
308 ASSERT(StreamingInterfaceDescriptor
->wFormatTag
== WAVE_FORMAT_PCM
);
309 if (StreamingInterfaceDescriptor
->bTerminalLink
== bTerminalID
)
311 StreamingFormatDescriptor
= (PUSB_AUDIO_STREAMING_FORMAT_TYPE_DESCRIPTOR
)((ULONG_PTR
)StreamingInterfaceDescriptor
+ StreamingInterfaceDescriptor
->bLength
);
312 ASSERT(StreamingFormatDescriptor
->bDescriptorType
== 0x24);
313 ASSERT(StreamingFormatDescriptor
->bDescriptorSubtype
== 0x02);
314 ASSERT(StreamingFormatDescriptor
->bFormatType
== 0x01);
316 DataRangeAudio
= AllocFunction(sizeof(KSDATARANGE_AUDIO
));
317 if (DataRangeAudio
== NULL
)
323 DataRangeAudio
->DataRange
.FormatSize
= sizeof(KSDATARANGE_AUDIO
);
324 DataRangeAudio
->DataRange
.MajorFormat
= GUID_KSDATAFORMAT_TYPE_AUDIO
;
325 DataRangeAudio
->DataRange
.SubFormat
= GUID_KSDATAFORMAT_SUBTYPE_PCM
;
326 DataRangeAudio
->DataRange
.Specifier
= GUID_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX
;
327 DataRangeAudio
->MaximumChannels
= 1;
328 DataRangeAudio
->MinimumBitsPerSample
= StreamingFormatDescriptor
->bBitResolution
;
329 DataRangeAudio
->MaximumBitsPerSample
= StreamingFormatDescriptor
->bBitResolution
;
330 NumFrequency
= StreamingFormatDescriptor
->bSamFreqType
- 1;
331 DataRangeAudio
->MinimumSampleFrequency
= StreamingFormatDescriptor
->tSamFreq
[0] | StreamingFormatDescriptor
->tSamFreq
[1] << 8 | StreamingFormatDescriptor
->tSamFreq
[2] << 16;
332 DataRangeAudio
->MaximumSampleFrequency
= StreamingFormatDescriptor
->tSamFreq
[NumFrequency
*3] | StreamingFormatDescriptor
->tSamFreq
[NumFrequency
* 3+1] << 8 | StreamingFormatDescriptor
->tSamFreq
[NumFrequency
* 3+2]<<16;
333 DataRangeAudioArray
= AllocFunction(sizeof(PKSDATARANGE_AUDIO
));
334 if (DataRangeAudioArray
== NULL
)
337 FreeFunction(DataRangeAudio
);
340 DataRangeAudioArray
[0] = (PKSDATARANGE
)DataRangeAudio
;
341 *OutDataRanges
= DataRangeAudioArray
;
342 *OutDataRangesCount
= 1;
352 USBAudioPinBuildDescriptors(
354 PKSPIN_DESCRIPTOR_EX
*PinDescriptors
,
355 PULONG PinDescriptorsCount
,
356 PULONG PinDescriptorSize
)
358 PDEVICE_EXTENSION DeviceExtension
;
359 PKSPIN_DESCRIPTOR_EX Pins
;
360 ULONG TotalTerminalDescriptorCount
= 0;
361 ULONG NonStreamingTerminalDescriptorCount
= 0;
363 PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR TerminalDescriptor
= NULL
;
365 /* get device extension */
366 DeviceExtension
= Device
->Context
;
368 CountTerminalUnits(DeviceExtension
->ConfigurationDescriptor
, &NonStreamingTerminalDescriptorCount
, &TotalTerminalDescriptorCount
);
369 DPRINT1("TotalTerminalDescriptorCount %lu NonStreamingTerminalDescriptorCount %lu", TotalTerminalDescriptorCount
, NonStreamingTerminalDescriptorCount
);
372 Pins
= AllocFunction(sizeof(KSPIN_DESCRIPTOR_EX
) * TotalTerminalDescriptorCount
);
376 return STATUS_INSUFFICIENT_RESOURCES
;
379 for (Index
= 0; Index
< TotalTerminalDescriptorCount
; Index
++)
381 if (Index
< (TotalTerminalDescriptorCount
- NonStreamingTerminalDescriptorCount
))
384 TerminalDescriptor
= UsbAudioGetStreamingTerminalDescriptorByIndex(DeviceExtension
->ConfigurationDescriptor
, Index
);
385 Pins
[Index
].PinDescriptor
.InterfacesCount
= 1;
386 Pins
[Index
].PinDescriptor
.Interfaces
= &StandardPinInterface
;
387 Pins
[Index
].PinDescriptor
.MediumsCount
= 1;
388 Pins
[Index
].PinDescriptor
.Mediums
= &StandardPinMedium
;
389 Pins
[Index
].PinDescriptor
.Category
= UsbAudioGetPinCategoryFromTerminalDescriptor(TerminalDescriptor
);
390 UsbAudioGetDataRanges(DeviceExtension
->ConfigurationDescriptor
, TerminalDescriptor
->bTerminalID
, (PKSDATARANGE
**)&Pins
[Index
].PinDescriptor
.DataRanges
, &Pins
[Index
].PinDescriptor
.DataRangesCount
);
392 if (TerminalDescriptor
->bDescriptorSubtype
== USB_AUDIO_OUTPUT_TERMINAL
)
394 Pins
[Index
].PinDescriptor
.Communication
= KSPIN_COMMUNICATION_BOTH
;
395 Pins
[Index
].PinDescriptor
.DataFlow
= KSPIN_DATAFLOW_OUT
;
397 else if (TerminalDescriptor
->bDescriptorSubtype
== USB_AUDIO_INPUT_TERMINAL
)
399 Pins
[Index
].PinDescriptor
.Communication
= KSPIN_COMMUNICATION_SINK
;
400 Pins
[Index
].PinDescriptor
.DataFlow
= KSPIN_DATAFLOW_IN
;
403 /* irp sinks / sources can be instantiated */
404 Pins
[Index
].InstancesPossible
= 1;
409 TerminalDescriptor
= UsbAudioGetNonStreamingTerminalDescriptorByIndex(DeviceExtension
->ConfigurationDescriptor
, Index
- (TotalTerminalDescriptorCount
- NonStreamingTerminalDescriptorCount
));
410 Pins
[Index
].PinDescriptor
.InterfacesCount
= 1;
411 Pins
[Index
].PinDescriptor
.Interfaces
= &StandardPinInterface
;
412 Pins
[Index
].PinDescriptor
.MediumsCount
= 1;
413 Pins
[Index
].PinDescriptor
.Mediums
= &StandardPinMedium
;
414 Pins
[Index
].PinDescriptor
.DataRanges
= BridgePinAudioFormats
;
415 Pins
[Index
].PinDescriptor
.DataRangesCount
= 1;
416 Pins
[Index
].PinDescriptor
.Communication
= KSPIN_COMMUNICATION_BRIDGE
;
417 Pins
[Index
].PinDescriptor
.Category
= UsbAudioGetPinCategoryFromTerminalDescriptor(TerminalDescriptor
);
419 if (TerminalDescriptor
->bDescriptorSubtype
== USB_AUDIO_INPUT_TERMINAL
)
421 Pins
[Index
].PinDescriptor
.DataFlow
= KSPIN_DATAFLOW_IN
;
423 else if (TerminalDescriptor
->bDescriptorSubtype
== USB_AUDIO_OUTPUT_TERMINAL
)
425 Pins
[Index
].PinDescriptor
.DataFlow
= KSPIN_DATAFLOW_OUT
;
431 *PinDescriptors
= Pins
;
432 *PinDescriptorSize
= sizeof(KSPIN_DESCRIPTOR_EX
);
433 *PinDescriptorsCount
= TotalTerminalDescriptorCount
;
435 return STATUS_SUCCESS
;
439 USBAudioInitComponentId(
441 IN PKSCOMPONENTID ComponentId
)
443 PDEVICE_EXTENSION DeviceExtension
;
445 /* get device extension */
446 DeviceExtension
= Device
->Context
;
448 INIT_USBAUDIO_MID(&ComponentId
->Manufacturer
, DeviceExtension
->DeviceDescriptor
->idVendor
);
449 INIT_USBAUDIO_PID(&ComponentId
->Product
, DeviceExtension
->DeviceDescriptor
->idProduct
);
451 //ComponentId->Component = KSCOMPONENTID_USBAUDIO;
453 return STATUS_NOT_IMPLEMENTED
;
459 USBAudioCreateFilterContext(
462 KSFILTER_DESCRIPTOR FilterDescriptor
;
463 PKSCOMPONENTID ComponentId
;
466 /* clear filter descriptor */
467 RtlZeroMemory(&FilterDescriptor
, sizeof(KSFILTER_DESCRIPTOR
));
469 /* init filter descriptor*/
470 FilterDescriptor
.Version
= KSFILTER_DESCRIPTOR_VERSION
;
471 FilterDescriptor
.Flags
= 0;
472 FilterDescriptor
.ReferenceGuid
= &KSNAME_Filter
;
473 FilterDescriptor
.Dispatch
= &USBAudioFilterDispatch
;
474 FilterDescriptor
.CategoriesCount
= 1;
475 FilterDescriptor
.Categories
= &GUID_KSCATEGORY_AUDIO
;
477 /* init component id*/
478 ComponentId
= AllocFunction(sizeof(KSCOMPONENTID
));
482 return STATUS_INSUFFICIENT_RESOURCES
;
484 Status
= USBAudioInitComponentId(Device
, ComponentId
);
485 if (!NT_SUCCESS(Status
))
488 //FreeFunction(ComponentId);
491 FilterDescriptor
.ComponentId
= ComponentId
;
493 /* build pin descriptors */
494 Status
= USBAudioPinBuildDescriptors(Device
, (PKSPIN_DESCRIPTOR_EX
*)&FilterDescriptor
.PinDescriptors
, &FilterDescriptor
.PinDescriptorsCount
, &FilterDescriptor
.PinDescriptorSize
);
495 if (!NT_SUCCESS(Status
))
498 FreeFunction(ComponentId
);
504 Status
= BuildUSBAudioFilterTopology(Device
);
505 if (!NT_SUCCESS(Status
))
508 //FreeFunction(ComponentId);
512 /* lets create the filter */
513 Status
= KsCreateFilterFactory(Device
->FunctionalDeviceObject
, &FilterDescriptor
, ReferenceString
, NULL
, KSCREATE_ITEM_FREEONSTOP
, NULL
, NULL
, NULL
);
514 DPRINT1("KsCreateFilterFactory: %x\n", Status
);