// This is the main DLL file.

#include "stdafx.h"

#include "XInput.h"
#include "XInputDotNET.h"

#pragma comment(lib, "XInput.lib")

using namespace XInputDotNET;

GamePad* XInput::GetPadState(int nUserIdx)
{
	static XINPUT_STATE st;
	if (XInputGetState(nUserIdx, &st) != ERROR_SUCCESS)
		return NULL;

	GamePad* gp = new GamePad();
	gp->dwPacketNumber = st.dwPacketNumber;
	gp->bLeftTrigger = st.Gamepad.bLeftTrigger;
	gp->bRightTrigger = st.Gamepad.bRightTrigger;
	gp->wButtons = st.Gamepad.wButtons;
	gp->sThumbLX = st.Gamepad.sThumbLX;
	gp->sThumbRX = st.Gamepad.sThumbRX;
	gp->sThumbLY = st.Gamepad.sThumbLY;
	gp->sThumbRY = st.Gamepad.sThumbRY;
	return gp;
}

HeadSetDevice* XInput::GetAudio(int nUserIdx)
{
	static GUID soundOut, soundIn;
	if (XInputGetDSoundAudioDeviceGuids(nUserIdx, &soundOut, &soundIn) != ERROR_SUCCESS)
		return NULL;

	HeadSetDevice* dev = new HeadSetDevice();
	dev->guidHeadphones = Guid(soundOut.Data1, soundOut.Data2, soundOut.Data3, 
									soundOut.Data4[0], soundOut.Data4[1], soundOut.Data4[2], soundOut.Data4[3], 
									soundOut.Data4[4], soundOut.Data4[5], soundOut.Data4[6], soundOut.Data4[7]);
	dev->guidMicrophone = Guid(soundIn.Data1, soundIn.Data2, soundIn.Data3, 
									soundIn.Data4[0], soundIn.Data4[1], soundIn.Data4[2], soundIn.Data4[3], 
									soundIn.Data4[4], soundIn.Data4[5], soundIn.Data4[6], soundIn.Data4[7]);
	return dev;
}

bool XInput::SetVibration(int nUserIdx, float fLowFreqMotorSpeed, float fHiFreqMotorSpeed)
{
	return SetVibration(nUserIdx, (int)(65535.0f*fLowFreqMotorSpeed), (int)(65535.0f*fHiFreqMotorSpeed));
}

bool XInput::SetVibration(int nUserIdx, int wLowFreqMotorSpeed, int wHiFreqMotorSpeed)
{
	static XINPUT_VIBRATION vib;
	vib.wLeftMotorSpeed = wLowFreqMotorSpeed;
	vib.wRightMotorSpeed = wHiFreqMotorSpeed;
	return (XInputSetState(nUserIdx, &vib) == ERROR_SUCCESS);
}
