2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: mkernel/modules/sound/sound.c
5 * PURPOSE: SoundBlaster 16 Driver
6 * PROGRAMMER: Snatched from David Welch (welch@mcmail.com)
7 * Modified for Soundblaster by Robert Bergkvist (fragdance@hotmail.com)
13 /* FUNCTIONS **************************************************************/
27 sb_status
sb16_getenvironment(void);
30 static NTSTATUS STDCALL
Dispatch(PDEVICE_OBJECT DeviceObject
, PIRP Irp
)
32 * FUNCTION: Handles user mode requests
34 * DeviceObject = Device for request
35 * Irp = I/O request packet describing request
36 * RETURNS: Success or failure
39 PIO_STACK_LOCATION Stack
= IoGetCurrentIrpStackLocation(Irp
);
42 switch (Stack
->MajorFunction
)
45 DPRINT1("(SoundBlaster 16 Driver WaveOut) Creating\n");
47 status
= STATUS_SUCCESS
;
51 status
= STATUS_SUCCESS
;
55 DPRINT1("(SoundBlaster 16 Driver) Writing %d bytes\n",Stack
->Parameters
.Write
.Length
);
56 sb16_play((WAVE_HDR
*)Irp
->UserBuffer
);
57 status
= STATUS_SUCCESS
;
61 status
= STATUS_NOT_IMPLEMENTED
;
65 Irp
->IoStatus
.Status
= status
;
66 Irp
->IoStatus
.Information
= 0;
68 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
72 NTSTATUS
ModuleEntry(PDRIVER_OBJECT DriverObject
, PUNICODE_STRING RegistryPath
)
74 * FUNCTION: Called by the system to initalize the driver
76 * DriverObject = object describing this driver
77 * RegistryPath = path to our configuration entries
78 * RETURNS: Success or failure
82 PDEVICE_OBJECT DeviceObject
;
85 DPRINT1("SoundBlaster 16 Driver 0.0.1\n");
86 if(sb16_getenvironment()!=SB_TRUE
)
88 DPRINT1("Soundblaster 16 not found\n");
91 ret
= IoCreateDevice(DriverObject
,0,L
"\\Device\\WaveOut",FILE_DEVICE_WAVE_OUT
,0,FALSE
,&DeviceObject
);
92 if (ret
!=STATUS_SUCCESS
)
95 DeviceObject
->Flags
=0;
96 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = Dispatch
;
97 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] =Dispatch
;
98 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = Dispatch
;
99 DriverObject
->MajorFunction
[IRP_MJ_WRITE
] = Dispatch
;
100 DriverObject
->DriverUnload
= NULL
;
102 return(STATUS_SUCCESS
);
106 sb_status
sb16_getenvironment(void)
108 if(detect_dsp(&sb16
)!=SB_TRUE
)
110 DPRINT1("Detect DSP failed!!!\n");
113 DPRINT1("DSP base address 0x%x\n",sb16
.base
);
115 DPRINT1("IRQ: %d\n",sb16
.irq
);
117 DPRINT1("DMA8: 0x%x DMA16: 0x%x\n",sb16
.dma8
,sb16
.dma16
);