2006-12-10 05:43:49 +00:00
|
|
|
/*
|
|
|
|
* 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 <ntddk.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <devices.h>
|
|
|
|
#include "sb16.h"
|
|
|
|
#include "dsp.h"
|
|
|
|
#include "mixer.h"
|
|
|
|
#include "wave.h"
|
|
|
|
|
|
|
|
#define NDEBUG
|
|
|
|
#include <debug.h>
|
|
|
|
|
|
|
|
SB16 sb16;
|
|
|
|
sb_status sb16_getenvironment(void);
|
|
|
|
|
|
|
|
#if 0
|
2008-11-30 11:16:55 +00:00
|
|
|
static NTSTATUS NTAPI Dispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
|
2006-12-10 05:43:49 +00:00
|
|
|
/*
|
|
|
|
* 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;
|
|
|
|
}
|
|
|
|
|