ReactOS 0.4.15-dev-7961-gdcf9eb0
utils.c
Go to the documentation of this file.
1/*
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS Multimedia
5 * FILE: lib/mmdrv/utils.c
6 * PURPOSE: Multimedia User Mode Driver (utility functions)
7 * PROGRAMMER: Andrew Greenwood
8 * UPDATE HISTORY:
9 * Jan 30, 2004: Imported into ReactOS tree
10 */
11
12#include "mmdrv.h"
13
14#define NDEBUG
15#include <debug.h>
16
17typedef struct _DEVICE_LIST
18{
26
28
29
31{
32 switch(GetLastError())
33 {
34 case NO_ERROR :
35 case ERROR_IO_PENDING :
36 return MMSYSERR_NOERROR;
37
38 case ERROR_BUSY :
39 return MMSYSERR_ALLOCATED;
40
44
46 return MMSYSERR_NOMEM;
47
50
53
54 default :
55 return MMSYSERR_ERROR;
56 };
57}
58
59
60
62 DWORD Access)
63{
64 DPRINT("OpenDevice()\n");
66 *pDeviceHandle = INVALID_HANDLE_VALUE;
67
70
71 switch(DeviceType)
72 {
73 case WaveOutDevice :
74 wsprintf(DeviceName, L"\\\\.%ls%d", WAVE_OUT_DEVICE_NAME_U + strlen("\\Device"), ID);
75 break;
76 case WaveInDevice :
77 wsprintf(DeviceName, L"\\\\.%ls%d", WAVE_IN_DEVICE_NAME_U + strlen("\\Device"), ID);
78 break;
79 case MidiOutDevice :
80 wsprintf(DeviceName, L"\\\\.%ls%d", MIDI_OUT_DEVICE_NAME_U + strlen("\\Device"), ID);
81 break;
82 case MidiInDevice :
83 wsprintf(DeviceName, L"\\\\.%ls%d", MIDI_IN_DEVICE_NAME_U + strlen("\\Device"), ID);
84 break;
85 case AuxDevice :
86 wsprintf(DeviceName, L"\\\\.%ls%d", AUX_DEVICE_NAME_U + strlen("\\Device"), ID);
87 break;
88 default :
89 DPRINT("No Auido Device Found");
90 return MMSYSERR_BADDEVICEID; /* Maybe we should change error code */
91 };
92
93 DPRINT("Attempting to open %S\n", DeviceName);
94
95 *pDeviceHandle = CreateFile(DeviceName, Access, FILE_SHARE_WRITE, NULL,
97 NULL);
98
99 DPRINT("DeviceHandle == 0x%x\n", (int)*pDeviceHandle);
100
101 if (pDeviceHandle == INVALID_HANDLE_VALUE)
102 return TranslateStatus();
103
104 return MMSYSERR_NOERROR;
105}
106
107
108// DEVICE LIST MANAGEMENT
109
110
112 LPWSTR Name)
113{
114 PDEVICE_LIST pNewDevice;
115
116 DPRINT("AddDeviceToList()\n");
117
118 pNewDevice = (PDEVICE_LIST) HeapAlloc(Heap, 0,
119 sizeof(DEVICE_LIST) + lstrlen(Name) * sizeof(WCHAR));
120
121 if ( !pNewDevice )
122 {
124 return FALSE;
125 }
126
127 pNewDevice->DeviceType = DeviceType;
128 pNewDevice->CardIndex = CardIndex;
129 lstrcpy(pNewDevice->Name, Name);
130 pNewDevice->DeviceInstanceData = NULL;
131 pNewDevice->Next = *pList;
132 *pList = pNewDevice;
133
134 DPRINT("Success!\n");
135
136 return TRUE;
137}
138
139
141{
143
144 DPRINT("FreeDeviceList()\n");
145
146 while (DeviceList)
147 {
149 DeviceList = pDevice->Next;
150
151 if (pDevice->DeviceInstanceData)
152 HeapFree(Heap, 0, (LPVOID)pDevice->DeviceInstanceData);
153
154 HeapFree(Heap, 0, (LPSTR)pDevice);
155 }
156}
157
158
160{
161// DWORD Index;
162// HKEY DriverKey;
163
164 DPRINT("Finding devices\n");
165
166// DriverKey = OpenParametersKey();
167// see drvutil.c of MS DDK for how this SHOULD be done...
168
169
170 SHORT i;
171 HANDLE h;
173
175 {
176 wsprintf(DeviceName, L"WaveOut%d\0", i);
177 CloseHandle(h);
179 }
180
182 {
183 wsprintf(DeviceName, L"WaveIn%d\0", i);
184 CloseHandle(h);
186 }
187
189 {
190 wsprintf(DeviceName, L"MidiOut%d\0", i);
191 CloseHandle(h);
193 }
194
196 {
197 wsprintf(DeviceName, L"MidiIn%d\0", i);
198 CloseHandle(h);
200 }
201
203 {
204 wsprintf(DeviceName, L"Aux%d\0", i);
205 CloseHandle(h);
207 }
208
209
210 // MIDI Out 0: MPU-401 UART
211 // AddDeviceToList(&DeviceList, MidiOutDevice, 0, L"MidiOut0");
212 // Wave Out 0: Sound Blaster 16 (ok?)
213 // AddDeviceToList(&DeviceList, WaveOutDevice, 0, L"WaveOut0");
214
215 return MMSYSERR_NOERROR; // ok?
216}
217
218
219
221{
222 int i;
224
225 for (List = DeviceList, i = 0; List != NULL; List = List->Next)
226 if (List->DeviceType == DeviceType)
227 i ++;
228
229 return i;
230}
ACPI_SIZE strlen(const char *String)
Definition: utclib.c:269
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define NO_ERROR
Definition: dderror.h:5
#define ERROR_INSUFFICIENT_BUFFER
Definition: dderror.h:10
#define ERROR_BUSY
Definition: dderror.h:12
#define ERROR_IO_PENDING
Definition: dderror.h:15
#define ERROR_INVALID_FUNCTION
Definition: dderror.h:6
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define CloseHandle
Definition: compat.h:739
#define OPEN_EXISTING
Definition: compat.h:775
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define HeapAlloc
Definition: compat.h:733
#define GENERIC_READ
Definition: compat.h:135
#define ERROR_NOT_SUPPORTED
Definition: compat.h:100
#define HeapFree(x, y, z)
Definition: compat.h:735
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
MMRESULT FindDevices()
Definition: utils.c:159
DWORD GetDeviceCount(UINT DeviceType)
Definition: utils.c:220
PDEVICE_LIST DeviceList
Definition: utils.c:27
struct _DEVICE_LIST * PDEVICE_LIST
DWORD TranslateStatus(void)
Definition: utils.c:30
MMRESULT OpenDevice(UINT DeviceType, DWORD ID, PHANDLE pDeviceHandle, DWORD Access)
Definition: utils.c:61
struct _DEVICE_LIST DEVICE_LIST
VOID FreeDeviceList()
Definition: utils.c:140
BOOL AddDeviceToList(PDEVICE_LIST *pList, DWORD DeviceType, DWORD CardIndex, LPWSTR Name)
Definition: utils.c:111
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxChildList * pList
FxDevice * pDevice
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:7723
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define WAVE_OUT_DEVICE_NAME_U
Definition: mmdef.h:32
#define MIDI_OUT_DEVICE_NAME_U
Definition: mmdef.h:37
#define SOUND_MAX_DEVICES
Definition: mmdef.h:23
#define SOUND_MAX_DEVICE_NAME
Definition: mmdef.h:22
#define MIDI_IN_DEVICE_NAME_U
Definition: mmdef.h:35
#define WAVE_IN_DEVICE_NAME_U
Definition: mmdef.h:30
#define AUX_DEVICE_NAME_U
Definition: mmdef.h:40
DeviceType
Definition: mmdrv.h:42
@ MidiOutDevice
Definition: mmdrv.h:45
@ MidiInDevice
Definition: mmdrv.h:46
@ WaveInDevice
Definition: mmdrv.h:44
@ AuxDevice
Definition: mmdrv.h:47
@ WaveOutDevice
Definition: mmdrv.h:43
#define MMSYSERR_NOMEM
Definition: mmsystem.h:103
UINT MMRESULT
Definition: mmsystem.h:962
#define MMSYSERR_NOTSUPPORTED
Definition: mmsystem.h:104
#define MMSYSERR_INVALPARAM
Definition: mmsystem.h:107
#define MMSYSERR_NOERROR
Definition: mmsystem.h:96
#define MMSYSERR_ALLOCATED
Definition: mmsystem.h:100
#define MMSYSERR_ERROR
Definition: mmsystem.h:97
#define MMSYSERR_BADDEVICEID
Definition: mmsystem.h:98
#define FILE_FLAG_OVERLAPPED
Definition: disk.h:46
unsigned int UINT
Definition: ndis.h:50
#define FILE_SHARE_WRITE
Definition: nt_native.h:681
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
#define L(x)
Definition: ntvdm.h:50
short SHORT
Definition: pedump.c:59
#define ID
Definition: ruserpass.c:36
#define DPRINT
Definition: sndvol32.h:71
ULONG CardIndex
Definition: utils.c:21
PVOID DeviceInstanceData
Definition: utils.c:22
struct _DEVICE_LIST * Next
Definition: utils.c:19
ULONG DeviceInstanceDataSize
Definition: utils.c:23
DWORD DeviceType
Definition: utils.c:20
WCHAR Name[1]
Definition: utils.c:24
uint32_t ULONG
Definition: typedefs.h:59
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3275
_Must_inspect_result_ _In_ WDFCMRESLIST List
Definition: wdfresource.h:550
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define lstrcpy
Definition: winbase.h:3874
#define lstrlen
Definition: winbase.h:3876
#define CreateFile
Definition: winbase.h:3749
#define wsprintf
Definition: winuser.h:5865
char * LPSTR
Definition: xmlstorage.h:182
__wchar_t WCHAR
Definition: xmlstorage.h:180
WCHAR * LPWSTR
Definition: xmlstorage.h:184