📄 winmm.c
字号:
if (!sync) return;
newdata = 1024 - (width - PPM_MIN) / (PPM_MAX - PPM_MIN) * 1024;
if (newdata < 0) newdata = 0;
else if (newdata > 1023) newdata = 1023;
if (data[datacount] - newdata > 100) data[datacount] -= 100;
else if (newdata - data[datacount] > 100) data[datacount] += 100;
else data[datacount] = (data[datacount] + newdata) / 2;
datacount++;
switch (datacount) {
case 3: Position[3] = data[2]; break;
case 5: Position[2] = data[4]; break;
case 7: Position[1] = data[6]; break;
case 9: Position[0] = data[8]; break;
case 11: Position[4] = data[10]; break;
case 13: Position[5] = data[12]; sync = 0; break;
}
}
#endif
static void __fastcall ProcessData(int i)
{
static double min = 0;
static double max = 0;
static int high = 0;
static int low = 0;
double threshold;
// max *= 0.9999;
// min *= 0.9999;
max -= 0.1;
min += 0.1;
if (max < min) max = min + 1;
if (i> max) max = i;
else if (i < min) min = i;
threshold = (min + max) / 2;
if (i > threshold) {
high++;
if (low) {
ProcessPulse(low, FALSE);
low = 0;
}
} else {
low++;
if (high) {
ProcessPulse(high, TRUE);
high = 0;
}
}
}
//---------------------------------------------------------------------------
static void CALLBACK waveInProc(HWAVEIN hwi, UINT uMsg, void *lpUser, WAVEHDR *buf, DWORD Reserved)
{
int i;
if (uMsg == WIM_DATA) {
int Size = waveFmt.nBlockAlign;
int Length = buf->dwBytesRecorded / Size;
if (Size == 1) {
for (i = 0; i < Length; i++) {
ProcessData((unsigned char)buf->lpData[i]);
}
} else if (Size == 2) {
for (i = 0; i < Length; i++) {
ProcessData(((signed short*)(buf->lpData))[i]);
}
}
if (waveRecording) (*(winmm.waveInAddBuffer))(waveIn, waveBuf[buf->dwUser], sizeof(WAVEHDR));
}
}
//---------------------------------------------------------------------------
void StartPropo(void)
{
int i;
waveRecording = TRUE;
waveFmt.wFormatTag = WAVE_FORMAT_PCM;
waveFmt.nChannels = 1;
waveFmt.nSamplesPerSec = 44100;
waveFmt.wBitsPerSample =16;
waveFmt.nBlockAlign = waveFmt.wBitsPerSample / 8 * waveFmt.nChannels;
waveFmt.nAvgBytesPerSec = waveFmt.nSamplesPerSec * waveFmt.nBlockAlign;
waveFmt.cbSize = 0;
(*(winmm.waveInOpen))(&waveIn, WAVE_MAPPER, &waveFmt, (DWORD)(waveInProc), 0, CALLBACK_FUNCTION);
for (i = 0; i < 2; i++) {
waveBuf[i] = (WAVEHDR*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WAVEHDR));
waveBuf[i]->lpData = (char*)HeapAlloc(GetProcessHeap(), 0, waveBufSize);
waveBuf[i]->dwBufferLength = waveBufSize;
waveBuf[i]->dwUser = i;
(*(winmm.waveInPrepareHeader))(waveIn, waveBuf[i], sizeof(WAVEHDR));
(*(winmm.waveInAddBuffer))(waveIn, waveBuf[i], sizeof(WAVEHDR));
}
(*(winmm.waveInStart))(waveIn);
}
//---------------------------------------------------------------------------
void StopPropo(void)
{
int i, s[2];
waveRecording = FALSE;
(*(winmm.waveInStop))(waveIn);
for (i = 0; i < 2 ;i++) {
(*(winmm.waveInUnprepareHeader))(waveIn, waveBuf[i], sizeof(WAVEHDR));
HeapFree(GetProcessHeap(), 0, waveBuf[i]->lpData);
HeapFree(GetProcessHeap(), 0, waveBuf[i]);
}
(*(winmm.waveInClose))(waveIn);
}
//---------------------------------------------------------------------------
int GetPosition(int ch)
{
return Position[ch];
}
//---------------------------------------------------------------------------
typedef struct {
WORD wMid; /* manufacturer ID */
WORD wPid; /* product ID */
CHAR szPname[MAXPNAMELEN];/* product name (NULL terminated string) */
UINT wXmin; /* minimum x position value */
UINT wXmax; /* maximum x position value */
UINT wYmin; /* minimum y position value */
UINT wYmax; /* maximum y position value */
UINT wZmin; /* minimum z position value */
UINT wZmax; /* maximum z position value */
UINT wNumButtons; /* number of buttons */
UINT wPeriodMin; /* minimum message period when captured */
UINT wPeriodMax; /* maximum message period when captured */
UINT wRmin; /* minimum r position value */
UINT wRmax; /* maximum r position value */
UINT wUmin; /* minimum u (5th axis) position value */
UINT wUmax; /* maximum u (5th axis) position value */
UINT wVmin; /* minimum v (6th axis) position value */
UINT wVmax; /* maximum v (6th axis) position value */
UINT wCaps; /* joystick capabilites */
UINT wMaxAxes; /* maximum number of axes supported */
UINT wNumAxes; /* number of axes in use */
UINT wMaxButtons; /* maximum number of buttons supported */
CHAR szRegKey[MAXPNAMELEN];/* registry key */
CHAR szOEMVxD[MAX_JOYSTICKOEMVXDNAME]; /* OEM VxD in use */
} *LPJOYCAPS;
typedef struct {
UINT wXpos; /* x position */
UINT wYpos; /* y position */
UINT wZpos; /* z position */
UINT wButtons; /* button states */
} *LPJOYINFO;
typedef struct {
DWORD dwSize; /* size of structure */
DWORD dwFlags; /* flags to indicate what to return */
DWORD dwXpos; /* x position */
DWORD dwYpos; /* y position */
DWORD dwZpos; /* z position */
DWORD dwRpos; /* rudder/4th axis position */
DWORD dwUpos; /* 5th axis position */
DWORD dwVpos; /* 6th axis position */
DWORD dwButtons; /* button states */
DWORD dwButtonNumber; /* current button number pressed */
DWORD dwPOV; /* point of view state */
DWORD dwReserved1; /* reserved for communication between winmm & driver */
DWORD dwReserved2; /* reserved for future expansion */
} *LPJOYINFOEX;
extern __declspec(naked, dllexport) void WINAPI CloseDriver(void) { _asm{ jmp dword ptr winmm.CloseDriver;} }
extern __declspec(naked, dllexport) void WINAPI DefDriverProc(void) { _asm { jmp dword ptr winmm.DefDriverProc;} }
extern __declspec(naked, dllexport) void WINAPI DriverCallback(void) { _asm { jmp dword ptr winmm.DriverCallback;} }
extern __declspec(naked, dllexport) void WINAPI DrvGetModuleHandle(void) { _asm { jmp dword ptr winmm.DrvGetModuleHandle;} }
extern __declspec(naked, dllexport) void WINAPI GetDriverModuleHandle(void) { _asm { jmp dword ptr winmm.GetDriverModuleHandle;} }
extern __declspec(naked, dllexport) void WINAPI MigrateAllDrivers(void) { _asm { jmp dword ptr winmm.MigrateAllDrivers;} }
extern __declspec(naked, dllexport) void WINAPI MigrateMidiUser(void) { _asm { jmp dword ptr winmm.MigrateMidiUser;} }
extern __declspec(naked, dllexport) void WINAPI MigrateSoundEvents(void) { _asm { jmp dword ptr winmm.MigrateSoundEvents;} }
extern __declspec(naked, dllexport) void WINAPI NotifyCallbackData(void) { _asm { jmp dword ptr winmm.NotifyCallbackData;} }
extern __declspec(naked, dllexport) void WINAPI OpenDriver(void) { _asm { jmp dword ptr winmm.OpenDriver;} }
extern __declspec(naked, dllexport) void WINAPI PlaySound(void) { _asm { jmp dword ptr winmm.PlaySound;} }
extern __declspec(naked, dllexport) void WINAPI PlaySoundA(void) { _asm { jmp dword ptr winmm.PlaySoundA;} }
extern __declspec(naked, dllexport) void WINAPI PlaySoundW(void) { _asm { jmp dword ptr winmm.PlaySoundW;} }
extern __declspec(naked, dllexport) void WINAPI SendDriverMessage(void) { _asm { jmp dword ptr winmm.SendDriverMessage;} }
extern __declspec(naked, dllexport) void WINAPI WOW32DriverCallback(void) { _asm { jmp dword ptr winmm.WOW32DriverCallback;} }
extern __declspec(naked, dllexport) void WINAPI WOW32ResolveMultiMediaHandle(void) { _asm { jmp dword ptr winmm.WOW32ResolveMultiMediaHandle;} }
extern __declspec(naked, dllexport) void WINAPI WOWAppExit(void) { _asm { jmp dword ptr winmm.WOWAppExit;} }
extern __declspec(naked, dllexport) void WINAPI WinmmLogoff(void) { _asm { jmp dword ptr winmm.WinmmLogoff;} }
extern __declspec(naked, dllexport) void WINAPI WinmmLogon(void) { _asm { jmp dword ptr winmm.WinmmLogon;} }
extern __declspec(naked, dllexport) void WINAPI aux32Message(void) { _asm { jmp dword ptr winmm.aux32Message;} }
extern __declspec(naked, dllexport) void WINAPI auxGetDevCapsA(void) { _asm { jmp dword ptr winmm.auxGetDevCapsA;} }
extern __declspec(naked, dllexport) void WINAPI auxGetDevCapsW(void) { _asm { jmp dword ptr winmm.auxGetDevCapsW;} }
extern __declspec(naked, dllexport) void WINAPI auxGetNumDevs(void) { _asm { jmp dword ptr winmm.auxGetNumDevs;} }
extern __declspec(naked, dllexport) void WINAPI auxGetVolume(void) { _asm { jmp dword ptr winmm.auxGetVolume;} }
extern __declspec(naked, dllexport) void WINAPI auxOutMessage(void) { _asm { jmp dword ptr winmm.auxOutMessage;} }
extern __declspec(naked, dllexport) void WINAPI auxSetVolume(void) { _asm { jmp dword ptr winmm.auxSetVolume;} }
extern __declspec(naked, dllexport) void WINAPI joy32Message(void) { _asm { jmp dword ptr winmm.joy32Message;} }
extern __declspec(naked, dllexport) void WINAPI joyConfigChanged(void) { _asm { jmp dword ptr winmm.joyConfigChanged;} }
//extern __declspec(naked, dllexport) void WINAPI joyGetDevCapsA(void) { _asm { jmp dword ptr winmm.joyGetDevCapsA;} }
extern __declspec(dllexport) UINT WINAPI joyGetDevCapsA(UINT uJoyID, LPJOYCAPS pjc, UINT cbjc) {
if (uJoyID == 0) {
pjc->wMid = 0;
pjc->wPid = 0;
strcpy((char*)pjc->szPname, "SmartPropo");
pjc->wXmin = pjc->wYmin = pjc->wZmin = pjc->wRmin = pjc->wUmin = pjc->wVmin = 0;
pjc->wXmax = pjc->wYmax = pjc->wZmax = pjc->wRmax = pjc->wUmax = pjc->wVmax = 100;
pjc->wNumButtons = pjc->wMaxButtons = 6;
pjc->wMaxAxes = pjc->wNumAxes = 6;
pjc->wPeriodMin = pjc->wPeriodMax = 0;
pjc->wCaps = JOYCAPS_HASV;
pjc->szRegKey[0] = 0;
pjc->szOEMVxD[0] = 0;
return JOYERR_NOERROR;
}
pjc->wMid = 0;
pjc->wPid = 0;
strcpy((char*)pjc->szPname, "");
pjc->wXmin = pjc->wYmin = pjc->wZmin = pjc->wRmin = pjc->wUmin = pjc->wVmin = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -