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
};
29 KSPIN_INTERFACE StandardPinInterface
=
31 {STATIC_KSINTERFACESETID_Standard
},
32 KSINTERFACE_STANDARD_STREAMING
,
36 KSPIN_MEDIUM StandardPinMedium
=
38 {STATIC_KSMEDIUMSETID_Standard
},
39 KSMEDIUM_TYPE_ANYINSTANCE
,
43 KSDATARANGE BridgePinAudioFormat
[] =
51 {STATIC_KSDATAFORMAT_TYPE_AUDIO
},
52 {STATIC_KSDATAFORMAT_SUBTYPE_ANALOG
},
53 {STATIC_KSDATAFORMAT_SPECIFIER_NONE
}
58 static PKSDATARANGE BridgePinAudioFormats
[] =
60 &BridgePinAudioFormat
[0]
63 static LPWSTR ReferenceString
= L
"global";
71 static KSFILTER_DISPATCH USBAudioFilterDispatch
=
79 static KSPIN_DISPATCH UsbAudioPinDispatch
=
85 USBAudioPinSetDataFormat
,
86 USBAudioPinSetDeviceState
,
95 BuildUSBAudioFilterTopology(
99 return STATUS_NOT_IMPLEMENTED
;
104 USBAudioFilterCreate(
108 PKSFILTERFACTORY FilterFactory
;
110 PFILTER_CONTEXT FilterContext
;
112 FilterFactory
= KsGetParent(Filter
);
113 if (FilterFactory
== NULL
)
115 /* invalid parameter */
116 return STATUS_INVALID_PARAMETER
;
119 Device
= KsGetParent(FilterFactory
);
122 /* invalid parameter */
123 return STATUS_INVALID_PARAMETER
;
126 /* alloc filter context */
127 FilterContext
= AllocFunction(sizeof(FILTER_CONTEXT
));
128 if (FilterContext
== NULL
)
131 return STATUS_INSUFFICIENT_RESOURCES
;
135 FilterContext
->DeviceExtension
= Device
->Context
;
136 FilterContext
->LowerDevice
= Device
->NextDeviceObject
;
137 Filter
->Context
= FilterContext
;
139 DPRINT("USBAudioFilterCreate FilterContext %p LowerDevice %p DeviceExtension %p\n", FilterContext
, FilterContext
->LowerDevice
, FilterContext
->DeviceExtension
);
140 KsAddItemToObjectBag(Filter
->Bag
, FilterContext
, ExFreePool
);
141 return STATUS_SUCCESS
;
147 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
148 OUT PULONG NonStreamingTerminalDescriptorCount
,
149 OUT PULONG TotalTerminalDescriptorCount
)
151 PUSB_INTERFACE_DESCRIPTOR Descriptor
;
152 PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR InterfaceHeaderDescriptor
;
153 PUSB_COMMON_DESCRIPTOR CommonDescriptor
;
154 PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR InputTerminalDescriptor
;
155 ULONG NonStreamingTerminalCount
= 0;
156 ULONG TotalTerminalCount
= 0;
158 for(Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, ConfigurationDescriptor
, -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1);
160 Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, (PVOID
)((ULONG_PTR
)Descriptor
+ Descriptor
->bLength
), -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1))
162 if (Descriptor
->bInterfaceSubClass
== 0x01) /* AUDIO_CONTROL */
164 InterfaceHeaderDescriptor
= (PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR
)USBD_ParseDescriptors(ConfigurationDescriptor
, ConfigurationDescriptor
->wTotalLength
, Descriptor
, USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
165 if (InterfaceHeaderDescriptor
!= NULL
)
167 CommonDescriptor
= USBD_ParseDescriptors(InterfaceHeaderDescriptor
, InterfaceHeaderDescriptor
->wTotalLength
, (PVOID
)((ULONG_PTR
)InterfaceHeaderDescriptor
+ InterfaceHeaderDescriptor
->bLength
), USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
168 while (CommonDescriptor
)
170 InputTerminalDescriptor
= (PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR
)CommonDescriptor
;
171 if (InputTerminalDescriptor
->bDescriptorSubtype
== 0x02 /* INPUT TERMINAL*/ || InputTerminalDescriptor
->bDescriptorSubtype
== 0x03 /* OUTPUT_TERMINAL*/)
173 if (InputTerminalDescriptor
->wTerminalType
!= USB_AUDIO_STREAMING_TERMINAL_TYPE
)
175 NonStreamingTerminalCount
++;
177 TotalTerminalCount
++;
179 CommonDescriptor
= (PUSB_COMMON_DESCRIPTOR
)((ULONG_PTR
)CommonDescriptor
+ CommonDescriptor
->bLength
);
180 if ((ULONG_PTR
)CommonDescriptor
>= ((ULONG_PTR
)InterfaceHeaderDescriptor
+ InterfaceHeaderDescriptor
->wTotalLength
))
185 else if (Descriptor
->bInterfaceSubClass
== 0x03) /* MIDI_STREAMING */
190 *NonStreamingTerminalDescriptorCount
= NonStreamingTerminalCount
;
191 *TotalTerminalDescriptorCount
= TotalTerminalCount
;
195 UsbAudioGetPinCategoryFromTerminalDescriptor(
196 IN PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR TerminalDescriptor
)
198 if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_MICROPHONE_TERMINAL_TYPE
)
199 return &NodeTypeMicrophone
;
200 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_DESKTOP_MICROPHONE_TERMINAL_TYPE
)
201 return &NodeTypeDesktopMicrophone
;
202 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_PERSONAL_MICROPHONE_TERMINAL_TYPE
)
203 return &NodeTypePersonalMicrophone
;
204 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_OMMNI_MICROPHONE_TERMINAL_TYPE
)
205 return &NodeTypeOmmniMicrophone
;
206 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_ARRAY_MICROPHONE_TERMINAL_TYPE
)
207 return &NodeTypeArrayMicrophone
;
208 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_ARRAY_PROCESSING_MICROPHONE_TERMINAL_TYPE
)
209 return &NodeTypeProcessingArrayMicrophone
;
212 if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_SPEAKER_TERMINAL_TYPE
)
213 return &NodeTypeSpeaker
;
214 else if (TerminalDescriptor
->wTerminalType
== USB_HEADPHONES_SPEAKER_TERMINAL_TYPE
)
215 return &NodeTypeHeadphonesSpeaker
;
216 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_HMDA_TERMINAL_TYPE
)
217 return &NodeTypeHMDA
;
218 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_DESKTOP_SPEAKER_TERMINAL_TYPE
)
219 return &NodeTypeDesktopSpeaker
;
220 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_ROOM_SPEAKER_TERMINAL_TYPE
)
221 return &NodeTypeRoomSpeaker
;
222 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_COMMUNICATION_SPEAKER_TERMINAL_TYPE
)
223 return &NodeTypeCommunicationSpeaker
;
224 else if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_SUBWOOFER_TERMINAL_TYPE
)
225 return &NodeTypeSubwoofer
;
227 if (TerminalDescriptor
->wTerminalType
== USB_AUDIO_STREAMING_TERMINAL_TYPE
)
229 if (TerminalDescriptor
->bDescriptorSubtype
== USB_AUDIO_OUTPUT_TERMINAL
)
230 return &NodeTypeCapture
;
231 else if (TerminalDescriptor
->bDescriptorSubtype
== USB_AUDIO_INPUT_TERMINAL
)
232 return &NodeTypePlayback
;
238 PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR
239 UsbAudioGetStreamingTerminalDescriptorByIndex(
240 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
243 PUSB_INTERFACE_DESCRIPTOR Descriptor
;
244 PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR InterfaceHeaderDescriptor
;
245 PUSB_COMMON_DESCRIPTOR CommonDescriptor
;
246 PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR InputTerminalDescriptor
;
247 ULONG TerminalCount
= 0;
249 for (Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, ConfigurationDescriptor
, -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1);
251 Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, (PVOID
)((ULONG_PTR
)Descriptor
+ Descriptor
->bLength
), -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1))
253 if (Descriptor
->bInterfaceSubClass
== 0x01) /* AUDIO_CONTROL */
255 InterfaceHeaderDescriptor
= (PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR
)USBD_ParseDescriptors(ConfigurationDescriptor
, ConfigurationDescriptor
->wTotalLength
, Descriptor
, USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
256 if (InterfaceHeaderDescriptor
!= NULL
)
258 CommonDescriptor
= USBD_ParseDescriptors(InterfaceHeaderDescriptor
, InterfaceHeaderDescriptor
->wTotalLength
, (PVOID
)((ULONG_PTR
)InterfaceHeaderDescriptor
+ InterfaceHeaderDescriptor
->bLength
), USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
259 while (CommonDescriptor
)
261 InputTerminalDescriptor
= (PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR
)CommonDescriptor
;
262 if (InputTerminalDescriptor
->bDescriptorSubtype
== 0x02 /* INPUT TERMINAL*/ || InputTerminalDescriptor
->bDescriptorSubtype
== 0x03 /* OUTPUT_TERMINAL*/)
264 if (InputTerminalDescriptor
->wTerminalType
== USB_AUDIO_STREAMING_TERMINAL_TYPE
)
266 if (TerminalCount
== Index
)
268 return InputTerminalDescriptor
;
273 CommonDescriptor
= (PUSB_COMMON_DESCRIPTOR
)((ULONG_PTR
)CommonDescriptor
+ CommonDescriptor
->bLength
);
274 if ((ULONG_PTR
)CommonDescriptor
>= ((ULONG_PTR
)InterfaceHeaderDescriptor
+ InterfaceHeaderDescriptor
->wTotalLength
))
283 PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR
284 UsbAudioGetNonStreamingTerminalDescriptorByIndex(
285 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
289 PUSB_INTERFACE_DESCRIPTOR Descriptor
;
290 PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR InterfaceHeaderDescriptor
;
291 PUSB_COMMON_DESCRIPTOR CommonDescriptor
;
292 PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR InputTerminalDescriptor
;
293 ULONG TerminalCount
= 0;
295 for (Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, ConfigurationDescriptor
, -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1);
297 Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, (PVOID
)((ULONG_PTR
)Descriptor
+ Descriptor
->bLength
), -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1))
299 if (Descriptor
->bInterfaceSubClass
== 0x01) /* AUDIO_CONTROL */
301 InterfaceHeaderDescriptor
= (PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR
)USBD_ParseDescriptors(ConfigurationDescriptor
, ConfigurationDescriptor
->wTotalLength
, Descriptor
, USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
302 if (InterfaceHeaderDescriptor
!= NULL
)
304 CommonDescriptor
= USBD_ParseDescriptors(InterfaceHeaderDescriptor
, InterfaceHeaderDescriptor
->wTotalLength
, (PVOID
)((ULONG_PTR
)InterfaceHeaderDescriptor
+ InterfaceHeaderDescriptor
->bLength
), USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
305 while (CommonDescriptor
)
307 InputTerminalDescriptor
= (PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR
)CommonDescriptor
;
308 if (InputTerminalDescriptor
->bDescriptorSubtype
== 0x02 /* INPUT TERMINAL*/ || InputTerminalDescriptor
->bDescriptorSubtype
== 0x03 /* OUTPUT_TERMINAL*/)
310 if (InputTerminalDescriptor
->wTerminalType
!= USB_AUDIO_STREAMING_TERMINAL_TYPE
)
312 if (TerminalCount
== Index
)
314 return InputTerminalDescriptor
;
319 CommonDescriptor
= (PUSB_COMMON_DESCRIPTOR
)((ULONG_PTR
)CommonDescriptor
+ CommonDescriptor
->bLength
);
320 if ((ULONG_PTR
)CommonDescriptor
>= ((ULONG_PTR
)InterfaceHeaderDescriptor
+ InterfaceHeaderDescriptor
->wTotalLength
))
330 UsbAudioGetDataRanges(
331 IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor
,
332 IN UCHAR bTerminalID
,
333 OUT PKSDATARANGE
** OutDataRanges
,
334 OUT PULONG OutDataRangesCount
)
336 PUSB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR StreamingInterfaceDescriptor
;
337 PUSB_AUDIO_STREAMING_FORMAT_TYPE_DESCRIPTOR StreamingFormatDescriptor
;
338 PUSB_INTERFACE_DESCRIPTOR Descriptor
;
339 PKSDATARANGE_AUDIO DataRangeAudio
;
340 PKSDATARANGE
*DataRangeAudioArray
;
343 for (Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, ConfigurationDescriptor
, -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1);
345 Descriptor
= USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor
, (PVOID
)((ULONG_PTR
)Descriptor
+ Descriptor
->bLength
), -1, -1, USB_DEVICE_CLASS_AUDIO
, -1, -1))
347 if (Descriptor
->bInterfaceSubClass
== 0x02) /* AUDIO_STREAMING */
349 StreamingInterfaceDescriptor
= (PUSB_AUDIO_STREAMING_INTERFACE_DESCRIPTOR
)USBD_ParseDescriptors(ConfigurationDescriptor
, ConfigurationDescriptor
->wTotalLength
, Descriptor
, USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE
);
350 if (StreamingInterfaceDescriptor
!= NULL
)
352 ASSERT(StreamingInterfaceDescriptor
->bDescriptorSubtype
== 0x01);
353 ASSERT(StreamingInterfaceDescriptor
->wFormatTag
== WAVE_FORMAT_PCM
);
354 if (StreamingInterfaceDescriptor
->bTerminalLink
== bTerminalID
)
356 StreamingFormatDescriptor
= (PUSB_AUDIO_STREAMING_FORMAT_TYPE_DESCRIPTOR
)((ULONG_PTR
)StreamingInterfaceDescriptor
+ StreamingInterfaceDescriptor
->bLength
);
357 ASSERT(StreamingFormatDescriptor
->bDescriptorType
== 0x24);
358 ASSERT(StreamingFormatDescriptor
->bDescriptorSubtype
== 0x02);
359 ASSERT(StreamingFormatDescriptor
->bFormatType
== 0x01);
361 DataRangeAudio
= AllocFunction(sizeof(KSDATARANGE_AUDIO
));
362 if (DataRangeAudio
== NULL
)
368 DataRangeAudio
->DataRange
.FormatSize
= sizeof(KSDATARANGE_AUDIO
);
369 DataRangeAudio
->DataRange
.MajorFormat
= KSDATAFORMAT_TYPE_AUDIO
;
370 DataRangeAudio
->DataRange
.SubFormat
= KSDATAFORMAT_SUBTYPE_PCM
;
371 DataRangeAudio
->DataRange
.Specifier
= KSDATAFORMAT_SPECIFIER_WAVEFORMATEX
;
372 DataRangeAudio
->MaximumChannels
= 1;
373 DataRangeAudio
->MinimumBitsPerSample
= StreamingFormatDescriptor
->bBitResolution
;
374 DataRangeAudio
->MaximumBitsPerSample
= StreamingFormatDescriptor
->bBitResolution
;
375 NumFrequency
= StreamingFormatDescriptor
->bSamFreqType
- 1;
376 DataRangeAudio
->MinimumSampleFrequency
= StreamingFormatDescriptor
->tSamFreq
[0] | StreamingFormatDescriptor
->tSamFreq
[1] << 8 | StreamingFormatDescriptor
->tSamFreq
[2] << 16;
377 DataRangeAudio
->MaximumSampleFrequency
= StreamingFormatDescriptor
->tSamFreq
[NumFrequency
*3] | StreamingFormatDescriptor
->tSamFreq
[NumFrequency
* 3+1] << 8 | StreamingFormatDescriptor
->tSamFreq
[NumFrequency
* 3+2]<<16;
378 DataRangeAudioArray
= AllocFunction(sizeof(PKSDATARANGE_AUDIO
));
379 if (DataRangeAudioArray
== NULL
)
382 FreeFunction(DataRangeAudio
);
385 DataRangeAudioArray
[0] = (PKSDATARANGE
)DataRangeAudio
;
386 *OutDataRanges
= DataRangeAudioArray
;
387 *OutDataRangesCount
= 1;
397 USBAudioPinBuildDescriptors(
399 PKSPIN_DESCRIPTOR_EX
*PinDescriptors
,
400 PULONG PinDescriptorsCount
,
401 PULONG PinDescriptorSize
)
403 PDEVICE_EXTENSION DeviceExtension
;
404 PKSPIN_DESCRIPTOR_EX Pins
;
405 ULONG TotalTerminalDescriptorCount
= 0;
406 ULONG NonStreamingTerminalDescriptorCount
= 0;
408 PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR TerminalDescriptor
= NULL
;
410 /* get device extension */
411 DeviceExtension
= Device
->Context
;
413 CountTerminalUnits(DeviceExtension
->ConfigurationDescriptor
, &NonStreamingTerminalDescriptorCount
, &TotalTerminalDescriptorCount
);
414 DPRINT1("TotalTerminalDescriptorCount %lu NonStreamingTerminalDescriptorCount %lu", TotalTerminalDescriptorCount
, NonStreamingTerminalDescriptorCount
);
417 Pins
= AllocFunction(sizeof(KSPIN_DESCRIPTOR_EX
) * TotalTerminalDescriptorCount
);
421 return STATUS_INSUFFICIENT_RESOURCES
;
424 for (Index
= 0; Index
< TotalTerminalDescriptorCount
; Index
++)
426 if (Index
< (TotalTerminalDescriptorCount
- NonStreamingTerminalDescriptorCount
))
429 TerminalDescriptor
= UsbAudioGetStreamingTerminalDescriptorByIndex(DeviceExtension
->ConfigurationDescriptor
, Index
);
430 ASSERT(TerminalDescriptor
!= NULL
);
432 Pins
[Index
].Dispatch
= &UsbAudioPinDispatch
;
433 Pins
[Index
].PinDescriptor
.InterfacesCount
= 1;
434 Pins
[Index
].PinDescriptor
.Interfaces
= &StandardPinInterface
;
435 Pins
[Index
].PinDescriptor
.MediumsCount
= 1;
436 Pins
[Index
].PinDescriptor
.Mediums
= &StandardPinMedium
;
437 Pins
[Index
].PinDescriptor
.Category
= UsbAudioGetPinCategoryFromTerminalDescriptor(TerminalDescriptor
);
438 UsbAudioGetDataRanges(DeviceExtension
->ConfigurationDescriptor
, TerminalDescriptor
->bTerminalID
, (PKSDATARANGE
**)&Pins
[Index
].PinDescriptor
.DataRanges
, &Pins
[Index
].PinDescriptor
.DataRangesCount
);
440 if (TerminalDescriptor
->bDescriptorSubtype
== USB_AUDIO_OUTPUT_TERMINAL
)
442 Pins
[Index
].PinDescriptor
.Communication
= KSPIN_COMMUNICATION_BOTH
;
443 Pins
[Index
].PinDescriptor
.DataFlow
= KSPIN_DATAFLOW_OUT
;
445 else if (TerminalDescriptor
->bDescriptorSubtype
== USB_AUDIO_INPUT_TERMINAL
)
447 Pins
[Index
].PinDescriptor
.Communication
= KSPIN_COMMUNICATION_SINK
;
448 Pins
[Index
].PinDescriptor
.DataFlow
= KSPIN_DATAFLOW_IN
;
451 /* irp sinks / sources can be instantiated */
452 Pins
[Index
].InstancesPossible
= 1;
457 TerminalDescriptor
= UsbAudioGetNonStreamingTerminalDescriptorByIndex(DeviceExtension
->ConfigurationDescriptor
, Index
- (TotalTerminalDescriptorCount
- NonStreamingTerminalDescriptorCount
));
458 Pins
[Index
].PinDescriptor
.InterfacesCount
= 1;
459 Pins
[Index
].PinDescriptor
.Interfaces
= &StandardPinInterface
;
460 Pins
[Index
].PinDescriptor
.MediumsCount
= 1;
461 Pins
[Index
].PinDescriptor
.Mediums
= &StandardPinMedium
;
462 Pins
[Index
].PinDescriptor
.DataRanges
= BridgePinAudioFormats
;
463 Pins
[Index
].PinDescriptor
.DataRangesCount
= 1;
464 Pins
[Index
].PinDescriptor
.Communication
= KSPIN_COMMUNICATION_BRIDGE
;
465 Pins
[Index
].PinDescriptor
.Category
= UsbAudioGetPinCategoryFromTerminalDescriptor(TerminalDescriptor
);
467 if (TerminalDescriptor
->bDescriptorSubtype
== USB_AUDIO_INPUT_TERMINAL
)
469 Pins
[Index
].PinDescriptor
.DataFlow
= KSPIN_DATAFLOW_IN
;
471 else if (TerminalDescriptor
->bDescriptorSubtype
== USB_AUDIO_OUTPUT_TERMINAL
)
473 Pins
[Index
].PinDescriptor
.DataFlow
= KSPIN_DATAFLOW_OUT
;
479 *PinDescriptors
= Pins
;
480 *PinDescriptorSize
= sizeof(KSPIN_DESCRIPTOR_EX
);
481 *PinDescriptorsCount
= TotalTerminalDescriptorCount
;
483 return STATUS_SUCCESS
;
487 USBAudioInitComponentId(
489 IN PKSCOMPONENTID ComponentId
)
491 PDEVICE_EXTENSION DeviceExtension
;
493 /* get device extension */
494 DeviceExtension
= Device
->Context
;
496 INIT_USBAUDIO_MID(&ComponentId
->Manufacturer
, DeviceExtension
->DeviceDescriptor
->idVendor
);
497 INIT_USBAUDIO_PID(&ComponentId
->Product
, DeviceExtension
->DeviceDescriptor
->idProduct
);
499 //ComponentId->Component = KSCOMPONENTID_USBAUDIO;
501 return STATUS_NOT_IMPLEMENTED
;
507 USBAudioCreateFilterContext(
510 PKSFILTER_DESCRIPTOR FilterDescriptor
;
511 PKSCOMPONENTID ComponentId
;
514 /* allocate descriptor */
515 FilterDescriptor
= AllocFunction(sizeof(KSFILTER_DESCRIPTOR
));
516 if (!FilterDescriptor
)
519 return USBD_STATUS_INSUFFICIENT_RESOURCES
;
522 /* init filter descriptor*/
523 FilterDescriptor
->Version
= KSFILTER_DESCRIPTOR_VERSION
;
524 FilterDescriptor
->Flags
= 0;
525 FilterDescriptor
->ReferenceGuid
= &KSNAME_Filter
;
526 FilterDescriptor
->Dispatch
= &USBAudioFilterDispatch
;
527 FilterDescriptor
->CategoriesCount
= 1;
528 FilterDescriptor
->Categories
= &GUID_KSCATEGORY_AUDIO
;
530 /* init component id*/
531 ComponentId
= AllocFunction(sizeof(KSCOMPONENTID
));
535 return STATUS_INSUFFICIENT_RESOURCES
;
537 Status
= USBAudioInitComponentId(Device
, ComponentId
);
538 if (!NT_SUCCESS(Status
))
541 //FreeFunction(ComponentId);
544 FilterDescriptor
->ComponentId
= ComponentId
;
546 /* build pin descriptors */
547 Status
= USBAudioPinBuildDescriptors(Device
, (PKSPIN_DESCRIPTOR_EX
*)&FilterDescriptor
->PinDescriptors
, &FilterDescriptor
->PinDescriptorsCount
, &FilterDescriptor
->PinDescriptorSize
);
548 if (!NT_SUCCESS(Status
))
551 FreeFunction(ComponentId
);
556 Status
= BuildUSBAudioFilterTopology(Device
);
557 if (!NT_SUCCESS(Status
))
560 //FreeFunction(ComponentId);
564 /* lets create the filter */
565 Status
= KsCreateFilterFactory(Device
->FunctionalDeviceObject
, FilterDescriptor
, ReferenceString
, NULL
, KSCREATE_ITEM_FREEONSTOP
, NULL
, NULL
, NULL
);
566 DPRINT1("KsCreateFilterFactory: %x\n", Status
);