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.c?rev=72973&r1=72972&r2=72973&view=diff
==============================================================================
--- 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/usbaudio.h?rev=72973&r1=72972&r2=72973&view=diff
==============================================================================
--- 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 */
 


Reply via email to