diff src/joystick/win32/SDL_dxjoystick.c @ 2198:fe19afb86473

Split acinclude.m4 into its component parts for easy updating
author Sam Lantinga <slouken@libsdl.org>
date Sun, 15 Jul 2007 01:51:11 +0000
parents c121d94672cb
children 034440120c38 e1da92da346c 0906692aa6a4
line wrap: on
line diff
--- a/src/joystick/win32/SDL_dxjoystick.c	Sat Jul 14 07:28:45 2007 +0000
+++ b/src/joystick/win32/SDL_dxjoystick.c	Sun Jul 15 01:51:11 2007 +0000
@@ -44,33 +44,61 @@
 
 #define DIRECTINPUT_VERSION 0x0500
 #include <dinput.h>
+#ifdef _MSC_VER
+    /* Used for the c_dfDIJoystick2 symbol (no imports are used) */
+#   pragma comment (lib, "dinput.lib")
+#endif
+#include <dxerr9.h>             /* From DirectX SDK 9c */
+#ifdef _MSC_VER
+#   pragma comment (lib, "dxerr9.lib")
+#endif
+
+/* an ISO hack for VisualC++ */
+#ifdef _MSC_VER
+#define   snprintf	_snprintf
+#endif
 
 #define INPUT_QSIZE	32      /* Buffer up to 32 input messages */
-
-extern HINSTANCE SDL_Instance;
-extern int DX5_Load();
-extern void DX5_Unload();
-extern HRESULT(WINAPI * DInputCreate) (HINSTANCE hinst, DWORD dwVersion,
-                                       LPDIRECTINPUT * ppDI,
-                                       LPUNKNOWN punkOuter);
-
-static LPDIRECTINPUT dinput = NULL;
-
 #define MAX_JOYSTICKS	8
 #define MAX_INPUTS	256     /* each joystick can have up to 256 inputs */
 #define AXIS_MIN	-32768  /* minimum value for axis coordinate */
 #define AXIS_MAX	32767   /* maximum value for axis coordinate */
 #define JOY_AXIS_THRESHOLD	(((AXIS_MAX)-(AXIS_MIN))/100)   /* 1% motion */
 
+/* external variables referenced. */
+extern HINSTANCE SDL_Instance;
+extern HWND SDL_Window;
+
+
+/* local variables */
+static LPDIRECTINPUT dinput = NULL;
+extern HRESULT(WINAPI * DInputCreate) (HINSTANCE hinst, DWORD dwVersion,
+                                       LPDIRECTINPUT * ppDI,
+                                       LPUNKNOWN punkOuter);
+static DIDEVICEINSTANCE SYS_Joystick[MAX_JOYSTICKS];    /* array to hold joystick ID values */
+static int SYS_NumJoysticks;
+static HINSTANCE DInputDLL = NULL;
+
+
+/* local prototypes */
+static void SetDIerror(const char *function, HRESULT code);
+static BOOL CALLBACK EnumJoysticksCallback(const DIDEVICEINSTANCE *
+                                           pdidInstance, VOID * pContext);
+static BOOL CALLBACK EnumDevObjectsCallback(LPCDIDEVICEOBJECTINSTANCE dev,
+                                            LPVOID pvRef);
+static Uint8 TranslatePOV(DWORD value);
+static int SDL_PrivateJoystickAxis_Int(SDL_Joystick * joystick, Uint8 axis,
+                                       Sint16 value);
+static int SDL_PrivateJoystickHat_Int(SDL_Joystick * joystick, Uint8 hat,
+                                      Uint8 value);
+static int SDL_PrivateJoystickButton_Int(SDL_Joystick * joystick,
+                                         Uint8 button, Uint8 state);
+
+
+/* local types */
 typedef enum Type
 { BUTTON, AXIS, HAT } Type;
 
-/* array to hold joystick ID values */
-static DIDEVICEINSTANCE SYS_Joystick[MAX_JOYSTICKS];
-static int SYS_NumJoysticks;
-
-extern HWND SDL_Window;
-
 typedef struct input_t
 {
     /* DirectInput offset for this input type: */
@@ -87,6 +115,7 @@
 struct joystick_hwdata
 {
     LPDIRECTINPUTDEVICE2 InputDevice;
+    DIDEVCAPS Capabilities;
     int buffered;
 
     input_t Inputs[MAX_INPUTS];
@@ -95,122 +124,12 @@
 
 /* Convert a DirectInput return code to a text message */
 static void
-SetDIerror(char *function, int code)
+SetDIerror(const char *function, HRESULT code)
 {
-    static char *error;
-    static char errbuf[1024];
-
-    errbuf[0] = 0;
-    switch (code) {
-    case DIERR_GENERIC:
-        error = "Undefined error!";
-        break;
-    case DIERR_OLDDIRECTINPUTVERSION:
-        error = "Your version of DirectInput needs upgrading";
-        break;
-    case DIERR_INVALIDPARAM:
-        error = "Invalid parameters";
-        break;
-    case DIERR_OUTOFMEMORY:
-        error = "Out of memory";
-        break;
-    case DIERR_DEVICENOTREG:
-        error = "Device not registered";
-        break;
-    case DIERR_NOINTERFACE:
-        error = "Interface not supported";
-        break;
-    case DIERR_NOTINITIALIZED:
-        error = "Device not initialized";
-        break;
-    default:
-        sprintf(errbuf, "%s: Unknown DirectInput error: 0x%x",
-                function, code);
-        break;
-    }
-    if (!errbuf[0]) {
-        sprintf(errbuf, "%s: %s", function, error);
-    }
-    SDL_SetError("%s", errbuf);
-    return;
-}
-
-
-BOOL CALLBACK
-EnumJoysticksCallback(const DIDEVICEINSTANCE * pdidInstance, VOID * pContext)
-{
-    memcpy(&SYS_Joystick[SYS_NumJoysticks], pdidInstance,
-           sizeof(DIDEVICEINSTANCE));
-    SYS_NumJoysticks++;
-
-    if (SYS_NumJoysticks >= MAX_JOYSTICKS)
-        return DIENUM_STOP;
-
-    return DIENUM_CONTINUE;
+    SDL_SetError("%s() [%s]: %s", function,
+                 DXGetErrorString9(code), DXGetErrorDescription9(code));
 }
 
-static BOOL CALLBACK
-DIJoystick_EnumDevObjectsProc(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID pvRef)
-{
-    SDL_Joystick *joystick = (SDL_Joystick *) pvRef;
-    HRESULT result;
-    input_t *in = &joystick->hwdata->Inputs[joystick->hwdata->NumInputs];
-    const int SupportedMask = DIDFT_BUTTON | DIDFT_POV | DIDFT_AXIS;
-    if (!(dev->dwType & SupportedMask))
-        return DIENUM_CONTINUE; /* unsupported */
-
-    in->ofs = dev->dwOfs;
-
-    if (dev->dwType & DIDFT_BUTTON) {
-        in->type = BUTTON;
-        in->num = joystick->nbuttons;
-        joystick->nbuttons++;
-    } else if (dev->dwType & DIDFT_POV) {
-        in->type = HAT;
-        in->num = joystick->nhats;
-        joystick->nhats++;
-    } else {                    /* dev->dwType & DIDFT_AXIS */
-        DIPROPRANGE diprg;
-        DIPROPDWORD dilong;
-
-        in->type = AXIS;
-        in->num = joystick->naxes;
-
-        diprg.diph.dwSize = sizeof(diprg);
-        diprg.diph.dwHeaderSize = sizeof(diprg.diph);
-        diprg.diph.dwObj = dev->dwOfs;
-        diprg.diph.dwHow = DIPH_BYOFFSET;
-        diprg.lMin = AXIS_MIN;
-        diprg.lMax = AXIS_MAX;
-
-        result =
-            IDirectInputDevice2_SetProperty(joystick->hwdata->InputDevice,
-                                            DIPROP_RANGE, &diprg.diph);
-        if (result != DI_OK)
-            return DIENUM_CONTINUE;     /* don't use this axis */
-
-        /* Set dead zone to 0. */
-        dilong.diph.dwSize = sizeof(dilong);
-        dilong.diph.dwHeaderSize = sizeof(dilong.diph);
-        dilong.diph.dwObj = dev->dwOfs;
-        dilong.diph.dwHow = DIPH_BYOFFSET;
-        dilong.dwData = 0;
-        result =
-            IDirectInputDevice2_SetProperty(joystick->hwdata->InputDevice,
-                                            DIPROP_DEADZONE, &dilong.diph);
-        if (result != DI_OK)
-            return DIENUM_CONTINUE;     /* don't use this axis */
-
-        joystick->naxes++;
-    }
-
-    joystick->hwdata->NumInputs++;
-
-    if (joystick->hwdata->NumInputs == MAX_INPUTS)
-        return DIENUM_STOP;     /* too many */
-
-    return DIENUM_CONTINUE;
-}
 
 /* Function to scan the system for joysticks.
  * This function should set SDL_numjoysticks to the number of available
@@ -224,18 +143,30 @@
 
     SYS_NumJoysticks = 0;
 
-    /* Create the DirectInput object */
-    if (DX5_Load() < 0) {
-        SDL_SetError("Couldn't load DirectInput");
-        return (-1);
-    }
-    result = DInputCreate(SDL_Instance, DIRECTINPUT_VERSION, &dinput, NULL);
-    if (result != DI_OK) {
-        DX5_Unload();
-        SetDIerror("DirectInputCreate", result);
+    result = CoInitialize(NULL);
+    if (FAILED(result)) {
+        SetDIerror("CoInitialize", result);
         return (-1);
     }
 
+    result = CoCreateInstance(&CLSID_DirectInput, NULL, CLSCTX_INPROC_SERVER,
+                              &IID_IDirectInput, &dinput);
+
+    if (FAILED(result)) {
+        SetDIerror("CoCreateInstance", result);
+        return (-1);
+    }
+
+    /* Because we used CoCreateInstance, we need to Initialize it, first. */
+    result =
+        IDirectInput_Initialize(dinput, SDL_Instance, DIRECTINPUT_VERSION);
+
+    if (FAILED(result)) {
+        SetDIerror("IDirectInput::Initialize", result);
+        return (-1);
+    }
+
+    /* Look for joysticks, wheels, head trackers, gamepads, etc.. */
     result = IDirectInput_EnumDevices(dinput,
                                       DIDEVTYPE_JOYSTICK,
                                       EnumJoysticksCallback,
@@ -244,6 +175,19 @@
     return SYS_NumJoysticks;
 }
 
+static BOOL CALLBACK
+EnumJoysticksCallback(const DIDEVICEINSTANCE * pdidInstance, VOID * pContext)
+{
+    memcpy(&SYS_Joystick[SYS_NumJoysticks], pdidInstance,
+           sizeof(DIDEVICEINSTANCE));
+    SYS_NumJoysticks++;
+
+    if (SYS_NumJoysticks >= MAX_JOYSTICKS)
+        return DIENUM_STOP;
+
+    return DIENUM_CONTINUE;
+}
+
 /* Function to get the device-dependent name of a joystick */
 const char *
 SDL_SYS_JoystickName(int index)
@@ -262,84 +206,354 @@
 {
     HRESULT result;
     LPDIRECTINPUTDEVICE device;
+    DIPROPDWORD dipdw;
+
+    ZeroMemory(&dipdw, sizeof(DIPROPDWORD));
+    dipdw.diph.dwSize = sizeof(DIPROPDWORD);
+    dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
+
 
     /* allocate memory for system specific hardware data */
     joystick->hwdata =
-        (struct joystick_hwdata *) malloc(sizeof(*joystick->hwdata));
+        (struct joystick_hwdata *) malloc(sizeof(struct joystick_hwdata));
     if (joystick->hwdata == NULL) {
         SDL_OutOfMemory();
         return (-1);
     }
-    memset(joystick->hwdata, 0, sizeof(*joystick->hwdata));
+    ZeroMemory(joystick->hwdata, sizeof(struct joystick_hwdata));
     joystick->hwdata->buffered = 1;
+    joystick->hwdata->Capabilities.dwSize = sizeof(DIDEVCAPS);
 
     result =
         IDirectInput_CreateDevice(dinput,
                                   &SYS_Joystick[joystick->index].
                                   guidInstance, &device, NULL);
-    if (result != DI_OK) {
-        SetDIerror("DirectInput::CreateDevice", result);
+    if (FAILED(result)) {
+        SetDIerror("IDirectInput::CreateDevice", result);
         return (-1);
     }
 
+    /* Now get the IDirectInputDevice2 interface, instead. */
     result = IDirectInputDevice_QueryInterface(device,
                                                &IID_IDirectInputDevice2,
                                                (LPVOID *) & joystick->
                                                hwdata->InputDevice);
+    /* We are done with this object.  Use the stored one from now on. */
     IDirectInputDevice_Release(device);
-    if (result != DI_OK) {
-        SetDIerror("DirectInputDevice::QueryInterface", result);
+
+    if (FAILED(result)) {
+        SetDIerror("IDirectInputDevice::QueryInterface", result);
         return (-1);
     }
 
+    /* Aquire shared access. Exclusive access is required for forces,
+     * though. */
     result =
         IDirectInputDevice2_SetCooperativeLevel(joystick->hwdata->
                                                 InputDevice, SDL_Window,
-                                                DISCL_NONEXCLUSIVE |
+                                                DISCL_EXCLUSIVE |
                                                 DISCL_BACKGROUND);
-    if (result != DI_OK) {
-        SetDIerror("DirectInputDevice::SetCooperativeLevel", result);
+    if (FAILED(result)) {
+        SetDIerror("IDirectInputDevice2::SetCooperativeLevel", result);
         return (-1);
     }
 
+    /* Use the extended data structure: DIJOYSTATE2. */
     result =
         IDirectInputDevice2_SetDataFormat(joystick->hwdata->InputDevice,
-                                          &c_dfDIJoystick);
-    if (result != DI_OK) {
-        SetDIerror("DirectInputDevice::SetDataFormat", result);
+                                          &c_dfDIJoystick2);
+    if (FAILED(result)) {
+        SetDIerror("IDirectInputDevice2::SetDataFormat", result);
+        return (-1);
+    }
+
+    /* Get device capabilities */
+    result =
+        IDirectInputDevice2_GetCapabilities(joystick->hwdata->InputDevice,
+                                            &joystick->hwdata->Capabilities);
+
+    if (FAILED(result)) {
+        SetDIerror("IDirectInputDevice2::GetCapabilities", result);
         return (-1);
     }
 
-    IDirectInputDevice2_EnumObjects(joystick->hwdata->InputDevice,
-                                    DIJoystick_EnumDevObjectsProc,
-                                    joystick,
-                                    DIDFT_BUTTON | DIDFT_AXIS | DIDFT_POV);
+    /* Force capable? */
+    if (joystick->hwdata->Capabilities.dwFlags & DIDC_FORCEFEEDBACK) {
+
+        result = IDirectInputDevice2_Acquire(joystick->hwdata->InputDevice);
+
+        if (FAILED(result)) {
+            SetDIerror("IDirectInputDevice2::Acquire", result);
+            return (-1);
+        }
+
+        /* reset all accuators. */
+        result =
+            IDirectInputDevice2_SendForceFeedbackCommand(joystick->hwdata->
+                                                         InputDevice,
+                                                         DISFFC_RESET);
 
-    {
-        DIPROPDWORD dipdw;
-        memset(&dipdw, 0, sizeof(dipdw));
-        dipdw.diph.dwSize = sizeof(dipdw);
-        dipdw.diph.dwHeaderSize = sizeof(dipdw.diph);
+        if (FAILED(result)) {
+            SetDIerror("IDirectInputDevice2::SendForceFeedbackCommand",
+                       result);
+            return (-1);
+        }
+
+        result = IDirectInputDevice2_Unacquire(joystick->hwdata->InputDevice);
+
+        if (FAILED(result)) {
+            SetDIerror("IDirectInputDevice2::Unacquire", result);
+            return (-1);
+        }
+
+        /* Turn on auto-centering for a ForceFeedback device (until told
+         * otherwise). */
         dipdw.diph.dwObj = 0;
         dipdw.diph.dwHow = DIPH_DEVICE;
-        dipdw.dwData = INPUT_QSIZE;
+        dipdw.dwData = DIPROPAUTOCENTER_ON;
+
         result =
             IDirectInputDevice2_SetProperty(joystick->hwdata->InputDevice,
-                                            DIPROP_BUFFERSIZE, &dipdw.diph);
+                                            DIPROP_AUTOCENTER, &dipdw.diph);
 
-        if (result == DI_POLLEDDEVICE) {
-            /* This device doesn't support buffering, so we're forced
-             * to use less reliable polling. */
-            joystick->hwdata->buffered = 0;
-        } else if (result != DI_OK) {
-            SetDIerror("DirectInputDevice::SetProperty", result);
+        if (FAILED(result)) {
+            SetDIerror("IDirectInputDevice2::SetProperty", result);
             return (-1);
         }
     }
 
+    /* What buttons and axes does it have? */
+    IDirectInputDevice2_EnumObjects(joystick->hwdata->InputDevice,
+                                    EnumDevObjectsCallback, joystick,
+                                    DIDFT_BUTTON | DIDFT_AXIS | DIDFT_POV);
+
+    dipdw.diph.dwObj = 0;
+    dipdw.diph.dwHow = DIPH_DEVICE;
+    dipdw.dwData = INPUT_QSIZE;
+
+    /* Set the buffer size */
+    result =
+        IDirectInputDevice2_SetProperty(joystick->hwdata->InputDevice,
+                                        DIPROP_BUFFERSIZE, &dipdw.diph);
+
+    if (result == DI_POLLEDDEVICE) {
+        /* This device doesn't support buffering, so we're forced
+         * to use less reliable polling. */
+        joystick->hwdata->buffered = 0;
+    } else if (FAILED(result)) {
+        SetDIerror("IDirectInputDevice2::SetProperty", result);
+        return (-1);
+    }
+
     return (0);
 }
 
+static BOOL CALLBACK
+EnumDevObjectsCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID pvRef)
+{
+    SDL_Joystick *joystick = (SDL_Joystick *) pvRef;
+    HRESULT result;
+    input_t *in = &joystick->hwdata->Inputs[joystick->hwdata->NumInputs];
+
+    in->ofs = dev->dwOfs;
+
+    if (dev->dwType & DIDFT_BUTTON) {
+        in->type = BUTTON;
+        in->num = joystick->nbuttons;
+        joystick->nbuttons++;
+    } else if (dev->dwType & DIDFT_POV) {
+        in->type = HAT;
+        in->num = joystick->nhats;
+        joystick->nhats++;
+    } else if (dev->dwType & DIDFT_AXIS) {
+        DIPROPRANGE diprg;
+        DIPROPDWORD dilong;
+
+        in->type = AXIS;
+        in->num = joystick->naxes;
+
+        diprg.diph.dwSize = sizeof(diprg);
+        diprg.diph.dwHeaderSize = sizeof(diprg.diph);
+        diprg.diph.dwObj = dev->dwOfs;
+        diprg.diph.dwHow = DIPH_BYOFFSET;
+        diprg.lMin = AXIS_MIN;
+        diprg.lMax = AXIS_MAX;
+
+        result =
+            IDirectInputDevice2_SetProperty(joystick->hwdata->InputDevice,
+                                            DIPROP_RANGE, &diprg.diph);
+        if (FAILED(result)) {
+            return DIENUM_CONTINUE;     /* don't use this axis */
+        }
+
+        /* Set dead zone to 0. */
+        dilong.diph.dwSize = sizeof(dilong);
+        dilong.diph.dwHeaderSize = sizeof(dilong.diph);
+        dilong.diph.dwObj = dev->dwOfs;
+        dilong.diph.dwHow = DIPH_BYOFFSET;
+        dilong.dwData = 0;
+        result =
+            IDirectInputDevice2_SetProperty(joystick->hwdata->InputDevice,
+                                            DIPROP_DEADZONE, &dilong.diph);
+        if (FAILED(result)) {
+            return DIENUM_CONTINUE;     /* don't use this axis */
+        }
+
+        joystick->naxes++;
+    } else {
+        /* not supported at this time */
+        return DIENUM_CONTINUE;
+    }
+
+    joystick->hwdata->NumInputs++;
+
+    if (joystick->hwdata->NumInputs == MAX_INPUTS) {
+        return DIENUM_STOP;     /* too many */
+    }
+
+    return DIENUM_CONTINUE;
+}
+
+/* Function to update the state of a joystick - called as a device poll.
+ * This function shouldn't update the joystick structure directly,
+ * but instead should call SDL_PrivateJoystick*() to deliver events
+ * and update joystick device state.
+ */
+void
+SDL_SYS_JoystickUpdate_Polled(SDL_Joystick * joystick)
+{
+    DIJOYSTATE2 state;
+    HRESULT result;
+    int i;
+
+    result =
+        IDirectInputDevice2_GetDeviceState(joystick->hwdata->InputDevice,
+                                           sizeof(DIJOYSTATE2), &state);
+    if (result == DIERR_INPUTLOST || result == DIERR_NOTACQUIRED) {
+        IDirectInputDevice2_Acquire(joystick->hwdata->InputDevice);
+        result =
+            IDirectInputDevice2_GetDeviceState(joystick->hwdata->InputDevice,
+                                               sizeof(DIJOYSTATE2), &state);
+    }
+
+    /* Set each known axis, button and POV. */
+    for (i = 0; i < joystick->hwdata->NumInputs; ++i) {
+        const input_t *in = &joystick->hwdata->Inputs[i];
+
+        switch (in->type) {
+        case AXIS:
+            switch (in->ofs) {
+            case DIJOFS_X:
+                SDL_PrivateJoystickAxis_Int(joystick, in->num,
+                                            (Sint16) state.lX);
+                break;
+            case DIJOFS_Y:
+                SDL_PrivateJoystickAxis_Int(joystick, in->num,
+                                            (Sint16) state.lY);
+                break;
+            case DIJOFS_Z:
+                SDL_PrivateJoystickAxis_Int(joystick, in->num,
+                                            (Sint16) state.lZ);
+                break;
+            case DIJOFS_RX:
+                SDL_PrivateJoystickAxis_Int(joystick, in->num,
+                                            (Sint16) state.lRx);
+                break;
+            case DIJOFS_RY:
+                SDL_PrivateJoystickAxis_Int(joystick, in->num,
+                                            (Sint16) state.lRy);
+                break;
+            case DIJOFS_RZ:
+                SDL_PrivateJoystickAxis_Int(joystick, in->num,
+                                            (Sint16) state.lRz);
+                break;
+            case DIJOFS_SLIDER(0):
+                SDL_PrivateJoystickAxis_Int(joystick, in->num,
+                                            (Sint16) state.rglSlider[0]);
+                break;
+            case DIJOFS_SLIDER(1):
+                SDL_PrivateJoystickAxis_Int(joystick, in->num,
+                                            (Sint16) state.rglSlider[1]);
+                break;
+            }
+
+            break;
+
+        case BUTTON:
+            SDL_PrivateJoystickButton_Int(joystick, in->num,
+                                          (Uint8) (state.
+                                                   rgbButtons[in->ofs -
+                                                              DIJOFS_BUTTON0]
+                                                   ? SDL_PRESSED :
+                                                   SDL_RELEASED));
+            break;
+        case HAT:
+            {
+                Uint8 pos = TranslatePOV(state.rgdwPOV[in->ofs -
+                                                       DIJOFS_POV(0)]);
+                SDL_PrivateJoystickHat_Int(joystick, in->num, pos);
+                break;
+            }
+        }
+    }
+}
+
+void
+SDL_SYS_JoystickUpdate_Buffered(SDL_Joystick * joystick)
+{
+    int i;
+    HRESULT result;
+    DWORD numevents;
+    DIDEVICEOBJECTDATA evtbuf[INPUT_QSIZE];
+
+    numevents = INPUT_QSIZE;
+    result =
+        IDirectInputDevice2_GetDeviceData(joystick->hwdata->InputDevice,
+                                          sizeof(DIDEVICEOBJECTDATA), evtbuf,
+                                          &numevents, 0);
+    if (result == DIERR_INPUTLOST || result == DIERR_NOTACQUIRED) {
+        IDirectInputDevice2_Acquire(joystick->hwdata->InputDevice);
+        result =
+            IDirectInputDevice2_GetDeviceData(joystick->hwdata->InputDevice,
+                                              sizeof(DIDEVICEOBJECTDATA),
+                                              evtbuf, &numevents, 0);
+    }
+
+    /* Handle the events or punt */
+    if (FAILED(result))
+        return;
+
+    for (i = 0; i < (int) numevents; ++i) {
+        int j;
+
+        for (j = 0; j < joystick->hwdata->NumInputs; ++j) {
+            const input_t *in = &joystick->hwdata->Inputs[j];
+
+            if (evtbuf[i].dwOfs != in->ofs)
+                continue;
+
+            switch (in->type) {
+            case AXIS:
+                SDL_PrivateJoystickAxis(joystick, in->num,
+                                        (Sint16) evtbuf[i].dwData);
+                break;
+            case BUTTON:
+                SDL_PrivateJoystickButton(joystick, in->num,
+                                          (Uint8) (evtbuf[i].
+                                                   dwData ? SDL_PRESSED :
+                                                   SDL_RELEASED));
+                break;
+            case HAT:
+                {
+                    Uint8 pos = TranslatePOV(evtbuf[i].dwData);
+                    SDL_PrivateJoystickHat(joystick, in->num, pos);
+                }
+            }
+        }
+    }
+}
+
+
 static Uint8
 TranslatePOV(DWORD value)
 {
@@ -395,147 +609,6 @@
     return 0;
 }
 
-/* Function to update the state of a joystick - called as a device poll.
- * This function shouldn't update the joystick structure directly,
- * but instead should call SDL_PrivateJoystick*() to deliver events
- * and update joystick device state.
- */
-void
-SDL_SYS_JoystickUpdate_Polled(SDL_Joystick * joystick)
-{
-    DIJOYSTATE state;
-    HRESULT result;
-    int i;
-
-    result =
-        IDirectInputDevice2_GetDeviceState(joystick->hwdata->InputDevice,
-                                           sizeof(state), &state);
-    if (result == DIERR_INPUTLOST || result == DIERR_NOTACQUIRED) {
-        IDirectInputDevice2_Acquire(joystick->hwdata->InputDevice);
-        result =
-            IDirectInputDevice2_GetDeviceState(joystick->hwdata->
-                                               InputDevice, sizeof(state),
-                                               &state);
-    }
-
-    /* Set each known axis, button and POV. */
-    for (i = 0; i < joystick->hwdata->NumInputs; ++i) {
-        const input_t *in = &joystick->hwdata->Inputs[i];
-
-        switch (in->type) {
-        case AXIS:
-            switch (in->ofs) {
-            case DIJOFS_X:
-                SDL_PrivateJoystickAxis_Int(joystick, in->num,
-                                            (Sint16) state.lX);
-                break;
-            case DIJOFS_Y:
-                SDL_PrivateJoystickAxis_Int(joystick, in->num,
-                                            (Sint16) state.lY);
-                break;
-            case DIJOFS_Z:
-                SDL_PrivateJoystickAxis_Int(joystick, in->num,
-                                            (Sint16) state.lZ);
-                break;
-            case DIJOFS_RX:
-                SDL_PrivateJoystickAxis_Int(joystick, in->num,
-                                            (Sint16) state.lRx);
-                break;
-            case DIJOFS_RY:
-                SDL_PrivateJoystickAxis_Int(joystick, in->num,
-                                            (Sint16) state.lRy);
-                break;
-            case DIJOFS_RZ:
-                SDL_PrivateJoystickAxis_Int(joystick, in->num,
-                                            (Sint16) state.lRz);
-                break;
-            case DIJOFS_SLIDER(0):
-                SDL_PrivateJoystickAxis_Int(joystick, in->num,
-                                            (Sint16) state.rglSlider[0]);
-                break;
-            case DIJOFS_SLIDER(1):
-                SDL_PrivateJoystickAxis_Int(joystick, in->num,
-                                            (Sint16) state.rglSlider[0]);
-                break;
-            }
-
-            break;
-
-        case BUTTON:
-            SDL_PrivateJoystickButton_Int(joystick, in->num,
-                                          (Uint8) (state.
-                                                   rgbButtons[in->ofs -
-                                                              DIJOFS_BUTTON0]
-                                                   ? SDL_PRESSED :
-                                                   SDL_RELEASED));
-            break;
-        case HAT:
-            {
-                Uint8 pos =
-                    TranslatePOV(state.rgdwPOV[in->ofs - DIJOFS_POV(0)]);
-                SDL_PrivateJoystickHat_Int(joystick, in->num, pos);
-                break;
-            }
-        }
-    }
-}
-
-void
-SDL_SYS_JoystickUpdate_Buffered(SDL_Joystick * joystick)
-{
-    int i;
-    HRESULT result;
-    DWORD numevents;
-    DIDEVICEOBJECTDATA evtbuf[INPUT_QSIZE];
-
-    numevents = INPUT_QSIZE;
-    result =
-        IDirectInputDevice2_GetDeviceData(joystick->hwdata->InputDevice,
-                                          sizeof(DIDEVICEOBJECTDATA),
-                                          evtbuf, &numevents, 0);
-    if (result == DIERR_INPUTLOST || result == DIERR_NOTACQUIRED) {
-        IDirectInputDevice2_Acquire(joystick->hwdata->InputDevice);
-        result =
-            IDirectInputDevice2_GetDeviceData(joystick->hwdata->
-                                              InputDevice,
-                                              sizeof(DIDEVICEOBJECTDATA),
-                                              evtbuf, &numevents, 0);
-    }
-
-    /* Handle the events */
-    if (result != DI_OK)
-        return;
-
-    for (i = 0; i < (int) numevents; ++i) {
-        int j;
-
-        for (j = 0; j < joystick->hwdata->NumInputs; ++j) {
-            const input_t *in = &joystick->hwdata->Inputs[j];
-
-            if (evtbuf[i].dwOfs != in->ofs)
-                continue;
-
-            switch (in->type) {
-            case AXIS:
-                SDL_PrivateJoystickAxis(joystick, in->num,
-                                        (Sint16) evtbuf[i].dwData);
-                break;
-            case BUTTON:
-                SDL_PrivateJoystickButton(joystick, in->num,
-                                          (Uint8) (evtbuf[i].
-                                                   dwData ? SDL_PRESSED
-                                                   : SDL_RELEASED));
-                break;
-            case HAT:
-                {
-                    Uint8 pos = TranslatePOV(evtbuf[i].dwData);
-                    SDL_PrivateJoystickHat(joystick, in->num, pos);
-                }
-            }
-        }
-    }
-}
-
 void
 SDL_SYS_JoystickUpdate(SDL_Joystick * joystick)
 {
@@ -572,7 +645,6 @@
 {
     IDirectInput_Release(dinput);
     dinput = NULL;
-    DX5_Unload();
 }
 
 #endif /* SDL_JOYSTICK_DINPUT */