Author: janderwald
Date: Tue Sep 27 19:20:00 2016
New Revision: 72832

URL: http://svn.reactos.org/svn/reactos?rev=72832&view=rev
Log:
[USBAUDIO]
- implement USBAudioFilterCreate
- partly implement USBAudioPinCreate, USBAudioPinSetDataFormat

Modified:
    trunk/reactos/drivers/usb/usbaudio/filter.c
    trunk/reactos/drivers/usb/usbaudio/guid.c
    trunk/reactos/drivers/usb/usbaudio/pin.c
    trunk/reactos/drivers/usb/usbaudio/usbaudio.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=72832&r1=72831&r2=72832&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/usbaudio/filter.c [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbaudio/filter.c [iso-8859-1] Tue Sep 27 
19:20:00 2016
@@ -107,7 +107,38 @@
     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;
+
+    KsAddItemToObjectBag(Filter->Bag, FilterContext, ExFreePool);
     return STATUS_SUCCESS;
 }
 

Modified: trunk/reactos/drivers/usb/usbaudio/guid.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbaudio/guid.c?rev=72832&r1=72831&r2=72832&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/usbaudio/guid.c   [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbaudio/guid.c   [iso-8859-1] Tue Sep 27 
19:20:00 2016
@@ -1,9 +1,8 @@
 /* DO NOT USE THE PRECOMPILED HEADER FOR THIS FILE! */
 
 //#include <wdm.h>
+#include <initguid.h>
 #include <portcls.h>
-
-#include <initguid.h>
 #include <wdmguid.h>
 #include <ksmedia.h>
 #include <hubbusif.h>

Modified: trunk/reactos/drivers/usb/usbaudio/pin.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbaudio/pin.c?rev=72832&r1=72831&r2=72832&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/usbaudio/pin.c    [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbaudio/pin.c    [iso-8859-1] Tue Sep 27 
19:20:00 2016
@@ -9,13 +9,45 @@
 
 #include "usbaudio.h"
 
+GUID GUID2_KSDATAFORMAT_TYPE_AUDIO = { STATIC_KSDATAFORMAT_TYPE_AUDIO };
+GUID GUID2_KSDATAFORMAT_SUBTYPE_PCM = { STATIC_KSDATAFORMAT_SUBTYPE_PCM };
+GUID GUID2_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX = { 
STATIC_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX };
+
 NTSTATUS
 NTAPI
 USBAudioPinCreate(
     _In_ PKSPIN Pin,
     _In_ PIRP Irp)
 {
-    UNIMPLEMENTED
+    PKSFILTER Filter;
+    PFILTER_CONTEXT FilterContext;
+    PPIN_CONTEXT PinContext;
+
+    Filter = KsPinGetParentFilter(Pin);
+    if (Filter == NULL)
+    {
+        /* invalid parameter */
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* get filter context */
+    FilterContext = Filter->Context;
+
+    /* allocate pin context */
+    PinContext = AllocFunction(sizeof(PIN_CONTEXT));
+    if (!PinContext)
+    {
+        /* no memory*/
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    /* init pin context */
+    PinContext->DeviceExtension = FilterContext->DeviceExtension;
+    PinContext->LowerDevice = FilterContext->LowerDevice;
+
+    /* store pin context*/
+    Pin->Context = PinContext;
+
     return STATUS_SUCCESS;
 }
 
@@ -57,10 +89,71 @@
     _In_ const KSDATARANGE* DataRange,
     _In_opt_ const KSATTRIBUTE_LIST* AttributeRange)
 {
-    UNIMPLEMENTED
-    return STATUS_SUCCESS;
+    PURB Urb;
+    PUCHAR SampleRateBuffer;
+    PPIN_CONTEXT PinContext;
+    NTSTATUS Status;
+    PKSDATAFORMAT_WAVEFORMATEX WaveFormatEx;
+
+    /* allocate sample rate buffer */
+    SampleRateBuffer = AllocFunction(sizeof(ULONG));
+    if (!SampleRateBuffer)
+    {
+        /* no memory */
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    if (IsEqualGUIDAligned(&Pin->ConnectionFormat->MajorFormat, 
&GUID2_KSDATAFORMAT_TYPE_AUDIO) && 
+        IsEqualGUIDAligned(&Pin->ConnectionFormat->SubFormat,  
&GUID2_KSDATAFORMAT_SUBTYPE_PCM) &&
+        IsEqualGUIDAligned(&Pin->ConnectionFormat->Specifier, 
&GUID2_KSDATAFORMAT_SPECIFIER_WAVEFORMATEX))
+    {
+        WaveFormatEx = (PKSDATAFORMAT_WAVEFORMATEX)Pin->ConnectionFormat;
+        SampleRateBuffer[0] = (WaveFormatEx->WaveFormatEx.nSamplesPerSec >> 
16) & 0xFF;
+        SampleRateBuffer[1] = (WaveFormatEx->WaveFormatEx.nSamplesPerSec >> 8) 
& 0xFF;
+        SampleRateBuffer[2] = (WaveFormatEx->WaveFormatEx.nSamplesPerSec >> 0) 
& 0xFF;
+    }
+    else
+    {
+        /* not supported yet*/
+        UNIMPLEMENTED;
+        FreeFunction(SampleRateBuffer);
+        return STATUS_INVALID_PARAMETER;
+    }
+
+    /* allocate urb */
+    Urb = AllocFunction(sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST));
+    if (!Urb)
+    {
+        /* no memory */
+        FreeFunction(SampleRateBuffer);
+        return STATUS_INSUFFICIENT_RESOURCES;
+    }
+
+    /* format urb */
+    UsbBuildVendorRequest(Urb,
+                          URB_FUNCTION_CLASS_ENDPOINT,
+                          sizeof(struct _URB_CONTROL_VENDOR_OR_CLASS_REQUEST),
+                          USBD_TRANSFER_DIRECTION_OUT,
+                          0,
+                          0x01,
+                          0x100,
+                          0x81, //bEndpointAddress
+                          SampleRateBuffer,
+                          NULL,
+                          3,
+                          NULL);
+
+    /* get pin context */
+    PinContext = Pin->Context;
+    DbgBreakPoint();
+    /* submit urb */
+    Status = SubmitUrbSync(PinContext->LowerDevice, Urb);
+
+    DPRINT1("USBAudioPinSetDataFormat Pin %p Status %x\n", Pin, Status);
+    FreeFunction(Urb);
+    FreeFunction(SampleRateBuffer);
+    return Status;
 }
-
 
 NTSTATUS
 NTAPI

Modified: trunk/reactos/drivers/usb/usbaudio/usbaudio.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbaudio/usbaudio.c?rev=72832&r1=72831&r2=72832&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/usbaudio/usbaudio.c       [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbaudio/usbaudio.c       [iso-8859-1] Tue Sep 27 
19:20:00 2016
@@ -34,27 +34,12 @@
 };
 
 NTSTATUS
-NTAPI
-USBAudioCancelCompleteSynch(
-       IN PDEVICE_OBJECT DeviceObject,
-       IN PIRP Irp,
-       IN PVOID Context)
-{
-    /* signal event */
-    KeSetEvent(Context, 0, FALSE);
-
-    /* done */
-    return STATUS_MORE_PROCESSING_REQUIRED;
-}
-
-NTSTATUS
 SubmitUrbSync(
-    IN PKSDEVICE Device,
+    IN PDEVICE_OBJECT DeviceObject,
     IN PURB Urb)
 {
     PIRP Irp;
     KEVENT Event;
-    PDEVICE_EXTENSION DeviceExtension;
     IO_STATUS_BLOCK IoStatus;
     PIO_STACK_LOCATION IoStack;
     NTSTATUS Status;
@@ -62,12 +47,9 @@
     // init event
     KeInitializeEvent(&Event, NotificationEvent, FALSE);
 
-    // get device extension
-    DeviceExtension = (PDEVICE_EXTENSION)Device->Context;
-
     // build irp
     Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
-        DeviceExtension->LowerDevice,
+        DeviceObject,
         NULL,
         0,
         NULL,
@@ -90,11 +72,8 @@
     // store urb
     IoStack->Parameters.Others.Argument1 = Urb;
 
-    // set completion routine
-    IoSetCompletionRoutine(Irp, USBAudioCancelCompleteSynch, &Event, TRUE, 
TRUE, TRUE);
-
     // call driver
-    Status = IoCallDriver(DeviceExtension->LowerDevice, Irp);
+    Status = IoCallDriver(DeviceObject, Irp);
 
     // wait for the request to finish
     if (Status == STATUS_PENDING)
@@ -169,8 +148,11 @@
         return STATUS_INSUFFICIENT_RESOURCES;
     }
 
+    /* device extension */
+    DeviceExtension = Device->Context;
+
     /* submit configuration urb */
-    Status = SubmitUrbSync(Device, Urb);
+    Status = SubmitUrbSync(DeviceExtension->LowerDevice, Urb);
     if (!NT_SUCCESS(Status))
     {
         /* free resources */
@@ -180,7 +162,6 @@
     }
 
     /* store configuration handle */
-    DeviceExtension = Device->Context;
     DeviceExtension->ConfigurationHandle = 
Urb->UrbSelectConfiguration.ConfigurationHandle;
 
     /* alloc interface info */
@@ -205,6 +186,9 @@
     NTSTATUS Status;
     ULONG Length;
 
+    /* get device extension */
+    DeviceExtension = Device->Context;
+
     /* allocate urb */
     Urb = AllocFunction(sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
     if (!Urb)
@@ -226,7 +210,7 @@
     UsbBuildGetDescriptorRequest(Urb, sizeof(struct 
_URB_CONTROL_DESCRIPTOR_REQUEST), USB_DEVICE_DESCRIPTOR_TYPE, 0, 0, 
DeviceDescriptor, NULL, sizeof(USB_DEVICE_DESCRIPTOR), NULL);
 
     /* submit urb */
-    Status = SubmitUrbSync(Device, Urb);
+    Status = SubmitUrbSync(DeviceExtension->LowerDevice, Urb);
     if (!NT_SUCCESS(Status))
     {
         /* free resources */
@@ -249,7 +233,7 @@
     UsbBuildGetDescriptorRequest(Urb, sizeof(struct 
_URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0, 
ConfigurationDescriptor, NULL, sizeof(USB_CONFIGURATION_DESCRIPTOR), NULL);
 
     /* submit urb */
-    Status = SubmitUrbSync(Device, Urb);
+    Status = SubmitUrbSync(DeviceExtension->LowerDevice, Urb);
     if (!NT_SUCCESS(Status))
     {
         /* free resources */
@@ -279,7 +263,7 @@
     UsbBuildGetDescriptorRequest(Urb, sizeof(struct 
_URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0, 
ConfigurationDescriptor, NULL, Length, NULL);
 
     /* submit urb */
-    Status = SubmitUrbSync(Device, Urb);
+    Status = SubmitUrbSync(DeviceExtension->LowerDevice, Urb);
 
     /* free urb */
     FreeFunction(Urb);
@@ -298,7 +282,7 @@
     Status = USBAudioSelectConfiguration(Device, ConfigurationDescriptor);
     if (NT_SUCCESS(Status))
     {
-        DeviceExtension = Device->Context;
+
         DeviceExtension->ConfigurationDescriptor = ConfigurationDescriptor;
         DeviceExtension->DeviceDescriptor = DeviceDescriptor;
     }

Modified: trunk/reactos/drivers/usb/usbaudio/usbaudio.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/usb/usbaudio/usbaudio.h?rev=72832&r1=72831&r2=72832&view=diff
==============================================================================
--- trunk/reactos/drivers/usb/usbaudio/usbaudio.h       [iso-8859-1] (original)
+++ trunk/reactos/drivers/usb/usbaudio/usbaudio.h       [iso-8859-1] Tue Sep 27 
19:20:00 2016
@@ -110,6 +110,20 @@
 
 }DEVICE_EXTENSION, *PDEVICE_EXTENSION;
 
+typedef struct
+{
+    PDEVICE_EXTENSION DeviceExtension;                           /* device 
extension */
+    PDEVICE_OBJECT LowerDevice;                                  /* lower 
device*/
+
+}FILTER_CONTEXT, *PFILTER_CONTEXT;
+
+typedef struct
+{
+       PDEVICE_EXTENSION DeviceExtension;                           /* device 
extension */
+       PDEVICE_OBJECT LowerDevice;                                  /* lower 
device*/
+
+}PIN_CONTEXT, *PPIN_CONTEXT;
+
 /* filter.c */
 
 NTSTATUS
@@ -129,6 +143,11 @@
     IN PVOID Item);
 
 /* usbaudio.c */
+
+NTSTATUS
+SubmitUrbSync(
+    IN PDEVICE_OBJECT Device,
+    IN PURB Urb);
 
 NTSTATUS
 NTAPI


Reply via email to