mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 06:52:56 +00:00
- Implement IPortWaveRT, IPortFilterWaveRT, IPortPinWaveRT interface for audio drivers >= Vista
svn path=/trunk/; revision=40797
This commit is contained in:
parent
95a4fce528
commit
57f9b71712
8 changed files with 2503 additions and 3 deletions
462
reactos/drivers/wdm/audio/backpln/portcls/filter_wavert.c
Normal file
462
reactos/drivers/wdm/audio/backpln/portcls/filter_wavert.c
Normal file
|
@ -0,0 +1,462 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS Kernel Streaming
|
||||||
|
* FILE: drivers/wdm/audio/backpln/portcls/filter_wavert.c
|
||||||
|
* PURPOSE: portcls wave RT filter
|
||||||
|
* PROGRAMMER: Johannes Anderwald
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "private.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
IPortFilterWaveRTVtbl *lpVtbl;
|
||||||
|
|
||||||
|
LONG ref;
|
||||||
|
|
||||||
|
IPortWaveRT* Port;
|
||||||
|
IPortPinWaveRT ** Pins;
|
||||||
|
SUBDEVICE_DESCRIPTOR * Descriptor;
|
||||||
|
|
||||||
|
}IPortFilterWaveRTImpl;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnQueryInterface(
|
||||||
|
IPortFilterWaveRT* iface,
|
||||||
|
IN REFIID refiid,
|
||||||
|
OUT PVOID* Output)
|
||||||
|
{
|
||||||
|
IPortFilterWaveRTImpl * This = (IPortFilterWaveRTImpl*)iface;
|
||||||
|
|
||||||
|
if (IsEqualGUIDAligned(refiid, &IID_IIrpTarget) ||
|
||||||
|
IsEqualGUIDAligned(refiid, &IID_IUnknown))
|
||||||
|
{
|
||||||
|
*Output = &This->lpVtbl;
|
||||||
|
InterlockedIncrement(&This->ref);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
else if (IsEqualGUIDAligned(refiid, &IID_IPort))
|
||||||
|
{
|
||||||
|
*Output = This->Port;
|
||||||
|
This->Port->lpVtbl->AddRef(This->Port);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnAddRef(
|
||||||
|
IPortFilterWaveRT* iface)
|
||||||
|
{
|
||||||
|
IPortFilterWaveRTImpl * This = (IPortFilterWaveRTImpl*)iface;
|
||||||
|
|
||||||
|
return InterlockedIncrement(&This->ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnRelease(
|
||||||
|
IPortFilterWaveRT* iface)
|
||||||
|
{
|
||||||
|
IPortFilterWaveRTImpl * This = (IPortFilterWaveRTImpl*)iface;
|
||||||
|
|
||||||
|
InterlockedDecrement(&This->ref);
|
||||||
|
|
||||||
|
if (This->ref == 0)
|
||||||
|
{
|
||||||
|
FreeItem(This, TAG_PORTCLASS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return This->ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnNewIrpTarget(
|
||||||
|
IN IPortFilterWaveRT* iface,
|
||||||
|
OUT struct IIrpTarget **OutTarget,
|
||||||
|
IN WCHAR * Name,
|
||||||
|
IN PUNKNOWN Unknown,
|
||||||
|
IN POOL_TYPE PoolType,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp,
|
||||||
|
IN KSOBJECT_CREATE *CreateObject)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
IPortPinWaveRT * Pin;
|
||||||
|
PKSPIN_CONNECT ConnectDetails;
|
||||||
|
IPortFilterWaveRTImpl * This = (IPortFilterWaveRTImpl *)iface;
|
||||||
|
|
||||||
|
ASSERT(This->Port);
|
||||||
|
ASSERT(This->Descriptor);
|
||||||
|
ASSERT(This->Pins);
|
||||||
|
|
||||||
|
DPRINT("IPortFilterWaveRT_fnNewIrpTarget entered\n");
|
||||||
|
|
||||||
|
/* let's verify the connection request */
|
||||||
|
Status = PcValidateConnectRequest(Irp, &This->Descriptor->Factory, &ConnectDetails);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (This->Pins[ConnectDetails->PinId] && This->Descriptor->Factory.Instances[ConnectDetails->PinId].CurrentPinInstanceCount)
|
||||||
|
{
|
||||||
|
/* release existing instance */
|
||||||
|
ASSERT(0);
|
||||||
|
This->Pins[ConnectDetails->PinId]->lpVtbl->Close(This->Pins[ConnectDetails->PinId], DeviceObject, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* now create the pin */
|
||||||
|
Status = NewPortPinWaveRT(&Pin);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* initialize the pin */
|
||||||
|
Status = Pin->lpVtbl->Init(Pin, This->Port, iface, ConnectDetails, &This->Descriptor->Factory.KsPinDescriptor[ConnectDetails->PinId], GetDeviceObjectFromPortWaveRT(This->Port));
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
Pin->lpVtbl->Release(Pin);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* release existing pin */
|
||||||
|
if (This->Pins[ConnectDetails->PinId])
|
||||||
|
{
|
||||||
|
This->Pins[ConnectDetails->PinId]->lpVtbl->Release(This->Pins[ConnectDetails->PinId]);
|
||||||
|
}
|
||||||
|
/* store pin */
|
||||||
|
This->Pins[ConnectDetails->PinId] = Pin;
|
||||||
|
|
||||||
|
/* store result */
|
||||||
|
*OutTarget = (IIrpTarget*)Pin;
|
||||||
|
|
||||||
|
/* increment current instance count */
|
||||||
|
This->Descriptor->Factory.Instances[ConnectDetails->PinId].CurrentPinInstanceCount++;
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnDeviceIoControl(
|
||||||
|
IN IPortFilterWaveRT* iface,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp)
|
||||||
|
{
|
||||||
|
PIO_STACK_LOCATION IoStack;
|
||||||
|
ISubdevice *SubDevice = NULL;
|
||||||
|
SUBDEVICE_DESCRIPTOR * Descriptor;
|
||||||
|
NTSTATUS Status;
|
||||||
|
IPortFilterWaveRTImpl * This = (IPortFilterWaveRTImpl *)iface;
|
||||||
|
|
||||||
|
IoStack = IoGetCurrentIrpStackLocation(Irp);
|
||||||
|
ASSERT(IoStack->Parameters.DeviceIoControl.IoControlCode == IOCTL_KS_PROPERTY);
|
||||||
|
Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&SubDevice);
|
||||||
|
ASSERT(Status == STATUS_SUCCESS);
|
||||||
|
ASSERT(SubDevice != NULL);
|
||||||
|
|
||||||
|
Status = SubDevice->lpVtbl->GetDescriptor(SubDevice, &Descriptor);
|
||||||
|
ASSERT(Status == STATUS_SUCCESS);
|
||||||
|
ASSERT(Descriptor != NULL);
|
||||||
|
|
||||||
|
SubDevice->lpVtbl->Release(SubDevice);
|
||||||
|
|
||||||
|
return PcPropertyHandler(Irp, Descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnRead(
|
||||||
|
IN IPortFilterWaveRT* iface,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp)
|
||||||
|
{
|
||||||
|
return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnWrite(
|
||||||
|
IN IPortFilterWaveRT* iface,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp)
|
||||||
|
{
|
||||||
|
return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnFlush(
|
||||||
|
IN IPortFilterWaveRT* iface,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp)
|
||||||
|
{
|
||||||
|
return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnClose(
|
||||||
|
IN IPortFilterWaveRT* iface,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp)
|
||||||
|
{
|
||||||
|
ULONG Index;
|
||||||
|
IPortFilterWaveRTImpl * This = (IPortFilterWaveRTImpl *)iface;
|
||||||
|
|
||||||
|
for(Index = 0; Index < This->Descriptor->Factory.PinDescriptorCount; Index++)
|
||||||
|
{
|
||||||
|
if (This->Pins[Index])
|
||||||
|
{
|
||||||
|
This->Pins[Index]->lpVtbl->Close(This->Pins[Index], DeviceObject, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
||||||
|
Irp->IoStatus.Information = 0;
|
||||||
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
||||||
|
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnQuerySecurity(
|
||||||
|
IN IPortFilterWaveRT* iface,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp)
|
||||||
|
{
|
||||||
|
return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnSetSecurity(
|
||||||
|
IN IPortFilterWaveRT* iface,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp)
|
||||||
|
{
|
||||||
|
return KsDispatchInvalidDeviceRequest(DeviceObject, Irp);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
BOOLEAN
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnFastDeviceIoControl(
|
||||||
|
IN IPortFilterWaveRT* iface,
|
||||||
|
IN PFILE_OBJECT FileObject,
|
||||||
|
IN BOOLEAN Wait,
|
||||||
|
IN PVOID InputBuffer,
|
||||||
|
IN ULONG InputBufferLength,
|
||||||
|
OUT PVOID OutputBuffer,
|
||||||
|
IN ULONG OutputBufferLength,
|
||||||
|
IN ULONG IoControlCode,
|
||||||
|
OUT PIO_STATUS_BLOCK StatusBlock,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject)
|
||||||
|
{
|
||||||
|
ULONG Index;
|
||||||
|
PKSPROPERTY Property;
|
||||||
|
NTSTATUS Status;
|
||||||
|
ISubdevice * SubDevice = NULL;
|
||||||
|
PSUBDEVICE_DESCRIPTOR Descriptor = NULL;
|
||||||
|
IPortFilterWaveRTImpl * This = (IPortFilterWaveRTImpl *)iface;
|
||||||
|
|
||||||
|
Property = (PKSPROPERTY)InputBuffer;
|
||||||
|
|
||||||
|
if (InputBufferLength < sizeof(KSPROPERTY))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
|
||||||
|
/* get private interface */
|
||||||
|
Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&SubDevice);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
/* get descriptor */
|
||||||
|
Status = SubDevice->lpVtbl->GetDescriptor(SubDevice, &Descriptor);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
SubDevice->lpVtbl->Release(SubDevice);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Index = 0; Index < Descriptor->FilterPropertySet.FreeKsPropertySetOffset; Index++)
|
||||||
|
{
|
||||||
|
if (IsEqualGUIDAligned(&Property->Set, Descriptor->FilterPropertySet.Properties[Index].Set))
|
||||||
|
{
|
||||||
|
FastPropertyHandler(FileObject, (PKSPROPERTY)InputBuffer, InputBufferLength, OutputBuffer, OutputBufferLength, StatusBlock,
|
||||||
|
1,
|
||||||
|
&Descriptor->FilterPropertySet.Properties[Index],
|
||||||
|
Descriptor, SubDevice);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
BOOLEAN
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnFastRead(
|
||||||
|
IN IPortFilterWaveRT* iface,
|
||||||
|
IN PFILE_OBJECT FileObject,
|
||||||
|
IN PLARGE_INTEGER FileOffset,
|
||||||
|
IN ULONG Length,
|
||||||
|
IN BOOLEAN Wait,
|
||||||
|
IN ULONG LockKey,
|
||||||
|
IN PVOID Buffer,
|
||||||
|
OUT PIO_STATUS_BLOCK StatusBlock,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
BOOLEAN
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnFastWrite(
|
||||||
|
IN IPortFilterWaveRT* iface,
|
||||||
|
IN PFILE_OBJECT FileObject,
|
||||||
|
IN PLARGE_INTEGER FileOffset,
|
||||||
|
IN ULONG Length,
|
||||||
|
IN BOOLEAN Wait,
|
||||||
|
IN ULONG LockKey,
|
||||||
|
IN PVOID Buffer,
|
||||||
|
OUT PIO_STATUS_BLOCK StatusBlock,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortFilterWaveRT_fnInit(
|
||||||
|
IN IPortFilterWaveRT* iface,
|
||||||
|
IN IPortWaveRT* Port)
|
||||||
|
{
|
||||||
|
ISubdevice * ISubDevice;
|
||||||
|
SUBDEVICE_DESCRIPTOR * Descriptor;
|
||||||
|
NTSTATUS Status;
|
||||||
|
IPortFilterWaveRTImpl * This = (IPortFilterWaveRTImpl*)iface;
|
||||||
|
|
||||||
|
This->Port = Port;
|
||||||
|
|
||||||
|
/* get our private interface */
|
||||||
|
Status = This->Port->lpVtbl->QueryInterface(This->Port, &IID_ISubdevice, (PVOID*)&ISubDevice);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
|
||||||
|
/* get the subdevice descriptor */
|
||||||
|
Status = ISubDevice->lpVtbl->GetDescriptor(ISubDevice, &Descriptor);
|
||||||
|
|
||||||
|
/* release subdevice interface */
|
||||||
|
ISubDevice->lpVtbl->Release(ISubDevice);
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
|
||||||
|
/* save descriptor */
|
||||||
|
This->Descriptor = Descriptor;
|
||||||
|
|
||||||
|
/* allocate pin array */
|
||||||
|
This->Pins = AllocateItem(NonPagedPool, Descriptor->Factory.PinDescriptorCount * sizeof(IPortPinWaveRT*), TAG_PORTCLASS);
|
||||||
|
|
||||||
|
if (!This->Pins)
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
|
||||||
|
/* increment reference count */
|
||||||
|
Port->lpVtbl->AddRef(Port);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static IPortFilterWaveRTVtbl vt_IPortFilterWaveRT =
|
||||||
|
{
|
||||||
|
IPortFilterWaveRT_fnQueryInterface,
|
||||||
|
IPortFilterWaveRT_fnAddRef,
|
||||||
|
IPortFilterWaveRT_fnRelease,
|
||||||
|
IPortFilterWaveRT_fnNewIrpTarget,
|
||||||
|
IPortFilterWaveRT_fnDeviceIoControl,
|
||||||
|
IPortFilterWaveRT_fnRead,
|
||||||
|
IPortFilterWaveRT_fnWrite,
|
||||||
|
IPortFilterWaveRT_fnFlush,
|
||||||
|
IPortFilterWaveRT_fnClose,
|
||||||
|
IPortFilterWaveRT_fnQuerySecurity,
|
||||||
|
IPortFilterWaveRT_fnSetSecurity,
|
||||||
|
IPortFilterWaveRT_fnFastDeviceIoControl,
|
||||||
|
IPortFilterWaveRT_fnFastRead,
|
||||||
|
IPortFilterWaveRT_fnFastWrite,
|
||||||
|
IPortFilterWaveRT_fnInit
|
||||||
|
};
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NewPortFilterWaveRT(
|
||||||
|
OUT IPortFilterWaveRT ** OutFilter)
|
||||||
|
{
|
||||||
|
IPortFilterWaveRTImpl * This;
|
||||||
|
|
||||||
|
This = AllocateItem(NonPagedPool, sizeof(IPortFilterWaveRTImpl), TAG_PORTCLASS);
|
||||||
|
if (!This)
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
/* initialize IPortFilterWaveRT */
|
||||||
|
This->ref = 1;
|
||||||
|
This->lpVtbl = &vt_IPortFilterWaveRT;
|
||||||
|
|
||||||
|
/* return result */
|
||||||
|
*OutFilter = (IPortFilterWaveRT*)&This->lpVtbl;
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
|
@ -76,3 +76,14 @@ const GUID IID_ISubdevice = {0xB4C90A61, 0x5791, 0x11D0, {0x86, 0xF9, 0x00, 0xA0
|
||||||
const GUID IID_IIrpTarget = {0xB4C90A60, 0x5791, 0x11D0, {0xF9, 0x86, 0x00, 0xA0, 0xC9, 0x11, 0xB5, 0x44}};
|
const GUID IID_IIrpTarget = {0xB4C90A60, 0x5791, 0x11D0, {0xF9, 0x86, 0x00, 0xA0, 0xC9, 0x11, 0xB5, 0x44}};
|
||||||
const GUID IID_IIrpTargetFactory = {0xB4C90A62, 0x5791, 0x11D0, {0xF9, 0x86, 0x00, 0xA0, 0xC9, 0x11, 0xB5, 0x44}};
|
const GUID IID_IIrpTargetFactory = {0xB4C90A62, 0x5791, 0x11D0, {0xF9, 0x86, 0x00, 0xA0, 0xC9, 0x11, 0xB5, 0x44}};
|
||||||
|
|
||||||
|
|
||||||
|
///
|
||||||
|
/// >= Vista GUIDs
|
||||||
|
///
|
||||||
|
const GUID IID_IPortWaveRT = {0x339ff909, 0x68a9, 0x4310, {0xb0, 0x9b, 0x27, 0x4e, 0x96, 0xee, 0x4c, 0xbd}};
|
||||||
|
const GUID IID_IPortWaveRTStream = {0x1809ce5a, 0x64bc, 0x4e62, {0xbd, 0x7d, 0x95, 0xbc, 0xe4, 0x3d, 0xe3, 0x93}};
|
||||||
|
const GUID IID_IMiniportWaveRT = {0x0f9fc4d6, 0x6061, 0x4f3c, {0xb1, 0xfc, 0x7, 0x5e, 0x35, 0xf7, 0x96, 0xa}};
|
||||||
|
const GUID IID_IMiniportWaveRTStream = {0x000ac9ab, 0xfaab, 0x4f3d, {0x94, 0x55, 0x6f, 0xf8, 0x30, 0x6a, 0x74, 0xa0}};
|
||||||
|
const GUID IID_IMiniportWaveRTStreamNotification = {0x23759128, 0x96f1, 0x423b, {0xab, 0x4d, 0x81, 0x63, 0x5b, 0xcf, 0x8c, 0xa1}};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -474,6 +474,50 @@ DECLARE_INTERFACE_(IPortPinWavePci, IIrpTarget)
|
||||||
|
|
||||||
typedef IPortPinWavePci *PPORTPINWAVEPCI;
|
typedef IPortPinWavePci *PPORTPINWAVEPCI;
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* IPortFilterWaveRT
|
||||||
|
*****************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef INTERFACE
|
||||||
|
#define INTERFACE IPortFilterWaveRT
|
||||||
|
|
||||||
|
DECLARE_INTERFACE_(IPortFilterWaveRT, IIrpTarget)
|
||||||
|
{
|
||||||
|
DEFINE_ABSTRACT_UNKNOWN()
|
||||||
|
|
||||||
|
DEFINE_ABSTRACT_IRPTARGET()
|
||||||
|
|
||||||
|
STDMETHOD_(NTSTATUS, Init)(THIS_
|
||||||
|
IN PPORTWAVERT Port)PURE;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef IPortFilterWaveRT *PPORTFILTERWAVERT;
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* IPortPinWavePci
|
||||||
|
*****************************************************************************
|
||||||
|
*/
|
||||||
|
|
||||||
|
#undef INTERFACE
|
||||||
|
#define INTERFACE IPortPinWaveRT
|
||||||
|
|
||||||
|
DECLARE_INTERFACE_(IPortPinWaveRT, IIrpTarget)
|
||||||
|
{
|
||||||
|
DEFINE_ABSTRACT_UNKNOWN()
|
||||||
|
|
||||||
|
DEFINE_ABSTRACT_IRPTARGET()
|
||||||
|
|
||||||
|
STDMETHOD_(NTSTATUS, Init)(THIS_
|
||||||
|
IN PPORTWAVERT Port,
|
||||||
|
IN PPORTFILTERWAVERT Filter,
|
||||||
|
IN KSPIN_CONNECT * ConnectDetails,
|
||||||
|
IN KSPIN_DESCRIPTOR * PinDescriptor,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject) PURE;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef IPortPinWavePci *PPORTPINWAVERT;
|
||||||
|
|
||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* IPortFilterWaveCyclic
|
* IPortFilterWaveCyclic
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
|
|
|
@ -31,9 +31,6 @@ typedef struct
|
||||||
|
|
||||||
IIrpQueue * IrpQueue;
|
IIrpQueue * IrpQueue;
|
||||||
|
|
||||||
PUCHAR ActiveIrpBuffer;
|
|
||||||
ULONG ActiveIrpBufferSize;
|
|
||||||
ULONG ActiveIrpOffset;
|
|
||||||
ULONG FrameSize;
|
ULONG FrameSize;
|
||||||
BOOL Capture;
|
BOOL Capture;
|
||||||
|
|
||||||
|
|
1044
reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c
Normal file
1044
reactos/drivers/wdm/audio/backpln/portcls/pin_wavert.c
Normal file
File diff suppressed because it is too large
Load diff
676
reactos/drivers/wdm/audio/backpln/portcls/port_wavert.c
Normal file
676
reactos/drivers/wdm/audio/backpln/portcls/port_wavert.c
Normal file
|
@ -0,0 +1,676 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS Kernel Streaming
|
||||||
|
* FILE: drivers/wdm/audio/backpln/portcls/port_wavert.c
|
||||||
|
* PURPOSE: WaveRT Port Driver
|
||||||
|
* PROGRAMMER: Johannes Anderwald
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "private.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
IPortWaveRTVtbl *lpVtbl;
|
||||||
|
IPortEventsVtbl *lpVbtlPortEvents;
|
||||||
|
IUnregisterSubdeviceVtbl *lpVtblUnregisterSubdevice;
|
||||||
|
IUnregisterPhysicalConnectionVtbl *lpVtblPhysicalConnection;
|
||||||
|
IPortEventsVtbl *lpVtblPortEvents;
|
||||||
|
ISubdeviceVtbl *lpVtblSubDevice;
|
||||||
|
|
||||||
|
LONG ref;
|
||||||
|
|
||||||
|
BOOL bInitialized;
|
||||||
|
PDEVICE_OBJECT pDeviceObject;
|
||||||
|
PMINIPORTWAVERT pMiniport;
|
||||||
|
PRESOURCELIST pResourceList;
|
||||||
|
PPINCOUNT pPinCount;
|
||||||
|
PPOWERNOTIFY pPowerNotify;
|
||||||
|
PPCFILTER_DESCRIPTOR pDescriptor;
|
||||||
|
PSUBDEVICE_DESCRIPTOR SubDeviceDescriptor;
|
||||||
|
IPortFilterWaveRT * Filter;
|
||||||
|
}IPortWaveRTImpl;
|
||||||
|
|
||||||
|
static GUID InterfaceGuids[3] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
/// KSCATEGORY_RENDER
|
||||||
|
0x65E8773EL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/// KSCATEGORY_CAPTURE
|
||||||
|
0x65E8773DL, 0x8F56, 0x11D0, {0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
/// KS_CATEGORY_AUDIO
|
||||||
|
0x6994AD04, 0x93EF, 0x11D0, {0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
DEFINE_KSPROPERTY_TOPOLOGYSET(PortFilterWaveRTTopologySet, TopologyPropertyHandler);
|
||||||
|
DEFINE_KSPROPERTY_PINPROPOSEDATAFORMAT(PortFilterWaveRTPinSet, PinPropertyHandler, PinPropertyHandler, PinPropertyHandler);
|
||||||
|
|
||||||
|
KSPROPERTY_SET WaveRTPropertySet[] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
&KSPROPSETID_Topology,
|
||||||
|
sizeof(PortFilterWaveRTTopologySet) / sizeof(KSPROPERTY_ITEM),
|
||||||
|
(const KSPROPERTY_ITEM*)&PortFilterWaveRTTopologySet,
|
||||||
|
0,
|
||||||
|
NULL
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&KSPROPSETID_Pin,
|
||||||
|
sizeof(PortFilterWaveRTPinSet) / sizeof(KSPROPERTY_ITEM),
|
||||||
|
(const KSPROPERTY_ITEM*)&PortFilterWaveRTPinSet,
|
||||||
|
0,
|
||||||
|
NULL
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//KSEVENTSETID_LoopedStreaming, Type = KSEVENT_LOOPEDSTREAMING_POSITION
|
||||||
|
//KSEVENTSETID_Connection, Type = KSEVENT_CONNECTION_ENDOFSTREAM,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
static const KSIDENTIFIER Identifiers[] =
|
||||||
|
{
|
||||||
|
{
|
||||||
|
&KSINTERFACESETID_Standard,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
&KSINTERFACESETID_Standard,
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
// IPortEvents
|
||||||
|
//
|
||||||
|
|
||||||
|
static
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortEvents_fnQueryInterface(
|
||||||
|
IPortEvents* iface,
|
||||||
|
IN REFIID refiid,
|
||||||
|
OUT PVOID* Output)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)CONTAINING_RECORD(iface, IPortWaveRTImpl, lpVtblPortEvents);
|
||||||
|
|
||||||
|
DPRINT("IPortEvents_fnQueryInterface entered\n");
|
||||||
|
|
||||||
|
if (IsEqualGUIDAligned(refiid, &IID_IPortEvents) ||
|
||||||
|
IsEqualGUIDAligned(refiid, &IID_IUnknown))
|
||||||
|
{
|
||||||
|
*Output = &This->lpVbtlPortEvents;
|
||||||
|
InterlockedIncrement(&This->ref);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
IPortEvents_fnAddRef(
|
||||||
|
IPortEvents* iface)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)CONTAINING_RECORD(iface, IPortWaveRTImpl, lpVtblPortEvents);
|
||||||
|
DPRINT("IPortEvents_fnQueryInterface entered\n");
|
||||||
|
return InterlockedIncrement(&This->ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
IPortEvents_fnRelease(
|
||||||
|
IPortEvents* iface)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)CONTAINING_RECORD(iface, IPortWaveRTImpl, lpVtblPortEvents);
|
||||||
|
|
||||||
|
DPRINT("IPortEvents_fnRelease entered\n");
|
||||||
|
InterlockedDecrement(&This->ref);
|
||||||
|
|
||||||
|
if (This->ref == 0)
|
||||||
|
{
|
||||||
|
FreeItem(This, TAG_PORTCLASS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* Return new reference count */
|
||||||
|
return This->ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
NTAPI
|
||||||
|
IPortEvents_fnAddEventToEventList(
|
||||||
|
IPortEvents* iface,
|
||||||
|
IN PKSEVENT_ENTRY EventEntry)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
NTAPI
|
||||||
|
IPortEvents_fnGenerateEventList(
|
||||||
|
IPortEvents* iface,
|
||||||
|
IN GUID* Set OPTIONAL,
|
||||||
|
IN ULONG EventId,
|
||||||
|
IN BOOL PinEvent,
|
||||||
|
IN ULONG PinId,
|
||||||
|
IN BOOL NodeEvent,
|
||||||
|
IN ULONG NodeId)
|
||||||
|
{
|
||||||
|
UNIMPLEMENTED
|
||||||
|
}
|
||||||
|
|
||||||
|
static IPortEventsVtbl vt_IPortEvents =
|
||||||
|
{
|
||||||
|
IPortEvents_fnQueryInterface,
|
||||||
|
IPortEvents_fnAddRef,
|
||||||
|
IPortEvents_fnRelease,
|
||||||
|
IPortEvents_fnAddEventToEventList,
|
||||||
|
IPortEvents_fnGenerateEventList
|
||||||
|
};
|
||||||
|
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
// IUnknown interface functions
|
||||||
|
//
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRT_fnQueryInterface(
|
||||||
|
IPortWaveRT* iface,
|
||||||
|
IN REFIID refiid,
|
||||||
|
OUT PVOID* Output)
|
||||||
|
{
|
||||||
|
UNICODE_STRING GuidString;
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)iface;
|
||||||
|
|
||||||
|
if (IsEqualGUIDAligned(refiid, &IID_IPortWaveRT) ||
|
||||||
|
IsEqualGUIDAligned(refiid, &IID_IUnknown))
|
||||||
|
{
|
||||||
|
*Output = &This->lpVtbl;
|
||||||
|
InterlockedIncrement(&This->ref);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
else if (IsEqualGUIDAligned(refiid, &IID_IPortEvents))
|
||||||
|
{
|
||||||
|
*Output = &This->lpVtblPortEvents;
|
||||||
|
InterlockedIncrement(&This->ref);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
else if (IsEqualGUIDAligned(refiid, &IID_ISubdevice))
|
||||||
|
{
|
||||||
|
*Output = &This->lpVtblSubDevice;
|
||||||
|
InterlockedIncrement(&This->ref);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
else if (IsEqualGUIDAligned(refiid, &IID_IPortClsVersion))
|
||||||
|
{
|
||||||
|
return NewPortClsVersion((PPORTCLSVERSION*)Output);
|
||||||
|
}
|
||||||
|
else if (IsEqualGUIDAligned(refiid, &IID_IDrmPort) ||
|
||||||
|
IsEqualGUIDAligned(refiid, &IID_IDrmPort2))
|
||||||
|
{
|
||||||
|
return NewIDrmPort((PDRMPORT2*)Output);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (RtlStringFromGUID(refiid, &GuidString) == STATUS_SUCCESS)
|
||||||
|
{
|
||||||
|
DPRINT1("IPortWaveRT_fnQueryInterface no interface!!! iface %S\n", GuidString.Buffer);
|
||||||
|
RtlFreeUnicodeString(&GuidString);
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRT_fnAddRef(
|
||||||
|
IPortWaveRT* iface)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)iface;
|
||||||
|
|
||||||
|
return InterlockedIncrement(&This->ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRT_fnRelease(
|
||||||
|
IPortWaveRT* iface)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)iface;
|
||||||
|
|
||||||
|
InterlockedDecrement(&This->ref);
|
||||||
|
|
||||||
|
if (This->ref == 0)
|
||||||
|
{
|
||||||
|
if (This->bInitialized)
|
||||||
|
{
|
||||||
|
This->pMiniport->lpVtbl->Release(This->pMiniport);
|
||||||
|
}
|
||||||
|
if (This->pPinCount)
|
||||||
|
This->pPinCount->lpVtbl->Release(This->pPinCount);
|
||||||
|
|
||||||
|
if (This->pPowerNotify)
|
||||||
|
This->pPowerNotify->lpVtbl->Release(This->pPowerNotify);
|
||||||
|
|
||||||
|
FreeItem(This, TAG_PORTCLASS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* Return new reference count */
|
||||||
|
return This->ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
// IPort interface functions
|
||||||
|
//
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRT_fnGetDeviceProperty(
|
||||||
|
IN IPortWaveRT * iface,
|
||||||
|
IN DEVICE_REGISTRY_PROPERTY DeviceRegistryProperty,
|
||||||
|
IN ULONG BufferLength,
|
||||||
|
OUT PVOID PropertyBuffer,
|
||||||
|
OUT PULONG ReturnLength)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)iface;
|
||||||
|
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
|
||||||
|
|
||||||
|
if (!This->bInitialized)
|
||||||
|
{
|
||||||
|
DPRINT("IPortWaveRT_fnNewRegistryKey called w/o initiazed\n");
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return IoGetDeviceProperty(This->pDeviceObject, DeviceRegistryProperty, BufferLength, PropertyBuffer, ReturnLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRT_fnInit(
|
||||||
|
IN IPortWaveRT * iface,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp,
|
||||||
|
IN PUNKNOWN UnknownMiniport,
|
||||||
|
IN PUNKNOWN UnknownAdapter OPTIONAL,
|
||||||
|
IN PRESOURCELIST ResourceList)
|
||||||
|
{
|
||||||
|
IMiniportWaveRT * Miniport;
|
||||||
|
NTSTATUS Status;
|
||||||
|
PPINCOUNT PinCount;
|
||||||
|
PPOWERNOTIFY PowerNotify;
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)iface;
|
||||||
|
|
||||||
|
DPRINT("IPortWaveRT_Init entered %p\n", This);
|
||||||
|
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
|
||||||
|
|
||||||
|
if (This->bInitialized)
|
||||||
|
{
|
||||||
|
DPRINT("IPortWaveRT_Init called again\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = UnknownMiniport->lpVtbl->QueryInterface(UnknownMiniport, &IID_IMiniportWaveRT, (PVOID*)&Miniport);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT("IPortWaveRT_Init called with invalid IMiniport adapter\n");
|
||||||
|
return STATUS_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Initialize port object */
|
||||||
|
This->pMiniport = Miniport;
|
||||||
|
This->pDeviceObject = DeviceObject;
|
||||||
|
This->bInitialized = TRUE;
|
||||||
|
This->pResourceList = ResourceList;
|
||||||
|
|
||||||
|
/* increment reference on miniport adapter */
|
||||||
|
Miniport->lpVtbl->AddRef(Miniport);
|
||||||
|
|
||||||
|
Status = Miniport->lpVtbl->Init(Miniport, UnknownAdapter, ResourceList, iface);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT("IMiniportWaveRT_Init failed with %x\n", Status);
|
||||||
|
Miniport->lpVtbl->Release(Miniport);
|
||||||
|
This->bInitialized = FALSE;
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* get the miniport device descriptor */
|
||||||
|
Status = Miniport->lpVtbl->GetDescription(Miniport, &This->pDescriptor);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT1("failed to get description\n");
|
||||||
|
Miniport->lpVtbl->Release(Miniport);
|
||||||
|
This->bInitialized = FALSE;
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* create the subdevice descriptor */
|
||||||
|
Status = PcCreateSubdeviceDescriptor(&This->SubDeviceDescriptor,
|
||||||
|
3,
|
||||||
|
InterfaceGuids,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
2,
|
||||||
|
WaveRTPropertySet,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
This->pDescriptor);
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
DPRINT1("PcCreateSubdeviceDescriptor failed with %x\n", Status);
|
||||||
|
Miniport->lpVtbl->Release(Miniport);
|
||||||
|
This->bInitialized = FALSE;
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check if it supports IPinCount interface */
|
||||||
|
Status = UnknownMiniport->lpVtbl->QueryInterface(UnknownMiniport, &IID_IPinCount, (PVOID*)&PinCount);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
/* store IPinCount interface */
|
||||||
|
This->pPinCount = PinCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* does the Miniport adapter support IPowerNotify interface*/
|
||||||
|
Status = UnknownMiniport->lpVtbl->QueryInterface(UnknownMiniport, &IID_IPowerNotify, (PVOID*)&PowerNotify);
|
||||||
|
if (NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
/* store reference */
|
||||||
|
This->pPowerNotify = PowerNotify;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* increment reference on resource list */
|
||||||
|
ResourceList->lpVtbl->AddRef(ResourceList);
|
||||||
|
|
||||||
|
|
||||||
|
DPRINT("IPortWaveRT successfully initialized\n");
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRT_fnNewRegistryKey(
|
||||||
|
IN IPortWaveRT * iface,
|
||||||
|
OUT PREGISTRYKEY *OutRegistryKey,
|
||||||
|
IN PUNKNOWN OuterUnknown OPTIONAL,
|
||||||
|
IN ULONG RegistryKeyType,
|
||||||
|
IN ACCESS_MASK DesiredAccess,
|
||||||
|
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
|
||||||
|
IN ULONG CreateOptions OPTIONAL,
|
||||||
|
OUT PULONG Disposition OPTIONAL)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)iface;
|
||||||
|
|
||||||
|
ASSERT_IRQL_EQUAL(PASSIVE_LEVEL);
|
||||||
|
|
||||||
|
if (!This->bInitialized)
|
||||||
|
{
|
||||||
|
DPRINT("IPortWaveRT_fnNewRegistryKey called w/o initialized\n");
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
return PcNewRegistryKey(OutRegistryKey, OuterUnknown, RegistryKeyType, DesiredAccess, This->pDeviceObject, NULL /*FIXME*/, ObjectAttributes, CreateOptions, Disposition);
|
||||||
|
}
|
||||||
|
|
||||||
|
static IPortWaveRTVtbl vt_IPortWaveRTVtbl =
|
||||||
|
{
|
||||||
|
IPortWaveRT_fnQueryInterface,
|
||||||
|
IPortWaveRT_fnAddRef,
|
||||||
|
IPortWaveRT_fnRelease,
|
||||||
|
IPortWaveRT_fnInit,
|
||||||
|
IPortWaveRT_fnGetDeviceProperty,
|
||||||
|
IPortWaveRT_fnNewRegistryKey
|
||||||
|
};
|
||||||
|
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
// ISubdevice interface
|
||||||
|
//
|
||||||
|
|
||||||
|
static
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
ISubDevice_fnQueryInterface(
|
||||||
|
IN ISubdevice *iface,
|
||||||
|
IN REFIID InterfaceId,
|
||||||
|
IN PVOID* Interface)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)CONTAINING_RECORD(iface, IPortWaveRTImpl, lpVtblSubDevice);
|
||||||
|
|
||||||
|
return IPortWaveRT_fnQueryInterface((IPortWaveRT*)This, InterfaceId, Interface);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
ISubDevice_fnAddRef(
|
||||||
|
IN ISubdevice *iface)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)CONTAINING_RECORD(iface, IPortWaveRTImpl, lpVtblSubDevice);
|
||||||
|
|
||||||
|
return IPortWaveRT_fnAddRef((IPortWaveRT*)This);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
ISubDevice_fnRelease(
|
||||||
|
IN ISubdevice *iface)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)CONTAINING_RECORD(iface, IPortWaveRTImpl, lpVtblSubDevice);
|
||||||
|
|
||||||
|
return IPortWaveRT_fnRelease((IPortWaveRT*)This);
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
ISubDevice_fnNewIrpTarget(
|
||||||
|
IN ISubdevice *iface,
|
||||||
|
OUT struct IIrpTarget **OutTarget,
|
||||||
|
IN WCHAR * Name,
|
||||||
|
IN PUNKNOWN Unknown,
|
||||||
|
IN POOL_TYPE PoolType,
|
||||||
|
IN PDEVICE_OBJECT DeviceObject,
|
||||||
|
IN PIRP Irp,
|
||||||
|
IN KSOBJECT_CREATE *CreateObject)
|
||||||
|
{
|
||||||
|
NTSTATUS Status;
|
||||||
|
IPortFilterWaveRT * Filter;
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)CONTAINING_RECORD(iface, IPortWaveRTImpl, lpVtblSubDevice);
|
||||||
|
|
||||||
|
DPRINT("ISubDevice_NewIrpTarget this %p\n", This);
|
||||||
|
|
||||||
|
if (This->Filter)
|
||||||
|
{
|
||||||
|
*OutTarget = (IIrpTarget*)This->Filter;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Status = NewPortFilterWaveRT(&Filter);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = Filter->lpVtbl->Init(Filter, (IPortWaveRT*)This);
|
||||||
|
if (!NT_SUCCESS(Status))
|
||||||
|
{
|
||||||
|
Filter->lpVtbl->Release(Filter);
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
*OutTarget = (IIrpTarget*)Filter;
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
ISubDevice_fnReleaseChildren(
|
||||||
|
IN ISubdevice *iface)
|
||||||
|
{
|
||||||
|
//IPortWaveRTImpl * This = (IPortWaveRTImpl*)CONTAINING_RECORD(iface, IPortWaveRTImpl, lpVtblSubDevice);
|
||||||
|
|
||||||
|
UNIMPLEMENTED
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
ISubDevice_fnGetDescriptor(
|
||||||
|
IN ISubdevice *iface,
|
||||||
|
IN SUBDEVICE_DESCRIPTOR ** Descriptor)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)CONTAINING_RECORD(iface, IPortWaveRTImpl, lpVtblSubDevice);
|
||||||
|
|
||||||
|
ASSERT(This->SubDeviceDescriptor != NULL);
|
||||||
|
|
||||||
|
*Descriptor = This->SubDeviceDescriptor;
|
||||||
|
|
||||||
|
DPRINT("ISubDevice_GetDescriptor this %p desc %p\n", This, This->SubDeviceDescriptor);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
ISubDevice_fnDataRangeIntersection(
|
||||||
|
IN ISubdevice *iface,
|
||||||
|
IN ULONG PinId,
|
||||||
|
IN PKSDATARANGE DataRange,
|
||||||
|
IN PKSDATARANGE MatchingDataRange,
|
||||||
|
IN ULONG OutputBufferLength,
|
||||||
|
OUT PVOID ResultantFormat OPTIONAL,
|
||||||
|
OUT PULONG ResultantFormatLength)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)CONTAINING_RECORD(iface, IPortWaveRTImpl, lpVtblSubDevice);
|
||||||
|
|
||||||
|
DPRINT("ISubDevice_DataRangeIntersection this %p\n", This);
|
||||||
|
|
||||||
|
if (This->pMiniport)
|
||||||
|
{
|
||||||
|
return This->pMiniport->lpVtbl->DataRangeIntersection (This->pMiniport, PinId, DataRange, MatchingDataRange, OutputBufferLength, ResultantFormat, ResultantFormatLength);
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
ISubDevice_fnPowerChangeNotify(
|
||||||
|
IN ISubdevice *iface,
|
||||||
|
IN POWER_STATE PowerState)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)CONTAINING_RECORD(iface, IPortWaveRTImpl, lpVtblSubDevice);
|
||||||
|
|
||||||
|
if (This->pPowerNotify)
|
||||||
|
{
|
||||||
|
This->pPowerNotify->lpVtbl->PowerChangeNotify(This->pPowerNotify, PowerState);
|
||||||
|
}
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
ISubDevice_fnPinCount(
|
||||||
|
IN ISubdevice *iface,
|
||||||
|
IN ULONG PinId,
|
||||||
|
IN OUT PULONG FilterNecessary,
|
||||||
|
IN OUT PULONG FilterCurrent,
|
||||||
|
IN OUT PULONG FilterPossible,
|
||||||
|
IN OUT PULONG GlobalCurrent,
|
||||||
|
IN OUT PULONG GlobalPossible)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl*)CONTAINING_RECORD(iface, IPortWaveRTImpl, lpVtblSubDevice);
|
||||||
|
|
||||||
|
if (This->pPinCount)
|
||||||
|
{
|
||||||
|
This->pPinCount->lpVtbl->PinCount(This->pPinCount, PinId, FilterNecessary, FilterCurrent, FilterPossible, GlobalCurrent, GlobalPossible);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME
|
||||||
|
* scan filter descriptor
|
||||||
|
*/
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ISubdeviceVtbl vt_ISubdeviceVtbl =
|
||||||
|
{
|
||||||
|
ISubDevice_fnQueryInterface,
|
||||||
|
ISubDevice_fnAddRef,
|
||||||
|
ISubDevice_fnRelease,
|
||||||
|
ISubDevice_fnNewIrpTarget,
|
||||||
|
ISubDevice_fnReleaseChildren,
|
||||||
|
ISubDevice_fnGetDescriptor,
|
||||||
|
ISubDevice_fnDataRangeIntersection,
|
||||||
|
ISubDevice_fnPowerChangeNotify,
|
||||||
|
ISubDevice_fnPinCount
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
///--------------------------------------------------------------
|
||||||
|
PMINIPORTWAVERT
|
||||||
|
GetWaveRTMiniport(
|
||||||
|
IN IPortWaveRT* iface)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl *)iface;
|
||||||
|
return This->pMiniport;
|
||||||
|
}
|
||||||
|
|
||||||
|
PDEVICE_OBJECT
|
||||||
|
GetDeviceObjectFromPortWaveRT(
|
||||||
|
PPORTWAVERT iface)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This = (IPortWaveRTImpl *)iface;
|
||||||
|
return This->pDeviceObject;
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------
|
||||||
|
// IPortWaveRT constructor
|
||||||
|
//
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NewPortWaveRT(
|
||||||
|
OUT PPORT* OutPort)
|
||||||
|
{
|
||||||
|
IPortWaveRTImpl * This;
|
||||||
|
|
||||||
|
This = AllocateItem(NonPagedPool, sizeof(IPortWaveRTImpl), TAG_PORTCLASS);
|
||||||
|
if (!This)
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
This->lpVtbl = &vt_IPortWaveRTVtbl;
|
||||||
|
This->lpVtblSubDevice = &vt_ISubdeviceVtbl;
|
||||||
|
This->lpVtblPortEvents = &vt_IPortEvents;
|
||||||
|
This->ref = 1;
|
||||||
|
*OutPort = (PPORT)(&This->lpVtbl);
|
||||||
|
|
||||||
|
DPRINT("NewPortWaveRT %p\n", *OutPort);
|
||||||
|
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
|
247
reactos/drivers/wdm/audio/backpln/portcls/port_wavertstream.c
Normal file
247
reactos/drivers/wdm/audio/backpln/portcls/port_wavertstream.c
Normal file
|
@ -0,0 +1,247 @@
|
||||||
|
/*
|
||||||
|
* COPYRIGHT: See COPYING in the top level directory
|
||||||
|
* PROJECT: ReactOS Kernel Streaming
|
||||||
|
* FILE: drivers/wdm/audio/backpln/portcls/port_wavertstream.c
|
||||||
|
* PURPOSE: WaveRTStream helper object
|
||||||
|
* PROGRAMMER: Johannes Anderwald
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "private.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
IPortWaveRTStreamVtbl *lpVtbl;
|
||||||
|
LONG ref;
|
||||||
|
|
||||||
|
}IPortWaveRTStreamImpl;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
NTSTATUS
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRTStream_fnQueryInterface(
|
||||||
|
IPortWaveRTStream* iface,
|
||||||
|
IN REFIID refiid,
|
||||||
|
OUT PVOID* Output)
|
||||||
|
{
|
||||||
|
IPortWaveRTStreamImpl * This = (IPortWaveRTStreamImpl*)iface;
|
||||||
|
|
||||||
|
DPRINT("IPortWaveRTStream_fnQueryInterface entered\n");
|
||||||
|
|
||||||
|
if (IsEqualGUIDAligned(refiid, &IID_IPortWaveRTStream) ||
|
||||||
|
IsEqualGUIDAligned(refiid, &IID_IUnknown))
|
||||||
|
{
|
||||||
|
*Output = &This->lpVtbl;
|
||||||
|
InterlockedIncrement(&This->ref);
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
return STATUS_UNSUCCESSFUL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRTStream_fnAddRef(
|
||||||
|
IPortWaveRTStream* iface)
|
||||||
|
{
|
||||||
|
IPortWaveRTStreamImpl * This = (IPortWaveRTStreamImpl*)iface;
|
||||||
|
DPRINT("IPortWaveRTStream_fnAddRef entered\n");
|
||||||
|
|
||||||
|
return InterlockedIncrement(&This->ref);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRTStream_fnRelease(
|
||||||
|
IPortWaveRTStream* iface)
|
||||||
|
{
|
||||||
|
IPortWaveRTStreamImpl * This = (IPortWaveRTStreamImpl*)iface;
|
||||||
|
|
||||||
|
InterlockedDecrement(&This->ref);
|
||||||
|
|
||||||
|
DPRINT("IPortWaveRTStream_fnRelease entered %u\n", This->ref);
|
||||||
|
|
||||||
|
if (This->ref == 0)
|
||||||
|
{
|
||||||
|
FreeItem(This, TAG_PORTCLASS);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* Return new reference count */
|
||||||
|
return This->ref;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
PMDL
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRTStream_fnAllocatePagesForMdl(
|
||||||
|
IN IPortWaveRTStream* iface,
|
||||||
|
IN PHYSICAL_ADDRESS HighAddress,
|
||||||
|
IN SIZE_T TotalBytes)
|
||||||
|
{
|
||||||
|
return MmAllocatePagesForMdl(RtlConvertUlongToLargeInteger(0), HighAddress, RtlConvertUlongToLargeInteger(0), TotalBytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
PMDL
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRTStream_fnAllocateContiguousPagesForMdl(
|
||||||
|
IN IPortWaveRTStream* iface,
|
||||||
|
IN PHYSICAL_ADDRESS LowAddress,
|
||||||
|
IN PHYSICAL_ADDRESS HighAddress,
|
||||||
|
IN SIZE_T TotalBytes)
|
||||||
|
{
|
||||||
|
PMDL Mdl;
|
||||||
|
PVOID Buffer;
|
||||||
|
PHYSICAL_ADDRESS Address;
|
||||||
|
|
||||||
|
Buffer = MmAllocateContiguousMemorySpecifyCache(TotalBytes, LowAddress, HighAddress, RtlConvertUlongToLargeInteger(0), MmNonCached);
|
||||||
|
if (!Buffer)
|
||||||
|
{
|
||||||
|
DPRINT1("MmAllocateContiguousMemorySpecifyCache failed\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
Address = MmGetPhysicalAddress(Buffer);
|
||||||
|
|
||||||
|
MmFreeContiguousMemorySpecifyCache(Buffer, TotalBytes, MmNonCached);
|
||||||
|
|
||||||
|
Mdl = MmAllocatePagesForMdl(Address, HighAddress, RtlConvertUlongToLargeInteger(0), TotalBytes);
|
||||||
|
if (!Mdl)
|
||||||
|
{
|
||||||
|
DPRINT1("MmAllocatePagesForMdl failed\n");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MmGetMdlByteCount(Mdl) < TotalBytes)
|
||||||
|
{
|
||||||
|
MmFreePagesFromMdl(Mdl);
|
||||||
|
ExFreePool(Mdl);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
PVOID
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRTStream_fnMapAllocatedPages(
|
||||||
|
IN IPortWaveRTStream* iface,
|
||||||
|
IN PMDL MemoryDescriptorList,
|
||||||
|
IN MEMORY_CACHING_TYPE CacheType)
|
||||||
|
{
|
||||||
|
return MmMapLockedPagesSpecifyCache(MemoryDescriptorList, KernelMode, CacheType, NULL, 0, NormalPagePriority);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRTStream_fnUnmapAllocatedPages(
|
||||||
|
IN IPortWaveRTStream* iface,
|
||||||
|
IN PVOID BaseAddress,
|
||||||
|
IN PMDL MemoryDescriptorList)
|
||||||
|
{
|
||||||
|
MmUnmapLockedPages(BaseAddress, MemoryDescriptorList);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
VOID
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRTStream_fnFreePagesFromMdl(
|
||||||
|
IN IPortWaveRTStream* iface,
|
||||||
|
IN PMDL MemoryDescriptorList)
|
||||||
|
{
|
||||||
|
MmFreePagesFromMdl(MemoryDescriptorList);
|
||||||
|
ExFreePool(MemoryDescriptorList);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
ULONG
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRTStream_fnGetPhysicalPagesCount(
|
||||||
|
IN IPortWaveRTStream* iface,
|
||||||
|
IN PMDL MemoryDescriptorList)
|
||||||
|
{
|
||||||
|
return ADDRESS_AND_SIZE_TO_SPAN_PAGES(0, MmGetMdlByteCount(MemoryDescriptorList));
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @implemented
|
||||||
|
*/
|
||||||
|
static
|
||||||
|
PHYSICAL_ADDRESS
|
||||||
|
NTAPI
|
||||||
|
IPortWaveRTStream_fnGetPhysicalPageAddress(
|
||||||
|
IN IPortWaveRTStream* iface,
|
||||||
|
IN PMDL MemoryDescriptorList,
|
||||||
|
IN ULONG Index)
|
||||||
|
{
|
||||||
|
PVOID Buffer;
|
||||||
|
ULONG Pages;
|
||||||
|
|
||||||
|
Pages = ADDRESS_AND_SIZE_TO_SPAN_PAGES(0, MmGetMdlByteCount(MemoryDescriptorList));
|
||||||
|
if (Pages <= Index)
|
||||||
|
{
|
||||||
|
DPRINT1("OutOfBounds: Pages %u Index %u\n", Pages, Index);
|
||||||
|
return RtlConvertUlongToLargeInteger(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
Buffer = UlongToPtr(PtrToUlong(MmGetSystemAddressForMdl(MemoryDescriptorList)) + Index * PAGE_SIZE);
|
||||||
|
return MmGetPhysicalAddress(Buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static IPortWaveRTStreamVtbl vt_PortWaveRTStream =
|
||||||
|
{
|
||||||
|
IPortWaveRTStream_fnQueryInterface,
|
||||||
|
IPortWaveRTStream_fnAddRef,
|
||||||
|
IPortWaveRTStream_fnRelease,
|
||||||
|
IPortWaveRTStream_fnAllocatePagesForMdl,
|
||||||
|
IPortWaveRTStream_fnAllocateContiguousPagesForMdl,
|
||||||
|
IPortWaveRTStream_fnMapAllocatedPages,
|
||||||
|
IPortWaveRTStream_fnUnmapAllocatedPages,
|
||||||
|
IPortWaveRTStream_fnFreePagesFromMdl,
|
||||||
|
IPortWaveRTStream_fnGetPhysicalPagesCount,
|
||||||
|
IPortWaveRTStream_fnGetPhysicalPageAddress
|
||||||
|
};
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NewPortWaveRTStream(
|
||||||
|
PPORTWAVERTSTREAM *OutStream)
|
||||||
|
{
|
||||||
|
IPortWaveRTStreamImpl* This = AllocateItem(NonPagedPool, sizeof(IPortWaveRTStreamImpl), TAG_PORTCLASS);
|
||||||
|
if (!This)
|
||||||
|
return STATUS_INSUFFICIENT_RESOURCES;
|
||||||
|
|
||||||
|
This->ref = 1;
|
||||||
|
This->lpVtbl = &vt_PortWaveRTStream;
|
||||||
|
|
||||||
|
*OutStream = (PPORTWAVERTSTREAM)&This->lpVtbl;
|
||||||
|
return STATUS_SUCCESS;
|
||||||
|
}
|
|
@ -109,6 +109,25 @@ PMINIPORTWAVEPCI
|
||||||
GetWavePciMiniport(
|
GetWavePciMiniport(
|
||||||
PPORTWAVEPCI Port);
|
PPORTWAVEPCI Port);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NewPortFilterWaveRT(
|
||||||
|
OUT IPortFilterWaveRT ** OutFilter);
|
||||||
|
|
||||||
|
NTSTATUS NewPortPinWaveRT(
|
||||||
|
OUT IPortPinWaveRT ** OutPin);
|
||||||
|
|
||||||
|
PMINIPORTWAVERT
|
||||||
|
GetWaveRTMiniport(
|
||||||
|
IN IPortWaveRT* iface);
|
||||||
|
|
||||||
|
PDEVICE_OBJECT
|
||||||
|
GetDeviceObjectFromPortWaveRT(
|
||||||
|
IPortWaveRT* iface);
|
||||||
|
|
||||||
|
NTSTATUS
|
||||||
|
NewPortWaveRTStream(
|
||||||
|
PPORTWAVERTSTREAM *OutStream);
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
NTAPI
|
NTAPI
|
||||||
NewDispatchObject(
|
NewDispatchObject(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue