2009-03-04 21:13:10 +00:00
|
|
|
/*
|
|
|
|
* PROJECT: ReactOS Kernel Streaming Mixer
|
|
|
|
* LICENSE: GPL - See COPYING in the top level directory
|
|
|
|
* FILE: drivers/wdm/audio/filters/kmixer/kmixer.c
|
|
|
|
* PURPOSE: Pin functions
|
|
|
|
* PROGRAMMERS: Johannes Anderwald (janderwald@reactos.org)
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "kmixer.h"
|
|
|
|
|
2009-03-05 13:50:54 +00:00
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
|
|
|
Pin_fnDeviceIoControl(
|
|
|
|
PDEVICE_OBJECT DeviceObject,
|
|
|
|
PIRP Irp)
|
|
|
|
{
|
|
|
|
DPRINT1("Pin_fnDeviceIoControl called DeviceObject %p Irp %p\n", DeviceObject);
|
|
|
|
|
|
|
|
//TODO
|
|
|
|
// silverblade
|
|
|
|
// Perform Sample Rate Conversion
|
|
|
|
// Stream Mixing
|
|
|
|
// Up/down sampling
|
|
|
|
|
|
|
|
Irp->IoStatus.Information = 0;
|
|
|
|
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
|
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
|
|
return STATUS_UNSUCCESSFUL;
|
|
|
|
}
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
|
|
|
Pin_fnRead(
|
|
|
|
PDEVICE_OBJECT DeviceObject,
|
|
|
|
PIRP Irp)
|
|
|
|
{
|
|
|
|
DPRINT1("Pin_fnRead called DeviceObject %p Irp %p\n", DeviceObject);
|
2009-03-04 21:13:10 +00:00
|
|
|
|
2009-03-05 13:50:54 +00:00
|
|
|
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
|
|
|
Irp->IoStatus.Information = 0;
|
|
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
|
|
return STATUS_UNSUCCESSFUL;
|
|
|
|
}
|
2009-03-04 21:13:10 +00:00
|
|
|
|
|
|
|
NTSTATUS
|
2009-03-05 13:50:54 +00:00
|
|
|
NTAPI
|
|
|
|
PinWriteCompletionRoutine(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN PIRP Irp,
|
|
|
|
IN PVOID Context)
|
|
|
|
{
|
|
|
|
PIRP CIrp = (PIRP)Context;
|
|
|
|
|
|
|
|
CIrp->IoStatus.Status = STATUS_SUCCESS;
|
|
|
|
CIrp->IoStatus.Information = 0;
|
|
|
|
IoCompleteRequest(CIrp, IO_NO_INCREMENT);
|
2009-03-04 21:13:10 +00:00
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
2009-03-05 13:50:54 +00:00
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
|
|
|
Pin_fnWrite(
|
|
|
|
PDEVICE_OBJECT DeviceObject,
|
|
|
|
PIRP Irp)
|
|
|
|
{
|
|
|
|
DPRINT1("Pin_fnWrite called DeviceObject %p Irp %p\n", DeviceObject);
|
|
|
|
|
|
|
|
|
|
|
|
Irp->IoStatus.Information = 0;
|
|
|
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
|
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
|
|
|
Pin_fnFlush(
|
|
|
|
PDEVICE_OBJECT DeviceObject,
|
|
|
|
PIRP Irp)
|
|
|
|
{
|
|
|
|
DPRINT1("Pin_fnFlush called DeviceObject %p Irp %p\n", DeviceObject);
|
|
|
|
|
|
|
|
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
|
|
|
Irp->IoStatus.Information = 0;
|
|
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
|
|
return STATUS_UNSUCCESSFUL;
|
|
|
|
}
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
|
|
|
Pin_fnClose(
|
|
|
|
PDEVICE_OBJECT DeviceObject,
|
|
|
|
PIRP Irp)
|
|
|
|
{
|
|
|
|
DPRINT1("Pin_fnClose called DeviceObject %p Irp %p\n", DeviceObject);
|
|
|
|
|
|
|
|
Irp->IoStatus.Status = STATUS_SUCCESS;
|
|
|
|
Irp->IoStatus.Information = 0;
|
|
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
|
|
return STATUS_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
|
|
|
Pin_fnQuerySecurity(
|
|
|
|
PDEVICE_OBJECT DeviceObject,
|
|
|
|
PIRP Irp)
|
|
|
|
{
|
|
|
|
DPRINT1("Pin_fnQuerySecurity called DeviceObject %p Irp %p\n", DeviceObject);
|
|
|
|
|
|
|
|
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
|
|
|
Irp->IoStatus.Information = 0;
|
|
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
|
|
return STATUS_UNSUCCESSFUL;
|
|
|
|
}
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
NTAPI
|
|
|
|
Pin_fnSetSecurity(
|
|
|
|
PDEVICE_OBJECT DeviceObject,
|
|
|
|
PIRP Irp)
|
|
|
|
{
|
|
|
|
|
|
|
|
DPRINT1("Pin_fnSetSecurity called DeviceObject %p Irp %p\n", DeviceObject);
|
|
|
|
|
|
|
|
Irp->IoStatus.Status = STATUS_UNSUCCESSFUL;
|
|
|
|
Irp->IoStatus.Information = 0;
|
|
|
|
IoCompleteRequest(Irp, IO_NO_INCREMENT);
|
|
|
|
return STATUS_UNSUCCESSFUL;
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOLEAN
|
|
|
|
NTAPI
|
|
|
|
Pin_fnFastDeviceIoControl(
|
|
|
|
PFILE_OBJECT FileObject,
|
|
|
|
BOOLEAN Wait,
|
|
|
|
PVOID InputBuffer,
|
|
|
|
ULONG InputBufferLength,
|
|
|
|
PVOID OutputBuffer,
|
|
|
|
ULONG OutputBufferLength,
|
|
|
|
ULONG IoControlCode,
|
|
|
|
PIO_STATUS_BLOCK IoStatus,
|
|
|
|
PDEVICE_OBJECT DeviceObject)
|
|
|
|
{
|
|
|
|
DPRINT1("Pin_fnFastDeviceIoControl called DeviceObject %p Irp %p\n", DeviceObject);
|
|
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOLEAN
|
|
|
|
NTAPI
|
|
|
|
Pin_fnFastRead(
|
|
|
|
PFILE_OBJECT FileObject,
|
|
|
|
PLARGE_INTEGER FileOffset,
|
|
|
|
ULONG Length,
|
|
|
|
BOOLEAN Wait,
|
|
|
|
ULONG LockKey,
|
|
|
|
PVOID Buffer,
|
|
|
|
PIO_STATUS_BLOCK IoStatus,
|
|
|
|
PDEVICE_OBJECT DeviceObject)
|
|
|
|
{
|
|
|
|
DPRINT1("Pin_fnFastRead called DeviceObject %p Irp %p\n", DeviceObject);
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
BOOLEAN
|
|
|
|
NTAPI
|
|
|
|
Pin_fnFastWrite(
|
|
|
|
PFILE_OBJECT FileObject,
|
|
|
|
PLARGE_INTEGER FileOffset,
|
|
|
|
ULONG Length,
|
|
|
|
BOOLEAN Wait,
|
|
|
|
ULONG LockKey,
|
|
|
|
PVOID Buffer,
|
|
|
|
PIO_STATUS_BLOCK IoStatus,
|
|
|
|
PDEVICE_OBJECT DeviceObject)
|
|
|
|
{
|
|
|
|
DPRINT1("Pin_fnFastWrite called DeviceObject %p Irp %p\n", DeviceObject);
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
static KSDISPATCH_TABLE PinTable =
|
|
|
|
{
|
|
|
|
Pin_fnDeviceIoControl,
|
|
|
|
Pin_fnRead,
|
|
|
|
Pin_fnWrite,
|
|
|
|
Pin_fnFlush,
|
|
|
|
Pin_fnClose,
|
|
|
|
Pin_fnQuerySecurity,
|
|
|
|
Pin_fnSetSecurity,
|
|
|
|
Pin_fnFastDeviceIoControl,
|
|
|
|
Pin_fnFastRead,
|
|
|
|
Pin_fnFastWrite,
|
|
|
|
};
|
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
CreatePin(
|
|
|
|
IN PIRP Irp)
|
|
|
|
{
|
|
|
|
NTSTATUS Status;
|
|
|
|
KSOBJECT_HEADER ObjectHeader;
|
|
|
|
|
|
|
|
/* allocate object header */
|
|
|
|
Status = KsAllocateObjectHeader(&ObjectHeader, 0, NULL, Irp, &PinTable);
|
|
|
|
return Status;
|
|
|
|
}
|
2009-03-04 21:13:10 +00:00
|
|
|
|
|
|
|
void * calloc(size_t Elements, size_t ElementSize)
|
|
|
|
{
|
|
|
|
PVOID Block = ExAllocatePool(NonPagedPool, Elements * ElementSize);
|
|
|
|
if (Block)
|
|
|
|
RtlZeroMemory(Block, Elements * ElementSize);
|
|
|
|
|
|
|
|
return Block;
|
|
|
|
}
|
|
|
|
|
|
|
|
void free(PVOID Block)
|
|
|
|
{
|
|
|
|
ExFreePool(Block);
|
|
|
|
}
|
|
|
|
|
|
|
|
void *memset(
|
|
|
|
void* dest,
|
|
|
|
int c,
|
|
|
|
size_t count)
|
|
|
|
{
|
|
|
|
RtlFillMemory(dest, count, c);
|
|
|
|
return dest;
|
|
|
|
}
|
|
|
|
|
|
|
|
void * memcpy(
|
|
|
|
void* dest,
|
|
|
|
const void* src,
|
|
|
|
size_t count)
|
|
|
|
{
|
|
|
|
RtlCopyMemory(dest, src, count);
|
|
|
|
return dest;
|
|
|
|
}
|
|
|
|
|
|
|
|
void *memmove(
|
|
|
|
void* dest,
|
|
|
|
const void* src,
|
|
|
|
size_t count)
|
|
|
|
{
|
|
|
|
RtlMoveMemory(dest, src, count);
|
|
|
|
return dest;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|