forked from dolphin-emu/dolphin
		
	The SDL backend crashes when you close a joystick after SDL_Quit has been called. Some backends don't need to be shutdown and re-initialized everytime, we can just ask to enumerate devices again.
		
			
				
	
	
		
			162 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // Copyright 2010 Dolphin Emulator Project
 | |
| // Licensed under GPLv2+
 | |
| // Refer to the license.txt file included.
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <list>
 | |
| 
 | |
| #include <SDL.h>
 | |
| 
 | |
| #if SDL_VERSION_ATLEAST(1, 3, 0)
 | |
| #define USE_SDL_HAPTIC
 | |
| #endif
 | |
| 
 | |
| #ifdef USE_SDL_HAPTIC
 | |
| #include <SDL_haptic.h>
 | |
| #endif
 | |
| 
 | |
| namespace ciface
 | |
| {
 | |
| namespace SDL
 | |
| {
 | |
| void Init();
 | |
| void PopulateDevices();
 | |
| 
 | |
| class Joystick : public Core::Device
 | |
| {
 | |
| private:
 | |
|   class Button : public Core::Device::Input
 | |
|   {
 | |
|   public:
 | |
|     std::string GetName() const override;
 | |
|     Button(u8 index, SDL_Joystick* js) : m_js(js), m_index(index) {}
 | |
|     ControlState GetState() const override;
 | |
| 
 | |
|   private:
 | |
|     SDL_Joystick* const m_js;
 | |
|     const u8 m_index;
 | |
|   };
 | |
| 
 | |
|   class Axis : public Core::Device::Input
 | |
|   {
 | |
|   public:
 | |
|     std::string GetName() const override;
 | |
|     Axis(u8 index, SDL_Joystick* js, Sint16 range) : m_js(js), m_range(range), m_index(index) {}
 | |
|     ControlState GetState() const override;
 | |
| 
 | |
|   private:
 | |
|     SDL_Joystick* const m_js;
 | |
|     const Sint16 m_range;
 | |
|     const u8 m_index;
 | |
|   };
 | |
| 
 | |
|   class Hat : public Input
 | |
|   {
 | |
|   public:
 | |
|     std::string GetName() const override;
 | |
|     Hat(u8 index, SDL_Joystick* js, u8 direction) : m_js(js), m_direction(direction), m_index(index)
 | |
|     {
 | |
|     }
 | |
|     ControlState GetState() const override;
 | |
| 
 | |
|   private:
 | |
|     SDL_Joystick* const m_js;
 | |
|     const u8 m_direction;
 | |
|     const u8 m_index;
 | |
|   };
 | |
| 
 | |
| #ifdef USE_SDL_HAPTIC
 | |
|   class HapticEffect : public Output
 | |
|   {
 | |
|   public:
 | |
|     HapticEffect(SDL_Haptic* haptic) : m_haptic(haptic), m_id(-1) {}
 | |
|     ~HapticEffect()
 | |
|     {
 | |
|       m_effect.type = 0;
 | |
|       Update();
 | |
|     }
 | |
| 
 | |
|   protected:
 | |
|     void Update();
 | |
|     virtual void SetSDLHapticEffect(ControlState state) = 0;
 | |
| 
 | |
|     SDL_HapticEffect m_effect;
 | |
|     SDL_Haptic* m_haptic;
 | |
|     int m_id;
 | |
| 
 | |
|   private:
 | |
|     virtual void SetState(ControlState state) override final;
 | |
|   };
 | |
| 
 | |
|   class ConstantEffect : public HapticEffect
 | |
|   {
 | |
|   public:
 | |
|     ConstantEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
 | |
|     std::string GetName() const override;
 | |
| 
 | |
|   private:
 | |
|     void SetSDLHapticEffect(ControlState state) override;
 | |
|   };
 | |
| 
 | |
|   class RampEffect : public HapticEffect
 | |
|   {
 | |
|   public:
 | |
|     RampEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
 | |
|     std::string GetName() const override;
 | |
| 
 | |
|   private:
 | |
|     void SetSDLHapticEffect(ControlState state) override;
 | |
|   };
 | |
| 
 | |
|   class SineEffect : public HapticEffect
 | |
|   {
 | |
|   public:
 | |
|     SineEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
 | |
|     std::string GetName() const override;
 | |
| 
 | |
|   private:
 | |
|     void SetSDLHapticEffect(ControlState state) override;
 | |
|   };
 | |
| 
 | |
|   class TriangleEffect : public HapticEffect
 | |
|   {
 | |
|   public:
 | |
|     TriangleEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
 | |
|     std::string GetName() const override;
 | |
| 
 | |
|   private:
 | |
|     void SetSDLHapticEffect(ControlState state) override;
 | |
|   };
 | |
| 
 | |
|   class LeftRightEffect : public HapticEffect
 | |
|   {
 | |
|   public:
 | |
|     LeftRightEffect(SDL_Haptic* haptic) : HapticEffect(haptic) {}
 | |
|     std::string GetName() const override;
 | |
| 
 | |
|   private:
 | |
|     void SetSDLHapticEffect(ControlState state) override;
 | |
|   };
 | |
| #endif
 | |
| 
 | |
| public:
 | |
|   void UpdateInput() override;
 | |
| 
 | |
|   Joystick(SDL_Joystick* const joystick, const int sdl_index);
 | |
|   ~Joystick();
 | |
| 
 | |
|   std::string GetName() const override;
 | |
|   std::string GetSource() const override;
 | |
| 
 | |
| private:
 | |
|   SDL_Joystick* const m_joystick;
 | |
|   const int m_sdl_index;
 | |
| 
 | |
| #ifdef USE_SDL_HAPTIC
 | |
|   SDL_Haptic* m_haptic;
 | |
| #endif
 | |
| };
 | |
| }
 | |
| }
 |