mirror of
https://github.com/reactos/reactos.git
synced 2025-07-31 19:21:38 +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,
|
||||
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;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,9 +1,8 @@
|
|||
/* DO NOT USE THE PRECOMPILED HEADER FOR THIS FILE! */
|
||||
|
||||
//#include <wdm.h>
|
||||
#include <portcls.h>
|
||||
|
||||
#include <initguid.h>
|
||||
#include <portcls.h>
|
||||
#include <wdmguid.h>
|
||||
#include <ksmedia.h>
|
||||
#include <hubbusif.h>
|
||||
|
|
|
@ -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 @@ USBAudioPinSetDataFormat(
|
|||
_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
|
||||
|
|
|
@ -33,28 +33,13 @@ static KSDEVICE_DESCRIPTOR KsDeviceDescriptor = {
|
|||
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
|
||||
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 @@ SubmitUrbSync(
|
|||
// 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 @@ SubmitUrbSync(
|
|||
// 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 @@ USBAudioSelectConfiguration(
|
|||
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 @@ USBAudioSelectConfiguration(
|
|||
}
|
||||
|
||||
/* store configuration handle */
|
||||
DeviceExtension = Device->Context;
|
||||
DeviceExtension->ConfigurationHandle = Urb->UrbSelectConfiguration.ConfigurationHandle;
|
||||
|
||||
/* alloc interface info */
|
||||
|
@ -205,6 +186,9 @@ USBAudioStartDevice(
|
|||
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 @@ USBAudioStartDevice(
|
|||
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 @@ USBAudioStartDevice(
|
|||
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 @@ USBAudioStartDevice(
|
|||
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 @@ USBAudioStartDevice(
|
|||
Status = USBAudioSelectConfiguration(Device, ConfigurationDescriptor);
|
||||
if (NT_SUCCESS(Status))
|
||||
{
|
||||
DeviceExtension = Device->Context;
|
||||
|
||||
DeviceExtension->ConfigurationDescriptor = ConfigurationDescriptor;
|
||||
DeviceExtension->DeviceDescriptor = DeviceDescriptor;
|
||||
}
|
||||
|
|
|
@ -110,6 +110,20 @@ typedef struct __DEVICE_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 */
|
||||
|
||||
NTSTATUS
|
||||
|
@ -130,6 +144,11 @@ FreeFunction(
|
|||
|
||||
/* usbaudio.c */
|
||||
|
||||
NTSTATUS
|
||||
SubmitUrbSync(
|
||||
IN PDEVICE_OBJECT Device,
|
||||
IN PURB Urb);
|
||||
|
||||
NTSTATUS
|
||||
NTAPI
|
||||
USBAudioAddDevice(
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue