[USBAUDIO]
[reactos.git] / reactos / drivers / usb / usbaudio / filter.c
index e2cbdd9..a1af3ea 100644 (file)
@@ -25,9 +25,7 @@ GUID NodeTypeSubwoofer = { STATIC_KSNODETYPE_LOW_FREQUENCY_EFFECTS_SPEAKER };
 GUID NodeTypeCapture = { STATIC_PINNAME_CAPTURE };
 GUID NodeTypePlayback = { STATIC_KSCATEGORY_AUDIO };
 GUID GUID_KSCATEGORY_AUDIO = { STATIC_KSCATEGORY_AUDIO };
-GUID GUID_KSDATAFORMAT_TYPE_AUDIO = { STATIC_KSDATAFORMAT_TYPE_AUDIO };
-GUID GUID_KSDATAFORMAT_SUBTYPE_PCM = { STATIC_KSDATAFORMAT_SUBTYPE_PCM };
-GUID GUID_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX = { STATIC_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX };
+
 KSPIN_INTERFACE StandardPinInterface =
 {
      {STATIC_KSINTERFACESETID_Standard},
@@ -107,7 +105,39 @@ USBAudioFilterCreate(
     PKSFILTER Filter,
     PIRP Irp)
 {
-    UNIMPLEMENTED
+    PKSFILTERFACTORY FilterFactory;
+    PKSDEVICE Device;
+    PFILTER_CONTEXT FilterContext;
+
+    FilterFactory = KsGetParent(Filter);
+    if (FilterFactory == NULL)
+    {
+        /* invalid parameter */
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    Device = KsGetParent(FilterFactory);
+    if (Device == NULL)
+    {
+        /* invalid parameter */
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* alloc filter context */
+    FilterContext = AllocFunction(sizeof(FILTER_CONTEXT));
+    if (FilterContext == NULL)
+    {
+        /* no memory */
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    /* init context */
+    FilterContext->DeviceExtension = Device->Context;
+    FilterContext->LowerDevice = Device->NextDeviceObject;
+    Filter->Context = FilterContext;
+
+    DPRINT("USBAudioFilterCreate FilterContext %p LowerDevice %p DeviceExtension %p\n", FilterContext, FilterContext->LowerDevice, FilterContext->DeviceExtension);
+    KsAddItemToObjectBag(Filter->Bag, FilterContext, ExFreePool);
     return STATUS_SUCCESS;
 }
 
@@ -336,9 +366,9 @@ UsbAudioGetDataRanges(
                     }
 
                     DataRangeAudio->DataRange.FormatSize = sizeof(KSDATARANGE_AUDIO);
-                    DataRangeAudio->DataRange.MajorFormat = GUID_KSDATAFORMAT_TYPE_AUDIO;
-                    DataRangeAudio->DataRange.SubFormat = GUID_KSDATAFORMAT_SUBTYPE_PCM;
-                    DataRangeAudio->DataRange.Specifier = GUID_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX;
+                    DataRangeAudio->DataRange.MajorFormat = KSDATAFORMAT_TYPE_AUDIO;
+                    DataRangeAudio->DataRange.SubFormat = KSDATAFORMAT_SUBTYPE_PCM;
+                    DataRangeAudio->DataRange.Specifier = KSDATAFORMAT_SPECIFIER_WAVEFORMATEX;
                     DataRangeAudio->MaximumChannels = 1;
                     DataRangeAudio->MinimumBitsPerSample = StreamingFormatDescriptor->bBitResolution;
                     DataRangeAudio->MaximumBitsPerSample = StreamingFormatDescriptor->bBitResolution;
@@ -420,6 +450,7 @@ USBAudioPinBuildDescriptors(
 
             /* irp sinks / sources can be instantiated */
             Pins[Index].InstancesPossible = 1;
+            Pins[Index].InstancesNecessary = 1;
         }
         else
         {