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