Author: janderwald Date: Sat Oct 15 17:56:44 2016 New Revision: 72973
URL: http://svn.reactos.org/svn/reactos?rev=72973&view=rev Log: [USBAUDIO] - implement building topology connections
Modified: trunk/reactos/drivers/usb/usbaudio/filter.c trunk/reactos/drivers/usb/usbaudio/usbaudio.h
Modified: trunk/reactos/drivers/usb/usbaudio/filter.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbaudio/filter... ============================================================================== --- trunk/reactos/drivers/usb/usbaudio/filter.c [iso-8859-1] (original) +++ trunk/reactos/drivers/usb/usbaudio/filter.c [iso-8859-1] Sat Oct 15 17:56:44 2016 @@ -92,7 +92,8 @@
ULONG CountTopologyComponents( - IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor) + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + OUT PULONG OutDescriptorCount) { PUSB_INTERFACE_DESCRIPTOR Descriptor; PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR InterfaceHeaderDescriptor; @@ -101,6 +102,7 @@ PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR FeatureUnitDescriptor; PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR MixerUnitDescriptor; ULONG NodeCount = 0; + ULONG DescriptorCount = 0; UCHAR Value;
for (Descriptor = USBD_ParseConfigurationDescriptorEx(ConfigurationDescriptor, ConfigurationDescriptor, -1, -1, USB_DEVICE_CLASS_AUDIO, -1, -1); @@ -119,10 +121,12 @@ if (InputTerminalDescriptor->bDescriptorSubtype == 0x02 /* INPUT TERMINAL*/ || InputTerminalDescriptor->bDescriptorSubtype == 0x03 /* OUTPUT_TERMINAL*/) { NodeCount++; + DescriptorCount++; } else if (InputTerminalDescriptor->bDescriptorSubtype == 0x06 /* FEATURE_UNIT*/) { FeatureUnitDescriptor = (PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR)InputTerminalDescriptor; + DescriptorCount++; Value = FeatureUnitDescriptor->bmaControls[0]; if (Value & 0x01) /* MUTE*/ NodeCount++; @@ -146,6 +150,7 @@ else if (InputTerminalDescriptor->bDescriptorSubtype == 0x04 /* MIXER_UNIT */) { MixerUnitDescriptor = (PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR)InputTerminalDescriptor; + DescriptorCount++; NodeCount += MixerUnitDescriptor->bNrInPins + 1; /* KSNODETYPE_SUPERMIX for each source pin and KSNODETYPE_SUM for target */ } else @@ -159,10 +164,27 @@ } } } + *OutDescriptorCount = DescriptorCount; return NodeCount; }
- +PNODE_CONTEXT +FindNodeContextWithId( + IN PNODE_CONTEXT NodeContext, + IN ULONG NodeContextCount, + IN UCHAR TerminalId) +{ + ULONG Index; + PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR TerminalDescriptor; + + for (Index = 0; Index < NodeContextCount; Index++) + { + TerminalDescriptor = (PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR)NodeContext[Index].Descriptor; + if (TerminalDescriptor->bTerminalID == TerminalId) + return &NodeContext[Index]; + } + return NULL; +}
NTSTATUS BuildUSBAudioFilterTopology( @@ -170,7 +192,7 @@ PKSFILTER_DESCRIPTOR FilterDescriptor) { PDEVICE_EXTENSION DeviceExtension; - ULONG NodeCount, Index; + ULONG NodeCount, Index, DescriptorCount, StreamingTerminalIndex, NonStreamingTerminalDescriptorCount, TotalTerminalDescriptorCount, StreamingTerminalPinOffset, ControlDescriptorCount; UCHAR Value; PUSB_INTERFACE_DESCRIPTOR Descriptor; PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR InterfaceHeaderDescriptor; @@ -178,13 +200,16 @@ PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR InputTerminalDescriptor; PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR FeatureUnitDescriptor; PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR MixerUnitDescriptor; + PUSB_AUDIO_CONTROL_OUTPUT_TERMINAL_DESCRIPTOR OutputTerminalDescriptor; PKSNODE_DESCRIPTOR NodeDescriptors; + PNODE_CONTEXT NodeContext, PreviousNodeContext; + PKSTOPOLOGY_CONNECTION Connections;
/* get device extension */ DeviceExtension = Device->Context;
/* count topology nodes */ - NodeCount = CountTopologyComponents(DeviceExtension->ConfigurationDescriptor); + NodeCount = CountTopologyComponents(DeviceExtension->ConfigurationDescriptor, &ControlDescriptorCount);
/* init node descriptors*/ FilterDescriptor->NodeDescriptors = NodeDescriptors = AllocFunction(NodeCount * sizeof(KSNODE_DESCRIPTOR)); @@ -195,6 +220,15 @@ } FilterDescriptor->NodeDescriptorSize = sizeof(KSNODE_DESCRIPTOR);
+ NodeContext = AllocFunction(sizeof(NODE_CONTEXT) * ControlDescriptorCount); + if (!NodeContext) + { + /* no memory */ + return STATUS_INSUFFICIENT_RESOURCES; + } + DescriptorCount = 0; + + /* first enumerate all topology nodes */ for (Descriptor = USBD_ParseConfigurationDescriptorEx(DeviceExtension->ConfigurationDescriptor, DeviceExtension->ConfigurationDescriptor, -1, -1, USB_DEVICE_CLASS_AUDIO, -1, -1); Descriptor != NULL; Descriptor = USBD_ParseConfigurationDescriptorEx(DeviceExtension->ConfigurationDescriptor, (PVOID)((ULONG_PTR)Descriptor + Descriptor->bLength), -1, -1, USB_DEVICE_CLASS_AUDIO, -1, -1)) @@ -208,13 +242,20 @@ while (CommonDescriptor) { InputTerminalDescriptor = (PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR)CommonDescriptor; - if (InputTerminalDescriptor->bDescriptorSubtype == 0x02 /* INPUT TERMINAL*/ || InputTerminalDescriptor->bDescriptorSubtype == 0x03 /* OUTPUT_TERMINAL*/) + if (InputTerminalDescriptor->bDescriptorSubtype == 0x02 /* INPUT TERMINAL*/) { if (InputTerminalDescriptor->wTerminalType == USB_AUDIO_STREAMING_TERMINAL_TYPE) { NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_SRC; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_SRC; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Descriptor = CommonDescriptor; + NodeContext[DescriptorCount].NodeCount = 1; + NodeContext[DescriptorCount].Nodes[0] = FilterDescriptor->NodeDescriptorsCount; + DescriptorCount++; + FilterDescriptor->NodeDescriptorsCount++; } else if ((InputTerminalDescriptor->wTerminalType & 0xFF00) == 0x200) @@ -222,6 +263,14 @@ NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_ADC; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_ADC; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Descriptor = CommonDescriptor; + NodeContext[DescriptorCount].NodeCount = 1; + NodeContext[DescriptorCount].Nodes[0] = FilterDescriptor->NodeDescriptorsCount; + DescriptorCount++; + + FilterDescriptor->NodeDescriptorsCount++; } else if ((InputTerminalDescriptor->wTerminalType & 0xFF00) == 0x300) @@ -229,6 +278,13 @@ NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_DAC; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_DAC; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Descriptor = CommonDescriptor; + NodeContext[DescriptorCount].NodeCount = 1; + NodeContext[DescriptorCount].Nodes[0] = FilterDescriptor->NodeDescriptorsCount; + DescriptorCount++; + FilterDescriptor->NodeDescriptorsCount++; } else @@ -243,6 +299,13 @@ NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_SRC; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_SRC; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Descriptor = CommonDescriptor; + NodeContext[DescriptorCount].NodeCount = 1; + NodeContext[DescriptorCount].Nodes[0] = FilterDescriptor->NodeDescriptorsCount; + DescriptorCount++; + FilterDescriptor->NodeDescriptorsCount++; } else if ((InputTerminalDescriptor->wTerminalType & 0xFF00) == 0x300) @@ -250,6 +313,13 @@ NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_DAC; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_DAC; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Descriptor = CommonDescriptor; + NodeContext[DescriptorCount].NodeCount = 1; + NodeContext[DescriptorCount].Nodes[0] = FilterDescriptor->NodeDescriptorsCount; + DescriptorCount++; + FilterDescriptor->NodeDescriptorsCount++; } else @@ -260,13 +330,18 @@
else if (InputTerminalDescriptor->bDescriptorSubtype == 0x06 /* FEATURE_UNIT*/) { - FeatureUnitDescriptor = (PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR)InputTerminalDescriptor; + FeatureUnitDescriptor = (PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR)CommonDescriptor; Value = FeatureUnitDescriptor->bmaControls[0]; if (Value & 0x01) /* MUTE*/ { NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_MUTE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_MUTE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Nodes[NodeContext[DescriptorCount].NodeCount] = FilterDescriptor->NodeDescriptorsCount; + NodeContext[DescriptorCount].NodeCount++; + FilterDescriptor->NodeDescriptorsCount++; } if (Value & 0x02) /* VOLUME */ @@ -274,6 +349,11 @@ NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_VOLUME; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_VOLUME; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Nodes[NodeContext[DescriptorCount].NodeCount] = FilterDescriptor->NodeDescriptorsCount; + NodeContext[DescriptorCount].NodeCount++; + FilterDescriptor->NodeDescriptorsCount++; }
@@ -282,6 +362,11 @@ NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_TONE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_TONE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Nodes[NodeContext[DescriptorCount].NodeCount] = FilterDescriptor->NodeDescriptorsCount; + NodeContext[DescriptorCount].NodeCount++; + FilterDescriptor->NodeDescriptorsCount++; }
@@ -290,6 +375,11 @@ NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_TONE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_TONE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Nodes[NodeContext[DescriptorCount].NodeCount] = FilterDescriptor->NodeDescriptorsCount; + NodeContext[DescriptorCount].NodeCount++; + FilterDescriptor->NodeDescriptorsCount++; }
@@ -298,6 +388,12 @@ NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_TONE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_TONE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Nodes[NodeContext[DescriptorCount].NodeCount] = FilterDescriptor->NodeDescriptorsCount; + NodeContext[DescriptorCount].NodeCount++; + + FilterDescriptor->NodeDescriptorsCount++; }
@@ -306,6 +402,11 @@ NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_TONE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_TONE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Nodes[NodeContext[DescriptorCount].NodeCount] = FilterDescriptor->NodeDescriptorsCount; + NodeContext[DescriptorCount].NodeCount++; + FilterDescriptor->NodeDescriptorsCount++; }
@@ -314,6 +415,12 @@ NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_TONE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_TONE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Nodes[NodeContext[DescriptorCount].NodeCount] = FilterDescriptor->NodeDescriptorsCount; + NodeContext[DescriptorCount].NodeCount++; + + FilterDescriptor->NodeDescriptorsCount++; }
@@ -322,23 +429,43 @@ NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_TONE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_TONE; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); - FilterDescriptor->NodeDescriptorsCount++; - } + + /* insert into node context*/ + NodeContext[DescriptorCount].Nodes[NodeContext[DescriptorCount].NodeCount] = FilterDescriptor->NodeDescriptorsCount; + NodeContext[DescriptorCount].NodeCount++; + + FilterDescriptor->NodeDescriptorsCount++; + } + NodeContext[DescriptorCount].Descriptor = CommonDescriptor; + DescriptorCount++; + } else if (InputTerminalDescriptor->bDescriptorSubtype == 0x04 /* MIXER_UNIT */) { - MixerUnitDescriptor = (PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR)InputTerminalDescriptor; + MixerUnitDescriptor = (PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR)CommonDescriptor; for (Index = 0; Index < MixerUnitDescriptor->bNrInPins; Index++) { NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_SUPERMIX; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_SUPERMIX; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Nodes[NodeContext[DescriptorCount].NodeCount] = FilterDescriptor->NodeDescriptorsCount; + NodeContext[DescriptorCount].NodeCount++; + FilterDescriptor->NodeDescriptorsCount++; }
NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Type = &KSNODETYPE_SUM; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].Name = &KSNODETYPE_SUM; NodeDescriptors[FilterDescriptor->NodeDescriptorsCount].AutomationTable = AllocFunction(sizeof(KSAUTOMATION_TABLE)); + + /* insert into node context*/ + NodeContext[DescriptorCount].Nodes[NodeContext[DescriptorCount].NodeCount] = FilterDescriptor->NodeDescriptorsCount; + NodeContext[DescriptorCount].NodeCount++; + NodeContext[DescriptorCount].Descriptor = CommonDescriptor; + DescriptorCount++; + FilterDescriptor->NodeDescriptorsCount++; } else @@ -353,6 +480,154 @@ } }
+ /* FIXME determine connections count*/ + FilterDescriptor->Connections = Connections = AllocFunction(sizeof(KSTOPOLOGY_CONNECTION) * FilterDescriptor->NodeDescriptorsCount * 2); + if (!FilterDescriptor->Connections) + { + /* no memory */ + return STATUS_INSUFFICIENT_RESOURCES; + } + FilterDescriptor->ConnectionsCount = 0; + + /* now build connections array */ + DescriptorCount = 0; + StreamingTerminalIndex = 0; + NodeCount = 0; + + CountTerminalUnits(DeviceExtension->ConfigurationDescriptor, &NonStreamingTerminalDescriptorCount, &TotalTerminalDescriptorCount); + StreamingTerminalPinOffset = TotalTerminalDescriptorCount - NonStreamingTerminalDescriptorCount; + + for (Descriptor = USBD_ParseConfigurationDescriptorEx(DeviceExtension->ConfigurationDescriptor, DeviceExtension->ConfigurationDescriptor, -1, -1, USB_DEVICE_CLASS_AUDIO, -1, -1); + Descriptor != NULL; + Descriptor = USBD_ParseConfigurationDescriptorEx(DeviceExtension->ConfigurationDescriptor, (PVOID)((ULONG_PTR)Descriptor + Descriptor->bLength), -1, -1, USB_DEVICE_CLASS_AUDIO, -1, -1)) + { + if (Descriptor->bInterfaceSubClass == 0x01) /* AUDIO_CONTROL */ + { + InterfaceHeaderDescriptor = (PUSB_AUDIO_CONTROL_INTERFACE_HEADER_DESCRIPTOR)USBD_ParseDescriptors(DeviceExtension->ConfigurationDescriptor, DeviceExtension->ConfigurationDescriptor->wTotalLength, Descriptor, USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE); + if (InterfaceHeaderDescriptor != NULL) + { + CommonDescriptor = USBD_ParseDescriptors(InterfaceHeaderDescriptor, InterfaceHeaderDescriptor->wTotalLength, (PVOID)((ULONG_PTR)InterfaceHeaderDescriptor + InterfaceHeaderDescriptor->bLength), USB_AUDIO_CONTROL_TERMINAL_DESCRIPTOR_TYPE); + while (CommonDescriptor) + { + InputTerminalDescriptor = (PUSB_AUDIO_CONTROL_INPUT_TERMINAL_DESCRIPTOR)CommonDescriptor; + if (InputTerminalDescriptor->bDescriptorSubtype == 0x02 /* INPUT TERMINAL*/) + { + if (InputTerminalDescriptor->wTerminalType == USB_AUDIO_STREAMING_TERMINAL_TYPE) + { + Connections[FilterDescriptor->ConnectionsCount].FromNode = KSFILTER_NODE; + Connections[FilterDescriptor->ConnectionsCount].FromNodePin = StreamingTerminalIndex; + Connections[FilterDescriptor->ConnectionsCount].ToNodePin = 1; + Connections[FilterDescriptor->ConnectionsCount].ToNode = NodeContext[DescriptorCount].Nodes[0]; + FilterDescriptor->ConnectionsCount++; + StreamingTerminalIndex++; + + } + else + { + Connections[FilterDescriptor->ConnectionsCount].FromNode = KSFILTER_NODE; + Connections[FilterDescriptor->ConnectionsCount].FromNodePin = StreamingTerminalPinOffset; + Connections[FilterDescriptor->ConnectionsCount].ToNodePin = 1; + Connections[FilterDescriptor->ConnectionsCount].ToNode = NodeContext[DescriptorCount].Nodes[0]; + FilterDescriptor->ConnectionsCount++; + StreamingTerminalPinOffset++; + } + DescriptorCount++; + } + else if (InputTerminalDescriptor->bDescriptorSubtype == 0x03 /* OUTPUT_TERMINAL*/) + { + OutputTerminalDescriptor = (PUSB_AUDIO_CONTROL_OUTPUT_TERMINAL_DESCRIPTOR)CommonDescriptor; + PreviousNodeContext = FindNodeContextWithId(NodeContext, ControlDescriptorCount, OutputTerminalDescriptor->bSourceID); + if (PreviousNodeContext) + { + Connections[FilterDescriptor->ConnectionsCount].FromNode = PreviousNodeContext->Nodes[PreviousNodeContext->NodeCount - 1]; + Connections[FilterDescriptor->ConnectionsCount].FromNodePin = 0; + Connections[FilterDescriptor->ConnectionsCount].ToNodePin = 1; + Connections[FilterDescriptor->ConnectionsCount].ToNode = NodeContext[DescriptorCount].Nodes[0]; + FilterDescriptor->ConnectionsCount++; + } + + if (InputTerminalDescriptor->wTerminalType == USB_AUDIO_STREAMING_TERMINAL_TYPE) + { + Connections[FilterDescriptor->ConnectionsCount].FromNode = NodeContext[DescriptorCount].Nodes[0]; + Connections[FilterDescriptor->ConnectionsCount].FromNodePin = 0; + Connections[FilterDescriptor->ConnectionsCount].ToNodePin = StreamingTerminalIndex; + Connections[FilterDescriptor->ConnectionsCount].ToNode = KSFILTER_NODE; + FilterDescriptor->ConnectionsCount++; + StreamingTerminalIndex++; + } + else + { + Connections[FilterDescriptor->ConnectionsCount].FromNode = NodeContext[DescriptorCount].Nodes[0]; + Connections[FilterDescriptor->ConnectionsCount].FromNodePin = 0; + Connections[FilterDescriptor->ConnectionsCount].ToNodePin = StreamingTerminalPinOffset; + Connections[FilterDescriptor->ConnectionsCount].ToNode = KSFILTER_NODE; + FilterDescriptor->ConnectionsCount++; + + StreamingTerminalPinOffset++; + } + DescriptorCount++; + } + else if (InputTerminalDescriptor->bDescriptorSubtype == 0x06 /* FEATURE_UNIT*/) + { + FeatureUnitDescriptor = (PUSB_AUDIO_CONTROL_FEATURE_UNIT_DESCRIPTOR)InputTerminalDescriptor; + PreviousNodeContext = FindNodeContextWithId(NodeContext, ControlDescriptorCount, FeatureUnitDescriptor->bSourceID); + if (PreviousNodeContext) + { + Connections[FilterDescriptor->ConnectionsCount].FromNode = PreviousNodeContext->Nodes[PreviousNodeContext->NodeCount-1]; + Connections[FilterDescriptor->ConnectionsCount].FromNodePin = 0; + Connections[FilterDescriptor->ConnectionsCount].ToNodePin = 1; + Connections[FilterDescriptor->ConnectionsCount].ToNode = NodeContext[DescriptorCount].Nodes[0]; + FilterDescriptor->ConnectionsCount++; + } + for (Index = 1; Index < NodeContext[DescriptorCount].NodeCount; Index++) + { + Connections[FilterDescriptor->ConnectionsCount].FromNode = NodeContext[DescriptorCount].Nodes[Index - 1]; + Connections[FilterDescriptor->ConnectionsCount].FromNodePin = 0; + Connections[FilterDescriptor->ConnectionsCount].ToNodePin = 1; + Connections[FilterDescriptor->ConnectionsCount].ToNode = NodeContext[DescriptorCount].Nodes[Index]; + FilterDescriptor->ConnectionsCount++; + } + + DescriptorCount++; + } + else if (InputTerminalDescriptor->bDescriptorSubtype == 0x04 /* MIXER_UNIT */) + { + MixerUnitDescriptor = (PUSB_AUDIO_CONTROL_MIXER_UNIT_DESCRIPTOR)InputTerminalDescriptor; + for (Index = 0; Index < MixerUnitDescriptor->bNrInPins; Index++) + { + Value = MixerUnitDescriptor->baSourceID[Index]; + PreviousNodeContext = FindNodeContextWithId(NodeContext, ControlDescriptorCount, Value); + if (PreviousNodeContext) + { + Connections[FilterDescriptor->ConnectionsCount].FromNode = PreviousNodeContext->Nodes[PreviousNodeContext->NodeCount - 1]; + Connections[FilterDescriptor->ConnectionsCount].FromNodePin = 0; + Connections[FilterDescriptor->ConnectionsCount].ToNodePin = 1; + Connections[FilterDescriptor->ConnectionsCount].ToNode = NodeContext[DescriptorCount].Nodes[Index]; + FilterDescriptor->ConnectionsCount++; + } + + Connections[FilterDescriptor->ConnectionsCount].FromNode = NodeContext[DescriptorCount].Nodes[Index]; + Connections[FilterDescriptor->ConnectionsCount].FromNodePin = 0; + Connections[FilterDescriptor->ConnectionsCount].ToNodePin = 1 + Index; + Connections[FilterDescriptor->ConnectionsCount].ToNode = NodeContext[DescriptorCount].Nodes[NodeContext[DescriptorCount].NodeCount-1]; + FilterDescriptor->ConnectionsCount++; + } + DescriptorCount++; + } + else + { + UNIMPLEMENTED + } + CommonDescriptor = (PUSB_COMMON_DESCRIPTOR)((ULONG_PTR)CommonDescriptor + CommonDescriptor->bLength); + if ((ULONG_PTR)CommonDescriptor >= ((ULONG_PTR)InterfaceHeaderDescriptor + InterfaceHeaderDescriptor->wTotalLength)) + break; + } + } + } + } + + + return STATUS_SUCCESS; }
@@ -400,6 +675,7 @@
VOID +NTAPI CountTerminalUnits( IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, OUT PULONG NonStreamingTerminalDescriptorCount,
Modified: trunk/reactos/drivers/usb/usbaudio/usbaudio.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbaudio/usbaud... ============================================================================== --- trunk/reactos/drivers/usb/usbaudio/usbaudio.h [iso-8859-1] (original) +++ trunk/reactos/drivers/usb/usbaudio/usbaudio.h [iso-8859-1] Sat Oct 15 17:56:44 2016 @@ -155,11 +155,19 @@ PUCHAR Buffer; /* iso buffer*/ ULONG BufferSize; /* iso buffer size */ PUSB_INTERFACE_DESCRIPTOR InterfaceDescriptor; /* interface descriptor */ - WORK_QUEUE_ITEM CaptureWorkItem; /* work item */ - PKSWORKER CaptureWorker; /* capture worker */ - WORK_QUEUE_ITEM StarvationWorkItem; /* work item */ - PKSWORKER StarvationWorker; /* capture worker */ + WORK_QUEUE_ITEM CaptureWorkItem; /* work item */ + PKSWORKER CaptureWorker; /* capture worker */ + WORK_QUEUE_ITEM StarvationWorkItem; /* work item */ + PKSWORKER StarvationWorker; /* capture worker */ }PIN_CONTEXT, *PPIN_CONTEXT; + +typedef struct +{ + PUSB_COMMON_DESCRIPTOR Descriptor; + ULONG NodeCount; + ULONG Nodes[20]; +}NODE_CONTEXT, *PNODE_CONTEXT; +
/* filter.c */
@@ -178,6 +186,13 @@ NTAPI FreeFunction( IN PVOID Item); + +VOID +NTAPI +CountTerminalUnits( + IN PUSB_CONFIGURATION_DESCRIPTOR ConfigurationDescriptor, + OUT PULONG NonStreamingTerminalDescriptorCount, + OUT PULONG TotalTerminalDescriptorCount);
/* usbaudio.c */