diff --git a/reactos/drivers/multimedia/README b/reactos/drivers/multimedia/README new file mode 100755 index 00000000000..4df801d5618 --- /dev/null +++ b/reactos/drivers/multimedia/README @@ -0,0 +1,53 @@ +This is a directory for the kernel streaming components, along with multimedia +kernel-mode drivers. + +Much of this code exists only as stubs for future implementation. + +The "include" directory exists as a place to store the KS related headers. It +should be moved to the main include tree later. + +Andrew Greenwood +3rd December, 2006 + + +== Kernel Streaming (KS.SYS) == + +Deals with streaming media. This is the core component for this, and can be +interacted with from usermode (usually via DirectX.) + +XP and DirectX 8 versions of this component provide an additional suite of +AvStream API functions. + +COM-style interfaces are used with this component. + + +== SysAudio (SYSAUDIO.SYS) == + +Filter graph builder (deals with topology.) Not sure what this does yet. + + +== Port Class (PORTCLS.SYS) == + +Used by WDM audio drivers, this handles many common tasks required for +audio drivers. + +COM-style interfaces are used with this component. + + +== WDM Audio (WDMAUD.DLL / WDMAUD.SYS) == + +Effectively a relay from usermode to kernelmode, the usermode portion is a +MME-style driver (for WINMM.DLL) which tells the kernelmode portion what to do. + +This typically involves interacting with KS.SYS in some way. + +In Vista, the kernelmode portion is no longer present and the usermode portion +interacts with the Vista audio stack (which resides in usermode but also +ultimately ends up going back into kernelmode in the end!) + + +== Optional drivers == + +- sndblst Sound Blaster (+ Pro / 16) compatible driver +- mpu401 MPU-401 MIDI compatible driver + diff --git a/reactos/drivers/multimedia/audio/directory.rbuild b/reactos/drivers/multimedia/audio/directory.rbuild new file mode 100644 index 00000000000..365934a279b --- /dev/null +++ b/reactos/drivers/multimedia/audio/directory.rbuild @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/reactos/drivers/multimedia/audio/mpu401/mpu401.c b/reactos/drivers/multimedia/audio/mpu401/mpu401.c new file mode 100644 index 00000000000..cebd2f3e2b5 --- /dev/null +++ b/reactos/drivers/multimedia/audio/mpu401/mpu401.c @@ -0,0 +1,408 @@ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: services/dd/mpu401/mpu401.c + * PURPOSE: MPU-401 MIDI device driver + * PROGRAMMER: Andrew Greenwood + * UPDATE HISTORY: + * Sept 26, 2003: Copied from beep.c as template + * Sept 27, 2003: Implemented MPU-401 init & playback + */ + +/* INCLUDES ****************************************************************/ + +#include +//#include + +//#define NDEBUG +#include + +#include "mpu401.h" + + +/* INTERNAL VARIABLES ******************************************************/ + +ULONG DeviceCount = 0; + + +/* FUNCTIONS ***************************************************************/ + +static NTSTATUS InitDevice( + IN PUNICODE_STRING RegistryPath, + IN PVOID Context) +{ +// PDEVICE_INSTANCE Instance = Context; + PDEVICE_OBJECT DeviceObject; // = Context; + PDEVICE_EXTENSION Parameters; // = DeviceObject->DeviceExtension; + UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\MidiOut0"); + UNICODE_STRING SymlinkName = RTL_CONSTANT_STRING(L"\\??\\MidiOut0"); +// CONFIG Config; + RTL_QUERY_REGISTRY_TABLE Table[2]; + NTSTATUS s; + + // This is TEMPORARY, to ensure that we don't process more than 1 device. + // I'll remove this limitation in the future. + if (DeviceCount > 0) + { + DPRINT("Sorry - only 1 device supported by MPU401 driver at present :(\n"); + return STATUS_NOT_IMPLEMENTED; + } + + DPRINT("Creating IO device\n"); + + s = IoCreateDevice(Context, // driverobject + sizeof(DEVICE_EXTENSION), + &DeviceName, + FILE_DEVICE_SOUND, // Correct? + 0, + FALSE, + &DeviceObject); + + if (!NT_SUCCESS(s)) + return s; + + DPRINT("Device Extension at 0x%x\n", DeviceObject->DeviceExtension); + Parameters = DeviceObject->DeviceExtension; + + DPRINT("Creating DOS link\n"); + + /* Create the dos device link */ + IoCreateSymbolicLink(&SymlinkName, + &DeviceName); + + DPRINT("Initializing device\n"); + +// DPRINT("Allocating memory for parameters structure\n"); + // Bodged: +// Parameters = (PDEVICE_EXTENSION)ExAllocatePool(NonPagedPool, sizeof(DEVICE_EXTENSION)); +// DeviceObject->DeviceExtension = Parameters; +// Parameters = Instance->DriverObject->DriverExtension; + + DPRINT("DeviceObject at 0x%x, DeviceExtension at 0x%x\n", DeviceObject, Parameters); + + if (! Parameters) + { + DPRINT("NULL POINTER!\n"); + return STATUS_INSUFFICIENT_RESOURCES; + } + +// Instance->DriverObject->DriverExtension = Parameters; + + DPRINT("Setting reg path\n"); + Parameters->RegistryPath = RegistryPath; +// Parameters->DriverObject = Instance->DriverObject; + + DPRINT("Zeroing table memory and setting query routine\n"); + RtlZeroMemory(Table, sizeof(Table)); + Table[0].QueryRoutine = LoadSettings; + + DPRINT("Setting port and IRQ defaults\n"); + Parameters->Port = DEFAULT_PORT; + Parameters->IRQ = DEFAULT_IRQ; + +// Only to be enabled once we can get support for multiple cards working :) +/* + DPRINT("Loading settings from: %S\n", RegistryPath); + + s = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, RegistryPath, Table, + &Parameters, NULL); +*/ + + if (! NT_SUCCESS(s)) + return s; + + DPRINT("Port 0x%x IRQ %d\n", Parameters->Port, Parameters->IRQ); + +// Instance->P + + // Enter UART mode (should be done in init phase + if (! InitUARTMode(Parameters->Port)) + { + DPRINT("UART mode initialization FAILED!\n"); + // Set state indication somehow + // Failure - what error code do we give?! + // return STATUS_???? + } + + DeviceCount ++; + + return STATUS_SUCCESS; +} + + +static NTSTATUS STDCALL +MPU401Create(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +/* + * FUNCTION: Handles user mode requests + * ARGUMENTS: + * DeviceObject = Device for request + * Irp = I/O request packet describing request + * RETURNS: Success or failure + */ +{ + DPRINT("MPU401Create() called!\n"); + + // Initialize the MPU-401? + // ... do stuff ... + + + // Play a note to say we're alive: + WaitToSend(MPU401_PORT); + MPU401_WRITE_DATA(MPU401_PORT, 0x90); + WaitToSend(MPU401_PORT); + MPU401_WRITE_DATA(MPU401_PORT, 0x50); + WaitToSend(MPU401_PORT); + MPU401_WRITE_DATA(MPU401_PORT, 0x7f); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + + return(STATUS_SUCCESS); +} + + +static NTSTATUS STDCALL +MPU401Close(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +/* + * FUNCTION: Handles user mode requests + * ARGUMENTS: + * DeviceObject = Device for request + * Irp = I/O request packet describing request + * RETURNS: Success or failure + */ +{ + PDEVICE_EXTENSION DeviceExtension; + NTSTATUS Status; + + DPRINT("MPU401Close() called!\n"); + + DeviceExtension = DeviceObject->DeviceExtension; + + Status = STATUS_SUCCESS; + + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + + return(Status); +} + + +static NTSTATUS STDCALL +MPU401Cleanup(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +/* + * FUNCTION: Handles user mode requests + * ARGUMENTS: + * DeviceObject = Device for request + * Irp = I/O request packet describing request + * RETURNS: Success or failure + */ +{ + ULONG Channel; + DPRINT("MPU401Cleanup() called!\n"); + + // Reset the device (should we do this?) + for (Channel = 0; Channel <= 15; Channel ++) + { + // All notes off +// MPU401_WRITE_MESSAGE(MPU401_PORT, 0xb0 + Channel, 123, 0); + // All controllers off +// MPU401_WRITE_MESSAGE(MPU401_PORT, 0xb0 + Channel, 121, 0); + } + + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + + return(STATUS_SUCCESS); +} + + +static NTSTATUS STDCALL +MPU401DeviceControl(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +/* + * FUNCTION: Handles user mode requests + * ARGUMENTS: + * DeviceObject = Device for request + * Irp = I/O request packet describing request + * RETURNS: Success or failure + */ +{ + PIO_STACK_LOCATION Stack; + PDEVICE_EXTENSION DeviceExtension; + ULONG ByteCount; + PUCHAR Data; + + DPRINT("MPU401DeviceControl() called!\n"); + + DeviceExtension = DeviceObject->DeviceExtension; + Stack = IoGetCurrentIrpStackLocation(Irp); + + DPRINT("Control code %d [0x%x]\n", Stack->Parameters.DeviceIoControl.IoControlCode, + Stack->Parameters.DeviceIoControl.IoControlCode); + + switch(Stack->Parameters.DeviceIoControl.IoControlCode) + { + case IOCTL_MIDI_PLAY : + { + DPRINT("Received IOCTL_MIDI_PLAY\n"); + Data = (PUCHAR) Irp->AssociatedIrp.SystemBuffer; + + DPRINT("Sending %d bytes of MIDI data to 0x%d:\n", Stack->Parameters.DeviceIoControl.InputBufferLength, DeviceExtension->Port); + + for (ByteCount = 0; ByteCount < Stack->Parameters.DeviceIoControl.InputBufferLength; ByteCount ++) + { + DPRINT("0x%x ", Data[ByteCount]); + + MPU401_WRITE_BYTE(DeviceExtension->Port, Data[ByteCount]); +// if (WaitToSend(MPU401_PORT)) +// MPU401_WRITE_DATA(MPU401_PORT, Data[ByteCount]); + } + + Irp->IoStatus.Status = STATUS_SUCCESS; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return(STATUS_SUCCESS); + } + } + + return(STATUS_SUCCESS); + +/* + DeviceExtension = DeviceObject->DeviceExtension; + Stack = IoGetCurrentIrpStackLocation(Irp); + BeepParam = (PBEEP_SET_PARAMETERS)Irp->AssociatedIrp.SystemBuffer; + + Irp->IoStatus.Information = 0; + + if (Stack->Parameters.DeviceIoControl.IoControlCode != IOCTL_BEEP_SET) + { + Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + return(STATUS_NOT_IMPLEMENTED); + } + + if ((Stack->Parameters.DeviceIoControl.InputBufferLength != sizeof(BEEP_SET_PARAMETERS)) + || (BeepParam->Frequency < BEEP_FREQUENCY_MINIMUM) + || (BeepParam->Frequency > BEEP_FREQUENCY_MAXIMUM)) + { + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + return(STATUS_INVALID_PARAMETER); + } + + DueTime.QuadPart = 0; +*/ + /* do the beep!! */ +/* DPRINT("Beep:\n Freq: %lu Hz\n Dur: %lu ms\n", + pbsp->Frequency, + pbsp->Duration); + + if (BeepParam->Duration >= 0) + { + DueTime.QuadPart = (LONGLONG)BeepParam->Duration * -10000; + + KeSetTimer(&DeviceExtension->Timer, + DueTime, + &DeviceExtension->Dpc); + + HalMakeBeep(BeepParam->Frequency); + DeviceExtension->BeepOn = TRUE; + KeWaitForSingleObject(&DeviceExtension->Event, + Executive, + KernelMode, + FALSE, + NULL); + } + else if (BeepParam->Duration == (DWORD)-1) + { + if (DeviceExtension->BeepOn == TRUE) + { + HalMakeBeep(0); + DeviceExtension->BeepOn = FALSE; + } + else + { + HalMakeBeep(BeepParam->Frequency); + DeviceExtension->BeepOn = TRUE; + } + } + + DPRINT("Did the beep!\n"); + + Irp->IoStatus.Status = STATUS_SUCCESS; + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + return(STATUS_SUCCESS); +*/ +} + + +static VOID STDCALL +MPU401Unload(PDRIVER_OBJECT DriverObject) +{ + DPRINT("MPU401Unload() called!\n"); +} + + +NTSTATUS STDCALL +DriverEntry(PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath) +/* + * FUNCTION: Called by the system to initalize the driver + * ARGUMENTS: + * DriverObject = object describing this driver + * RegistryPath = path to our configuration entries + * RETURNS: Success or failure + */ +{ +// PDEVICE_EXTENSION DeviceExtension; +// PDEVICE_OBJECT DeviceObject; +// DEVICE_INSTANCE Instance; + // Doesn't support multiple instances (yet ...) + NTSTATUS Status; + + DPRINT("MPU401 Device Driver 0.0.1\n"); + + // Is this really necessary? Yes! (Talking to myself again...) +// Instance.DriverObject = DriverObject; + // previous instance = NULL... + +// DeviceExtension->RegistryPath = RegistryPath; + + DriverObject->Flags = 0; + DriverObject->MajorFunction[IRP_MJ_CREATE] = MPU401Create; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = MPU401Close; + DriverObject->MajorFunction[IRP_MJ_CLEANUP] = MPU401Cleanup; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = MPU401DeviceControl; + DriverObject->DriverUnload = MPU401Unload; + + // Major hack to just get this damn thing working: + Status = InitDevice(RegistryPath, DriverObject); // ???? + +// DPRINT("Enumerating devices at %wZ\n", RegistryPath); + +// Status = EnumDeviceKeys(RegistryPath, PARMS_SUBKEY, InitDevice, (PVOID)&DeviceObject); // &Instance; + + // check error + + /* set up device extension */ +// DeviceExtension = DeviceObject->DeviceExtension; +// DeviceExtension->BeepOn = FALSE; + + return(STATUS_SUCCESS); +} + +/* EOF */ diff --git a/reactos/drivers/multimedia/audio/mpu401/mpu401.h b/reactos/drivers/multimedia/audio/mpu401/mpu401.h new file mode 100644 index 00000000000..630cd7ac392 --- /dev/null +++ b/reactos/drivers/multimedia/audio/mpu401/mpu401.h @@ -0,0 +1,155 @@ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: services/dd/mpu401/mpu401.h + * PURPOSE: MPU-401 MIDI device driver header + * PROGRAMMER: Andrew Greenwood + * UPDATE HISTORY: + * Sept 26, 2003: Created + */ + +#ifndef __INCLUDES_MPU401_H__ +#define __INCLUDES_MPU401_H__ + +//#include +//#include +//#include +#include "../../../dll/win32/mmdrv/mmdef.h" + +#define DEFAULT_PORT 0x330 +#define DEFAULT_IRQ 9 + +#define DEVICE_SUBKEY L"Devices" +#define PARMS_SUBKEY L"Parameters" + +#define REGISTRY_PORT L"Port" + +// At the moment, we just support a single device with fixed parameters: +#define MPU401_PORT DEFAULT_PORT +#define MPU401_IRQ DEFAULT_IRQ + +#define MPU401_TIMEOUT 10000 + +/* OBSOLETE - see mmdef.h instead: +#define IOCTL_SOUND_BASE FILE_DEVICE_SOUND +// wave base 0 +#define IOCTL_MIDI_BASE 0x0080 + +#define IOCTL_MIDI_GET_CAPABILITIES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0001, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_MIDI_SET_STATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0002, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_MIDI_GET_STATE CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0003, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_MIDI_SET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0004, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_MIDI_GET_VOLUME CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0005, METHOD_BUFFERED, FILE_READ_ACCESS) +#define IOCTL_MIDI_PLAY CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0006, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_MIDI_RECORD CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0007, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_MIDI_CACHE_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0008, METHOD_BUFFERED, FILE_WRITE_ACCESS) +#define IOCTL_MIDI_CACHE_DRUM_PATCHES CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0009, METHOD_BUFFERED, FILE_WRITE_ACCESS) +*/ + +// The MPU-401 has 2 ports, usually 0x330 and 0x331, which are known as +// "data" and "status/command", respectively. These macros deal with +// reading from and writing to these ports: + +#define MPU401_WRITE_DATA(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp, x) +#define MPU401_READ_DATA(bp) READ_PORT_UCHAR((PUCHAR) bp) +#define MPU401_WRITE_COMMAND(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+1, x) +#define MPU401_READ_STATUS(bp) READ_PORT_UCHAR((PUCHAR) bp+1) + + +// Flow control + +#define MPU401_READY_TO_SEND(bp) \ + MPU401_READ_STATUS(bp) & 0x80 + +#define MPU401_READY_TO_RECEIVE(bp) \ + MPU401_READ_STATUS(bp) & 0x40 + + +#define MPU401_WRITE_BYTE(bp, x) \ + if (WaitToSend(bp)) MPU401_WRITE_DATA(bp, x) + +#define MPU401_WRITE_MESSAGE(bp, status, da, db) \ + MPU401_WRITE(bp, status); \ + MPU401_WRITE(bp, da); \ + MPU401_WRITE(bp, db) + +//#define MPU401_READ(bp) +// if (WaitToRead(bp)) ... ??? + +/* + DEVICE_EXTENSION contains the settings for each individual device +*/ + +typedef struct _DEVICE_EXTENSION +{ + PUNICODE_STRING RegistryPath; + PDRIVER_OBJECT DriverObject; + ULONG Port; + ULONG IRQ; +// KDPC Dpc; +// KTIMER Timer; +// KEVENT Event; +// BOOLEAN BeepOn; +} DEVICE_EXTENSION, *PDEVICE_EXTENSION; + +/* + DEVICE_INSTANCE contains ??? +*/ + +typedef struct _DEVICE_INSTANCE +{ + // pPrevGDI + PDRIVER_OBJECT DriverObject; +} DEVICE_INSTANCE, *PDEVICE_INSTANCE; + +/* + CONFIG contains device parameters (port/IRQ) + THIS STRUCTURE IS REDUNDANT +*/ + +//typedef struct _CONFIG +//{ +// ULONG Port; +// ULONG IRQ; +//} CONFIG, *PCONFIG; + +/* + Some callback typedefs +*/ + +typedef NTSTATUS REGISTRY_CALLBACK_ROUTINE(PWSTR RegistryPath, PVOID Context); +typedef REGISTRY_CALLBACK_ROUTINE *PREGISTRY_CALLBACK_ROUTINE; + + +/* + Prototypes for functions in portio.c : +*/ + +BOOLEAN WaitToSend(ULONG BasePort); +BOOLEAN WaitToReceive(ULONG BasePort); +BOOLEAN InitUARTMode(ULONG BasePort); + +/* + Prototypes for functions in settings.c : +*/ + +NTSTATUS STDCALL EnumDeviceKeys( + IN PUNICODE_STRING RegistryPath, + IN PWSTR SubKey, + IN PREGISTRY_CALLBACK_ROUTINE Callback, + IN PVOID Context); + +NTSTATUS STDCALL LoadSettings( + IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext); + +NTSTATUS STDCALL +DriverEntry(PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath); + +#endif diff --git a/reactos/drivers/multimedia/audio/mpu401/mpu401.rbuild b/reactos/drivers/multimedia/audio/mpu401/mpu401.rbuild new file mode 100644 index 00000000000..9c924d3959e --- /dev/null +++ b/reactos/drivers/multimedia/audio/mpu401/mpu401.rbuild @@ -0,0 +1,10 @@ + + . + + ntoskrnl + hal + mpu401.c + portio.c + settings.c + mpu401.rc + diff --git a/reactos/drivers/multimedia/audio/mpu401/mpu401.rc b/reactos/drivers/multimedia/audio/mpu401/mpu401.rc new file mode 100644 index 00000000000..45f6374e2df --- /dev/null +++ b/reactos/drivers/multimedia/audio/mpu401/mpu401.rc @@ -0,0 +1,7 @@ +/* $Id$ */ + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "MPU-401 MIDI Driver\0" +#define REACTOS_STR_INTERNAL_NAME "mpu401\0" +#define REACTOS_STR_ORIGINAL_FILENAME "mpu401.sys\0" +#include diff --git a/reactos/drivers/multimedia/audio/mpu401/portio.c b/reactos/drivers/multimedia/audio/mpu401/portio.c new file mode 100644 index 00000000000..5f540c43eda --- /dev/null +++ b/reactos/drivers/multimedia/audio/mpu401/portio.c @@ -0,0 +1,96 @@ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: services/dd/mpu401/portio.c (see also mpu401.h) + * PURPOSE: MPU-401 MIDI port I/O helper + * PROGRAMMER: Andrew Greenwood + * UPDATE HISTORY: + * Sept 26, 2003: Created + */ + +#include +#include "mpu401.h" + + +BOOLEAN WaitToSend(ULONG BasePort) +{ + int TimeOut; + + DbgPrint("WaitToSend "); + + // Check if it's OK to send + for (TimeOut = MPU401_TIMEOUT; + ! MPU401_READY_TO_SEND(BasePort) && TimeOut > 0; + TimeOut --); + + // If a time-out occurs, we report failure + if (! TimeOut) + { + DbgPrint("FAILED\n"); + return FALSE; + } + + DbgPrint("SUCCEEDED\n"); + + return TRUE; +} + + +BOOLEAN WaitToReceive(ULONG BasePort) +{ + int TimeOut; + + DbgPrint("WaitToSend "); + + // Check if it's OK to receive + for (TimeOut = MPU401_TIMEOUT; + ! MPU401_READY_TO_RECEIVE(BasePort) && TimeOut > 0; + TimeOut --); + + // If a time-out occurs, we report failure + if (! TimeOut) + { + DbgPrint("FAILED\n"); + return FALSE; + } + + DbgPrint("SUCCEEDED\n"); + + return TRUE; +} + + +BOOLEAN InitUARTMode(ULONG BasePort) +{ + ULONG TimeOut; + UCHAR Status = 0; + + DbgPrint("InitUARTMode() called\n"); + + // Check if it's OK to send + if (! WaitToSend(BasePort)) + return FALSE; + + DbgPrint("Resetting MPU401\n"); + + // Send an MPU reset: + MPU401_WRITE_COMMAND(BasePort, 0xff); + + // Check if it's OK to receive (some cards will ignore the above reset + // command and so will not issue an ACK, so time out is NOT an error) + DbgPrint("Waiting for an ACK\n"); + if (WaitToReceive(BasePort)) + { + // Check to make sure the reset was acknowledged: + for (TimeOut = MPU401_TIMEOUT; + (Status = (MPU401_READ_DATA(BasePort) & 0xfe) && TimeOut > 0); + TimeOut --); + } + + DbgPrint("Entering UART mode\n"); + // Now we kick the MPU401 into UART ("dumb") mode + MPU401_WRITE_COMMAND(BasePort, 0x3f); + + return TRUE; +} diff --git a/reactos/drivers/multimedia/audio/mpu401/readme.txt b/reactos/drivers/multimedia/audio/mpu401/readme.txt new file mode 100644 index 00000000000..5a59256f737 --- /dev/null +++ b/reactos/drivers/multimedia/audio/mpu401/readme.txt @@ -0,0 +1,28 @@ +---------------------------------- +REACTOS MPU-401 MIDI DEVICE DRIVER +by Andrew Greenwood +---------------------------------- + +This driver initializes the MPU-401 MIDI/joystick port found on +most sound cards, and allows the sending of simple messages. + +It's far from complete, and at present will only support 1 device. + +In Bochs, the MIDI output will be played using whatever device is +set up in Windows as your MIDI output. + +For real hardware, the output will be played to whatever device is +attached to your MIDI/joystick port, or, in some cases, the wave-table +or other synth on-board your card (note: this is NOT an FM synth +driver!) + + +Thanks to Vizzini and all the other great ReactOS developers for +helping me code this driver and also for giving me encouragement. + +I'd also like to thank Jeff Glatt, whose MIDI and MPU-401 +documentation has been a valuable resource to me over the past few +years, and who provided me with almost all of my knowledge of MIDI +and MPU-401. His site is at: www.borg.com/~jglatt/ + +- Andrew "Silver Blade" Greenwood diff --git a/reactos/drivers/multimedia/audio/mpu401/sbdebug.h b/reactos/drivers/multimedia/audio/mpu401/sbdebug.h new file mode 100644 index 00000000000..1ec5e32ba5d --- /dev/null +++ b/reactos/drivers/multimedia/audio/mpu401/sbdebug.h @@ -0,0 +1,24 @@ +#ifndef NDEBUG +#define TEST_STATUS(s) \ + if (! NT_SUCCESS(s)) \ + { \ + if (s == STATUS_NO_MORE_ENTRIES) \ + DPRINT("NTSTATUS == NO MORE ENTRIES\n") \ + else if (s == STATUS_BUFFER_OVERFLOW) \ + DPRINT("NTSTATUS == BUFFER OVERFLOW\n") \ + else if (s == STATUS_BUFFER_TOO_SMALL) \ + DPRINT("NTSTATUS == BUFFER TOO SMALL\n") \ + else if (s == STATUS_INVALID_PARAMETER) \ + DPRINT("NTSTATUS == INVALID PARAMETER\n") \ + else if (s == STATUS_OBJECT_NAME_NOT_FOUND) \ + DPRINT("NTSTATUS == OBJECT NAME NOT FOUND\n") \ + else if (s == STATUS_INVALID_HANDLE) \ + DPRINT("NTATATUS == INVALID_HANDLE\n") \ + else if (s == STATUS_ACCESS_DENIED) \ + DPRINT("NTSTATUS == ACCESS_DENIED\n") \ + else \ + DPRINT("NTSTATUS == FAILURE (?)\n"); \ + } +#else +#define TEST_STATUS(s) +#endif diff --git a/reactos/drivers/multimedia/audio/mpu401/settings.c b/reactos/drivers/multimedia/audio/mpu401/settings.c new file mode 100644 index 00000000000..db616241bff --- /dev/null +++ b/reactos/drivers/multimedia/audio/mpu401/settings.c @@ -0,0 +1,307 @@ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: services/dd/mpu401/settings.c + * PURPOSE: MPU-401 MIDI device driver setting management + * PROGRAMMER: Andrew Greenwood + * UPDATE HISTORY: + * Sept 27, 2003: Created + */ + +#include + +#include "mpu401.h" + +#define NDEBUG +#include +#include "sbdebug.h" // our own debug helper + +#if 0 +static NTSTATUS +OpenDevicesKey( + IN PWSTR RegistryPath, + OUT PHANDLE Key) +/* + Description: + Create a volatile key under this driver's Services node to contain + the device name list. + + Parameters: + RegistryPath The location of the registry entry + Key The key in the registry + + Return Value: + NT status STATUS_SUCCESS if successful (duh...) +*/ +{ + NTSTATUS s; + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + UNICODE_STRING uStr; + + // Attempt to open the key + + RtlInitUnicodeString(&uStr, RegistryPath); + + InitializeObjectAttributes(&oa, &uStr, OBJ_CASE_INSENSITIVE, NULL, + (PSECURITY_DESCRIPTOR)NULL); + + s = ZwOpenKey(&hKey, KEY_CREATE_SUB_KEY, &oa); + + if (! NT_SUCCESS(s)) + return s; // Problem + + + // Now create sub key + + RtlInitUnicodeString(&uStr, (PWSTR) DEVICE_SUBKEY); + + InitializeObjectAttributes(&oa, &uStr, OBJ_CASE_INSENSITIVE, hKey, + (PSECURITY_DESCRIPTOR)NULL); + + s = ZwCreateKey(Key, KEY_ALL_ACCESS, &oa, 0, NULL, REG_OPTION_VOLATILE, + NULL); + + ZwClose(hKey); + + return s; +} +#endif + + +NTSTATUS STDCALL EnumDeviceKeys( + IN PUNICODE_STRING RegistryPath, + IN PWSTR SubKey, + IN PREGISTRY_CALLBACK_ROUTINE Callback, + IN PVOID Context) +/* + Description: + Enumerate the device subkeys in the driver's registry entry, and + call the specified callback routine for each device. + + Parameters: + RegistryPath The location of the registry entry + Subkey The device's subkey + Callback A routine called for each device + Context ??? + + Return Value: + NT status STATUS_SUCCESS if successful +*/ +{ + NTSTATUS s; + OBJECT_ATTRIBUTES oa; + HANDLE hKey, hSubKey; + UNICODE_STRING SubkeyName; + ULONG i; + + // Attempt to open the key + + InitializeObjectAttributes(&oa, RegistryPath, OBJ_CASE_INSENSITIVE, + NULL, (PSECURITY_DESCRIPTOR)NULL); + + s = ZwOpenKey(&hKey, KEY_READ, &oa); + + TEST_STATUS(s); // debugging + + if (! NT_SUCCESS(s)) + return s; // Problem + + RtlInitUnicodeString(&SubkeyName, SubKey); + + DPRINT("Subkey: %wZ\n", &SubkeyName); + + InitializeObjectAttributes(&oa, &SubkeyName, OBJ_CASE_INSENSITIVE, + hKey, (PSECURITY_DESCRIPTOR)NULL); + + s = ZwOpenKey(&hSubKey, KEY_ENUMERATE_SUB_KEYS, &oa); + + ZwClose(hKey); + + TEST_STATUS(s); // debugging + + if (! NT_SUCCESS(s)) + return s; + + + // And now, the enumeration + + for (i = 0;; i ++) + { + KEY_BASIC_INFORMATION Info; + PKEY_BASIC_INFORMATION pInfo; + ULONG ResultLength = 0; + ULONG Size = 0; + PWSTR Pos; + PWSTR Name; + + // Find the length of the subkey data + +// Info.NameLength = 0; // TEMPORARY! + + s = ZwEnumerateKey(hSubKey, i, KeyBasicInformation, &Info, + sizeof(Info), &ResultLength); + + if (s == STATUS_NO_MORE_ENTRIES) + break; + + DPRINT("Found an entry, allocating memory...\n"); + +// Size = Info.NameLength + FIELD_OFFSET(KEY_BASIC_INFORMATION, Name[0]); + Size = ResultLength + FIELD_OFFSET(KEY_BASIC_INFORMATION, Name[0]); + + DPRINT("Size is %d\n", Size); + + pInfo = (PKEY_BASIC_INFORMATION) ExAllocatePool(PagedPool, Size); + + if (pInfo == NULL) + { + DPRINT("INSUFFICIENT RESOURCES!\n"); + s = STATUS_INSUFFICIENT_RESOURCES; + break; + } + + DPRINT("Re-enumerating...\n"); + + s = ZwEnumerateKey(hSubKey, i, KeyBasicInformation, pInfo, Size, + &ResultLength); + +// TEST_STATUS(s); // debugging + + if (! NT_SUCCESS(s)) + { + ExFreePool((PVOID) pInfo); + s = STATUS_INTERNAL_ERROR; + break; + } + + DPRINT("Allocating memory for name...\n"); + + Name = ExAllocatePool(PagedPool, + RegistryPath->Length + sizeof(WCHAR) + + SubkeyName.Length + sizeof(WCHAR) + + pInfo->NameLength + sizeof(UNICODE_NULL)); + + if (Name == NULL) + { + DPRINT("INSUFFICIENT RESOURCES!"); + ExFreePool((PVOID) pInfo); + return STATUS_INSUFFICIENT_RESOURCES; + } + + // Copy the key name + RtlCopyMemory((PVOID)Name, (PVOID)RegistryPath->Buffer, RegistryPath->Length); + Pos = Name + (RegistryPath->Length / sizeof(WCHAR)); + Pos[0] = '\\'; + Pos++; + + // Copy the parameters sub key name + RtlCopyMemory((PVOID)Pos, (PVOID)SubKey, SubkeyName.Length); //SubkeyName? + Pos += SubkeyName.Length / sizeof(WCHAR); + Pos[0] = '\\'; + Pos ++; + + // Copy the device sub key name + RtlCopyMemory((PVOID)Pos, (PVOID)pInfo->Name, pInfo->NameLength); + Pos += pInfo->NameLength / sizeof(WCHAR); + Pos[0] = UNICODE_NULL; + + ExFreePool((PVOID)pInfo); + + DPRINT("Calling callback...\n"); + + s = (*Callback)(Name, Context); + + if (! NT_SUCCESS(s)) + { DPRINT("Callback FAILED\n"); + break;} + } + + ZwClose(hSubKey); + + DPRINT("%d device registry keys found\n", i); + + if ((i == 0) && (s == STATUS_NO_MORE_ENTRIES)) + return STATUS_DEVICE_CONFIGURATION_ERROR; + + return s == STATUS_NO_MORE_ENTRIES ? STATUS_SUCCESS : s; +} + + + +NTSTATUS STDCALL LoadSettings( + IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +/* + Description: + Read the settings for a particular device + + Parameters: + ValueName The value to read from the registry + ValueType ? + ValueData ? + ValueLength ? + Context The configuration structure to write to + EntryContext ? + + Return Value: + NT status STATUS_SUCCESS if successful +*/ +{ + PDEVICE_EXTENSION DeviceInfo = Context; + + if (ValueType == REG_DWORD) + { + if (! _wcsicmp(ValueName, REGISTRY_PORT)) + { + DeviceInfo->Port = *(PULONG) ValueData; + DPRINT("Registry port = 0x%x\n", DeviceInfo->Port); + } + + // More to come... (config.c) + } + + else + { + // ? + } + + return STATUS_SUCCESS; +} + + +#if 0 +static NTSTATUS SaveSettings( + IN PWSTR RegistryPath, + IN ULONG Port, + IN ULONG IRQ, + IN ULONG DMA) +/* + Description: + Saves the settings for a particular device + + Parameters: + RegistryPath Where to save the settings to + Port The device's port number + IRQ The device's interrupt number + DMA The device's DMA channel + + Return Value: + NT status STATUS_SUCCESS if successful +*/ +{ +// NTSTATUS s; + + DPRINT("SaveSettings() unimplemented\n"); + +// UNIMPLEMENTED; + + return STATUS_SUCCESS; +} +#endif + diff --git a/reactos/drivers/multimedia/audio/mpu401/test.c b/reactos/drivers/multimedia/audio/mpu401/test.c new file mode 100644 index 00000000000..1223f2ce40e --- /dev/null +++ b/reactos/drivers/multimedia/audio/mpu401/test.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include "mpu401.h" + +int main() +{ +// NTSTATUS s; +// PHANDLE Handle; +// PIO_STATUS_BLOCK Status; + DWORD BytesReturned; + BYTE Test[3]; // Will store MIDI data + BYTE Notes[] = {50, 52, 54, 55, 57, 59, 61}; + HANDLE Device; + UINT Note; + UINT Junk; + + printf("Test program for MPU401 driver\n"); + + Device = CreateFile("\\\\.\\MPU401_Out_0", GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_FLAG_NO_BUFFERING, + NULL); + + if (Device == INVALID_HANDLE_VALUE) + { + printf("Device is busy or could not be found.\n"); + return -1; + } + + printf("Device is open, let's play some music...\n"); + + Test[0] = 0x90; + Test[2] = 0x7f; + + for (Note = 0; Note < sizeof(Notes); Note ++) + { + Test[1] = Notes[Note]; + + DeviceIoControl( + Device, + IOCTL_MIDI_PLAY, + &Test, + sizeof(Test), + NULL, + 0, + &BytesReturned, + NULL + ); + + for (Junk = 0; Junk < 100000; Junk ++); // Pause + } + + +/* s = IoCreateFile(Handle, GENERIC_READ | GENERIC_WRITE, + OBJ_KERNEL_HANDLE, + Status, + 0, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_OPEN, + FILE_NON_DIRECTORY_FILE, + NULL, + 0, + CreateFileTypeNone, + NULL, + 0); +*/ +} diff --git a/reactos/drivers/multimedia/audio/sndblst/card.c b/reactos/drivers/multimedia/audio/sndblst/card.c new file mode 100644 index 00000000000..267d55f592c --- /dev/null +++ b/reactos/drivers/multimedia/audio/sndblst/card.c @@ -0,0 +1,69 @@ +/* + Sound card operations + + http://www.cae.wisc.edu/~brodskye/sb16doc/sb16doc.html +*/ + +#include +#include "sndblst.h" + +VOID SetOutputSampleRate(ULONG BasePort, ULONG SampleRate) +{ + // This only works for DSP v4.xx ONLY - need a workaround! + DPRINT("Setting output sample rate\n"); + + // WAIT +// if (! WaitToSend(BasePort)) +// return; + + SB_WRITE_BYTE(BasePort, SB_SET_OUTPUT_RATE); + SB_WRITE_BYTE(BasePort, SampleRate / 256); // high + SB_WRITE_BYTE(BasePort, SampleRate % 256); // low +} + + +VOID EnableSpeaker(ULONG BasePort, BOOLEAN SpeakerOn) +{ + DPRINT("Setting speaker status %d\n", SpeakerOn); + +// if (! WaitForWrite(BasePort)) +// return; + + SB_WRITE_BYTE(BasePort, SpeakerOn ? SB_ENABLE_SPEAKER : SB_DISABLE_SPEAKER); +} + + +BOOLEAN IsSpeakerEnabled(ULONG BasePort) +{ + DPRINT("Obtaining speaker status\n"); + +// if (! WaitToSend(BasePort)) +// return FALSE; + + SB_WRITE_BYTE(BasePort, SB_GET_SPEAKER_STATUS); + if (! WaitToReceive(BasePort)) + return FALSE; + + return SB_READ_DATA(BasePort) == 0xff; +} + + +VOID BeginPlayback(ULONG BasePort, ULONG BitDepth, ULONG Channels, ULONG BlockSize) +{ + DPRINT("BeginPlayback(%d, %d, %d, %d)\n", BasePort, BitDepth, Channels, BlockSize); + +// switch(BitDepth) +// { +// case 8 : Command = 0xc0; break; +// case 16 : Command = 0xb0; break; // Make sure we support it +// default : Command = 0xc0; +// } + + DPRINT("Initiating playback\n"); + + // TEMPORARY: + SB_WRITE_BYTE(BasePort, 0xc6); + SB_WRITE_BYTE(BasePort, 0); // mode - TEMPORARY + SB_WRITE_BYTE(BasePort, BlockSize % 256); + SB_WRITE_BYTE(BasePort, BlockSize / 256); +} diff --git a/reactos/drivers/multimedia/audio/sndblst/dma.c b/reactos/drivers/multimedia/audio/sndblst/dma.c new file mode 100644 index 00000000000..d07113d2ec2 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sndblst/dma.c @@ -0,0 +1,203 @@ +/* + Routines to simplify the use of DMA for Sound Blaster driver +*/ + +#include +#include "sndblst.h" + +#if 0 +BOOLEAN CheckDMA(PDEVICE_EXTENSION Device) +{ + // Don't forget to check for Compaq machines (they can't be configured + // manually...) + + return TRUE; // for now... + +// if (! CompaqBA) +// return (BOOLEAN) !((INPORT(pHw, BOARD_ID) & 0x80) && Device->DMA == 0); +// else +// { +// UCHAR CompaqPIDR; +// UCHAR Expected = (UCHAR)(Device->DMA == 0 ? 0x40 : +// Device->DMA == 1 ? 0x80 : +// 0xc0); +// CompaqPIDR = READ_PORT_UCHAR(pHw->CompaqBA + BOARD_ID); +// if (CompaqPIDR != 0xff) +// { +// if ((UCHAR)(CompaqPIDR & 0xc0) == Expected) +// return true; +// } +// } + + return FALSE; +} +#endif + + +static IO_ALLOCATION_ACTION STDCALL SoundProgramDMA( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PVOID MapRegisterBase, + IN PVOID Context) +{ + PDEVICE_EXTENSION Device = DeviceObject->DeviceExtension; + ULONG zzz; + PUCHAR VirtualAddress = (PUCHAR) MmGetMdlVirtualAddress(Device->Mdl); + + DPRINT("IoMapTransfer\n"); + IoMapTransfer(Device->Adapter, + Device->Mdl, + MapRegisterBase, + (PUCHAR) MmGetMdlVirtualAddress(Device->Mdl), + &Device->BufferSize, // is this right? + TRUE); + + DPRINT("VBuffer == 0x%x (really 0x%x?) Bufsize == %u\n", Device->VirtualBuffer, MmGetPhysicalAddress(Device->VirtualBuffer), Device->BufferSize); + + DPRINT("Writing %u bytes of garbage...\n", Device->BufferSize); + // Write some garbage: + for (zzz = 0; zzz < Device->BufferSize; zzz ++) + *(VirtualAddress + zzz) = (UCHAR) zzz % 200; + + DPRINT("done\n"); + + KeSetEvent(Context, 0, FALSE); + + return KeepObject; +} + + +BOOLEAN CreateDMA(PDEVICE_OBJECT DeviceObject) +{ + DEVICE_DESCRIPTION Desc; + ULONG MappedRegs = 0; + PDEVICE_EXTENSION Device = DeviceObject->DeviceExtension; + KEVENT DMAEvent; + KIRQL OldIrql; + + // Buffersize should already be set but it isn't yet ! + Device->BufferSize = SB_BUFSIZE; + DPRINT("Bufsize == %u\n", Device->BufferSize); + + RtlZeroMemory(&Desc, sizeof(DEVICE_DESCRIPTION)); + + // Init memory! + Desc.Version = DEVICE_DESCRIPTION_VERSION; + Desc.Master = FALSE; // Slave + Desc.ScatterGather = FALSE; // Don't think so anyway + Desc.DemandMode = FALSE; // == !SingleModeDMA + Desc.AutoInitialize = TRUE; // ? + Desc.Dma32BitAddresses = FALSE; // I don't think we can + Desc.IgnoreCount = FALSE; // Should be OK + Desc.Reserved1 = 0; +// Desc.Reserved2 = 0; + Desc.BusNumber = 0; + Desc.DmaChannel = Device->DMA; // Our channel :) + Desc.InterfaceType = Isa; // (BusType == MicroChannel) ? MicroChannel : Isa; + Desc.DmaWidth = 0; // hmm... 8 bits? + Desc.DmaSpeed = 0; // double hmm (Compatible it should be) + Desc.MaximumLength = Device->BufferSize; +// Desc.MinimumLength = 0; + Desc.DmaPort = 0; + + DPRINT("Calling HalGetAdapter(), asking for %d mapped regs\n", MappedRegs); + + Device->Adapter = HalGetAdapter(&Desc, &MappedRegs); + + DPRINT("Called\n"); + + if (! Device->Adapter) + { + DPRINT("HalGetAdapter() FAILED\n"); + return FALSE; + } + + DPRINT("Bufsize == %u\n", Device->BufferSize); + + if (MappedRegs < BYTES_TO_PAGES(Device->BufferSize)) + { + DPRINT("Could only allocate %u mapping registers\n", MappedRegs); + + if (MappedRegs == 0) + return FALSE; + + Device->BufferSize = MappedRegs * PAGE_SIZE; + DPRINT("Bufsize == %u\n", Device->BufferSize); + } + + DPRINT("Allocated %u mapping registers\n", MappedRegs); + + // Check if we already have memory here... + + // Check to make sure we're >= minimum + + DPRINT("Allocating buffer\n"); + + DPRINT("Bufsize == %u\n", Device->BufferSize); + + Device->VirtualBuffer = HalAllocateCommonBuffer(Device->Adapter, Device->BufferSize, + &Device->Buffer, FALSE); + + // For some reason BufferSize == 0 here?! +// DPRINT("Buffer == 0x%x Bufsize == %u\n", Device->Buffer, Device->BufferSize); + DPRINT("Bufsize == %u,", Device->BufferSize); + DPRINT("Buffer == 0x%x\n", Device->Buffer); + + if (! Device->VirtualBuffer) + { + DPRINT("Could not allocate buffer :(\n"); + // should try again with smaller buffer... + return FALSE; + } + +// DPRINT("Buffer == 0x%x Bufsize == %u\n", Device->Buffer, Device->BufferSize); + DPRINT("Bufsize == %u,", Device->BufferSize); + DPRINT("Buffer == 0x%x\n", Device->Buffer); + + DPRINT("Calling IoAllocateMdl()\n"); + Device->Mdl = IoAllocateMdl(Device->VirtualBuffer, Device->BufferSize, FALSE, FALSE, NULL); + DPRINT("Bufsize == %u\n", Device->BufferSize); + + // IS THIS RIGHT: + if (! Device->Mdl) + { + DPRINT("IoAllocateMdl() FAILED\n"); + // Free the HAL buffer + return FALSE; + } + + DPRINT("VBuffer == 0x%x Mdl == %u Bufsize == %u\n", Device->VirtualBuffer, Device->Mdl, Device->BufferSize); + + DPRINT("Calling MmBuildMdlForNonPagedPool\n"); + MmBuildMdlForNonPagedPool(Device->Mdl); + + DPRINT("Bufsize == %u\n", Device->BufferSize); + + // part II: + KeInitializeEvent(&DMAEvent, SynchronizationEvent, FALSE); + // Raise IRQL + KeRaiseIrql(DISPATCH_LEVEL,&OldIrql); + IoAllocateAdapterChannel(Device->Adapter, DeviceObject, + BYTES_TO_PAGES(Device->BufferSize), + SoundProgramDMA, &DMAEvent); + // Lower IRQL + KeLowerIrql(OldIrql); + DPRINT("VBuffer == 0x%x Bufsize == %u\n", Device->VirtualBuffer, Device->BufferSize); + KeWaitForSingleObject(&DMAEvent, Executive, KernelMode, FALSE, NULL); + + +// if (MappedRegs == 0) +// MappedRegs = 2; +// else +// MappedRegs ++; + + +// Status = IoAllocateAdapterChannel( +// Adapter, +// DeviceObject, +// MappedRegs, +// CALLBACK, +// DeviceObject); // Context + return TRUE; +} + diff --git a/reactos/drivers/multimedia/audio/sndblst/irq.c b/reactos/drivers/multimedia/audio/sndblst/irq.c new file mode 100644 index 00000000000..2dcad5e7261 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sndblst/irq.c @@ -0,0 +1,93 @@ +#include +#include "sndblst.h" + +#if 0 +BOOLEAN CheckIRQ(PDEVICE_EXTENSION Parameters) +{ + static CONST ULONG ValidIRQs[] = VALID_IRQS; + int i; + + return TRUE; // for now... + + // Check for Compaq! + // if ... + + for (i = 0; ValidIRQs[i] != 0xffff; i ++) + { + // Consult the card + +// OUTPORT(pHw, BOARD_CONFIG, bConfig); +// if (INPORT(pHEW, BOARD_ID) & 0x40) +// pHW->ValidInterrupts |= (1 << ThisIRQ); + +// return (BOOLEAN)((pHw->ValidInterrupts & (1 << Interrupt)) && +// (! ((INPORT(pHw, BOARD_ID) & 0x80) && +// (Interrupt == 10 || Interrupt == 11))); + + } + + // else + // Compaq stuff? + { + UCHAR Expected; + + switch (Parameters->IRQ) + { + case 10 : Expected = 0x10; + case 11 : Expected = 0x20; + case 7 : Expected = 0x30; + default : return FALSE; + } + +// CompaqPIDR = READ_PORT_UCHAR( ... ) + // ... + } +} + + + +BOOLEAN ISR( + IN PKINTERRUPT pInterrupt, + IN PVOID Context) +{ + DPRINT("*** Processing ISR ***\n"); + + // What do we do here then? + + return FALSE; +} + + + +NTSTATUS EnableIRQ(PDEVICE_OBJECT DeviceObject) +{ + PDEVICE_EXTENSION Parameters = DeviceObject->DeviceExtension; + ULONG Vector; + KIRQL IRQ_Level; + KAFFINITY Affinity; + NTSTATUS Status = STATUS_SUCCESS; + + Vector = HalGetInterruptVector(Isa, // FIX THIS + 0, // FIX THIS + Parameters->IRQ, + Parameters->IRQ, + &IRQ_Level, + &Affinity); + +// Status = IoConnectInterrupt(Parameters->Interrupt, // Object +// ISR, // Function +// DeviceObject, // Context +// (PKSPIN_LOCK) NULL, +// Vector, +// IRQ_Level, +// IRQ_Level, + // mode - Latched or Level sensitive? + // share - if irq can be shared +// Affinity, +// FALSE); + + return Status == STATUS_INVALID_PARAMETER ? + STATUS_DEVICE_CONFIGURATION_ERROR : Status; +} +#endif + diff --git a/reactos/drivers/multimedia/audio/sndblst/portio.c b/reactos/drivers/multimedia/audio/sndblst/portio.c new file mode 100644 index 00000000000..9ede535c2eb --- /dev/null +++ b/reactos/drivers/multimedia/audio/sndblst/portio.c @@ -0,0 +1,111 @@ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: drivers/dd/sndblst/portio.c (see also sndblst.h) + * PURPOSE: Sound Blaster port I/O helper + * PROGRAMMER: Andrew Greenwood + * UPDATE HISTORY: + * Sept 28, 2003: Created + */ + +#include +#include "sndblst.h" + +BOOLEAN WaitToSend(ULONG BasePort) +{ + int TimeOut; + + DPRINT("WaitToSend "); + + // Check if it's OK to send + for (TimeOut = SB_TIMEOUT; + ! SB_READY_TO_SEND(BasePort) && TimeOut > 0; + TimeOut --); + + // If a time-out occurs, we report failure + if (! TimeOut) + { + DPRINT("FAILED\n"); + return FALSE; + } + + DPRINT("SUCCEEDED\n"); + + return TRUE; +} + +BOOLEAN WaitToReceive(ULONG BasePort) +{ + int TimeOut; + + DPRINT("WaitToReceive "); + + // Check if it's OK to receive + for (TimeOut = SB_TIMEOUT; + ! SB_READY_TO_RECEIVE(BasePort) && TimeOut > 0; + TimeOut --); + + // If a time-out occurs, we report failure + if (! TimeOut) + { + DPRINT("FAILED\n"); + return FALSE; + } + + DPRINT("SUCCEEDED\n"); + + return TRUE; +} + + +USHORT InitSoundCard(ULONG BasePort) +{ + ULONG TimeOut; + BOOLEAN Status; + UCHAR DSP_Major, DSP_Minor; + + DPRINT("InitSoundCard() called\n"); + + DPRINT("Resetting sound card\n"); +// if (!WaitToSend(BasePort)) +// return FALSE; + + SB_WRITE_RESET(BasePort, 0x01); + for (TimeOut = 0; TimeOut < 30000; TimeOut ++); // Wait a while + SB_WRITE_RESET(BasePort, 0x00); + + // Check if it's OK to receive (some cards will ignore the above reset + // command and so will not issue an ACK, so time out is NOT an error) + DPRINT("Waiting for an ACK\n"); + if (WaitToReceive(BasePort)) + { + // Check to make sure the reset was acknowledged: + for (TimeOut = SB_TIMEOUT; + (Status = (SB_READ_DATA(BasePort) != SB_DSP_READY) && (TimeOut > 0)); + TimeOut --); + } + + DPRINT("Querying DSP version\n"); + if (! WaitToSend(BasePort)) + return FALSE; + + SB_WRITE_DATA(BasePort, SB_GET_DSP_VERSION); + + if (! WaitToReceive(BasePort)) + return FALSE; + + DSP_Major = SB_READ_DATA(BasePort); + DSP_Minor = SB_READ_DATA(BasePort); + + DPRINT("DSP v%d.%d\n", DSP_Major, DSP_Minor); + + // if audio is disabled, + // version tests return 0xFF everywhere + if (DSP_Major == 0xFF && DSP_Minor == 0xFF) + return FALSE; + + DPRINT("Sound card initialized!\n"); + + return (DSP_Major * 256) + DSP_Minor; +} diff --git a/reactos/drivers/multimedia/audio/sndblst/sbdebug.h b/reactos/drivers/multimedia/audio/sndblst/sbdebug.h new file mode 100644 index 00000000000..818412f426c --- /dev/null +++ b/reactos/drivers/multimedia/audio/sndblst/sbdebug.h @@ -0,0 +1,24 @@ +#ifndef NDEBUG +#define TEST_STATUS(s) \ + if (! NT_SUCCESS(s)) \ + { \ + if (s == STATUS_NO_MORE_ENTRIES) \ + DPRINT("NTSTATUS == NO MORE ENTRIES\n"); \ + else if (s == STATUS_BUFFER_OVERFLOW) \ + DPRINT("NTSTATUS == BUFFER OVERFLOW\n"); \ + else if (s == STATUS_BUFFER_TOO_SMALL) \ + DPRINT("NTSTATUS == BUFFER TOO SMALL\n"); \ + else if (s == STATUS_INVALID_PARAMETER) \ + DPRINT("NTSTATUS == INVALID PARAMETER\n"); \ + else if (s == STATUS_OBJECT_NAME_NOT_FOUND) \ + DPRINT("NTSTATUS == OBJECT NAME NOT FOUND\n"); \ + else if (s == STATUS_INVALID_HANDLE) \ + DPRINT("NTATATUS == INVALID_HANDLE\n"); \ + else if (s == STATUS_ACCESS_DENIED) \ + DPRINT("NTSTATUS == ACCESS_DENIED\n"); \ + else \ + DPRINT("NTSTATUS == FAILURE (Unknown)\n"); \ + } +#else +#define TEST_STATUS(s) +#endif diff --git a/reactos/drivers/multimedia/audio/sndblst/settings.c b/reactos/drivers/multimedia/audio/sndblst/settings.c new file mode 100644 index 00000000000..d737321982c --- /dev/null +++ b/reactos/drivers/multimedia/audio/sndblst/settings.c @@ -0,0 +1,301 @@ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: drivers/dd/sndblst/settings.c + * PURPOSE: MPU-401 MIDI device driver setting management + * PROGRAMMER: Andrew Greenwood + * UPDATE HISTORY: + * Sept 28, 2003: Created + */ + +#include +#include "sndblst.h" +#include "sbdebug.h" // our own debug helper + + +#if 0 +NTSTATUS +OpenDevicesKey( + IN PWSTR RegistryPath, + OUT PHANDLE Key) +/* + Description: + Create a volatile key under this driver's Services node to contain + the device name list. + + Parameters: + RegistryPath The location of the registry entry + Key The key in the registry + + Return Value: + NT status STATUS_SUCCESS if successful (duh...) +*/ +{ + NTSTATUS s; + HANDLE hKey; + OBJECT_ATTRIBUTES oa; + UNICODE_STRING uStr; + + // Attempt to open the key + + RtlInitUnicodeString(&uStr, RegistryPath); + + InitializeObjectAttributes(&oa, &uStr, OBJ_CASE_INSENSITIVE, NULL, + (PSECURITY_DESCRIPTOR)NULL); + + s = ZwOpenKey(&hKey, KEY_CREATE_SUB_KEY, &oa); + + if (! NT_SUCCESS(s)) + return s; // Problem + + + // Now create sub key + + RtlInitUnicodeString(&uStr, (PWSTR) DEVICE_SUBKEY); + + InitializeObjectAttributes(&oa, &uStr, OBJ_CASE_INSENSITIVE, hKey, + (PSECURITY_DESCRIPTOR)NULL); + + s = ZwCreateKey(Key, KEY_ALL_ACCESS, &oa, 0, NULL, REG_OPTION_VOLATILE, + NULL); + + ZwClose(hKey); + + return s; +} +#endif + + +NTSTATUS STDCALL EnumDeviceKeys( + IN PUNICODE_STRING RegistryPath, + IN PWSTR SubKey, + IN PREGISTRY_CALLBACK_ROUTINE Callback, + IN PVOID Context) +/* + Description: + Enumerate the device subkeys in the driver's registry entry, and + call the specified callback routine for each device. + + Parameters: + RegistryPath The location of the registry entry + Subkey The device's subkey + Callback A routine called for each device + Context ??? + + Return Value: + NT status STATUS_SUCCESS if successful +*/ +{ + NTSTATUS s; + OBJECT_ATTRIBUTES oa; + HANDLE hKey, hSubKey; + UNICODE_STRING SubkeyName; + ULONG i; + + // Attempt to open the key + + InitializeObjectAttributes(&oa, RegistryPath, OBJ_CASE_INSENSITIVE, + NULL, (PSECURITY_DESCRIPTOR)NULL); + + s = ZwOpenKey(&hKey, KEY_READ, &oa); + + TEST_STATUS(s); // debugging + + if (! NT_SUCCESS(s)) + return s; // Problem + + RtlInitUnicodeString(&SubkeyName, SubKey); + + DPRINT("Subkey: %wZ\n", &SubkeyName); + + InitializeObjectAttributes(&oa, &SubkeyName, OBJ_CASE_INSENSITIVE, + hKey, (PSECURITY_DESCRIPTOR)NULL); + + s = ZwOpenKey(&hSubKey, KEY_ENUMERATE_SUB_KEYS, &oa); + + ZwClose(hKey); + + TEST_STATUS(s); // debugging + + if (! NT_SUCCESS(s)) + return s; + + + // And now, the enumeration + + for (i = 0;; i ++) + { + KEY_BASIC_INFORMATION Info; + PKEY_BASIC_INFORMATION pInfo; + ULONG ResultLength = 0; + ULONG Size = 0; + PWSTR Pos; + PWSTR Name; + + // Find the length of the subkey data + +// Info.NameLength = 0; // TEMPORARY! + + s = ZwEnumerateKey(hSubKey, i, KeyBasicInformation, &Info, + sizeof(Info), &ResultLength); + + if (s == STATUS_NO_MORE_ENTRIES) + break; + + DPRINT("Found an entry, allocating memory...\n"); + +// Size = Info.NameLength + FIELD_OFFSET(KEY_BASIC_INFORMATION, Name[0]); + Size = ResultLength + FIELD_OFFSET(KEY_BASIC_INFORMATION, Name[0]); + + DPRINT("Size is %d\n", Size); + + pInfo = (PKEY_BASIC_INFORMATION) ExAllocatePool(PagedPool, Size); + + if (pInfo == NULL) + { + DPRINT("INSUFFICIENT RESOURCES!\n"); + s = STATUS_INSUFFICIENT_RESOURCES; + break; + } + + DPRINT("Re-enumerating...\n"); + + s = ZwEnumerateKey(hSubKey, i, KeyBasicInformation, pInfo, Size, + &ResultLength); + +// TEST_STATUS(s); // debugging + + if (! NT_SUCCESS(s)) + { + ExFreePool((PVOID) pInfo); + s = STATUS_INTERNAL_ERROR; + break; + } + + DPRINT("Allocating memory for name...\n"); + + Name = ExAllocatePool(PagedPool, + RegistryPath->Length + sizeof(WCHAR) + + SubkeyName.Length + sizeof(WCHAR) + + pInfo->NameLength + sizeof(UNICODE_NULL)); + + if (Name == NULL) + { + DPRINT("INSUFFICIENT RESOURCES!"); + ExFreePool((PVOID) pInfo); + return STATUS_INSUFFICIENT_RESOURCES; + } + + // Copy the key name + RtlCopyMemory((PVOID)Name, (PVOID)RegistryPath->Buffer, RegistryPath->Length); + Pos = Name + (RegistryPath->Length / sizeof(WCHAR)); + Pos[0] = '\\'; + Pos++; + + // Copy the parameters sub key name + RtlCopyMemory((PVOID)Pos, (PVOID)SubKey, SubkeyName.Length); //SubkeyName? + Pos += SubkeyName.Length / sizeof(WCHAR); + Pos[0] = '\\'; + Pos ++; + + // Copy the device sub key name + RtlCopyMemory((PVOID)Pos, (PVOID)pInfo->Name, pInfo->NameLength); + Pos += pInfo->NameLength / sizeof(WCHAR); + Pos[0] = UNICODE_NULL; + + ExFreePool((PVOID)pInfo); + + DPRINT("Calling callback...\n"); + + s = (*Callback)(Name, Context); + + if (! NT_SUCCESS(s)) + { DPRINT("Callback FAILED\n"); + break;} + } + + ZwClose(hSubKey); + + DPRINT("%d device registry keys found\n", i); + + if ((i == 0) && (s == STATUS_NO_MORE_ENTRIES)) + return STATUS_DEVICE_CONFIGURATION_ERROR; + + return s == STATUS_NO_MORE_ENTRIES ? STATUS_SUCCESS : s; +} + + + +NTSTATUS STDCALL LoadSettings( + IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext) +/* + Description: + Read the settings for a particular device + + Parameters: + ValueName The value to read from the registry + ValueType ? + ValueData ? + ValueLength ? + Context The configuration structure to write to + EntryContext ? + + Return Value: + NT status STATUS_SUCCESS if successful +*/ +{ + PDEVICE_EXTENSION DeviceInfo = Context; + + if (ValueType == REG_DWORD) + { + if (! _wcsicmp(ValueName, REGISTRY_PORT)) + { + DeviceInfo->Port = *(PULONG) ValueData; + DPRINT("Registry port = 0x%x\n", DeviceInfo->Port); + } + + // More to come... (config.c) + } + + else + { + // ? + } + + return STATUS_SUCCESS; +} + + +#if 0 +NTSTATUS SaveSettings( + IN PWSTR RegistryPath, + IN ULONG Port, + IN ULONG IRQ, + IN ULONG DMA) +/* + Description: + Saves the settings for a particular device + + Parameters: + RegistryPath Where to save the settings to + Port The device's port number + IRQ The device's interrupt number + DMA The device's DMA channel + + Return Value: + NT status STATUS_SUCCESS if successful +*/ +{ + DPRINT("SaveSettings() unimplemented\n"); + +// UNIMPLEMENTED; + + return STATUS_SUCCESS; +} +#endif diff --git a/reactos/drivers/multimedia/audio/sndblst/sndblst.c b/reactos/drivers/multimedia/audio/sndblst/sndblst.c new file mode 100644 index 00000000000..d31a8b01c59 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sndblst/sndblst.c @@ -0,0 +1,461 @@ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: services/dd/sndblst/sndblst.c + * PURPOSE: Sound Blaster / SB Pro / SB 16 driver + * PROGRAMMER: Andrew Greenwood + * UPDATE HISTORY: + * Sept 28, 2003: Copied from mpu401.c as a template + */ + +/* INCLUDES ****************************************************************/ + +#include +#include "sndblst.h" + +NTSTATUS STDCALL +DriverEntry(PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath); + +/* INTERNAL VARIABLES ******************************************************/ + +ULONG DeviceCount = 0; + + +/* FUNCTIONS ***************************************************************/ + +static NTSTATUS InitDevice( + IN PWSTR RegistryPath, + IN PVOID Context) +{ +// PDEVICE_INSTANCE Instance = Context; + PDEVICE_OBJECT DeviceObject; // = Context; + PDEVICE_EXTENSION Parameters; // = DeviceObject->DeviceExtension; + UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\WaveOut0"); // CHANGE THESE? + UNICODE_STRING SymlinkName = RTL_CONSTANT_STRING(L"\\??\\WaveOut0"); + +// CONFIG Config; + RTL_QUERY_REGISTRY_TABLE Table[2]; + NTSTATUS s; + USHORT DSP_Version = 0; + UCHAR DSP_Major = 0, DSP_Minor = 0; + + // This is TEMPORARY, to ensure that we don't process more than 1 device. + // This limitation should be removed in future. + if (DeviceCount > 0) + { + DPRINT("Sorry - only 1 device supported by Sound Blaster driver at present :(\n"); + return STATUS_NOT_IMPLEMENTED; + } + + DPRINT("Creating IO device\n"); + + s = IoCreateDevice(Context, // driverobject + sizeof(DEVICE_EXTENSION), + &DeviceName, + FILE_DEVICE_SOUND, // Correct? + 0, + FALSE, + &DeviceObject); + + if (!NT_SUCCESS(s)) + return s; + + DPRINT("Device Extension at 0x%x\n", DeviceObject->DeviceExtension); + Parameters = DeviceObject->DeviceExtension; + + DPRINT("Creating DOS link\n"); + + /* Create the dos device link */ + IoCreateSymbolicLink(&SymlinkName, + &DeviceName); + + DPRINT("Initializing device\n"); + +// DPRINT("Allocating memory for parameters structure\n"); + // Bodged: +// Parameters = (PDEVICE_EXTENSION)ExAllocatePool(NonPagedPool, sizeof(DEVICE_EXTENSION)); +// DeviceObject->DeviceExtension = Parameters; +// Parameters = Instance->DriverObject->DriverExtension; + + DPRINT("DeviceObject at 0x%x, DeviceExtension at 0x%x\n", DeviceObject, Parameters); + + if (! Parameters) + { + DPRINT("NULL POINTER!\n"); + return STATUS_INSUFFICIENT_RESOURCES; + } + +// Instance->DriverObject->DriverExtension = Parameters; + + DPRINT("Setting reg path\n"); + Parameters->RegistryPath = RegistryPath; +// Parameters->DriverObject = Instance->DriverObject; + + DPRINT("Zeroing table memory and setting query routine\n"); + RtlZeroMemory(Table, sizeof(Table)); + Table[0].QueryRoutine = LoadSettings; + + DPRINT("Setting port and IRQ defaults\n"); + Parameters->Port = DEFAULT_PORT; + Parameters->IRQ = DEFAULT_IRQ; + Parameters->DMA = DEFAULT_DMA; + Parameters->BufferSize = DEFAULT_BUFSIZE; + +// Only to be enabled once we can get support for multiple cards working :) +/* + DPRINT("Loading settings from: %S\n", RegistryPath); + + s = RtlQueryRegistryValues(RTL_REGISTRY_ABSOLUTE, RegistryPath, Table, + &Parameters, NULL); + + if (! NT_SUCCESS(s)) + return s; +*/ + + DPRINT("Port 0x%x IRQ %d DMA %d\n", Parameters->Port, Parameters->IRQ, Parameters->DMA); + +// Instance->P + + // Initialize the card + DSP_Version = InitSoundCard(Parameters->Port); + if (! DSP_Version) + { + DPRINT("Sound card initialization FAILED!\n"); + // Set state indication somehow + // Failure - what error code do we give?! + // return STATUS_???? + return STATUS_UNSUCCESSFUL; + } + + DSP_Major = DSP_Version / 256; + DSP_Minor = DSP_Version % 256; + + // Do stuff related to version here... + + DPRINT("Allocating DMA\n"); + if (! CreateDMA(DeviceObject)) + DPRINT("FAILURE!\n"); + + // TEMPORARY TESTING STUFF: should be in BlasterCreate + EnableSpeaker(Parameters->Port, TRUE); + SetOutputSampleRate(Parameters->Port, 2205); + BeginPlayback(Parameters->Port, 16, 2, Parameters->BufferSize); + + DeviceCount ++; + + return STATUS_SUCCESS; +} + + +static NTSTATUS STDCALL +BlasterCreate(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +/* + * FUNCTION: Handles user mode requests + * ARGUMENTS: + * DeviceObject = Device for request + * Irp = I/O request packet describing request + * RETURNS: Success or failure + */ +{ + DPRINT("BlasterCreate() called!\n"); + + // Initialize the MPU-401 + // ... do stuff ... + + + // Play a note to say we're alive: +// WaitToSend(MPU401_PORT); +// MPU401_WRITE_DATA(MPU401_PORT, 0x90); +// WaitToSend(MPU401_PORT); +// MPU401_WRITE_DATA(MPU401_PORT, 0x50); +// WaitToSend(MPU401_PORT); +// MPU401_WRITE_DATA(MPU401_PORT, 0x7f); + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + + DPRINT("IoCompleteRequest()\n"); + + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + + DPRINT("BlasterCreate() completed\n"); + + return(STATUS_SUCCESS); +} + + +static NTSTATUS STDCALL +BlasterClose(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +/* + * FUNCTION: Handles user mode requests + * ARGUMENTS: + * DeviceObject = Device for request + * Irp = I/O request packet describing request + * RETURNS: Success or failure + */ +{ + PDEVICE_EXTENSION DeviceExtension; + NTSTATUS Status; + + DPRINT("BlasterClose() called!\n"); + + DeviceExtension = DeviceObject->DeviceExtension; + + Status = STATUS_SUCCESS; + + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + + return(Status); +} + + +static NTSTATUS STDCALL +BlasterCleanup(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +/* + * FUNCTION: Handles user mode requests + * ARGUMENTS: + * DeviceObject = Device for request + * Irp = I/O request packet describing request + * RETURNS: Success or failure + */ +{ + ULONG Channel; + DPRINT("BlasterCleanup() called!\n"); + + // Reset the device (should we do this?) + for (Channel = 0; Channel <= 15; Channel ++) + { + // All notes off +// MPU401_WRITE_MESSAGE(MPU401_PORT, 0xb0 + Channel, 123, 0); + // All controllers off +// MPU401_WRITE_MESSAGE(MPU401_PORT, 0xb0 + Channel, 121, 0); + } + + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + + return(STATUS_SUCCESS); +} + + +static NTSTATUS STDCALL +BlasterWrite(PDEVICE_OBJECT DeviceObject, PIRP Irp) +{ + PIO_STACK_LOCATION Stack; + PDEVICE_EXTENSION DeviceExtension; + ULONG ByteCount; + PUCHAR Data; + + DPRINT("BlasterWrite() called!\n"); + + DeviceExtension = DeviceObject->DeviceExtension; + Stack = IoGetCurrentIrpStackLocation(Irp); + + DPRINT("%d bytes\n", Stack->Parameters.Write.Length); + + Data = (PUCHAR) Irp->AssociatedIrp.SystemBuffer; + + for (ByteCount = 0; ByteCount < Stack->Parameters.Write.Length; ByteCount ++) + { +// DPRINT("0x%x ", Data[ByteCount]); + +// MPU401_WRITE_BYTE(DeviceExtension->Port, Data[ByteCount]); + } + + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + + return(STATUS_SUCCESS); +} + + +static NTSTATUS STDCALL +BlasterDeviceControl(PDEVICE_OBJECT DeviceObject, + PIRP Irp) +/* + * FUNCTION: Handles user mode requests + * ARGUMENTS: + * DeviceObject = Device for request + * Irp = I/O request packet describing request + * RETURNS: Success or failure + */ +{ + PIO_STACK_LOCATION Stack; + PDEVICE_EXTENSION DeviceExtension; + + DPRINT("BlasterDeviceControl() called!\n"); + + DeviceExtension = DeviceObject->DeviceExtension; + Stack = IoGetCurrentIrpStackLocation(Irp); + + switch(Stack->Parameters.DeviceIoControl.IoControlCode) + { +/* case IOCTL_MIDI_PLAY : + { + DPRINT("Received IOCTL_MIDI_PLAY\n"); + Data = (PUCHAR) Irp->AssociatedIrp.SystemBuffer; + + DPRINT("Sending %d bytes of MIDI data to 0x%d:\n", Stack->Parameters.DeviceIoControl.InputBufferLength, DeviceExtension->Port); + + for (ByteCount = 0; ByteCount < Stack->Parameters.DeviceIoControl.InputBufferLength; ByteCount ++) + { + DPRINT("0x%x ", Data[ByteCount]); + + MPU401_WRITE_BYTE(DeviceExtension->Port, Data[ByteCount]); +// if (WaitToSend(MPU401_PORT)) +// MPU401_WRITE_DATA(MPU401_PORT, Data[ByteCount]); + } + + Irp->IoStatus.Status = STATUS_SUCCESS; + IoCompleteRequest(Irp, IO_NO_INCREMENT); + + return(STATUS_SUCCESS); + } +*/ + } + + return(STATUS_SUCCESS); + +/* + DeviceExtension = DeviceObject->DeviceExtension; + Stack = IoGetCurrentIrpStackLocation(Irp); + BeepParam = (PBEEP_SET_PARAMETERS)Irp->AssociatedIrp.SystemBuffer; + + Irp->IoStatus.Information = 0; + + if (Stack->Parameters.DeviceIoControl.IoControlCode != IOCTL_BEEP_SET) + { + Irp->IoStatus.Status = STATUS_NOT_IMPLEMENTED; + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + return(STATUS_NOT_IMPLEMENTED); + } + + if ((Stack->Parameters.DeviceIoControl.InputBufferLength != sizeof(BEEP_SET_PARAMETERS)) + || (BeepParam->Frequency < BEEP_FREQUENCY_MINIMUM) + || (BeepParam->Frequency > BEEP_FREQUENCY_MAXIMUM)) + { + Irp->IoStatus.Status = STATUS_INVALID_PARAMETER; + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + return(STATUS_INVALID_PARAMETER); + } + + DueTime.QuadPart = 0; +*/ + /* do the beep!! */ +/* DPRINT("Beep:\n Freq: %lu Hz\n Dur: %lu ms\n", + pbsp->Frequency, + pbsp->Duration); + + if (BeepParam->Duration >= 0) + { + DueTime.QuadPart = (LONGLONG)BeepParam->Duration * -10000; + + KeSetTimer(&DeviceExtension->Timer, + DueTime, + &DeviceExtension->Dpc); + + HalMakeBeep(BeepParam->Frequency); + DeviceExtension->BeepOn = TRUE; + KeWaitForSingleObject(&DeviceExtension->Event, + Executive, + KernelMode, + FALSE, + NULL); + } + else if (BeepParam->Duration == (DWORD)-1) + { + if (DeviceExtension->BeepOn == TRUE) + { + HalMakeBeep(0); + DeviceExtension->BeepOn = FALSE; + } + else + { + HalMakeBeep(BeepParam->Frequency); + DeviceExtension->BeepOn = TRUE; + } + } + + DPRINT("Did the beep!\n"); + + Irp->IoStatus.Status = STATUS_SUCCESS; + IoCompleteRequest(Irp, + IO_NO_INCREMENT); + return(STATUS_SUCCESS); +*/ +} + + +static VOID STDCALL +BlasterUnload(PDRIVER_OBJECT DriverObject) +{ + DPRINT("BlasterUnload() called!\n"); +} + + +NTSTATUS STDCALL +DriverEntry(PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath) +/* + * FUNCTION: Called by the system to initalize the driver + * ARGUMENTS: + * DriverObject = object describing this driver + * RegistryPath = path to our configuration entries + * RETURNS: Success or failure + */ +{ +// PDEVICE_EXTENSION DeviceExtension; +// PDEVICE_OBJECT DeviceObject; +// DEVICE_INSTANCE Instance; + // Doesn't support multiple instances (yet ...) + NTSTATUS Status; + + DPRINT("Sound Blaster Device Driver 0.0.2\n"); + +// Instance.DriverObject = DriverObject; + // previous instance = NULL... + +// DeviceExtension->RegistryPath = RegistryPath; + + DriverObject->Flags = 0; + DriverObject->MajorFunction[IRP_MJ_CREATE] = BlasterCreate; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = BlasterClose; + DriverObject->MajorFunction[IRP_MJ_CLEANUP] = BlasterCleanup; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = BlasterDeviceControl; + DriverObject->MajorFunction[IRP_MJ_WRITE] = BlasterWrite; + DriverObject->DriverUnload = BlasterUnload; + + // Major hack to just get this damn thing working: + Status = InitDevice(RegistryPath->Buffer, DriverObject); // ???? + +// DPRINT("Enumerating devices at %wZ\n", RegistryPath); + +// Status = EnumDeviceKeys(RegistryPath, PARMS_SUBKEY, InitDevice, (PVOID)&DeviceObject); // &Instance; + + // check error + + /* set up device extension */ +// DeviceExtension = DeviceObject->DeviceExtension; +// DeviceExtension->BeepOn = FALSE; + +// return(STATUS_SUCCESS); + return(Status); +} + +/* EOF */ diff --git a/reactos/drivers/multimedia/audio/sndblst/sndblst.h b/reactos/drivers/multimedia/audio/sndblst/sndblst.h new file mode 100644 index 00000000000..5b5ed08ccc6 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sndblst/sndblst.h @@ -0,0 +1,176 @@ +/* + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: drivers/dd/sndblst/sndblst.h + * PURPOSE: Sound Blaster driver header + * PROGRAMMER: Andrew Greenwood + * UPDATE HISTORY: + * Sept 28, 2003: Created + */ + +#ifndef __INCLUDES_SNDBLST_H__ +#define __INCLUDES_SNDBLST_H__ + +#include + +#define NDEBUG +#include + +#define DEFAULT_PORT 0x220 +#define DEFAULT_IRQ 5 +#define DEFAULT_DMA 1 +#define DEFAULT_BUFSIZE 0x4000 +#define DEFAULT_SAMPLERATE 11025 +#define DEFAULT_BITDEPTH 8 +#define DEFAULT_CHANNELS 1 + +#define VALID_IRQS {5} + +#define MIN_BUFSIZE 0x1000 +#define MAX_BUFSIZE 0x4000 + +#define DEVICE_SUBKEY L"Devices" +#define PARMS_SUBKEY L"Parameters" + +#define REGISTRY_PORT L"Port" + +// At the moment, we just support a single device with fixed parameters: +#define SB_PORT DEFAULT_PORT +#define SB_IRQ DEFAULT_IRQ +#define SB_DMA DEFAULT_DMA +#define SB_BUFSIZE DEFAULT_BUFSIZE + +#define SB_TIMEOUT 1000000 + +#define IOCTL_SOUND_BASE FILE_DEVICE_SOUND +#define IOCTL_WAVE_BASE 0x0000 // CORRECT? + +/* #define IOCTL_MIDI_PLAY CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0006, \ + * METHOD_BUFFERED, FILE_WRITE_ACCESS) + */ + +// Some constants + +#define SB_DSP_READY 0xaa + +// Commands (only the ones we use) + +#define SB_SET_OUTPUT_RATE 0x41 // DSP v4.xx only +#define SB_SET_INPUT_RATE 0x42 // DSP v4.xx only +#define SB_SET_BLOCK_SIZE 0x48 // DSP v2.00 + +#define SB_ENABLE_SPEAKER 0xd1 +#define SB_DISABLE_SPEAKER 0xd3 +#define SB_GET_SPEAKER_STATUS 0xd8 // DSP v2.00 + +#define SB_GET_DSP_VERSION 0xe1 + + +// Hmm... These are a weenie bit trickier than MPU401... + +#define SB_WRITE_RESET(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0x6, x) +#define SB_READ_DATA(bp) READ_PORT_UCHAR((PUCHAR) bp+0xa) +#define SB_WRITE_DATA(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0xc, x) +#define SB_READ_WRITESTATUS(bp) READ_PORT_UCHAR((PUCHAR) bp+0xc) +#define SB_READ_READSTATUS(bp) READ_PORT_UCHAR((PUCHAR) bp+0xe) + +// Flow control + +#define SB_READY_TO_SEND(bp) \ + SB_READ_WRITESTATUS(bp) & 0x80 + +#define SB_READY_TO_RECEIVE(bp) \ + SB_READ_READSTATUS(bp) & 0x80 + + +#define SB_WRITE_BYTE(bp, x) \ + if (WaitToSend(bp)) SB_WRITE_DATA(bp, x) + +//#define MPU401_READ(bp) +// if (WaitToRead(bp)) ... ??? + +/* + DEVICE_EXTENSION contains the settings for each individual device +*/ + +typedef struct _DEVICE_EXTENSION +{ + PWSTR RegistryPath; + PDRIVER_OBJECT DriverObject; + ULONG Port; + ULONG IRQ; + ULONG DMA; + ULONG BufferSize; + PADAPTER_OBJECT Adapter; + PMDL Mdl; + PCHAR VirtualBuffer; + PHYSICAL_ADDRESS Buffer; +} DEVICE_EXTENSION, *PDEVICE_EXTENSION; + +/* + DEVICE_INSTANCE contains ??? +*/ + +typedef struct _DEVICE_INSTANCE +{ + // pPrevGDI + PDRIVER_OBJECT DriverObject; +} DEVICE_INSTANCE, *PDEVICE_INSTANCE; + +/* + CONFIG contains device parameters (port/IRQ) + THIS STRUCTURE IS REDUNDANT +*/ + +//typedef struct _CONFIG +//{ +// ULONG Port; +// ULONG IRQ; +//} CONFIG, *PCONFIG; + +/* + Some callback typedefs +*/ + +typedef NTSTATUS REGISTRY_CALLBACK_ROUTINE(PWSTR RegistryPath, PVOID Context); +typedef REGISTRY_CALLBACK_ROUTINE *PREGISTRY_CALLBACK_ROUTINE; + + +/* + Prototypes for functions in portio.c : +*/ + +BOOLEAN WaitToSend(ULONG BasePort); +BOOLEAN WaitToReceive(ULONG BasePort); +USHORT InitSoundCard(ULONG BasePort); + +/* + Prototypes for functions in settings.c : +*/ + +NTSTATUS STDCALL EnumDeviceKeys( + IN PUNICODE_STRING RegistryPath, + IN PWSTR SubKey, + IN PREGISTRY_CALLBACK_ROUTINE Callback, + IN PVOID Context); + +NTSTATUS STDCALL LoadSettings( + IN PWSTR ValueName, + IN ULONG ValueType, + IN PVOID ValueData, + IN ULONG ValueLength, + IN PVOID Context, + IN PVOID EntryContext); + + + + +BOOLEAN CreateDMA(PDEVICE_OBJECT DeviceObject); + + + +VOID SetOutputSampleRate(ULONG BasePort, ULONG SampleRate); +VOID EnableSpeaker(ULONG BasePort, BOOLEAN SpeakerOn); +BOOLEAN IsSpeakerEnabled(ULONG BasePort); +VOID BeginPlayback(ULONG BasePort, ULONG BitDepth, ULONG Channels, ULONG BlockSize); + +#endif diff --git a/reactos/drivers/multimedia/audio/sndblst/sndblst.rbuild b/reactos/drivers/multimedia/audio/sndblst/sndblst.rbuild new file mode 100644 index 00000000000..88fb0879567 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sndblst/sndblst.rbuild @@ -0,0 +1,13 @@ + + . + + ntoskrnl + hal + card.c + dma.c + irq.c + portio.c + settings.c + sndblst.c + sndblst.rc + diff --git a/reactos/drivers/multimedia/audio/sndblst/sndblst.rc b/reactos/drivers/multimedia/audio/sndblst/sndblst.rc new file mode 100644 index 00000000000..8e9d3519e0f --- /dev/null +++ b/reactos/drivers/multimedia/audio/sndblst/sndblst.rc @@ -0,0 +1,7 @@ +/* $Id$ */ + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "SoundBlaster Driver\0" +#define REACTOS_STR_INTERNAL_NAME "sndblst\0" +#define REACTOS_STR_ORIGINAL_FILENAME "sndblst.sys\0" +#include diff --git a/reactos/drivers/multimedia/audio/sndblst/test.c b/reactos/drivers/multimedia/audio/sndblst/test.c new file mode 100644 index 00000000000..1223f2ce40e --- /dev/null +++ b/reactos/drivers/multimedia/audio/sndblst/test.c @@ -0,0 +1,70 @@ +#include +#include +#include +#include "mpu401.h" + +int main() +{ +// NTSTATUS s; +// PHANDLE Handle; +// PIO_STATUS_BLOCK Status; + DWORD BytesReturned; + BYTE Test[3]; // Will store MIDI data + BYTE Notes[] = {50, 52, 54, 55, 57, 59, 61}; + HANDLE Device; + UINT Note; + UINT Junk; + + printf("Test program for MPU401 driver\n"); + + Device = CreateFile("\\\\.\\MPU401_Out_0", GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_FLAG_NO_BUFFERING, + NULL); + + if (Device == INVALID_HANDLE_VALUE) + { + printf("Device is busy or could not be found.\n"); + return -1; + } + + printf("Device is open, let's play some music...\n"); + + Test[0] = 0x90; + Test[2] = 0x7f; + + for (Note = 0; Note < sizeof(Notes); Note ++) + { + Test[1] = Notes[Note]; + + DeviceIoControl( + Device, + IOCTL_MIDI_PLAY, + &Test, + sizeof(Test), + NULL, + 0, + &BytesReturned, + NULL + ); + + for (Junk = 0; Junk < 100000; Junk ++); // Pause + } + + +/* s = IoCreateFile(Handle, GENERIC_READ | GENERIC_WRITE, + OBJ_KERNEL_HANDLE, + Status, + 0, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_OPEN, + FILE_NON_DIRECTORY_FILE, + NULL, + 0, + CreateFileTypeNone, + NULL, + 0); +*/ +} diff --git a/reactos/drivers/multimedia/audio/sndblst/test/sb.c b/reactos/drivers/multimedia/audio/sndblst/test/sb.c new file mode 100644 index 00000000000..8ab7915bb1e --- /dev/null +++ b/reactos/drivers/multimedia/audio/sndblst/test/sb.c @@ -0,0 +1,54 @@ +#include +#include +#include + +int main() +{ +// NTSTATUS s; +// PHANDLE Handle; +// PIO_STATUS_BLOCK Status; + + HANDLE Device; + DWORD BytesReturned; + + printf("SB Test\n"); + + Device = CreateFile("\\\\.\\SndBlst", GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_FLAG_NO_BUFFERING, + NULL); + + if (Device == INVALID_HANDLE_VALUE) + { + printf("Device is busy or could not be found.\n"); + return -1; + } + +// DeviceIoControl( +// Device, +// IOCTL_FILE_DISK_OPEN_FILE, +// OpenFileInformation, +// sizeof(OPEN_FILE_INFORMATION) + OpenFileInformation->FileNameLength - 1, +// NULL +// 0, +// &BytesReturned, +// NULL +// ) + + +/* s = IoCreateFile(Handle, GENERIC_READ | GENERIC_WRITE, + OBJ_KERNEL_HANDLE, + Status, + 0, + FILE_SHARE_READ | FILE_SHARE_WRITE, + FILE_OPEN, + FILE_NON_DIRECTORY_FILE, + NULL, + 0, + CreateFileTypeNone, + NULL, + 0); +*/ +} diff --git a/reactos/drivers/multimedia/audio/sound/dsp.c b/reactos/drivers/multimedia/audio/sound/dsp.c new file mode 100644 index 00000000000..51668b4b7b0 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/dsp.c @@ -0,0 +1,78 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: drivers/dd/sound/dsp.c + * PURPOSE: Digital Signal Processing ? + * PROGRAMMER: Snatched from ? + * + * UPDATE HISTORY: + * ??/??/??: Created + * 10/23/02: Steven Edwards (Steven_Ed4153@yahoo.com) + * Minor build fix + */ + +#include "sb16.h" +#include "dsp.h" + +/************************************ + * unsigned char read_dsp(void) + * + * Reads the DSP chip + * Arguments: none + * Returns: Byte read + ************************************/ +unsigned char read_dsp(unsigned short base) +{ +// while((inb(base+0x0e)&0x80)==0); //Wait until there is something to read +// return inb(base+0x0a); + return 0; +} + +/************************************' + * sb_status detect_dsp(void); + * + * Detects if a SB16 is installed + * Arguments: None + * Returns: Success or failure + ************************************/ +sb_status detect_dsp(SB16* sb16) +{ + for(base=0x200;base<0x280;base+=0x10) //Tries to reset all DSP addresses there is + if(reset_dsp(base)==SB_TRUE) + { + sb16->base=base; + return SB_TRUE; + } + return SB_FALSE; +} + +/************************************** + * sb_status reset_dsp(unsigned short base_address); + * + * Tries to reset a DSP chip + * Arguments: base address + * Returns: Success of failure + **************************************/ +sb_status reset_dsp(unsigned short base_address) +{ +// int delay; + +// outb(base_address+DSP_RESET_PORT,1); +// for(delay=0;delay<0xffff;delay++); + +// outb(base_address+DSP_RESET_PORT,0); +// for(delay=0;delay<0xffff;delay++); + +// if((inb(base_address+DSP_READ_STATUS_PORT)&0x80)==0) return SB_FALSE; + +// if(inb(base_address+DSP_READ_DATA_PORT)!=0xAA) return SB_FALSE; + + return SB_TRUE; +} + +void write_dsp(unsigned short base,unsigned char data) +{ +// while ((inb(base+DSP_WRITE_PORT) & 0x80) != 0); +// outb(base+DSP_WRITE_PORT, data); +} + diff --git a/reactos/drivers/multimedia/audio/sound/dsp.h b/reactos/drivers/multimedia/audio/sound/dsp.h new file mode 100644 index 00000000000..543cf4491c7 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/dsp.h @@ -0,0 +1,17 @@ +#define SB_TRUE 0 +#define SB_FALSE 1 + +#define DSP_MIXER_ADDRESS_PORT 0x04 +#define DSP_MIXER_DATA_PORT 0x05 +#define DSP_RESET_PORT 0x06 +#define DSP_READ_DATA_PORT 0x0A +#define DSP_WRITE_PORT 0x0C //Same port used for reading status and writing data +#define DSP_READ_STATUS_PORT 0x0E + +typedef unsigned char sb_status; +unsigned short base; +unsigned char irq,dma8,dma16; +unsigned char read_dsp(unsigned short base); +void write_dsp(unsigned short base,unsigned char data); +sb_status detect_dsp(SB16* sb16); +sb_status reset_dsp(unsigned short base_address); diff --git a/reactos/drivers/multimedia/audio/sound/in.h b/reactos/drivers/multimedia/audio/sound/in.h new file mode 100644 index 00000000000..a6d0b8579ea --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/in.h @@ -0,0 +1,491 @@ +unsigned int wavelength=3891; + +unsigned char wave[]={ +0x52,0x49,0x46,0x46,0x2b,0xf,0x0,0x0, +0x57,0x41,0x56,0x45,0x66,0x6d,0x74,0x20, +0x10,0x0,0x0,0x0,0x1,0x0,0x1,0x0, +0x22,0x56,0x0,0x0,0x22,0x56,0x0,0x0, +0x1,0x0,0x8,0x0,0x64,0x61,0x74,0x61, +0x7,0xf,0x0,0x0,0x80,0xce,0xb2,0x53, +0x2e,0x75,0xca,0xbb,0x5d,0x2c,0x6a,0xc4, +0xc2,0x68,0x2c,0x5f,0xbd,0xc8,0x74,0x2e, +0x51,0xad,0xd0,0x8a,0x36,0x3f,0x98,0xd2, +0xa2,0x46,0x33,0x81,0xcd,0xb5,0x58,0x2d, +0x67,0xbe,0xc8,0x78,0x30,0x49,0xa3,0xd2, +0x9b,0x43,0x34,0x80,0xcc,0xb9,0x60,0x2c, +0x5e,0xb6,0xce,0x89,0x39,0x3b,0x8b,0xce, +0xb4,0x5c,0x2d,0x5e,0xb6,0xce,0x89,0x39, +0x3a,0x8b,0xce,0xb7,0x62,0x2d,0x54,0xaa, +0xd1,0x9b,0x46,0x31,0x74,0xc2,0xc7,0x7b, +0x34,0x41,0x94,0xcf,0xb3,0x61,0x2e,0x53, +0xa6,0xd1,0xa3,0x4f,0x2e,0x65,0xb7,0xce, +0x90,0x41,0x33,0x78,0xc3,0xc8,0x83,0x3a, +0x38,0x80,0xc6,0xc4,0x7d,0x36,0x3c,0x86, +0xc9,0xc0,0x76,0x34,0x40,0x8d,0xcb,0xbe, +0x74,0x34,0x3e,0x87,0xc9,0xc1,0x78,0x36, +0x3b,0x83,0xc7,0xc4,0x7e,0x39,0x39,0x7d, +0xc2,0xc9,0x8a,0x42,0x32,0x6a,0xb6,0xce, +0x9c,0x4f,0x2e,0x5b,0xa8,0xd0,0xab,0x5d, +0x2f,0x49,0x94,0xcb,0xbe,0x78,0x39,0x38, +0x77,0xbd,0xcc,0x95,0x4a,0x2f,0x5c,0xa7, +0xcf,0xb0,0x68,0x33,0x40,0x83,0xc3,0xc9, +0x8e,0x47,0x30,0x5c,0xa6,0xcf,0xb2,0x6b, +0x34,0x3e,0x7e,0xbf,0xcc,0x99,0x51,0x2f, +0x4f,0x96,0xcb,0xc1,0x81,0x40,0x32,0x64, +0xab,0xcf,0xb0,0x6c,0x36,0x39,0x74,0xb7, +0xce,0xa7,0x61,0x32,0x40,0x80,0xbe,0xcc, +0x9d,0x56,0x30,0x48,0x88,0xc3,0xca,0x99, +0x54,0x30,0x47,0x88,0xc2,0xca,0x98,0x55, +0x30,0x47,0x87,0xc1,0xca,0x9a,0x58,0x31, +0x42,0x80,0xbb,0xcd,0xa5,0x63,0x34,0x3b, +0x73,0xb3,0xce,0xb1,0x6f,0x39,0x36,0x66, +0xa6,0xcc,0xbe,0x84,0x47,0x30,0x50,0x8f, +0xc4,0xc9,0x9b,0x5c,0x33,0x3f,0x77,0xb4, +0xce,0xb2,0x77,0x40,0x32,0x57,0x96,0xc6, +0xc7,0x99,0x5a,0x33,0x3e,0x73,0xb0,0xcd, +0xb7,0x7e,0x45,0x31,0x4e,0x88,0xbe,0xcc, +0xa9,0x6c,0x3b,0x34,0x5d,0x99,0xc7,0xc7, +0x99,0x5d,0x35,0x3a,0x69,0xa3,0xca,0xc3, +0x93,0x58,0x33,0x3c,0x6e,0xa8,0xcb,0xc0, +0x8f,0x54,0x33,0x3f,0x6f,0xa8,0xcb,0xc1, +0x91,0x58,0x34,0x3b,0x69,0xa3,0xc9,0xc5, +0x98,0x5f,0x37,0x38,0x61,0x99,0xc4,0xc9, +0xa5,0x6d,0x3e,0x33,0x52,0x88,0xba,0xcc, +0xb3,0x80,0x4b,0x32,0x44,0x76,0xac,0xca, +0xc2,0x96,0x5f,0x38,0x36,0x5b,0x91,0xbf, +0xcb,0xaf,0x7b,0x49,0x32,0x44,0x75,0xa9, +0xc9,0xc4,0x9d,0x68,0x3d,0x34,0x50,0x83, +0xb5,0xcb,0xbc,0x8f,0x59,0x37,0x38,0x5d, +0x91,0xbd,0xcb,0xb6,0x85,0x53,0x35,0x3a, +0x60,0x94,0xbe,0xcb,0xb3,0x83,0x51,0x34, +0x3c,0x62,0x95,0xbe,0xcb,0xb6,0x87,0x56, +0x37,0x39,0x5a,0x8c,0xb9,0xcb,0xbb,0x90, +0x5d,0x3a,0x35,0x52,0x80,0xb0,0xc9,0xc3, +0x9f,0x6e,0x44,0x33,0x43,0x6d,0x9f,0xc2, +0xc9,0xaf,0x81,0x53,0x37,0x39,0x57,0x85, +0xb2,0xc9,0xc2,0x9f,0x6e,0x45,0x34,0x41, +0x68,0x98,0xbe,0xca,0xb8,0x8e,0x61,0x3d, +0x34,0x49,0x72,0xa1,0xc2,0xc9,0xb2,0x88, +0x5a,0x3b,0x36,0x4e,0x7a,0xa6,0xc4,0xc8, +0xb0,0x85,0x59,0x3b,0x36,0x4d,0x76,0xa3, +0xc3,0xc9,0xb3,0x89,0x5d,0x3d,0x35,0x49, +0x70,0x9c,0xbe,0xc9,0xba,0x96,0x6a,0x44, +0x35,0x40,0x61,0x8d,0xb4,0xc8,0xc2,0xa4, +0x7a,0x51,0x38,0x38,0x4f,0x78,0xa2,0xc0, +0xc9,0xb8,0x93,0x68,0x45,0x35,0x3f,0x5f, +0x89,0xaf,0xc6,0xc6,0xad,0x86,0x5e,0x3f, +0x35,0x43,0x66,0x8f,0xb4,0xc7,0xc3,0xa9, +0x81,0x58,0x3d,0x36,0x46,0x67,0x8f,0xb4, +0xc7,0xc4,0xab,0x85,0x5d,0x3f,0x36,0x43, +0x63,0x8a,0xb0,0xc5,0xc6,0xb1,0x8e,0x66, +0x46,0x36,0x3c,0x56,0x7d,0xa2,0xbf,0xc8, +0xbc,0x9c,0x77,0x51,0x3a,0x37,0x48,0x69, +0x8f,0xb2,0xc5,0xc5,0xb2,0x8f,0x69,0x48, +0x37,0x3b,0x51,0x75,0x9b,0xba,0xc7,0xc1, +0xaa,0x86,0x62,0x44,0x37,0x3d,0x55,0x79, +0x9d,0xba,0xc7,0xc1,0xa8,0x85,0x61,0x44, +0x37,0x3c,0x54,0x75,0x99,0xb7,0xc6,0xc3, +0xae,0x8e,0x69,0x4a,0x39,0x3a,0x4c,0x6b, +0x8f,0xaf,0xc3,0xc6,0xb8,0x9c,0x79,0x57, +0x3f,0x37,0x41,0x59,0x7c,0x9e,0xb9,0xc6, +0xc2,0xad,0x8e,0x6c,0x4d,0x3b,0x38,0x46, +0x61,0x82,0xa4,0xbc,0xc7,0xc0,0xaa,0x8a, +0x68,0x4b,0x3a,0x39,0x48,0x62,0x84,0xa4, +0xbc,0xc6,0xc1,0xad,0x8d,0x6d,0x4f,0x3c, +0x38,0x44,0x5d,0x7d,0x9d,0xb6,0xc5,0xc4, +0xb5,0x99,0x79,0x5b,0x43,0x38,0x3d,0x50, +0x6c,0x8c,0xab,0xbf,0xc6,0xbf,0xaa,0x8d, +0x6e,0x52,0x3e,0x38,0x41,0x56,0x73,0x92, +0xae,0xc1,0xc6,0xbc,0xa5,0x87,0x6a,0x4f, +0x3d,0x39,0x41,0x57,0x73,0x92,0xad,0xbf, +0xc5,0xbe,0xa9,0x8d,0x70,0x53,0x40,0x39, +0x3f,0x50,0x6b,0x88,0xa5,0xba,0xc5,0xc2, +0xb3,0x9a,0x7e,0x61,0x49,0x3b,0x3a,0x46, +0x5b,0x78,0x94,0xae,0xbf,0xc5,0xbe,0xad, +0x93,0x77,0x5b,0x46,0x3b,0x3b,0x47,0x5b, +0x77,0x92,0xac,0xbe,0xc5,0xc0,0xb1,0x9a, +0x7e,0x63,0x4c,0x3e,0x3a,0x41,0x52,0x6a, +0x85,0x9f,0xb4,0xc1,0xc4,0xbc,0xab,0x93, +0x79,0x5f,0x4a,0x3d,0x3a,0x42,0x53,0x6a, +0x82,0x9c,0xb1,0xc0,0xc4,0xbf,0xb0,0x9a, +0x80,0x68,0x51,0x42,0x3a,0x3d,0x48,0x5c, +0x73,0x8d,0xa4,0xb7,0xc2,0xc3,0xbc,0xac, +0x96,0x7e,0x67,0x51,0x42,0x3b,0x3d,0x48, +0x5a,0x70,0x88,0x9f,0xb2,0xbf,0xc3,0xbf, +0xb3,0xa1,0x89,0x72,0x5c,0x4a,0x3e,0x3b, +0x3f,0x4c,0x5e,0x75,0x8a,0xa1,0xb3,0xbf, +0xc3,0xbf,0xb5,0xa3,0x8e,0x77,0x61,0x4e, +0x41,0x3b,0x3d,0x46,0x55,0x69,0x80,0x95, +0xa9,0xb8,0xc1,0xc3,0xbd,0xb0,0x9f,0x8a, +0x75,0x61,0x4e,0x42,0x3c,0x3d,0x44,0x52, +0x65,0x7a,0x8e,0xa2,0xb2,0xbd,0xc2,0xc0, +0xb8,0xaa,0x98,0x83,0x6f,0x5c,0x4c,0x41, +0x3c,0x3d,0x45,0x52,0x63,0x77,0x8b,0x9e, +0xaf,0xbb,0xc1,0xc1,0xbc,0xb1,0xa1,0x8f, +0x7b,0x67,0x56,0x48,0x3f,0x3c,0x3f,0x47, +0x54,0x65,0x77,0x8a,0x9d,0xad,0xb9,0xc0, +0xc2,0xbe,0xb5,0xa7,0x97,0x83,0x72,0x60, +0x50,0x45,0x3e,0x3d,0x40,0x49,0x56,0x66, +0x78,0x8a,0x9c,0xab,0xb7,0xbf,0xc1,0xbf, +0xb8,0xac,0x9d,0x8c,0x7b,0x6a,0x59,0x4c, +0x43,0x3d,0x3d,0x42,0x4b,0x57,0x67,0x79, +0x89,0x9a,0xa8,0xb5,0xbd,0xc1,0xc0,0xbb, +0xb1,0xa5,0x95,0x84,0x74,0x63,0x56,0x4a, +0x42,0x3e,0x3e,0x43,0x4b,0x57,0x66,0x75, +0x85,0x95,0xa4,0xb0,0xba,0xbf,0xc0,0xbe, +0xb7,0xad,0xa0,0x92,0x81,0x72,0x63,0x55, +0x4a,0x42,0x3e,0x3e,0x42,0x48,0x53,0x60, +0x6e,0x7e,0x8d,0x9b,0xa9,0xb4,0xbb,0xbf, +0xc0,0xbd,0xb7,0xad,0xa1,0x93,0x84,0x75, +0x67,0x5a,0x4f,0x46,0x40,0x3e,0x3f,0x44, +0x4b,0x56,0x63,0x71,0x80,0x8d,0x9a,0xa7, +0xb1,0xb9,0xbe,0xc0,0xbe,0xb9,0xb2,0xa7, +0x9c,0x8e,0x80,0x73,0x65,0x59,0x4f,0x47, +0x41,0x3f,0x3f,0x43,0x49,0x53,0x5d,0x69, +0x76,0x84,0x91,0x9e,0xa9,0xb3,0xba,0xbe, +0xbf,0xbe,0xba,0xb3,0xaa,0xa0,0x93,0x86, +0x7a,0x6d,0x60,0x55,0x4d,0x46,0x41,0x3f, +0x40,0x44,0x49,0x51,0x5c,0x66,0x72,0x80, +0x8b,0x97,0xa2,0xac,0xb4,0xba,0xbd,0xbe, +0xbd,0xb9,0xb4,0xab,0xa1,0x96,0x8b,0x80, +0x73,0x68,0x5d,0x52,0x4b,0x45,0x41,0x40, +0x41,0x44,0x49,0x50,0x58,0x63,0x6e,0x7a, +0x85,0x90,0x9b,0xa5,0xae,0xb5,0xba,0xbd, +0xbe,0xbd,0xba,0xb4,0xae,0xa5,0x9b,0x91, +0x85,0x7b,0x70,0x65,0x5b,0x53,0x4b,0x46, +0x42,0x41,0x41,0x43,0x47,0x4c,0x54,0x5d, +0x67,0x71,0x7c,0x86,0x90,0x9a,0xa3,0xac, +0xb3,0xb8,0xbb,0xbd,0xbd,0xbb,0xb7,0xb2, +0xac,0xa3,0x9b,0x91,0x87,0x7d,0x72,0x69, +0x5f,0x57,0x50,0x4a,0x45,0x42,0x41,0x42, +0x43,0x47,0x4c,0x53,0x5b,0x63,0x6c,0x76, +0x80,0x88,0x93,0x9c,0xa4,0xab,0xb1,0xb6, +0xba,0xbc,0xbd,0xbc,0xb9,0xb5,0xb0,0xaa, +0xa2,0x9a,0x91,0x87,0x80,0x76,0x6c,0x63, +0x5c,0x55,0x4e,0x49,0x45,0x43,0x42,0x42, +0x44,0x47,0x4b,0x50,0x57,0x5e,0x66,0x6f, +0x78,0x80,0x89,0x92,0x9a,0xa2,0xa8,0xae, +0xb4,0xb7,0xba,0xbc,0xbc,0xbb,0xb8,0xb5, +0xb0,0xab,0xa4,0x9d,0x95,0x8d,0x85,0x7c, +0x74,0x6c,0x64,0x5c,0x56,0x51,0x4c,0x48, +0x45,0x43,0x43,0x43,0x45,0x48,0x4b,0x50, +0x56,0x5d,0x63,0x6b,0x73,0x7b,0x82,0x8a, +0x92,0x99,0xa0,0xa7,0xac,0xb1,0xb5,0xb8, +0xba,0xbb,0xbb,0xba,0xb8,0xb4,0xb1,0xac, +0xa6,0xa0,0x9a,0x92,0x8b,0x83,0x7c,0x75, +0x6d,0x66,0x60,0x5a,0x54,0x4f,0x4b,0x48, +0x45,0x44,0x43,0x44,0x45,0x47,0x4a,0x4e, +0x53,0x58,0x5e,0x64,0x6b,0x72,0x79,0x80, +0x87,0x8d,0x94,0x9b,0xa1,0xa6,0xac,0xaf, +0xb3,0xb6,0xb8,0xba,0xba,0xba,0xb9,0xb7, +0xb4,0xb0,0xad,0xa8,0xa2,0x9d,0x97,0x90, +0x8a,0x83,0x7d,0x76,0x70,0x69,0x64,0x5d, +0x59,0x53,0x50,0x4c,0x49,0x47,0x45,0x44, +0x44,0x45,0x46,0x48,0x4b,0x4f,0x52,0x57, +0x5c,0x61,0x67,0x6c,0x72,0x79,0x80,0x85, +0x8b,0x91,0x96,0x9c,0xa2,0xa7,0xab,0xaf, +0xb2,0xb5,0xb7,0xb8,0xb9,0xb9,0xb9,0xb8, +0xb6,0xb4,0xb1,0xae,0xaa,0xa6,0xa1,0x9c, +0x96,0x91,0x8c,0x86,0x80,0x7a,0x75,0x6f, +0x6a,0x64,0x5f,0x5b,0x56,0x52,0x4f,0x4c, +0x4a,0x48,0x46,0x46,0x45,0x46,0x47,0x48, +0x4a,0x4c,0x4f,0x52,0x56,0x5a,0x5e,0x63, +0x68,0x6e,0x72,0x78,0x7d,0x82,0x88,0x8c, +0x92,0x97,0x9b,0xa0,0xa4,0xa8,0xac,0xaf, +0xb1,0xb3,0xb6,0xb7,0xb8,0xb8,0xb8,0xb7, +0xb6,0xb5,0xb3,0xb0,0xad,0xaa,0xa7,0xa3, +0x9f,0x9b,0x97,0x92,0x8c,0x87,0x82,0x7f, +0x7a,0x75,0x70,0x6b,0x66,0x62,0x5e,0x5a, +0x56,0x54,0x51,0x4e,0x4c,0x4a,0x49,0x47, +0x47,0x47,0x47,0x47,0x48,0x4a,0x4b,0x4d, +0x50,0x53,0x55,0x59,0x5d,0x61,0x64,0x68, +0x6d,0x71,0x76,0x7b,0x7f,0x82,0x87,0x8b, +0x90,0x95,0x98,0x9c,0xa0,0xa3,0xa7,0xaa, +0xad,0xaf,0xb1,0xb3,0xb4,0xb5,0xb6,0xb7, +0xb7,0xb6,0xb6,0xb5,0xb3,0xb2,0xb0,0xad, +0xab,0xa8,0xa5,0xa2,0x9e,0x9a,0x96,0x93, +0x8e,0x8a,0x86,0x81,0x7f,0x7a,0x76,0x72, +0x6d,0x6a,0x65,0x62,0x5e,0x5b,0x58,0x55, +0x53,0x50,0x4e,0x4c,0x4b,0x4a,0x49,0x48, +0x48,0x48,0x49,0x49,0x4a,0x4b,0x4d,0x4f, +0x51,0x54,0x56,0x59,0x5c,0x5f,0x63,0x66, +0x6a,0x6e,0x72,0x76,0x7a,0x7e,0x80,0x85, +0x89,0x8d,0x90,0x94,0x98,0x9c,0x9f,0xa2, +0xa5,0xa7,0xaa,0xac,0xae,0xb0,0xb2,0xb3, +0xb4,0xb5,0xb5,0xb5,0xb5,0xb5,0xb4,0xb3, +0xb2,0xb0,0xaf,0xad,0xab,0xa8,0xa6,0xa3, +0xa0,0x9d,0x9a,0x96,0x93,0x8f,0x8c,0x88, +0x84,0x80,0x7e,0x7a,0x76,0x72,0x6f,0x6b, +0x68,0x65,0x62,0x5f,0x5c,0x59,0x57,0x54, +0x52,0x50,0x4f,0x4d,0x4c,0x4b,0x4a,0x4a, +0x4a,0x4a,0x4a,0x4a,0x4b,0x4c,0x4d,0x4f, +0x50,0x52,0x54,0x56,0x59,0x5c,0x5e,0x61, +0x64,0x67,0x6a,0x6d,0x71,0x74,0x77,0x7b, +0x7f,0x81,0x84,0x88,0x8b,0x8e,0x92,0x95, +0x98,0x9b,0x9e,0xa1,0xa3,0xa5,0xa8,0xaa, +0xac,0xad,0xaf,0xb0,0xb1,0xb2,0xb3,0xb3, +0xb3,0xb3,0xb3,0xb3,0xb2,0xb2,0xb1,0xb0, +0xae,0xac,0xab,0xa9,0xa7,0xa4,0xa2,0xa0, +0x9d,0x9a,0x97,0x95,0x91,0x8f,0x8b,0x89, +0x85,0x82,0x80,0x7d,0x79,0x76,0x73,0x70, +0x6d,0x6a,0x68,0x65,0x62,0x5f,0x5d,0x5b, +0x59,0x56,0x55,0x53,0x51,0x50,0x4f,0x4e, +0x4d,0x4c,0x4c,0x4c,0x4b,0x4b,0x4c,0x4c, +0x4d,0x4e,0x4e,0x50,0x51,0x53,0x54,0x56, +0x58,0x5a,0x5b,0x5d,0x60,0x63,0x65,0x68, +0x6a,0x6d,0x70,0x73,0x76,0x78,0x7c,0x7f, +0x80,0x84,0x87,0x89,0x8c,0x8f,0x92,0x94, +0x97,0x99,0x9c,0x9e,0xa0,0xa2,0xa5,0xa6, +0xa8,0xaa,0xab,0xad,0xae,0xaf,0xaf,0xb0, +0xb1,0xb1,0xb2,0xb2,0xb2,0xb1,0xb1,0xb1, +0xb0,0xaf,0xae,0xad,0xac,0xab,0xa9,0xa8, +0xa5,0xa4,0xa2,0xa0,0x9e,0x9c,0x99,0x97, +0x95,0x92,0x90,0x8d,0x8b,0x88,0x86,0x82, +0x80,0x7e,0x7b,0x78,0x76,0x73,0x71,0x6e, +0x6c,0x69,0x67,0x65,0x63,0x60,0x5e,0x5d, +0x5b,0x59,0x57,0x56,0x54,0x53,0x52,0x51, +0x50,0x50,0x4f,0x4e,0x4e,0x4e,0x4d,0x4d, +0x4e,0x4e,0x4e,0x4f,0x4f,0x50,0x51,0x52, +0x53,0x54,0x56,0x57,0x58,0x5a,0x5c,0x5e, +0x60,0x62,0x63,0x65,0x67,0x6a,0x6c,0x6f, +0x71,0x73,0x75,0x78,0x7a,0x7d,0x7f,0x80, +0x83,0x85,0x88,0x8a,0x8c,0x8f,0x91,0x93, +0x95,0x97,0x99,0x9b,0x9d,0x9f,0xa1,0xa2, +0xa4,0xa5,0xa7,0xa8,0xa9,0xaa,0xab,0xac, +0xad,0xae,0xae,0xaf,0xaf,0xaf,0xaf,0xaf, +0xaf,0xaf,0xaf,0xae,0xae,0xad,0xad,0xac, +0xab,0xaa,0xa9,0xa8,0xa7,0xa5,0xa4,0xa3, +0xa1,0x9f,0x9e,0x9c,0x9a,0x98,0x96,0x95, +0x92,0x91,0x8e,0x8c,0x8a,0x88,0x86,0x84, +0x81,0x80,0x7e,0x7c,0x7a,0x78,0x75,0x73, +0x71,0x6f,0x6d,0x6b,0x6a,0x67,0x66,0x64, +0x63,0x61,0x5f,0x5e,0x5c,0x5b,0x5a,0x58, +0x57,0x56,0x55,0x54,0x53,0x53,0x52,0x51, +0x51,0x50,0x50,0x50,0x50,0x50,0x50,0x50, +0x50,0x50,0x51,0x51,0x52,0x53,0x53,0x54, +0x55,0x56,0x57,0x58,0x59,0x5a,0x5c,0x5d, +0x5f,0x60,0x61,0x63,0x64,0x66,0x68,0x69, +0x6c,0x6d,0x6f,0x71,0x73,0x74,0x77,0x78, +0x7a,0x7c,0x7e,0x80,0x81,0x83,0x84,0x87, +0x88,0x8a,0x8c,0x8e,0x8f,0x92,0x93,0x94, +0x96,0x98,0x99,0x9b,0x9d,0x9e,0x9f,0xa0, +0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9, +0xa9,0xaa,0xaa,0xab,0xac,0xac,0xac,0xac, +0xad,0xad,0xad,0xad,0xad,0xac,0xac,0xac, +0xac,0xab,0xab,0xaa,0xaa,0xa9,0xa8,0xa7, +0xa6,0xa6,0xa5,0xa4,0xa2,0xa1,0xa0,0x9f, +0x9e,0x9d,0x9b,0x99,0x98,0x97,0x95,0x94, +0x93,0x90,0x8f,0x8d,0x8c,0x8a,0x89,0x87, +0x86,0x83,0x82,0x80,0x80,0x7e,0x7c,0x7b, +0x79,0x78,0x76,0x75,0x72,0x71,0x6f,0x6e, +0x6c,0x6b,0x6a,0x68,0x67,0x66,0x64,0x63, +0x62,0x61,0x60,0x5e,0x5d,0x5c,0x5b,0x5a, +0x59,0x59,0x58,0x57,0x56,0x56,0x55,0x55, +0x54,0x54,0x54,0x53,0x53,0x53,0x53,0x53, +0x53,0x53,0x53,0x53,0x53,0x54,0x54,0x54, +0x55,0x55,0x56,0x56,0x56,0x57,0x58,0x59, +0x59,0x5a,0x5b,0x5c,0x5d,0x5e,0x5f,0x60, +0x61,0x62,0x64,0x64,0x65,0x67,0x68,0x69, +0x6b,0x6c,0x6e,0x6f,0x70,0x71,0x73,0x74, +0x76,0x77,0x79,0x7a,0x7c,0x7d,0x7e,0x80, +0x80,0x82,0x83,0x85,0x86,0x88,0x89,0x8a, +0x8b,0x8d,0x8e,0x90,0x91,0x92,0x93,0x94, +0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d, +0x9e,0x9f,0xa0,0xa1,0xa2,0xa2,0xa3,0xa4, +0xa5,0xa5,0xa6,0xa6,0xa7,0xa7,0xa8,0xa8, +0xa8,0xa9,0xa9,0xa9,0xa9,0xa9,0xaa,0xaa, +0xaa,0xa9,0xa9,0xa9,0xa9,0xa9,0xa9,0xa8, +0xa8,0xa8,0xa7,0xa7,0xa6,0xa6,0xa5,0xa4, +0xa4,0xa3,0xa2,0xa1,0xa1,0xa0,0x9f,0x9e, +0x9d,0x9d,0x9c,0x9a,0x99,0x99,0x97,0x96, +0x95,0x94,0x93,0x92,0x90,0x8f,0x8e,0x8d, +0x8c,0x8a,0x89,0x88,0x87,0x85,0x84,0x83, +0x81,0x80,0x80,0x7f,0x7d,0x7d,0x7b,0x7a, +0x78,0x77,0x76,0x75,0x74,0x73,0x71,0x70, +0x6f,0x6e,0x6c,0x6c,0x6b,0x69,0x68,0x68, +0x66,0x65,0x65,0x64,0x63,0x62,0x61,0x60, +0x5f,0x5f,0x5e,0x5d,0x5d,0x5c,0x5b,0x5b, +0x5a,0x5a,0x59,0x59,0x58,0x58,0x58,0x57, +0x57,0x57,0x57,0x57,0x56,0x56,0x56,0x56, +0x56,0x56,0x56,0x57,0x57,0x57,0x57,0x57, +0x58,0x58,0x58,0x59,0x59,0x5a,0x5a,0x5a, +0x5b,0x5c,0x5c,0x5d,0x5d,0x5e,0x5f,0x5f, +0x60,0x61,0x62,0x63,0x64,0x64,0x65,0x66, +0x67,0x68,0x69,0x6a,0x6b,0x6c,0x6d,0x6e, +0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76, +0x77,0x78,0x7a,0x7b,0x7c,0x7d,0x7e,0x80, +0x80,0x81,0x81,0x83,0x84,0x85,0x86,0x87, +0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f, +0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x96, +0x98,0x98,0x99,0x9a,0x9b,0x9b,0x9c,0x9d, +0x9d,0x9e,0x9f,0x9f,0xa0,0xa0,0xa1,0xa1, +0xa2,0xa2,0xa3,0xa3,0xa3,0xa4,0xa4,0xa4, +0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa6,0xa6, +0xa6,0xa6,0xa6,0xa6,0xa6,0xa5,0xa5,0xa5, +0xa5,0xa5,0xa5,0xa4,0xa4,0xa4,0xa3,0xa3, +0xa3,0xa2,0xa2,0xa1,0xa1,0xa0,0xa0,0x9f, +0x9f,0x9e,0x9e,0x9d,0x9d,0x9c,0x9b,0x9a, +0x9a,0x99,0x98,0x97,0x97,0x96,0x95,0x95, +0x93,0x93,0x92,0x91,0x90,0x8f,0x8e,0x8d, +0x8d,0x8c,0x8b,0x8a,0x89,0x88,0x87,0x86, +0x85,0x84,0x83,0x82,0x81,0x80,0x80,0x80, +0x7e,0x7e,0x7d,0x7c,0x7b,0x7a,0x79,0x78, +0x77,0x76,0x75,0x74,0x74,0x73,0x72,0x71, +0x70,0x70,0x6e,0x6e,0x6d,0x6c,0x6b,0x6a, +0x6a,0x69,0x68,0x67,0x67,0x66,0x65,0x65, +0x64,0x64,0x63,0x62,0x62,0x62,0x61,0x61, +0x60,0x60,0x5f,0x5f,0x5e,0x5e,0x5d,0x5d, +0x5d,0x5d,0x5c,0x5c,0x5c,0x5c,0x5b,0x5b, +0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b, +0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b,0x5b, +0x5b,0x5c,0x5c,0x5c,0x5c,0x5d,0x5d,0x5d, +0x5e,0x5e,0x5e,0x5f,0x5f,0x60,0x60,0x60, +0x61,0x61,0x62,0x62,0x63,0x63,0x64,0x64, +0x65,0x65,0x66,0x67,0x67,0x68,0x69,0x69, +0x6a,0x6b,0x6b,0x6c,0x6d,0x6d,0x6e,0x6f, +0x70,0x70,0x71,0x72,0x73,0x73,0x74,0x75, +0x76,0x77,0x77,0x78,0x79,0x7a,0x7b,0x7b, +0x7c,0x7d,0x7e,0x7e,0x80,0x80,0x80,0x81, +0x82,0x82,0x83,0x84,0x85,0x85,0x86,0x87, +0x88,0x88,0x89,0x8a,0x8b,0x8b,0x8c,0x8d, +0x8d,0x8e,0x8f,0x90,0x90,0x91,0x92,0x92, +0x93,0x93,0x94,0x95,0x95,0x96,0x96,0x97, +0x97,0x98,0x99,0x99,0x99,0x9a,0x9a,0x9b, +0x9b,0x9b,0x9c,0x9c,0x9d,0x9d,0x9d,0x9e, +0x9e,0x9e,0x9e,0x9f,0x9f,0x9f,0x9f,0xa0, +0xa0,0xa0,0xa0,0xa0,0xa0,0xa1,0xa1,0xa1, +0xa1,0xa1,0xa1,0xa1,0xa1,0xa1,0xa1,0xa1, +0xa1,0xa1,0xa1,0xa1,0xa0,0xa0,0xa0,0xa0, +0xa0,0xa0,0x9f,0x9f,0x9f,0x9f,0x9f,0x9e, +0x9e,0x9e,0x9d,0x9d,0x9d,0x9c,0x9c,0x9c, +0x9b,0x9b,0x9a,0x9a,0x9a,0x99,0x99,0x98, +0x98,0x97,0x97,0x96,0x96,0x95,0x95,0x94, +0x94,0x93,0x93,0x92,0x92,0x91,0x90,0x90, +0x8f,0x8f,0x8e,0x8d,0x8d,0x8c,0x8c,0x8b, +0x8a,0x8a,0x89,0x88,0x88,0x87,0x87,0x86, +0x85,0x85,0x84,0x83,0x83,0x82,0x81,0x81, +0x80,0x80,0x80,0x7f,0x7e,0x7e,0x7d,0x7d, +0x7c,0x7b,0x7a,0x7a,0x79,0x79,0x78,0x78, +0x77,0x76,0x75,0x75,0x74,0x74,0x73,0x73, +0x72,0x72,0x71,0x71,0x70,0x6f,0x6f,0x6e, +0x6e,0x6d,0x6d,0x6c,0x6c,0x6b,0x6b,0x6a, +0x6a,0x69,0x69,0x69,0x68,0x68,0x68,0x67, +0x67,0x66,0x66,0x65,0x65,0x65,0x65,0x64, +0x64,0x64,0x63,0x63,0x63,0x63,0x62,0x62, +0x62,0x62,0x62,0x61,0x61,0x61,0x61,0x61, +0x61,0x61,0x60,0x60,0x60,0x60,0x60,0x60, +0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60, +0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x61, +0x61,0x61,0x61,0x61,0x61,0x62,0x62,0x62, +0x62,0x62,0x63,0x63,0x63,0x63,0x64,0x64, +0x64,0x64,0x65,0x65,0x65,0x66,0x66,0x66, +0x66,0x67,0x67,0x67,0x68,0x68,0x69,0x69, +0x69,0x6a,0x6a,0x6b,0x6b,0x6b,0x6c,0x6c, +0x6d,0x6d,0x6e,0x6e,0x6e,0x6f,0x6f,0x70, +0x70,0x71,0x71,0x72,0x72,0x73,0x73,0x74, +0x74,0x75,0x75,0x76,0x76,0x77,0x77,0x78, +0x78,0x79,0x79,0x7a,0x7a,0x7b,0x7b,0x7c, +0x7c,0x7d,0x7d,0x7e,0x7e,0x7f,0x80,0x80, +0x80,0x80,0x81,0x81,0x82,0x82,0x83,0x83, +0x84,0x84,0x84,0x85,0x85,0x86,0x86,0x87, +0x87,0x88,0x88,0x89,0x89,0x8a,0x8a,0x8b, +0x8b,0x8b,0x8c,0x8c,0x8d,0x8d,0x8e,0x8e, +0x8e,0x8e,0x8f,0x8f,0x90,0x90,0x91,0x91, +0x91,0x92,0x92,0x92,0x93,0x93,0x93,0x94, +0x94,0x94,0x94,0x95,0x95,0x95,0x96,0x96, +0x96,0x96,0x97,0x97,0x97,0x97,0x98,0x98, +0x98,0x98,0x98,0x99,0x99,0x99,0x99,0x99, +0x99,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a, +0x9a,0x9a,0x9a,0x9b,0x9b,0x9b,0x9b,0x9b, +0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b,0x9b, +0x9b,0x9b,0x9b,0x9b,0x9b,0x9a,0x9a,0x9a, +0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a,0x9a, +0x99,0x99,0x99,0x99,0x99,0x99,0x98,0x98, +0x98,0x98,0x98,0x98,0x97,0x97,0x97,0x97, +0x96,0x96,0x96,0x96,0x96,0x95,0x95,0x95, +0x94,0x94,0x94,0x94,0x94,0x93,0x93,0x93, +0x92,0x92,0x92,0x91,0x91,0x91,0x90,0x90, +0x90,0x90,0x8f,0x8f,0x8e,0x8e,0x8e,0x8e, +0x8d,0x8d,0x8c,0x8c,0x8c,0x8b,0x8b,0x8b, +0x8a,0x8a,0x89,0x89,0x89,0x89,0x88,0x88, +0x87,0x87,0x86,0x86,0x86,0x85,0x85,0x85, +0x84,0x84,0x84,0x83,0x83,0x82,0x82,0x82, +0x81,0x81,0x80,0x80,0x80,0x80,0x80,0x80, +0x7f,0x7f,0x7f,0x7e,0x7e,0x7d,0x7d,0x7d, +0x7c,0x7c,0x7b,0x7b,0x7b,0x7b,0x7a,0x7a, +0x79,0x79,0x79,0x78,0x78,0x77,0x77,0x77, +0x77,0x76,0x76,0x75,0x75,0x75,0x75,0x74, +0x74,0x74,0x73,0x73,0x73,0x72,0x72,0x72, +0x72,0x71,0x71,0x71,0x70,0x70,0x70,0x6f, +0x6f,0x6f,0x6f,0x6e,0x6e,0x6e,0x6e,0x6e, +0x6d,0x6d,0x6d,0x6d,0x6c,0x6c,0x6c,0x6c, +0x6c,0x6b,0x6b,0x6b,0x6b,0x6b,0x6a,0x6a, +0x6a,0x6a,0x6a,0x6a,0x6a,0x69,0x69,0x69, +0x69,0x69,0x69,0x69,0x69,0x68,0x68,0x68, +0x68,0x68,0x68,0x68,0x68,0x68,0x68,0x68, +0x68,0x67,0x67,0x67,0x67,0x67,0x67,0x67, +0x67,0x67,0x67,0x67,0x67,0x67,0x67,0x67, +0x67,0x67,0x67,0x67,0x67,0x67,0x67,0x67, +0x67,0x67,0x67,0x67,0x68,0x68,0x68,0x68, +0x68,0x68,0x68,0x68,0x68,0x68,0x68,0x68, +0x68,0x69,0x69,0x69,0x69,0x69,0x69,0x69, +0x69,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a,0x6a, +0x6b,0x6b,0x6b,0x6b,0x6b,0x6b,0x6c,0x6c, +0x6c,0x6c,0x6c,0x6d,0x6d,0x6d,0x6d,0x6d, +0x6d,0x6e,0x6e,0x6e,0x6e,0x6e,0x6f,0x6f, +0x6f,0x6f,0x6f,0x70,0x70,0x70,0x70,0x71, +0x71,0x71,0x71,0x72,0x72,0x72,0x72,0x73, +0x73,0x73,0x73,0x73,0x74,0x74,0x74,0x74, +0x75,0x75,0x75,0x76,0x76,0x76,0x76,0x77, +0x77,0x77,0x77,0x77,0x78,0x78,0x79,0x79, +0x79,0x79,0x79,0x7a,0x7a,0x7a,0x7a,0x7b, +0x7b,0x7b,0x7c,0x7c,0x7c,0x7c,0x7c,0x7d, +0x7d,0x7d,0x7e,0x7e,0x7e,0x7e,0x7f,0x7f, +0x7f,0x80,0x80,0x80,0x80,0x80,0x80,0x80, +0x80,0x80,0x81,0x81,0x81,0x82,0x82,0x82, +0x82,0x82,0x83,0x83,0x83,0x83,0x84,0x84, +0x84,0x84,0x84,0x85,0x85,0x85,0x86,0x86, +0x86,0x86,0x87,0x87,0x87,0x87,0x87,0x88, +0x88,0x88,0x88,0x88,0x89,0x89,0x89,0x89, +0x89,0x89,0x8a,0x8a,0x8a,0x8a,0x8b,0x8b, +0x8b,0x8b,0x8b,0x8b,0x8b,0x8c,0x8c,0x8c, +0x8c,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d, +0x8d,0x8e,0x8e,0x8e,0x8e,0x8e,0x8e,0x8e, +0x8f,0x8f,0x8f,0x8f,0x8f,0x8f,0x8f,0x8f, +0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, +0x90,0x90,0x90,0x91,0x91,0x91,0x91,0x91, +0x91,0x91,0x91,0x91,0x91,0x91,0x91,0x91, +0x92,0x91,0x92,0x92,0x92,0x92,0x92,0x92, +0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92, +0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92, +0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92, +0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92, +0x92,0x92,0x92,0x92,0x92,0x92,0x92,0x92, +0x91,0x91,0x91,0x91,0x91,0x91,0x91,0x91, +0x91,0x91,0x91,0x91,0x91,0x91,0x91,0x91, +0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90, +0x90,0x90,0x90,0x90,0x8f,0x8f,0x8f,0x8f, +0x8f,0x8f,0x8f,0x8f,0x8f,0x8e,0x8e,0x8e, +0x8e,0x8e,0x8e,0x8e,0x8e,0x8e,0x8d,0x8d, +0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8d,0x8c, +0x8c,0x8c,0x8c,0x8c,0x8c,0x8c,0x8b,0x8b, +0x8b,0x8b,0x8b,0x8b,0x8b,0x8a,0x8a,0x8a, +0x8a,0x8a,0x8a,0x8a,0x89,0x89,0x89,0x89, +0x89,0x89,0x88,0x88,0x88,0x88,0x88,0x88, +0x88,0x87,0x87,0x87,0x87,0x87,0x86,0x86, +0x86,0x86,0x86,0x86,0x86,0x86,0x85,0x85, +0x85,0x85,0x85,0x84,0x84,0x84,0x84,0x84, +0x84,0x84,0x84,0x83,0x83,0x83,0x83,0x83, +0x83,0x82,0x82,0x82,0x82,0x82,0x81,0x81, +0x81,0x81,0x81,0x81,0x81,0x81,0x80,0x80, +0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80, +0x80,0x80,0x80,0x7f,0x7f,0x7f,0x7f,0x7f, +0x7f,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7d, +0x7e,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d, +0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d, +0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7d, +0x7d,0x7d,0x7d,0x7d,0x7d,0x7d,0x7e,0x7d, +0x7d,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e,0x7e, +0x7e,0x7e,0x7e,0x7f,0x7f,0x7f,0x7f,0x7f, +0x7f,0x7f,0x80,0x80,0x80,0x80,0x80,0x80, +}; diff --git a/reactos/drivers/multimedia/audio/sound/include/devices.h b/reactos/drivers/multimedia/audio/sound/include/devices.h new file mode 100644 index 00000000000..ada5eb8c768 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/include/devices.h @@ -0,0 +1,16 @@ +typedef struct +{ + LPSTR LeftVolumeName; + LPSTR RightVolumeName; + ULONG DefaultVolume; + ULONG Type; + ULONG DeviceType; + char Key[4]; + LPSTR PrototypeName; + PVOID DeferredRoutine; + PVOID ExclusionRoutine; + PVOID DispatchRoutine; + PVOID DevCapsRoutine; + PVOID HwSetVolume; + ULONG IoMethod; +}SOUND_DEVICE_INIT; diff --git a/reactos/drivers/multimedia/audio/sound/mixer.c b/reactos/drivers/multimedia/audio/sound/mixer.c new file mode 100644 index 00000000000..30152610c18 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/mixer.c @@ -0,0 +1,50 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: drivers/dd/sound/mixer.c + * PURPOSE: Wave Mixer? + * PROGRAMMER: ? + * + * UPDATE HISTORY: + * ??/??/??: Created + * 10/23/02: Steven Edwards (Steven_Ed4153@yahoo.com) + * Minor build fixes + */ + +#include "sb16.h" +#include "dsp.h" +#include "mixer.h" + +unsigned char read_mixer(unsigned short base,unsigned char reg) +{ + +// outb(base+0x04,reg); +// return inb(base+0x05); + return 0; +} + +unsigned char get_irq(SB16* sb16) +{ + unsigned char irq; + irq=(read_mixer(sb16->base,MIXER_INTERRUPT_SETUP_REGISTER)&0x0f); + + if(irq==1) sb16->irq=2; + if(irq==2) sb16->irq=5; + if(irq==4) sb16->irq=7; + if(irq==8) sb16->irq=10; + return 0; +} + +void get_dma(SB16* sb16) +{ + unsigned char hi,lo,result=read_mixer(sb16->base,MIXER_DMA_SETUP_REGISTER); + hi=result&0xE0; + lo=result&0x0B; + if(hi==0x80) sb16->dma16=7; + if(hi==0x40) sb16->dma16=6; + if(hi==0x20) sb16->dma16=5; + + if(lo==0x08) sb16->dma8=3; + if(lo==0x02) sb16->dma8=1; + if(lo==0x01) sb16->dma8=0; +} diff --git a/reactos/drivers/multimedia/audio/sound/mixer.h b/reactos/drivers/multimedia/audio/sound/mixer.h new file mode 100644 index 00000000000..564ae35587c --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/mixer.h @@ -0,0 +1,8 @@ +#define MIXER_INTERRUPT_SETUP_REGISTER 0x80 +#define MIXER_DMA_SETUP_REGISTER 0x81 +#define MIXER_INTERRUP_STATUS_REGISTEER 0x82 + +void get_dma(SB16* sb16); +unsigned char read_mixer(unsigned short base,unsigned char reg); +unsigned char get_irq(SB16* sb16); + diff --git a/reactos/drivers/multimedia/audio/sound/sb16.c b/reactos/drivers/multimedia/audio/sound/sb16.c new file mode 100644 index 00000000000..9afcc769a93 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/sb16.c @@ -0,0 +1,61 @@ +/* $Id$ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: services/dd/sound/sb16.c + * PURPOSE: SB16 device driver + * PROGRAMMER: Steven Edwards + * UPDATE HISTORY: + * 19/01/04 Created + * + */ + +/* INCLUDES ****************************************************************/ + +#include + +NTSTATUS STDCALL +DriverEntry(PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath); + +#define NDEBUG +#include + +NTSTATUS STDCALL +DriverEntry(PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath) +/* + * FUNCTION: Called by the system to initalize the driver + * ARGUMENTS: + * DriverObject = object describing this driver + * RegistryPath = path to our configuration entries + * RETURNS: Success or failure + */ +{ + PDEVICE_OBJECT DeviceObject; + UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\Device\\SNDBLST"); + UNICODE_STRING SymlinkName = RTL_CONSTANT_STRING(L"\\??\\SNDBLST"); + NTSTATUS Status; + + DPRINT1("Sound Blaster 16 Driver 0.0.1\n"); + + DriverObject->Flags = 0; + + Status = IoCreateDevice(DriverObject, + 0, + &DeviceName, + FILE_DEVICE_BEEP, + 0, + FALSE, + &DeviceObject); + if (!NT_SUCCESS(Status)) + return Status; + + /* Create the dos device link */ + IoCreateSymbolicLink(&SymlinkName, + &DeviceName); + + return(STATUS_SUCCESS); +} + +/* EOF */ diff --git a/reactos/drivers/multimedia/audio/sound/sb16.h b/reactos/drivers/multimedia/audio/sound/sb16.h new file mode 100644 index 00000000000..1a60200d422 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/sb16.h @@ -0,0 +1,9 @@ +typedef struct +{ + unsigned short base; + unsigned char irq; + unsigned char dma8; + unsigned char dma16; + unsigned char* buffer; +}SB16; + diff --git a/reactos/drivers/multimedia/audio/sound/sb16.rc b/reactos/drivers/multimedia/audio/sound/sb16.rc new file mode 100644 index 00000000000..2cc53d9247d --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/sb16.rc @@ -0,0 +1,7 @@ +/* $Id$ */ + +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "SB16 driver\0" +#define REACTOS_STR_INTERNAL_NAME "sb16\0" +#define REACTOS_STR_ORIGINAL_FILENAME "sb16.sys\0" +#include diff --git a/reactos/drivers/multimedia/audio/sound/sb_waveout.c b/reactos/drivers/multimedia/audio/sound/sb_waveout.c new file mode 100644 index 00000000000..2771ccf6b22 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/sb_waveout.c @@ -0,0 +1,5 @@ +#if 0 +void write_wave() +{ +} +#endif diff --git a/reactos/drivers/multimedia/audio/sound/sound.c b/reactos/drivers/multimedia/audio/sound/sound.c new file mode 100644 index 00000000000..22099622668 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/sound.c @@ -0,0 +1,120 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: mkernel/modules/sound/sound.c + * PURPOSE: SoundBlaster 16 Driver + * PROGRAMMER: Snatched from David Welch (welch@mcmail.com) + * Modified for Soundblaster by Robert Bergkvist (fragdance@hotmail.com) + * UPDATE HISTORY: + * ??/??/??: Created + * + */ + +/* FUNCTIONS **************************************************************/ + +#include +#include +#include +#include "sb16.h" +#include "dsp.h" +#include "mixer.h" +#include "wave.h" + +#define NDEBUG +#include + +SB16 sb16; +sb_status sb16_getenvironment(void); + +#if 0 +static NTSTATUS STDCALL Dispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) +/* + * FUNCTION: Handles user mode requests + * ARGUMENTS: + * DeviceObject = Device for request + * Irp = I/O request packet describing request + * RETURNS: Success or failure + */ +{ + PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp); + NTSTATUS status; + + switch (Stack->MajorFunction) + { + case IRP_MJ_CREATE: + DPRINT1("(SoundBlaster 16 Driver WaveOut) Creating\n"); + reset_dsp(sb16.base); + status = STATUS_SUCCESS; + break; + + case IRP_MJ_CLOSE: + status = STATUS_SUCCESS; + break; + + case IRP_MJ_WRITE: + DPRINT1("(SoundBlaster 16 Driver) Writing %d bytes\n",Stack->Parameters.Write.Length); + sb16_play((WAVE_HDR*)Irp->UserBuffer); + status = STATUS_SUCCESS; + break; + + default: + status = STATUS_NOT_IMPLEMENTED; + break; + } + + Irp->IoStatus.Status = status; + Irp->IoStatus.Information = 0; + + IoCompleteRequest(Irp, IO_NO_INCREMENT); + return(status); +} + +NTSTATUS ModuleEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) +/* + * FUNCTION: Called by the system to initalize the driver + * ARGUMENTS: + * DriverObject = object describing this driver + * RegistryPath = path to our configuration entries + * RETURNS: Success or failure + */ +{ +#if 0 + PDEVICE_OBJECT DeviceObject; + NTSTATUS ret; + + DPRINT1("SoundBlaster 16 Driver 0.0.1\n"); + if(sb16_getenvironment()!=SB_TRUE) + { + DPRINT1("Soundblaster 16 not found\n"); + return 0; + } + ret = IoCreateDevice(DriverObject,0,L"\\Device\\WaveOut",FILE_DEVICE_WAVE_OUT,0,FALSE,&DeviceObject); + if (ret!=STATUS_SUCCESS) + return(ret); + + DeviceObject->Flags=0; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = Dispatch; + DriverObject->MajorFunction[IRP_MJ_CREATE] =Dispatch; + DriverObject->MajorFunction[IRP_MJ_WRITE] = Dispatch; + DriverObject->MajorFunction[IRP_MJ_WRITE] = Dispatch; + DriverObject->DriverUnload = NULL; +#endif + return(STATUS_SUCCESS); +} +#endif + +sb_status sb16_getenvironment(void) +{ + if(detect_dsp(&sb16)!=SB_TRUE) + { + DPRINT1("Detect DSP failed!!!\n"); + return SB_FALSE; + } + DPRINT1("DSP base address 0x%x\n",sb16.base); + get_irq(&sb16); + DPRINT1("IRQ: %d\n",sb16.irq); + get_dma(&sb16); + DPRINT1("DMA8: 0x%x DMA16: 0x%x\n",sb16.dma8,sb16.dma16); + return SB_TRUE; +} + diff --git a/reactos/drivers/multimedia/audio/sound/sound.rbuild b/reactos/drivers/multimedia/audio/sound/sound.rbuild new file mode 100644 index 00000000000..6b4587727f2 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/sound.rbuild @@ -0,0 +1,13 @@ + + + ntoskrnl + hal + .\include + dsp.c + mixer.c + sb16.c + sb_waveout.c + sound.c + wave.c + sb16.rc + diff --git a/reactos/drivers/multimedia/audio/sound/wave.c b/reactos/drivers/multimedia/audio/sound/wave.c new file mode 100644 index 00000000000..a2da64d7eff --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/wave.c @@ -0,0 +1,151 @@ +/* + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS kernel + * FILE: mkernel/modules/sound/sound.c + * PURPOSE: SoundBlaster 16 Driver + * PROGRAMMER: Snatched from David Welch (welch@mcmail.com) + * Modified for Soundblaster by Robert Bergkvist (fragdance@hotmail.com) + * UPDATE HISTORY: + * ??/??/??: Created + * + */ + +/* FUNCTIONS **************************************************************/ + +#include +#include +#include + +#include "sb16.h" +#include "dsp.h" +#include "mixer.h" +#include "in.h" +#include "wave.h" + +#define NDEBUG +#include + +SB16 sb16; + +ULONG OldIRQ; +PKINTERRUPT IrqObject; + +static BOOLEAN STDCALL DMAOutputISR(PKINTERRUPT Interrupt, PVOID ServiceContext) +{ + DPRINT1("interrupt\n"); + return FALSE; +} + +void sb16_play(WAVE_HDR* wave) +{ + ULONG MappedIrq; + KIRQL Dirql; + KAFFINITY Affinity; + PKINTERRUPT IrqObject; + unsigned int newmask; + + unsigned int i; + unsigned int tmp[255]; + i=0; + dump_wav(wave); + do + { +// tmp[i++]=get_dma_page(0x0fffff); +// DPRINT1("0x%x ",tmp[i-1]); + } + while((tmp[i-1]&0xffff)!=0); + // free_page((tmp[0]),i-1); + sb16.buffer=((unsigned char*)tmp[i-1]); + + /* + * Because this is used by alomost every subsystem including irqs it + * must be atomic. The following code sequence disables interrupts after + * saving the previous state of the interrupt flag + */ + + _disable(); + + memcpy(sb16.buffer,(&wave->data),wave->dLen); + + + MappedIrq = HalGetInterruptVector(Internal,0,0,8+sb16.irq,&Dirql,&Affinity); + + + + IoConnectInterrupt(&IrqObject,DMAOutputISR,0,NULL,MappedIrq,Dirql,Dirql,0,FALSE,Affinity,FALSE); + + // mask=inb(0x21); + newmask=((int)1<dLen); + //set_dma_mode(1,DMA_MODE_WRITE); + //outb(0xb,0x49); + //outb(0x3,(wave->dLen)&0xff); + //outb(0x3,((unsigned int)(wave->dLen)>>8)&0xff); + //set_dma_addr(sb16.dma8,(unsigned int)sb16.buffer); + //outb(0x83,(((unsigned int)(sb16.buffer-IDMAP_BASE)>>16))&0xf); + //outb(0x2,((unsigned int)sb16.buffer&0xff)); + //outb(0x2,(((unsigned int)(sb16.buffer-IDMAP_BASE)>>8))&0xff); + //enable_dma(sb16.dma8); + //outb(0xa,1); + + write_dsp(sb16.base,0x00D1); + + write_dsp(sb16.base,0x40); + write_dsp(sb16.base,((unsigned char)256-(1000000/wave->nSamplesPerSec))); + +// outb(sb16.base + 4, (int) 0xa); +// outb(sb16.base + 5, (int) 0x00); + +// outb(sb16.base + 4, (int) 4); +// outb(sb16.base + 5, (int) 0xFF); + +// outb(sb16.base + 4, (int) 0x22); +// outb(sb16.base + 5, (int) 0xFF); + + write_dsp(sb16.base,0x14); + write_dsp(sb16.base,(wave->dLen&0x00ff)); + write_dsp(sb16.base,((wave->dLen)&0xff00)>>8); + +// write_dsp(sb16.base,0xc0); +// write_dsp(sb16.base,0x0); +// OldIRQ=HalGetInterruptVector(Internal,0,0,irq+8,&irql,&affinity); +// DPRINT1("OldIRQ: 0x%x\n",OldIRQ); + +// status=IoConnectInterrupt(&IrqObject,playRoutine,0,NULL,OldIRQ,irql,irql,0,FALSE,affinity,FALSE); +// if(status!=STATUS_SUCCESS) DPRINT1("Couldn't set irq\n"); +// else DPRINT1("IRQ set\n"); + +} + +void dump_wav(WAVE_HDR* wave) +{ + DPRINT1("wave.rID: %c%c%c%c\n",wave->rID[0],wave->rID[1],wave->rID[2],wave->rID[3]); + DPRINT1("wave.rLen: 0x%x\n",wave->rLen); + DPRINT1("wave.wID: %c%c%c%c\n",wave->wID[0],wave->wID[1],wave->wID[2],wave->wID[3]); + DPRINT1("wave.fID: %c%c%c%c\n",wave->fID[0],wave->fID[1],wave->fID[2],wave->fID[3]); + DPRINT1("wave.fLen: 0x%x\n",wave->fLen); + DPRINT1("wave.wFormatTag: 0x%x\n",wave->wFormatTag); + DPRINT1("wave.nChannels: 0x%x\n",wave->nChannels); + DPRINT1("wave.nSamplesPerSec: 0x%x\n",wave->nSamplesPerSec); + DPRINT1("wave.nAvgBytesPerSec: 0x%x\n",wave->nAvgBytesPerSec); + DPRINT1("wave.nBlockAlign: 0x%x\n",wave->nBlockAlign); + DPRINT1("wave.FormatSpecific: 0x%x\n",wave->FormatSpecific); + DPRINT1("wave.dID: %c%c%c%c\n",wave->dID[0],wave->dID[1],wave->dID[2],wave->dID[3]); + DPRINT1("wave.dLen: 0x%x\n",wave->dLen); +} + +BOOLEAN playRoutine(PKINTERRUPT Interrupt,PVOID ServiceContext) +{ + return FALSE; +} diff --git a/reactos/drivers/multimedia/audio/sound/wave.h b/reactos/drivers/multimedia/audio/sound/wave.h new file mode 100644 index 00000000000..849967261b8 --- /dev/null +++ b/reactos/drivers/multimedia/audio/sound/wave.h @@ -0,0 +1,26 @@ +KIRQL irql; +KAFFINITY affinity; + +#include +typedef struct +{ + unsigned char rID[4] ; //4 0 + unsigned int rLen ; //4 4 + unsigned char wID[4] ; //4 8 + unsigned char fID[4] ; //4 12 + unsigned int fLen ; //4 16 + unsigned short wFormatTag ; //2 18 + unsigned short nChannels ; //2 20 + unsigned int nSamplesPerSec ; //2 22 + unsigned int nAvgBytesPerSec ; //2 24 + unsigned short nBlockAlign ; //2 26 + unsigned short FormatSpecific ; //2 28 + unsigned char dID[4] ; //4 30 + unsigned int dLen ; + unsigned char* data; +}WAVE_HDR; +#include + +void sb16_play(WAVE_HDR* wave); +void dump_wav(WAVE_HDR* wave); +BOOLEAN playRoutine(PKINTERRUPT Interrupt,PVOID ServiceContext); diff --git a/reactos/drivers/multimedia/avtest/avtest.rbuild b/reactos/drivers/multimedia/avtest/avtest.rbuild new file mode 100755 index 00000000000..5088f33c374 --- /dev/null +++ b/reactos/drivers/multimedia/avtest/avtest.rbuild @@ -0,0 +1,8 @@ + + . + .. + + ks + ntoskrnl + entry.c + diff --git a/reactos/drivers/multimedia/avtest/entry.c b/reactos/drivers/multimedia/avtest/entry.c new file mode 100755 index 00000000000..2c66a5e85ba --- /dev/null +++ b/reactos/drivers/multimedia/avtest/entry.c @@ -0,0 +1,83 @@ +#include +#include + +/* Where do we go? */ +#ifndef SIZEOF_ARRAY + #define SIZEOF_ARRAY(array) \ + (sizeof(array) / sizeof(array[0])) +#endif + +/* Not in the DDK but hey! */ +#define DEFINE_KSFILTER_DISPATCH(name) \ + const KSFILTER_DISPATCH name = + +/* To be put in KS.H */ +#define DEFINE_KSFILTER_DESCRIPTOR(name) \ + const KSFILTER_DESCRIPTOR name = + +#define DEFINE_KSFILTER_DESCRIPTOR_TABLE(name) \ + const KSFILTER_DESCRIPTOR* const name[] = + + + +NTSTATUS FilterCreate( + IN OUT PKSFILTER Filter, + IN PIRP Irp) +{ + return STATUS_SUCCESS; +} + +NTSTATUS FilterClose( + IN OUT PKSFILTER Filter, + IN PIRP Irp) +{ + return STATUS_SUCCESS; +} + +NTSTATUS Process( + IN PKSFILTER Filter, + IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex) +{ + return STATUS_SUCCESS; +} + + +DEFINE_KSFILTER_DISPATCH(FilterDispatch) +{ + FilterCreate, + FilterClose, + Process, + NULL // Reset +}; + +DEFINE_KSFILTER_DESCRIPTOR(FilterDesc) +{ +}; + +DEFINE_KSFILTER_DESCRIPTOR_TABLE(FilterDescs) +{ + &FilterDesc +}; + + + +const KSDEVICE_DESCRIPTOR DeviceDescriptor = +{ + NULL, + SIZEOF_ARRAY(FilterDescs), + FilterDescs +}; + + +/* Funcs */ + +NTSTATUS STDCALL +DriverEntry( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPathName) +{ + DPRINT1("AVStream test component loaded!\n"); + + return KsInitializeDriver(DriverObject, RegistryPathName, + &DeviceDescriptor); +} diff --git a/reactos/drivers/multimedia/directory.rbuild b/reactos/drivers/multimedia/directory.rbuild index a6eebf9f591..0cd0966dd8b 100755 --- a/reactos/drivers/multimedia/directory.rbuild +++ b/reactos/drivers/multimedia/directory.rbuild @@ -11,7 +11,6 @@ - @@ -20,10 +19,6 @@ - - - - diff --git a/reactos/drivers/multimedia/include/drmk.h b/reactos/drivers/multimedia/include/drmk.h new file mode 100644 index 00000000000..4d6ee7f2049 --- /dev/null +++ b/reactos/drivers/multimedia/include/drmk.h @@ -0,0 +1,73 @@ +/* + ReactOS Kernel Streaming + Digital Rights Management + + Author: Andrew Greenwood +*/ + +#ifndef DRMK_H +#define DRMK_H + +#include + +typedef struct +{ + DWORD Flags; + PDEVICE_OBJECT DeviceObject; + PFILE_OBJECT FileObject; + PVOID Context; +} DRMFORWARD, *PDRMFORWARD, *PCDRMFORWARD; + +typedef struct +{ + BOOL CopyProtect; + ULONG Reserved; + BOOL DigitalOutputDisable; +} DRMRIGHTS, *PDRMRIGHTS; + + +/* =============================================================== + Digital Rights Management Functions + TODO: Check calling convention +*/ + +NTSTATUS +DrmAddContentHandlers( + IN ULONG ContentId, + IN PVOID *paHandlers, + IN ULONG NumHandlers); + +NTSTATUS +DrmCreateContentMixed( + IN PULONG paContentId, + IN ULONG cContentId, + OUT PULONG pMixedContentId); + +NTSTATUS +DrmDestroyContent( + IN ULONG ContentId); + +NTSTATUS +DrmForwardContentToDeviceObject( + IN ULONG ContentId, + IN PVOID Reserved, + IN PCDRMFORWARD DrmForward); + +NTSTATUS +DrmForwardContentToFileObject( + IN ULONG ContentId, + IN PFILE_OBJECT FileObject); + +NTSTATUS +DrmForwardContentToInterface( + IN ULONG ContentId, + IN PUNKNOWN pUnknown, + IN ULONG NumMethods); + +NTSTATUS +DrmGetContentRights( + IN ULONG ContentId, + OUT PDRMRIGHTS DrmRights); + + +#endif diff --git a/reactos/drivers/multimedia/include/ks.h b/reactos/drivers/multimedia/include/ks.h new file mode 100644 index 00000000000..e0dd7e73190 --- /dev/null +++ b/reactos/drivers/multimedia/include/ks.h @@ -0,0 +1,2481 @@ +/* + ReactOS + Kernel Streaming API + + by Andrew Greenwood + + NOTES: + This is a basic stubbing of the Kernel Streaming API header. It is + very incomplete - a lot of the #defines are not set to any value at all. + + Some of the structs/funcs may be incorrectly grouped. + + GUIDs need to be defined properly. + + AVStream functionality (XP and above, DirectX 8.0 and above) will NOT + implemented for a while. + + Some example code for interaction from usermode: + DeviceIoControl( + FilterHandle, + IOCTL_KS_PROPERTY, + &Property, + sizeof(KSPROPERTY), + &SeekingCapabilities, + sizeof(KS_SEEKING_CAPABILITIES), + &BytesReturned, + &Overlapped); +*/ + +#ifndef KS_H +#define KS_H + +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef BUILDING_KS + #define KSDDKAPI +#else + #define KSDDKAPI DECLSPEC_IMPORT +#endif + +#include +#include + +/* TODO */ +#define KSDDKAPI + + +typedef PVOID PKSWORKER; + +/* =============================================================== + I/O Control Codes +*/ + +#define IOCTL_KS_DISABLE_EVENT \ + CTL_CODE( \ + FILE_DEVICE_KS, \ + 0x000, \ + METHOD_NEITHER, \ + FILE_ANY_ACCESS) + +#define IOCTL_KS_ENABLE_EVENT \ + CTL_CODE( \ + FILE_DEVICE_KS, \ + 0x001, \ + METHOD_NEITHER, \ + FILE_ANY_ACCESS) + +#define IOCTL_KS_METHOD \ + CTL_CODE( \ + FILE_DEVICE_KS, \ + 0x002, \ + METHOD_NEITHER, \ + FILE_ANY_ACCESS) + +#define IOCTL_KS_PROPERTY \ + CTL_CODE( \ + FILE_DEVICE_KS, \ + 0x003, \ + METHOD_NEITHER, \ + FILE_ANY_ACCESS) + +#define IOCTL_KS_WRITE_STREAM \ + CTL_CODE( \ + FILE_DEVICE_KS, \ + 0x004, \ + METHOD_NEITHER, \ + FILE_WRITE_ACCESS) + +#define IOCTL_KS_READ_STREAM \ + CTL_CODE( \ + FILE_DEVICE_KS, \ + 0x005, \ + METHOD_NEITHER, \ + FILE_READ_ACCESS) + +#define IOCTL_KS_RESET_STATE \ + CTL_CODE( \ + FILE_DEVICE_KS, \ + 0x006, \ + METHOD_NEITHER, \ + FILE_ANY_ACCESS) + + +/* =============================================================== + Clock Properties/Methods/Events +*/ + +#define KSPROPSETID_Clock \ + 0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + +typedef enum +{ + KSPROPERTY_CLOCK_TIME, + KSPROPERTY_CLOCK_PHYSICALTIME, + KSPROPERTY_CORRELATEDTIME, + KSPROPERTY_CORRELATEDPHYSICALTIME, + KSPROPERTY_CLOCK_RESOLUTION, + KSPROPERTY_CLOCK_STATE, + KSPROPERTY_CLOCK_FUNCTIONTABLE +} KSPROPERTY_CLOCK; + +#define KSEVENTSETID_Clock \ + 0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + +typedef enum +{ + KSEVENT_CLOCK_INTERVAL_MARK, + KSEVENT_CLOCK_POSITION_MARK +} KSEVENT_CLOCK_POSITION; + + +/* =============================================================== + Connection Properties/Methods/Events +*/ + +#define KSPROPSETID_Connection \ + 0x1D58C920L, 0xAC9B, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + +typedef enum +{ + KSPROPERTY_CONNECTION_STATE, + KSPROPERTY_CONNECTION_PRIORITY, + KSPROPERTY_CONNECTION_DATAFORMAT, + KSPROPERTY_CONNECTION_ALLOCATORFRAMING, + KSPROPERTY_CONNECTION_PROPOSEDATAFORMAT, + KSPROPERTY_CONNECTION_ACQUIREORDERING, + KSPROPERTY_CONNECTION_ALLOCATORFRAMING_EX, + KSPROPERTY_CONNECTION_STARTAT +} KSPROPERTY_CONNECTION; + +#define KSEVENTSETID_Connection \ + 0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00 + +typedef enum +{ + KSEVENT_CONNECTION_POSITIONUPDATE, + KSEVENT_CONNECTION_DATADISCONTINUITY, + KSEVENT_CONNECTION_TIMEDISCONTINUITY, + KSEVENT_CONNECTION_PRIORITY, + KSEVENT_CONNECTION_ENDOFSTREAM +} KSEVENT_CONNECTION; + + +/* =============================================================== + General + Properties/Methods/Events +*/ + +#define KSPROPSETID_General \ + 0x1464EDA5L, 0x6A8F, 0x11D1, 0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +typedef enum +{ + KSPROPERTY_GENERAL_COMPONENTID +} KSPROPERTY_GENERAL; + + +/* =============================================================== + Graph Manager + Properties/Methods/Events +*/ + +#define KSPROPSETID_GM \ + 0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D + +typedef enum +{ + KSPROPERTY_GM_GRAPHMANAGER, + KSPROPERTY_GM_TIMESTAMP_CLOCK, + KSPROPERTY_GM_RATEMATCH, + KSPROPERTY_GM_RENDERCLOCK +} KSPROPERTY_GM; + + +/* =============================================================== + Media Seeking + Properties/Methods/Events +*/ + +#define KSPROPSETID_MediaSeeking \ + 0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + +typedef enum +{ + KSPROPERTY_MEDIASEEKING_CAPABILITIES, + KSPROPERTY_MEDIASEEKING_FORMATS, + KSPROPERTY_MEDIASEEKING_TIMEFORMAT, + KSPROPERTY_MEDIASEEKING_POSITION, + KSPROPERTY_MEDIASEEKING_STOPPOSITION, + KSPROPERTY_MEDIASEEKING_POSITIONS, + KSPROPERTY_MEDIASEEKING_DURATION, + KSPROPERTY_MEDIASEEKING_AVAILABLE, + KSPROPERTY_MEDIASEEKING_PREROLL, + KSPROPERTY_MEDIASEEKING_CONVERTTIMEFORMAT +} KSPROPERTY_MEDIASEEKING; + + +/* =============================================================== + Pin + Properties/Methods/Events +*/ + +#define KSPROPSETID_Pin \ + 0x8C134960L, 0x51AD, 0x11CF, 0x87, 0x8A, 0x94, 0xF8, 0x01, 0xC1, 0x00, 0x00 + +typedef enum +{ + KSPROPERTY_PIN_CINSTANCES, + KSPROPERTY_PIN_CTYPES, + KSPROPERTY_PIN_DATAFLOW, + KSPROPERTY_PIN_DATARANGES, + KSPROPERTY_PIN_DATAINTERSECTION, + KSPROPERTY_PIN_INTERFACES, + KSPROPERTY_PIN_MEDIUMS, + KSPROPERTY_PIN_COMMUNICATION, + KSPROPERTY_PIN_GLOBALCINSTANCES, + KSPROPERTY_PIN_NECESSARYINSTANCES, + KSPROPERTY_PIN_PHYSICALCONNECTION, + KSPROPERTY_PIN_CATEGORY, + KSPROPERTY_PIN_NAME, + KSPROPERTY_PIN_CONSTRAINEDDATARANGES, + KSPROPERTY_PIN_PROPOSEDATAFORMAT +} KSPROPERTY_PIN; + + +/* =============================================================== + Quality + Properties/Methods/Events +*/ + +#define KSPROPSETID_Quality \ + 0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + +typedef enum +{ + KSPROPERTY_QUALITY_REPORT, + KSPROPERTY_QUALITY_ERROR +} KSPROPERTY_QUALITY; + + +/* =============================================================== + Stream + Properties/Methods/Events +*/ + +#define KSPROPSETID_Stream \ + 0x65aaba60L, 0x98ae, 0x11cf, 0xa1, 0x0d, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 + +typedef enum +{ + KSPROPERTY_STREAM_ALLOCATOR, + KSPROPERTY_STREAM_QUALITY, + KSPROPERTY_STREAM_DEGRADATION, + KSPROPERTY_STREAM_MASTERCLOCK, + KSPROPERTY_STREAM_TIMEFORMAT, + KSPROPERTY_STREAM_PRESENTATIONTIME, + KSPROPERTY_STREAM_PRESENTATIONEXTENT, + KSPROPERTY_STREAM_FRAMETIME, + KSPROPERTY_STREAM_RATECAPABILITY, + KSPROPERTY_STREAM_RATE, + KSPROPERTY_STREAM_PIPE_ID +} KSPROPERTY_STREAM; + + +/* =============================================================== + StreamAllocator + Properties/Methods/Events +*/ + +#define KSPROPSETID_StreamAllocator \ + 0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 + +typedef enum +{ + KSPROPERTY_STREAMALLOCATOR_FUNCTIONTABLE, + KSPROPERTY_STREAMALLOCATOR_STATUS +} KSPROPERTY_STREAMALLOCATOR; + +#define KSMETHODSETID_StreamAllocator \ + 0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 + +typedef enum +{ + KSMETHOD_STREAMALLOCATOR_ALLOC, + KSMETHOD_STREAMALLOCATOR_FREE +} KSMETHOD_STREAMALLOCATOR; + + +#define KSEVENTSETID_StreamAllocator + +typedef enum +{ + KSEVENT_STREAMALLOCATOR_INTERNAL_FREEFRAME, + KSEVENT_STREAMALLOCATOR_FREEFRAME +} KSEVENT_STREAMALLOCATOR; + + +/* =============================================================== + StreamInterface + Properties/Methods/Events +*/ + +#define KSPROPSETID_StreamInterface \ + 0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a + +typedef enum +{ + KSPROPERTY_STREAMINTERFACE_HEADERSIZE +} KSPROPERTY_STREAMINTERFACE; + + +/* =============================================================== + Topology + Properties/Methods/Events +*/ + +#define KSPROPSETID_Topology \ + 0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + +typedef enum +{ + KSPROPERTY_TOPOLOGY_CATEGORIES, + KSPROPERTY_TOPOLOGY_CONNECTIONS, + KSPROPERTY_TOPOLOGY_NAME, + KSPROPERTY_TOPOLOGY_NODES +} KSPROPERTY_TOPOLOGY; + + + +/* =============================================================== + Property Sets for audio drivers - TODO +*/ + +#define KSPROPSETID_AC3 +/* + KSPROPERTY_AC3_ALTERNATE_AUDIO + KSPROPERTY_AC3_BIT_STREAM_MODE + KSPROPERTY_AC3_DIALOGUE_LEVEL + KSPROPERTY_AC3_DOWNMIX + KSPROPERTY_AC3_ERROR_CONCEALMENT + KSPROPERTY_AC3_LANGUAGE_CODE + KSPROPERTY_AC3_ROOM_TYPE +*/ + +#define KSPROPSETID_Acoustic_Echo_Cancel +/* + KSPROPERTY_AEC_MODE + KSPROPERTY_AEC_NOISE_FILL_ENABLE + KSPROPERTY_AEC_STATUS +*/ + +#define KSPROPSETID_Audio +/* + KSPROPERTY_AUDIO_3D_INTERFACE + KSPROPERTY_AUDIO_AGC + KSPROPERTY_AUDIO_ALGORITHM_INSTANCE + KSPROPERTY_AUDIO_BASS + KSPROPERTY_AUDIO_BASS_BOOST + KSPROPERTY_AUDIO_CHANNEL_CONFIG + KSPROPERTY_AUDIO_CHORUS_LEVEL + KSPROPERTY_AUDIO_COPY_PROTECTION + KSPROPERTY_AUDIO_CPU_RESOURCES + KSPROPERTY_AUDIO_DELAY + KSPROPERTY_AUDIO_DEMUX_DEST + KSPROPERTY_AUDIO_DEV_SPECIFIC + KSPROPERTY_AUDIO_DYNAMIC_RANGE + KSPROPERTY_AUDIO_DYNAMIC_SAMPLING_RATE + KSPROPERTY_AUDIO_EQ_BANDS + KSPROPERTY_AUDIO_EQ_LEVEL + KSPROPERTY_AUDIO_FILTER_STATE + KSPROPERTY_AUDIO_LATENCY + KSPROPERTY_AUDIO_LOUDNESS + KSPROPERTY_AUDIO_MANUFACTURE_GUID + KSPROPERTY_AUDIO_MID + KSPROPERTY_AUDIO_MIX_LEVEL_CAPS + KSPROPERTY_AUDIO_MIX_LEVEL_TABLE + KSPROPERTY_AUDIO_MUTE + KSPROPERTY_AUDIO_MUX_SOURCE + KSPROPERTY_AUDIO_NUM_EQ_BANDS + KSPROPERTY_AUDIO_PEAKMETER + KSPROPERTY_AUDIO_POSITION + KSPROPERTY_AUDIO_PREFERRED_STATUS + KSPROPERTY_AUDIO_PRODUCT_GUID + KSPROPERTY_AUDIO_QUALITY + KSPROPERTY_AUDIO_REVERB_LEVEL + KSPROPERTY_AUDIO_SAMPLING_RATE + KSPROPERTY_AUDIO_STEREO_ENHANCE + KSPROPERTY_AUDIO_STEREO_SPEAKER_GEOMETRY + KSPROPERTY_AUDIO_SURROUND_ENCODE + KSPROPERTY_AUDIO_TREBLE + KSPROPERTY_AUDIO_VOLUMELEVEL + KSPROPERTY_AUDIO_WIDE_MODE + KSPROPERTY_AUDIO_WIDENESS +*/ + +#define KSPROPSETID_AudioGfx +/* + KSPROPERTY_AUDIOGFX_CAPTURETARGETDEVICEID + KSPROPERTY_AUDIOGFX_RENDERTARGETDEVICEID +*/ + +#define KSPROPSETID_DirectSound3DBuffer +/* + KSPROPERTY_DIRECTSOUND3DBUFFER_ALL + KSPROPERTY_DIRECTSOUND3DBUFFER_CONEANGLES + KSPROPERTY_DIRECTSOUND3DBUFFER_CONEORIENTATION + KSPROPERTY_DIRECTSOUND3DBUFFER_CONEOUTSIDEVOLUME + KSPROPERTY_DIRECTSOUND3DBUFFER_MAXDISTANCE + KSPROPERTY_DIRECTSOUND3DBUFFER_MINDISTANCE + KSPROPERTY_DIRECTSOUND3DBUFFER_MODE + KSPROPERTY_DIRECTSOUND3DBUFFER_POSITION + KSPROPERTY_DIRECTSOUND3DBUFFER_VELOCITY +*/ + +#define KSPROPSETID_DirectSound3DListener +/* + KSPROPERTY_DIRECTSOUND3DLISTENER_ALL + KSPROPERTY_DIRECTSOUND3DLISTENER_ALLOCATION + KSPROPERTY_DIRECTSOUND3DLISTENER_BATCH + KSPROPERTY_DIRECTSOUND3DLISTENER_DISTANCEFACTOR + KSPROPERTY_DIRECTSOUND3DLISTENER_DOPPLERFACTOR + KSPROPERTY_DIRECTSOUND3DLISTENER_ORIENTATION + KSPROPERTY_DIRECTSOUND3DLISTENER_POSITION + KSPROPERTY_DIRECTSOUND3DLISTENER_ROLLOFFFACTOR + KSPROPERTY_DIRECTSOUND3DLISTENER_VELOCITY +*/ + +#define KSPROPSETID_DrmAudioStream +/* + KSPROPERTY_DRMAUDIOSTREAM_CONTENTID +*/ + +#define KSPROPSETID_Hrtf3d +/* + KSPROPERTY_HRTF3D_FILTER_FORMAT + KSPROPERTY_HRTF3D_INITIALIZE + KSPROPERTY_HRTF3D_PARAMS +*/ + +#define KSPROPSETID_Itd3d +/* + KSPROPERTY_ITD3D_PARAMS +*/ + +#define KSPROPSETID_Synth +/* + KSPROPERTY_SYNTH_CAPS + KSPROPERTY_SYNTH_CHANNELGROUPS + KSPROPERTY_SYNTH_LATENCYCLOCK + KSPROPERTY_SYNTH_MASTERCLOCK + KSPROPERTY_SYNTH_PORTPARAMETERS + KSPROPERTY_SYNTH_RUNNINGSTATS + KSPROPERTY_SYNTH_VOICEPRIORITY + KSPROPERTY_SYNTH_VOLUME + KSPROPERTY_SYNTH_VOLUMEBOOST +*/ + +#define KSPROPSETID_Synth_Dls +/* + KSPROPERTY_SYNTH_DLS_APPEND + KSPROPERTY_SYNTH_DLS_COMPACT + KSPROPERTY_SYNTH_DLS_DOWNLOAD + KSPROPERTY_SYNTH_DLS_UNLOAD + KSPROPERTY_SYNTH_DLS_WAVEFORMAT +*/ + +#define KSPROPSETID_Sysaudio +/* + KSPROPERTY_SYSAUDIO_COMPONENT_ID + KSPROPERTY_SYSAUDIO_CREATE_VIRTUAL_SOURCE + KSPROPERTY_SYSAUDIO_DEVICE_COUNT + KSPROPERTY_SYSAUDIO_DEVICE_FRIENDLY_NAME + KSPROPERTY_SYSAUDIO_DEVICE_INSTANCE + KSPROPERTY_SYSAUDIO_DEVICE_INTERFACE_NAME + KSPROPERTY_SYSAUDIO_INSTANCE_INFO + KSPROPERTY_SYSAUDIO_SELECT_GRAPH +*/ + +#define KSPROPSETID_Sysaudio_Pin +/* + KSPROPERTY_SYSAUDIO_ATTACH_VIRTUAL_SOURCE +*/ + +#define KSPROPSETID_TopologyNode +/* + KSPROPERTY_TOPOLOGYNODE_ENABLE + KSPROPERTY_TOPOLOGYNODE_RESET +*/ + + +/* =============================================================== + Interface Sets - TODO +*/ + +#define KSINTERFACESETID_Media + +#define KSINTERFACESETID_Standard +#define KSINTERFACE_STANDARD_STREAMING +#define KSINTERFACE_STANDARD_LOOPED_STREAMING +#define KSINTERFACE_STANDARD_CONTROL + + +/* =============================================================== + Event Sets for audio drivers - TODO +*/ +#define KSEVENTSETID_AudioControlChange +/* + KSEVENT_CONTROL_CHANGE +*/ + + + +/* =============================================================== + Node Types +*/ +/* + KSNODETYPE_3D_EFFECTS + KSNODETYPE_ACOUSTIC_ECHO_CANCEL + KSNODETYPE_ADC + KSNODETYPE_AGC + KSNODETYPE_CHORUS + KSNODETYPE_DAC + KSNODETYPE_DELAY + KSNODETYPE_DEMUX + KSNODETYPE_DEV_SPECIFIC + KSNODETYPE_DMSYNTH + KSNODETYPE_DMSYNTH_CAPS + KSNODETYPE_DRM_DESCRAMBLE + KSNODETYPE_EQUALIZER + KSNODETYPE_LOUDNESS + KSNODETYPE_MUTE + KSNODETYPE_MUX + KSNODETYPE_PEAKMETER + KSNODETYPE_PROLOGIC_DECODER + KSNODETYPE_PROLOGIC_ENCODER + KSNODETYPE_REVERB + KSNODETYPE_SRC + KSNODETYPE_STEREO_ENHANCE + KSNODETYPE_STEREO_WIDE + KSNODETYPE_SUM + KSNODETYPE_SUPERMIX + KSNODETYPE_SWMIDI + KSNODETYPE_SWSYNTH + KSNODETYPE_SYNTHESIZER + KSNODETYPE_TONE + KSNODETYPE_VOLUME +*/ + + +typedef PVOID KSDEVICE_HEADER, + KSOBJECT_HEADER, + KSOBJECT_BAG; + + + + +/* =============================================================== + Method Types +*/ + +#define KSMETHOD_TYPE_NONE 0x00000000 +#define KSMETHOD_TYPE_READ 0x00000001 +#define KSMETHOD_TYPE_WRITE 0x00000002 +#define KSMETHOD_TYPE_MODIFY 0x00000003 +#define KSMETHOD_TYPE_SOURCE 0x00000004 +#define KSMETHOD_TYPE_SEND 0x00000001 +#define KSMETHOD_TYPE_SETSUPPORT 0x00000100 +#define KSMETHOD_TYPE_BASICSUPPORT 0x00000200 + + +/* =============================================================== + Property Types +*/ + +#define KSPROPERTY_TYPE_GET 0x00000001 +#define KSPROPERTY_TYPE_SET 0x00000002 +#define KSPROPERTY_TYPE_SETSUPPORT 0x00000100 +#define KSPROPERTY_TYPE_BASICSUPPORT 0x00000200 +#define KSPROPERTY_TYPE_RELATIONS 0x00000400 +#define KSPROPERTY_TYPE_SERIALIZESET 0x00000800 +#define KSPROPERTY_TYPE_UNSERIALIZESET 0x00001000 +#define KSPROPERTY_TYPE_SERIALIZERAW 0x00002000 +#define KSPROPERTY_TYPE_UNSERIALIZERAW 0x00004000 +#define KSPROPERTY_TYPE_SERIALIZESIZE 0x00008000 +#define KSPROPERTY_TYPE_DEFAULT_VALUES 0x00010000 + + +/* =============================================================== + Topology Methods/Properties +*/ + +#define KSMETHOD_TYPE_TOPOLOGY 0x10000000 +#define KSPROPERTY_TYPE_TOPOLOGY 0x10000000 + +/* +#define DEFINE_KS_GUID(GA,GB,GC,GD,GE,GF,GG,GH,GI,GJ,GK) \ + DEFINE_GUID(??, 0x#GA#L, 0xGB, 0xGC, 0xGD, 0xGE, 0xGF, 0xGG, 0xGH, 0xGI, 0xGJ, 0xGK) \ + "GA-GB-GC-GDGE-GFGGGHGIGJGK" +*/ + +/* =============================================================== + KS Category GUIDs + + BRIDGE - 0x085AFF00L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + CAPTURE - 0x65E8773DL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + RENDER - 0x65E8773EL, 0x8F56, 0x11D0, 0xA3, 0xB9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + MIXER - 0xAD809C00L, 0x7B88, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + SPLITTER - 0x0A4252A0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + DATACOMPRESSOR - 0x1E84C900L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + DATADECOMPRESSOR - 0x2721AE20L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + DATATRANSFORM - 0x2EB07EA0L, 0x7E70, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + COMMUNICATIONSTRANSFORM - 0xCF1DDA2CL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + INTERFACETRANSFORM - 0xCF1DDA2DL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + MEDIUMTRANSFORM - 0xCF1DDA2EL, 0x9743, 0x11D0, 0xA3, 0xEE, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + FILESYSTEM - 0x760FED5EL, 0x9357, 0x11D0, 0xA3, 0xCC, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + CLOCK - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + PROXY - 0x97EBAACAL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + QUALITY - 0x97EBAACBL, 0x95BD, 0x11D0, 0xA3, 0xEA, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 +*/ + +/* =============================================================== + KSNAME GUIDs (defined also as KSSTRING_Xxx L"{...}" + + Filter - 0x9b365890L, 0x165f, 0x11d0, 0xa1, 0x95, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 + Pin - 0x146F1A80L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + Clock - 0x53172480L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + Allocator - 0x642F5D00L, 0x4791, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + TopologyNode - 0x0621061AL, 0xEE75, 0x11D0, 0xB9, 0x15, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 +*/ + +/* =============================================================== + Interface GUIDs + + Standard - 0x1A8766A0L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + FileIo - 0x8C6F932CL, 0xE771, 0x11D0, 0xB8, 0xFF, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 +*/ + +/* =============================================================== + Medium Type GUIDs + + Standard - 0x4747B320L, 0x62CE, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 +*/ + +/* =============================================================== + Property Set GUIDs + + General - 0x1464EDA5L, 0x6A8F, 0x11D1, 0x9A, 0xA7, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + StreamIo - 0x65D003CAL, 0x1523, 0x11D2, 0xB2, 0x7A, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + MediaSeeking - 0xEE904F0CL, 0xD09B, 0x11D0, 0xAB, 0xE9, 0x00, 0xA0, 0xC9, 0x22, 0x31, 0x96 + Topology - 0x720D4AC0L, 0x7533, 0x11D0, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + GM - 0xAF627536L, 0xE719, 0x11D2, 0x8A, 0x1D, 0x00, 0x60, 0x97, 0xD2, 0xDF, 0x5D + Quality - 0xD16AD380L, 0xAC1A, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + Connection - 0x1D58C920L, 0xAC9B, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 +*/ + +/* =============================================================== + StreamAllocator Sets + + Event set - 0x75d95571L, 0x073c, 0x11d0, 0xa1, 0x61, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 + Method set - 0xcf6e4341L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 + Property set - 0xcf6e4342L, 0xec87, 0x11cf, 0xa1, 0x30, 0x00, 0x20, 0xaf, 0xd1, 0x56, 0xe4 +*/ + +/* =============================================================== + StreamInterface Sets + + Property set - 0x1fdd8ee1L, 0x9cd3, 0x11d0, 0x82, 0xaa, 0x00, 0x00, 0xf8, 0x22, 0xfe, 0x8a +*/ + +/* =============================================================== + Clock Sets + + Property set - 0xDF12A4C0L, 0xAC17, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 + Event sets - 0x364D8E20L, 0x62C7, 0x11CF, 0xA5, 0xD6, 0x28, 0xDB, 0x04, 0xC1, 0x00, 0x00 +*/ + +/* =============================================================== + Connection Sets + + Event set - 0x7f4bcbe0L, 0x9ea5, 0x11cf, 0xa5, 0xd6, 0x28, 0xdb, 0x04, 0xc1, 0x00, 0x00 +*/ + +/* =============================================================== + Time Format GUIDs + + KSTIME_FORMAT_NONE (null guid) + FRAME - 0x7b785570L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 + BYTE - 0x7b785571L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 + SAMPLE - 0x7b785572L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 + FIELD - 0x7b785573L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 + MEDIA_TIME - 0x7b785574L, 0x8c82, 0x11cf, 0xbc, 0x0c, 0x00, 0xaa, 0x00, 0xac, 0x74, 0xf6 +*/ + +/* =============================================================== + Media Type GUIDs + + NULL + Stream - + None - + + TODO ... +*/ + +/* =============================================================== + KSMEMORY_TYPE_xxx + + WILDCARD, DONT_CARE = NULL + SYSTEM - 0x091bb638L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 + USER - 0x8cb0fc28L, 0x7893, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 + KERNEL_PAGED - 0xd833f8f8L, 0x7894, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 + KERNEL_NONPAGED - 0x4a6d5fc4L, 0x7895, 0x11d1, 0xb0, 0x69, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 + DEVICE_UNKNOWN - 0x091bb639L, 0x603f, 0x11d1, 0xb0, 0x67, 0x00, 0xa0, 0xc9, 0x06, 0x28, 0x02 +*/ + +/* =============================================================== + Enums + (values have been checked) +*/ + +typedef enum +{ + KsObjectTypeDevice, + KsObjectTypeFilterFactory, + KsObjectTypeFilter, + KsObjectTypePin +} KSOBJECTTYPE; + +typedef enum +{ + KSSTATE_STOP, + KSSTATE_ACQUIRE, + KSSTATE_PAUSE, + KSSTATE_RUN +} KSSTATE; + +typedef enum +{ + KSTARGET_STATE_DISABLED, + KSTARGET_STATE_ENABLED +} KSTARGET_STATE; + +typedef enum +{ + KSRESET_BEGIN, + KSRESET_END +} KSRESET; + +typedef enum +{ + KSEVENTS_NONE, + KSEVENTS_SPINLOCK, + KSEVENTS_MUTEX, + KSEVENTS_FMUTEX, + KSEVENTS_FMUTEXUNSAFE, + KSEVENTS_INTERRUPT, + KSEVENTS_ERESOURCE +} KSEVENTS_LOCKTYPE; + +typedef enum +{ + KSDEGRADE_STANDARD_SIMPLE, + KSDEGRADE_STANDARD_QUALITY, + KSDEGRADE_STANDARD_COMPUTATION, + KSDEGRADE_STANDARD_SKIP +} KSDEGRADE_STANDARD; + +typedef enum +{ + KSPIN_DATAFLOW_IN = 1, + KSPIN_DATAFLOW_OUT +} KSPIN_DATAFLOW; + +typedef enum +{ + KSPIN_COMMUNICATION_NONE, + KSPIN_COMMUNICATION_SINK, + KSPIN_COMMUNICATION_SOURCE, + KSPIN_COMMUNICATION_BOTH, + KSPIN_COMMUNICATION_BRIDGE +} KSPIN_COMMUNICATION; + +typedef enum +{ + KsListEntryTail, + KsListEntryHead +} KSLIST_ENTRY_LOCATION; + +typedef enum +{ + KsStackCopyToNewLocation, + KsStackReuseCurrentLocation, + KsStackUseNewLocation +} KSSTACK_USE; + +typedef enum +{ + KsAcquireOnly, + KsAcquireAndRemove, + KsAcquireOnlySingleItem, + KsAcquireAndRemoveOnlySingleItem +} KSIRP_REMOVAL_OPERATION; + +typedef enum +{ + KsInvokeOnSuccess = 1, + KsInvokeOnError = 2, + KsInvokeOnCancel = 4 +} KSCOMPLETION_INVOCATION; + + + +/* MOVE ME */ +typedef NTSTATUS (*PFNKSCONTEXT_DISPATCH)( + IN PVOID Context, + IN PIRP Irp); + + +/* =============================================================== + Framing +*/ + +typedef struct +{ +} KS_FRAMING_ITEM, *PKS_FRAMING_ITEM; + +typedef struct +{ +} KS_FRAMING_RANGE, *PKS_FRAMING_RANGE; + +typedef struct +{ + /* Obsolete */ +} KS_FRAMING_RANGE_WEIGHTED, *PKS_FRAMING_RANGE_WEIGHTED; + +/* ??? */ +typedef struct +{ +} KS_COMPRESSION, *PKS_COMPRESSION; + + +/* =============================================================== + Common +*/ + +typedef struct +{ + GUID Set; + ULONG Id; + ULONG Flags; +} KSIDENTIFIER, *PKSIDENTIFIER; + +typedef KSIDENTIFIER KSPROPERTY, *PKSPROPERTY; +typedef KSIDENTIFIER KSMETHOD, *PKSMETHOD; +typedef KSIDENTIFIER KSEVENT, *PKSEVENT; + +typedef KSIDENTIFIER KSDEGRADE, *PKSDEGRADE; + +typedef KSIDENTIFIER KSPIN_INTERFACE, *PKSPIN_INTERFACE; +typedef KSIDENTIFIER KSPIN_MEDIUM, *PKSPIN_MEDIUM; + +typedef struct +{ +} KSDATARANGE, *PKSDATARANGE; + +typedef struct +{ +} KSDATAFORMAT, *PKSDATAFORMAT; + +typedef struct +{ +} KSATTRIBUTE, *PKSATTRIBUTE; + + +/* =============================================================== + Priorities +*/ + +#define KSPRIORITY_LOW 0x00000001 +#define KSPRIORITY_NORMAL 0x40000000 +#define KSPRIORITY_HIGH 0x80000000 +#define KSPRIORITY_EXCLUSIVE 0xFFFFFFFF + +typedef struct +{ + ULONG PriorityClass; + ULONG PrioritySubClass; +} KSPRIORITY, *PKSPRIORITY; + + +/* =============================================================== */ + +typedef struct +{ +} KSDISPATCH_TABLE, *PKSDISPATCH_TABLE; + +typedef struct +{ +} BUS_INTERFACE_REFERENCE, *PBUS_INTERFACE_REFERENCE; + +typedef struct +{ +} KSCOMPONENTID, *PKSCOMPONENTID; + +typedef struct +{ +} KSBUFFER_ITEM, *PKSBUFFER_ITEM; + +/* =============================================================== + Properties +*/ + +#define KSPROPERTY_MEMBER_RANGES 0x00000001 +#define KSPROPERTY_MEMBER_STEPPEDRANGES 0x00000002 +#define KSPROPERTY_MEMBER_VALUES 0x00000003 +#define KSPROPERTY_MEMBER_FLAG_DEFAULT KSPROPERTY_MEMBER_RANGES + +typedef struct +{ +} KSPROPERTY_BOUNDS_LONG, *PKSPROPERTY_BOUNDS_LONG; + +typedef struct +{ +} KSPROPERTY_BOUNDS_LONGLONG, *PKSPROPERTY_BOUNDS_LONGLONG; + +typedef struct +{ +} KSPROPERTY_DESCRIPTION, *PKSPROPERTY_DESCRIPTION; + +typedef struct +{ +} KSPROPERTY_ITEM, *PKSPROPERTY_ITEM; + +typedef struct +{ +} KSPROPERTY_MEDIAAVAILABLE, *PKSPROPERTY_MEDIAAVAILABLE; + +typedef struct +{ +} KSPROPERTY_MEMBERSHEADER, *PKSPROPERTY_MEMBERSHEADER; + +typedef struct +{ +} KSPROPERTY_MEMBERSLIST, *PKSPROPERTY_MEMBERSLIST; + +typedef struct +{ +} KSPROPERTY_POSITIONS, *PKSPROPERTY_POSITIONS; + +typedef struct +{ +} KSPROPERTY_SERIAL, *PKSPROPERTY_SERIAL; + +typedef struct +{ +} KSPROPERTY_SERIALHDR, *PKSPROPERTY_SERIALHDR; + +typedef struct +{ +} KSPROPERTY_SET, *PKSPROPERTY_SET; + +typedef struct +{ +} KSPROPERTY_STEPPING_LONG, *PKSPROPERTY_STEPPING_LONG; + +typedef struct +{ +} KSPROPERTY_STEPPING_LONGLONG, *PKSPROPERTY_STEPPING_LONGLONG; + +typedef struct +{ +} KSPROPERTY_VALUES, *PKSPROPERTY_VALUES; + + +/* =============================================================== + Allocator Framing +*/ + +typedef struct +{ +} KSALLOCATOR_FRAMING, *PKSALLOCATOR_FRAMING; + +typedef struct +{ +} KSALLOCATOR_FRAMING_EX, *PKSALLOCATOR_FRAMING_EX; + + +/* =============================================================== + Quality +*/ + +typedef struct +{ +} KSQUALITY, *PKSQUALITY; + +typedef struct +{ + HANDLE QualityManager; + PVOID Context; +} KSQUALITY_MANAGER, *PKSQUALITY_MANAGER; + +typedef struct +{ +} KSRATE, *PKSRATE; + +typedef struct +{ +} KSRATE_CAPABILITY, *PKSRATE_CAPABILITY; + +typedef struct +{ + LONGLONG Granularity; + LONGLONG Error; +} KSRESOLUTION, *PKSRESOLUTION; + +typedef struct +{ +} KSRELATIVEEVENT, *PKSRELATIVEEVENT; + + +/* =============================================================== + Timing +*/ + +typedef struct +{ + LONGLONG Time; + ULONG Numerator; + ULONG Denominator; +} KSTIME, *PKSTIME; + +typedef struct +{ +} KSCORRELATED_TIME, *PKSCORRELATED_TIME; + +typedef struct +{ + KSPROPERTY Property; + GUID SourceFormat; + GUID TargetFormat; + LONGLONG Time; +} KSP_TIMEFORMAT, *PKSP_TIMEFORMAT; + +typedef struct +{ +} KSINTERVAL, *PKSINTERVAL; + +typedef struct +{ +} KSFRAMETIME, *PKSFRAMETIME; + + +/* =============================================================== + Clocks +*/ + +typedef struct +{ +} KSCLOCK, *PKSCLOCK, *PKSDEFAULTCLOCK; /* OK ? */ + +typedef struct +{ +} KSCLOCK_CREATE, *PKSCLOCK_CREATE; + +typedef struct +{ +} KSCLOCK_FUNCTIONTABLE, *PKSCLOCK_FUNCTIONTABLE; + + +/* =============================================================== + Objects ??? SORT ME! +*/ + +typedef struct +{ +} KSOBJECT_CREATE, *PKSOBJECT_CREATE; + +typedef struct +{ +} KSOBJECT_CREATE_ITEM, *PKSOBJECT_CREATE_ITEM; + +typedef VOID (*PFNKSITEMFREECALLBACK)( + IN PKSOBJECT_CREATE_ITEM CreateItem); + +typedef struct +{ +} KSMULTIPLE_ITEM, *PKSMULTIPLE_ITEM; + +typedef struct +{ +} KSQUERYBUFFER, *PKSQUERYBUFFER; + +typedef struct +{ +} KSERROR, *PKSERROR; + +typedef struct +{ +} KSDPC_ITEM, *PKSDPC_ITEM; + + +/* =============================================================== + Methods +*/ + +typedef struct +{ +} KSMETHOD_SET, *PKSMETHOD_SET; + +typedef struct +{ +} KSMETHOD_ITEM, *PKSMETHOD_ITEM; + +typedef struct +{ +} KSFASTMETHOD_ITEM, *PKSFASTMETHOD_ITEM; + + +/* =============================================================== + Nodes +*/ + +typedef struct +{ +} KSP_NODE, *PKSP_NODE; + +typedef struct +{ + KSMETHOD Method; + ULONG NodeID; + ULONG Reserved; +} KSM_NODE, *PKSM_NODE; + +typedef struct +{ +} KSE_NODE, *PKSE_NODE; + +typedef struct +{ +} KSNODE_CREATE, *PKSNODE_CREATE; + + +/* =============================================================== + Properties? +*/ + +typedef struct +{ +} KSFASTPROPERTY_ITEM, *PKSFASTPROPERTY_ITEM; + + +/* =============================================================== + Events +*/ + +typedef struct +{ +} KSEVENT_TIME_MARK, *PKSEVENT_TIME_MARK; + +typedef struct +{ +} KSEVENT_TIME_INTERVAL, *PKSEVENT_TIME_INTERVAL; + +typedef struct +{ +} KSEVENT_SET, *PKSEVENT_SET; + +typedef struct +{ +} KSEVENT_ITEM, *PKSEVENT_ITEM; + +typedef struct _KSEVENT_ENTRY +{ +} KSEVENT_ENTRY, *PKSEVENT_ENTRY; + +typedef struct +{ +} KSEVENTDATA, *PKSEVENTDATA; + + +/* =============================================================== + Pins +*/ + +typedef struct +{ +} KSPIN_DISPATCH, *PKSPIN_DISPATCH; + +typedef struct +{ +} KSAUTOMATION_TABLE, *PKSAUTOMATION_TABLE; + +typedef struct +{ +} KSPIN_DESCRIPTOR, *PKSPIN_DESCRIPTOR; + +/* TODO */ +/* This is just to shut the compiler up so DON'T USE IT! */ +typedef void (*PFNKSINTERSECTHANDLER)(void); +typedef void (*PFNKSINTERSECTHANDLEREX)(void); + +typedef struct +{ + const KSPIN_DISPATCH* Dispatch; + const KSAUTOMATION_TABLE* AutomationTable; + KSPIN_DESCRIPTOR PinDescriptor; + ULONG Flags; + ULONG InstancesPossible; + ULONG InstancesNecessary; + const KSALLOCATOR_FRAMING_EX* AllocatorFraming; + PFNKSINTERSECTHANDLEREX IntersectHandler; +} KSPIN_DESCRIPTOR_EX, *PKSPIN_DESCRIPTOR_EX; + +/* TODO */ +#define KSPIN_FLAG_DISPATCH_LEVEL_PROCESSING +#define KSPIN_FLAG_CRITICAL_PROCESSING +#define KSPIN_FLAG_HYPERCRITICAL_PROCESSING +#define KSPIN_FLAG_ASYNCHRONOUS_PROCESSING +#define KSPIN_FLAG_DO_NOT_INITIATE_PROCESSING +#define KSPIN_FLAG_INITIATE_PROCESSING_ON_EVERY_ARRIVAL +#define KSPIN_FLAG_FRAMES_NOT_REQUIRED_FOR_PROCESSING +#define KSPIN_FLAG_ENFORCE_FIFO +#define KSPIN_FLAG_GENERATE_MAPPINGS +#define KSPIN_FLAG_DISTINCT_TRAILING_EDGE +#define KSPIN_FLAG_PROCESS_IN_RUN_STATE_ONLY +#define KSPIN_FLAG_SPLITTER +#define KSPIN_FLAG_USE_STANDARD_TRANSPORT +#define KSPIN_FLAG_DO_NOT_USE_STANDARD_TRANSPORT +#define KSPIN_FLAG_FIXED_FORMAT +#define KSPIN_FLAG_GENERATE_EOS_EVENTS +#define KSPIN_FLAG_RENDERER +#define KSPIN_FLAG_SOME_FRAMES_REQUIRED_FOR_PROCESSING +#define KSPIN_FLAG_PROCESS_IF_ANY_IN_RUN_STATE +#define KSPIN_FLAG_DENY_USERMODE_ACCESS +#define KSPIN_FLAG_IMPLEMENT_CLOCK + +typedef struct +{ + const KSPIN_DESCRIPTOR_EX* Descriptor; + KSOBJECT_BAG Bag; + PVOID Context; + ULONG Id; + KSPIN_COMMUNICATION Communication; + BOOLEAN ConnectionIsExternal; + KSPIN_INTERFACE ConnectionInterface; + KSPIN_MEDIUM ConnectionMedium; + KSPRIORITY ConnectionPriority; + PKSDATAFORMAT ConnectionFormat; + PKSMULTIPLE_ITEM AttributeList; + ULONG StreamHeaderSize; + KSPIN_DATAFLOW DataFlow; + KSSTATE DeviceState; + KSRESET ResetState; + KSSTATE ClientState; +} KSPIN, *PKSPIN; + +typedef struct +{ + KSPIN_INTERFACE Interface; + KSPIN_MEDIUM Medium; + ULONG PinId; + HANDLE PinToHandle; + KSPRIORITY Priority; +} KSPIN_CONNECT, *PKSPIN_CONNECT; + +typedef struct +{ +} KSP_PIN, *PKSP_PIN; + +typedef struct +{ +} KSPIN_PHYSICALCONNECTION, *PKSPIN_PHYSICALCONNECTION; + + +/* =============================================================== + Topology +*/ + +typedef struct +{ + ULONG FromNode; + ULONG FromNodePin; + ULONG ToNode; + ULONG ToNodePin; +} KSTOPOLOGY_CONNECTION, *PKSTOPOLOGY_CONNECTION; + +typedef struct +{ + ULONG CategoriesCount; + const GUID* Categories; + ULONG TopologyNodesCount; + const GUID* TopologyNodes; + ULONG TopologyConnectionsCount; + const KSTOPOLOGY_CONNECTION* TopologyConnections; + const GUID* TopologyNodesNames; + ULONG Reserved; +} KSTOPOLOGY, *PKSTOPOLOGY; + + +/* =============================================================== + ??? SORT ME +*/ + +/* TODO */ +typedef void* UNKNOWN; + +typedef PVOID (*PFNKSDEFAULTALLOCATE)( + IN PVOID Context); + +typedef PVOID (*PFNKSDEFAULTFREE)( + IN PVOID Context, + IN PVOID Buffer); + +typedef PVOID (*PFNKSINITIALIZEALLOCATOR)( + IN PVOID InitialContext, + IN PKSALLOCATOR_FRAMING AllocatorFraming, + OUT PVOID* Context); + +typedef PVOID (*PFNKSDELETEALLOCATOR)( + IN PVOID Context); + + +typedef NTSTATUS (*PFNKSALLOCATOR)( + IN PIRP Irp, + IN ULONG BufferSize, + IN BOOL InputOperation); + +typedef NTSTATUS (*PFNKSHANDLER)( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data); + +typedef BOOLEAN (*PFNKSFASTHANDLER)( + IN PFILE_OBJECT FileObject, + IN PKSIDENTIFIER UNALIGNED Request, + IN ULONG RequestLength, + IN OUT PVOID UNALIGNED Data, + IN ULONG DataLength, + OUT PIO_STATUS_BLOCK IoStatus); + +typedef NTSTATUS (*PFNKSADDEVENT)( + IN PIRP Irp, + IN PKSEVENTDATA EventData, + IN struct _KSEVENT_ENTRY* EventEntry); + +typedef NTSTATUS (*PFNKINTERSECTHANDLEREX)( + IN PVOID Context, + IN PIRP Irp, + IN PKSP_PIN Pin, + IN PKSDATARANGE DataRange, + IN PKSDATARANGE MatchingDataRange, + IN ULONG DataBufferSize, + OUT PVOID Data OPTIONAL, + OUT PULONG DataSize); + +typedef UNKNOWN PFNALLOCATORE_ALLOCATEFRAME; +typedef UNKNOWN PFNALLOCATOR_FREEFRAME; + +/* +typedef struct +{ + PFNALLOCATOR_ALLOCATEFRAME AllocateFrame; + PFNALLOCATOR_FREEFRAME FreeFrame; +} +*/ + +typedef struct +{ + KSALLOCATOR_FRAMING Framing; + ULONG AllocatedFrames; + ULONG Reserved; +} KSSTREAMALLOCATOR_STATUS, *PKSSTREAMALLOCATOR_STATUS; + +typedef struct +{ + KSALLOCATOR_FRAMING_EX Framing; + ULONG AllocatedFrames; + ULONG Reserved; +} KSSTREAMALLOCATOR_STATUS_EX, *PKSSTREAMALLOCATOR_STATUS_EX; + +typedef struct +{ + ULONG Size; + ULONG TypeSpecificFlags; + KSTIME PresentationTime; + LONGLONG Duration; + ULONG FrameExtent; + ULONG DataUsed; + PVOID Data; + ULONG OptionsFlags; +} KSSTREAM_HEADER, *PKSSTREAM_HEADER; + + + +/* =============================================================== + XP / DX8 +*/ + +typedef struct +{ + /* TODO */ +} KSPROCESSPIN, *PKSPROCESSPIN; + +typedef struct +{ + PKSPROCESSPIN* Pins; + ULONG Count; +} KSPROCESSPIN_INDEXENTRY, *PKSPROCESSPIN_INDEXENTRY; + + +/* =============================================================== + Device Dispatch +*/ + +typedef struct +{ + /* TODO */ +} KSDEVICE, *PKSDEVICE; + +typedef NTSTATUS (*PFNKSDEVICECREATE)( + IN PKSDEVICE Device); + +typedef NTSTATUS (*PFNKSDEVICEPNPSTART)( + IN PKSDEVICE Device, + IN PIRP Irp, + IN PCM_RESOURCE_LIST TranslatedResourceList OPTIONAL, + IN PCM_RESOURCE_LIST UntranslatedResourceList OPTIONAL); + +typedef NTSTATUS (*PFNKSDEVICE)( + IN PKSDEVICE Device); + +typedef NTSTATUS (*PFNKSDEVICEIRP)( + IN PKSDEVICE Device, + IN PIRP Irp); + +typedef VOID (*PFNKSDEVICEIRPVOID)( + IN PKSDEVICE Device, + IN PIRP Irp); + +typedef NTSTATUS (*PFNKSDEVICEQUERYCAPABILITIES)( + IN PKSDEVICE Device, + IN PIRP Irp, + IN OUT PDEVICE_CAPABILITIES Capabilities); + +typedef NTSTATUS (*PFNKSDEVICEQUERYPOWER)( + IN PKSDEVICE Device, + IN PIRP Irp, + IN DEVICE_POWER_STATE DeviceTo, + IN DEVICE_POWER_STATE DeviceFrom, + IN SYSTEM_POWER_STATE SystemTo, + IN SYSTEM_POWER_STATE SystemFrom, + IN POWER_ACTION Action); + +typedef VOID (*PFNKSDEVICESETPOWER)( + IN PKSDEVICE Device, + IN PIRP Irp, + IN DEVICE_POWER_STATE To, + IN DEVICE_POWER_STATE From); + +typedef struct _KSDEVICE_DISPATCH +{ + PFNKSDEVICECREATE Add; + PFNKSDEVICEPNPSTART Start; + PFNKSDEVICE PostStart; + PFNKSDEVICEIRP QueryStop; + PFNKSDEVICEIRPVOID CancelStop; + PFNKSDEVICEIRPVOID Stop; + PFNKSDEVICEIRP QueryRemove; + PFNKSDEVICEIRPVOID CancelRemove; + PFNKSDEVICEIRPVOID Remove; + PFNKSDEVICEQUERYCAPABILITIES QueryCapabilities; + PFNKSDEVICEIRPVOID SurpriseRemoval; + PFNKSDEVICEQUERYPOWER Querypower; + PFNKSDEVICESETPOWER SetPower; +} KSDEVICE_DISPATCH, *PKSDEVICE_DISPATCH; + + +/* =============================================================== + Filter Dispatch +*/ + +typedef struct +{ +} KSFILTER, *PKSFILTER; + +typedef NTSTATUS (*PFNKSFILTERIRP)( + IN PKSFILTER Filter, + IN PIRP Irp); + +typedef NTSTATUS (*PFNKSFILTERPROCESS)( + IN PKSFILTER FIlter, + IN PKSPROCESSPIN_INDEXENTRY ProcessPinsIndex); + +typedef NTSTATUS (*PFNKSFILTERVOID)( + IN PKSFILTER Filter); + +typedef struct _KSFILTER_DISPATCH +{ + PFNKSFILTERIRP Create; + PFNKSFILTERIRP Close; + PFNKSFILTERPROCESS Process; + PFNKSFILTERVOID Reset; +} KSFILTER_DISPATCH, *PKSFILTER_DISPATCH; + + +/* =============================================================== + Minidriver Callbacks +*/ + +typedef NTSTATUS (*KStrMethodHandler)( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data); + +typedef NTSTATUS (*KStrSupportHandler)( + IN PIRP Irp, + IN PKSIDENTIFIER Request, + IN OUT PVOID Data); + + +/* =============================================================== + Allocator Functions +*/ + +KSDDKAPI NTSTATUS NTAPI +KsCreateAllocator( + IN HANDLE ConnectionHandle, + IN PKSALLOCATOR_FRAMING AllocatorFraming, + OUT PHANDLE AllocatorHandle); + +KSDDKAPI NTSTATUS NTAPI +KsCreateDefaultAllocator( + IN PIRP Irp); + +KSDDKAPI NTSTATUS NTAPI +KsValidateAllocatorCreateRequest( + IN PIRP Irp, + OUT PKSALLOCATOR_FRAMING* AllocatorFraming); + +KSDDKAPI NTSTATUS NTAPI +KsCreateDefaultAllocatorEx( + IN PIRP Irp, + IN PVOID InitializeContext OPTIONAL, + IN PFNKSDEFAULTALLOCATE DefaultAllocate OPTIONAL, + IN PFNKSDEFAULTFREE DefaultFree OPTIONAL, + IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL, + IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL); + +KSDDKAPI NTSTATUS NTAPI +KsValidateAllocatorFramingEx( + IN PKSALLOCATOR_FRAMING_EX Framing, + IN ULONG BufferSize, + IN const KSALLOCATOR_FRAMING_EX* PinFraming); + + +/* =============================================================== + Clock Functions +*/ + +typedef BOOLEAN (*PFNKSSETTIMER)( + IN PVOID Context, + IN PKTIMER Timer, + IN LARGE_INTEGER DueTime, + IN PKDPC Dpc); + +typedef BOOLEAN (*PFNKSCANCELTIMER)( + IN PVOID Context, + IN PKTIMER Timer); + +typedef LONGLONG (FASTCALL *PFNKSCORRELATEDTIME)( + IN PVOID Context, + OUT PLONGLONG SystemTime); + +KSDDKAPI NTSTATUS NTAPI +KsCreateClock( + IN HANDLE ConnectionHandle, + IN PKSCLOCK_CREATE ClockCreate, + OUT PHANDLE ClockHandle); + +KSDDKAPI NTSTATUS NTAPI +KsCreateDefaultClock( + IN PIRP Irp, + IN PKSDEFAULTCLOCK DefaultClock); + +KSDDKAPI NTSTATUS NTAPI +KsAllocateDefaultClock( + OUT PKSDEFAULTCLOCK* DefaultClock); + +KSDDKAPI NTSTATUS NTAPI +KsAllocateDefaultClockEx( + OUT PKSDEFAULTCLOCK* DefaultClock, + IN PVOID Context OPTIONAL, + IN PFNKSSETTIMER SetTimer OPTIONAL, + IN PFNKSCANCELTIMER CancelTimer OPTIONAL, + IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL, + IN const KSRESOLUTION* Resolution OPTIONAL, + IN ULONG Flags); + +KSDDKAPI VOID NTAPI +KsFreeDefaultClock( + IN PKSDEFAULTCLOCK DefaultClock); + +KSDDKAPI NTSTATUS NTAPI +KsValidateClockCreateRequest( + IN PIRP Irp, + OUT PKSCLOCK_CREATE* ClockCreate); + +KSDDKAPI KSSTATE NTAPI +KsGetDefaultClockState( + IN PKSDEFAULTCLOCK DefaultClock); + +KSDDKAPI VOID NTAPI +KsSetDefaultClockState( + IN PKSDEFAULTCLOCK DefaultClock, + IN KSSTATE State); + +KSDDKAPI LONGLONG NTAPI +KsGetDefaultClockTime( + IN PKSDEFAULTCLOCK DefaultClock); + +KSDDKAPI VOID NTAPI +KsSetDefaultClockTime( + IN PKSDEFAULTCLOCK DefaultClock, + IN LONGLONG Time); + + +/* =============================================================== + Method Functions +*/ + +/* Method sets - TODO: Make into macros! */ + +#if 0 +VOID +KSMETHOD_SET_IRP_STORAGE( + IN IRP Irp); + +VOID +KSMETHOD_ITEM_IRP_STORAGE( + IN IRP Irp); + +VOID +KSMETHOD_TYPE_IRP_STORAGE( + IN IRP Irp); +#endif + +KSDDKAPI NTSTATUS NTAPI +KsMethodHandler( + IN PIRP Irp, + IN ULONG MethodSetsCount, + IN PKSMETHOD_SET MethodSet); + +KSDDKAPI NTSTATUS NTAPI +KsMethodHandlerWithAllocator( + IN PIRP Irp, + IN ULONG MethodSetsCount, + IN PKSMETHOD_SET MethodSet, + IN PFNKSALLOCATOR Allocator OPTIONAL, + IN ULONG MethodItemSize OPTIONAL); + +KSDDKAPI BOOLEAN NTAPI +KsFastMethodHandler( + IN PFILE_OBJECT FileObject, + IN PKSMETHOD UNALIGNED Method, + IN ULONG MethodLength, + IN OUT PVOID UNALIGNED Data, + IN ULONG DataLength, + OUT PIO_STATUS_BLOCK IoStatus, + IN ULONG MethodSetsCount, + IN const KSMETHOD_SET* MethodSet); + + +/* =============================================================== + Property Functions +*/ + +KSDDKAPI NTSTATUS NTAPI +KsPropertyHandler( + IN PIRP Irp, + IN ULONG PropertySetsCount, + IN const KSPROPERTY_SET* PropertySet); + +KSDDKAPI NTSTATUS NTAPI +KsPropertyHandlerWithAllocator( + IN PIRP Irp, + IN ULONG PropertySetsCount, + IN PKSPROPERTY_SET PropertySet, + IN PFNKSALLOCATOR Allocator OPTIONAL, + IN ULONG PropertyItemSize OPTIONAL); + +KSDDKAPI NTSTATUS NTAPI +KsUnserializeObjectPropertiesFromRegistry( + IN PFILE_OBJECT FileObject, + IN HANDLE ParentKey OPTIONAL, + IN PUNICODE_STRING RegistryPath OPTIONAL); + +KSDDKAPI BOOLEAN NTAPI +KsFastPropertyHandler( + IN PFILE_OBJECT FileObject, + IN PKSPROPERTY UNALIGNED Property, + IN ULONG PropertyLength, + IN OUT PVOID UNALIGNED Data, + IN ULONG DataLength, + OUT PIO_STATUS_BLOCK IoStatus, + IN ULONG PropertySetsCount, + IN const KSPROPERTY_SET* PropertySet); + + +/* =============================================================== + Event Functions +*/ + +KSDDKAPI NTSTATUS NTAPI +KsGenerateEvent( + IN PKSEVENT_ENTRY EntryEvent); + +KSDDKAPI NTSTATUS NTAPI +KsEnableEventWithAllocator( + IN PIRP Irp, + IN ULONG EventSetsCount, + IN PKSEVENT_SET EventSet, + IN OUT PLIST_ENTRY EventsList OPTIONAL, + IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL, + IN PVOID EventsLock OPTIONAL, + IN PFNKSALLOCATOR Allocator OPTIONAL, + IN ULONG EventItemSize OPTIONAL); + +KSDDKAPI NTSTATUS NTAPI +KsGenerateDataEvent( + IN PKSEVENT_ENTRY EventEntry, + IN ULONG DataSize, + IN PVOID Data); + +KSDDKAPI NTSTATUS NTAPI +KsEnableEvent( + IN PIRP Irp, + IN ULONG EventSetsCount, + IN KSEVENT_SET* EventSet, + IN OUT PLIST_ENTRY EventsList OPTIONAL, + IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL, + IN PVOID EventsLock OPTIONAL); + +KSDDKAPI VOID NTAPI +KsDiscardEvent( + IN PKSEVENT_ENTRY EventEntry); + +KSDDKAPI NTSTATUS NTAPI +KsDisableEvent( + IN PIRP Irp, + IN OUT PLIST_ENTRY EventsList, + IN KSEVENTS_LOCKTYPE EventsFlags, + IN PVOID EventsLock); + +KSDDKAPI VOID NTAPI +KsFreeEventList( + IN PFILE_OBJECT FileObject, + IN OUT PLIST_ENTRY EventsList, + IN KSEVENTS_LOCKTYPE EVentsFlags, + IN PVOID EventsLock); + + +/* =============================================================== + Topology Functions +*/ + +KSDDKAPI NTSTATUS NTAPI +KsValidateTopologyNodeCreateRequest( + IN PIRP Irp, + IN PKSTOPOLOGY Topology, + OUT PKSNODE_CREATE* NodeCreate); + +KSDDKAPI NTSTATUS NTAPI +KsCreateTopologyNode( + IN HANDLE ParentHandle, + IN PKSNODE_CREATE NodeCreate, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE NodeHandle); + +KSDDKAPI NTSTATUS NTAPI +KsTopologyPropertyHandler( + IN PIRP Irp, + IN PKSPROPERTY Property, + IN OUT PVOID Data, + IN const KSTOPOLOGY* Topology); + + + +/* =============================================================== + Connectivity Functions +*/ + +KSDDKAPI NTSTATUS NTAPI +KsCreatePin( + IN HANDLE FilterHandle, + IN PKSPIN_CONNECT Connect, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE ConnectionHandle); + +KSDDKAPI NTSTATUS NTAPI +KsValidateConnectRequest( + IN PIRP Irp, + IN ULONG DescriptorsCount, + IN KSPIN_DESCRIPTOR* Descriptor, + OUT PKSPIN_CONNECT* Connect); + +KSDDKAPI NTSTATUS NTAPI +KsPinPropertyHandler( + IN PIRP Irp, + IN PKSPROPERTY Property, + IN OUT PVOID Data, + IN ULONG DescriptorsCount, + IN const KSPIN_DESCRIPTOR* Descriptor); + +KSDDKAPI NTSTATUS NTAPI +KsPinDataIntersection( + IN PIRP Irp, + IN PKSPIN Pin, + OUT PVOID Data, + IN ULONG DescriptorsCount, + IN const KSPIN_DESCRIPTOR* Descriptor, + IN PFNKSINTERSECTHANDLER IntersectHandler); + +KSDDKAPI NTSTATUS NTAPI +KsPinDataIntersectionEx( + IN PIRP Irp, + IN PKSP_PIN Pin, + OUT PVOID Data, + IN ULONG DescriptorsCount, + IN const KSPIN_DESCRIPTOR* Descriptor, + IN ULONG DescriptorSize, + IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL, + IN PVOID HandlerContext OPTIONAL); + +/* Does this belong here? */ + +KSDDKAPI NTSTATUS NTAPI +KsHandleSizedListQuery( + IN PIRP Irp, + IN ULONG DataItemsCount, + IN ULONG DataItemSize, + IN const VOID* DataItems); + + +/* =============================================================== + IRP Helper Functions +*/ + +typedef NTSTATUS (*PFNKSIRPLISTCALLBACK)( + IN PIRP Irp, + IN PVOID Context); + +KSDDKAPI NTSTATUS NTAPI +KsAcquireResetValue( + IN PIRP Irp, + OUT KSRESET* ResetValue); + +KSDDKAPI VOID NTAPI +KsAddIrpToCancelableQueue( + IN OUT PLIST_ENTRY QueueHead, + IN PKSPIN_LOCK SpinLock, + IN PIRP Irp, + IN KSLIST_ENTRY_LOCATION ListLocation, + IN PDRIVER_CANCEL DriverCancel OPTIONAL); + +KSDDKAPI NTSTATUS NTAPI +KsAddObjectCreateItemToDeviceHeader( + IN KSDEVICE_HEADER Header, + IN PDRIVER_DISPATCH Create, + IN PVOID Context, + IN PWCHAR ObjectClass, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +KSDDKAPI NTSTATUS NTAPI +KsAddObjectCreateItemToObjectHeader( + IN KSOBJECT_HEADER Header, + IN PDRIVER_DISPATCH Create, + IN PVOID Context, + IN PWCHAR ObjectClass, + IN PSECURITY_DESCRIPTOR SecurityDescriptor); + +KSDDKAPI NTSTATUS NTAPI +KsAllocateDeviceHeader( + OUT PVOID Header, + IN ULONG ItemsCount, + IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL); + +KSDDKAPI NTSTATUS NTAPI +KsAllocateExtraData( + IN PIRP Irp, + IN ULONG ExtraSize, + OUT PVOID* ExtraBuffer); + +KSDDKAPI NTSTATUS NTAPI +KsAllocateObjectCreateItem( + IN KSDEVICE_HEADER Header, + IN PKSOBJECT_CREATE_ITEM CreateItem, + IN BOOL AllocateEntry, + IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL); + +KSDDKAPI NTSTATUS NTAPI +KsAllocateObjectHeader( + OUT PVOID Header, + IN ULONG ItemsCount, + IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL, + IN PIRP Irp, + IN KSDISPATCH_TABLE* Table); + +KSDDKAPI VOID NTAPI +KsCancelIo( + IN OUT PLIST_ENTRY QueueHead, + IN PKSPIN_LOCK SpinLock); + +KSDDKAPI VOID NTAPI +KsCancelRoutine( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +KSDDKAPI NTSTATUS NTAPI +KsDefaultDeviceIoCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +/* ELSEWHERE +KSDDKAPI ULONG NTAPI +KsDecrementCountedWorker( + IN PKSWORKER Worker); +*/ + +KSDDKAPI BOOLEAN NTAPI +KsDispatchFastIoDeviceControlFailure( + IN PFILE_OBJECT FileObject, + IN BOOLEAN Wait, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength, + IN ULONG IoControlCode, + OUT PIO_STATUS_BLOCK IoStatus, + IN PDEVICE_OBJECT DeviceObject); /* always return false */ + +KSDDKAPI BOOLEAN NTAPI +KsDispatchFastReadFailure( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN PDEVICE_OBJECT DeviceObject); /* always return false */ + +/* This function does the same as the above */ +#define KsDispatchFastWriteFailure KsDispatchFastReadFailure + +KSDDKAPI NTSTATUS NTAPI +KsDispatchInvalidDeviceRequest( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +KSDDKAPI NTSTATUS NTAPI +KsDispatchIrp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +KSDDKAPI NTSTATUS NTAPI +KsDispatchSpecificMethod( + IN PIRP Irp, + IN PFNKSHANDLER Handler); + +KSDDKAPI NTSTATUS NTAPI +KsDispatchSpecificProperty( + IN PIRP Irp, + IN PFNKSHANDLER Handler); + +KSDDKAPI NTSTATUS NTAPI +KsForwardAndCatchIrp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PFILE_OBJECT FileObject, + IN KSSTACK_USE StackUse); + +KSDDKAPI NTSTATUS NTAPI +KsForwardIrp( + IN PIRP Irp, + IN PFILE_OBJECT FileObject, + IN BOOLEAN ReuseStackLocation); + +KSDDKAPI VOID NTAPI +KsFreeDeviceHeader( + IN PVOID Header); + +KSDDKAPI VOID NTAPI +KsFreeObjectHeader( + IN PVOID Header); + +KSDDKAPI NTSTATUS NTAPI +KsGetChildCreateParameter( + IN PIRP Irp, + OUT PVOID* CreateParameter); + +KSDDKAPI NTSTATUS NTAPI +KsMoveIrpsOnCancelableQueue( + IN OUT PLIST_ENTRY SourceList, + IN PKSPIN_LOCK SourceLock, + IN OUT PLIST_ENTRY DestinationList, + IN PKSPIN_LOCK DestinationLock OPTIONAL, + IN KSLIST_ENTRY_LOCATION ListLocation, + IN PFNKSIRPLISTCALLBACK ListCallback, + IN PVOID Context); + +KSDDKAPI NTSTATUS NTAPI +KsProbeStreamIrp( + IN PIRP Irp, + IN ULONG ProbeFlags, + IN ULONG HeaderSize); + +KSDDKAPI NTSTATUS NTAPI +KsQueryInformationFile( + IN PFILE_OBJECT FileObject, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass); + +KSDDKAPI ACCESS_MASK NTAPI +KsQueryObjectAccessMask( + IN KSOBJECT_HEADER Header); + +KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI +KsQueryObjectCreateItem( + IN KSOBJECT_HEADER Header); + +KSDDKAPI NTSTATUS NTAPI +KsReadFile( + IN PFILE_OBJECT FileObject, + IN PKEVENT Event OPTIONAL, + IN PVOID PortContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN ULONG Key OPTIONAL, + IN KPROCESSOR_MODE RequestorMode); + +KSDDKAPI VOID NTAPI +KsReleaseIrpOnCancelableQueue( + IN PIRP Irp, + IN PDRIVER_CANCEL DriverCancel OPTIONAL); + +KSDDKAPI PIRP NTAPI +KsRemoveIrpFromCancelableQueue( + IN OUT PLIST_ENTRY QueueHead, + IN PKSPIN_LOCK SpinLock, + IN KSLIST_ENTRY_LOCATION ListLocation, + IN KSIRP_REMOVAL_OPERATION RemovalOperation); + +KSDDKAPI VOID NTAPI +KsRemoveSpecificIrpFromCancelableQueue( + IN PIRP Irp); + +KSDDKAPI NTSTATUS NTAPI +KsSetInformationFile( + IN PFILE_OBJECT FileObject, + IN PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass); + +KSDDKAPI NTSTATUS NTAPI +KsSetMajorFunctionHandler( + IN PDRIVER_OBJECT DriverObject, + IN ULONG MajorFunction); + +KSDDKAPI NTSTATUS NTAPI +KsStreamIo( + IN PFILE_OBJECT FileObject, + IN PKEVENT Event OPTIONAL, + IN PVOID PortContext OPTIONAL, + IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL, + IN PVOID CompletionContext OPTIONAL, + IN KSCOMPLETION_INVOCATION CompletionInvocationFlags OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN OUT PVOID StreamHeaders, + IN ULONG Length, + IN ULONG Flags, + IN KPROCESSOR_MODE RequestorMode); + +KSDDKAPI NTSTATUS NTAPI + KsWriteFile( + IN PFILE_OBJECT FileObject, + IN PKEVENT Event OPTIONAL, + IN PVOID PortContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN ULONG Key OPTIONAL, + IN KPROCESSOR_MODE RequestorMode); + + +/* =============================================================== + Worker Management Functions +*/ + +KSDDKAPI NTSTATUS NTAPI +KsRegisterWorker( + IN WORK_QUEUE_TYPE WorkQueueType, + OUT PKSWORKER* Worker); + +KSDDKAPI VOID NTAPI +KsUnregisterWorker( + IN PKSWORKER Worker); + +KSDDKAPI NTSTATUS NTAPI +KsRegisterCountedWorker( + IN WORK_QUEUE_TYPE WorkQueueType, + IN PWORK_QUEUE_ITEM CountedWorkItem, + OUT PKSWORKER* Worker); + +KSDDKAPI ULONG NTAPI +KsDecrementCountedWorker( + IN PKSWORKER Worker); + +KSDDKAPI ULONG NTAPI +KsIncrementCountedWorker( + IN PKSWORKER Worker); + +KSDDKAPI NTSTATUS NTAPI +KsQueueWorkItem( + IN PKSWORKER Worker, + IN PWORK_QUEUE_ITEM WorkItem); + + +/* =============================================================== + Resources / Images +*/ + +KSDDKAPI NTSTATUS NTAPI +KsLoadResource( + IN PVOID ImageBase, + IN POOL_TYPE PoolType, + IN ULONG_PTR ResourceName, + IN ULONG ResourceType, + OUT PVOID* Resource, + OUT PULONG ResourceSize); + +/* TODO: Implement +KSDDKAPI NTSTATUS NTAPI +KsGetImageNameAndResourceId( + IN HANDLE RegKey, + OUT PUNICODE_STRING ImageName, + OUT PULONG_PTR ResourceId, + OUT PULONG ValueType); + +KSDDKAPI NTSTATUS NTAPI +KsMapModuleName( + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PUNICODE_STRING ModuleName, + OUT PUNICODE_STRING ImageName, + OUT PULONG_PTR ResourceId, + OUT PULONG ValueType); +*/ + + +/* =============================================================== + Misc. Helper Functions +*/ + +KSDDKAPI NTSTATUS NTAPI +KsCacheMedium( + IN PUNICODE_STRING SymbolicLink, + IN PKSPIN_MEDIUM Medium, + IN DWORD PinDirection); + +KSDDKAPI NTSTATUS NTAPI +KsDefaultDispatchPnp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +KSDDKAPI VOID NTAPI +KsSetDevicePnpAndBaseObject( + IN KSDEVICE_HEADER Header, + IN PDEVICE_OBJECT PnpDeviceObject, + IN PDEVICE_OBJECT BaseDevice); + +KSDDKAPI NTSTATUS NTAPI +KsDefaultDispatchPower( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +KSDDKAPI VOID NTAPI +KsSetPowerDispatch( + IN KSOBJECT_HEADER Header, + IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL, + IN PVOID PowerContext OPTIONAL); + +KSDDKAPI NTSTATUS NTAPI +KsReferenceBusObject( + IN KSDEVICE_HEADER Header); + +KSDDKAPI VOID NTAPI +KsDereferenceBusObject( + IN KSDEVICE_HEADER Header); + +KSDDKAPI NTSTATUS NTAPI +KsFreeObjectCreateItem( + IN KSDEVICE_HEADER Header, + IN PUNICODE_STRING CreateItem); + +KSDDKAPI NTSTATUS NTAPI +KsFreeObjectCreateItemsByContext( + IN KSDEVICE_HEADER Header, + IN PVOID Context); + +VOID +KsNullDriverUnload( + IN PDRIVER_OBJECT DriverObject); + +KSDDKAPI PDEVICE_OBJECT NTAPI +KsQueryDevicePnpObject( + IN KSDEVICE_HEADER Header); + +KSDDKAPI VOID NTAPI +KsRecalculateStackDepth( + IN KSDEVICE_HEADER Header, + IN BOOLEAN ReuseStackLocation); + +KSDDKAPI VOID NTAPI +KsSetTargetDeviceObject( + IN KSOBJECT_HEADER Header, + IN PDEVICE_OBJECT TargetDevice OPTIONAL); + +KSDDKAPI VOID NTAPI +KsSetTargetState( + IN KSOBJECT_HEADER Header, + IN KSTARGET_STATE TargetState); + +KSDDKAPI NTSTATUS NTAPI +KsSynchronousIoControlDevice( + IN PFILE_OBJECT FileObject, + IN KPROCESSOR_MODE RequestorMode, + IN DWORD IoControl, + IN PVOID InBuffer, + IN ULONG InSize, + OUT PVOID OutBuffer, + IN ULONG OUtSize, + OUT PULONG BytesReturned); + + +/* =============================================================== + AVStream Functions (XP / DirectX 8) + NOT IMPLEMENTED YET + http://www.osronline.com/ddkx/stream/avstream_5q9f.htm +*/ + +#if 0 +typedef void (*PFNKSFILTERFACTORYPOWER)( + IN PKSFILTERFACTORY FilterFactory, + IN DEVICE_POWER_STATE State); + +KSDDKAPI NTSTATUS NTAPI +_KsEdit( + IN KSOBJECT_BAG ObjectBag, + IN OUT PVOID* PointerToPointerToItem, + IN ULONG NewSize, + IN ULONG OldSize, + IN ULONG Tag); + +VOID +KsAcquireControl( + IN PVOID Object) +{ +} + +VOID +KsAcquireDevice( + IN PKSDEVICE Device) +{ +} + +NTSTATUS +KsAddDevice( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PhysicalDeviceObject) +{ +} + +VOID +KsAddEvent( + IN PVOID Object, + IN PKSEVENT_ENTRY EventEntry) +{ +} + +NTSTATUS +KsAddItemToObjectBag( + IN KSOBJECT_BAG ObjectBag, + IN PVOID Item, + IN PFNKSFREE Free OPTIONAL) +{ +} + +NTSTATUS +KsAllocateObjectBag( + IN PKSDEVICE Device, + OUT KSOBJECT_BAG* ObjectBag) +{ +} + +VOID +KsCompletePendingRequest( + IN PIRP Irp) +{ +} + +NTSTATUS +KsCopyObjectBagItems( + IN KSOBJECT_BAG ObjectBagDestination, + IN KSOBJECT_BAG ObjectBagSource) +{ +} + +NTSTATUS +KsCreateDevice( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN const KSDEVICE_DESCRIPTOR* Descriptor OPTIONAL, + IN ULONG ExtensionSize OPTIONAL, + OUT PKSDEVICE* Device OPTIONAL) +{ +} + +NTSTATUS +KsCreateFilterFactory( + IN PDEVICE_OBJECT DeviceObject, + IN const KSFILTER_DESCRIPTOR* Descriptor, + IN PWCHAR RefString OPTIONAL, + IN PSECURITY_DESCRIPTOR SecurityDescriptor OPTIONAL, + IN ULONG CreateItemFlags, + IN PFNKSFILTERFACTORYPOWER SleepCallback OPTIONAL, + IN PFNKSFILTERFACTORYPOWER WakeCallback OPTIONAL, + OUT PKFSFILTERFACTORY FilterFactory OPTIONAL) +{ +} + +NTSTATUS +KsDefaultAddEventHandler( + IN PIRP Irp, + IN PKSEVENTDATA EventData, + IN OUT PKSEVENT_ENTRY EventEntry) +{ +} + +NTSTATUS +KsDeleteFilterFactory( + IN PKSFILTERFACTORY FilterFactory) +{ +} + +ULONG +KsDeviceGetBusData( + IN PKSDEVICE Device, + IN ULONG DataType, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length) +{ +} + +PKSFILTERFACTORY +KsDeviceGetFirstChildFilterFactory( + IN PKSDEVICE Device) +{ +} + +PUNKNOWN +KsDeviceGetOuterUnknown( + IN PKSDEVICE Device) +{ +} + +VOID +KsDeviceRegisterAdapterObject( + IN PKSDEVICE Device, + IN PADAPTER_OBJECT AdapterObject, + IN ULONG MaxMappingByteCount, + IN ULONG MappingTableStride) +{ +} + +KSDDKAPI PUNKNOWN NTAPI +KsDeviceRegisterAggregatedClientUnknown( + IN PKSDEVICE Device, + IN PUNKNOWN ClientUnknown); + +ULONG +KsDeviceSetBusData( + IN PKSDEVICE Device, + IN ULONG DataType, + IN PVOID Buffer, + IN ULONG Offset, + IN ULONG Length) +{ +} + +#define KsDiscard(object, pointer) \ + KsRemoveItemFromObjectBag(object->Bag, pointer, TRUE) + +VOID +KsFilterAcquireControl( + IN PKSFILTER Filter) +{ +} + +VOID +KsFilterAcquireProcessingMutex( + IN PKSFILTER Filter); + +VOID +KsFilterAddEvent( + IN PKSFILTER Filter, + IN PKSEVENT_ENTRY EventEntry) +{ +} + +KSDDKAPI NTSTATUS NTAPI +KsFilterAddTopologyConnections( + IN PKSFILTER Filter, + IN ULONG NewConnectionsCount, + IN const KSTOPOLOGY_CONNECTION* NewTopologyConnections); + +VOID +KsFilterAttemptProcessing( + IN PKSFILTER Filter, + IN BOOLEAN Asynchronous); + +KSDDKAPI NTSTATUS NTAPI +KsFilterCreateNode( + IN PKSFILTER Filter, + IN const KSNODE_DESCRIPTOR* NodeDescriptor, + OUT PULONG NodeID); + +KSDDKAPI NTSTATUS NTAPI +KsFilterCreatePinFactory( + IN PKSFILTER Filter, + IN const KSPIN_DESCRIPTOR_EX* PinDescriptor, + OUT PULONG PinID); + +PKSDEVICE __inline +KsFilterFactoryGetDevice( + IN PKSFILTERFACTORY FilterFactory); + +/* etc. */ +#endif /* avstream */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/reactos/drivers/multimedia/include/portcls.h b/reactos/drivers/multimedia/include/portcls.h new file mode 100644 index 00000000000..a296dc9e3b9 --- /dev/null +++ b/reactos/drivers/multimedia/include/portcls.h @@ -0,0 +1,597 @@ +/* + ReactOS Kernel Streaming + Port Class + + Andrew Greenwood + + NOTE: Obsolete macros are not implemented. For more info: + http://www.osronline.com/ddkx/stream/audpc-struct_167n.htm + + + == EXPORTS == + DRM: + * PcAddContentHandlers + * PcCreateContentMixed + * PcDestroyContent + * PcForwardContentToDeviceObject + * PcForwardContentToFileObject + * PcForwardContentToInterface + * PcGetContentRights + + IRP HANDLING: + * PcCompleteIrp + * PcDispatchIrp + * PcForwardIrpSynchronous + + ADAPTER: + * PcAddAdapterDevice + * PcInitializeAdapterDriver + + FACTORIES: + * PcNewDmaChannel + * PcNewInterruptSync + * PcNewMiniport + * PcNewPort + * PcNewRegistryKey + * PcNewResourceList + * PcNewResourceSublist + * PcNewServiceGroup + + POWER MANAGEMENT: + * PcRegisterAdapterPowerManagement + * PcRequestNewPowerState + + PROPERTIES: + * PcCompletePendingPropertyRequest + * PcGetDeviceProperty + + IO TIMEOUTS: + * PcRegisterIoTimeout + * PcUnregisterIoTimeout + + PHYSICAL CONNECTIONS: + * PcRegisterPhysicalConnection + * PcRegisterPhysicalConnectionFromExternal + * PcRegisterPhysicalConnectionToExternal + + MISC: + * PcGetTimeInterval + * PcRegisterSubdevice + + + == INTERFACES == + IDmaChannel + IDmaChannelSlave + IDmaOperations + IDrmPort + IDrmPort2 + IInterruptSync + IMasterClock + IPortClsVersion + IPortEvents + IPreFetchOffset + IRegistryKey + IResourceList + IServiceGroup + IServiceSink + + == AUDIO PORT OBJECT INTERFACES == + IPort + IPortDMus + IPortMidi + IPortTopology + IPortWaveCyclic + IPortWavePci + + == AUDIO MINIPORT OBJECT INTERFACES == + IMiniport + IMiniportDMus + IMiniportMidi + IMiniportTopology + IMiniportWaveCyclic + IMiniportWavePci + + == AUDIO MINIPORT AUXILIARY INTERFACES == + IMusicTechnology + IPinCount + + == AUDIO STREAM OBJECT INTERFACES == + IAllocatorMXF + IDrmAudioStream + IMiniportMidiStream + IMiniportWaveCyclicStream + IMiniportWavePciStream + IMXF + IPortWavePciStream + ISynthSinkDMus + + == DIRECTMUSIC USERMODE SYNTH AND SYNTH SINK INTERFACES == + IDirectMusicSynth + IDirectMusicSynthSink + + == AUDIO POWER MANAGEMENT INTERFACES == + IAdapterPowerManagement + IPowerNotify +*/ + +#ifndef PORTCLS_H +#define PORTCLS_H + +#include +#include +#include + +/* TODO */ +#define PORTCLASSAPI + + +const ULONG PCFILTER_NODE = ((ULONG) -1); + + + +/* =============================================================== + Class IDs - TODO +*/ +//#define CLSID_PortDMus /* dmusicks.h */ +#define CLSID_PortMidi +#define CLSID_PortTopology +#define CLSID_PortWaveCyclic +#define CLSID_PortWavePci + +/* first 2 are dmusicks.h */ +#define CLSID_MiniportDriverDMusUART +#define CLSID_MiniportDriverDMusUARTCapture +#define CLSID_MiniportDriverFmSynth +#define CLSID_MiniportDriverFmSynthWithVol +#define CLSID_MiniportDriverUart + + +/* =============================================================== + Property Item Flags - TODO +*/ +#define PCPROPERTY_ITEM_FLAG_GET +#define PCPROPERTY_ITEM_FLAG_SET +#define PCPROPERTY_ITEM_FLAG_DEFAULTVALUES +#define PCPROPERTY_ITEM_FLAG_BASICSUPPORT +#define PCPROPERTY_ITEM_FLAG_SERIALIZESIZE +#define PCPROPERTY_ITEM_FLAG_SERIALIZERAW +#define PCPROPERTY_ITEM_FLAG_UNSERIALIZERAW +#define PCPROPERTY_ITEM_FLAG_SERIALIZE + + +/* =============================================================== + Event Item Flags - TODO +*/ +#define PCEVENT_ITEM_FLAG_ENABLE +#define PCEVENT_ITEM_FLAG_ONESHOT +#define PCEVENT_ITEM_FLAG_BASICSUPPORT + + +/* =============================================================== + Event Verbs - TODO +*/ +#define PCEVENT_VERB_ADD +#define PCEVENT_VERB_REMOVE +#define PCEVENT_VERB_SUPPORT +#define PCEVENT_VERB_NONE + + +/* =============================================================== + Method Item Flags - TODO +*/ +#define PCMETHOD_ITEM_FLAG_MODIFY +#define PCMETHOD_ITEM_FLAG_NONE +#define PCMETHOD_ITEM_FLAG_READ +#define PCMETHOD_ITEM_FLAG_SOURCE +#define PCMETHOD_ITEM_FLAG_WRITE + + +/* =============================================================== + Method Verbs - TODO +*/ +#define PCMETHOD_ITEM_FLAG_BASICSUPPORT +#define PCMETHOD_ITEM_FLAG_SEND +#define PCMETHOD_ITEM_FLAG_SETSUPPORT + + +/* =============================================================== + Callback Functions +*/ + +struct _PCPROPERTY_REQUEST; + +typedef NTSTATUS (*PCPFNPROPERTY_HANDLER)( + IN struct _PCPROPERTY_REQUEST* PropertyRequest); + +typedef struct _PCPROPERTY_ITEM +{ + const GUID* Set; + ULONG Id; + ULONG Flags; + PCPFNPROPERTY_HANDLER Handler; +} PCPROPERTY_ITEM, *PPCPROPERTY_ITEM; + +typedef struct _PCPROPERTY_REQUEST +{ + PUNKNOWN MajorTarget; + PUNKNOWN MinorTarget; + ULONG Node; + const PCPROPERTY_ITEM* PropertyItem; + ULONG Verb; + ULONG InstanceSize; + PVOID Instance; + ULONG ValueSize; + PVOID Value; + PIRP Irp; +} PCPROPERTY_REQUEST, *PPCPROPERTY_REQUEST; + + +struct _PCEVENT_REQUEST; + +typedef NTSTATUS (*PCPFNEVENT_HANDLER)( + IN struct _PCEVENT_REQUEST* EventRequest); + +typedef struct _PCEVENT_ITEM +{ + const GUID* Set; + ULONG Id; + ULONG Flags; + PCPFNEVENT_HANDLER Handler; +} PCEVENT_ITEM, *PPCEVENT_ITEM; + +typedef struct _PCEVENT_REQUEST +{ + PUNKNOWN MajorTarget; + PUNKNOWN MinorTarget; + ULONG Node; + const PCEVENT_ITEM* EventItem; + PKSEVENT_ENTRY EventEntry; + ULONG Verb; + PIRP Irp; +} PCEVENT_REQUEST, *PPCEVENT_REQUEST; + + +struct _PCMETHOD_REQUEST; + +typedef NTSTATUS (*PCPFNMETHOD_HANDLER)( + IN struct _PCMETHOD_REQUEST* MethodRequest); + +typedef struct _PCMETHOD_ITEM +{ + const GUID* Set; + ULONG Id; + ULONG Flags; + PCPFNMETHOD_HANDLER Handler; +} PCMETHOD_ITEM, *PPCMETHOD_ITEM; + +typedef struct _PCMETHOD_REQUEST +{ + PUNKNOWN MajorTarget; + PUNKNOWN MinorTarget; + ULONG Node; + const PCMETHOD_ITEM* MethodItem; + ULONG Verb; +} PCMETHOD_REQUEST, *PPCMETHOD_REQUEST; + + +/* =============================================================== + Structures (unsorted) +*/ + +typedef struct +{ + ULONG PropertyItemSize; + ULONG PropertyCount; + const PCPROPERTY_ITEM* Properties; + ULONG MethodItemSize; + ULONG MethodCount; + const PCMETHOD_ITEM* Methods; + ULONG EventItemSize; + ULONG EventCount; + const PCEVENT_ITEM* Events; + ULONG Reserved; +} PCAUTOMATION_TABLE, *PPCAUTOMATION_TABLE; + +typedef struct +{ + ULONG FromNode; + ULONG FromNodePin; + ULONG ToNode; + ULONG ToNodePin; +} PCCONNECTION_DESCRIPTOR, *PPCCONNECTIONDESCRIPTOR; + +typedef struct +{ + ULONG MaxGlobalInstanceCount; + ULONG MaxFilterInstanceCount; + ULONG MinFilterInstanceCount; + const PCAUTOMATION_TABLE* AutomationTable; + KSPIN_DESCRIPTOR KsPinDescriptor; +} PCPIN_DESCRIPTOR, *PPCPIN_DESCRIPTOR; + +typedef struct +{ + ULONG Flags; + const PCAUTOMATION_TABLE* AutomationTable; + const GUID* Type; + const GUID* Name; +} PCNODE_DESCRIPTOR, *PPCNODE_DESCRIPTOR; + +typedef struct +{ + ULONG Version; + const PCAUTOMATION_TABLE* AutomationTable; + ULONG PinSize; + ULONG PinCount; + const PCPIN_DESCRIPTOR* Pins; + ULONG NodeSize; + ULONG NodeCount; + const PCNODE_DESCRIPTOR* Nodes; + ULONG ConnectionCount; + const PCCONNECTION_DESCRIPTOR* Connections; + ULONG CategoryCount; + const GUID* Categories; +} PCFILTER_DESCRIPTOR, *PPCFILTER_DESCRIPTOR; + + +/* =============================================================== + IPort Interface +*/ + +typedef struct +{ + /* TODO */ +} IPort; + + +/* =============================================================== + PortCls API Functions +*/ + +typedef NTSTATUS (*PCPFNSTARTDEVICE)( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PRESOURCELIST ResourceList); + +/* This should be in NTDDK.H */ +typedef NTSTATUS (*PDRIVER_ADD_DEVICE)( + IN struct _DRIVER_OBJECT* DriverObject, + IN struct _DEVICE_OBJECT* PhysicalDeviceObject); + +PORTCLASSAPI NTSTATUS NTAPI +PcAddAdapterDevice( + IN PDRIVER_OBJECT DriverObject, + IN PDEVICE_OBJECT PhysicalDeviceObject, + IN PCPFNSTARTDEVICE StartDevice, + IN ULONG MaxObjects, + IN ULONG DeviceExtensionSize); + +PORTCLASSAPI NTSTATUS NTAPI +PcInitializeAdapterDriver( + IN PDRIVER_OBJECT DriverObject, + IN PUNICODE_STRING RegistryPathName, + IN PDRIVER_ADD_DEVICE AddDevice); + + +/* =============================================================== + Factories (TODO: Move elsewhere) +*/ + +PORTCLASSAPI NTSTATUS NTAPI +PcNewDmaChannel( + OUT PDMACHANNEL* OutDmaChannel, + IN PUNKNOWN OuterUnknown OPTIONAL, + IN POOL_TYPE PoolType, + IN PDEVICE_DESCRIPTION DeviceDescription, + IN PDEVICE_OBJECT DeviceObject); + +PORTCLASSAPI NTSTATUS NTAPI +PcNewInterruptSync( + OUT PINTERRUPTSYNC* OUtInterruptSync, + IN PUNKNOWN OuterUnknown OPTIONAL, + IN PRESOURCELIST ResourceList, + IN ULONG ResourceIndex, + IN INTERRUPTSYNCMODE Mode); + +PORTCLASSAPI NTSTATUS NTAPI +PcNewMiniport( + OUT PMINIPORT* OutMiniport, + IN REFCLSID ClassId); + +PORTCLASSAPI NTSTATUS NTAPI +PcNewPort( + OUT PPORT* OutPort, + IN REFCLSID ClassId); + +PORTCLASSAPI NTSTATUS NTAPI +PcNewRegistryKey( + OUT PREGISTRYKEY* OutRegistryKey, + IN PUNKNOWN OuterUnknown OPTIONAL, + IN ULONG RegistryKeyType, + IN ACCESS_MASK DesiredAccess, + IN PVOID DeviceObject OPTIONAL, + IN PVOID SubDevice OPTIONAL, + IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL, + IN ULONG CreateOptions OPTIONAL, + OUT PULONG Disposition OPTIONAL); + +PORTCLASSAPI NTSTATUS NTAPI +PcNewResourceList( + OUT PRESOURCELIST* OutResourceList, + IN PUNKNOWN OuterUnknown OPTIONAL, + IN POOL_TYPE PoolType, + IN PCM_RESOURCE_LIST TranslatedResources, + IN PCM_RESOURCE_LIST UntranslatedResources); + +PORTCLASSAPI NTSTATUS NTAPI +PcNewResourceSublist( + OUT PRESOURCELIST* OutResourceList, + IN PUNKNOWN OuterUnknown OPTIONAL, + IN POOL_TYPE PoolType, + IN PRESOURCELIST ParentList, + IN ULONG MaximumEntries); + +PORTCLASSAPI NTSTATUS NTAPI +PcNewServiceGroup( + OUT PSERVICEGROUP* OutServiceGroup, + IN PUNKNOWN OuterUnknown OPTIONAL); + + +/* =============================================================== + IRP Handling +*/ + +PORTCLASSAPI NTSTATUS NTAPI +PcDispatchirp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + +PORTCLASSAPI NTSTATUS NTAPI +PcCompleteIrp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN NTSTATUS Status); + +PORTCLASSAPI NTSTATUS NTAPI +PcForwardIrpSynchronous( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp); + + +/* =============================================================== + Power Management +*/ + +PORTCLASSAPI NTSTATUS NTAPI +PcRegisterAdapterPowerManagement( + IN PUNKNOWN pUnknown, + IN PVOID pvContext1); + +PORTCLASSAPI NTSTATUS NTAPI + IN PDEVICE_OBJECT pDeviceObject, + IN DEVICE_POWER_STATE RequestedNewState); + + +/* =============================================================== + Properties +*/ + +PORTCLASSAPI NTSTATUS NTAPI +PcGetDeviceProperty( + IN PVOID DeviceObject, + IN DEVICE_REGISTRY_PROPERTY DeviceProperty, + IN ULONG BufferLength, + OUT PVOID PropertyBuffer, + OUT PULONG ResultLength); + +PORTCLASSAPI NTSTATUS NTAPI +PcCompletePendingPropertyRequest( + IN PPCPROPERTY_REQUEST PropertyRequest, + IN NTSTATUS NtStatus); + + +/* =============================================================== + I/O Timeouts +*/ + +PORTCLASSAPI NTSTATUS NTAPI +PcRegisterIoTimeout( + IN PDEVICE_OBJECT pDeviceObject, + IN PIO_TIMER_ROUTINE pTimerRoutine, + IN PVOID pContext); + +PORTCLASSAPI NTSTATUS NTAPI +PcUnregisterIoTimeout( + IN PDEVICE_OBJECT pDeviceObject, + IN PIO_TIMER_ROUTINE pTimerRoutine, + IN PVOID pContext); + + +/* =============================================================== + Physical Connections +*/ + +PORTCLASSAPI NTSTATUS NTAPI +PcRegisterPhysicalConnection( + IN PDEVICE_OBJECT DeviceObject, + IN PUNKNOWN FromUnknown, + IN ULONG FromPin, + IN PUNKNOWN ToUnknown, + IN ULONG ToPin); + +PORTCLASSAPI NTSTATUS NTAPI +PcRegisterPhysicalConnectionFromExternal( + IN PDEVICE_OBJECT DeviceObject, + IN PUNICODE_STRING FromString, + IN ULONG FromPin, + IN PUNKNOWN ToUnknown, + IN ULONG ToPin); + +PORTCLASSAPI NTSTATUS NTAPI +PcRegisterPhysicalConnectionToExternal( + IN PDEVICE_OBJECT DeviceObject, + IN PUNKNOWN FromUnknown, + IN ULONG FromPin, + IN PUNICODE_STRING ToString, + IN ULONG ToPin); + + +/* =============================================================== + Misc +*/ + +PORTCLASSAPI ULONGLONG NTAPI +PcGetTimeInterval( + IN ULONGLONG Since); + +PORTCLASSAPI NTSTATUS NTAPI +PcRegisterSubdevice( + IN PDEVICE_OBJECT DeviceObject, + IN PWCHAR Name, + IN PUNKNOWN Unknown); + + +/* =============================================================== + Digital Rights Management Functions +*/ + +PORTCLASSAPI NTSTATUS NTAPI +PcAddContentHandlers( + IN ULONG ContentId, + IN PVOID *paHandlers, + IN ULONG NumHandlers); + +PORTCLASSAPI NTSTATUS NTAPI +PcCreateContentMixed( + IN PULONG paContentId, + IN ULONG cContentId, + OUT PULONG pMixedContentId); + +PORTCLASSAPI NTSTATUS NTAPI +PcDestroyContent( + IN ULONG ContentId); + +PORTCLASSAPI NTSTATUS NTAPI +PcForwardContentToDeviceObject( + IN ULONG ContentId, + IN PVOID Reserved, + IN PCDRMFORWARD DrmForward); + +PORTCLASSAPI NTSTATUS NTAPI +PcForwardContentToFileObject( + IN ULONG ContentId, + IN PFILE_OBJECT FileObject); + +PORTCLASSAPI NTSTATUS NTAPI +PcForwardContentToInterface( + IN ULONG ContentId, + IN PUNKNOWN pUnknown, + IN ULONG NumMethods); + +PORTCLASSAPI NTSTATUS NTAPI +PcGetContentRights( + IN ULONG ContentId, + OUT PDRMRIGHTS DrmRights); + + +#endif diff --git a/reactos/drivers/multimedia/ks/allocators.c b/reactos/drivers/multimedia/ks/allocators.c new file mode 100644 index 00000000000..4fc778b75dc --- /dev/null +++ b/reactos/drivers/multimedia/ks/allocators.c @@ -0,0 +1,70 @@ +/* =============================================================== + Allocator Functions +*/ + +#include + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsCreateAllocator( + IN HANDLE ConnectionHandle, + IN PKSALLOCATOR_FRAMING AllocatorFraming, + OUT PHANDLE AllocatorHandle) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsCreateDefaultAllocator( + IN PIRP Irp) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsValidateAllocatorCreateRequest( + IN PIRP Irp, + OUT PKSALLOCATOR_FRAMING* AllocatorFraming) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsCreateDefaultAllocatorEx( + IN PIRP Irp, + IN PVOID InitializeContext OPTIONAL, + IN PFNKSDEFAULTALLOCATE DefaultAllocate OPTIONAL, + IN PFNKSDEFAULTFREE DefaultFree OPTIONAL, + IN PFNKSINITIALIZEALLOCATOR InitializeAllocator OPTIONAL, + IN PFNKSDELETEALLOCATOR DeleteAllocator OPTIONAL) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsValidateAllocatorFramingEx( + IN PKSALLOCATOR_FRAMING_EX Framing, + IN ULONG BufferSize, + IN const KSALLOCATOR_FRAMING_EX* PinFraming) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} diff --git a/reactos/drivers/multimedia/ks/clocks.c b/reactos/drivers/multimedia/ks/clocks.c new file mode 100644 index 00000000000..a075bbff966 --- /dev/null +++ b/reactos/drivers/multimedia/ks/clocks.c @@ -0,0 +1,124 @@ +/* =============================================================== + Clock Functions +*/ + +#include + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsCreateClock( + IN HANDLE ConnectionHandle, + IN PKSCLOCK_CREATE ClockCreate, + OUT PHANDLE ClockHandle) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsCreateDefaultClock( + IN PIRP Irp, + IN PKSDEFAULTCLOCK DefaultClock) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsAllocateDefaultClock( + OUT PKSDEFAULTCLOCK* DefaultClock) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsAllocateDefaultClockEx( + OUT PKSDEFAULTCLOCK* DefaultClock, + IN PVOID Context OPTIONAL, + IN PFNKSSETTIMER SetTimer OPTIONAL, + IN PFNKSCANCELTIMER CancelTimer OPTIONAL, + IN PFNKSCORRELATEDTIME CorrelatedTime OPTIONAL, + IN const KSRESOLUTION* Resolution OPTIONAL, + IN ULONG Flags) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsFreeDefaultClock( + IN PKSDEFAULTCLOCK DefaultClock) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsValidateClockCreateRequest( + IN PIRP Irp, + OUT PKSCLOCK_CREATE* ClockCreate) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI KSSTATE NTAPI +KsGetDefaultClockState( + IN PKSDEFAULTCLOCK DefaultClock) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsSetDefaultClockState( + IN PKSDEFAULTCLOCK DefaultClock, + IN KSSTATE State) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI LONGLONG NTAPI +KsGetDefaultClockTime( + IN PKSDEFAULTCLOCK DefaultClock) +{ + UNIMPLEMENTED; + return 0; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsSetDefaultClockTime( + IN PKSDEFAULTCLOCK DefaultClock, + IN LONGLONG Time) +{ + UNIMPLEMENTED; +} diff --git a/reactos/drivers/multimedia/ks/connectivity.c b/reactos/drivers/multimedia/ks/connectivity.c new file mode 100644 index 00000000000..23defde4f8f --- /dev/null +++ b/reactos/drivers/multimedia/ks/connectivity.c @@ -0,0 +1,64 @@ +/* + KsCreatePin + KsValidateConnectRequest + KsPinPropertyHandler + KsPinDataIntersection + KsHandleSizedListQuery +*/ + +#include + +KSDDKAPI NTSTATUS NTAPI +KsCreatePin( + IN HANDLE FilterHandle, + IN PKSPIN_CONNECT Connect, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE ConnectionHandle) +{ + return STATUS_SUCCESS; +} + +KSDDKAPI NTSTATUS NTAPI +KsValidateConnectRequest( + IN PIRP Irp, + IN ULONG DescriptorsCount, + IN KSPIN_DESCRIPTOR* Descriptor, + OUT PKSPIN_CONNECT* Connect) +{ + return STATUS_SUCCESS; +} + +KSDDKAPI NTSTATUS NTAPI +KsPinPropertyHandler( + IN PIRP Irp, + IN PKSPROPERTY Property, + IN OUT PVOID Data, + IN ULONG DescriptorsCount, + IN const KSPIN_DESCRIPTOR* Descriptor) +{ + return STATUS_SUCCESS; +} + +KSDDKAPI NTSTATUS NTAPI +KsPinDataIntersection( + IN PIRP Irp, + IN PKSPIN Pin, + OUT PVOID Data, + IN ULONG DescriptorsCount, + IN const KSPIN_DESCRIPTOR* Descriptor, + IN PFNKSINTERSECTHANDLER IntersectHandler) +{ + return STATUS_SUCCESS; +} + +/* Does this belong here? */ + +KSDDKAPI NTSTATUS NTAPI +KsHandleSizedListQuery( + IN PIRP Irp, + IN ULONG DataItemsCount, + IN ULONG DataItemSize, + IN const VOID* DataItems) +{ + return STATUS_SUCCESS; +} diff --git a/reactos/drivers/multimedia/ks/events.c b/reactos/drivers/multimedia/ks/events.c new file mode 100644 index 00000000000..814d65e8c7a --- /dev/null +++ b/reactos/drivers/multimedia/ks/events.c @@ -0,0 +1,100 @@ +#include + +/* =============================================================== + Event Functions +*/ + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsGenerateEvent( + IN PKSEVENT_ENTRY EntryEvent) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsEnableEventWithAllocator( + IN PIRP Irp, + IN ULONG EventSetsCount, + IN PKSEVENT_SET EventSet, + IN OUT PLIST_ENTRY EventsList OPTIONAL, + IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL, + IN PVOID EventsLock OPTIONAL, + IN PFNKSALLOCATOR Allocator OPTIONAL, + IN ULONG EventItemSize OPTIONAL) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsGenerateDataEvent( + IN PKSEVENT_ENTRY EventEntry, + IN ULONG DataSize, + IN PVOID Data) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsEnableEvent( + IN PIRP Irp, + IN ULONG EventSetsCount, + IN KSEVENT_SET* EventSet, + IN OUT PLIST_ENTRY EventsList OPTIONAL, + IN KSEVENTS_LOCKTYPE EventsFlags OPTIONAL, + IN PVOID EventsLock OPTIONAL) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsDiscardEvent( + IN PKSEVENT_ENTRY EventEntry) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsDisableEvent( + IN PIRP Irp, + IN OUT PLIST_ENTRY EventsList, + IN KSEVENTS_LOCKTYPE EventsFlags, + IN PVOID EventsLock) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsFreeEventList( + IN PFILE_OBJECT FileObject, + IN OUT PLIST_ENTRY EventsList, + IN KSEVENTS_LOCKTYPE EVentsFlags, + IN PVOID EventsLock) +{ + UNIMPLEMENTED; +} diff --git a/reactos/drivers/multimedia/ks/irp.c b/reactos/drivers/multimedia/ks/irp.c new file mode 100644 index 00000000000..8924ee6db3e --- /dev/null +++ b/reactos/drivers/multimedia/ks/irp.c @@ -0,0 +1,479 @@ +/* + ReactOS Kernel Streaming + IRP Helpers +*/ + +#include + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsAcquireResetValue( + IN PIRP Irp, + OUT KSRESET* ResetValue) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsAddIrpToCancelableQueue( + IN OUT PLIST_ENTRY QueueHead, + IN PKSPIN_LOCK SpinLock, + IN PIRP Irp, + IN KSLIST_ENTRY_LOCATION ListLocation, + IN PDRIVER_CANCEL DriverCancel OPTIONAL) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsAddObjectCreateItemToDeviceHeader( + IN KSDEVICE_HEADER Header, + IN PDRIVER_DISPATCH Create, + IN PVOID Context, + IN PWCHAR ObjectClass, + IN PSECURITY_DESCRIPTOR SecurityDescriptor) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsAddObjectCreateItemToObjectHeader( + IN KSOBJECT_HEADER Header, + IN PDRIVER_DISPATCH Create, + IN PVOID Context, + IN PWCHAR ObjectClass, + IN PSECURITY_DESCRIPTOR SecurityDescriptor) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsAllocateDeviceHeader( + OUT PVOID Header, + IN ULONG ItemsCount, + IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsAllocateExtraData( + IN PIRP Irp, + IN ULONG ExtraSize, + OUT PVOID* ExtraBuffer) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsAllocateObjectCreateItem( + IN KSDEVICE_HEADER Header, + IN PKSOBJECT_CREATE_ITEM CreateItem, + IN BOOL AllocateEntry, + IN PFNKSITEMFREECALLBACK ItemFreeCallback OPTIONAL) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsAllocateObjectHeader( + OUT PVOID Header, + IN ULONG ItemsCount, + IN PKSOBJECT_CREATE_ITEM ItemsList OPTIONAL, + IN PIRP Irp, + IN KSDISPATCH_TABLE* Table) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsCancelIo( + IN OUT PLIST_ENTRY QueueHead, + IN PKSPIN_LOCK SpinLock) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsCancelRoutine( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsDefaultDeviceIoCompletion( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI BOOLEAN NTAPI +KsDispatchFastIoDeviceControlFailure( + IN PFILE_OBJECT FileObject, + IN BOOLEAN Wait, + IN PVOID InputBuffer OPTIONAL, + IN ULONG InputBufferLength, + OUT PVOID OutputBuffer OPTIONAL, + IN ULONG OutputBufferLength, + IN ULONG IoControlCode, + OUT PIO_STATUS_BLOCK IoStatus, + IN PDEVICE_OBJECT DeviceObject) /* always return false */ +{ + return FALSE; +} + +/* + @unimplemented +*/ +KSDDKAPI BOOLEAN NTAPI +KsDispatchFastReadFailure( + IN PFILE_OBJECT FileObject, + IN PLARGE_INTEGER FileOffset, + IN ULONG Length, + IN BOOLEAN Wait, + IN ULONG LockKey, + OUT PVOID Buffer, + OUT PIO_STATUS_BLOCK IoStatus, + IN PDEVICE_OBJECT DeviceObject) /* always return false */ +{ + return FALSE; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsDispatchInvalidDeviceRequest( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsDispatchIrp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsDispatchSpecificMethod( + IN PIRP Irp, + IN PFNKSHANDLER Handler) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsDispatchSpecificProperty( + IN PIRP Irp, + IN PFNKSHANDLER Handler) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsForwardAndCatchIrp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp, + IN PFILE_OBJECT FileObject, + IN KSSTACK_USE StackUse) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsForwardIrp( + IN PIRP Irp, + IN PFILE_OBJECT FileObject, + IN BOOLEAN ReuseStackLocation) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsFreeDeviceHeader( + IN PVOID Header) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsFreeObjectHeader( + IN PVOID Header) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsGetChildCreateParameter( + IN PIRP Irp, + OUT PVOID* CreateParameter) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsMoveIrpsOnCancelableQueue( + IN OUT PLIST_ENTRY SourceList, + IN PKSPIN_LOCK SourceLock, + IN OUT PLIST_ENTRY DestinationList, + IN PKSPIN_LOCK DestinationLock OPTIONAL, + IN KSLIST_ENTRY_LOCATION ListLocation, + IN PFNKSIRPLISTCALLBACK ListCallback, + IN PVOID Context) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsProbeStreamIrp( + IN PIRP Irp, + IN ULONG ProbeFlags, + IN ULONG HeaderSize) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsQueryInformationFile( + IN PFILE_OBJECT FileObject, + OUT PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI ACCESS_MASK NTAPI +KsQueryObjectAccessMask( + IN KSOBJECT_HEADER Header) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI PKSOBJECT_CREATE_ITEM NTAPI +KsQueryObjectCreateItem( + IN KSOBJECT_HEADER Header) +{ + UNIMPLEMENTED; +/* return STATUS_UNSUCCESSFUL; */ + return NULL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsReadFile( + IN PFILE_OBJECT FileObject, + IN PKEVENT Event OPTIONAL, + IN PVOID PortContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + OUT PVOID Buffer, + IN ULONG Length, + IN ULONG Key OPTIONAL, + IN KPROCESSOR_MODE RequestorMode) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsReleaseIrpOnCancelableQueue( + IN PIRP Irp, + IN PDRIVER_CANCEL DriverCancel OPTIONAL) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI PIRP NTAPI +KsRemoveIrpFromCancelableQueue( + IN OUT PLIST_ENTRY QueueHead, + IN PKSPIN_LOCK SpinLock, + IN KSLIST_ENTRY_LOCATION ListLocation, + IN KSIRP_REMOVAL_OPERATION RemovalOperation) +{ + UNIMPLEMENTED; + return NULL; + /*return STATUS_UNSUCCESSFUL; */ +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsRemoveSpecificIrpFromCancelableQueue( + IN PIRP Irp) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsSetInformationFile( + IN PFILE_OBJECT FileObject, + IN PVOID FileInformation, + IN ULONG Length, + IN FILE_INFORMATION_CLASS FileInformationClass) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsSetMajorFunctionHandler( + IN PDRIVER_OBJECT DriverObject, + IN ULONG MajorFunction) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsStreamIo( + IN PFILE_OBJECT FileObject, + IN PKEVENT Event OPTIONAL, + IN PVOID PortContext OPTIONAL, + IN PIO_COMPLETION_ROUTINE CompletionRoutine OPTIONAL, + IN PVOID CompletionContext OPTIONAL, + IN KSCOMPLETION_INVOCATION CompletionInvocationFlags OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN OUT PVOID StreamHeaders, + IN ULONG Length, + IN ULONG Flags, + IN KPROCESSOR_MODE RequestorMode) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI + KsWriteFile( + IN PFILE_OBJECT FileObject, + IN PKEVENT Event OPTIONAL, + IN PVOID PortContext OPTIONAL, + OUT PIO_STATUS_BLOCK IoStatusBlock, + IN PVOID Buffer, + IN ULONG Length, + IN ULONG Key OPTIONAL, + IN KPROCESSOR_MODE RequestorMode) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} diff --git a/reactos/drivers/multimedia/ks/ks.def b/reactos/drivers/multimedia/ks/ks.def new file mode 100644 index 00000000000..f146fc5f53f --- /dev/null +++ b/reactos/drivers/multimedia/ks/ks.def @@ -0,0 +1,111 @@ +; +; Exports definition file for ks.sys +; + +EXPORTS +KsCreateAllocator@12 +KsCreateDefaultAllocator@4 +KsValidateAllocatorCreateRequest@8 +KsCreateDefaultAllocatorEx@24 +KsValidateAllocatorFramingEx@12 + +KsCreateClock@12 +KsCreateDefaultClock@8 +KsAllocateDefaultClock@4 +KsAllocateDefaultClockEx@28 +KsFreeDefaultClock@4 +KsValidateClockCreateRequest@8 +KsGetDefaultClockState@4 +KsSetDefaultClockState@8 +KsGetDefaultClockTime@4 +KsSetDefaultClockTime@12 + +KsMethodHandler@12 +KsMethodHandlerWithAllocator@20 +KsFastMethodHandler@32 + +KsPropertyHandler@12 +KsPropertyHandlerWithAllocator@20 +KsUnserializeObjectPropertiesFromRegistry@12 +KsFastPropertyHandler@32 + +KsGenerateEvent@4 +KsEnableEventWithAllocator@32 +KsGenerateDataEvent@12 +KsEnableEvent@24 +KsDiscardEvent@4 +KsDisableEvent@16 +KsFreeEventList@16 + +KsValidateTopologyNodeCreateRequest@12 +KsCreateTopologyNode@16 +KsTopologyPropertyHandler@16 + +KsCreatePin@16 +KsValidateConnectRequest@16 +KsPinPropertyHandler@20 +KsPinDataIntersection@24 + +KsHandleSizedListQuery@16 + +KsAcquireResetValue@8 +KsAddIrpToCancelableQueue@20 +KsAddObjectCreateItemToDeviceHeader@20 +KsAddObjectCreateItemToObjectHeader@20 +KsAllocateDeviceHeader@12 +KsAllocateExtraData@12 +KsAllocateObjectCreateItem@16 +KsAllocateObjectHeader@20 +KsCancelIo@8 +KsCancelRoutine@8 +KsDefaultDeviceIoCompletion@8 +KsDispatchFastIoDeviceControlFailure@36 +KsDispatchFastReadFailure@32 +; KsDispatchFastWriteFailure@32 +KsDispatchInvalidDeviceRequest@8 +KsDispatchIrp@8 +KsDispatchSpecificMethod@8 +KsDispatchSpecificProperty@8 +KsForwardAndCatchIrp@16 +KsForwardIrp@12 +KsFreeDeviceHeader@4 +KsFreeObjectHeader@4 +KsGetChildCreateParameter@8 +KsMoveIrpsOnCancelableQueue@28 +KsProbeStreamIrp@12 +KsQueryInformationFile@16 +KsQueryObjectAccessMask@4 +KsQueryObjectCreateItem@4 +KsReadFile@32 +KsReleaseIrpOnCancelableQueue@8 +KsRemoveIrpFromCancelableQueue@16 +KsRemoveSpecificIrpFromCancelableQueue@4 +KsSetInformationFile@16 +KsSetMajorFunctionHandler@8 +KsStreamIo@44 +KsWriteFile@32 + +KsRegisterWorker@8 +KsUnregisterWorker@4 +KsRegisterCountedWorker@12 +KsDecrementCountedWorker@4 +KsIncrementCountedWorker@4 +KsQueueWorkItem@8 + +KsCacheMedium@12 +KsDefaultDispatchPnp@8 +KsSetDevicePnpAndBaseObject@12 +KsDefaultDispatchPower@8 +KsSetPowerDispatch@12 +KsReferenceBusObject@4 +KsDereferenceBusObject@4 +KsFreeObjectCreateItem@8 +KsFreeObjectCreateItemsByContext@8 +KsLoadResource@24 +; KsNullDriverUnload@4 +KsPinDataIntersectionEx@32 +KsQueryDevicePnpObject@4 +KsRecalculateStackDepth@8 +KsSetTargetDeviceObject@8 +KsSetTargetState@8 +KsSynchronousIoControlDevice@32 diff --git a/reactos/drivers/multimedia/ks/ks.rbuild b/reactos/drivers/multimedia/ks/ks.rbuild new file mode 100644 index 00000000000..eb3566bdab3 --- /dev/null +++ b/reactos/drivers/multimedia/ks/ks.rbuild @@ -0,0 +1,19 @@ + + . + .. + ../include + + ntoskrnl + + + allocators.c + clocks.c + connectivity.c + events.c + irp.c + methods.c + misc.c + properties.c + topology.c + worker.c + diff --git a/reactos/drivers/multimedia/ks/methods.c b/reactos/drivers/multimedia/ks/methods.c new file mode 100644 index 00000000000..f766c1b41dd --- /dev/null +++ b/reactos/drivers/multimedia/ks/methods.c @@ -0,0 +1,51 @@ +/* =============================================================== + Method Functions +*/ + +#include + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsMethodHandler( + IN PIRP Irp, + IN ULONG MethodSetsCount, + IN PKSMETHOD_SET MethodSet) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsMethodHandlerWithAllocator( + IN PIRP Irp, + IN ULONG MethodSetsCount, + IN PKSMETHOD_SET MethodSet, + IN PFNKSALLOCATOR Allocator OPTIONAL, + IN ULONG MethodItemSize OPTIONAL) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI BOOLEAN NTAPI +KsFastMethodHandler( + IN PFILE_OBJECT FileObject, + IN PKSMETHOD UNALIGNED Method, + IN ULONG MethodLength, + IN OUT PVOID UNALIGNED Data, + IN ULONG DataLength, + OUT PIO_STATUS_BLOCK IoStatus, + IN ULONG MethodSetsCount, + IN const KSMETHOD_SET* MethodSet) +{ + UNIMPLEMENTED; + return FALSE; +} diff --git a/reactos/drivers/multimedia/ks/misc.c b/reactos/drivers/multimedia/ks/misc.c new file mode 100644 index 00000000000..7e5303ec6e3 --- /dev/null +++ b/reactos/drivers/multimedia/ks/misc.c @@ -0,0 +1,218 @@ +#include + +/* =============================================================== + Misc. Helper Functions +*/ + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsCacheMedium( + IN PUNICODE_STRING SymbolicLink, + IN PKSPIN_MEDIUM Medium, + IN DWORD PinDirection) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsDefaultDispatchPnp( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsSetDevicePnpAndBaseObject( + IN KSDEVICE_HEADER Header, + IN PDEVICE_OBJECT PnpDeviceObject, + IN PDEVICE_OBJECT BaseDevice) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsDefaultDispatchPower( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsSetPowerDispatch( + IN KSOBJECT_HEADER Header, + IN PFNKSCONTEXT_DISPATCH PowerDispatch OPTIONAL, + IN PVOID PowerContext OPTIONAL) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsReferenceBusObject( + IN KSDEVICE_HEADER Header) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsDereferenceBusObject( + IN KSDEVICE_HEADER Header) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsFreeObjectCreateItem( + IN KSDEVICE_HEADER Header, + IN PUNICODE_STRING CreateItem) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsFreeObjectCreateItemsByContext( + IN KSDEVICE_HEADER Header, + IN PVOID Context) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsLoadResource( + IN PVOID ImageBase, + IN POOL_TYPE PoolType, + IN ULONG_PTR ResourceName, + IN ULONG ResourceType, + OUT PVOID* Resource, + OUT PULONG ResourceSize) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +VOID +KsNullDriverUnload( + IN PDRIVER_OBJECT DriverObject) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsPinDataIntersectionEx( + IN PIRP Irp, + IN PKSP_PIN Pin, + OUT PVOID Data, + IN ULONG DescriptorsCount, + IN const KSPIN_DESCRIPTOR* Descriptor, + IN ULONG DescriptorSize, + IN PFNKSINTERSECTHANDLEREX IntersectHandler OPTIONAL, + IN PVOID HandlerContext OPTIONAL) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI PDEVICE_OBJECT NTAPI +KsQueryDevicePnpObject( + IN KSDEVICE_HEADER Header) +{ + UNIMPLEMENTED; + return NULL; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsRecalculateStackDepth( + IN KSDEVICE_HEADER Header, + IN BOOLEAN ReuseStackLocation) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsSetTargetDeviceObject( + IN KSOBJECT_HEADER Header, + IN PDEVICE_OBJECT TargetDevice OPTIONAL) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsSetTargetState( + IN KSOBJECT_HEADER Header, + IN KSTARGET_STATE TargetState) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsSynchronousIoControlDevice( + IN PFILE_OBJECT FileObject, + IN KPROCESSOR_MODE RequestorMode, + IN DWORD IoControl, + IN PVOID InBuffer, + IN ULONG InSize, + OUT PVOID OutBuffer, + IN ULONG OUtSize, + OUT PULONG BytesReturned) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + diff --git a/reactos/drivers/multimedia/ks/properties.c b/reactos/drivers/multimedia/ks/properties.c new file mode 100644 index 00000000000..84a223784e6 --- /dev/null +++ b/reactos/drivers/multimedia/ks/properties.c @@ -0,0 +1,64 @@ +#include + +/* =============================================================== + Property Functions +*/ + +/* + @unimplemented +*/ +KSDDKAPI BOOLEAN NTAPI +KsFastPropertyHandler( + IN PFILE_OBJECT FileObject, + IN PKSPROPERTY UNALIGNED Property, + IN ULONG PropertyLength, + IN OUT PVOID UNALIGNED Data, + IN ULONG DataLength, + OUT PIO_STATUS_BLOCK IoStatus, + IN ULONG PropertySetsCount, + IN const KSPROPERTY_SET* PropertySet) +{ + UNIMPLEMENTED; + return FALSE; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsPropertyHandler( + IN PIRP Irp, + IN ULONG PropertySetsCount, + IN const KSPROPERTY_SET* PropertySet) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsPropertyHandlerWithAllocator( + IN PIRP Irp, + IN ULONG PropertySetsCount, + IN PKSPROPERTY_SET PropertySet, + IN PFNKSALLOCATOR Allocator OPTIONAL, + IN ULONG PropertyItemSize OPTIONAL) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsUnserializeObjectPropertiesFromRegistry( + IN PFILE_OBJECT FileObject, + IN HANDLE ParentKey OPTIONAL, + IN PUNICODE_STRING RegistryPath OPTIONAL) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} diff --git a/reactos/drivers/multimedia/ks/topology.c b/reactos/drivers/multimedia/ks/topology.c new file mode 100644 index 00000000000..df5049444ab --- /dev/null +++ b/reactos/drivers/multimedia/ks/topology.c @@ -0,0 +1,46 @@ +#include + +/* =============================================================== + Topology Functions +*/ + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsCreateTopologyNode( + IN HANDLE ParentHandle, + IN PKSNODE_CREATE NodeCreate, + IN ACCESS_MASK DesiredAccess, + OUT PHANDLE NodeHandle) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsValidateTopologyNodeCreateRequest( + IN PIRP Irp, + IN PKSTOPOLOGY Topology, + OUT PKSNODE_CREATE* NodeCreate) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsTopologyPropertyHandler( + IN PIRP Irp, + IN PKSPROPERTY Property, + IN OUT PVOID Data, + IN const KSTOPOLOGY* Topology) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} diff --git a/reactos/drivers/multimedia/ks/worker.c b/reactos/drivers/multimedia/ks/worker.c new file mode 100644 index 00000000000..f47e9a2780d --- /dev/null +++ b/reactos/drivers/multimedia/ks/worker.c @@ -0,0 +1,74 @@ +/* =============================================================== + Worker Management Functions +*/ + +#include + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsRegisterWorker( + IN WORK_QUEUE_TYPE WorkQueueType, + OUT PKSWORKER* Worker) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI VOID NTAPI +KsUnregisterWorker( + IN PKSWORKER Worker) +{ + UNIMPLEMENTED; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsRegisterCountedWorker( + IN WORK_QUEUE_TYPE WorkQueueType, + IN PWORK_QUEUE_ITEM CountedWorkItem, + OUT PKSWORKER* Worker) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + @unimplemented +*/ +KSDDKAPI ULONG NTAPI +KsDecrementCountedWorker( + IN PKSWORKER Worker) +{ + UNIMPLEMENTED; + return 0; +} + +/* + @unimplemented +*/ +KSDDKAPI ULONG NTAPI +KsIncrementCountedWorker( + IN PKSWORKER Worker) +{ + UNIMPLEMENTED; + return 0; +} + +/* + @unimplemented +*/ +KSDDKAPI NTSTATUS NTAPI +KsQueueWorkItem( + IN PKSWORKER Worker, + IN PWORK_QUEUE_ITEM WorkItem) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} diff --git a/reactos/drivers/multimedia/portcls/portcls.c b/reactos/drivers/multimedia/portcls/portcls.c new file mode 100644 index 00000000000..68fc51fe9cb --- /dev/null +++ b/reactos/drivers/multimedia/portcls/portcls.c @@ -0,0 +1,489 @@ +/* + * PROJECT: ReactOS Sound System + * LICENSE: GPL - See COPYING in the top level directory + * FILE: drivers/multimedia/portcls/portcls.c + * PURPOSE: Audio Port Class Functions + * PROGRAMMERS: + * + */ + +#include "portcls.h" + + +#define NDEBUG +#include + + +NTSTATUS STDCALL +DriverEntry(PDRIVER_OBJECT DriverObject, + PUNICODE_STRING RegistryPath) +{ + return STATUS_SUCCESS; +} + +/* + * @implemented + */ +ULONG STDCALL +DllInitialize(ULONG Unknown) +{ + return 0; +} + +/* + * @implemented + */ +ULONG STDCALL +DllUnload(VOID) +{ + return 0; +} + + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcAddAdapterDevice( + ULONG DriverObject, + ULONG PhysicalDeviceObject, + ULONG StartDevice, + ULONG MaxObjects, + ULONG DeviceExtensionSize +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcAddContentHandlers( + ULONG ContentId, + ULONG paHandlers, + ULONG NumHandlers +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcCompleteIrp( + ULONG DeviceObject, + ULONG Irp, + ULONG Status +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcCompletePendingPropertyRequest( + ULONG PropertyRequest, + ULONG NtStatus +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcCreateContentMixed( + ULONG paContentId, + ULONG cContentId, + ULONG pMixedContentId +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcDestroyContent( + ULONG ContentId +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcDispatchIrp( + ULONG DeviceObject, + ULONG Irp +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcForwardContentToDeviceObject( + ULONG ContentId, + ULONG Reserved, + ULONG DrmForward +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcForwardContentToFileObject( + ULONG ContentId, + ULONG FileObject +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcForwardContentToInterface( + ULONG ContentId, + ULONG Unknown, + ULONG NumMethods +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcForwardIrpSynchronous( + ULONG DeviceObject, + ULONG Irp +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcGetContentRights( + ULONG ContentId, + ULONG DrmRights +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcGetDeviceProperty( + ULONG DeviceObject, + ULONG DeviceProperty, + ULONG BufferLength, + ULONG PropertyBuffer, + ULONG ResultLength +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @implemented + */ +ULONGLONG STDCALL +PcGetTimeInterval( + ULONGLONG Timei +) +{ + LARGE_INTEGER CurrentTime; + + KeQuerySystemTime( &CurrentTime); + + return (Timei - CurrentTime.QuadPart); +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcInitializeAdapterDriver( + ULONG DriverObject, + ULONG RegistryPathName, + ULONG AddDevice +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcNewDmaChannel( + ULONG OutDmaChannel, + ULONG Unknown, + ULONG PoolType, + ULONG DeviceDescription, + ULONG DeviceObject +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcNewInterruptSync( + ULONG OutInterruptSync, + ULONG Unknown, + ULONG ResourceList, + ULONG ResourceIndex, + ULONG Mode +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcNewMiniport( + ULONG OutMiniport, + ULONG ClassId +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcNewPort( + ULONG OutPort, + ULONG ClassId +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcNewRegistryKey( + ULONG OutRegistryKey, + ULONG Unknown, + ULONG RegistryKeyType, + ULONG DesiredAccess, + ULONG DeviceObject, + ULONG SubDevice, + ULONG ObjectAttributes, + ULONG CreateOptions, + ULONG Disposition +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcNewResourceList( + ULONG OutResourceList, + ULONG Unknown, + ULONG PoolType, + ULONG TranslatedResources, + ULONG UntranslatedResources +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcNewResourceSublist( + ULONG OutResourceList, + ULONG Unknown, + ULONG PoolType, + ULONG ParentList, + ULONG MaximumEntries +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcNewServiceGroup( + ULONG OutServiceGroup, + ULONG Unknown +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcRegisterAdapterPowerManagement( + ULONG Unknown, + ULONG pvContext +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcRegisterIoTimeout( + ULONG pDeviceObject, + ULONG pTimerRoutine, + ULONG pContext +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcRegisterPhysicalConnection( + ULONG DeviceObject, + ULONG FromUnknown, + ULONG FromPin, + ULONG ToUnknown, + ULONG ToPin +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcRegisterPhysicalConnectionFromExternal( + ULONG DeviceObject, + ULONG FromString, + ULONG FromPin, + ULONG ToUnknown, + ULONG ToPin +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcRegisterPhysicalConnectionToExternal( + ULONG DeviceObject, + ULONG FromUnknown, + ULONG FromPin, + ULONG ToString, + ULONG ToPin +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcRegisterSubdevice( + ULONG DeviceObject, + ULONG SubdevName, + ULONG Unknown +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcRequestNewPowerState( + ULONG pDeviceObject, + ULONG RequestedNewState +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + +/* + * @unimplemented + */ +NTSTATUS STDCALL +PcUnregisterIoTimeout( + ULONG pDeviceObject, + ULONG pTimerRoutine, + ULONG pContext +) +{ + UNIMPLEMENTED; + return STATUS_UNSUCCESSFUL; +} + diff --git a/reactos/drivers/multimedia/portcls/portcls.def b/reactos/drivers/multimedia/portcls/portcls.def new file mode 100644 index 00000000000..0f890af8219 --- /dev/null +++ b/reactos/drivers/multimedia/portcls/portcls.def @@ -0,0 +1,36 @@ +; +; Exports definition file for portcls.sys +; +EXPORTS +PcAddAdapterDevice@20 +PcAddContentHandlers@12 +PcCompleteIrp@12 +PcCompletePendingPropertyRequest@8 +PcCreateContentMixed@12 +PcDestroyContent@4 +PcDispatchIrp@8 +PcForwardContentToDeviceObject@12 +PcForwardContentToFileObject@8 +PcForwardContentToInterface@12 +PcForwardIrpSynchronous@8 +PcGetContentRights@8 +PcGetDeviceProperty@20 +PcGetTimeInterval@8 +PcInitializeAdapterDriver@12 +PcNewDmaChannel@20 +PcNewInterruptSync@20 +PcNewMiniport@8 +PcNewPort@8 +PcNewRegistryKey@36 +PcNewResourceList@20 +PcNewResourceSublist@20 +PcNewServiceGroup@8 +PcRegisterAdapterPowerManagement@8 +PcRegisterIoTimeout@12 +PcRegisterPhysicalConnection@20 +PcRegisterPhysicalConnectionFromExternal@20 +PcRegisterPhysicalConnectionToExternal@20 +PcRegisterSubdevice@12 +PcRequestNewPowerState@8 +PcUnregisterIoTimeout@12 + diff --git a/reactos/drivers/multimedia/portcls/portcls.h b/reactos/drivers/multimedia/portcls/portcls.h new file mode 100644 index 00000000000..4dc027db331 --- /dev/null +++ b/reactos/drivers/multimedia/portcls/portcls.h @@ -0,0 +1,253 @@ +/* + + Move to w32api when it is ready. + + */ +#ifndef _PORTCLS_H +#define _PORTCLS_H +#if __GNUC__ >=3 +#pragma GCC system_header +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* This header is total bull**** */ + +#include + +#define PORTCLASSAPI extern + +PORTCLASSAPI NTSTATUS STDCALL +PcAddAdapterDevice( + ULONG DriverObject, + ULONG PhysicalDeviceObject, + ULONG StartDevice, + ULONG MaxObjects, + ULONG DeviceExtensionSize +); + +PORTCLASSAPI NTSTATUS STDCALL +PcAddContentHandlers( + ULONG ContentId, + ULONG paHandlers, + ULONG NumHandlers +); + +PORTCLASSAPI NTSTATUS STDCALL +PcCompleteIrp( + ULONG DeviceObject, + ULONG Irp, + ULONG Status +); + +PORTCLASSAPI NTSTATUS STDCALL +PcCompletePendingPropertyRequest( + ULONG PropertyRequest, + ULONG NtStatus +); + +PORTCLASSAPI NTSTATUS STDCALL +PcCreateContentMixed( + ULONG paContentId, + ULONG cContentId, + ULONG pMixedContentId +); + +PORTCLASSAPI NTSTATUS STDCALL +PcDestroyContent( + ULONG ContentId +); + +PORTCLASSAPI NTSTATUS STDCALL +PcDispatchIrp( + ULONG DeviceObject, + ULONG Irp +); + +PORTCLASSAPI NTSTATUS STDCALL +PcForwardContentToDeviceObject( + ULONG ContentId, + ULONG Reserved, + ULONG DrmForward +); + +PORTCLASSAPI NTSTATUS STDCALL +PcForwardContentToFileObject( + ULONG ContentId, + ULONG FileObject +); + +PORTCLASSAPI NTSTATUS STDCALL +PcForwardContentToInterface( + ULONG ContentId, + ULONG Unknown, + ULONG NumMethods +); + +PORTCLASSAPI NTSTATUS STDCALL +PcForwardIrpSynchronous( + ULONG DeviceObject, + ULONG Irp +); + +PORTCLASSAPI NTSTATUS STDCALL +PcGetContentRights( + ULONG ContentId, + ULONG DrmRights +); + +PORTCLASSAPI NTSTATUS STDCALL +PcGetDeviceProperty( + ULONG DeviceObject, + ULONG DeviceProperty, + ULONG BufferLength, + ULONG PropertyBuffer, + ULONG ResultLength +); + +PORTCLASSAPI ULONGLONG STDCALL +PcGetTimeInterval( + ULONGLONG Timei +); + +PORTCLASSAPI NTSTATUS STDCALL +PcInitializeAdapterDriver( + ULONG DriverObject, + ULONG RegistryPathName, + ULONG AddDevice +); + +PORTCLASSAPI NTSTATUS STDCALL +PcNewDmaChannel( + ULONG OutDmaChannel, + ULONG Unknown, + ULONG PoolType, + ULONG DeviceDescription, + ULONG DeviceObject +); + +PORTCLASSAPI NTSTATUS STDCALL +PcNewInterruptSync( + ULONG OutInterruptSync, + ULONG Unknown, + ULONG ResourceList, + ULONG ResourceIndex, + ULONG Mode +); + +PORTCLASSAPI NTSTATUS STDCALL +PcNewMiniport( + ULONG OutMiniport, + ULONG ClassId +); + +PORTCLASSAPI NTSTATUS STDCALL +PcNewPort( + ULONG OutPort, + ULONG ClassId +); + +PORTCLASSAPI NTSTATUS STDCALL +PcNewRegistryKey( + ULONG OutRegistryKey, + ULONG Unknown, + ULONG RegistryKeyType, + ULONG DesiredAccess, + ULONG DeviceObject, + ULONG SubDevice, + ULONG ObjectAttributes, + ULONG CreateOptions, + ULONG Disposition +); + +PORTCLASSAPI NTSTATUS STDCALL +PcNewResourceList( + ULONG OutResourceList, + ULONG Unknown, + ULONG PoolType, + ULONG TranslatedResources, + ULONG UntranslatedResources +); + +PORTCLASSAPI NTSTATUS STDCALL +PcNewResourceSublist( + ULONG OutResourceList, + ULONG Unknown, + ULONG PoolType, + ULONG ParentList, + ULONG MaximumEntries +); + +PORTCLASSAPI NTSTATUS STDCALL +PcNewServiceGroup( + ULONG OutServiceGroup, + ULONG Unknown +); + +PORTCLASSAPI NTSTATUS STDCALL +PcRegisterAdapterPowerManagement( + ULONG Unknown, + ULONG pvContext +); + +PORTCLASSAPI NTSTATUS STDCALL +PcRegisterIoTimeout( + ULONG pDeviceObject, + ULONG pTimerRoutine, + ULONG pContext +); + +PORTCLASSAPI NTSTATUS STDCALL +PcRegisterPhysicalConnection( + ULONG DeviceObject, + ULONG FromUnknown, + ULONG FromPin, + ULONG ToUnknown, + ULONG ToPin +); + +PORTCLASSAPI NTSTATUS STDCALL +PcRegisterPhysicalConnectionFromExternal( + ULONG DeviceObject, + ULONG FromString, + ULONG FromPin, + ULONG ToUnknown, + ULONG ToPin +); + +PORTCLASSAPI NTSTATUS STDCALL +PcRegisterPhysicalConnectionToExternal( + ULONG DeviceObject, + ULONG FromUnknown, + ULONG FromPin, + ULONG ToString, + ULONG ToPin +); + +PORTCLASSAPI NTSTATUS STDCALL +PcRegisterSubdevice( + ULONG DeviceObject, + ULONG SubdevName, + ULONG Unknown +); + +PORTCLASSAPI NTSTATUS STDCALL +PcRequestNewPowerState( + ULONG pDeviceObject, + ULONG RequestedNewState +); + +PORTCLASSAPI NTSTATUS STDCALL +PcUnregisterIoTimeout( + ULONG pDeviceObject, + ULONG pTimerRoutine, + ULONG pContext +); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/reactos/drivers/multimedia/portcls/portcls.rbuild b/reactos/drivers/multimedia/portcls/portcls.rbuild new file mode 100644 index 00000000000..a197d397814 --- /dev/null +++ b/reactos/drivers/multimedia/portcls/portcls.rbuild @@ -0,0 +1,8 @@ + + + + ntoskrnl + hal + portcls.c + portcls.rc + diff --git a/reactos/drivers/multimedia/portcls/portcls.rc b/reactos/drivers/multimedia/portcls/portcls.rc new file mode 100644 index 00000000000..03edd6d1341 --- /dev/null +++ b/reactos/drivers/multimedia/portcls/portcls.rc @@ -0,0 +1,5 @@ +#define REACTOS_VERSION_DLL +#define REACTOS_STR_FILE_DESCRIPTION "PORTCLS Port Class Driver API\0" +#define REACTOS_STR_INTERNAL_NAME "portcls\0" +#define REACTOS_STR_ORIGINAL_FILENAME "portcls.sys\0" +#include diff --git a/reactos/drivers/multimedia/wdmaud/entry.c b/reactos/drivers/multimedia/wdmaud/entry.c new file mode 100755 index 00000000000..c1956e86ad4 --- /dev/null +++ b/reactos/drivers/multimedia/wdmaud/entry.c @@ -0,0 +1,59 @@ +/* + This doesn't do much yet... +*/ + +#include + +#define InPassiveIrql() \ + (KeGetCurrentIrql() == IRQL_PASSIVE_LEVEL) + + +NTSTATUS AudioDeviceControl( + IN PDEVICE_OBJECT device, + IN PIRP irp +) +{ + return STATUS_SUCCESS; +} + + +NTSTATUS AudioAddDevice( + IN PDRIVER_OBJECT driver, + IN PDEVICE_OBJECT device +) +{ + DPRINT("AudioAddDevice called\n"); + + if ( ! IsPassiveIrql() ) + { + /* What do we do?! */ + /* RtlAssert("FAIL", __FILE__, __LINE__, "?" */ + } + + return STATUS_SUCCESS; +} + +VOID AudioUnload( + IN PDRIVER_OBJECT driver +) +{ + DPRINT("AudioUnload called\n"); +} + + + +NTSTATUS STDCALL +DriverEntry( + IN PDRIVER_OBJECT driver, + IN PUNICODE_STRING registry_path +) +{ + DPRINT("Wdmaud.sys loaded\n"); + + driver->DriverExtension->AddDevice = AudioAddDevice; + driver->DriverUnload = AudioUnload; + + driver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = AudioDeviceControl; + + return STATUS_SUCCESS; +} diff --git a/reactos/drivers/multimedia/wdmaud/wdmaud.rbuild b/reactos/drivers/multimedia/wdmaud/wdmaud.rbuild new file mode 100755 index 00000000000..a421f9a5832 --- /dev/null +++ b/reactos/drivers/multimedia/wdmaud/wdmaud.rbuild @@ -0,0 +1,7 @@ + + . + .. + + ntoskrnl + entry.c +