- get sndblst and sound compiling on msvc.
[reactos.git] / reactos / drivers / dd / sndblst / sndblst.h
1 /*
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: drivers/dd/sndblst/sndblst.h
6 * PURPOSE: Sound Blaster driver header
7 * PROGRAMMER: Andrew Greenwood
8 * UPDATE HISTORY:
9 * Sept 28, 2003: Created
10 */
11
12 #ifndef __INCLUDES_SNDBLST_H__
13 #define __INCLUDES_SNDBLST_H__
14
15 #include <ntddk.h>
16
17 #define NDEBUG
18 #include <debug.h>
19
20 #define DEFAULT_PORT 0x220
21 #define DEFAULT_IRQ 5
22 #define DEFAULT_DMA 1
23 #define DEFAULT_BUFSIZE 0x4000
24 #define DEFAULT_SAMPLERATE 11025
25 #define DEFAULT_BITDEPTH 8
26 #define DEFAULT_CHANNELS 1
27
28 #define VALID_IRQS {5}
29
30 #define MIN_BUFSIZE 0x1000
31 #define MAX_BUFSIZE 0x4000
32
33 #define DEVICE_SUBKEY L"Devices"
34 #define PARMS_SUBKEY L"Parameters"
35
36 #define REGISTRY_PORT L"Port"
37
38 // At the moment, we just support a single device with fixed parameters:
39 #define SB_PORT DEFAULT_PORT
40 #define SB_IRQ DEFAULT_IRQ
41 #define SB_DMA DEFAULT_DMA
42 #define SB_BUFSIZE DEFAULT_BUFSIZE
43
44 #define SB_TIMEOUT 1000000
45
46 #define IOCTL_SOUND_BASE FILE_DEVICE_SOUND
47 #define IOCTL_WAVE_BASE 0x0000 // CORRECT?
48
49 /* #define IOCTL_MIDI_PLAY CTL_CODE(IOCTL_SOUND_BASE, IOCTL_MIDI_BASE + 0x0006, \
50 * METHOD_BUFFERED, FILE_WRITE_ACCESS)
51 */
52
53 // Some constants
54
55 #define SB_DSP_READY 0xaa
56
57 // Commands (only the ones we use)
58
59 #define SB_SET_OUTPUT_RATE 0x41 // DSP v4.xx only
60 #define SB_SET_INPUT_RATE 0x42 // DSP v4.xx only
61 #define SB_SET_BLOCK_SIZE 0x48 // DSP v2.00 +
62 #define SB_ENABLE_SPEAKER 0xd1
63 #define SB_DISABLE_SPEAKER 0xd3
64 #define SB_GET_SPEAKER_STATUS 0xd8 // DSP v2.00 +
65 #define SB_GET_DSP_VERSION 0xe1
66
67
68 // Hmm... These are a weenie bit trickier than MPU401...
69
70 #define SB_WRITE_RESET(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0x6, x)
71 #define SB_READ_DATA(bp) READ_PORT_UCHAR((PUCHAR) bp+0xa)
72 #define SB_WRITE_DATA(bp, x) WRITE_PORT_UCHAR((PUCHAR) bp+0xc, x)
73 #define SB_READ_WRITESTATUS(bp) READ_PORT_UCHAR((PUCHAR) bp+0xc)
74 #define SB_READ_READSTATUS(bp) READ_PORT_UCHAR((PUCHAR) bp+0xe)
75
76 // Flow control
77
78 #define SB_READY_TO_SEND(bp) \
79 SB_READ_WRITESTATUS(bp) & 0x80
80
81 #define SB_READY_TO_RECEIVE(bp) \
82 SB_READ_READSTATUS(bp) & 0x80
83
84
85 #define SB_WRITE_BYTE(bp, x) \
86 if (WaitToSend(bp)) SB_WRITE_DATA(bp, x)
87
88 //#define MPU401_READ(bp)
89 // if (WaitToRead(bp)) ... ???
90
91 /*
92 DEVICE_EXTENSION contains the settings for each individual device
93 */
94
95 typedef struct _DEVICE_EXTENSION
96 {
97 PWSTR RegistryPath;
98 PDRIVER_OBJECT DriverObject;
99 ULONG Port;
100 ULONG IRQ;
101 ULONG DMA;
102 ULONG BufferSize;
103 PADAPTER_OBJECT Adapter;
104 PMDL Mdl;
105 PCHAR VirtualBuffer;
106 PHYSICAL_ADDRESS Buffer;
107 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
108
109 /*
110 DEVICE_INSTANCE contains ???
111 */
112
113 typedef struct _DEVICE_INSTANCE
114 {
115 // pPrevGDI
116 PDRIVER_OBJECT DriverObject;
117 } DEVICE_INSTANCE, *PDEVICE_INSTANCE;
118
119 /*
120 CONFIG contains device parameters (port/IRQ)
121 THIS STRUCTURE IS REDUNDANT
122 */
123
124 //typedef struct _CONFIG
125 //{
126 // ULONG Port;
127 // ULONG IRQ;
128 //} CONFIG, *PCONFIG;
129
130 /*
131 Some callback typedefs
132 */
133
134 typedef NTSTATUS REGISTRY_CALLBACK_ROUTINE(PWSTR RegistryPath, PVOID Context);
135 typedef REGISTRY_CALLBACK_ROUTINE *PREGISTRY_CALLBACK_ROUTINE;
136
137
138 /*
139 Prototypes for functions in portio.c :
140 */
141
142 BOOLEAN WaitToSend(ULONG BasePort);
143 BOOLEAN WaitToReceive(ULONG BasePort);
144 USHORT InitSoundCard(ULONG BasePort);
145
146 /*
147 Prototypes for functions in settings.c :
148 */
149
150 NTSTATUS STDCALL EnumDeviceKeys(
151 IN PUNICODE_STRING RegistryPath,
152 IN PWSTR SubKey,
153 IN PREGISTRY_CALLBACK_ROUTINE Callback,
154 IN PVOID Context);
155
156 NTSTATUS STDCALL LoadSettings(
157 IN PWSTR ValueName,
158 IN ULONG ValueType,
159 IN PVOID ValueData,
160 IN ULONG ValueLength,
161 IN PVOID Context,
162 IN PVOID EntryContext);
163
164
165
166
167 BOOLEAN CreateDMA(PDEVICE_OBJECT DeviceObject);
168
169
170
171 VOID SetOutputSampleRate(ULONG BasePort, ULONG SampleRate);
172 VOID EnableSpeaker(ULONG BasePort, BOOLEAN SpeakerOn);
173 BOOLEAN IsSpeakerEnabled(ULONG BasePort);
174 VOID BeginPlayback(ULONG BasePort, ULONG BitDepth, ULONG Channels, ULONG BlockSize);
175
176 #endif