15 #include "config_wdxdisplay9.h" 18 #define AXIS_RESOLUTION 2000 // use this many levels of resolution by default (could be more if needed and device supported it) 19 #define AXIS_RANGE_CENTERED // if defined, axis range is centered on 0, instead of starting on 0 21 BOOL CALLBACK EnumGameCtrlsCallback(
const DIDEVICEINSTANCE* pdidInstance,
23 DI_DeviceInfos *pDevInfos = (DI_DeviceInfos *)pContext;
25 (*pDevInfos).push_back(*pdidInstance);
27 if(wdxdisplay_cat.is_debug())
28 wdxdisplay_cat.debug() <<
"Found DevType 0x" << (
void*)pdidInstance->dwDevType <<
": " << pdidInstance->tszInstanceName <<
": " << pdidInstance->tszProductName <<endl;
30 return DIENUM_CONTINUE;
33 extern BOOL CALLBACK EnumObjectsCallbackJoystick(
const DIDEVICEOBJECTINSTANCE* pdidoi,VOID* pContext);
35 DInput9Info::DInput9Info() {
38 _JoystickPollTimer = NULL;
41 DInput9Info::~DInput9Info() {
42 for(UINT i=0;i<_DeviceList.size();i++) {
43 _DeviceList[i]->Unacquire();
44 SAFE_RELEASE(_DeviceList[i]);
51 SAFE_RELEASE(_pDInput9);
53 FreeLibrary(_hDInputDLL);
58 bool DInput9Info::InitDirectInput() {
63 #define DLLNAME "dinput9.dll" 64 #define DINPUTCREATE "DirectInput9Create" 66 HINSTANCE _hDInputDLL = LoadLibrary(DLLNAME);
67 if(_hDInputDLL == 0) {
68 wdxdisplay_cat.fatal() <<
"LoadLibrary(" << DLLNAME <<
") failed!, error=" << GetLastError() << endl;
72 typedef HRESULT (WINAPI * LPDIRECTINPUT9CREATE)(HINSTANCE hinst, DWORD dwVersion, REFIID riidltf, LPVOID *ppvOut, LPUNKNOWN punkOuter);
73 LPDIRECTINPUT9CREATE pDInputCreate9;
75 pDInputCreate9 = (LPDIRECTINPUT9CREATE) GetProcAddress(_hDInputDLL,DINPUTCREATE);
76 if(pDInputCreate9 == NULL) {
77 wdxdisplay_cat.fatal() <<
"GetProcAddr failed for " << DINPUTCREATE << endl;
84 if( FAILED( hr = (*pDInputCreate9)(GetModuleHandle(NULL), DIRECTINPUT_VERSION,
85 IID_IDirectInput9, (VOID**)&_pDInput9, NULL ) ) ) {
86 wdxdisplay_cat.error() << DINPUTCREATE <<
"failed" << D3DERRORSTRING(hr);
91 if( FAILED( hr = _pDInput9->EnumDevices(DI9DEVCLASS_GAMECTRL,
92 EnumGameCtrlsCallback,
93 (LPVOID)&_DevInfos, DIEDFL_ATTACHEDONLY ) ) ) {
94 wdxdisplay_cat.error() <<
"EnumDevices failed" << D3DERRORSTRING(hr);
101 bool DInput9Info::CreateJoystickOrPad(HWND _window) {
102 bool bFoundDev =
false;
107 for(;devnum<_DevInfos.size();devnum++) {
108 DWORD devType = GET_DIDEVICE_TYPE(_DevInfos[devnum].dwDevType);
109 if((devType==DI9DEVTYPE_GAMEPAD) ||(devType==DI9DEVTYPE_JOYSTICK)) {
116 wdxdisplay_cat.error() <<
"Cant find an attached Joystick or GamePad!\n";
120 LPDIRECTINPUTDEVICE9 pJoyDevice;
123 HRESULT hr = _pDInput9->CreateDevice(_DevInfos[devnum].guidInstance, &pJoyDevice, NULL );
125 errstr=
"CreateDevice";
129 assert(pJoyDevice!=NULL);
130 _DeviceList.push_back(pJoyDevice);
137 hr = pJoyDevice->SetDataFormat(&c_dfDIJoystick2);
139 errstr=
"SetDataFormat";
144 DX_DECLARE_CLEAN(DIDEVCAPS, DIDevCaps);
145 hr = pJoyDevice->GetCapabilities(&DIDevCaps);
146 assert(SUCCEEDED(hr));
148 _DevCaps.push_back(DIDevCaps);
150 if(wdxdisplay_cat.is_debug())
151 wdxdisplay_cat.debug() <<
"Joy/Pad has " << DIDevCaps.dwAxes <<
" Axes, " << DIDevCaps.dwButtons <<
" Buttons, " << DIDevCaps.dwPOVs <<
" POVs" << endl;
155 hr = pJoyDevice->SetCooperativeLevel( _window, DISCL_EXCLUSIVE | DISCL_FOREGROUND);
157 errstr=
"SetCooperativeLevel";
162 hr = pJoyDevice->EnumObjects(EnumObjectsCallbackJoystick, (LPVOID)pJoyDevice, DIDFT_AXIS);
164 errstr=
"EnumObjects";
171 wdxdisplay_cat.error() << errstr <<
" failed for (" << _DevInfos[devnum].tszInstanceName <<
":" << _DevInfos[devnum].tszProductName <<
")" << D3DERRORSTRING(hr);
181 BOOL CALLBACK EnumObjectsCallbackJoystick(
const DIDEVICEOBJECTINSTANCE* pdidoi,
184 LPDIRECTINPUTDEVICE9 pJoyDevice = (LPDIRECTINPUTDEVICE9) pContext;
189 if( pdidoi->dwType & DIDFT_AXIS ) {
191 diprg.diph.dwSize =
sizeof(DIPROPRANGE);
192 diprg.diph.dwHeaderSize =
sizeof(DIPROPHEADER);
193 diprg.diph.dwHow = DIPH_BYID;
194 diprg.diph.dwObj = pdidoi->dwType;
196 #ifdef AXIS_RANGE_CENTERED 197 diprg.lMin = -AXIS_RESOLUTION/2;
198 diprg.lMax = +AXIS_RESOLUTION/2;
201 diprg.lMax = +AXIS_RESOLUTION;
205 hr = pJoyDevice->SetProperty( DIPROP_RANGE, &diprg.diph);
207 wdxdisplay_cat.error() <<
"SetProperty on axis failed" << D3DERRORSTRING(hr);
212 return DIENUM_CONTINUE;
215 bool DInput9Info::ReadJoystick(
int devnum, DIJOYSTATE2 &js) {
216 LPDIRECTINPUTDEVICE9 pJoystick = _DeviceList[devnum];
217 assert(pJoystick!=NULL);
223 hr = pJoystick->Poll();
231 if((hr==DIERR_NOTACQUIRED)||(hr == DIERR_INPUTLOST)) {
232 hr = pJoystick->Acquire();
235 if(wdxdisplay_cat.is_spam())
236 wdxdisplay_cat.spam() <<
"Acquire failed" << D3DERRORSTRING(hr);
244 hr = pJoystick->Poll();
247 errstr =
"Poll after successful Acquire failed";
251 errstr =
"Unknown Poll failure";
259 hr = pJoystick->GetDeviceState(
sizeof(DIJOYSTATE2), &js);
261 errstr =
"GetDeviceState failed";
268 wdxdisplay_cat.fatal() << errstr << D3DERRORSTRING(hr);