1 /*
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)
8 * UPDATE HISTORY:
9 * ??/??/??: Created
10 *
11 */
12
13 /* FUNCTIONS **************************************************************/
14
15 #include <ntddk.h>
16 #include <string.h>
17 #include <devices.h>
18 #include "sb16.h"
19 #include "dsp.h"
20 #include "mixer.h"
21 #include "wave.h"
22
23 #define NDEBUG
24 #include <debug.h>
25
26 SB16 sb16;
27 sb_status sb16_getenvironment(void);
28
29 #if 0
30 static NTSTATUS NTAPI Dispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
31 /*
32 * FUNCTION: Handles user mode requests
33 * ARGUMENTS:
34 * DeviceObject = Device for request
35 * Irp = I/O request packet describing request
36 * RETURNS: Success or failure
37 */
38 {
39 PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
40 NTSTATUS status;
41
42 switch (Stack->MajorFunction)
43 {
44 case IRP_MJ_CREATE:
45 DPRINT1("(SoundBlaster 16 Driver WaveOut) Creating\n");
46 reset_dsp(sb16.base);
47 status = STATUS_SUCCESS;
48 break;
49
50 case IRP_MJ_CLOSE:
51 status = STATUS_SUCCESS;
52 break;
53
54 case IRP_MJ_WRITE:
55 DPRINT1("(SoundBlaster 16 Driver) Writing %d bytes\n",Stack->Parameters.Write.Length);
56 sb16_play((WAVE_HDR*)Irp->UserBuffer);
57 status = STATUS_SUCCESS;
58 break;
59
60 default:
61 status = STATUS_NOT_IMPLEMENTED;
62 break;
63 }
64
65 Irp->IoStatus.Status = status;
66 Irp->IoStatus.Information = 0;
67
68 IoCompleteRequest(Irp, IO_NO_INCREMENT);
69 return(status);
70 }
71
72 NTSTATUS ModuleEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
73 /*
74 * FUNCTION: Called by the system to initialize the driver
75 * ARGUMENTS:
76 * DriverObject = object describing this driver
77 * RegistryPath = path to our configuration entries
78 * RETURNS: Success or failure
79 */
80 {
81 #if 0
82 PDEVICE_OBJECT DeviceObject;
83 NTSTATUS ret;
84
85 DPRINT1("SoundBlaster 16 Driver 0.0.1\n");
86 if(sb16_getenvironment()!=SB_TRUE)
87 {
88 DPRINT1("Soundblaster 16 not found\n");
89 return 0;
90 }
91 ret = IoCreateDevice(DriverObject,0,L"\\Device\\WaveOut",FILE_DEVICE_WAVE_OUT,0,FALSE,&DeviceObject);
92 if (ret!=STATUS_SUCCESS)
93 return(ret);
94
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;
101 #endif
102 return(STATUS_SUCCESS);
103 }
104 #endif
105
sb16_getenvironment(void)106 sb_status sb16_getenvironment(void)
107 {
108 if(detect_dsp(&sb16)!=SB_TRUE)
109 {
110 DPRINT1("Detect DSP failed!!!\n");
111 return SB_FALSE;
112 }
113 DPRINT1("DSP base address 0x%x\n",sb16.base);
114 get_irq(&sb16);
115 DPRINT1("IRQ: %d\n",sb16.irq);
116 get_dma(&sb16);
117 DPRINT1("DMA8: 0x%x DMA16: 0x%x\n",sb16.dma8,sb16.dma16);
118 return SB_TRUE;
119 }
120
121