2 * PROJECT: ReactOS Sound System
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/sndblst/sndblst.c
6 * PURPOSE: Sound Blaster MME User-Mode Driver
8 * PROGRAMMERS: Andrew Greenwood (silverblade@reactos.org)
10 * NOTES: Currently very experimental and being used as a guinea-pig for
11 * changes to the MME-Buddy libraries.
12 * TODO: Adhere to maximum device name length!
23 PWSTR SBWaveOutDeviceName
= L
"ROS Sound Blaster Out";
24 PWSTR SBWaveInDeviceName
= L
"ROS Sound Blaster In";
28 GetSoundBlasterDeviceCapabilities(
29 IN PSOUND_DEVICE SoundDevice
,
30 OUT PVOID Capabilities
,
31 IN DWORD CapabilitiesSize
)
34 MMDEVICE_TYPE DeviceType
;
36 SND_ASSERT( SoundDevice
);
37 SND_ASSERT( Capabilities
);
39 SND_TRACE(L
"Sndblst - GetSoundBlasterDeviceCapabilities\n");
41 Result
= GetSoundDeviceType(SoundDevice
, &DeviceType
);
42 SND_ASSERT( Result
== MMSYSERR_NOERROR
);
44 /* Use the default method of obtaining device capabilities */
45 Result
= GetNt4SoundDeviceCapabilities(SoundDevice
,
49 if ( ! MMSUCCESS(Result
) )
52 /* Inject the appropriate device name */
55 case WAVE_OUT_DEVICE_TYPE
:
57 LPWAVEOUTCAPS WaveOutCaps
= (LPWAVEOUTCAPS
) Capabilities
;
58 CopyWideString(WaveOutCaps
->szPname
, SBWaveOutDeviceName
);
61 case WAVE_IN_DEVICE_TYPE
:
63 LPWAVEINCAPS WaveInCaps
= (LPWAVEINCAPS
) Capabilities
;
64 CopyWideString(WaveInCaps
->szPname
, SBWaveInDeviceName
);
69 return MMSYSERR_NOERROR
;
77 PSOUND_DEVICE SoundDevice
= NULL
;
78 MMFUNCTION_TABLE FuncTable
;
81 SND_TRACE(L
"(Callback) Found device: %wS\n", DevicePath
);
83 PathCopy
= AllocateWideString(wcslen(DevicePath
));
88 CopyWideString(PathCopy
, DevicePath
);
90 Result
= ListSoundDevice(DeviceType
, (PVOID
) PathCopy
, &SoundDevice
);
92 if ( ! MMSUCCESS(Result
) )
95 /* Set up our function table */
96 FuncTable
.GetCapabilities
= GetSoundBlasterDeviceCapabilities
;
97 FuncTable
.QueryWaveFormatSupport
= QueryNt4WaveDeviceFormatSupport
;
98 FuncTable
.SetWaveFormat
= SetNt4WaveDeviceFormat
;
99 FuncTable
.Open
= OpenNt4SoundDevice
;
100 FuncTable
.Close
= CloseNt4SoundDevice
;
101 FuncTable
.CommitWaveBuffer
= WriteFileEx_Committer
;
102 //FuncTable.SubmitWaveHeaderToDevice = SubmitWaveHeaderToDevice;
104 SetSoundDeviceFunctionTable(SoundDevice
, &FuncTable
);
123 SND_TRACE(L
"DRV_LOAD\n");
125 Result
= InitEntrypointMutexes();
127 if ( ! MMSUCCESS(Result
) )
130 Result
= EnumerateNt4ServiceSoundDevices(L
"sndblst",
134 if ( ! MMSUCCESS(Result
) )
136 CleanupEntrypointMutexes();
138 UnlistAllSoundDevices();
145 GetSoundDevice(WAVE_OUT_DEVICE_TYPE, 0, &snd);
146 GetSoundDevice(AUX_DEVICE_TYPE, 0, &snd);
147 GetSoundDevice(AUX_DEVICE_TYPE, 1, &snd);
148 GetSoundDevice(AUX_DEVICE_TYPE, 2, &snd);
151 SND_TRACE(L
"Initialisation complete\n");
158 SND_TRACE(L
"DRV_FREE\n");
160 /* TODO: Clean up the path names! */
161 UnlistAllSoundDevices();
163 CleanupEntrypointMutexes();
165 SND_TRACE(L
"Unfreed memory blocks: %d\n",
166 GetMemoryAllocationCount());
174 SND_TRACE(L
"DRV_ENABLE / DRV_DISABLE\n");
181 SND_TRACE(L
"DRV_OPEN / DRV_CLOSE\n");
185 case DRV_QUERYCONFIGURE
:
187 SND_TRACE(L
"DRV_QUERYCONFIGURE");
194 SND_TRACE(L
"Unhandled message %d\n", Message
);
195 return DefDriverProc(DriverId
,
210 case DLL_PROCESS_ATTACH
:
211 SND_TRACE(L
"DLL_PROCESS_ATTACH\n");
213 case DLL_PROCESS_DETACH
:
214 SND_TRACE(L
"DLL_PROCESS_DETACH\n");
216 case DLL_THREAD_ATTACH
:
217 SND_TRACE(L
"DLL_THREAD_ATTACH\n");
219 case DLL_THREAD_DETACH
:
220 SND_TRACE(L
"DLL_THREAD_DETACH\n");