2015-05-24 06:32:32 +02:00
// Copyright 2010 Dolphin Emulator Project
// Licensed under GPLv2+
// Refer to the license.txt file included.
2013-10-19 02:27:57 -07:00
// XInput suffers a similar issue as XAudio2. Since Win8, it is part of the OS.
// However, unlike XAudio2 they have not made the API incompatible - so we just
// compile against the latest version and fall back to dynamically loading the
// old DLL.
2014-02-10 13:54:46 -05:00
#pragma once
2010-04-02 02:48:24 +00:00
2016-06-24 10:43:46 +02:00
#include <windows.h>
2017-01-22 23:08:45 -08:00
#include <XInput.h>
2010-04-02 02:48:24 +00:00
2016-06-12 17:08:04 +02:00
#include "InputCommon/ControllerInterface/ControllerInterface.h"
2014-02-19 02:17:31 +01:00
2013-10-19 02:27:57 -07:00
#ifndef XINPUT_DEVSUBTYPE_FLIGHT_STICK
#error You are building this module against the wrong version of DirectX. You probably need to remove DXSDK_DIR from your include path and/or _WIN32_WINNT is wrong.
#endif
2010-04-02 02:48:24 +00:00
namespace ciface
{
namespace XInput
{
2016-06-12 17:08:04 +02:00
void Init ();
2016-10-16 13:39:05 -07:00
void PopulateDevices ();
2013-10-19 02:27:57 -07:00
void DeInit ();
2010-04-02 02:48:24 +00:00
2013-06-16 20:07:10 -04:00
class Device : public Core :: Device
2010-04-02 02:48:24 +00:00
{
2011-03-14 01:20:11 +00:00
private :
2016-06-24 10:43:46 +02:00
class Button : public Core :: Device :: Input
{
public :
Button ( u8 index , const WORD & buttons ) : m_buttons ( buttons ), m_index ( index ) {}
std :: string GetName () const override ;
ControlState GetState () const override ;
2010-04-02 02:48:24 +00:00
2016-06-24 10:43:46 +02:00
private :
const WORD & m_buttons ;
u8 m_index ;
};
2010-04-02 02:48:24 +00:00
2016-06-24 10:43:46 +02:00
class Axis : public Core :: Device :: Input
{
public :
Axis ( u8 index , const SHORT & axis , SHORT range ) : m_axis ( axis ), m_range ( range ), m_index ( index ) {}
std :: string GetName () const override ;
ControlState GetState () const override ;
2010-04-02 02:48:24 +00:00
2016-06-24 10:43:46 +02:00
private :
const SHORT & m_axis ;
const SHORT m_range ;
const u8 m_index ;
};
class Trigger : public Core :: Device :: Input
{
public :
Trigger ( u8 index , const BYTE & trigger , BYTE range )
: m_trigger ( trigger ), m_range ( range ), m_index ( index )
{
}
std :: string GetName () const override ;
ControlState GetState () const override ;
private :
const BYTE & m_trigger ;
const BYTE m_range ;
const u8 m_index ;
};
class Motor : public Core :: Device :: Output
{
public :
Motor ( u8 index , Device * parent , WORD & motor , WORD range )
: m_motor ( motor ), m_range ( range ), m_index ( index ), m_parent ( parent )
{
}
std :: string GetName () const override ;
void SetState ( ControlState state ) override ;
private :
WORD & m_motor ;
const WORD m_range ;
const u8 m_index ;
Device * m_parent ;
};
2010-04-02 02:48:24 +00:00
2011-03-14 01:20:11 +00:00
public :
2016-06-24 10:43:46 +02:00
void UpdateInput () override ;
2010-04-02 02:48:24 +00:00
2016-06-24 10:43:46 +02:00
Device ( const XINPUT_CAPABILITIES & capabilities , u8 index );
2010-04-02 02:48:24 +00:00
2016-06-24 10:43:46 +02:00
std :: string GetName () const override ;
std :: string GetSource () const override ;
2010-04-02 02:48:24 +00:00
2016-06-24 10:43:46 +02:00
void UpdateMotors ();
2014-11-13 01:10:55 -08:00
2010-04-02 02:48:24 +00:00
private :
2016-06-24 10:43:46 +02:00
XINPUT_STATE m_state_in ;
XINPUT_VIBRATION m_state_out {};
XINPUT_VIBRATION m_current_state_out {};
const BYTE m_subtype ;
const u8 m_index ;
2010-04-02 02:48:24 +00:00
};
}
}