d85dfdaa4b97a3c5227c2e70dfe0b186cdeeb56e
[reactos.git] / reactos / drivers / dd / sound / sound.c
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 <ddk/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 NTSTATUS STDCALL Dispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp)
30 /*
31 * FUNCTION: Handles user mode requests
32 * ARGUMENTS:
33 * DeviceObject = Device for request
34 * Irp = I/O request packet describing request
35 * RETURNS: Success or failure
36 */
37 {
38 PIO_STACK_LOCATION Stack = IoGetCurrentIrpStackLocation(Irp);
39 NTSTATUS status;
40
41 switch (Stack->MajorFunction)
42 {
43 case IRP_MJ_CREATE:
44 DPRINT1("(SoundBlaster 16 Driver WaveOut) Creating\n");
45 reset_dsp(sb16.base);
46 status = STATUS_SUCCESS;
47 break;
48
49 case IRP_MJ_CLOSE:
50 status = STATUS_SUCCESS;
51 break;
52
53 case IRP_MJ_WRITE:
54 DPRINT1("(SoundBlaster 16 Driver) Writing %d bytes\n",Stack->Parameters.Write.Length);
55 sb16_play((WAVE_HDR*)Irp->UserBuffer);
56 status = STATUS_SUCCESS;
57 break;
58
59 default:
60 status = STATUS_NOT_IMPLEMENTED;
61 break;
62 }
63
64 Irp->IoStatus.Status = status;
65 Irp->IoStatus.Information = 0;
66
67 IoCompleteRequest(Irp, IO_NO_INCREMENT);
68 return(status);
69 }
70
71 NTSTATUS ModuleEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
72 /*
73 * FUNCTION: Called by the system to initalize the driver
74 * ARGUMENTS:
75 * DriverObject = object describing this driver
76 * RegistryPath = path to our configuration entries
77 * RETURNS: Success or failure
78 */
79 {
80 #if 0
81 PDEVICE_OBJECT DeviceObject;
82 NTSTATUS ret;
83
84 DPRINT1("SoundBlaster 16 Driver 0.0.1\n");
85 if(sb16_getenvironment()!=SB_TRUE)
86 {
87 DPRINT1("Soundblaster 16 not found\n");
88 return 0;
89 }
90 ret = IoCreateDevice(DriverObject,0,L"\\Device\\WaveOut",FILE_DEVICE_WAVE_OUT,0,FALSE,&DeviceObject);
91 if (ret!=STATUS_SUCCESS)
92 return(ret);
93
94 DeviceObject->Flags=0;
95 DriverObject->MajorFunction[IRP_MJ_CLOSE] = Dispatch;
96 DriverObject->MajorFunction[IRP_MJ_CREATE] =Dispatch;
97 DriverObject->MajorFunction[IRP_MJ_WRITE] = Dispatch;
98 DriverObject->MajorFunction[IRP_MJ_WRITE] = Dispatch;
99 DriverObject->DriverUnload = NULL;
100 #endif
101 return(STATUS_SUCCESS);
102 }
103
104 sb_status sb16_getenvironment(void)
105 {
106 if(detect_dsp(&sb16)!=SB_TRUE)
107 {
108 DPRINT1("Detect DSP failed!!!\n");
109 return SB_FALSE;
110 }
111 DPRINT1("DSP base address 0x%x\n",sb16.base);
112 get_irq(&sb16);
113 DPRINT1("IRQ: %d\n",sb16.irq);
114 get_dma(&sb16);
115 DPRINT1("DMA8: 0x%x DMA16: 0x%x\n",sb16.dma8,sb16.dma16);
116 return SB_TRUE;
117 }
118