mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 09:13:01 +00:00
[USBAUDIO]
- implement USBAudioFilterCreate - partly implement USBAudioPinCreate, USBAudioPinSetDataFormat svn path=/trunk/; revision=72832
This commit is contained in:
parent
96d5ff4d93
commit
8112191cdb
5 changed files with 163 additions and 37 deletions
|
@ -107,7 +107,38 @@ USBAudioFilterCreate(
|
||||||
PKSFILTER Filter,
|
PKSFILTER Filter,
|
||||||
PIRP Irp)
|
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;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,8 @@
|
||||||
/* DO NOT USE THE PRECOMPILED HEADER FOR THIS FILE! */
|
/* DO NOT USE THE PRECOMPILED HEADER FOR THIS FILE! */
|
||||||
|
|
||||||
//#include <wdm.h>
|
//#include <wdm.h>
|
||||||
#include <portcls.h>
|
|
||||||
|
|
||||||
#include <initguid.h>
|
#include <initguid.h>
|
||||||
|
#include <portcls.h>
|
||||||
#include <wdmguid.h>
|
#include <wdmguid.h>
|
||||||
#include <ksmedia.h>
|
#include <ksmedia.h>
|
||||||
#include <hubbusif.h>
|
#include <hubbusif.h>
|
||||||
|
|
|
@ -9,13 +9,45 @@
|
||||||
|
|
||||||
#include "usbaudio.h"
|
#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
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
USBAudioPinCreate(
|
USBAudioPinCreate(
|
||||||
_In_ PKSPIN Pin,
|
_In_ PKSPIN Pin,
|
||||||
_In_ PIRP Irp)
|
_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;
|
return STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -57,10 +89,71 @@ USBAudioPinSetDataFormat(
|
||||||
_In_ const KSDATARANGE* DataRange,
|
_In_ const KSDATARANGE* DataRange,
|
||||||
_In_opt_ const KSATTRIBUTE_LIST* AttributeRange)
|
_In_opt_ const KSATTRIBUTE_LIST* AttributeRange)
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED
|
PURB Urb;
|
||||||
return STATUS_SUCCESS;
|
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
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
|
|
|
@ -33,28 +33,13 @@ static KSDEVICE_DESCRIPTOR KsDeviceDescriptor = {
|
||||||
0
|
0
|
||||||
};
|
};
|
||||||
|
|
||||||
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
|
NTSTATUS
|
||||||
SubmitUrbSync(
|
SubmitUrbSync(
|
||||||
IN PKSDEVICE Device,
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
IN PURB Urb)
|
IN PURB Urb)
|
||||||
{
|
{
|
||||||
PIRP Irp;
|
PIRP Irp;
|
||||||
KEVENT Event;
|
KEVENT Event;
|
||||||
PDEVICE_EXTENSION DeviceExtension;
|
|
||||||
IO_STATUS_BLOCK IoStatus;
|
IO_STATUS_BLOCK IoStatus;
|
||||||
PIO_STACK_LOCATION IoStack;
|
PIO_STACK_LOCATION IoStack;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
@ -62,12 +47,9 @@ SubmitUrbSync(
|
||||||
// init event
|
// init event
|
||||||
KeInitializeEvent(&Event, NotificationEvent, FALSE);
|
KeInitializeEvent(&Event, NotificationEvent, FALSE);
|
||||||
|
|
||||||
// get device extension
|
|
||||||
DeviceExtension = (PDEVICE_EXTENSION)Device->Context;
|
|
||||||
|
|
||||||
// build irp
|
// build irp
|
||||||
Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
|
Irp = IoBuildDeviceIoControlRequest(IOCTL_INTERNAL_USB_SUBMIT_URB,
|
||||||
DeviceExtension->LowerDevice,
|
DeviceObject,
|
||||||
NULL,
|
NULL,
|
||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
|
@ -90,11 +72,8 @@ SubmitUrbSync(
|
||||||
// store urb
|
// store urb
|
||||||
IoStack->Parameters.Others.Argument1 = Urb;
|
IoStack->Parameters.Others.Argument1 = Urb;
|
||||||
|
|
||||||
// set completion routine
|
|
||||||
IoSetCompletionRoutine(Irp, USBAudioCancelCompleteSynch, &Event, TRUE, TRUE, TRUE);
|
|
||||||
|
|
||||||
// call driver
|
// call driver
|
||||||
Status = IoCallDriver(DeviceExtension->LowerDevice, Irp);
|
Status = IoCallDriver(DeviceObject, Irp);
|
||||||
|
|
||||||
// wait for the request to finish
|
// wait for the request to finish
|
||||||
if (Status == STATUS_PENDING)
|
if (Status == STATUS_PENDING)
|
||||||
|
@ -169,8 +148,11 @@ USBAudioSelectConfiguration(
|
||||||
return STATUS_INSUFFICIENT_RESOURCES;
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* device extension */
|
||||||
|
DeviceExtension = Device->Context;
|
||||||
|
|
||||||
/* submit configuration urb */
|
/* submit configuration urb */
|
||||||
Status = SubmitUrbSync(Device, Urb);
|
Status = SubmitUrbSync(DeviceExtension->LowerDevice, Urb);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* free resources */
|
/* free resources */
|
||||||
|
@ -180,7 +162,6 @@ USBAudioSelectConfiguration(
|
||||||
}
|
}
|
||||||
|
|
||||||
/* store configuration handle */
|
/* store configuration handle */
|
||||||
DeviceExtension = Device->Context;
|
|
||||||
DeviceExtension->ConfigurationHandle = Urb->UrbSelectConfiguration.ConfigurationHandle;
|
DeviceExtension->ConfigurationHandle = Urb->UrbSelectConfiguration.ConfigurationHandle;
|
||||||
|
|
||||||
/* alloc interface info */
|
/* alloc interface info */
|
||||||
|
@ -205,6 +186,9 @@ USBAudioStartDevice(
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
ULONG Length;
|
ULONG Length;
|
||||||
|
|
||||||
|
/* get device extension */
|
||||||
|
DeviceExtension = Device->Context;
|
||||||
|
|
||||||
/* allocate urb */
|
/* allocate urb */
|
||||||
Urb = AllocFunction(sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
|
Urb = AllocFunction(sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST));
|
||||||
if (!Urb)
|
if (!Urb)
|
||||||
|
@ -226,7 +210,7 @@ USBAudioStartDevice(
|
||||||
UsbBuildGetDescriptorRequest(Urb, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), USB_DEVICE_DESCRIPTOR_TYPE, 0, 0, DeviceDescriptor, NULL, sizeof(USB_DEVICE_DESCRIPTOR), NULL);
|
UsbBuildGetDescriptorRequest(Urb, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), USB_DEVICE_DESCRIPTOR_TYPE, 0, 0, DeviceDescriptor, NULL, sizeof(USB_DEVICE_DESCRIPTOR), NULL);
|
||||||
|
|
||||||
/* submit urb */
|
/* submit urb */
|
||||||
Status = SubmitUrbSync(Device, Urb);
|
Status = SubmitUrbSync(DeviceExtension->LowerDevice, Urb);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* free resources */
|
/* free resources */
|
||||||
|
@ -249,7 +233,7 @@ USBAudioStartDevice(
|
||||||
UsbBuildGetDescriptorRequest(Urb, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0, ConfigurationDescriptor, NULL, sizeof(USB_CONFIGURATION_DESCRIPTOR), NULL);
|
UsbBuildGetDescriptorRequest(Urb, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0, ConfigurationDescriptor, NULL, sizeof(USB_CONFIGURATION_DESCRIPTOR), NULL);
|
||||||
|
|
||||||
/* submit urb */
|
/* submit urb */
|
||||||
Status = SubmitUrbSync(Device, Urb);
|
Status = SubmitUrbSync(DeviceExtension->LowerDevice, Urb);
|
||||||
if (!NT_SUCCESS(Status))
|
if (!NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
/* free resources */
|
/* free resources */
|
||||||
|
@ -279,7 +263,7 @@ USBAudioStartDevice(
|
||||||
UsbBuildGetDescriptorRequest(Urb, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0, ConfigurationDescriptor, NULL, Length, NULL);
|
UsbBuildGetDescriptorRequest(Urb, sizeof(struct _URB_CONTROL_DESCRIPTOR_REQUEST), USB_CONFIGURATION_DESCRIPTOR_TYPE, 0, 0, ConfigurationDescriptor, NULL, Length, NULL);
|
||||||
|
|
||||||
/* submit urb */
|
/* submit urb */
|
||||||
Status = SubmitUrbSync(Device, Urb);
|
Status = SubmitUrbSync(DeviceExtension->LowerDevice, Urb);
|
||||||
|
|
||||||
/* free urb */
|
/* free urb */
|
||||||
FreeFunction(Urb);
|
FreeFunction(Urb);
|
||||||
|
@ -298,7 +282,7 @@ USBAudioStartDevice(
|
||||||
Status = USBAudioSelectConfiguration(Device, ConfigurationDescriptor);
|
Status = USBAudioSelectConfiguration(Device, ConfigurationDescriptor);
|
||||||
if (NT_SUCCESS(Status))
|
if (NT_SUCCESS(Status))
|
||||||
{
|
{
|
||||||
DeviceExtension = Device->Context;
|
|
||||||
DeviceExtension->ConfigurationDescriptor = ConfigurationDescriptor;
|
DeviceExtension->ConfigurationDescriptor = ConfigurationDescriptor;
|
||||||
DeviceExtension->DeviceDescriptor = DeviceDescriptor;
|
DeviceExtension->DeviceDescriptor = DeviceDescriptor;
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,6 +110,20 @@ typedef struct __DEVICE_EXTENSION__
|
||||||
|
|
||||||
}DEVICE_EXTENSION, *PDEVICE_EXTENSION;
|
}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 */
|
/* filter.c */
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
|
@ -130,6 +144,11 @@ FreeFunction(
|
||||||
|
|
||||||
/* usbaudio.c */
|
/* usbaudio.c */
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
SubmitUrbSync(
|
||||||
|
IN PDEVICE_OBJECT Device,
|
||||||
|
IN PURB Urb);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
USBAudioAddDevice(
|
USBAudioAddDevice(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue