11#include <Windows.h>
2- #include <stdio.h>
3- #include <Winuser.h>
42
53#define KDMAPI_UDID 0 // KDMAPI default uDeviceID
64#define KDMAPI_NOTLOADED 0 // KDMAPI is not loaded
2725static DWORD DrvMajor = 0 , DrvMinor = 0 , DrvBuild = 0 , DrvRevision = 0 ;
2826
2927// OM funcs
28+ static HMODULE OM = NULL ;
3029static BOOL IsCallbackWindow = FALSE; // WMMC
3130static HMIDIOUT OMDummy = 0x10001 ; // Dummy pointer, used for KDMAPI Output
32- static void (WINAPI * SCE )(DWORD eventtype , DWORD chan , DWORD param ) = 0 ; // SendCustomEvent
33- static MMRESULT (WINAPI * SDD )(DWORD msg ) = 0 ; // SendDirectData
34- static MMRESULT (WINAPI * SDLD )(MIDIHDR * IIMidiHdr ) = 0 ; // SendDirectLongData
35- static MMRESULT (WINAPI * mM )(UINT uDeviceID , UINT uMsg , DWORD_PTR dwUser , DWORD_PTR dwParam1 , DWORD_PTR dwParam2 ) = 0 ; // modMessage
36- static BOOL (WINAPI * RKDMAPIV )(DWORD * Major , DWORD * Minor , DWORD * Build , DWORD * Revision ) = 0 ; // ReturnKDMAPIVer
37- static BOOL (WINAPI * IOMS )(void ) = 0 ; // InitializeKDMAPIStream
38- static BOOL (WINAPI * TOMS )(void ) = 0 ; // TerminateKDMAPIStream
39- static void (WINAPI * ROMS )(void ) = 0 ; // ResetKDMAPIStream
40- static BOOL (WINAPI * IKDMAPIA )(void ) = 0 ; // IsKDMAPIAvailable
31+ static VOID (WINAPI * SCE )(DWORD , DWORD , DWORD ) = 0 ; // SendCustomEvent
32+ static MMRESULT (WINAPI * SDD )(DWORD ) = 0 ; // SendDirectData
33+ static MMRESULT (WINAPI * SDLD )(LPMIDIHDR ) = 0 ; // SendDirectLongData
34+ static MMRESULT (WINAPI * mM )(UINT , UINT , DWORD_PTR , DWORD_PTR , DWORD_PTR ) = 0 ; // modMessage
35+ static BOOL (WINAPI * RKDMAPIV )(LPDWORD , LPDWORD , LPDWORD , LPDWORD ) = 0 ; // ReturnKDMAPIVer
36+ static BOOL (WINAPI * IOMS )(VOID ) = 0 ; // InitializeKDMAPIStream
37+ static BOOL (WINAPI * TOMS )(VOID ) = 0 ; // TerminateKDMAPIStream
38+ static VOID (WINAPI * ROMS )(VOID ) = 0 ; // ResetKDMAPIStream
39+ static BOOL (WINAPI * IKDMAPIA )(VOID ) = 0 ; // IsKDMAPIAvailable
4140
4241// NTDLL funcs
43- static NTSTATUS (NTAPI * NtLockVirtualMemory )(IN HANDLE process , IN OUT void * * baseAddress , IN OUT ULONG * size , IN ULONG flags );
44- static NTSTATUS (NTAPI * NtUnlockVirtualMemory )(IN HANDLE process , IN OUT void * * baseAddress , IN OUT ULONG * size , IN ULONG flags );
45- static NTSTATUS (NTAPI * NtDelayExecution )(BOOLEAN dwAlertable , PLARGE_INTEGER dwDelayInterval );
42+ static NTSTATUS (NTAPI * NtLockVirtualMemory )(IN HANDLE , IN OUT void * * , IN OUT ULONG * , IN ULONG );
43+ static NTSTATUS (NTAPI * NtUnlockVirtualMemory )(IN HANDLE , IN OUT void * * , IN OUT ULONG * , IN ULONG );
44+ static NTSTATUS (NTAPI * NtDelayExecution )(BOOLEAN , PLARGE_INTEGER );
4645
47- #ifdef _DAWRELEASE
4846// WinMM funcs, just replace MM with "midiOut" to get the real version
49- static UINT (WINAPI * MMOutGetNumDevs )(void ) = 0 ;
50- static MMRESULT (WINAPI * MMOutGetDevCapsW )(UINT_PTR uDeviceID , LPMIDIOUTCAPSW lpCaps , UINT uSize ) = 0 ;
51- static MMRESULT (WINAPI * MMOutOpen )(LPHMIDIOUT lphMidiOut , UINT uDeviceID , DWORD_PTR dwCallback , DWORD_PTR dwCallbackInstance , DWORD dwFlags ) = 0 ;
52- static MMRESULT (WINAPI * MMOutClose )(HMIDIOUT hMidiOut ) = 0 ;
53- static MMRESULT (WINAPI * MMOutReset )(HMIDIOUT hMidiOut ) = 0 ;
54- static MMRESULT (WINAPI * MMOutShortMsg )(HMIDIOUT hMidiOut , DWORD dwMsg ) = 0 ;
55- static MMRESULT (WINAPI * MMOutPrepareHeader )(HMIDIOUT hMidiOut , MIDIHDR * lpMidiOutHdr , UINT uSize ) = 0 ;
56- static MMRESULT (WINAPI * MMOutUnprepareHeader )(HMIDIOUT hMidiOut , MIDIHDR * lpMidiOutHdr , UINT uSize ) = 0 ;
57- static MMRESULT (WINAPI * MMOutLongMsg )(HMIDIOUT hMidiOut , MIDIHDR * lpMidiOutHdr , UINT uSize ) = 0 ;
58- static MMRESULT (WINAPI * MMOutCachePatches )(HMIDIOUT hMidiOut , UINT wPatch , WORD * lpPatchArray , UINT wFlags ) = 0 ;
59- static MMRESULT (WINAPI * MMOutCacheDrumPatches )(HMIDIOUT hMidiOut , UINT wPatch , WORD * lpKeyArray , UINT wFlags ) = 0 ;
60- static MMRESULT (WINAPI * MMOutMessage )(HMIDIOUT hMidiOut , UINT uMsg , DWORD_PTR dw1 , DWORD_PTR dw2 ) = 0 ;
61- static MMRESULT (WINAPI * MMOutSetVolume )(HMIDIOUT hMidiOut , DWORD dwVolume ) = 0 ;
62- static MMRESULT (WINAPI * MMOutGetVolume )(HMIDIOUT hMidiOut , LPDWORD lpdwVolume ) = 0 ;
63- static MMRESULT (WINAPI * MMOutGetID )(HMIDIOUT hMidiOut , LPUINT puDeviceID ) = 0 ;
47+ static HMODULE OWINMM = NULL ;
48+ #ifdef _DAWRELEASE
49+
50+ static UINT (WINAPI * MMOutGetNumDevs )(VOID ) = 0 ;
51+ static MMRESULT (WINAPI * MMOutGetDevCapsW )(UINT_PTR , LPMIDIOUTCAPSW , UINT ) = 0 ;
52+ static MMRESULT (WINAPI * MMOutOpen )(LPHMIDIOUT , UINT , DWORD_PTR , DWORD_PTR , DWORD ) = 0 ;
53+ static MMRESULT (WINAPI * MMOutClose )(HMIDIOUT ) = 0 ;
54+ static MMRESULT (WINAPI * MMOutReset )(HMIDIOUT ) = 0 ;
55+ static MMRESULT (WINAPI * MMOutShortMsg )(HMIDIOUT , DWORD ) = 0 ;
56+ static MMRESULT (WINAPI * MMOutPrepareHeader )(HMIDIOUT , LPMIDIHDR , UINT ) = 0 ;
57+ static MMRESULT (WINAPI * MMOutUnprepareHeader )(HMIDIOUT , LPMIDIHDR , UINT ) = 0 ;
58+ static MMRESULT (WINAPI * MMOutLongMsg )(HMIDIOUT , LPMIDIHDR , UINT ) = 0 ;
59+ static MMRESULT (WINAPI * MMOutCachePatches )(HMIDIOUT , UINT , LPWORD , UINT ) = 0 ;
60+ static MMRESULT (WINAPI * MMOutCacheDrumPatches )(HMIDIOUT , UINT , LPWORD , UINT ) = 0 ;
61+ static MMRESULT (WINAPI * MMOutMessage )(HMIDIOUT , UINT , DWORD_PTR , DWORD_PTR ) = 0 ;
62+ static MMRESULT (WINAPI * MMOutSetVolume )(HMIDIOUT , DWORD ) = 0 ;
63+ static MMRESULT (WINAPI * MMOutGetVolume )(HMIDIOUT , LPDWORD ) = 0 ;
64+ static MMRESULT (WINAPI * MMOutGetID )(HMIDIOUT , LPUINT ) = 0 ;
6465#endif
66+ static MMRESULT (WINAPI * MMtimeGetDevCaps )(LPTIMECAPS , UINT ) = 0 ;
67+ static MMRESULT (WINAPI * MMtimeSetEvent )(UINT , UINT , LPTIMECALLBACK , DWORD_PTR , UINT ) = 0 ;
68+ static MMRESULT (WINAPI * MMtimeKillEvent )(UINT ) = 0 ;
69+ static DWORD (WINAPI * MMtimeGetTime )(VOID ) = 0 ;
70+ static MMRESULT (WINAPI * MMtimeGetSystemTime )(LPMMTIME , UINT ) = 0 ;
71+ static MMRESULT (WINAPI * MMtimeBeginPeriod )(UINT ) = 0 ;
72+ static MMRESULT (WINAPI * MMtimeEndPeriod )(UINT ) = 0 ;
6573
6674// Callback, used for old apps that require one
6775static DWORD_PTR WMMCI ;
68- static void (CALLBACK * WMMC )(HMIDIOUT hmo , DWORD wMsg , DWORD_PTR dwInstance , DWORD_PTR dwParam1 , DWORD_PTR dwParam2 ) = 0 ;
69-
70- static int ST = 4 ;
71- static int SNT [7 ] =
72- {
73- MOD_FMSYNTH ,
74- MOD_SYNTH ,
75- MOD_WAVETABLE ,
76- MOD_MAPPER ,
77- MOD_MIDIPORT ,
78- MOD_SWSYNTH ,
79- MOD_SQSYNTH
80- };
81-
82- static HMODULE OM = NULL ;
83- static HMODULE OWINMM = NULL ;
76+ static VOID (CALLBACK * WMMC )(HMIDIOUT , DWORD , DWORD_PTR , DWORD_PTR , DWORD_PTR ) = 0 ;
8477
8578void CheckIfKDMAPIIsUpToDate () {
86- TCHAR ErrorBuf [1024 ];
87-
8879 BOOL GoAhead = FALSE;
8980 RKDMAPIV (& DrvMajor , & DrvMinor , & DrvBuild , & DrvRevision );
9081
@@ -106,6 +97,8 @@ void CheckIfKDMAPIIsUpToDate() {
10697 }
10798
10899 if (!GoAhead ) {
100+ TCHAR ErrorBuf [1024 ];
101+
109102 sprintf_s (
110103 ErrorBuf ,
111104 1024 ,
@@ -182,7 +175,7 @@ void InitializeNTDLL() {
182175 }
183176}
184177
185- #ifdef _DAWRELEASE
178+
186179void InitializeWinMM () {
187180 // Load WinMM
188181 wchar_t SystemDirectory [MAX_PATH ];
@@ -193,13 +186,14 @@ void InitializeWinMM() {
193186 if (!OWINMM ) {
194187 MessageBox (
195188 NULL ,
196- "Failed to initialize the Windows Multimedia API!\nAre you trying to use the patch on Windows 98 or something like that? \n\nPress OK to exit." ,
189+ "Failed to initialize the Windows Multimedia API!\nThe interpreter won't work if Windows Multimedia isn't present.\n(P.S. WINE isn't supported.) \n\nPress OK to exit." ,
197190 "OMDirect API" ,
198191 MB_ICONERROR | MB_OK | MB_SYSTEMMODAL
199192 );
200193 exit (0x0A );
201194 }
202195
196+ #ifdef _DAWRELEASE
203197 MMOutGetNumDevs = (UINT * )GetProcAddress (OWINMM , "midiOutGetNumDevs" );
204198 MMOutGetDevCapsW = (MMRESULT * )GetProcAddress (OWINMM , "midiOutGetDevCapsW" );
205199 MMOutOpen = (MMRESULT * )GetProcAddress (OWINMM , "midiOutOpen" );
@@ -215,15 +209,21 @@ void InitializeWinMM() {
215209 MMOutSetVolume = (MMRESULT * )GetProcAddress (OWINMM , "midiOutSetVolume" );
216210 MMOutGetVolume = (MMRESULT * )GetProcAddress (OWINMM , "midiOutGetVolume" );
217211 MMOutGetID = (MMRESULT * )GetProcAddress (OWINMM , "midiOutGetID" );
218- }
219212#endif
213+ MMtimeGetDevCaps = (MMRESULT * )GetProcAddress (OWINMM , "timeGetDevCaps" );
214+ MMtimeSetEvent = (MMRESULT * )GetProcAddress (OWINMM , "timeSetEvent" );
215+ MMtimeKillEvent = (MMRESULT * )GetProcAddress (OWINMM , "timeKillEvent" );
216+ MMtimeGetTime = (DWORD * )GetProcAddress (OWINMM , "timeGetTime" );
217+ MMtimeGetSystemTime = (MMRESULT * )GetProcAddress (OWINMM , "timeGetSystemTime" );
218+ MMtimeBeginPeriod = (MMRESULT * )GetProcAddress (OWINMM , "timeBeginPeriod" );
219+ MMtimeEndPeriod = (MMRESULT * )GetProcAddress (OWINMM , "timeEndPeriod" );
220+ }
221+
220222
221223BOOL WINAPI DllMain (HINSTANCE hInstDLL , DWORD fdwReason , LPVOID fImpLoad ) {
222224 if (fdwReason == DLL_PROCESS_ATTACH ) {
223225 InitializeNTDLL ();
224- #ifdef _DAWRELEASE
225226 InitializeWinMM ();
226- #endif
227227 InitializeOMDirectAPI ();
228228 }
229229 return TRUE;
@@ -240,19 +240,6 @@ UINT WINAPI KDMAPI_midiOutGetNumDevs(void) {
240240
241241MMRESULT WINAPI KDMAPI_midiOutGetDevCapsW (UINT_PTR uDeviceID , LPMIDIOUTCAPSW lpCaps , UINT uSize ) {
242242 MIDIOUTCAPSW myCapsW ;
243- DWORD CapsSupport = MIDICAPS_VOLUME ;
244-
245- wchar_t SynthName [MAXPNAMELEN ];
246- WORD VID = 0xFFFF ;
247- WORD PID = 0x000A ;
248- DWORD DM = MOD_SWSYNTH ;
249-
250- // Read key
251- HKEY hKey ;
252- long lResult ;
253- DWORD dwType ;
254- DWORD dwSize = sizeof (DWORD );
255- DWORD dwSizeW = sizeof (SynthName );
256243
257244 // Return the output device, but Unicode (UTF-8)
258245 if (lpCaps == NULL ) return MMSYSERR_INVALPARAM ;
@@ -263,20 +250,13 @@ MMRESULT WINAPI KDMAPI_midiOutGetDevCapsW(UINT_PTR uDeviceID, LPMIDIOUTCAPSW lpC
263250 return MMOutGetDevCapsW (uDeviceID , lpCaps , uSize );
264251
265252 case KDMAPI_UDID :
266- ZeroMemory (SynthName , MAXPNAMELEN );
267- wcscat (SynthName , L"KDMAPI Output to OmniMIDI\0" );
268- DM = MOD_WAVETABLE ;
269-
270- // ChecOM done, assign device type
271- DM = SNT [ST ];
272-
273253 // Assign values
274- myCapsW .wMid = VID ;
275- myCapsW .wPid = PID ;
276- wcsncpy (myCapsW .szPname , SynthName , 32 );
254+ myCapsW .wMid = 0xFFFF ;
255+ myCapsW .wPid = 0x000A ;
256+ wcsncpy (myCapsW .szPname , L"KDMAPI Output to OmniMIDI" , MAXPNAMELEN );
277257 myCapsW .wVoices = 0xFFFF ;
278258 myCapsW .wNotes = 0x0000 ;
279- myCapsW .wTechnology = DM ;
259+ myCapsW .wTechnology = MOD_MIDIPORT ;
280260 myCapsW .wChannelMask = 0xFFFF ;
281261 myCapsW .dwSupport = MIDICAPS_VOLUME ;
282262
@@ -291,38 +271,13 @@ MMRESULT WINAPI KDMAPI_midiOutGetDevCapsW(UINT_PTR uDeviceID, LPMIDIOUTCAPSW lpC
291271#else
292272 if (uDeviceID > 0 ) return MMSYSERR_BADDEVICEID ;
293273
294- LSTATUS RegKey = RegOpenKeyEx (HKEY_CURRENT_USER , "Software\\OmniMIDI\\Configuration" , 0 , KEY_ALL_ACCESS , & hKey );
295- if (RegKey == ERROR_SUCCESS ) {
296- dwType = REG_DWORD ;
297- RegQueryValueEx (hKey , "SynthType" , NULL , & dwType , (LPBYTE )& ST , & dwSize );
298- RegQueryValueEx (hKey , "VID" , NULL , & dwType , (LPBYTE )& VID , & dwSize );
299- RegQueryValueEx (hKey , "PID" , NULL , & dwType , (LPBYTE )& PID , & dwSize );
300-
301- dwType = REG_SZ ;
302- lResult = RegQueryValueExW (hKey , L"SynthName" , NULL , & dwType , (LPBYTE )& SynthName , & dwSizeW );
303- RegCloseKey (hKey );
304- // Done reading, close key
305- }
306-
307- // Some checks
308- if (ST < 0 || ST > 6 ) ST = 4 ;
309- else ST = MOD_SWSYNTH ;
310-
311- if (wcslen (SynthName ) < 1 || iswspace (SynthName [0 ]) || lResult != ERROR_SUCCESS ) {
312- ZeroMemory (SynthName , MAXPNAMELEN );
313- wcscat (SynthName , L"KDMAPI Output\0" );
314- }
315-
316- // Checks done, assign device type
317- DM = SNT [ST ];
318-
319274 // Assign values
320- myCapsW .wMid = VID ;
321- myCapsW .wPid = PID ;
322- wcsncpy (myCapsW .szPname , SynthName , 32 );
275+ myCapsW .wMid = 0xFFFF ;
276+ myCapsW .wPid = 0x000A ;
277+ wcsncpy (myCapsW .szPname , L"KDMAPI Output to OmniMIDI" , MAXPNAMELEN );
323278 myCapsW .wVoices = 0xFFFF ;
324279 myCapsW .wNotes = 0x0000 ;
325- myCapsW .wTechnology = DM ;
280+ myCapsW .wTechnology = MOD_MIDIPORT ;
326281 myCapsW .wChannelMask = 0xFFFF ;
327282 myCapsW .dwSupport = MIDICAPS_VOLUME ;
328283
@@ -400,7 +355,7 @@ MMRESULT WINAPI KDMAPI_midiOutOpen(LPHMIDIOUT lphmo, UINT_PTR uDeviceID, DWORD_P
400355 // Setup the Callback (If there's one) - NEEDED FOR VANBASCO!
401356 // If dwflags is CALLBACK_EVENT, then skip, since it's not needed. (Java pls)
402357 if ((dwFlags != CALLBACK_NULL ) && (dwFlags != CALLBACK_EVENT )) {
403- WMMC = (void * )dwCallback ;
358+ WMMC = (VOID * )dwCallback ;
404359 WMMCI = dwCallbackInstance ;
405360
406361 IsCallbackWindow = (dwFlags == CALLBACK_WINDOW );
@@ -583,7 +538,35 @@ MMRESULT WINAPI KDMAPI_midiOutGetID(HMIDIOUT hMidiOut, LPUINT puDeviceID) {
583538 return MMSYSERR_NOERROR ;
584539}
585540
586- UINT WINAPI KDMAPI_mmsystemGetVersion () {
541+ MMRESULT WINAPI KDMAPI_timeGetDevCaps (LPTIMECAPS ptc , UINT cbtc ) {
542+ return MMtimeGetDevCaps (ptc , cbtc );
543+ }
544+
545+ MMRESULT WINAPI KDMAPI_timeSetEvent (UINT uDelay , UINT uResolution , LPTIMECALLBACK lpTimeProc , DWORD_PTR dwUser , UINT fuEvent ) {
546+ return MMtimeSetEvent (uDelay , uResolution , lpTimeProc , dwUser , fuEvent );
547+ }
548+
549+ MMRESULT WINAPI KDMAPI_timeKillEvent (UINT uTimerID ) {
550+ return MMtimeKillEvent (uTimerID );
551+ }
552+
553+ DWORD WINAPI KDMAPI_timeGetTime () {
554+ return MMtimeGetTime ();
555+ }
556+
557+ MMRESULT WINAPI KDMAPI_timeGetSystemTime (LPMMTIME pmmt , UINT cbmmt ) {
558+ return MMtimeGetSystemTime (pmmt , cbmmt );
559+ }
560+
561+ MMRESULT WINAPI KDMAPI_timeBeginPeriod (UINT uPeriod ) {
562+ return MMtimeBeginPeriod (uPeriod );
563+ }
564+
565+ MMRESULT WINAPI KDMAPI_timeEndPeriod (UINT uPeriod ) {
566+ return MMtimeEndPeriod (uPeriod );
567+ }
568+
569+ UINT WINAPI KDMAPI_mmsystemGetVersion (void ) {
587570 // Dummy, not needed
588571 return 0x0502U ;
589572}
0 commit comments