Cemu/src/input/api/DirectInput/DirectInputController.h
2025-11-21 22:18:14 +01:00

50 lines
1.3 KiB
C++

#pragma once
#include "input/api/DirectInput/DirectInputControllerProvider.h"
#include "input/api/Controller.h"
#include <wrl/client.h>
class DirectInputController : public Controller<DirectInputControllerProvider>
{
public:
DirectInputController(const GUID& guid);
DirectInputController(const GUID& guid, std::string_view display_name);
~DirectInputController() override;
std::string_view api_name() const override
{
static_assert(to_string(InputAPI::DirectInput) == "DirectInput");
return to_string(InputAPI::DirectInput);
}
InputAPI::Type api() const override { return InputAPI::DirectInput; }
void save(pugi::xml_node& node) override;
void load(const pugi::xml_node& node) override;
bool connect() override;
bool is_connected() override;
bool has_rumble() override;
void start_rumble() override;
void stop_rumble() override;
std::string get_button_name(uint64 button) const override;
const GUID& get_guid() const { return m_guid; }
const GUID& get_product_guid() const { return m_product_guid; }
protected:
ControllerState raw_state() override;
private:
GUID m_guid;
GUID m_product_guid{};
std::shared_mutex m_mutex;
Microsoft::WRL::ComPtr<IDirectInputDevice8W> m_device;
Microsoft::WRL::ComPtr<IDirectInputEffect> m_effect;
std::array<LONG, 6> m_min_axis{};
std::array<LONG, 6> m_max_axis{};
};