|
|
1.1 root 1: /*++ BUILD Version: 0001 // Increment this if a change has global effects
2:
3:
4: Copyright (c) 1992 Microsoft Corporation
5:
6: Module Name:
7:
8: devices.h
9:
10: Abstract:
11:
12: This include file defines constants and types for
13: sound devices
14:
15: Author:
16:
17: Robin Speed (RobinSp) 20-Oct-92
18:
19: Revision History:
20:
21: --*/
22:
23: //
24: // Device type flags used in the local info structure
25: //
26:
27: #define WAVE_IN 0x01 // Wave in device
28: #define WAVE_OUT 0x02 // Wave out device
29: #define MIDI_IN 0x03 // Midi in device
30: #define MIDI_OUT 0x04 // Midi out device
31: #define AUX_DEVICE 0x05 // aux device
32:
33: //
34: // Wave specific constants
35: //
36:
37: #define WAVE_DEFAULT_RATE 11025 // everyone should be able to do this
38: #define WAVE_DEFAULT_BITS_PER_SAMPLE 8 // ditto
39:
40: //
41: // Predeclare device info
42: //
43:
44: struct _LOCAL_DEVICE_INFO;
45:
46: //
47: // Device specific dispatch and volume setting routine definitions
48: //
49: typedef NTSTATUS SOUND_DISPATCH_ROUTINE(struct _LOCAL_DEVICE_INFO *, PIRP, PIO_STACK_LOCATION);
50: typedef VOID SOUND_HW_SET_VOLUME_ROUTINE(struct _LOCAL_DEVICE_INFO *);
51:
52: //
53: // Each device has a 'device exclusion' routine which is called in 4 places :
54: // 1. When the device is opened for write SoundExcludeOpen
55: // 2. When the device is closed for write SoundExcludeClose
56: // 3. When the device is entered while open for write SoundExcludeEnter
57: // 4. When a request is complete while open for write SoundExcludeLeave
58: //
59:
60: typedef enum {
61: SoundExcludeOpen,
62: SoundExcludeClose,
63: SoundExcludeEnter,
64: SoundExcludeLeave,
65: SoundExcludeQueryOpen
66: } SOUND_EXCLUDE_CODE;
67:
68: //
69: // Mutual exclusion - takes arguments :
70: //
71: // Local device info - device data
72: // Exclusion code - sound exclusion code
73: //
74: // This routine localises all the device mutual exclusion and copes
75: // with inter-device dependencies (eg if hardware is shared etc)
76: //
77: // SoundExcludeEnter - Serialises access to all device enter whether
78: // or not the device is open for write (use eg a mutant).
79: //
80: // Typically enters a mutex
81: //
82: // SoundExcludeLeave - Exit serialization.
83: //
84: // SoundExcludeOpen - Sets device in use - fails if called a second time.
85: // Allows driver to prevent mutually exclusive devices from
86: // being opened.
87: //
88: // Typically sets an 'in use' field
89: //
90: // SoundExcludeClose - Frees device
91: //
92: // SoundExcludeQueryOpen - test if open - mainly for ASSERTs
93: //
94:
95: typedef BOOLEAN SOUND_EXCLUDE_ROUTINE(struct _LOCAL_DEVICE_INFO *,
96: SOUND_EXCLUDE_CODE);
97:
98: //
99: // Device initializeation data
100: //
101:
102: typedef struct {
103: PWSTR LeftVolumeName, RightVolumeName; // Registry key value names
104: ULONG DefaultVolume; // What to use if no value in
105: // the registry
106: ULONG Type; // Device type for IoCreateDevice
107: ULONG DeviceType; // Internal type
108: char Key[4]; // Debugging key for header
109: PWSTR PrototypeName; // Name to use for device
110: // - eg L"WaveIn"
111: PIO_DPC_ROUTINE DeferredRoutine; // Dpc routine
112:
113: SOUND_EXCLUDE_ROUTINE *ExclusionRoutine;// Mutual exclusion
114: SOUND_DISPATCH_ROUTINE *DispatchRoutine;// Create, Cleanup, Read, Write,
115: // Ioctl
116: SOUND_DISPATCH_ROUTINE *DevCapsRoutine; // Device Caps
117: SOUND_HW_SET_VOLUME_ROUTINE *HwSetVolume; // Set device volume
118: ULONG IoMethod; // DO_DIRECT_IO etc
119: } SOUND_DEVICE_INIT, *PSOUND_DEVICE_INIT;
120:
121:
122: //
123: // driver local data structure specific to each device object
124: // sharead by both input and output devices
125: //
126:
127: typedef struct _LOCAL_DEVICE_INFO {
128:
129: // static items not requiring use of the spin lock
130:
131: ULONG Key;
132: #define LDI_WAVE_IN_KEY (*(ULONG *)"LDWi")
133: #define LDI_WAVE_OUT_KEY (*(ULONG *)"LDWo")
134: #define LDI_MIDI_IN_KEY (*(ULONG *)"LDMi")
135: #define LDI_MIDI_OUT_KEY (*(ULONG *)"LDMo")
136: #define LDI_AUX_KEY (*(ULONG *)"LDAx")
137:
138: PVOID pGlobalInfo; // pointer to the shared info
139: UCHAR DeviceType; // in or out
140: UCHAR DeviceNumber; // 0, 1, ...
141: UCHAR DeviceIndex;
142: UCHAR CreationFlags; // Various flags :
143: #define SOUND_CREATION_NO_NAME_RANGE ((UCHAR)0x01)
144: // Use name, don't append 0, 1...
145: #define SOUND_CREATION_NO_VOLUME ((UCHAR)0x02)
146: // Volume setting not supported
147:
148: BOOLEAN PreventVolumeSetting; // Allow shared volume setting
149:
150: WAVE_DD_VOLUME Volume; // Volume setting for this device
151: #ifdef VOLUME_NOTIFY
152: LIST_ENTRY VolumeQueue; // Queue of people waiting for
153: // IOCTL_SOUND_GET_CHANGED_VOLUME
154: // to complete.
155: #endif // VOLUME_NOTIFY
156: #ifdef MASTERVOLUME
157: BOOLEAN MasterVolume; // This is the master volume control
158: #endif // MASTERVOLUME
159: // simulated in software.
160: BOOLEAN VolumeChanged; // Volume setting has changed
161: PVOID DeviceSpecificData; // Data depending on device type
162: PVOID HwContext; // Hardware dependent data
163: //
164: // The state variable is protected by the mutant only - it
165: // should NOT be set in the Dpc routine. It is therefore
166: // essentially always valid
167: //
168: ULONG State; // STOPPED etc.
169: PSOUND_DEVICE_INIT
170: DeviceInit; // Point back to initialization data
171:
172:
173: } LOCAL_DEVICE_INFO, *PLOCAL_DEVICE_INFO;
174:
175:
176: SOUND_DISPATCH_ROUTINE
177: SoundAuxDispatch,
178: SoundMidiDispatch,
179: SoundWaveDispatch,
180: SoundIoctlGetPosition,
181: SoundWaveOutGetCaps,
182: SoundWaveInGetCaps,
183: SoundIoctlSetState,
184: SoundIoctlGetVolume,
185: SoundIoctlGetChangedVolume,
186: SoundIoctlSetVolume,
187: SoundIoctlSetDebugLevel;
188:
189:
190: VOID
191: SoundWaveDeferred(
192: PKDPC pDpc,
193: PDEVICE_OBJECT pDeviceObject,
194: PIRP pIrp,
195: PVOID Context
196: );
197:
198: VOID
199: SoundMidiInDeferred(
200: IN PKDPC pDpc,
201: IN PDEVICE_OBJECT pDeviceObject,
202: IN OUT PIRP pIrpDeferred,
203: IN OUT PVOID Context
204: );
205:
206: NTSTATUS
207: SoundDispatch(
208: IN PDEVICE_OBJECT pDO,
209: IN PIRP pIrp
210: );
211: NTSTATUS
212: SoundSetShareAccess(
213: IN OUT PLOCAL_DEVICE_INFO pLDI,
214: IN PIO_STACK_LOCATION IrpStack
215: );
216:
217: SOUND_HW_SET_VOLUME_ROUTINE SoundNoVolume;
218:
219: VOID
220: SoundSaveDeviceVolume(
221: PLOCAL_DEVICE_INFO pLDI,
222: PWSTR KeyName
223: );
224:
225:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.