⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 winmm.c

📁 This is a futaba PCM decode source. You can study futaba pcm code.
💻 C
📖 第 1 页 / 共 5 页
字号:

    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 + -