mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-10-06 18:06:26 +00:00
Update for SDL3 coding style (#6717)
I updated .clang-format and ran clang-format 14 over the src and test directories to standardize the code base. In general I let clang-format have it's way, and added markup to prevent formatting of code that would break or be completely unreadable if formatted. The script I ran for the src directory is added as build-scripts/clang-format-src.sh This fixes: #6592 #6593 #6594
This commit is contained in:
@@ -27,15 +27,14 @@
|
||||
/* Global for SDL_windowshaptic.c */
|
||||
#if (defined(SDL_HAPTIC_DINPUT) && SDL_HAPTIC_DINPUT) || (defined(SDL_HAPTIC_XINPUT) && SDL_HAPTIC_XINPUT)
|
||||
SDL_Haptic *SDL_haptics = NULL;
|
||||
#else
|
||||
#else
|
||||
static SDL_Haptic *SDL_haptics = NULL;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Initializes the Haptic devices.
|
||||
*/
|
||||
int
|
||||
SDL_HapticInit(void)
|
||||
int SDL_HapticInit(void)
|
||||
{
|
||||
int status;
|
||||
|
||||
@@ -47,12 +46,10 @@ SDL_HapticInit(void)
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Checks to see if the haptic device is valid
|
||||
*/
|
||||
static int
|
||||
ValidHaptic(SDL_Haptic * haptic)
|
||||
static int ValidHaptic(SDL_Haptic *haptic)
|
||||
{
|
||||
int valid;
|
||||
SDL_Haptic *hapticlist;
|
||||
@@ -60,7 +57,7 @@ ValidHaptic(SDL_Haptic * haptic)
|
||||
valid = 0;
|
||||
if (haptic != NULL) {
|
||||
hapticlist = SDL_haptics;
|
||||
while ( hapticlist ) {
|
||||
while (hapticlist) {
|
||||
if (hapticlist == haptic) {
|
||||
valid = 1;
|
||||
break;
|
||||
@@ -77,17 +74,14 @@ ValidHaptic(SDL_Haptic * haptic)
|
||||
return valid;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns the number of available devices.
|
||||
*/
|
||||
int
|
||||
SDL_NumHaptics(void)
|
||||
int SDL_NumHaptics(void)
|
||||
{
|
||||
return SDL_SYS_NumHaptics();
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Gets the name of a Haptic device by index.
|
||||
*/
|
||||
@@ -102,7 +96,6 @@ SDL_HapticName(int device_index)
|
||||
return SDL_SYS_HapticName(device_index);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Opens a Haptic device.
|
||||
*/
|
||||
@@ -120,9 +113,9 @@ SDL_HapticOpen(int device_index)
|
||||
|
||||
hapticlist = SDL_haptics;
|
||||
/* If the haptic is already open, return it
|
||||
* TODO: Should we create haptic instance IDs like the Joystick API?
|
||||
*/
|
||||
while ( hapticlist ) {
|
||||
* TODO: Should we create haptic instance IDs like the Joystick API?
|
||||
*/
|
||||
while (hapticlist) {
|
||||
if (device_index == hapticlist->index) {
|
||||
haptic = hapticlist;
|
||||
++haptic->ref_count;
|
||||
@@ -132,7 +125,7 @@ SDL_HapticOpen(int device_index)
|
||||
}
|
||||
|
||||
/* Create the haptic device */
|
||||
haptic = (SDL_Haptic *) SDL_malloc((sizeof *haptic));
|
||||
haptic = (SDL_Haptic *)SDL_malloc((sizeof *haptic));
|
||||
if (haptic == NULL) {
|
||||
SDL_OutOfMemory();
|
||||
return NULL;
|
||||
@@ -164,12 +157,10 @@ SDL_HapticOpen(int device_index)
|
||||
return haptic;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns 1 if the device has been opened.
|
||||
*/
|
||||
int
|
||||
SDL_HapticOpened(int device_index)
|
||||
int SDL_HapticOpened(int device_index)
|
||||
{
|
||||
int opened;
|
||||
SDL_Haptic *hapticlist;
|
||||
@@ -184,8 +175,8 @@ SDL_HapticOpened(int device_index)
|
||||
opened = 0;
|
||||
hapticlist = SDL_haptics;
|
||||
/* TODO Should this use an instance ID? */
|
||||
while ( hapticlist ) {
|
||||
if (hapticlist->index == (Uint8) device_index) {
|
||||
while (hapticlist) {
|
||||
if (hapticlist->index == (Uint8)device_index) {
|
||||
opened = 1;
|
||||
break;
|
||||
}
|
||||
@@ -194,12 +185,10 @@ SDL_HapticOpened(int device_index)
|
||||
return opened;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns the index to a haptic device.
|
||||
*/
|
||||
int
|
||||
SDL_HapticIndex(SDL_Haptic * haptic)
|
||||
int SDL_HapticIndex(SDL_Haptic *haptic)
|
||||
{
|
||||
if (!ValidHaptic(haptic)) {
|
||||
return -1;
|
||||
@@ -208,12 +197,10 @@ SDL_HapticIndex(SDL_Haptic * haptic)
|
||||
return haptic->index;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns SDL_TRUE if mouse is haptic, SDL_FALSE if it isn't.
|
||||
*/
|
||||
int
|
||||
SDL_MouseIsHaptic(void)
|
||||
int SDL_MouseIsHaptic(void)
|
||||
{
|
||||
if (SDL_SYS_HapticMouse() < 0) {
|
||||
return SDL_FALSE;
|
||||
@@ -221,7 +208,6 @@ SDL_MouseIsHaptic(void)
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns the haptic device if mouse is haptic or NULL elsewise.
|
||||
*/
|
||||
@@ -240,12 +226,10 @@ SDL_HapticOpenFromMouse(void)
|
||||
return SDL_HapticOpen(device_index);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns SDL_TRUE if joystick has haptic features.
|
||||
*/
|
||||
int
|
||||
SDL_JoystickIsHaptic(SDL_Joystick * joystick)
|
||||
int SDL_JoystickIsHaptic(SDL_Joystick *joystick)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@@ -264,12 +248,11 @@ SDL_JoystickIsHaptic(SDL_Joystick * joystick)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Opens a haptic device from a joystick.
|
||||
*/
|
||||
SDL_Haptic *
|
||||
SDL_HapticOpenFromJoystick(SDL_Joystick * joystick)
|
||||
SDL_HapticOpenFromJoystick(SDL_Joystick *joystick)
|
||||
{
|
||||
SDL_Haptic *haptic;
|
||||
SDL_Haptic *hapticlist;
|
||||
@@ -295,7 +278,7 @@ SDL_HapticOpenFromJoystick(SDL_Joystick * joystick)
|
||||
|
||||
hapticlist = SDL_haptics;
|
||||
/* Check to see if joystick's haptic is already open */
|
||||
while ( hapticlist ) {
|
||||
while (hapticlist) {
|
||||
if (SDL_SYS_JoystickSameHaptic(hapticlist, joystick)) {
|
||||
haptic = hapticlist;
|
||||
++haptic->ref_count;
|
||||
@@ -305,7 +288,7 @@ SDL_HapticOpenFromJoystick(SDL_Joystick * joystick)
|
||||
}
|
||||
|
||||
/* Create the haptic device */
|
||||
haptic = (SDL_Haptic *) SDL_malloc((sizeof *haptic));
|
||||
haptic = (SDL_Haptic *)SDL_malloc((sizeof *haptic));
|
||||
if (haptic == NULL) {
|
||||
SDL_OutOfMemory();
|
||||
return NULL;
|
||||
@@ -329,12 +312,10 @@ SDL_HapticOpenFromJoystick(SDL_Joystick * joystick)
|
||||
return haptic;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Closes a SDL_Haptic device.
|
||||
*/
|
||||
void
|
||||
SDL_HapticClose(SDL_Haptic * haptic)
|
||||
void SDL_HapticClose(SDL_Haptic *haptic)
|
||||
{
|
||||
int i;
|
||||
SDL_Haptic *hapticlist;
|
||||
@@ -361,9 +342,9 @@ SDL_HapticClose(SDL_Haptic * haptic)
|
||||
/* Remove from the list */
|
||||
hapticlist = SDL_haptics;
|
||||
hapticlistprev = NULL;
|
||||
while ( hapticlist ) {
|
||||
while (hapticlist) {
|
||||
if (haptic == hapticlist) {
|
||||
if ( hapticlistprev ) {
|
||||
if (hapticlistprev) {
|
||||
/* unlink this entry */
|
||||
hapticlistprev->next = hapticlist->next;
|
||||
} else {
|
||||
@@ -383,8 +364,7 @@ SDL_HapticClose(SDL_Haptic * haptic)
|
||||
/*
|
||||
* Cleans up after the subsystem.
|
||||
*/
|
||||
void
|
||||
SDL_HapticQuit(void)
|
||||
void SDL_HapticQuit(void)
|
||||
{
|
||||
while (SDL_haptics) {
|
||||
SDL_HapticClose(SDL_haptics);
|
||||
@@ -396,8 +376,7 @@ SDL_HapticQuit(void)
|
||||
/*
|
||||
* Returns the number of effects a haptic device has.
|
||||
*/
|
||||
int
|
||||
SDL_HapticNumEffects(SDL_Haptic * haptic)
|
||||
int SDL_HapticNumEffects(SDL_Haptic *haptic)
|
||||
{
|
||||
if (!ValidHaptic(haptic)) {
|
||||
return -1;
|
||||
@@ -406,12 +385,10 @@ SDL_HapticNumEffects(SDL_Haptic * haptic)
|
||||
return haptic->neffects;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns the number of effects a haptic device can play.
|
||||
*/
|
||||
int
|
||||
SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic)
|
||||
int SDL_HapticNumEffectsPlaying(SDL_Haptic *haptic)
|
||||
{
|
||||
if (!ValidHaptic(haptic)) {
|
||||
return -1;
|
||||
@@ -420,12 +397,11 @@ SDL_HapticNumEffectsPlaying(SDL_Haptic * haptic)
|
||||
return haptic->nplaying;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns supported effects by the device.
|
||||
*/
|
||||
unsigned int
|
||||
SDL_HapticQuery(SDL_Haptic * haptic)
|
||||
SDL_HapticQuery(SDL_Haptic *haptic)
|
||||
{
|
||||
if (!ValidHaptic(haptic)) {
|
||||
return 0; /* same as if no effects were supported */
|
||||
@@ -434,12 +410,10 @@ SDL_HapticQuery(SDL_Haptic * haptic)
|
||||
return haptic->supported;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Returns the number of axis on the device.
|
||||
*/
|
||||
int
|
||||
SDL_HapticNumAxes(SDL_Haptic * haptic)
|
||||
int SDL_HapticNumAxes(SDL_Haptic *haptic)
|
||||
{
|
||||
if (!ValidHaptic(haptic)) {
|
||||
return -1;
|
||||
@@ -451,8 +425,7 @@ SDL_HapticNumAxes(SDL_Haptic * haptic)
|
||||
/*
|
||||
* Checks to see if the device can support the effect.
|
||||
*/
|
||||
int
|
||||
SDL_HapticEffectSupported(SDL_Haptic * haptic, SDL_HapticEffect * effect)
|
||||
int SDL_HapticEffectSupported(SDL_Haptic *haptic, SDL_HapticEffect *effect)
|
||||
{
|
||||
if (!ValidHaptic(haptic)) {
|
||||
return -1;
|
||||
@@ -467,8 +440,7 @@ SDL_HapticEffectSupported(SDL_Haptic * haptic, SDL_HapticEffect * effect)
|
||||
/*
|
||||
* Creates a new haptic effect.
|
||||
*/
|
||||
int
|
||||
SDL_HapticNewEffect(SDL_Haptic * haptic, SDL_HapticEffect * effect)
|
||||
int SDL_HapticNewEffect(SDL_Haptic *haptic, SDL_HapticEffect *effect)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -487,9 +459,8 @@ SDL_HapticNewEffect(SDL_Haptic * haptic, SDL_HapticEffect * effect)
|
||||
if (haptic->effects[i].hweffect == NULL) {
|
||||
|
||||
/* Now let the backend create the real effect */
|
||||
if (SDL_SYS_HapticNewEffect(haptic, &haptic->effects[i], effect)
|
||||
!= 0) {
|
||||
return -1; /* Backend failed to create effect */
|
||||
if (SDL_SYS_HapticNewEffect(haptic, &haptic->effects[i], effect) != 0) {
|
||||
return -1; /* Backend failed to create effect */
|
||||
}
|
||||
|
||||
SDL_memcpy(&haptic->effects[i].effect, effect,
|
||||
@@ -504,8 +475,7 @@ SDL_HapticNewEffect(SDL_Haptic * haptic, SDL_HapticEffect * effect)
|
||||
/*
|
||||
* Checks to see if an effect is valid.
|
||||
*/
|
||||
static int
|
||||
ValidEffect(SDL_Haptic * haptic, int effect)
|
||||
static int ValidEffect(SDL_Haptic *haptic, int effect)
|
||||
{
|
||||
if ((effect < 0) || (effect >= haptic->neffects)) {
|
||||
SDL_SetError("Haptic: Invalid effect identifier.");
|
||||
@@ -517,9 +487,8 @@ ValidEffect(SDL_Haptic * haptic, int effect)
|
||||
/*
|
||||
* Updates an effect.
|
||||
*/
|
||||
int
|
||||
SDL_HapticUpdateEffect(SDL_Haptic * haptic, int effect,
|
||||
SDL_HapticEffect * data)
|
||||
int SDL_HapticUpdateEffect(SDL_Haptic *haptic, int effect,
|
||||
SDL_HapticEffect *data)
|
||||
{
|
||||
if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {
|
||||
return -1;
|
||||
@@ -541,20 +510,17 @@ SDL_HapticUpdateEffect(SDL_Haptic * haptic, int effect,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Runs the haptic effect on the device.
|
||||
*/
|
||||
int
|
||||
SDL_HapticRunEffect(SDL_Haptic * haptic, int effect, Uint32 iterations)
|
||||
int SDL_HapticRunEffect(SDL_Haptic *haptic, int effect, Uint32 iterations)
|
||||
{
|
||||
if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Run the effect */
|
||||
if (SDL_SYS_HapticRunEffect(haptic, &haptic->effects[effect], iterations)
|
||||
< 0) {
|
||||
if (SDL_SYS_HapticRunEffect(haptic, &haptic->effects[effect], iterations) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -564,8 +530,7 @@ SDL_HapticRunEffect(SDL_Haptic * haptic, int effect, Uint32 iterations)
|
||||
/*
|
||||
* Stops the haptic effect on the device.
|
||||
*/
|
||||
int
|
||||
SDL_HapticStopEffect(SDL_Haptic * haptic, int effect)
|
||||
int SDL_HapticStopEffect(SDL_Haptic *haptic, int effect)
|
||||
{
|
||||
if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {
|
||||
return -1;
|
||||
@@ -582,8 +547,7 @@ SDL_HapticStopEffect(SDL_Haptic * haptic, int effect)
|
||||
/*
|
||||
* Gets rid of a haptic effect.
|
||||
*/
|
||||
void
|
||||
SDL_HapticDestroyEffect(SDL_Haptic * haptic, int effect)
|
||||
void SDL_HapticDestroyEffect(SDL_Haptic *haptic, int effect)
|
||||
{
|
||||
if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {
|
||||
return;
|
||||
@@ -600,8 +564,7 @@ SDL_HapticDestroyEffect(SDL_Haptic * haptic, int effect)
|
||||
/*
|
||||
* Gets the status of a haptic effect.
|
||||
*/
|
||||
int
|
||||
SDL_HapticGetEffectStatus(SDL_Haptic * haptic, int effect)
|
||||
int SDL_HapticGetEffectStatus(SDL_Haptic *haptic, int effect)
|
||||
{
|
||||
if (!ValidHaptic(haptic) || !ValidEffect(haptic, effect)) {
|
||||
return -1;
|
||||
@@ -617,8 +580,7 @@ SDL_HapticGetEffectStatus(SDL_Haptic * haptic, int effect)
|
||||
/*
|
||||
* Sets the global gain of the device.
|
||||
*/
|
||||
int
|
||||
SDL_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
int SDL_HapticSetGain(SDL_Haptic *haptic, int gain)
|
||||
{
|
||||
const char *env;
|
||||
int real_gain, max_gain;
|
||||
@@ -663,8 +625,7 @@ SDL_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
/*
|
||||
* Makes the device autocenter, 0 disables.
|
||||
*/
|
||||
int
|
||||
SDL_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
int SDL_HapticSetAutocenter(SDL_Haptic *haptic, int autocenter)
|
||||
{
|
||||
if (!ValidHaptic(haptic)) {
|
||||
return -1;
|
||||
@@ -688,8 +649,7 @@ SDL_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
/*
|
||||
* Pauses the haptic device.
|
||||
*/
|
||||
int
|
||||
SDL_HapticPause(SDL_Haptic * haptic)
|
||||
int SDL_HapticPause(SDL_Haptic *haptic)
|
||||
{
|
||||
if (!ValidHaptic(haptic)) {
|
||||
return -1;
|
||||
@@ -705,15 +665,14 @@ SDL_HapticPause(SDL_Haptic * haptic)
|
||||
/*
|
||||
* Unpauses the haptic device.
|
||||
*/
|
||||
int
|
||||
SDL_HapticUnpause(SDL_Haptic * haptic)
|
||||
int SDL_HapticUnpause(SDL_Haptic *haptic)
|
||||
{
|
||||
if (!ValidHaptic(haptic)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((haptic->supported & SDL_HAPTIC_PAUSE) == 0) {
|
||||
return 0; /* Not going to be paused, so we pretend it's unpaused. */
|
||||
return 0; /* Not going to be paused, so we pretend it's unpaused. */
|
||||
}
|
||||
|
||||
return SDL_SYS_HapticUnpause(haptic);
|
||||
@@ -722,8 +681,7 @@ SDL_HapticUnpause(SDL_Haptic * haptic)
|
||||
/*
|
||||
* Stops all the currently playing effects.
|
||||
*/
|
||||
int
|
||||
SDL_HapticStopAll(SDL_Haptic * haptic)
|
||||
int SDL_HapticStopAll(SDL_Haptic *haptic)
|
||||
{
|
||||
if (!ValidHaptic(haptic)) {
|
||||
return -1;
|
||||
@@ -735,8 +693,7 @@ SDL_HapticStopAll(SDL_Haptic * haptic)
|
||||
/*
|
||||
* Checks to see if rumble is supported.
|
||||
*/
|
||||
int
|
||||
SDL_HapticRumbleSupported(SDL_Haptic * haptic)
|
||||
int SDL_HapticRumbleSupported(SDL_Haptic *haptic)
|
||||
{
|
||||
if (!ValidHaptic(haptic)) {
|
||||
return -1;
|
||||
@@ -749,8 +706,7 @@ SDL_HapticRumbleSupported(SDL_Haptic * haptic)
|
||||
/*
|
||||
* Initializes the haptic device for simple rumble playback.
|
||||
*/
|
||||
int
|
||||
SDL_HapticRumbleInit(SDL_Haptic * haptic)
|
||||
int SDL_HapticRumbleInit(SDL_Haptic *haptic)
|
||||
{
|
||||
SDL_HapticEffect *efx = &haptic->rumble_effect;
|
||||
|
||||
@@ -772,7 +728,7 @@ SDL_HapticRumbleInit(SDL_Haptic * haptic)
|
||||
efx->periodic.length = 5000;
|
||||
efx->periodic.attack_length = 0;
|
||||
efx->periodic.fade_length = 0;
|
||||
} else if (haptic->supported & SDL_HAPTIC_LEFTRIGHT) { /* XInput? */
|
||||
} else if (haptic->supported & SDL_HAPTIC_LEFTRIGHT) { /* XInput? */
|
||||
efx->type = SDL_HAPTIC_LEFTRIGHT;
|
||||
efx->leftright.length = 5000;
|
||||
efx->leftright.large_magnitude = 0x4000;
|
||||
@@ -791,8 +747,7 @@ SDL_HapticRumbleInit(SDL_Haptic * haptic)
|
||||
/*
|
||||
* Runs simple rumble on a haptic device
|
||||
*/
|
||||
int
|
||||
SDL_HapticRumblePlay(SDL_Haptic * haptic, float strength, Uint32 length)
|
||||
int SDL_HapticRumblePlay(SDL_Haptic *haptic, float strength, Uint32 length)
|
||||
{
|
||||
SDL_HapticEffect *efx;
|
||||
Sint16 magnitude;
|
||||
@@ -811,7 +766,7 @@ SDL_HapticRumblePlay(SDL_Haptic * haptic, float strength, Uint32 length)
|
||||
} else if (strength < 0.0f) {
|
||||
strength = 0.0f;
|
||||
}
|
||||
magnitude = (Sint16)(32767.0f*strength);
|
||||
magnitude = (Sint16)(32767.0f * strength);
|
||||
|
||||
efx = &haptic->rumble_effect;
|
||||
if (efx->type == SDL_HAPTIC_SINE) {
|
||||
@@ -834,8 +789,7 @@ SDL_HapticRumblePlay(SDL_Haptic * haptic, float strength, Uint32 length)
|
||||
/*
|
||||
* Stops the simple rumble on a haptic device.
|
||||
*/
|
||||
int
|
||||
SDL_HapticRumbleStop(SDL_Haptic * haptic)
|
||||
int SDL_HapticRumbleStop(SDL_Haptic *haptic)
|
||||
{
|
||||
if (!ValidHaptic(haptic)) {
|
||||
return -1;
|
||||
|
@@ -24,7 +24,6 @@
|
||||
#ifndef SDL_syshaptic_h_
|
||||
#define SDL_syshaptic_h_
|
||||
|
||||
|
||||
/* Set up for C function definitions, even when using C++ */
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
@@ -32,8 +31,8 @@ extern "C" {
|
||||
|
||||
struct haptic_effect
|
||||
{
|
||||
SDL_HapticEffect effect; /* The current event */
|
||||
struct haptic_hweffect *hweffect; /* The hardware behind the event */
|
||||
SDL_HapticEffect effect; /* The current event */
|
||||
struct haptic_hweffect *hweffect; /* The hardware behind the event */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -41,20 +40,20 @@ struct haptic_effect
|
||||
*/
|
||||
struct _SDL_Haptic
|
||||
{
|
||||
Uint8 index; /* Stores index it is attached to */
|
||||
Uint8 index; /* Stores index it is attached to */
|
||||
|
||||
struct haptic_effect *effects; /* Allocated effects */
|
||||
int neffects; /* Maximum amount of effects */
|
||||
int nplaying; /* Maximum amount of effects to play at the same time */
|
||||
unsigned int supported; /* Supported effects */
|
||||
int naxes; /* Number of axes on the device. */
|
||||
struct haptic_effect *effects; /* Allocated effects */
|
||||
int neffects; /* Maximum amount of effects */
|
||||
int nplaying; /* Maximum amount of effects to play at the same time */
|
||||
unsigned int supported; /* Supported effects */
|
||||
int naxes; /* Number of axes on the device. */
|
||||
|
||||
struct haptic_hwdata *hwdata; /* Driver dependent */
|
||||
int ref_count; /* Count for multiple opens */
|
||||
struct haptic_hwdata *hwdata; /* Driver dependent */
|
||||
int ref_count; /* Count for multiple opens */
|
||||
|
||||
int rumble_id; /* ID of rumble effect for simple rumble API. */
|
||||
int rumble_id; /* ID of rumble effect for simple rumble API. */
|
||||
SDL_HapticEffect rumble_effect; /* Rumble effect. */
|
||||
struct _SDL_Haptic *next; /* pointer to next haptic we have allocated */
|
||||
struct _SDL_Haptic *next; /* pointer to next haptic we have allocated */
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -78,7 +77,7 @@ extern const char *SDL_SYS_HapticName(int index);
|
||||
*
|
||||
* Returns 0 on success, -1 on error.
|
||||
*/
|
||||
extern int SDL_SYS_HapticOpen(SDL_Haptic * haptic);
|
||||
extern int SDL_SYS_HapticOpen(SDL_Haptic *haptic);
|
||||
|
||||
/*
|
||||
* Returns the index of the haptic core pointer or -1 if none is found.
|
||||
@@ -91,7 +90,7 @@ int SDL_SYS_HapticMouse(void);
|
||||
* Returns >0 if haptic capabilities are detected, 0 if haptic
|
||||
* capabilities aren't detected and -1 on error.
|
||||
*/
|
||||
extern int SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick);
|
||||
extern int SDL_SYS_JoystickIsHaptic(SDL_Joystick *joystick);
|
||||
|
||||
/*
|
||||
* Opens the haptic device for usage using the same device as
|
||||
@@ -99,20 +98,20 @@ extern int SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick);
|
||||
*
|
||||
* Returns 0 on success, -1 on error.
|
||||
*/
|
||||
extern int SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic,
|
||||
SDL_Joystick * joystick);
|
||||
extern int SDL_SYS_HapticOpenFromJoystick(SDL_Haptic *haptic,
|
||||
SDL_Joystick *joystick);
|
||||
/*
|
||||
* Checks to see if haptic device and joystick device are the same.
|
||||
*
|
||||
* Returns 1 if they are the same, 0 if they aren't.
|
||||
*/
|
||||
extern int SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic,
|
||||
SDL_Joystick * joystick);
|
||||
extern int SDL_SYS_JoystickSameHaptic(SDL_Haptic *haptic,
|
||||
SDL_Joystick *joystick);
|
||||
|
||||
/*
|
||||
* Closes a haptic device after usage.
|
||||
*/
|
||||
extern void SDL_SYS_HapticClose(SDL_Haptic * haptic);
|
||||
extern void SDL_SYS_HapticClose(SDL_Haptic *haptic);
|
||||
|
||||
/*
|
||||
* Performs a cleanup on the haptic subsystem.
|
||||
@@ -125,9 +124,9 @@ extern void SDL_SYS_HapticQuit(void);
|
||||
*
|
||||
* Returns 0 on success, -1 on error.
|
||||
*/
|
||||
extern int SDL_SYS_HapticNewEffect(SDL_Haptic * haptic,
|
||||
extern int SDL_SYS_HapticNewEffect(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect,
|
||||
SDL_HapticEffect * base);
|
||||
SDL_HapticEffect *base);
|
||||
|
||||
/*
|
||||
* Updates the haptic effect on the haptic device using data
|
||||
@@ -135,16 +134,16 @@ extern int SDL_SYS_HapticNewEffect(SDL_Haptic * haptic,
|
||||
*
|
||||
* Returns 0 on success, -1 on error.
|
||||
*/
|
||||
extern int SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,
|
||||
extern int SDL_SYS_HapticUpdateEffect(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect,
|
||||
SDL_HapticEffect * data);
|
||||
SDL_HapticEffect *data);
|
||||
|
||||
/*
|
||||
* Runs the effect on the haptic device.
|
||||
*
|
||||
* Returns 0 on success, -1 on error.
|
||||
*/
|
||||
extern int SDL_SYS_HapticRunEffect(SDL_Haptic * haptic,
|
||||
extern int SDL_SYS_HapticRunEffect(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect,
|
||||
Uint32 iterations);
|
||||
|
||||
@@ -153,13 +152,13 @@ extern int SDL_SYS_HapticRunEffect(SDL_Haptic * haptic,
|
||||
*
|
||||
* Returns 0 on success, -1 on error.
|
||||
*/
|
||||
extern int SDL_SYS_HapticStopEffect(SDL_Haptic * haptic,
|
||||
extern int SDL_SYS_HapticStopEffect(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect);
|
||||
|
||||
/*
|
||||
* Cleanups up the effect on the haptic device.
|
||||
*/
|
||||
extern void SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic,
|
||||
extern void SDL_SYS_HapticDestroyEffect(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect);
|
||||
|
||||
/*
|
||||
@@ -168,7 +167,7 @@ extern void SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic,
|
||||
* Returns 0 if device is stopped, >0 if device is playing and
|
||||
* -1 on error.
|
||||
*/
|
||||
extern int SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,
|
||||
extern int SDL_SYS_HapticGetEffectStatus(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect);
|
||||
|
||||
/*
|
||||
@@ -176,35 +175,35 @@ extern int SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,
|
||||
*
|
||||
* Returns 0 on success, -1 on error.
|
||||
*/
|
||||
extern int SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain);
|
||||
extern int SDL_SYS_HapticSetGain(SDL_Haptic *haptic, int gain);
|
||||
|
||||
/*
|
||||
* Sets the autocenter feature of the haptic device.
|
||||
*
|
||||
* Returns 0 on success, -1 on error.
|
||||
*/
|
||||
extern int SDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter);
|
||||
extern int SDL_SYS_HapticSetAutocenter(SDL_Haptic *haptic, int autocenter);
|
||||
|
||||
/*
|
||||
* Pauses the haptic device.
|
||||
*
|
||||
* Returns 0 on success, -1 on error.
|
||||
*/
|
||||
extern int SDL_SYS_HapticPause(SDL_Haptic * haptic);
|
||||
extern int SDL_SYS_HapticPause(SDL_Haptic *haptic);
|
||||
|
||||
/*
|
||||
* Unpauses the haptic device.
|
||||
*
|
||||
* Returns 0 on success, -1 on error.
|
||||
*/
|
||||
extern int SDL_SYS_HapticUnpause(SDL_Haptic * haptic);
|
||||
extern int SDL_SYS_HapticUnpause(SDL_Haptic *haptic);
|
||||
|
||||
/*
|
||||
* Stops all the currently playing haptic effects on the device.
|
||||
*
|
||||
* Returns 0 on success, -1 on error.
|
||||
*/
|
||||
extern int SDL_SYS_HapticStopAll(SDL_Haptic * haptic);
|
||||
extern int SDL_SYS_HapticStopAll(SDL_Haptic *haptic);
|
||||
|
||||
/* Ends C function definitions when using C++ */
|
||||
#ifdef __cplusplus
|
||||
|
@@ -25,9 +25,8 @@
|
||||
#include "SDL_syshaptic_c.h"
|
||||
#include "../SDL_syshaptic.h"
|
||||
#include "../../core/android/SDL_android.h"
|
||||
#include "../../joystick/SDL_sysjoystick.h" /* For the real SDL_Joystick */
|
||||
#include "../../joystick/android/SDL_sysjoystick_c.h" /* For joystick hwdata */
|
||||
|
||||
#include "../../joystick/SDL_sysjoystick.h" /* For the real SDL_Joystick */
|
||||
#include "../../joystick/android/SDL_sysjoystick_c.h" /* For joystick hwdata */
|
||||
|
||||
typedef struct SDL_hapticlist_item
|
||||
{
|
||||
@@ -41,9 +40,7 @@ static SDL_hapticlist_item *SDL_hapticlist = NULL;
|
||||
static SDL_hapticlist_item *SDL_hapticlist_tail = NULL;
|
||||
static int numhaptics = 0;
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticInit(void)
|
||||
int SDL_SYS_HapticInit(void)
|
||||
{
|
||||
/* Support for device connect/disconnect is API >= 16 only,
|
||||
* so we poll every three seconds
|
||||
@@ -57,14 +54,12 @@ SDL_SYS_HapticInit(void)
|
||||
return numhaptics;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_NumHaptics(void)
|
||||
int SDL_SYS_NumHaptics(void)
|
||||
{
|
||||
return numhaptics;
|
||||
}
|
||||
|
||||
static SDL_hapticlist_item *
|
||||
HapticByOrder(int index)
|
||||
static SDL_hapticlist_item *HapticByOrder(int index)
|
||||
{
|
||||
SDL_hapticlist_item *item = SDL_hapticlist;
|
||||
if ((index < 0) || (index >= numhaptics)) {
|
||||
@@ -78,8 +73,7 @@ HapticByOrder(int index)
|
||||
return item;
|
||||
}
|
||||
|
||||
static SDL_hapticlist_item *
|
||||
HapticByDevId (int device_id)
|
||||
static SDL_hapticlist_item *HapticByDevId(int device_id)
|
||||
{
|
||||
SDL_hapticlist_item *item;
|
||||
for (item = SDL_hapticlist; item != NULL; item = item->next) {
|
||||
@@ -95,18 +89,16 @@ const char *
|
||||
SDL_SYS_HapticName(int index)
|
||||
{
|
||||
SDL_hapticlist_item *item = HapticByOrder(index);
|
||||
if (item == NULL ) {
|
||||
if (item == NULL) {
|
||||
SDL_SetError("No such device");
|
||||
return NULL;
|
||||
}
|
||||
return item->name;
|
||||
}
|
||||
|
||||
|
||||
static SDL_hapticlist_item *
|
||||
OpenHaptic(SDL_Haptic *haptic, SDL_hapticlist_item *item)
|
||||
static SDL_hapticlist_item *OpenHaptic(SDL_Haptic *haptic, SDL_hapticlist_item *item)
|
||||
{
|
||||
if (item == NULL ) {
|
||||
if (item == NULL) {
|
||||
SDL_SetError("No such device");
|
||||
return NULL;
|
||||
}
|
||||
@@ -121,75 +113,60 @@ OpenHaptic(SDL_Haptic *haptic, SDL_hapticlist_item *item)
|
||||
haptic->supported = SDL_HAPTIC_LEFTRIGHT;
|
||||
haptic->neffects = 1;
|
||||
haptic->nplaying = haptic->neffects;
|
||||
haptic->effects = (struct haptic_effect *)SDL_malloc (sizeof (struct haptic_effect) * haptic->neffects);
|
||||
haptic->effects = (struct haptic_effect *)SDL_malloc(sizeof(struct haptic_effect) * haptic->neffects);
|
||||
if (haptic->effects == NULL) {
|
||||
SDL_OutOfMemory();
|
||||
return NULL;
|
||||
}
|
||||
SDL_memset(haptic->effects, 0, sizeof (struct haptic_effect) * haptic->neffects);
|
||||
SDL_memset(haptic->effects, 0, sizeof(struct haptic_effect) * haptic->neffects);
|
||||
return item;
|
||||
}
|
||||
|
||||
static SDL_hapticlist_item *
|
||||
OpenHapticByOrder(SDL_Haptic *haptic, int index)
|
||||
static SDL_hapticlist_item *OpenHapticByOrder(SDL_Haptic *haptic, int index)
|
||||
{
|
||||
return OpenHaptic(haptic, HapticByOrder(index));
|
||||
}
|
||||
|
||||
static SDL_hapticlist_item *
|
||||
OpenHapticByDevId(SDL_Haptic *haptic, int device_id)
|
||||
static SDL_hapticlist_item *OpenHapticByDevId(SDL_Haptic *haptic, int device_id)
|
||||
{
|
||||
return OpenHaptic(haptic, HapticByDevId(device_id));
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_HapticOpen(SDL_Haptic *haptic)
|
||||
int SDL_SYS_HapticOpen(SDL_Haptic *haptic)
|
||||
{
|
||||
return OpenHapticByOrder(haptic, haptic->index) == NULL ? -1 : 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticMouse(void)
|
||||
int SDL_SYS_HapticMouse(void)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_JoystickIsHaptic(SDL_Joystick *joystick)
|
||||
int SDL_SYS_JoystickIsHaptic(SDL_Joystick *joystick)
|
||||
{
|
||||
SDL_hapticlist_item *item;
|
||||
item = HapticByDevId(((joystick_hwdata *)joystick->hwdata)->device_id);
|
||||
return (item != NULL) ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticOpenFromJoystick(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
int SDL_SYS_HapticOpenFromJoystick(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
return OpenHapticByDevId(haptic, ((joystick_hwdata *)joystick->hwdata)->device_id) == NULL ? -1 : 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_SYS_JoystickSameHaptic(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
return ((SDL_hapticlist_item *)haptic->hwdata)->device_id == ((joystick_hwdata *)joystick->hwdata)->device_id ? 1 : 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SDL_SYS_HapticClose(SDL_Haptic * haptic)
|
||||
void SDL_SYS_HapticClose(SDL_Haptic *haptic)
|
||||
{
|
||||
((SDL_hapticlist_item *)haptic->hwdata)->haptic = NULL;
|
||||
haptic->hwdata = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SDL_SYS_HapticQuit(void)
|
||||
void SDL_SYS_HapticQuit(void)
|
||||
{
|
||||
/* We don't have any way to scan for joysticks (and their vibrators) at init, so don't wipe the list
|
||||
* of joysticks here in case this is a reinit.
|
||||
@@ -209,107 +186,85 @@ SDL_SYS_HapticQuit(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticNewEffect(SDL_Haptic * haptic,
|
||||
struct haptic_effect *effect, SDL_HapticEffect * base)
|
||||
int SDL_SYS_HapticNewEffect(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect, SDL_HapticEffect *base)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,
|
||||
struct haptic_effect *effect,
|
||||
SDL_HapticEffect * data)
|
||||
int SDL_SYS_HapticUpdateEffect(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect,
|
||||
SDL_HapticEffect *data)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
Uint32 iterations)
|
||||
int SDL_SYS_HapticRunEffect(SDL_Haptic *haptic, struct haptic_effect *effect,
|
||||
Uint32 iterations)
|
||||
{
|
||||
float large = effect->effect.leftright.large_magnitude / 32767.0f;
|
||||
float small = effect->effect.leftright.small_magnitude / 32767.0f;
|
||||
|
||||
float total = (large * 0.6f) + (small * 0.4f);
|
||||
|
||||
Android_JNI_HapticRun (((SDL_hapticlist_item *)haptic->hwdata)->device_id, total, effect->effect.leftright.length);
|
||||
Android_JNI_HapticRun(((SDL_hapticlist_item *)haptic->hwdata)->device_id, total, effect->effect.leftright.length);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
int SDL_SYS_HapticStopEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
Android_JNI_HapticStop (((SDL_hapticlist_item *)haptic->hwdata)->device_id);
|
||||
Android_JNI_HapticStop(((SDL_hapticlist_item *)haptic->hwdata)->device_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
void SDL_SYS_HapticDestroyEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,
|
||||
struct haptic_effect *effect)
|
||||
int SDL_SYS_HapticGetEffectStatus(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
int SDL_SYS_HapticSetGain(SDL_Haptic *haptic, int gain)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
int SDL_SYS_HapticSetAutocenter(SDL_Haptic *haptic, int autocenter)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_HapticPause(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticPause(SDL_Haptic *haptic)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_HapticUnpause(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticUnpause(SDL_Haptic *haptic)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_HapticStopAll(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticStopAll(SDL_Haptic *haptic)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
int
|
||||
Android_AddHaptic(int device_id, const char *name)
|
||||
int Android_AddHaptic(int device_id, const char *name)
|
||||
{
|
||||
SDL_hapticlist_item *item;
|
||||
item = (SDL_hapticlist_item *) SDL_calloc(1, sizeof (SDL_hapticlist_item));
|
||||
item = (SDL_hapticlist_item *)SDL_calloc(1, sizeof(SDL_hapticlist_item));
|
||||
if (item == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
item->device_id = device_id;
|
||||
item->name = SDL_strdup (name);
|
||||
item->name = SDL_strdup(name);
|
||||
if (item->name == NULL) {
|
||||
SDL_free (item);
|
||||
SDL_free(item);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -324,8 +279,7 @@ Android_AddHaptic(int device_id, const char *name)
|
||||
return numhaptics;
|
||||
}
|
||||
|
||||
int
|
||||
Android_RemoveHaptic(int device_id)
|
||||
int Android_RemoveHaptic(int device_id)
|
||||
{
|
||||
SDL_hapticlist_item *item;
|
||||
SDL_hapticlist_item *prev = NULL;
|
||||
@@ -358,7 +312,6 @@ Android_RemoveHaptic(int device_id)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
#endif /* SDL_HAPTIC_ANDROID */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
@@ -23,8 +23,8 @@
|
||||
#ifdef SDL_HAPTIC_IOKIT
|
||||
|
||||
#include "../SDL_syshaptic.h"
|
||||
#include "../../joystick/SDL_sysjoystick.h" /* For the real SDL_Joystick */
|
||||
#include "../../joystick/darwin/SDL_iokitjoystick_c.h" /* For joystick hwdata */
|
||||
#include "../../joystick/SDL_sysjoystick.h" /* For the real SDL_Joystick */
|
||||
#include "../../joystick/darwin/SDL_iokitjoystick_c.h" /* For joystick hwdata */
|
||||
#include "SDL_syshaptic_c.h"
|
||||
|
||||
#include <IOKit/IOKitLib.h>
|
||||
@@ -34,7 +34,7 @@
|
||||
#include <ForceFeedback/ForceFeedbackConstants.h>
|
||||
|
||||
#ifndef IO_OBJECT_NULL
|
||||
#define IO_OBJECT_NULL ((io_service_t)0)
|
||||
#define IO_OBJECT_NULL ((io_service_t)0)
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -42,10 +42,10 @@
|
||||
*/
|
||||
typedef struct SDL_hapticlist_item
|
||||
{
|
||||
char name[256]; /* Name of the device. */
|
||||
char name[256]; /* Name of the device. */
|
||||
|
||||
io_service_t dev; /* Node we use to create the device. */
|
||||
SDL_Haptic *haptic; /* Haptic currently associated with it. */
|
||||
io_service_t dev; /* Node we use to create the device. */
|
||||
SDL_Haptic *haptic; /* Haptic currently associated with it. */
|
||||
|
||||
/* Usage pages for determining if it's a mouse or not. */
|
||||
long usage;
|
||||
@@ -54,30 +54,28 @@ typedef struct SDL_hapticlist_item
|
||||
struct SDL_hapticlist_item *next;
|
||||
} SDL_hapticlist_item;
|
||||
|
||||
|
||||
/*
|
||||
* Haptic system hardware data.
|
||||
*/
|
||||
struct haptic_hwdata
|
||||
{
|
||||
FFDeviceObjectReference device; /* Hardware device. */
|
||||
FFDeviceObjectReference device; /* Hardware device. */
|
||||
UInt8 axes[3];
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Haptic system effect data.
|
||||
*/
|
||||
struct haptic_hweffect
|
||||
{
|
||||
FFEffectObjectReference ref; /* Reference. */
|
||||
struct FFEFFECT effect; /* Hardware effect. */
|
||||
FFEffectObjectReference ref; /* Reference. */
|
||||
struct FFEFFECT effect; /* Hardware effect. */
|
||||
};
|
||||
|
||||
/*
|
||||
* Prototypes.
|
||||
*/
|
||||
static void SDL_SYS_HapticFreeFFEFFECT(FFEFFECT * effect, int type);
|
||||
static void SDL_SYS_HapticFreeFFEFFECT(FFEFFECT *effect, int type);
|
||||
static int HIDGetDeviceProduct(io_service_t dev, char *name);
|
||||
|
||||
static SDL_hapticlist_item *SDL_hapticlist = NULL;
|
||||
@@ -87,8 +85,7 @@ static int numhaptics = -1;
|
||||
/*
|
||||
* Like strerror but for force feedback errors.
|
||||
*/
|
||||
static const char *
|
||||
FFStrError(unsigned int err)
|
||||
static const char *FFStrError(unsigned int err)
|
||||
{
|
||||
switch (err) {
|
||||
case FFERR_DEVICEFULL:
|
||||
@@ -140,12 +137,10 @@ FFStrError(unsigned int err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Initializes the haptic subsystem.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticInit(void)
|
||||
int SDL_SYS_HapticInit(void)
|
||||
{
|
||||
IOReturn result;
|
||||
io_iterator_t iter;
|
||||
@@ -170,7 +165,7 @@ SDL_SYS_HapticInit(void)
|
||||
}
|
||||
/* IOServiceGetMatchingServices consumes dictionary. */
|
||||
|
||||
if (!IOIteratorIsValid(iter)) { /* No iterator. */
|
||||
if (!IOIteratorIsValid(iter)) { /* No iterator. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -184,14 +179,12 @@ SDL_SYS_HapticInit(void)
|
||||
return numhaptics;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_NumHaptics(void)
|
||||
int SDL_SYS_NumHaptics(void)
|
||||
{
|
||||
return numhaptics;
|
||||
}
|
||||
|
||||
static SDL_hapticlist_item *
|
||||
HapticByDevIndex(int device_index)
|
||||
static SDL_hapticlist_item *HapticByDevIndex(int device_index)
|
||||
{
|
||||
SDL_hapticlist_item *item = SDL_hapticlist;
|
||||
|
||||
@@ -208,8 +201,7 @@ HapticByDevIndex(int device_index)
|
||||
return item;
|
||||
}
|
||||
|
||||
int
|
||||
MacHaptic_MaybeAddDevice( io_object_t device )
|
||||
int MacHaptic_MaybeAddDevice(io_object_t device)
|
||||
{
|
||||
IOReturn result;
|
||||
CFMutableDictionaryRef hidProperties;
|
||||
@@ -226,8 +218,8 @@ MacHaptic_MaybeAddDevice( io_object_t device )
|
||||
}
|
||||
|
||||
/* Make sure we don't already have it */
|
||||
for (item = SDL_hapticlist; item ; item = item->next) {
|
||||
if (IOObjectIsEqualTo((io_object_t) item->dev, device)) {
|
||||
for (item = SDL_hapticlist; item; item = item->next) {
|
||||
if (IOObjectIsEqualTo((io_object_t)item->dev, device)) {
|
||||
/* Already added */
|
||||
return -1;
|
||||
}
|
||||
@@ -283,8 +275,7 @@ MacHaptic_MaybeAddDevice( io_object_t device )
|
||||
return numhaptics;
|
||||
}
|
||||
|
||||
int
|
||||
MacHaptic_MaybeRemoveDevice( io_object_t device )
|
||||
int MacHaptic_MaybeRemoveDevice(io_object_t device)
|
||||
{
|
||||
SDL_hapticlist_item *item;
|
||||
SDL_hapticlist_item *prev = NULL;
|
||||
@@ -295,7 +286,7 @@ MacHaptic_MaybeRemoveDevice( io_object_t device )
|
||||
|
||||
for (item = SDL_hapticlist; item != NULL; item = item->next) {
|
||||
/* found it, remove it. */
|
||||
if (IOObjectIsEqualTo((io_object_t) item->dev, device)) {
|
||||
if (IOObjectIsEqualTo((io_object_t)item->dev, device)) {
|
||||
const int retval = item->haptic ? item->haptic->index : -1;
|
||||
|
||||
if (prev != NULL) {
|
||||
@@ -336,8 +327,7 @@ SDL_SYS_HapticName(int index)
|
||||
/*
|
||||
* Gets the device's product name.
|
||||
*/
|
||||
static int
|
||||
HIDGetDeviceProduct(io_service_t dev, char *name)
|
||||
static int HIDGetDeviceProduct(io_service_t dev, char *name)
|
||||
{
|
||||
CFMutableDictionaryRef hidProperties, usbProperties;
|
||||
io_registry_entry_t parent1, parent2;
|
||||
@@ -355,20 +345,19 @@ HIDGetDeviceProduct(io_service_t dev, char *name)
|
||||
* get dictionary for USB properties: step up two levels and get CF dictionary for USB properties
|
||||
*/
|
||||
if ((KERN_SUCCESS ==
|
||||
IORegistryEntryGetParentEntry(dev, kIOServicePlane, &parent1))
|
||||
&& (KERN_SUCCESS ==
|
||||
IORegistryEntryGetParentEntry(parent1, kIOServicePlane, &parent2))
|
||||
&& (KERN_SUCCESS ==
|
||||
IORegistryEntryCreateCFProperties(parent2, &usbProperties,
|
||||
kCFAllocatorDefault,
|
||||
kNilOptions))) {
|
||||
IORegistryEntryGetParentEntry(dev, kIOServicePlane, &parent1)) &&
|
||||
(KERN_SUCCESS ==
|
||||
IORegistryEntryGetParentEntry(parent1, kIOServicePlane, &parent2)) &&
|
||||
(KERN_SUCCESS ==
|
||||
IORegistryEntryCreateCFProperties(parent2, &usbProperties,
|
||||
kCFAllocatorDefault,
|
||||
kNilOptions))) {
|
||||
if (usbProperties) {
|
||||
CFTypeRef refCF = 0;
|
||||
/* get device info
|
||||
* try hid dictionary first, if fail then go to USB dictionary
|
||||
*/
|
||||
|
||||
|
||||
/* Get product name */
|
||||
refCF = CFDictionaryGetValue(hidProperties, CFSTR(kIOHIDProductKey));
|
||||
if (!refCF) {
|
||||
@@ -401,14 +390,13 @@ HIDGetDeviceProduct(io_service_t dev, char *name)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#define FF_TEST(ff, s) \
|
||||
if (features.supportedEffects & (ff)) supported |= (s)
|
||||
#define FF_TEST(ff, s) \
|
||||
if (features.supportedEffects & (ff)) \
|
||||
supported |= (s)
|
||||
/*
|
||||
* Gets supported features.
|
||||
*/
|
||||
static unsigned int
|
||||
GetSupportedFeatures(SDL_Haptic * haptic)
|
||||
static unsigned int GetSupportedFeatures(SDL_Haptic *haptic)
|
||||
{
|
||||
HRESULT ret;
|
||||
FFDeviceObjectReference device;
|
||||
@@ -460,9 +448,8 @@ GetSupportedFeatures(SDL_Haptic * haptic)
|
||||
if (ret == FF_OK) {
|
||||
supported |= SDL_HAPTIC_AUTOCENTER;
|
||||
} else if (ret != FFERR_UNSUPPORTED) {
|
||||
return SDL_SetError
|
||||
("Haptic: Unable to get if device supports autocenter: %s.",
|
||||
FFStrError(ret));
|
||||
return SDL_SetError("Haptic: Unable to get if device supports autocenter: %s.",
|
||||
FFStrError(ret));
|
||||
}
|
||||
|
||||
/* Check for axes, we have an artificial limit on axes */
|
||||
@@ -478,12 +465,10 @@ GetSupportedFeatures(SDL_Haptic * haptic)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Opens the haptic device from the file descriptor.
|
||||
*/
|
||||
static int
|
||||
SDL_SYS_HapticOpenFromService(SDL_Haptic * haptic, io_service_t service)
|
||||
static int SDL_SYS_HapticOpenFromService(SDL_Haptic *haptic, io_service_t service)
|
||||
{
|
||||
HRESULT ret;
|
||||
int ret2;
|
||||
@@ -511,7 +496,6 @@ SDL_SYS_HapticOpenFromService(SDL_Haptic * haptic, io_service_t service)
|
||||
goto open_err;
|
||||
}
|
||||
|
||||
|
||||
/* Reset and then enable actuators. */
|
||||
ret = FFDeviceSendForceFeedbackCommand(haptic->hwdata->device,
|
||||
FFSFFC_RESET);
|
||||
@@ -527,7 +511,6 @@ SDL_SYS_HapticOpenFromService(SDL_Haptic * haptic, io_service_t service)
|
||||
goto open_err;
|
||||
}
|
||||
|
||||
|
||||
/* Allocate effects memory. */
|
||||
haptic->effects = (struct haptic_effect *)
|
||||
SDL_malloc(sizeof(struct haptic_effect) * haptic->neffects);
|
||||
@@ -542,23 +525,20 @@ SDL_SYS_HapticOpenFromService(SDL_Haptic * haptic, io_service_t service)
|
||||
return 0;
|
||||
|
||||
/* Error handling */
|
||||
open_err:
|
||||
open_err:
|
||||
FFReleaseDevice(haptic->hwdata->device);
|
||||
creat_err:
|
||||
creat_err:
|
||||
if (haptic->hwdata != NULL) {
|
||||
SDL_free(haptic->hwdata);
|
||||
haptic->hwdata = NULL;
|
||||
}
|
||||
return -1;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Opens a haptic device for usage.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticOpen(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticOpen(SDL_Haptic *haptic)
|
||||
{
|
||||
SDL_hapticlist_item *item;
|
||||
item = HapticByDevIndex(haptic->index);
|
||||
@@ -566,12 +546,10 @@ SDL_SYS_HapticOpen(SDL_Haptic * haptic)
|
||||
return SDL_SYS_HapticOpenFromService(haptic, item->dev);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Opens a haptic device from first mouse it finds for usage.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticMouse(void)
|
||||
int SDL_SYS_HapticMouse(void)
|
||||
{
|
||||
int device_index = 0;
|
||||
SDL_hapticlist_item *item;
|
||||
@@ -587,12 +565,10 @@ SDL_SYS_HapticMouse(void)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Checks to see if a joystick has haptic features.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick)
|
||||
int SDL_SYS_JoystickIsHaptic(SDL_Joystick *joystick)
|
||||
{
|
||||
#ifdef SDL_JOYSTICK_IOKIT
|
||||
if (joystick->driver != &SDL_DARWIN_JoystickDriver) {
|
||||
@@ -605,18 +581,16 @@ SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick)
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Checks to see if the haptic device and joystick are in reality the same.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_SYS_JoystickSameHaptic(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
#ifdef SDL_JOYSTICK_IOKIT
|
||||
if (joystick->driver != &SDL_DARWIN_JoystickDriver) {
|
||||
return 0;
|
||||
}
|
||||
if (IOObjectIsEqualTo((io_object_t) ((size_t)haptic->hwdata->device),
|
||||
if (IOObjectIsEqualTo((io_object_t)((size_t)haptic->hwdata->device),
|
||||
joystick->hwdata->ffservice)) {
|
||||
return 1;
|
||||
}
|
||||
@@ -624,25 +598,23 @@ SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Opens a SDL_Haptic from a SDL_Joystick.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_SYS_HapticOpenFromJoystick(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
#ifdef SDL_JOYSTICK_IOKIT
|
||||
int device_index = 0;
|
||||
SDL_hapticlist_item *item;
|
||||
|
||||
|
||||
if (joystick->driver != &SDL_DARWIN_JoystickDriver) {
|
||||
return -1;
|
||||
}
|
||||
for (item = SDL_hapticlist; item; item = item->next) {
|
||||
if (IOObjectIsEqualTo((io_object_t) item->dev,
|
||||
joystick->hwdata->ffservice)) {
|
||||
haptic->index = device_index;
|
||||
break;
|
||||
if (IOObjectIsEqualTo((io_object_t)item->dev,
|
||||
joystick->hwdata->ffservice)) {
|
||||
haptic->index = device_index;
|
||||
break;
|
||||
}
|
||||
++device_index;
|
||||
}
|
||||
@@ -653,12 +625,10 @@ SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Closes the haptic device.
|
||||
*/
|
||||
void
|
||||
SDL_SYS_HapticClose(SDL_Haptic * haptic)
|
||||
void SDL_SYS_HapticClose(SDL_Haptic *haptic)
|
||||
{
|
||||
if (haptic->hwdata) {
|
||||
|
||||
@@ -676,12 +646,10 @@ SDL_SYS_HapticClose(SDL_Haptic * haptic)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Clean up after system specific haptic stuff
|
||||
*/
|
||||
void
|
||||
SDL_SYS_HapticQuit(void)
|
||||
void SDL_SYS_HapticQuit(void)
|
||||
{
|
||||
SDL_hapticlist_item *item;
|
||||
SDL_hapticlist_item *next = NULL;
|
||||
@@ -701,12 +669,10 @@ SDL_SYS_HapticQuit(void)
|
||||
SDL_hapticlist_tail = NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Converts an SDL trigger button to an FFEFFECT trigger button.
|
||||
*/
|
||||
static DWORD
|
||||
FFGetTriggerButton(Uint16 button)
|
||||
static DWORD FFGetTriggerButton(Uint16 button)
|
||||
{
|
||||
DWORD dwTriggerButton;
|
||||
|
||||
@@ -719,18 +685,16 @@ FFGetTriggerButton(Uint16 button)
|
||||
return dwTriggerButton;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Sets the direction.
|
||||
*/
|
||||
static int
|
||||
SDL_SYS_SetDirection(FFEFFECT * effect, SDL_HapticDirection * dir, int naxes)
|
||||
static int SDL_SYS_SetDirection(FFEFFECT *effect, SDL_HapticDirection *dir, int naxes)
|
||||
{
|
||||
LONG *rglDir;
|
||||
|
||||
/* Handle no axes a part. */
|
||||
if (naxes == 0) {
|
||||
effect->dwFlags |= FFEFF_SPHERICAL; /* Set as default. */
|
||||
effect->dwFlags |= FFEFF_SPHERICAL; /* Set as default. */
|
||||
effect->rglDirection = NULL;
|
||||
return 0;
|
||||
}
|
||||
@@ -778,21 +742,19 @@ SDL_SYS_SetDirection(FFEFFECT * effect, SDL_HapticDirection * dir, int naxes)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Clamps and converts. */
|
||||
#define CCONVERT(x) (((x) > 0x7FFF) ? 10000 : ((x)*10000) / 0x7FFF)
|
||||
#define CCONVERT(x) (((x) > 0x7FFF) ? 10000 : ((x)*10000) / 0x7FFF)
|
||||
/* Just converts. */
|
||||
#define CONVERT(x) (((x)*10000) / 0x7FFF)
|
||||
#define CONVERT(x) (((x)*10000) / 0x7FFF)
|
||||
/*
|
||||
* Creates the FFEFFECT from a SDL_HapticEffect.
|
||||
*/
|
||||
static int
|
||||
SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
static int SDL_SYS_ToFFEFFECT(SDL_Haptic *haptic, FFEFFECT *dest, SDL_HapticEffect *src)
|
||||
{
|
||||
int i;
|
||||
FFCONSTANTFORCE *constant = NULL;
|
||||
FFPERIODIC *periodic = NULL;
|
||||
FFCONDITION *condition = NULL; /* Actually an array of conditions - one per axis. */
|
||||
FFCONDITION *condition = NULL; /* Actually an array of conditions - one per axis. */
|
||||
FFRAMPFORCE *ramp = NULL;
|
||||
FFCUSTOMFORCE *custom = NULL;
|
||||
FFENVELOPE *envelope = NULL;
|
||||
@@ -805,10 +767,10 @@ SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
|
||||
/* Set global stuff. */
|
||||
SDL_memset(dest, 0, sizeof(FFEFFECT));
|
||||
dest->dwSize = sizeof(FFEFFECT); /* Set the structure size. */
|
||||
dest->dwSamplePeriod = 0; /* Not used by us. */
|
||||
dest->dwGain = 10000; /* Gain is set globally, not locally. */
|
||||
dest->dwFlags = FFEFF_OBJECTOFFSETS; /* Seems obligatory. */
|
||||
dest->dwSize = sizeof(FFEFFECT); /* Set the structure size. */
|
||||
dest->dwSamplePeriod = 0; /* Not used by us. */
|
||||
dest->dwGain = 10000; /* Gain is set globally, not locally. */
|
||||
dest->dwFlags = FFEFF_OBJECTOFFSETS; /* Seems obligatory. */
|
||||
|
||||
/* Envelope. */
|
||||
envelope = SDL_malloc(sizeof(FFENVELOPE));
|
||||
@@ -817,7 +779,7 @@ SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
}
|
||||
SDL_memset(envelope, 0, sizeof(FFENVELOPE));
|
||||
dest->lpEnvelope = envelope;
|
||||
envelope->dwSize = sizeof(FFENVELOPE); /* Always should be this. */
|
||||
envelope->dwSize = sizeof(FFENVELOPE); /* Always should be this. */
|
||||
|
||||
/* Axes. */
|
||||
if (src->constant.direction.type == SDL_HAPTIC_STEERING_AXIS) {
|
||||
@@ -830,7 +792,7 @@ SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
if (axes == NULL) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
axes[0] = haptic->hwdata->axes[0]; /* Always at least one axis. */
|
||||
axes[0] = haptic->hwdata->axes[0]; /* Always at least one axis. */
|
||||
if (dest->cAxes > 1) {
|
||||
axes[1] = haptic->hwdata->axes[1];
|
||||
}
|
||||
@@ -840,7 +802,6 @@ SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
dest->rgdwAxes = axes;
|
||||
}
|
||||
|
||||
|
||||
/* The big type handling switch, even bigger then Linux's version. */
|
||||
switch (src->type) {
|
||||
case SDL_HAPTIC_CONSTANT:
|
||||
@@ -860,17 +821,15 @@ SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
dest->dwDuration = hap_constant->length * 1000; /* In microseconds. */
|
||||
dest->dwTriggerButton = FFGetTriggerButton(hap_constant->button);
|
||||
dest->dwTriggerRepeatInterval = hap_constant->interval;
|
||||
dest->dwStartDelay = hap_constant->delay * 1000; /* In microseconds. */
|
||||
dest->dwStartDelay = hap_constant->delay * 1000; /* In microseconds. */
|
||||
|
||||
/* Direction. */
|
||||
if (SDL_SYS_SetDirection(dest, &hap_constant->direction, dest->cAxes)
|
||||
< 0) {
|
||||
if (SDL_SYS_SetDirection(dest, &hap_constant->direction, dest->cAxes) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Envelope */
|
||||
if ((hap_constant->attack_length == 0)
|
||||
&& (hap_constant->fade_length == 0)) {
|
||||
if ((hap_constant->attack_length == 0) && (hap_constant->fade_length == 0)) {
|
||||
SDL_free(envelope);
|
||||
dest->lpEnvelope = NULL;
|
||||
} else {
|
||||
@@ -898,8 +857,8 @@ SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
/* Specifics */
|
||||
periodic->dwMagnitude = CONVERT(SDL_abs(hap_periodic->magnitude));
|
||||
periodic->lOffset = CONVERT(hap_periodic->offset);
|
||||
periodic->dwPhase =
|
||||
(hap_periodic->phase + (hap_periodic->magnitude < 0 ? 18000 : 0)) % 36000;
|
||||
periodic->dwPhase =
|
||||
(hap_periodic->phase + (hap_periodic->magnitude < 0 ? 18000 : 0)) % 36000;
|
||||
periodic->dwPeriod = hap_periodic->period * 1000;
|
||||
dest->cbTypeSpecificParams = sizeof(FFPERIODIC);
|
||||
dest->lpvTypeSpecificParams = periodic;
|
||||
@@ -908,17 +867,15 @@ SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
dest->dwDuration = hap_periodic->length * 1000; /* In microseconds. */
|
||||
dest->dwTriggerButton = FFGetTriggerButton(hap_periodic->button);
|
||||
dest->dwTriggerRepeatInterval = hap_periodic->interval;
|
||||
dest->dwStartDelay = hap_periodic->delay * 1000; /* In microseconds. */
|
||||
dest->dwStartDelay = hap_periodic->delay * 1000; /* In microseconds. */
|
||||
|
||||
/* Direction. */
|
||||
if (SDL_SYS_SetDirection(dest, &hap_periodic->direction, dest->cAxes)
|
||||
< 0) {
|
||||
if (SDL_SYS_SetDirection(dest, &hap_periodic->direction, dest->cAxes) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Envelope */
|
||||
if ((hap_periodic->attack_length == 0)
|
||||
&& (hap_periodic->fade_length == 0)) {
|
||||
if ((hap_periodic->attack_length == 0) && (hap_periodic->fade_length == 0)) {
|
||||
SDL_free(envelope);
|
||||
dest->lpEnvelope = NULL;
|
||||
} else {
|
||||
@@ -961,14 +918,13 @@ SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
dest->lpvTypeSpecificParams = condition;
|
||||
|
||||
/* Generics */
|
||||
dest->dwDuration = hap_condition->length * 1000; /* In microseconds. */
|
||||
dest->dwDuration = hap_condition->length * 1000; /* In microseconds. */
|
||||
dest->dwTriggerButton = FFGetTriggerButton(hap_condition->button);
|
||||
dest->dwTriggerRepeatInterval = hap_condition->interval;
|
||||
dest->dwStartDelay = hap_condition->delay * 1000; /* In microseconds. */
|
||||
dest->dwStartDelay = hap_condition->delay * 1000; /* In microseconds. */
|
||||
|
||||
/* Direction. */
|
||||
if (SDL_SYS_SetDirection(dest, &hap_condition->direction, dest->cAxes)
|
||||
< 0) {
|
||||
if (SDL_SYS_SetDirection(dest, &hap_condition->direction, dest->cAxes) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -993,10 +949,10 @@ SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
dest->lpvTypeSpecificParams = ramp;
|
||||
|
||||
/* Generics */
|
||||
dest->dwDuration = hap_ramp->length * 1000; /* In microseconds. */
|
||||
dest->dwDuration = hap_ramp->length * 1000; /* In microseconds. */
|
||||
dest->dwTriggerButton = FFGetTriggerButton(hap_ramp->button);
|
||||
dest->dwTriggerRepeatInterval = hap_ramp->interval;
|
||||
dest->dwStartDelay = hap_ramp->delay * 1000; /* In microseconds. */
|
||||
dest->dwStartDelay = hap_ramp->delay * 1000; /* In microseconds. */
|
||||
|
||||
/* Direction. */
|
||||
if (SDL_SYS_SetDirection(dest, &hap_ramp->direction, dest->cAxes) < 0) {
|
||||
@@ -1030,17 +986,17 @@ SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
custom->cSamples = hap_custom->samples;
|
||||
custom->rglForceData =
|
||||
SDL_malloc(sizeof(LONG) * custom->cSamples * custom->cChannels);
|
||||
for (i = 0; i < hap_custom->samples * hap_custom->channels; i++) { /* Copy data. */
|
||||
for (i = 0; i < hap_custom->samples * hap_custom->channels; i++) { /* Copy data. */
|
||||
custom->rglForceData[i] = CCONVERT(hap_custom->data[i]);
|
||||
}
|
||||
dest->cbTypeSpecificParams = sizeof(FFCUSTOMFORCE);
|
||||
dest->lpvTypeSpecificParams = custom;
|
||||
|
||||
/* Generics */
|
||||
dest->dwDuration = hap_custom->length * 1000; /* In microseconds. */
|
||||
dest->dwDuration = hap_custom->length * 1000; /* In microseconds. */
|
||||
dest->dwTriggerButton = FFGetTriggerButton(hap_custom->button);
|
||||
dest->dwTriggerRepeatInterval = hap_custom->interval;
|
||||
dest->dwStartDelay = hap_custom->delay * 1000; /* In microseconds. */
|
||||
dest->dwStartDelay = hap_custom->delay * 1000; /* In microseconds. */
|
||||
|
||||
/* Direction. */
|
||||
if (SDL_SYS_SetDirection(dest, &hap_custom->direction, dest->cAxes) <
|
||||
@@ -1049,8 +1005,7 @@ SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
}
|
||||
|
||||
/* Envelope */
|
||||
if ((hap_custom->attack_length == 0)
|
||||
&& (hap_custom->fade_length == 0)) {
|
||||
if ((hap_custom->attack_length == 0) && (hap_custom->fade_length == 0)) {
|
||||
SDL_free(envelope);
|
||||
dest->lpEnvelope = NULL;
|
||||
} else {
|
||||
@@ -1062,7 +1017,6 @@ SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
return SDL_SetError("Haptic: Unknown effect type.");
|
||||
}
|
||||
@@ -1070,12 +1024,10 @@ SDL_SYS_ToFFEFFECT(SDL_Haptic * haptic, FFEFFECT * dest, SDL_HapticEffect * src)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Frees an FFEFFECT allocated by SDL_SYS_ToFFEFFECT.
|
||||
*/
|
||||
static void
|
||||
SDL_SYS_HapticFreeFFEFFECT(FFEFFECT * effect, int type)
|
||||
static void SDL_SYS_HapticFreeFFEFFECT(FFEFFECT *effect, int type)
|
||||
{
|
||||
FFCUSTOMFORCE *custom;
|
||||
|
||||
@@ -1084,8 +1036,8 @@ SDL_SYS_HapticFreeFFEFFECT(FFEFFECT * effect, int type)
|
||||
SDL_free(effect->rgdwAxes);
|
||||
effect->rgdwAxes = NULL;
|
||||
if (effect->lpvTypeSpecificParams != NULL) {
|
||||
if (type == SDL_HAPTIC_CUSTOM) { /* Must free the custom data. */
|
||||
custom = (FFCUSTOMFORCE *) effect->lpvTypeSpecificParams;
|
||||
if (type == SDL_HAPTIC_CUSTOM) { /* Must free the custom data. */
|
||||
custom = (FFCUSTOMFORCE *)effect->lpvTypeSpecificParams;
|
||||
SDL_free(custom->rglForceData);
|
||||
custom->rglForceData = NULL;
|
||||
}
|
||||
@@ -1096,7 +1048,6 @@ SDL_SYS_HapticFreeFFEFFECT(FFEFFECT * effect, int type)
|
||||
effect->rglDirection = NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Gets the effect type from the generic SDL haptic effect wrapper.
|
||||
*/
|
||||
@@ -1110,9 +1061,9 @@ SDL_SYS_HapticEffectType(Uint16 type)
|
||||
case SDL_HAPTIC_RAMP:
|
||||
return kFFEffectType_RampForce_ID;
|
||||
|
||||
/* !!! FIXME: put this back when we have more bits in 2.1 */
|
||||
/* case SDL_HAPTIC_SQUARE:
|
||||
return kFFEffectType_Square_ID; */
|
||||
/* !!! FIXME: put this back when we have more bits in 2.1 */
|
||||
/* case SDL_HAPTIC_SQUARE:
|
||||
return kFFEffectType_Square_ID; */
|
||||
|
||||
case SDL_HAPTIC_SINE:
|
||||
return kFFEffectType_Sine_ID;
|
||||
@@ -1147,13 +1098,11 @@ SDL_SYS_HapticEffectType(Uint16 type)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Creates a new haptic effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
SDL_HapticEffect * base)
|
||||
int SDL_SYS_HapticNewEffect(SDL_Haptic *haptic, struct haptic_effect *effect,
|
||||
SDL_HapticEffect *base)
|
||||
{
|
||||
HRESULT ret;
|
||||
CFUUIDRef type;
|
||||
@@ -1188,22 +1137,20 @@ SDL_SYS_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
|
||||
return 0;
|
||||
|
||||
err_effectdone:
|
||||
err_effectdone:
|
||||
SDL_SYS_HapticFreeFFEFFECT(&effect->hweffect->effect, base->type);
|
||||
err_hweffect:
|
||||
err_hweffect:
|
||||
SDL_free(effect->hweffect);
|
||||
effect->hweffect = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Updates an effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,
|
||||
struct haptic_effect *effect,
|
||||
SDL_HapticEffect * data)
|
||||
int SDL_SYS_HapticUpdateEffect(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect,
|
||||
SDL_HapticEffect *data)
|
||||
{
|
||||
HRESULT ret;
|
||||
FFEffectParameterFlag flags;
|
||||
@@ -1218,11 +1165,11 @@ SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,
|
||||
/* Set the flags. Might be worthwhile to diff temp with loaded effect and
|
||||
* only change those parameters. */
|
||||
flags = FFEP_DIRECTION |
|
||||
FFEP_DURATION |
|
||||
FFEP_ENVELOPE |
|
||||
FFEP_STARTDELAY |
|
||||
FFEP_TRIGGERBUTTON |
|
||||
FFEP_TRIGGERREPEATINTERVAL | FFEP_TYPESPECIFICPARAMS;
|
||||
FFEP_DURATION |
|
||||
FFEP_ENVELOPE |
|
||||
FFEP_STARTDELAY |
|
||||
FFEP_TRIGGERBUTTON |
|
||||
FFEP_TRIGGERREPEATINTERVAL | FFEP_TYPESPECIFICPARAMS;
|
||||
|
||||
/* Create the actual effect. */
|
||||
ret = FFEffectSetParameters(effect->hweffect->ref, &temp, flags);
|
||||
@@ -1237,18 +1184,16 @@ SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,
|
||||
|
||||
return 0;
|
||||
|
||||
err_update:
|
||||
err_update:
|
||||
SDL_SYS_HapticFreeFFEFFECT(&temp, data->type);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Runs an effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
Uint32 iterations)
|
||||
int SDL_SYS_HapticRunEffect(SDL_Haptic *haptic, struct haptic_effect *effect,
|
||||
Uint32 iterations)
|
||||
{
|
||||
HRESULT ret;
|
||||
Uint32 iter;
|
||||
@@ -1269,12 +1214,10 @@ SDL_SYS_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Stops an effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
int SDL_SYS_HapticStopEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
HRESULT ret;
|
||||
|
||||
@@ -1287,12 +1230,10 @@ SDL_SYS_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Frees the effect.
|
||||
*/
|
||||
void
|
||||
SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
void SDL_SYS_HapticDestroyEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
HRESULT ret;
|
||||
|
||||
@@ -1307,13 +1248,11 @@ SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
effect->hweffect = NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Gets the status of a haptic effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,
|
||||
struct haptic_effect *effect)
|
||||
int SDL_SYS_HapticGetEffectStatus(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect)
|
||||
{
|
||||
HRESULT ret;
|
||||
FFEffectStatusFlag status;
|
||||
@@ -1328,20 +1267,18 @@ SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,
|
||||
if (status == 0) {
|
||||
return SDL_FALSE;
|
||||
}
|
||||
return SDL_TRUE; /* Assume it's playing or emulated. */
|
||||
return SDL_TRUE; /* Assume it's playing or emulated. */
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Sets the gain.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
int SDL_SYS_HapticSetGain(SDL_Haptic *haptic, int gain)
|
||||
{
|
||||
HRESULT ret;
|
||||
Uint32 val;
|
||||
|
||||
val = gain * 100; /* macOS uses 0 to 10,000 */
|
||||
val = gain * 100; /* macOS uses 0 to 10,000 */
|
||||
ret = FFDeviceSetForceFeedbackProperty(haptic->hwdata->device,
|
||||
FFPROP_FFGAIN, &val);
|
||||
if (ret != FF_OK) {
|
||||
@@ -1351,12 +1288,10 @@ SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Sets the autocentering.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
int SDL_SYS_HapticSetAutocenter(SDL_Haptic *haptic, int autocenter)
|
||||
{
|
||||
HRESULT ret;
|
||||
Uint32 val;
|
||||
@@ -1378,12 +1313,10 @@ SDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Pauses the device.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticPause(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticPause(SDL_Haptic *haptic)
|
||||
{
|
||||
HRESULT ret;
|
||||
|
||||
@@ -1396,12 +1329,10 @@ SDL_SYS_HapticPause(SDL_Haptic * haptic)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Unpauses the device.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticUnpause(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticUnpause(SDL_Haptic *haptic)
|
||||
{
|
||||
HRESULT ret;
|
||||
|
||||
@@ -1414,12 +1345,10 @@ SDL_SYS_HapticUnpause(SDL_Haptic * haptic)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Stops all currently playing effects.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticStopAll(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticStopAll(SDL_Haptic *haptic)
|
||||
{
|
||||
HRESULT ret;
|
||||
|
||||
|
@@ -25,8 +25,7 @@
|
||||
#define kIOMainPortDefault kIOMasterPortDefault
|
||||
#endif
|
||||
|
||||
extern int MacHaptic_MaybeAddDevice( io_object_t device );
|
||||
extern int MacHaptic_MaybeRemoveDevice( io_object_t device );
|
||||
extern int MacHaptic_MaybeAddDevice(io_object_t device);
|
||||
extern int MacHaptic_MaybeRemoveDevice(io_object_t device);
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
||||
|
@@ -24,22 +24,17 @@
|
||||
|
||||
#include "../SDL_syshaptic.h"
|
||||
|
||||
|
||||
static int
|
||||
SDL_SYS_LogicError(void)
|
||||
static int SDL_SYS_LogicError(void)
|
||||
{
|
||||
return SDL_SetError("Logic error: No haptic devices available.");
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticInit(void)
|
||||
int SDL_SYS_HapticInit(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_NumHaptics(void)
|
||||
int SDL_SYS_NumHaptics(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
@@ -51,131 +46,98 @@ SDL_SYS_HapticName(int index)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticOpen(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticOpen(SDL_Haptic *haptic)
|
||||
{
|
||||
return SDL_SYS_LogicError();
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticMouse(void)
|
||||
int SDL_SYS_HapticMouse(void)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick)
|
||||
int SDL_SYS_JoystickIsHaptic(SDL_Joystick *joystick)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_SYS_HapticOpenFromJoystick(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
return SDL_SYS_LogicError();
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_SYS_JoystickSameHaptic(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SDL_SYS_HapticClose(SDL_Haptic * haptic)
|
||||
void SDL_SYS_HapticClose(SDL_Haptic *haptic)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SDL_SYS_HapticQuit(void)
|
||||
void SDL_SYS_HapticQuit(void)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticNewEffect(SDL_Haptic * haptic,
|
||||
struct haptic_effect *effect, SDL_HapticEffect * base)
|
||||
int SDL_SYS_HapticNewEffect(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect, SDL_HapticEffect *base)
|
||||
{
|
||||
return SDL_SYS_LogicError();
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,
|
||||
struct haptic_effect *effect,
|
||||
SDL_HapticEffect * data)
|
||||
int SDL_SYS_HapticUpdateEffect(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect,
|
||||
SDL_HapticEffect *data)
|
||||
{
|
||||
return SDL_SYS_LogicError();
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
Uint32 iterations)
|
||||
int SDL_SYS_HapticRunEffect(SDL_Haptic *haptic, struct haptic_effect *effect,
|
||||
Uint32 iterations)
|
||||
{
|
||||
return SDL_SYS_LogicError();
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
int SDL_SYS_HapticStopEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
return SDL_SYS_LogicError();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
void SDL_SYS_HapticDestroyEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
SDL_SYS_LogicError();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,
|
||||
struct haptic_effect *effect)
|
||||
int SDL_SYS_HapticGetEffectStatus(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect)
|
||||
{
|
||||
return SDL_SYS_LogicError();
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
int SDL_SYS_HapticSetGain(SDL_Haptic *haptic, int gain)
|
||||
{
|
||||
return SDL_SYS_LogicError();
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
SDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
int SDL_SYS_HapticSetAutocenter(SDL_Haptic *haptic, int autocenter)
|
||||
{
|
||||
return SDL_SYS_LogicError();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_HapticPause(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticPause(SDL_Haptic *haptic)
|
||||
{
|
||||
return SDL_SYS_LogicError();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_HapticUnpause(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticUnpause(SDL_Haptic *haptic)
|
||||
{
|
||||
return SDL_SYS_LogicError();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_HapticStopAll(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticStopAll(SDL_Haptic *haptic)
|
||||
{
|
||||
return SDL_SYS_LogicError();
|
||||
}
|
||||
|
@@ -23,20 +23,19 @@
|
||||
#ifdef SDL_HAPTIC_LINUX
|
||||
|
||||
#include "../SDL_syshaptic.h"
|
||||
#include "../../joystick/SDL_sysjoystick.h" /* For the real SDL_Joystick */
|
||||
#include "../../joystick/linux/SDL_sysjoystick_c.h" /* For joystick hwdata */
|
||||
#include "../../joystick/SDL_sysjoystick.h" /* For the real SDL_Joystick */
|
||||
#include "../../joystick/linux/SDL_sysjoystick_c.h" /* For joystick hwdata */
|
||||
#include "../../core/linux/SDL_evdev_capabilities.h"
|
||||
#include "../../core/linux/SDL_udev.h"
|
||||
|
||||
#include <unistd.h> /* close */
|
||||
#include <linux/input.h> /* Force feedback linux stuff. */
|
||||
#include <fcntl.h> /* O_RDWR */
|
||||
#include <limits.h> /* INT_MAX */
|
||||
#include <errno.h> /* errno, strerror */
|
||||
#include <sys/stat.h> /* stat */
|
||||
#include <unistd.h> /* close */
|
||||
#include <linux/input.h> /* Force feedback linux stuff. */
|
||||
#include <fcntl.h> /* O_RDWR */
|
||||
#include <limits.h> /* INT_MAX */
|
||||
#include <errno.h> /* errno, strerror */
|
||||
#include <sys/stat.h> /* stat */
|
||||
|
||||
|
||||
#define MAX_HAPTICS 32 /* It's doubtful someone has more then 32 evdev */
|
||||
#define MAX_HAPTICS 32 /* It's doubtful someone has more then 32 evdev */
|
||||
|
||||
static int MaybeAddDevice(const char *path);
|
||||
#if SDL_USE_LIBUDEV
|
||||
@@ -49,45 +48,42 @@ static void haptic_udev_callback(SDL_UDEV_deviceevent udev_type, int udev_class,
|
||||
*/
|
||||
typedef struct SDL_hapticlist_item
|
||||
{
|
||||
char *fname; /* Dev path name (like /dev/input/event1) */
|
||||
SDL_Haptic *haptic; /* Associated haptic. */
|
||||
char *fname; /* Dev path name (like /dev/input/event1) */
|
||||
SDL_Haptic *haptic; /* Associated haptic. */
|
||||
dev_t dev_num;
|
||||
struct SDL_hapticlist_item *next;
|
||||
} SDL_hapticlist_item;
|
||||
|
||||
|
||||
/*
|
||||
* Haptic system hardware data.
|
||||
*/
|
||||
struct haptic_hwdata
|
||||
{
|
||||
int fd; /* File descriptor of the device. */
|
||||
char *fname; /* Points to the name in SDL_hapticlist. */
|
||||
int fd; /* File descriptor of the device. */
|
||||
char *fname; /* Points to the name in SDL_hapticlist. */
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Haptic system effect data.
|
||||
*/
|
||||
struct haptic_hweffect
|
||||
{
|
||||
struct ff_effect effect; /* The linux kernel effect structure. */
|
||||
struct ff_effect effect; /* The linux kernel effect structure. */
|
||||
};
|
||||
|
||||
static SDL_hapticlist_item *SDL_hapticlist = NULL;
|
||||
static SDL_hapticlist_item *SDL_hapticlist_tail = NULL;
|
||||
static int numhaptics = 0;
|
||||
|
||||
#define EV_TEST(ev,f) \
|
||||
if (test_bit((ev), features)) { \
|
||||
ret |= (f); \
|
||||
}
|
||||
#define EV_TEST(ev, f) \
|
||||
if (test_bit((ev), features)) { \
|
||||
ret |= (f); \
|
||||
}
|
||||
/*
|
||||
* Test whether a device has haptic properties.
|
||||
* Returns available properties or 0 if there are none.
|
||||
*/
|
||||
static int
|
||||
EV_IsHaptic(int fd)
|
||||
static int EV_IsHaptic(int fd)
|
||||
{
|
||||
unsigned int ret;
|
||||
unsigned long features[1 + FF_MAX / sizeof(unsigned long)];
|
||||
@@ -121,12 +117,10 @@ EV_IsHaptic(int fd)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Tests whether a device is a mouse or not.
|
||||
*/
|
||||
static int
|
||||
EV_IsMouse(int fd)
|
||||
static int EV_IsMouse(int fd)
|
||||
{
|
||||
unsigned long argp[40];
|
||||
|
||||
@@ -146,8 +140,7 @@ EV_IsMouse(int fd)
|
||||
/*
|
||||
* Initializes the haptic subsystem by finding available devices.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticInit(void)
|
||||
int SDL_SYS_HapticInit(void)
|
||||
{
|
||||
const char joydev_pattern[] = "/dev/input/event%d";
|
||||
char path[PATH_MAX];
|
||||
@@ -169,7 +162,7 @@ SDL_SYS_HapticInit(void)
|
||||
return SDL_SetError("Could not initialize UDEV");
|
||||
}
|
||||
|
||||
if ( SDL_UDEV_AddCallback(haptic_udev_callback) < 0) {
|
||||
if (SDL_UDEV_AddCallback(haptic_udev_callback) < 0) {
|
||||
SDL_UDEV_Quit();
|
||||
return SDL_SetError("Could not setup haptic <-> udev callback");
|
||||
}
|
||||
@@ -181,14 +174,12 @@ SDL_SYS_HapticInit(void)
|
||||
return numhaptics;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_NumHaptics(void)
|
||||
int SDL_SYS_NumHaptics(void)
|
||||
{
|
||||
return numhaptics;
|
||||
}
|
||||
|
||||
static SDL_hapticlist_item *
|
||||
HapticByDevIndex(int device_index)
|
||||
static SDL_hapticlist_item *HapticByDevIndex(int device_index)
|
||||
{
|
||||
SDL_hapticlist_item *item = SDL_hapticlist;
|
||||
|
||||
@@ -212,25 +203,22 @@ static void haptic_udev_callback(SDL_UDEV_deviceevent udev_type, int udev_class,
|
||||
return;
|
||||
}
|
||||
|
||||
switch( udev_type )
|
||||
{
|
||||
case SDL_UDEV_DEVICEADDED:
|
||||
MaybeAddDevice(devpath);
|
||||
break;
|
||||
switch (udev_type) {
|
||||
case SDL_UDEV_DEVICEADDED:
|
||||
MaybeAddDevice(devpath);
|
||||
break;
|
||||
|
||||
case SDL_UDEV_DEVICEREMOVED:
|
||||
MaybeRemoveDevice(devpath);
|
||||
break;
|
||||
case SDL_UDEV_DEVICEREMOVED:
|
||||
MaybeRemoveDevice(devpath);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
#endif /* SDL_USE_LIBUDEV */
|
||||
|
||||
static int
|
||||
MaybeAddDevice(const char *path)
|
||||
static int MaybeAddDevice(const char *path)
|
||||
{
|
||||
struct stat sb;
|
||||
int fd;
|
||||
@@ -249,7 +237,7 @@ MaybeAddDevice(const char *path)
|
||||
/* check for duplicates */
|
||||
for (item = SDL_hapticlist; item != NULL; item = item->next) {
|
||||
if (item->dev_num == sb.st_rdev) {
|
||||
return -1; /* duplicate. */
|
||||
return -1; /* duplicate. */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -270,7 +258,7 @@ MaybeAddDevice(const char *path)
|
||||
return -1;
|
||||
}
|
||||
|
||||
item = (SDL_hapticlist_item *) SDL_calloc(1, sizeof (SDL_hapticlist_item));
|
||||
item = (SDL_hapticlist_item *)SDL_calloc(1, sizeof(SDL_hapticlist_item));
|
||||
if (item == NULL) {
|
||||
return -1;
|
||||
}
|
||||
@@ -299,8 +287,7 @@ MaybeAddDevice(const char *path)
|
||||
}
|
||||
|
||||
#if SDL_USE_LIBUDEV
|
||||
static int
|
||||
MaybeRemoveDevice(const char* path)
|
||||
static int MaybeRemoveDevice(const char *path)
|
||||
{
|
||||
SDL_hapticlist_item *item;
|
||||
SDL_hapticlist_item *prev = NULL;
|
||||
@@ -342,8 +329,7 @@ MaybeRemoveDevice(const char* path)
|
||||
/*
|
||||
* Gets the name from a file descriptor.
|
||||
*/
|
||||
static const char *
|
||||
SDL_SYS_HapticNameFromFD(int fd)
|
||||
static const char *SDL_SYS_HapticNameFromFD(int fd)
|
||||
{
|
||||
static char namebuf[128];
|
||||
|
||||
@@ -355,7 +341,6 @@ SDL_SYS_HapticNameFromFD(int fd)
|
||||
return namebuf;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Return the name of a haptic device, does not need to be opened.
|
||||
*/
|
||||
@@ -384,12 +369,10 @@ SDL_SYS_HapticName(int index)
|
||||
return name;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Opens the haptic device from the file descriptor.
|
||||
*/
|
||||
static int
|
||||
SDL_SYS_HapticOpenFromFD(SDL_Haptic * haptic, int fd)
|
||||
static int SDL_SYS_HapticOpenFromFD(SDL_Haptic *haptic, int fd)
|
||||
{
|
||||
/* Allocate the hwdata */
|
||||
haptic->hwdata = (struct haptic_hwdata *)
|
||||
@@ -403,7 +386,7 @@ SDL_SYS_HapticOpenFromFD(SDL_Haptic * haptic, int fd)
|
||||
/* Set the data. */
|
||||
haptic->hwdata->fd = fd;
|
||||
haptic->supported = EV_IsHaptic(fd);
|
||||
haptic->naxes = 2; /* Hardcoded for now, not sure if it's possible to find out. */
|
||||
haptic->naxes = 2; /* Hardcoded for now, not sure if it's possible to find out. */
|
||||
|
||||
/* Set the effects */
|
||||
if (ioctl(fd, EVIOCGEFFECTS, &haptic->neffects) < 0) {
|
||||
@@ -411,7 +394,7 @@ SDL_SYS_HapticOpenFromFD(SDL_Haptic * haptic, int fd)
|
||||
strerror(errno));
|
||||
goto open_err;
|
||||
}
|
||||
haptic->nplaying = haptic->neffects; /* Linux makes no distinction. */
|
||||
haptic->nplaying = haptic->neffects; /* Linux makes no distinction. */
|
||||
haptic->effects = (struct haptic_effect *)
|
||||
SDL_malloc(sizeof(struct haptic_effect) * haptic->neffects);
|
||||
if (haptic->effects == NULL) {
|
||||
@@ -425,7 +408,7 @@ SDL_SYS_HapticOpenFromFD(SDL_Haptic * haptic, int fd)
|
||||
return 0;
|
||||
|
||||
/* Error handling */
|
||||
open_err:
|
||||
open_err:
|
||||
close(fd);
|
||||
if (haptic->hwdata != NULL) {
|
||||
SDL_free(haptic->hwdata);
|
||||
@@ -434,12 +417,10 @@ SDL_SYS_HapticOpenFromFD(SDL_Haptic * haptic, int fd)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Opens a haptic device for usage.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticOpen(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticOpen(SDL_Haptic *haptic)
|
||||
{
|
||||
int fd;
|
||||
int ret;
|
||||
@@ -460,16 +441,14 @@ SDL_SYS_HapticOpen(SDL_Haptic * haptic)
|
||||
}
|
||||
|
||||
/* Set the fname. */
|
||||
haptic->hwdata->fname = SDL_strdup( item->fname );
|
||||
haptic->hwdata->fname = SDL_strdup(item->fname);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Opens a haptic device from first mouse it finds for usage.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticMouse(void)
|
||||
int SDL_SYS_HapticMouse(void)
|
||||
{
|
||||
int fd;
|
||||
int device_index = 0;
|
||||
@@ -497,12 +476,10 @@ SDL_SYS_HapticMouse(void)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Checks to see if a joystick has haptic features.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick)
|
||||
int SDL_SYS_JoystickIsHaptic(SDL_Joystick *joystick)
|
||||
{
|
||||
#ifdef SDL_JOYSTICK_LINUX
|
||||
if (joystick->driver != &SDL_LINUX_JoystickDriver) {
|
||||
@@ -515,12 +492,10 @@ SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick)
|
||||
return SDL_FALSE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Checks to see if the haptic device and joystick are in reality the same.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_SYS_JoystickSameHaptic(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
#ifdef SDL_JOYSTICK_LINUX
|
||||
if (joystick->driver != &SDL_LINUX_JoystickDriver) {
|
||||
@@ -535,19 +510,17 @@ SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Opens a SDL_Haptic from a SDL_Joystick.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_SYS_HapticOpenFromJoystick(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
#ifdef SDL_JOYSTICK_LINUX
|
||||
int device_index = 0;
|
||||
int fd;
|
||||
int ret;
|
||||
SDL_hapticlist_item *item;
|
||||
|
||||
|
||||
if (joystick->driver != &SDL_LINUX_JoystickDriver) {
|
||||
return -1;
|
||||
}
|
||||
@@ -574,7 +547,7 @@ SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
return -1;
|
||||
}
|
||||
|
||||
haptic->hwdata->fname = SDL_strdup( joystick->hwdata->fname );
|
||||
haptic->hwdata->fname = SDL_strdup(joystick->hwdata->fname);
|
||||
|
||||
return 0;
|
||||
#else
|
||||
@@ -582,12 +555,10 @@ SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Closes the haptic device.
|
||||
*/
|
||||
void
|
||||
SDL_SYS_HapticClose(SDL_Haptic * haptic)
|
||||
void SDL_SYS_HapticClose(SDL_Haptic *haptic)
|
||||
{
|
||||
if (haptic->hwdata) {
|
||||
|
||||
@@ -609,12 +580,10 @@ SDL_SYS_HapticClose(SDL_Haptic * haptic)
|
||||
SDL_memset(haptic, 0, sizeof(SDL_Haptic));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Clean up after system specific haptic stuff
|
||||
*/
|
||||
void
|
||||
SDL_SYS_HapticQuit(void)
|
||||
void SDL_SYS_HapticQuit(void)
|
||||
{
|
||||
SDL_hapticlist_item *item = NULL;
|
||||
SDL_hapticlist_item *next = NULL;
|
||||
@@ -637,12 +606,10 @@ SDL_SYS_HapticQuit(void)
|
||||
SDL_hapticlist_tail = NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Converts an SDL button to a ff_trigger button.
|
||||
*/
|
||||
static Uint16
|
||||
SDL_SYS_ToButton(Uint16 button)
|
||||
static Uint16 SDL_SYS_ToButton(Uint16 button)
|
||||
{
|
||||
Uint16 ff_button;
|
||||
|
||||
@@ -659,12 +626,10 @@ SDL_SYS_ToButton(Uint16 button)
|
||||
return ff_button;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Initializes the ff_effect usable direction from a SDL_HapticDirection.
|
||||
*/
|
||||
static int
|
||||
SDL_SYS_ToDirection(Uint16 *dest, SDL_HapticDirection * src)
|
||||
static int SDL_SYS_ToDirection(Uint16 *dest, SDL_HapticDirection *src)
|
||||
{
|
||||
Uint32 tmp;
|
||||
|
||||
@@ -682,21 +647,21 @@ SDL_SYS_ToDirection(Uint16 *dest, SDL_HapticDirection * src)
|
||||
i.e. the opposite convention of SDL directions.
|
||||
*/
|
||||
tmp = ((src->dir[0] % 36000) * 0x8000) / 18000; /* convert to range [0,0xFFFF] */
|
||||
*dest = (Uint16) tmp;
|
||||
*dest = (Uint16)tmp;
|
||||
break;
|
||||
|
||||
case SDL_HAPTIC_SPHERICAL:
|
||||
/*
|
||||
We convert to polar, because that's the only supported direction on Linux.
|
||||
The first value of a spherical direction is practically the same as a
|
||||
Polar direction, except that we have to add 90 degrees. It is the angle
|
||||
from EAST {1,0} towards SOUTH {0,1}.
|
||||
--> add 9000
|
||||
--> finally convert to [0,0xFFFF] as in case SDL_HAPTIC_POLAR.
|
||||
*/
|
||||
tmp = ((src->dir[0]) + 9000) % 36000; /* Convert to polars */
|
||||
tmp = (tmp * 0x8000) / 18000; /* convert to range [0,0xFFFF] */
|
||||
*dest = (Uint16) tmp;
|
||||
/*
|
||||
We convert to polar, because that's the only supported direction on Linux.
|
||||
The first value of a spherical direction is practically the same as a
|
||||
Polar direction, except that we have to add 90 degrees. It is the angle
|
||||
from EAST {1,0} towards SOUTH {0,1}.
|
||||
--> add 9000
|
||||
--> finally convert to [0,0xFFFF] as in case SDL_HAPTIC_POLAR.
|
||||
*/
|
||||
tmp = ((src->dir[0]) + 9000) % 36000; /* Convert to polars */
|
||||
tmp = (tmp * 0x8000) / 18000; /* convert to range [0,0xFFFF] */
|
||||
*dest = (Uint16)tmp;
|
||||
break;
|
||||
|
||||
case SDL_HAPTIC_CARTESIAN:
|
||||
@@ -705,20 +670,20 @@ SDL_SYS_ToDirection(Uint16 *dest, SDL_HapticDirection * src)
|
||||
else if (!src->dir[0])
|
||||
*dest = (src->dir[1] >= 0 ? 0x8000 : 0);
|
||||
else {
|
||||
float f = SDL_atan2(src->dir[1], src->dir[0]); /* Ideally we'd use fixed point math instead of floats... */
|
||||
/*
|
||||
SDL_atan2 takes the parameters: Y-axis-value and X-axis-value (in that order)
|
||||
- Y-axis-value is the second coordinate (from center to SOUTH)
|
||||
- X-axis-value is the first coordinate (from center to EAST)
|
||||
We add 36000, because SDL_atan2 also returns negative values. Then we practically
|
||||
have the first spherical value. Therefore we proceed as in case
|
||||
SDL_HAPTIC_SPHERICAL and add another 9000 to get the polar value.
|
||||
--> add 45000 in total
|
||||
--> finally convert to [0,0xFFFF] as in case SDL_HAPTIC_POLAR.
|
||||
*/
|
||||
tmp = (((Sint32) (f * 18000.0 / SDL_PI_D)) + 45000) % 36000;
|
||||
float f = SDL_atan2(src->dir[1], src->dir[0]); /* Ideally we'd use fixed point math instead of floats... */
|
||||
/*
|
||||
SDL_atan2 takes the parameters: Y-axis-value and X-axis-value (in that order)
|
||||
- Y-axis-value is the second coordinate (from center to SOUTH)
|
||||
- X-axis-value is the first coordinate (from center to EAST)
|
||||
We add 36000, because SDL_atan2 also returns negative values. Then we practically
|
||||
have the first spherical value. Therefore we proceed as in case
|
||||
SDL_HAPTIC_SPHERICAL and add another 9000 to get the polar value.
|
||||
--> add 45000 in total
|
||||
--> finally convert to [0,0xFFFF] as in case SDL_HAPTIC_POLAR.
|
||||
*/
|
||||
tmp = (((Sint32)(f * 18000.0 / SDL_PI_D)) + 45000) % 36000;
|
||||
tmp = (tmp * 0x8000) / 18000; /* convert to range [0,0xFFFF] */
|
||||
*dest = (Uint16) tmp;
|
||||
*dest = (Uint16)tmp;
|
||||
}
|
||||
break;
|
||||
case SDL_HAPTIC_STEERING_AXIS:
|
||||
@@ -731,14 +696,12 @@ SDL_SYS_ToDirection(Uint16 *dest, SDL_HapticDirection * src)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
#define CLAMP(x) (((x) > 32767) ? 32767 : x)
|
||||
#define CLAMP(x) (((x) > 32767) ? 32767 : x)
|
||||
/*
|
||||
* Initializes the Linux effect struct from a haptic_effect.
|
||||
* Values above 32767 (for unsigned) are unspecified so we must clamp.
|
||||
*/
|
||||
static int
|
||||
SDL_SYS_ToFFEffect(struct ff_effect *dest, SDL_HapticEffect * src)
|
||||
static int SDL_SYS_ToFFEffect(struct ff_effect *dest, SDL_HapticEffect *src)
|
||||
{
|
||||
SDL_HapticConstant *constant;
|
||||
SDL_HapticPeriodic *periodic;
|
||||
@@ -760,8 +723,7 @@ SDL_SYS_ToFFEffect(struct ff_effect *dest, SDL_HapticEffect * src)
|
||||
}
|
||||
|
||||
/* Replay */
|
||||
dest->replay.length = (constant->length == SDL_HAPTIC_INFINITY) ?
|
||||
0 : CLAMP(constant->length);
|
||||
dest->replay.length = (constant->length == SDL_HAPTIC_INFINITY) ? 0 : CLAMP(constant->length);
|
||||
dest->replay.delay = CLAMP(constant->delay);
|
||||
|
||||
/* Trigger */
|
||||
@@ -796,8 +758,7 @@ SDL_SYS_ToFFEffect(struct ff_effect *dest, SDL_HapticEffect * src)
|
||||
}
|
||||
|
||||
/* Replay */
|
||||
dest->replay.length = (periodic->length == SDL_HAPTIC_INFINITY) ?
|
||||
0 : CLAMP(periodic->length);
|
||||
dest->replay.length = (periodic->length == SDL_HAPTIC_INFINITY) ? 0 : CLAMP(periodic->length);
|
||||
dest->replay.delay = CLAMP(periodic->delay);
|
||||
|
||||
/* Trigger */
|
||||
@@ -807,9 +768,9 @@ SDL_SYS_ToFFEffect(struct ff_effect *dest, SDL_HapticEffect * src)
|
||||
/* Periodic */
|
||||
if (periodic->type == SDL_HAPTIC_SINE) {
|
||||
dest->u.periodic.waveform = FF_SINE;
|
||||
/* !!! FIXME: put this back when we have more bits in 2.1 */
|
||||
/* else if (periodic->type == SDL_HAPTIC_SQUARE)
|
||||
dest->u.periodic.waveform = FF_SQUARE; */
|
||||
/* !!! FIXME: put this back when we have more bits in 2.1 */
|
||||
/* else if (periodic->type == SDL_HAPTIC_SQUARE)
|
||||
dest->u.periodic.waveform = FF_SQUARE; */
|
||||
} else if (periodic->type == SDL_HAPTIC_TRIANGLE) {
|
||||
dest->u.periodic.waveform = FF_TRIANGLE;
|
||||
} else if (periodic->type == SDL_HAPTIC_SAWTOOTHUP) {
|
||||
@@ -849,12 +810,11 @@ SDL_SYS_ToFFEffect(struct ff_effect *dest, SDL_HapticEffect * src)
|
||||
} else if (condition->type == SDL_HAPTIC_FRICTION) {
|
||||
dest->type = FF_FRICTION;
|
||||
}
|
||||
|
||||
dest->direction = 0; /* Handled by the condition-specifics. */
|
||||
|
||||
dest->direction = 0; /* Handled by the condition-specifics. */
|
||||
|
||||
/* Replay */
|
||||
dest->replay.length = (condition->length == SDL_HAPTIC_INFINITY) ?
|
||||
0 : CLAMP(condition->length);
|
||||
dest->replay.length = (condition->length == SDL_HAPTIC_INFINITY) ? 0 : CLAMP(condition->length);
|
||||
dest->replay.delay = CLAMP(condition->delay);
|
||||
|
||||
/* Trigger */
|
||||
@@ -893,8 +853,7 @@ SDL_SYS_ToFFEffect(struct ff_effect *dest, SDL_HapticEffect * src)
|
||||
}
|
||||
|
||||
/* Replay */
|
||||
dest->replay.length = (ramp->length == SDL_HAPTIC_INFINITY) ?
|
||||
0 : CLAMP(ramp->length);
|
||||
dest->replay.length = (ramp->length == SDL_HAPTIC_INFINITY) ? 0 : CLAMP(ramp->length);
|
||||
dest->replay.delay = CLAMP(ramp->delay);
|
||||
|
||||
/* Trigger */
|
||||
@@ -921,8 +880,7 @@ SDL_SYS_ToFFEffect(struct ff_effect *dest, SDL_HapticEffect * src)
|
||||
dest->direction = 0;
|
||||
|
||||
/* Replay */
|
||||
dest->replay.length = (leftright->length == SDL_HAPTIC_INFINITY) ?
|
||||
0 : CLAMP(leftright->length);
|
||||
dest->replay.length = (leftright->length == SDL_HAPTIC_INFINITY) ? 0 : CLAMP(leftright->length);
|
||||
|
||||
/* Trigger */
|
||||
dest->trigger.button = 0;
|
||||
@@ -934,7 +892,6 @@ SDL_SYS_ToFFEffect(struct ff_effect *dest, SDL_HapticEffect * src)
|
||||
|
||||
break;
|
||||
|
||||
|
||||
default:
|
||||
return SDL_SetError("Haptic: Unknown effect type.");
|
||||
}
|
||||
@@ -942,13 +899,11 @@ SDL_SYS_ToFFEffect(struct ff_effect *dest, SDL_HapticEffect * src)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Creates a new haptic effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
SDL_HapticEffect * base)
|
||||
int SDL_SYS_HapticNewEffect(SDL_Haptic *haptic, struct haptic_effect *effect,
|
||||
SDL_HapticEffect *base)
|
||||
{
|
||||
struct ff_effect *linux_effect;
|
||||
|
||||
@@ -964,7 +919,7 @@ SDL_SYS_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
if (SDL_SYS_ToFFEffect(linux_effect, base) != 0) {
|
||||
goto new_effect_err;
|
||||
}
|
||||
linux_effect->id = -1; /* Have the kernel give it an id */
|
||||
linux_effect->id = -1; /* Have the kernel give it an id */
|
||||
|
||||
/* Upload the effect */
|
||||
if (ioctl(haptic->hwdata->fd, EVIOCSFF, linux_effect) < 0) {
|
||||
@@ -975,23 +930,21 @@ SDL_SYS_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
|
||||
return 0;
|
||||
|
||||
new_effect_err:
|
||||
new_effect_err:
|
||||
SDL_free(effect->hweffect);
|
||||
effect->hweffect = NULL;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Updates an effect.
|
||||
*
|
||||
* Note: Dynamically updating the direction can in some cases force
|
||||
* the effect to restart and run once.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,
|
||||
struct haptic_effect *effect,
|
||||
SDL_HapticEffect * data)
|
||||
int SDL_SYS_HapticUpdateEffect(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect,
|
||||
SDL_HapticEffect *data)
|
||||
{
|
||||
struct ff_effect linux_effect;
|
||||
|
||||
@@ -1014,13 +967,11 @@ SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,
|
||||
return effect->hweffect->effect.id;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Runs an effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
Uint32 iterations)
|
||||
int SDL_SYS_HapticRunEffect(SDL_Haptic *haptic, struct haptic_effect *effect,
|
||||
Uint32 iterations)
|
||||
{
|
||||
struct input_event run;
|
||||
|
||||
@@ -1030,19 +981,17 @@ SDL_SYS_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
/* We don't actually have infinity here, so we just do INT_MAX which is pretty damn close. */
|
||||
run.value = (iterations > INT_MAX) ? INT_MAX : iterations;
|
||||
|
||||
if (write(haptic->hwdata->fd, (const void *) &run, sizeof(run)) < 0) {
|
||||
if (write(haptic->hwdata->fd, (const void *)&run, sizeof(run)) < 0) {
|
||||
return SDL_SetError("Haptic: Unable to run the effect: %s", strerror(errno));
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Stops an effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
int SDL_SYS_HapticStopEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
struct input_event stop;
|
||||
|
||||
@@ -1050,7 +999,7 @@ SDL_SYS_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
stop.code = effect->hweffect->effect.id;
|
||||
stop.value = 0;
|
||||
|
||||
if (write(haptic->hwdata->fd, (const void *) &stop, sizeof(stop)) < 0) {
|
||||
if (write(haptic->hwdata->fd, (const void *)&stop, sizeof(stop)) < 0) {
|
||||
return SDL_SetError("Haptic: Unable to stop the effect: %s",
|
||||
strerror(errno));
|
||||
}
|
||||
@@ -1058,12 +1007,10 @@ SDL_SYS_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Frees the effect.
|
||||
*/
|
||||
void
|
||||
SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
void SDL_SYS_HapticDestroyEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
if (ioctl(haptic->hwdata->fd, EVIOCRMFF, effect->hweffect->effect.id) < 0) {
|
||||
SDL_SetError("Haptic: Error removing the effect from the device: %s",
|
||||
@@ -1073,15 +1020,13 @@ SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
effect->hweffect = NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Gets the status of a haptic effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,
|
||||
struct haptic_effect *effect)
|
||||
int SDL_SYS_HapticGetEffectStatus(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect)
|
||||
{
|
||||
#if 0 /* Not supported atm. */
|
||||
#if 0 /* Not supported atm. */
|
||||
struct input_event ie;
|
||||
|
||||
ie.type = EV_FF;
|
||||
@@ -1098,12 +1043,10 @@ SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Sets the gain.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
int SDL_SYS_HapticSetGain(SDL_Haptic *haptic, int gain)
|
||||
{
|
||||
struct input_event ie;
|
||||
|
||||
@@ -1118,12 +1061,10 @@ SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Sets the autocentering.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
int SDL_SYS_HapticSetAutocenter(SDL_Haptic *haptic, int autocenter)
|
||||
{
|
||||
struct input_event ie;
|
||||
|
||||
@@ -1138,32 +1079,26 @@ SDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Pausing is not supported atm by linux.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticPause(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticPause(SDL_Haptic *haptic)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Unpausing is not supported atm by linux.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticUnpause(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticUnpause(SDL_Haptic *haptic)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Stops all the currently playing effects.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticStopAll(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticStopAll(SDL_Haptic *haptic)
|
||||
{
|
||||
int i, ret;
|
||||
|
||||
@@ -1172,8 +1107,7 @@ SDL_SYS_HapticStopAll(SDL_Haptic * haptic)
|
||||
if (haptic->effects[i].hweffect != NULL) {
|
||||
ret = SDL_SYS_HapticStopEffect(haptic, &haptic->effects[i]);
|
||||
if (ret < 0) {
|
||||
return SDL_SetError
|
||||
("Haptic: Error while trying to stop all playing effects.");
|
||||
return SDL_SetError("Haptic: Error while trying to stop all playing effects.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -37,19 +37,16 @@ extern HWND SDL_HelperWindow;
|
||||
static const HWND SDL_HelperWindow = NULL;
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Internal stuff.
|
||||
*/
|
||||
static SDL_bool coinitialized = SDL_FALSE;
|
||||
static LPDIRECTINPUT8 dinput = NULL;
|
||||
|
||||
|
||||
/*
|
||||
* Like SDL_SetError but for DX error codes.
|
||||
*/
|
||||
static int
|
||||
DI_SetError(const char *str, HRESULT err)
|
||||
static int DI_SetError(const char *str, HRESULT err)
|
||||
{
|
||||
return SDL_SetError("Haptic error %s", str);
|
||||
}
|
||||
@@ -57,22 +54,20 @@ DI_SetError(const char *str, HRESULT err)
|
||||
/*
|
||||
* Callback to find the haptic devices.
|
||||
*/
|
||||
static BOOL CALLBACK
|
||||
EnumHapticsCallback(const DIDEVICEINSTANCE * pdidInstance, VOID * pContext)
|
||||
static BOOL CALLBACK EnumHapticsCallback(const DIDEVICEINSTANCE *pdidInstance, VOID *pContext)
|
||||
{
|
||||
(void) pContext;
|
||||
(void)pContext;
|
||||
SDL_DINPUT_HapticMaybeAddDevice(pdidInstance);
|
||||
return DIENUM_CONTINUE; /* continue enumerating */
|
||||
return DIENUM_CONTINUE; /* continue enumerating */
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticInit(void)
|
||||
int SDL_DINPUT_HapticInit(void)
|
||||
{
|
||||
HRESULT ret;
|
||||
HINSTANCE instance;
|
||||
DWORD devClass;
|
||||
|
||||
if (dinput != NULL) { /* Already open. */
|
||||
if (dinput != NULL) { /* Already open. */
|
||||
return SDL_SetError("Haptic: SubSystem already open.");
|
||||
}
|
||||
|
||||
@@ -89,7 +84,7 @@ SDL_DINPUT_HapticInit(void)
|
||||
coinitialized = SDL_TRUE;
|
||||
|
||||
ret = CoCreateInstance(&CLSID_DirectInput8, NULL, CLSCTX_INPROC_SERVER,
|
||||
&IID_IDirectInput8, (LPVOID *) &dinput);
|
||||
&IID_IDirectInput8, (LPVOID *)&dinput);
|
||||
if (FAILED(ret)) {
|
||||
SDL_SYS_HapticQuit();
|
||||
return DI_SetError("CoCreateInstance", ret);
|
||||
@@ -100,7 +95,7 @@ SDL_DINPUT_HapticInit(void)
|
||||
if (instance == NULL) {
|
||||
SDL_SYS_HapticQuit();
|
||||
return SDL_SetError("GetModuleHandle() failed with error code %lu.",
|
||||
GetLastError());
|
||||
GetLastError());
|
||||
}
|
||||
ret = IDirectInput8_Initialize(dinput, instance, DIRECTINPUT_VERSION);
|
||||
if (FAILED(ret)) {
|
||||
@@ -120,7 +115,7 @@ SDL_DINPUT_HapticInit(void)
|
||||
EnumHapticsCallback,
|
||||
NULL,
|
||||
DIEDFL_FORCEFEEDBACK |
|
||||
DIEDFL_ATTACHEDONLY);
|
||||
DIEDFL_ATTACHEDONLY);
|
||||
if (FAILED(ret)) {
|
||||
SDL_SYS_HapticQuit();
|
||||
return DI_SetError("Enumerating DirectInput devices", ret);
|
||||
@@ -130,8 +125,7 @@ SDL_DINPUT_HapticInit(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticMaybeAddDevice(const DIDEVICEINSTANCE * pdidInstance)
|
||||
int SDL_DINPUT_HapticMaybeAddDevice(const DIDEVICEINSTANCE *pdidInstance)
|
||||
{
|
||||
HRESULT ret;
|
||||
LPDIRECTINPUTDEVICE8 device;
|
||||
@@ -140,13 +134,13 @@ SDL_DINPUT_HapticMaybeAddDevice(const DIDEVICEINSTANCE * pdidInstance)
|
||||
SDL_hapticlist_item *item = NULL;
|
||||
|
||||
if (dinput == NULL) {
|
||||
return -1; /* not initialized. We'll pick these up on enumeration if we init later. */
|
||||
return -1; /* not initialized. We'll pick these up on enumeration if we init later. */
|
||||
}
|
||||
|
||||
/* Make sure we don't already have it */
|
||||
for (item = SDL_hapticlist; item; item = item->next) {
|
||||
if ((!item->bXInputHaptic) && (SDL_memcmp(&item->instance, pdidInstance, sizeof(*pdidInstance)) == 0)) {
|
||||
return -1; /* Already added */
|
||||
return -1; /* Already added */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -168,7 +162,7 @@ SDL_DINPUT_HapticMaybeAddDevice(const DIDEVICEINSTANCE * pdidInstance)
|
||||
}
|
||||
|
||||
if ((capabilities.dwFlags & needflags) != needflags) {
|
||||
return -1; /* not a device we can use. */
|
||||
return -1; /* not a device we can use. */
|
||||
}
|
||||
|
||||
item = (SDL_hapticlist_item *)SDL_calloc(1, sizeof(SDL_hapticlist_item));
|
||||
@@ -189,14 +183,13 @@ SDL_DINPUT_HapticMaybeAddDevice(const DIDEVICEINSTANCE * pdidInstance)
|
||||
return SDL_SYS_AddHapticDevice(item);
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticMaybeRemoveDevice(const DIDEVICEINSTANCE * pdidInstance)
|
||||
int SDL_DINPUT_HapticMaybeRemoveDevice(const DIDEVICEINSTANCE *pdidInstance)
|
||||
{
|
||||
SDL_hapticlist_item *item;
|
||||
SDL_hapticlist_item *prev = NULL;
|
||||
|
||||
if (dinput == NULL) {
|
||||
return -1; /* not initialized, ignore this. */
|
||||
return -1; /* not initialized, ignore this. */
|
||||
}
|
||||
|
||||
for (item = SDL_hapticlist; item != NULL; item = item->next) {
|
||||
@@ -212,10 +205,9 @@ SDL_DINPUT_HapticMaybeRemoveDevice(const DIDEVICEINSTANCE * pdidInstance)
|
||||
/*
|
||||
* Callback to get supported axes.
|
||||
*/
|
||||
static BOOL CALLBACK
|
||||
DI_DeviceObjectCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID pvRef)
|
||||
static BOOL CALLBACK DI_DeviceObjectCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID pvRef)
|
||||
{
|
||||
SDL_Haptic *haptic = (SDL_Haptic *) pvRef;
|
||||
SDL_Haptic *haptic = (SDL_Haptic *)pvRef;
|
||||
|
||||
if ((dev->dwType & DIDFT_AXIS) && (dev->dwFlags & DIDOI_FFACTUATOR)) {
|
||||
const GUID *guid = &dev->guidType;
|
||||
@@ -233,7 +225,7 @@ DI_DeviceObjectCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID pvRef)
|
||||
} else if (WIN_IsEqualGUID(guid, &GUID_RzAxis)) {
|
||||
offset = DIJOFS_RZ;
|
||||
} else {
|
||||
return DIENUM_CONTINUE; /* can't use this, go on. */
|
||||
return DIENUM_CONTINUE; /* can't use this, go on. */
|
||||
}
|
||||
|
||||
haptic->hwdata->axes[haptic->naxes] = offset;
|
||||
@@ -251,14 +243,13 @@ DI_DeviceObjectCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID pvRef)
|
||||
/*
|
||||
* Callback to get all supported effects.
|
||||
*/
|
||||
#define EFFECT_TEST(e,s) \
|
||||
if (WIN_IsEqualGUID(&pei->guid, &(e))) \
|
||||
haptic->supported |= (s)
|
||||
static BOOL CALLBACK
|
||||
DI_EffectCallback(LPCDIEFFECTINFO pei, LPVOID pv)
|
||||
#define EFFECT_TEST(e, s) \
|
||||
if (WIN_IsEqualGUID(&pei->guid, &(e))) \
|
||||
haptic->supported |= (s)
|
||||
static BOOL CALLBACK DI_EffectCallback(LPCDIEFFECTINFO pei, LPVOID pv)
|
||||
{
|
||||
/* Prepare the haptic device. */
|
||||
SDL_Haptic *haptic = (SDL_Haptic *) pv;
|
||||
SDL_Haptic *haptic = (SDL_Haptic *)pv;
|
||||
|
||||
/* Get supported. */
|
||||
EFFECT_TEST(GUID_Spring, SDL_HAPTIC_SPRING);
|
||||
@@ -289,8 +280,7 @@ DI_EffectCallback(LPCDIEFFECTINFO pei, LPVOID pv)
|
||||
* - Reset actuators.
|
||||
* - Get supported features.
|
||||
*/
|
||||
static int
|
||||
SDL_DINPUT_HapticOpenFromDevice(SDL_Haptic * haptic, LPDIRECTINPUTDEVICE8 device8, SDL_bool is_joystick)
|
||||
static int SDL_DINPUT_HapticOpenFromDevice(SDL_Haptic *haptic, LPDIRECTINPUTDEVICE8 device8, SDL_bool is_joystick)
|
||||
{
|
||||
HRESULT ret;
|
||||
DIPROPDWORD dipdw;
|
||||
@@ -313,12 +303,12 @@ SDL_DINPUT_HapticOpenFromDevice(SDL_Haptic * haptic, LPDIRECTINPUTDEVICE8 device
|
||||
!!! FIXME: to work, and that's probably the common case. Still,
|
||||
!!! FIXME: ideally, We need to unify the opening code. */
|
||||
|
||||
if (!is_joystick) { /* if is_joystick, we already set this up elsewhere. */
|
||||
if (!is_joystick) { /* if is_joystick, we already set this up elsewhere. */
|
||||
/* Grab it exclusively to use force feedback stuff. */
|
||||
ret = IDirectInputDevice8_SetCooperativeLevel(haptic->hwdata->device,
|
||||
SDL_HelperWindow,
|
||||
DISCL_EXCLUSIVE |
|
||||
DISCL_BACKGROUND);
|
||||
DISCL_BACKGROUND);
|
||||
if (FAILED(ret)) {
|
||||
DI_SetError("Setting cooperative level to exclusive", ret);
|
||||
goto acquire_err;
|
||||
@@ -332,7 +322,6 @@ SDL_DINPUT_HapticOpenFromDevice(SDL_Haptic * haptic, LPDIRECTINPUTDEVICE8 device
|
||||
goto acquire_err;
|
||||
}
|
||||
|
||||
|
||||
/* Acquire the device. */
|
||||
ret = IDirectInputDevice8_Acquire(haptic->hwdata->device);
|
||||
if (FAILED(ret)) {
|
||||
@@ -374,7 +363,7 @@ SDL_DINPUT_HapticOpenFromDevice(SDL_Haptic * haptic, LPDIRECTINPUTDEVICE8 device
|
||||
DI_SetError("Enumerating supported effects", ret);
|
||||
goto acquire_err;
|
||||
}
|
||||
if (haptic->supported == 0) { /* Error since device supports nothing. */
|
||||
if (haptic->supported == 0) { /* Error since device supports nothing. */
|
||||
SDL_SetError("Haptic: Internal error on finding supported effects.");
|
||||
goto acquire_err;
|
||||
}
|
||||
@@ -387,7 +376,7 @@ SDL_DINPUT_HapticOpenFromDevice(SDL_Haptic * haptic, LPDIRECTINPUTDEVICE8 device
|
||||
dipdw.dwData = 10000;
|
||||
ret = IDirectInputDevice8_SetProperty(haptic->hwdata->device,
|
||||
DIPROP_FFGAIN, &dipdw.diph);
|
||||
if (!FAILED(ret)) { /* Gain is supported. */
|
||||
if (!FAILED(ret)) { /* Gain is supported. */
|
||||
haptic->supported |= SDL_HAPTIC_GAIN;
|
||||
}
|
||||
dipdw.diph.dwObj = 0;
|
||||
@@ -395,7 +384,7 @@ SDL_DINPUT_HapticOpenFromDevice(SDL_Haptic * haptic, LPDIRECTINPUTDEVICE8 device
|
||||
dipdw.dwData = DIPROPAUTOCENTER_OFF;
|
||||
ret = IDirectInputDevice8_SetProperty(haptic->hwdata->device,
|
||||
DIPROP_AUTOCENTER, &dipdw.diph);
|
||||
if (!FAILED(ret)) { /* Autocenter is supported. */
|
||||
if (!FAILED(ret)) { /* Autocenter is supported. */
|
||||
haptic->supported |= SDL_HAPTIC_AUTOCENTER;
|
||||
}
|
||||
|
||||
@@ -403,11 +392,11 @@ SDL_DINPUT_HapticOpenFromDevice(SDL_Haptic * haptic, LPDIRECTINPUTDEVICE8 device
|
||||
haptic->supported |= SDL_HAPTIC_STATUS | SDL_HAPTIC_PAUSE;
|
||||
|
||||
/* Check maximum effects. */
|
||||
haptic->neffects = 128; /* This is not actually supported as thus under windows,
|
||||
there is no way to tell the number of EFFECTS that a
|
||||
device can hold, so we'll just use a "random" number
|
||||
instead and put warnings in SDL_haptic.h */
|
||||
haptic->nplaying = 128; /* Even more impossible to get this then neffects. */
|
||||
haptic->neffects = 128; /* This is not actually supported as thus under windows,
|
||||
there is no way to tell the number of EFFECTS that a
|
||||
device can hold, so we'll just use a "random" number
|
||||
instead and put warnings in SDL_haptic.h */
|
||||
haptic->nplaying = 128; /* Even more impossible to get this then neffects. */
|
||||
|
||||
/* Prepare effects memory. */
|
||||
haptic->effects = (struct haptic_effect *)
|
||||
@@ -423,20 +412,19 @@ SDL_DINPUT_HapticOpenFromDevice(SDL_Haptic * haptic, LPDIRECTINPUTDEVICE8 device
|
||||
return 0;
|
||||
|
||||
/* Error handling */
|
||||
acquire_err:
|
||||
acquire_err:
|
||||
IDirectInputDevice8_Unacquire(haptic->hwdata->device);
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticOpen(SDL_Haptic * haptic, SDL_hapticlist_item *item)
|
||||
int SDL_DINPUT_HapticOpen(SDL_Haptic *haptic, SDL_hapticlist_item *item)
|
||||
{
|
||||
HRESULT ret;
|
||||
LPDIRECTINPUTDEVICE8 device;
|
||||
|
||||
/* Open the device */
|
||||
ret = IDirectInput8_CreateDevice(dinput, &item->instance.guidInstance,
|
||||
&device, NULL);
|
||||
&device, NULL);
|
||||
if (FAILED(ret)) {
|
||||
DI_SetError("Creating DirectInput device", ret);
|
||||
return -1;
|
||||
@@ -449,8 +437,7 @@ SDL_DINPUT_HapticOpen(SDL_Haptic * haptic, SDL_hapticlist_item *item)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_DINPUT_JoystickSameHaptic(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
HRESULT ret;
|
||||
DIDEVICEINSTANCE hap_instance, joy_instance;
|
||||
@@ -460,12 +447,12 @@ SDL_DINPUT_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
|
||||
/* Get the device instances. */
|
||||
ret = IDirectInputDevice8_GetDeviceInfo(haptic->hwdata->device,
|
||||
&hap_instance);
|
||||
&hap_instance);
|
||||
if (FAILED(ret)) {
|
||||
return 0;
|
||||
}
|
||||
ret = IDirectInputDevice8_GetDeviceInfo(joystick->hwdata->InputDevice,
|
||||
&joy_instance);
|
||||
&joy_instance);
|
||||
if (FAILED(ret)) {
|
||||
return 0;
|
||||
}
|
||||
@@ -473,8 +460,7 @@ SDL_DINPUT_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
return WIN_IsEqualGUID(&hap_instance.guidInstance, &joy_instance.guidInstance);
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_DINPUT_HapticOpenFromJoystick(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
SDL_hapticlist_item *item;
|
||||
int index = 0;
|
||||
@@ -499,8 +485,7 @@ SDL_DINPUT_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
return SDL_SetError("Couldn't find joystick in haptic device list");
|
||||
}
|
||||
|
||||
void
|
||||
SDL_DINPUT_HapticClose(SDL_Haptic * haptic)
|
||||
void SDL_DINPUT_HapticClose(SDL_Haptic *haptic)
|
||||
{
|
||||
IDirectInputDevice8_Unacquire(haptic->hwdata->device);
|
||||
|
||||
@@ -510,8 +495,7 @@ SDL_DINPUT_HapticClose(SDL_Haptic * haptic)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
SDL_DINPUT_HapticQuit(void)
|
||||
void SDL_DINPUT_HapticQuit(void)
|
||||
{
|
||||
if (dinput != NULL) {
|
||||
IDirectInput8_Release(dinput);
|
||||
@@ -527,8 +511,7 @@ SDL_DINPUT_HapticQuit(void)
|
||||
/*
|
||||
* Converts an SDL trigger button to an DIEFFECT trigger button.
|
||||
*/
|
||||
static DWORD
|
||||
DIGetTriggerButton(Uint16 button)
|
||||
static DWORD DIGetTriggerButton(Uint16 button)
|
||||
{
|
||||
DWORD dwTriggerButton;
|
||||
|
||||
@@ -541,18 +524,16 @@ DIGetTriggerButton(Uint16 button)
|
||||
return dwTriggerButton;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Sets the direction.
|
||||
*/
|
||||
static int
|
||||
SDL_SYS_SetDirection(DIEFFECT * effect, SDL_HapticDirection * dir, int naxes)
|
||||
static int SDL_SYS_SetDirection(DIEFFECT *effect, SDL_HapticDirection *dir, int naxes)
|
||||
{
|
||||
LONG *rglDir;
|
||||
|
||||
/* Handle no axes a part. */
|
||||
if (naxes == 0) {
|
||||
effect->dwFlags |= DIEFF_SPHERICAL; /* Set as default. */
|
||||
effect->dwFlags |= DIEFF_SPHERICAL; /* Set as default. */
|
||||
effect->rglDirection = NULL;
|
||||
return 0;
|
||||
}
|
||||
@@ -601,20 +582,19 @@ SDL_SYS_SetDirection(DIEFFECT * effect, SDL_HapticDirection * dir, int naxes)
|
||||
}
|
||||
|
||||
/* Clamps and converts. */
|
||||
#define CCONVERT(x) (((x) > 0x7FFF) ? 10000 : ((x)*10000) / 0x7FFF)
|
||||
#define CCONVERT(x) (((x) > 0x7FFF) ? 10000 : ((x)*10000) / 0x7FFF)
|
||||
/* Just converts. */
|
||||
#define CONVERT(x) (((x)*10000) / 0x7FFF)
|
||||
#define CONVERT(x) (((x)*10000) / 0x7FFF)
|
||||
/*
|
||||
* Creates the DIEFFECT from a SDL_HapticEffect.
|
||||
*/
|
||||
static int
|
||||
SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
SDL_HapticEffect * src)
|
||||
static int SDL_SYS_ToDIEFFECT(SDL_Haptic *haptic, DIEFFECT *dest,
|
||||
SDL_HapticEffect *src)
|
||||
{
|
||||
int i;
|
||||
DICONSTANTFORCE *constant;
|
||||
DIPERIODIC *periodic;
|
||||
DICONDITION *condition; /* Actually an array of conditions - one per axis. */
|
||||
DICONDITION *condition; /* Actually an array of conditions - one per axis. */
|
||||
DIRAMPFORCE *ramp;
|
||||
DICUSTOMFORCE *custom;
|
||||
DIENVELOPE *envelope;
|
||||
@@ -627,10 +607,10 @@ SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
|
||||
/* Set global stuff. */
|
||||
SDL_memset(dest, 0, sizeof(DIEFFECT));
|
||||
dest->dwSize = sizeof(DIEFFECT); /* Set the structure size. */
|
||||
dest->dwSamplePeriod = 0; /* Not used by us. */
|
||||
dest->dwGain = 10000; /* Gain is set globally, not locally. */
|
||||
dest->dwFlags = DIEFF_OBJECTOFFSETS; /* Seems obligatory. */
|
||||
dest->dwSize = sizeof(DIEFFECT); /* Set the structure size. */
|
||||
dest->dwSamplePeriod = 0; /* Not used by us. */
|
||||
dest->dwGain = 10000; /* Gain is set globally, not locally. */
|
||||
dest->dwFlags = DIEFF_OBJECTOFFSETS; /* Seems obligatory. */
|
||||
|
||||
/* Envelope. */
|
||||
envelope = SDL_malloc(sizeof(DIENVELOPE));
|
||||
@@ -639,7 +619,7 @@ SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
}
|
||||
SDL_memset(envelope, 0, sizeof(DIENVELOPE));
|
||||
dest->lpEnvelope = envelope;
|
||||
envelope->dwSize = sizeof(DIENVELOPE); /* Always should be this. */
|
||||
envelope->dwSize = sizeof(DIENVELOPE); /* Always should be this. */
|
||||
|
||||
/* Axes. */
|
||||
if (src->constant.direction.type == SDL_HAPTIC_STEERING_AXIS) {
|
||||
@@ -652,7 +632,7 @@ SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
if (axes == NULL) {
|
||||
return SDL_OutOfMemory();
|
||||
}
|
||||
axes[0] = haptic->hwdata->axes[0]; /* Always at least one axis. */
|
||||
axes[0] = haptic->hwdata->axes[0]; /* Always at least one axis. */
|
||||
if (dest->cAxes > 1) {
|
||||
axes[1] = haptic->hwdata->axes[1];
|
||||
}
|
||||
@@ -681,7 +661,7 @@ SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
dest->dwDuration = hap_constant->length * 1000; /* In microseconds. */
|
||||
dest->dwTriggerButton = DIGetTriggerButton(hap_constant->button);
|
||||
dest->dwTriggerRepeatInterval = hap_constant->interval;
|
||||
dest->dwStartDelay = hap_constant->delay * 1000; /* In microseconds. */
|
||||
dest->dwStartDelay = hap_constant->delay * 1000; /* In microseconds. */
|
||||
|
||||
/* Direction. */
|
||||
if (SDL_SYS_SetDirection(dest, &hap_constant->direction, dest->cAxes) < 0) {
|
||||
@@ -689,8 +669,7 @@ SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
}
|
||||
|
||||
/* Envelope */
|
||||
if ((hap_constant->attack_length == 0)
|
||||
&& (hap_constant->fade_length == 0)) {
|
||||
if ((hap_constant->attack_length == 0) && (hap_constant->fade_length == 0)) {
|
||||
SDL_free(dest->lpEnvelope);
|
||||
dest->lpEnvelope = NULL;
|
||||
} else {
|
||||
@@ -719,7 +698,7 @@ SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
periodic->dwMagnitude = CONVERT(SDL_abs(hap_periodic->magnitude));
|
||||
periodic->lOffset = CONVERT(hap_periodic->offset);
|
||||
periodic->dwPhase =
|
||||
(hap_periodic->phase + (hap_periodic->magnitude < 0 ? 18000 : 0)) % 36000;
|
||||
(hap_periodic->phase + (hap_periodic->magnitude < 0 ? 18000 : 0)) % 36000;
|
||||
periodic->dwPeriod = hap_periodic->period * 1000;
|
||||
dest->cbTypeSpecificParams = sizeof(DIPERIODIC);
|
||||
dest->lpvTypeSpecificParams = periodic;
|
||||
@@ -728,17 +707,15 @@ SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
dest->dwDuration = hap_periodic->length * 1000; /* In microseconds. */
|
||||
dest->dwTriggerButton = DIGetTriggerButton(hap_periodic->button);
|
||||
dest->dwTriggerRepeatInterval = hap_periodic->interval;
|
||||
dest->dwStartDelay = hap_periodic->delay * 1000; /* In microseconds. */
|
||||
dest->dwStartDelay = hap_periodic->delay * 1000; /* In microseconds. */
|
||||
|
||||
/* Direction. */
|
||||
if (SDL_SYS_SetDirection(dest, &hap_periodic->direction, dest->cAxes)
|
||||
< 0) {
|
||||
if (SDL_SYS_SetDirection(dest, &hap_periodic->direction, dest->cAxes) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Envelope */
|
||||
if ((hap_periodic->attack_length == 0)
|
||||
&& (hap_periodic->fade_length == 0)) {
|
||||
if ((hap_periodic->attack_length == 0) && (hap_periodic->fade_length == 0)) {
|
||||
SDL_free(dest->lpEnvelope);
|
||||
dest->lpEnvelope = NULL;
|
||||
} else {
|
||||
@@ -762,7 +739,7 @@ SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
SDL_memset(condition, 0, sizeof(DICONDITION));
|
||||
|
||||
/* Specifics */
|
||||
for (i = 0; i < (int) dest->cAxes; i++) {
|
||||
for (i = 0; i < (int)dest->cAxes; i++) {
|
||||
condition[i].lOffset = CONVERT(hap_condition->center[i]);
|
||||
condition[i].lPositiveCoefficient =
|
||||
CONVERT(hap_condition->right_coeff[i]);
|
||||
@@ -778,14 +755,13 @@ SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
dest->lpvTypeSpecificParams = condition;
|
||||
|
||||
/* Generics */
|
||||
dest->dwDuration = hap_condition->length * 1000; /* In microseconds. */
|
||||
dest->dwDuration = hap_condition->length * 1000; /* In microseconds. */
|
||||
dest->dwTriggerButton = DIGetTriggerButton(hap_condition->button);
|
||||
dest->dwTriggerRepeatInterval = hap_condition->interval;
|
||||
dest->dwStartDelay = hap_condition->delay * 1000; /* In microseconds. */
|
||||
dest->dwStartDelay = hap_condition->delay * 1000; /* In microseconds. */
|
||||
|
||||
/* Direction. */
|
||||
if (SDL_SYS_SetDirection(dest, &hap_condition->direction, dest->cAxes)
|
||||
< 0) {
|
||||
if (SDL_SYS_SetDirection(dest, &hap_condition->direction, dest->cAxes) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -810,10 +786,10 @@ SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
dest->lpvTypeSpecificParams = ramp;
|
||||
|
||||
/* Generics */
|
||||
dest->dwDuration = hap_ramp->length * 1000; /* In microseconds. */
|
||||
dest->dwDuration = hap_ramp->length * 1000; /* In microseconds. */
|
||||
dest->dwTriggerButton = DIGetTriggerButton(hap_ramp->button);
|
||||
dest->dwTriggerRepeatInterval = hap_ramp->interval;
|
||||
dest->dwStartDelay = hap_ramp->delay * 1000; /* In microseconds. */
|
||||
dest->dwStartDelay = hap_ramp->delay * 1000; /* In microseconds. */
|
||||
|
||||
/* Direction. */
|
||||
if (SDL_SYS_SetDirection(dest, &hap_ramp->direction, dest->cAxes) < 0) {
|
||||
@@ -847,17 +823,17 @@ SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
custom->cSamples = hap_custom->samples;
|
||||
custom->rglForceData =
|
||||
SDL_malloc(sizeof(LONG) * custom->cSamples * custom->cChannels);
|
||||
for (i = 0; i < hap_custom->samples * hap_custom->channels; i++) { /* Copy data. */
|
||||
for (i = 0; i < hap_custom->samples * hap_custom->channels; i++) { /* Copy data. */
|
||||
custom->rglForceData[i] = CCONVERT(hap_custom->data[i]);
|
||||
}
|
||||
dest->cbTypeSpecificParams = sizeof(DICUSTOMFORCE);
|
||||
dest->lpvTypeSpecificParams = custom;
|
||||
|
||||
/* Generics */
|
||||
dest->dwDuration = hap_custom->length * 1000; /* In microseconds. */
|
||||
dest->dwDuration = hap_custom->length * 1000; /* In microseconds. */
|
||||
dest->dwTriggerButton = DIGetTriggerButton(hap_custom->button);
|
||||
dest->dwTriggerRepeatInterval = hap_custom->interval;
|
||||
dest->dwStartDelay = hap_custom->delay * 1000; /* In microseconds. */
|
||||
dest->dwStartDelay = hap_custom->delay * 1000; /* In microseconds. */
|
||||
|
||||
/* Direction. */
|
||||
if (SDL_SYS_SetDirection(dest, &hap_custom->direction, dest->cAxes) < 0) {
|
||||
@@ -865,8 +841,7 @@ SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
}
|
||||
|
||||
/* Envelope */
|
||||
if ((hap_custom->attack_length == 0)
|
||||
&& (hap_custom->fade_length == 0)) {
|
||||
if ((hap_custom->attack_length == 0) && (hap_custom->fade_length == 0)) {
|
||||
SDL_free(dest->lpEnvelope);
|
||||
dest->lpEnvelope = NULL;
|
||||
} else {
|
||||
@@ -885,12 +860,10 @@ SDL_SYS_ToDIEFFECT(SDL_Haptic * haptic, DIEFFECT * dest,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Frees an DIEFFECT allocated by SDL_SYS_ToDIEFFECT.
|
||||
*/
|
||||
static void
|
||||
SDL_SYS_HapticFreeDIEFFECT(DIEFFECT * effect, int type)
|
||||
static void SDL_SYS_HapticFreeDIEFFECT(DIEFFECT *effect, int type)
|
||||
{
|
||||
DICUSTOMFORCE *custom;
|
||||
|
||||
@@ -899,8 +872,8 @@ SDL_SYS_HapticFreeDIEFFECT(DIEFFECT * effect, int type)
|
||||
SDL_free(effect->rgdwAxes);
|
||||
effect->rgdwAxes = NULL;
|
||||
if (effect->lpvTypeSpecificParams != NULL) {
|
||||
if (type == SDL_HAPTIC_CUSTOM) { /* Must free the custom data. */
|
||||
custom = (DICUSTOMFORCE *) effect->lpvTypeSpecificParams;
|
||||
if (type == SDL_HAPTIC_CUSTOM) { /* Must free the custom data. */
|
||||
custom = (DICUSTOMFORCE *)effect->lpvTypeSpecificParams;
|
||||
SDL_free(custom->rglForceData);
|
||||
custom->rglForceData = NULL;
|
||||
}
|
||||
@@ -914,8 +887,7 @@ SDL_SYS_HapticFreeDIEFFECT(DIEFFECT * effect, int type)
|
||||
/*
|
||||
* Gets the effect type from the generic SDL haptic effect wrapper.
|
||||
*/
|
||||
static REFGUID
|
||||
SDL_SYS_HapticEffectType(SDL_HapticEffect * effect)
|
||||
static REFGUID SDL_SYS_HapticEffectType(SDL_HapticEffect *effect)
|
||||
{
|
||||
switch (effect->type) {
|
||||
case SDL_HAPTIC_CONSTANT:
|
||||
@@ -924,9 +896,9 @@ SDL_SYS_HapticEffectType(SDL_HapticEffect * effect)
|
||||
case SDL_HAPTIC_RAMP:
|
||||
return &GUID_RampForce;
|
||||
|
||||
/* !!! FIXME: put this back when we have more bits in 2.1 */
|
||||
/* case SDL_HAPTIC_SQUARE:
|
||||
return &GUID_Square; */
|
||||
/* !!! FIXME: put this back when we have more bits in 2.1 */
|
||||
/* case SDL_HAPTIC_SQUARE:
|
||||
return &GUID_Square; */
|
||||
|
||||
case SDL_HAPTIC_SINE:
|
||||
return &GUID_Sine;
|
||||
@@ -959,8 +931,7 @@ SDL_SYS_HapticEffectType(SDL_HapticEffect * effect)
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
int
|
||||
SDL_DINPUT_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SDL_HapticEffect * base)
|
||||
int SDL_DINPUT_HapticNewEffect(SDL_Haptic *haptic, struct haptic_effect *effect, SDL_HapticEffect *base)
|
||||
{
|
||||
HRESULT ret;
|
||||
REFGUID type = SDL_SYS_HapticEffectType(base);
|
||||
@@ -976,8 +947,8 @@ SDL_DINPUT_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SD
|
||||
|
||||
/* Create the actual effect. */
|
||||
ret = IDirectInputDevice8_CreateEffect(haptic->hwdata->device, type,
|
||||
&effect->hweffect->effect,
|
||||
&effect->hweffect->ref, NULL);
|
||||
&effect->hweffect->effect,
|
||||
&effect->hweffect->ref, NULL);
|
||||
if (FAILED(ret)) {
|
||||
DI_SetError("Unable to create effect", ret);
|
||||
goto err_effectdone;
|
||||
@@ -990,8 +961,7 @@ err_effectdone:
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticUpdateEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SDL_HapticEffect * data)
|
||||
int SDL_DINPUT_HapticUpdateEffect(SDL_Haptic *haptic, struct haptic_effect *effect, SDL_HapticEffect *data)
|
||||
{
|
||||
HRESULT ret;
|
||||
DWORD flags;
|
||||
@@ -1004,13 +974,13 @@ SDL_DINPUT_HapticUpdateEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
}
|
||||
|
||||
/* Set the flags. Might be worthwhile to diff temp with loaded effect and
|
||||
* only change those parameters. */
|
||||
* only change those parameters. */
|
||||
flags = DIEP_DIRECTION |
|
||||
DIEP_DURATION |
|
||||
DIEP_ENVELOPE |
|
||||
DIEP_STARTDELAY |
|
||||
DIEP_TRIGGERBUTTON |
|
||||
DIEP_TRIGGERREPEATINTERVAL | DIEP_TYPESPECIFICPARAMS;
|
||||
DIEP_DURATION |
|
||||
DIEP_ENVELOPE |
|
||||
DIEP_STARTDELAY |
|
||||
DIEP_TRIGGERBUTTON |
|
||||
DIEP_TRIGGERREPEATINTERVAL | DIEP_TYPESPECIFICPARAMS;
|
||||
|
||||
/* Create the actual effect. */
|
||||
ret =
|
||||
@@ -1044,8 +1014,7 @@ err_update:
|
||||
return -1;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect, Uint32 iterations)
|
||||
int SDL_DINPUT_HapticRunEffect(SDL_Haptic *haptic, struct haptic_effect *effect, Uint32 iterations)
|
||||
{
|
||||
HRESULT ret;
|
||||
DWORD iter;
|
||||
@@ -1065,8 +1034,7 @@ SDL_DINPUT_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect, Ui
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
int SDL_DINPUT_HapticStopEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
HRESULT ret;
|
||||
|
||||
@@ -1077,8 +1045,7 @@ SDL_DINPUT_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
SDL_DINPUT_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
void SDL_DINPUT_HapticDestroyEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
HRESULT ret;
|
||||
|
||||
@@ -1089,8 +1056,7 @@ SDL_DINPUT_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect
|
||||
SDL_SYS_HapticFreeDIEFFECT(&effect->hweffect->effect, effect->effect.type);
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticGetEffectStatus(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
int SDL_DINPUT_HapticGetEffectStatus(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
HRESULT ret;
|
||||
DWORD status;
|
||||
@@ -1106,8 +1072,7 @@ SDL_DINPUT_HapticGetEffectStatus(SDL_Haptic * haptic, struct haptic_effect *effe
|
||||
return SDL_TRUE;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
int SDL_DINPUT_HapticSetGain(SDL_Haptic *haptic, int gain)
|
||||
{
|
||||
HRESULT ret;
|
||||
DIPROPDWORD dipdw;
|
||||
@@ -1117,19 +1082,18 @@ SDL_DINPUT_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
|
||||
dipdw.diph.dwObj = 0;
|
||||
dipdw.diph.dwHow = DIPH_DEVICE;
|
||||
dipdw.dwData = gain * 100; /* 0 to 10,000 */
|
||||
dipdw.dwData = gain * 100; /* 0 to 10,000 */
|
||||
|
||||
/* Try to set the autocenter. */
|
||||
ret = IDirectInputDevice8_SetProperty(haptic->hwdata->device,
|
||||
DIPROP_FFGAIN, &dipdw.diph);
|
||||
DIPROP_FFGAIN, &dipdw.diph);
|
||||
if (FAILED(ret)) {
|
||||
return DI_SetError("Setting gain", ret);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
int SDL_DINPUT_HapticSetAutocenter(SDL_Haptic *haptic, int autocenter)
|
||||
{
|
||||
HRESULT ret;
|
||||
DIPROPDWORD dipdw;
|
||||
@@ -1139,54 +1103,50 @@ SDL_DINPUT_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
dipdw.diph.dwHeaderSize = sizeof(DIPROPHEADER);
|
||||
dipdw.diph.dwObj = 0;
|
||||
dipdw.diph.dwHow = DIPH_DEVICE;
|
||||
dipdw.dwData = (autocenter == 0) ? DIPROPAUTOCENTER_OFF :
|
||||
DIPROPAUTOCENTER_ON;
|
||||
dipdw.dwData = (autocenter == 0) ? DIPROPAUTOCENTER_OFF : DIPROPAUTOCENTER_ON;
|
||||
|
||||
/* Try to set the autocenter. */
|
||||
ret = IDirectInputDevice8_SetProperty(haptic->hwdata->device,
|
||||
DIPROP_AUTOCENTER, &dipdw.diph);
|
||||
DIPROP_AUTOCENTER, &dipdw.diph);
|
||||
if (FAILED(ret)) {
|
||||
return DI_SetError("Setting autocenter", ret);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticPause(SDL_Haptic * haptic)
|
||||
int SDL_DINPUT_HapticPause(SDL_Haptic *haptic)
|
||||
{
|
||||
HRESULT ret;
|
||||
|
||||
/* Pause the device. */
|
||||
ret = IDirectInputDevice8_SendForceFeedbackCommand(haptic->hwdata->device,
|
||||
DISFFC_PAUSE);
|
||||
DISFFC_PAUSE);
|
||||
if (FAILED(ret)) {
|
||||
return DI_SetError("Pausing the device", ret);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticUnpause(SDL_Haptic * haptic)
|
||||
int SDL_DINPUT_HapticUnpause(SDL_Haptic *haptic)
|
||||
{
|
||||
HRESULT ret;
|
||||
|
||||
/* Unpause the device. */
|
||||
ret = IDirectInputDevice8_SendForceFeedbackCommand(haptic->hwdata->device,
|
||||
DISFFC_CONTINUE);
|
||||
DISFFC_CONTINUE);
|
||||
if (FAILED(ret)) {
|
||||
return DI_SetError("Pausing the device", ret);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticStopAll(SDL_Haptic * haptic)
|
||||
int SDL_DINPUT_HapticStopAll(SDL_Haptic *haptic)
|
||||
{
|
||||
HRESULT ret;
|
||||
|
||||
/* Try to stop the effects. */
|
||||
ret = IDirectInputDevice8_SendForceFeedbackCommand(haptic->hwdata->device,
|
||||
DISFFC_STOPALL);
|
||||
DISFFC_STOPALL);
|
||||
if (FAILED(ret)) {
|
||||
return DI_SetError("Stopping the device", ret);
|
||||
}
|
||||
@@ -1198,113 +1158,94 @@ SDL_DINPUT_HapticStopAll(SDL_Haptic * haptic)
|
||||
typedef struct DIDEVICEINSTANCE DIDEVICEINSTANCE;
|
||||
typedef struct SDL_hapticlist_item SDL_hapticlist_item;
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticInit(void)
|
||||
int SDL_DINPUT_HapticInit(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticMaybeAddDevice(const DIDEVICEINSTANCE * pdidInstance)
|
||||
int SDL_DINPUT_HapticMaybeAddDevice(const DIDEVICEINSTANCE *pdidInstance)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticMaybeRemoveDevice(const DIDEVICEINSTANCE * pdidInstance)
|
||||
int SDL_DINPUT_HapticMaybeRemoveDevice(const DIDEVICEINSTANCE *pdidInstance)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticOpen(SDL_Haptic * haptic, SDL_hapticlist_item *item)
|
||||
int SDL_DINPUT_HapticOpen(SDL_Haptic *haptic, SDL_hapticlist_item *item)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_DINPUT_JoystickSameHaptic(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_DINPUT_HapticOpenFromJoystick(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
void
|
||||
SDL_DINPUT_HapticClose(SDL_Haptic * haptic)
|
||||
void SDL_DINPUT_HapticClose(SDL_Haptic *haptic)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
SDL_DINPUT_HapticQuit(void)
|
||||
void SDL_DINPUT_HapticQuit(void)
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SDL_HapticEffect * base)
|
||||
int SDL_DINPUT_HapticNewEffect(SDL_Haptic *haptic, struct haptic_effect *effect, SDL_HapticEffect *base)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticUpdateEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SDL_HapticEffect * data)
|
||||
int SDL_DINPUT_HapticUpdateEffect(SDL_Haptic *haptic, struct haptic_effect *effect, SDL_HapticEffect *data)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect, Uint32 iterations)
|
||||
int SDL_DINPUT_HapticRunEffect(SDL_Haptic *haptic, struct haptic_effect *effect, Uint32 iterations)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
int SDL_DINPUT_HapticStopEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
void
|
||||
SDL_DINPUT_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
void SDL_DINPUT_HapticDestroyEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticGetEffectStatus(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
int SDL_DINPUT_HapticGetEffectStatus(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
int SDL_DINPUT_HapticSetGain(SDL_Haptic *haptic, int gain)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
int SDL_DINPUT_HapticSetAutocenter(SDL_Haptic *haptic, int autocenter)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticPause(SDL_Haptic * haptic)
|
||||
int SDL_DINPUT_HapticPause(SDL_Haptic *haptic)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticUnpause(SDL_Haptic * haptic)
|
||||
int SDL_DINPUT_HapticUnpause(SDL_Haptic *haptic)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_DINPUT_HapticStopAll(SDL_Haptic * haptic)
|
||||
int SDL_DINPUT_HapticStopAll(SDL_Haptic *haptic)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
@@ -30,22 +30,22 @@ extern "C" {
|
||||
extern int SDL_DINPUT_HapticInit(void);
|
||||
extern int SDL_DINPUT_HapticMaybeAddDevice(const DIDEVICEINSTANCE *pdidInstance);
|
||||
extern int SDL_DINPUT_HapticMaybeRemoveDevice(const DIDEVICEINSTANCE *pdidInstance);
|
||||
extern int SDL_DINPUT_HapticOpen(SDL_Haptic * haptic, SDL_hapticlist_item *item);
|
||||
extern int SDL_DINPUT_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick);
|
||||
extern int SDL_DINPUT_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick);
|
||||
extern void SDL_DINPUT_HapticClose(SDL_Haptic * haptic);
|
||||
extern int SDL_DINPUT_HapticOpen(SDL_Haptic *haptic, SDL_hapticlist_item *item);
|
||||
extern int SDL_DINPUT_JoystickSameHaptic(SDL_Haptic *haptic, SDL_Joystick *joystick);
|
||||
extern int SDL_DINPUT_HapticOpenFromJoystick(SDL_Haptic *haptic, SDL_Joystick *joystick);
|
||||
extern void SDL_DINPUT_HapticClose(SDL_Haptic *haptic);
|
||||
extern void SDL_DINPUT_HapticQuit(void);
|
||||
extern int SDL_DINPUT_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SDL_HapticEffect * base);
|
||||
extern int SDL_DINPUT_HapticUpdateEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SDL_HapticEffect * data);
|
||||
extern int SDL_DINPUT_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect, Uint32 iterations);
|
||||
extern int SDL_DINPUT_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect);
|
||||
extern void SDL_DINPUT_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect);
|
||||
extern int SDL_DINPUT_HapticGetEffectStatus(SDL_Haptic * haptic, struct haptic_effect *effect);
|
||||
extern int SDL_DINPUT_HapticSetGain(SDL_Haptic * haptic, int gain);
|
||||
extern int SDL_DINPUT_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter);
|
||||
extern int SDL_DINPUT_HapticPause(SDL_Haptic * haptic);
|
||||
extern int SDL_DINPUT_HapticUnpause(SDL_Haptic * haptic);
|
||||
extern int SDL_DINPUT_HapticStopAll(SDL_Haptic * haptic);
|
||||
extern int SDL_DINPUT_HapticNewEffect(SDL_Haptic *haptic, struct haptic_effect *effect, SDL_HapticEffect *base);
|
||||
extern int SDL_DINPUT_HapticUpdateEffect(SDL_Haptic *haptic, struct haptic_effect *effect, SDL_HapticEffect *data);
|
||||
extern int SDL_DINPUT_HapticRunEffect(SDL_Haptic *haptic, struct haptic_effect *effect, Uint32 iterations);
|
||||
extern int SDL_DINPUT_HapticStopEffect(SDL_Haptic *haptic, struct haptic_effect *effect);
|
||||
extern void SDL_DINPUT_HapticDestroyEffect(SDL_Haptic *haptic, struct haptic_effect *effect);
|
||||
extern int SDL_DINPUT_HapticGetEffectStatus(SDL_Haptic *haptic, struct haptic_effect *effect);
|
||||
extern int SDL_DINPUT_HapticSetGain(SDL_Haptic *haptic, int gain);
|
||||
extern int SDL_DINPUT_HapticSetAutocenter(SDL_Haptic *haptic, int autocenter);
|
||||
extern int SDL_DINPUT_HapticPause(SDL_Haptic *haptic);
|
||||
extern int SDL_DINPUT_HapticUnpause(SDL_Haptic *haptic);
|
||||
extern int SDL_DINPUT_HapticStopAll(SDL_Haptic *haptic);
|
||||
|
||||
/* Ends C function definitions when using C++ */
|
||||
#ifdef __cplusplus
|
||||
|
@@ -23,9 +23,9 @@
|
||||
#if SDL_HAPTIC_DINPUT || SDL_HAPTIC_XINPUT
|
||||
|
||||
#include "../SDL_syshaptic.h"
|
||||
#include "../../joystick/SDL_sysjoystick.h" /* For the real SDL_Joystick */
|
||||
#include "../../joystick/windows/SDL_windowsjoystick_c.h" /* For joystick hwdata */
|
||||
#include "../../joystick/windows/SDL_xinputjoystick_c.h" /* For xinput rumble */
|
||||
#include "../../joystick/SDL_sysjoystick.h" /* For the real SDL_Joystick */
|
||||
#include "../../joystick/windows/SDL_windowsjoystick_c.h" /* For joystick hwdata */
|
||||
#include "../../joystick/windows/SDL_xinputjoystick_c.h" /* For xinput rumble */
|
||||
|
||||
#include "SDL_windowshaptic_c.h"
|
||||
#include "SDL_dinputhaptic_c.h"
|
||||
@@ -43,14 +43,12 @@ SDL_hapticlist_item *SDL_hapticlist = NULL;
|
||||
static SDL_hapticlist_item *SDL_hapticlist_tail = NULL;
|
||||
static int numhaptics = 0;
|
||||
|
||||
|
||||
/*
|
||||
* Initializes the haptic subsystem.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticInit(void)
|
||||
int SDL_SYS_HapticInit(void)
|
||||
{
|
||||
JoyStick_DeviceData* device;
|
||||
JoyStick_DeviceData *device;
|
||||
|
||||
if (SDL_DINPUT_HapticInit() < 0) {
|
||||
return -1;
|
||||
@@ -75,8 +73,7 @@ SDL_SYS_HapticInit(void)
|
||||
return numhaptics;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_AddHapticDevice(SDL_hapticlist_item *item)
|
||||
int SDL_SYS_AddHapticDevice(SDL_hapticlist_item *item)
|
||||
{
|
||||
if (SDL_hapticlist_tail == NULL) {
|
||||
SDL_hapticlist = SDL_hapticlist_tail = item;
|
||||
@@ -91,8 +88,7 @@ SDL_SYS_AddHapticDevice(SDL_hapticlist_item *item)
|
||||
return numhaptics;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_RemoveHapticDevice(SDL_hapticlist_item *prev, SDL_hapticlist_item *item)
|
||||
int SDL_SYS_RemoveHapticDevice(SDL_hapticlist_item *prev, SDL_hapticlist_item *item)
|
||||
{
|
||||
const int retval = item->haptic ? item->haptic->index : -1;
|
||||
if (prev != NULL) {
|
||||
@@ -110,14 +106,12 @@ SDL_SYS_RemoveHapticDevice(SDL_hapticlist_item *prev, SDL_hapticlist_item *item)
|
||||
return retval;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_SYS_NumHaptics(void)
|
||||
int SDL_SYS_NumHaptics(void)
|
||||
{
|
||||
return numhaptics;
|
||||
}
|
||||
|
||||
static SDL_hapticlist_item *
|
||||
HapticByDevIndex(int device_index)
|
||||
static SDL_hapticlist_item *HapticByDevIndex(int device_index)
|
||||
{
|
||||
SDL_hapticlist_item *item = SDL_hapticlist;
|
||||
|
||||
@@ -146,8 +140,7 @@ SDL_SYS_HapticName(int index)
|
||||
/*
|
||||
* Opens a haptic device for usage.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticOpen(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticOpen(SDL_Haptic *haptic)
|
||||
{
|
||||
SDL_hapticlist_item *item = HapticByDevIndex(haptic->index);
|
||||
if (item->bXInputHaptic) {
|
||||
@@ -157,12 +150,10 @@ SDL_SYS_HapticOpen(SDL_Haptic * haptic)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Opens a haptic device from first mouse it finds for usage.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticMouse(void)
|
||||
int SDL_SYS_HapticMouse(void)
|
||||
{
|
||||
#if SDL_HAPTIC_DINPUT
|
||||
SDL_hapticlist_item *item;
|
||||
@@ -179,12 +170,10 @@ SDL_SYS_HapticMouse(void)
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Checks to see if a joystick has haptic features.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick)
|
||||
int SDL_SYS_JoystickIsHaptic(SDL_Joystick *joystick)
|
||||
{
|
||||
if (joystick->driver != &SDL_WINDOWS_JoystickDriver) {
|
||||
return 0;
|
||||
@@ -205,14 +194,13 @@ SDL_SYS_JoystickIsHaptic(SDL_Joystick * joystick)
|
||||
/*
|
||||
* Checks to see if the haptic device and joystick are in reality the same.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_SYS_JoystickSameHaptic(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
if (joystick->driver != &SDL_WINDOWS_JoystickDriver) {
|
||||
return 0;
|
||||
}
|
||||
if (joystick->hwdata->bXInputHaptic != haptic->hwdata->bXInputHaptic) {
|
||||
return 0; /* one is XInput, one is not; not the same device. */
|
||||
return 0; /* one is XInput, one is not; not the same device. */
|
||||
} else if (joystick->hwdata->bXInputHaptic) {
|
||||
return SDL_XINPUT_JoystickSameHaptic(haptic, joystick);
|
||||
} else {
|
||||
@@ -223,8 +211,7 @@ SDL_SYS_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
/*
|
||||
* Opens a SDL_Haptic from a SDL_Joystick.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_SYS_HapticOpenFromJoystick(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
SDL_assert(joystick->driver == &SDL_WINDOWS_JoystickDriver);
|
||||
|
||||
@@ -238,8 +225,7 @@ SDL_SYS_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
/*
|
||||
* Closes the haptic device.
|
||||
*/
|
||||
void
|
||||
SDL_SYS_HapticClose(SDL_Haptic * haptic)
|
||||
void SDL_SYS_HapticClose(SDL_Haptic *haptic)
|
||||
{
|
||||
if (haptic->hwdata) {
|
||||
|
||||
@@ -264,8 +250,7 @@ SDL_SYS_HapticClose(SDL_Haptic * haptic)
|
||||
/*
|
||||
* Clean up after system specific haptic stuff
|
||||
*/
|
||||
void
|
||||
SDL_SYS_HapticQuit(void)
|
||||
void SDL_SYS_HapticQuit(void)
|
||||
{
|
||||
SDL_hapticlist_item *item;
|
||||
SDL_hapticlist_item *next = NULL;
|
||||
@@ -301,9 +286,8 @@ SDL_SYS_HapticQuit(void)
|
||||
/*
|
||||
* Creates a new haptic effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
SDL_HapticEffect * base)
|
||||
int SDL_SYS_HapticNewEffect(SDL_Haptic *haptic, struct haptic_effect *effect,
|
||||
SDL_HapticEffect *base)
|
||||
{
|
||||
int result;
|
||||
|
||||
@@ -331,10 +315,9 @@ SDL_SYS_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
/*
|
||||
* Updates an effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,
|
||||
struct haptic_effect *effect,
|
||||
SDL_HapticEffect * data)
|
||||
int SDL_SYS_HapticUpdateEffect(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect,
|
||||
SDL_HapticEffect *data)
|
||||
{
|
||||
if (haptic->hwdata->bXInputHaptic) {
|
||||
return SDL_XINPUT_HapticUpdateEffect(haptic, effect, data);
|
||||
@@ -346,9 +329,8 @@ SDL_SYS_HapticUpdateEffect(SDL_Haptic * haptic,
|
||||
/*
|
||||
* Runs an effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
Uint32 iterations)
|
||||
int SDL_SYS_HapticRunEffect(SDL_Haptic *haptic, struct haptic_effect *effect,
|
||||
Uint32 iterations)
|
||||
{
|
||||
if (haptic->hwdata->bXInputHaptic) {
|
||||
return SDL_XINPUT_HapticRunEffect(haptic, effect, iterations);
|
||||
@@ -360,8 +342,7 @@ SDL_SYS_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
/*
|
||||
* Stops an effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
int SDL_SYS_HapticStopEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
if (haptic->hwdata->bXInputHaptic) {
|
||||
return SDL_XINPUT_HapticStopEffect(haptic, effect);
|
||||
@@ -373,8 +354,7 @@ SDL_SYS_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
/*
|
||||
* Frees the effect.
|
||||
*/
|
||||
void
|
||||
SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
void SDL_SYS_HapticDestroyEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
if (haptic->hwdata->bXInputHaptic) {
|
||||
SDL_XINPUT_HapticDestroyEffect(haptic, effect);
|
||||
@@ -388,9 +368,8 @@ SDL_SYS_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
/*
|
||||
* Gets the status of a haptic effect.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,
|
||||
struct haptic_effect *effect)
|
||||
int SDL_SYS_HapticGetEffectStatus(SDL_Haptic *haptic,
|
||||
struct haptic_effect *effect)
|
||||
{
|
||||
if (haptic->hwdata->bXInputHaptic) {
|
||||
return SDL_XINPUT_HapticGetEffectStatus(haptic, effect);
|
||||
@@ -402,8 +381,7 @@ SDL_SYS_HapticGetEffectStatus(SDL_Haptic * haptic,
|
||||
/*
|
||||
* Sets the gain.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
int SDL_SYS_HapticSetGain(SDL_Haptic *haptic, int gain)
|
||||
{
|
||||
if (haptic->hwdata->bXInputHaptic) {
|
||||
return SDL_XINPUT_HapticSetGain(haptic, gain);
|
||||
@@ -415,8 +393,7 @@ SDL_SYS_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
/*
|
||||
* Sets the autocentering.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
int SDL_SYS_HapticSetAutocenter(SDL_Haptic *haptic, int autocenter)
|
||||
{
|
||||
if (haptic->hwdata->bXInputHaptic) {
|
||||
return SDL_XINPUT_HapticSetAutocenter(haptic, autocenter);
|
||||
@@ -428,8 +405,7 @@ SDL_SYS_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
/*
|
||||
* Pauses the device.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticPause(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticPause(SDL_Haptic *haptic)
|
||||
{
|
||||
if (haptic->hwdata->bXInputHaptic) {
|
||||
return SDL_XINPUT_HapticPause(haptic);
|
||||
@@ -441,8 +417,7 @@ SDL_SYS_HapticPause(SDL_Haptic * haptic)
|
||||
/*
|
||||
* Pauses the device.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticUnpause(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticUnpause(SDL_Haptic *haptic)
|
||||
{
|
||||
if (haptic->hwdata->bXInputHaptic) {
|
||||
return SDL_XINPUT_HapticUnpause(haptic);
|
||||
@@ -454,8 +429,7 @@ SDL_SYS_HapticUnpause(SDL_Haptic * haptic)
|
||||
/*
|
||||
* Stops all the playing effects on the device.
|
||||
*/
|
||||
int
|
||||
SDL_SYS_HapticStopAll(SDL_Haptic * haptic)
|
||||
int SDL_SYS_HapticStopAll(SDL_Haptic *haptic)
|
||||
{
|
||||
if (haptic->hwdata->bXInputHaptic) {
|
||||
return SDL_XINPUT_HapticStopAll(haptic);
|
||||
|
@@ -40,17 +40,16 @@ struct haptic_hwdata
|
||||
#if SDL_HAPTIC_DINPUT
|
||||
LPDIRECTINPUTDEVICE8 device;
|
||||
#endif
|
||||
DWORD axes[3]; /* Axes to use. */
|
||||
SDL_bool is_joystick; /* Device is loaded as joystick. */
|
||||
Uint8 bXInputHaptic; /* Supports force feedback via XInput. */
|
||||
Uint8 userid; /* XInput userid index for this joystick */
|
||||
DWORD axes[3]; /* Axes to use. */
|
||||
SDL_bool is_joystick; /* Device is loaded as joystick. */
|
||||
Uint8 bXInputHaptic; /* Supports force feedback via XInput. */
|
||||
Uint8 userid; /* XInput userid index for this joystick */
|
||||
SDL_Thread *thread;
|
||||
SDL_mutex *mutex;
|
||||
Uint32 stopTicks;
|
||||
SDL_atomic_t stopThread;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* Haptic system effect data.
|
||||
*/
|
||||
@@ -68,8 +67,8 @@ struct haptic_hweffect
|
||||
#endif
|
||||
|
||||
/*
|
||||
* List of available haptic devices.
|
||||
*/
|
||||
* List of available haptic devices.
|
||||
*/
|
||||
typedef struct SDL_hapticlist_item
|
||||
{
|
||||
char *name;
|
||||
@@ -79,7 +78,7 @@ typedef struct SDL_hapticlist_item
|
||||
DIDEVCAPS capabilities;
|
||||
#endif
|
||||
SDL_bool bXInputHaptic; /* Supports force feedback via XInput. */
|
||||
Uint8 userid; /* XInput userid index for this joystick */
|
||||
Uint8 userid; /* XInput userid index for this joystick */
|
||||
struct SDL_hapticlist_item *next;
|
||||
} SDL_hapticlist_item;
|
||||
|
||||
@@ -96,4 +95,3 @@ extern int SDL_SYS_RemoveHapticDevice(SDL_hapticlist_item *prev, SDL_hapticlist_
|
||||
#endif /* SDL_windowshaptic_c_h_ */
|
||||
|
||||
/* vi: set ts=4 sw=4 expandtab: */
|
||||
|
||||
|
@@ -40,9 +40,7 @@ extern "C" {
|
||||
*/
|
||||
static SDL_bool loaded_xinput = SDL_FALSE;
|
||||
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticInit(void)
|
||||
int SDL_XINPUT_HapticInit(void)
|
||||
{
|
||||
if (SDL_GetHintBoolean(SDL_HINT_XINPUT_ENABLED, SDL_TRUE)) {
|
||||
loaded_xinput = (WIN_LoadXInputDLL() == 0) ? SDL_TRUE : SDL_FALSE;
|
||||
@@ -58,8 +56,7 @@ SDL_XINPUT_HapticInit(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticMaybeAddDevice(const DWORD dwUserid)
|
||||
int SDL_XINPUT_HapticMaybeAddDevice(const DWORD dwUserid)
|
||||
{
|
||||
const Uint8 userid = (Uint8)dwUserid;
|
||||
SDL_hapticlist_item *item;
|
||||
@@ -72,13 +69,13 @@ SDL_XINPUT_HapticMaybeAddDevice(const DWORD dwUserid)
|
||||
/* Make sure we don't already have it */
|
||||
for (item = SDL_hapticlist; item; item = item->next) {
|
||||
if (item->bXInputHaptic && item->userid == userid) {
|
||||
return -1; /* Already added */
|
||||
return -1; /* Already added */
|
||||
}
|
||||
}
|
||||
|
||||
SDL_zero(state);
|
||||
if (XINPUTSETSTATE(dwUserid, &state) != ERROR_SUCCESS) {
|
||||
return -1; /* no force feedback on this device. */
|
||||
return -1; /* no force feedback on this device. */
|
||||
}
|
||||
|
||||
item = (SDL_hapticlist_item *)SDL_malloc(sizeof(SDL_hapticlist_item));
|
||||
@@ -107,8 +104,7 @@ SDL_XINPUT_HapticMaybeAddDevice(const DWORD dwUserid)
|
||||
return SDL_SYS_AddHapticDevice(item);
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticMaybeRemoveDevice(const DWORD dwUserid)
|
||||
int SDL_XINPUT_HapticMaybeRemoveDevice(const DWORD dwUserid)
|
||||
{
|
||||
const Uint8 userid = (Uint8)dwUserid;
|
||||
SDL_hapticlist_item *item;
|
||||
@@ -142,10 +138,9 @@ SDL_XINPUT_HapticMaybeRemoveDevice(const DWORD dwUserid)
|
||||
* Mostly, this is here to get rumbling to work, and all the other features
|
||||
* are absent in the XInput path for now. :(
|
||||
*/
|
||||
static int SDLCALL
|
||||
SDL_RunXInputHaptic(void *arg)
|
||||
static int SDLCALL SDL_RunXInputHaptic(void *arg)
|
||||
{
|
||||
struct haptic_hwdata *hwdata = (struct haptic_hwdata *) arg;
|
||||
struct haptic_hwdata *hwdata = (struct haptic_hwdata *)arg;
|
||||
|
||||
while (!SDL_AtomicGet(&hwdata->stopThread)) {
|
||||
SDL_Delay(50);
|
||||
@@ -164,11 +159,10 @@ SDL_RunXInputHaptic(void *arg)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
SDL_XINPUT_HapticOpenFromUserIndex(SDL_Haptic *haptic, const Uint8 userid)
|
||||
static int SDL_XINPUT_HapticOpenFromUserIndex(SDL_Haptic *haptic, const Uint8 userid)
|
||||
{
|
||||
char threadName[32];
|
||||
XINPUT_VIBRATION vibration = { 0, 0 }; /* stop any current vibration */
|
||||
XINPUT_VIBRATION vibration = { 0, 0 }; /* stop any current vibration */
|
||||
XINPUTSETSTATE(userid, &vibration);
|
||||
|
||||
haptic->supported = SDL_HAPTIC_LEFTRIGHT;
|
||||
@@ -184,9 +178,9 @@ SDL_XINPUT_HapticOpenFromUserIndex(SDL_Haptic *haptic, const Uint8 userid)
|
||||
}
|
||||
/* Clear the memory */
|
||||
SDL_memset(haptic->effects, 0,
|
||||
sizeof(struct haptic_effect) * haptic->neffects);
|
||||
sizeof(struct haptic_effect) * haptic->neffects);
|
||||
|
||||
haptic->hwdata = (struct haptic_hwdata *) SDL_malloc(sizeof(*haptic->hwdata));
|
||||
haptic->hwdata = (struct haptic_hwdata *)SDL_malloc(sizeof(*haptic->hwdata));
|
||||
if (haptic->hwdata == NULL) {
|
||||
SDL_free(haptic->effects);
|
||||
haptic->effects = NULL;
|
||||
@@ -219,20 +213,17 @@ SDL_XINPUT_HapticOpenFromUserIndex(SDL_Haptic *haptic, const Uint8 userid)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticOpen(SDL_Haptic * haptic, SDL_hapticlist_item *item)
|
||||
int SDL_XINPUT_HapticOpen(SDL_Haptic *haptic, SDL_hapticlist_item *item)
|
||||
{
|
||||
return SDL_XINPUT_HapticOpenFromUserIndex(haptic, item->userid);
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_XINPUT_JoystickSameHaptic(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
return haptic->hwdata->userid == joystick->hwdata->userid;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_XINPUT_HapticOpenFromJoystick(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
SDL_hapticlist_item *item;
|
||||
int index = 0;
|
||||
@@ -249,16 +240,14 @@ SDL_XINPUT_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
return SDL_SetError("Couldn't find joystick in haptic device list");
|
||||
}
|
||||
|
||||
void
|
||||
SDL_XINPUT_HapticClose(SDL_Haptic * haptic)
|
||||
void SDL_XINPUT_HapticClose(SDL_Haptic *haptic)
|
||||
{
|
||||
SDL_AtomicSet(&haptic->hwdata->stopThread, 1);
|
||||
SDL_WaitThread(haptic->hwdata->thread, NULL);
|
||||
SDL_DestroyMutex(haptic->hwdata->mutex);
|
||||
}
|
||||
|
||||
void
|
||||
SDL_XINPUT_HapticQuit(void)
|
||||
void SDL_XINPUT_HapticQuit(void)
|
||||
{
|
||||
if (loaded_xinput) {
|
||||
WIN_UnloadXInputDLL();
|
||||
@@ -266,15 +255,13 @@ SDL_XINPUT_HapticQuit(void)
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SDL_HapticEffect * base)
|
||||
int SDL_XINPUT_HapticNewEffect(SDL_Haptic *haptic, struct haptic_effect *effect, SDL_HapticEffect *base)
|
||||
{
|
||||
SDL_assert(base->type == SDL_HAPTIC_LEFTRIGHT); /* should catch this at higher level */
|
||||
SDL_assert(base->type == SDL_HAPTIC_LEFTRIGHT); /* should catch this at higher level */
|
||||
return SDL_XINPUT_HapticUpdateEffect(haptic, effect, base);
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticUpdateEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SDL_HapticEffect * data)
|
||||
int SDL_XINPUT_HapticUpdateEffect(SDL_Haptic *haptic, struct haptic_effect *effect, SDL_HapticEffect *data)
|
||||
{
|
||||
XINPUT_VIBRATION *vib = &effect->hweffect->vibration;
|
||||
SDL_assert(data->type == SDL_HAPTIC_LEFTRIGHT);
|
||||
@@ -282,18 +269,17 @@ SDL_XINPUT_HapticUpdateEffect(SDL_Haptic * haptic, struct haptic_effect *effect,
|
||||
vib->wLeftMotorSpeed = data->leftright.large_magnitude * 2;
|
||||
vib->wRightMotorSpeed = data->leftright.small_magnitude * 2;
|
||||
SDL_LockMutex(haptic->hwdata->mutex);
|
||||
if (haptic->hwdata->stopTicks) { /* running right now? Update it. */
|
||||
if (haptic->hwdata->stopTicks) { /* running right now? Update it. */
|
||||
XINPUTSETSTATE(haptic->hwdata->userid, vib);
|
||||
}
|
||||
SDL_UnlockMutex(haptic->hwdata->mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect, Uint32 iterations)
|
||||
int SDL_XINPUT_HapticRunEffect(SDL_Haptic *haptic, struct haptic_effect *effect, Uint32 iterations)
|
||||
{
|
||||
XINPUT_VIBRATION *vib = &effect->hweffect->vibration;
|
||||
SDL_assert(effect->effect.type == SDL_HAPTIC_LEFTRIGHT); /* should catch this at higher level */
|
||||
SDL_assert(effect->effect.type == SDL_HAPTIC_LEFTRIGHT); /* should catch this at higher level */
|
||||
SDL_LockMutex(haptic->hwdata->mutex);
|
||||
if (effect->effect.leftright.length == SDL_HAPTIC_INFINITY || iterations == SDL_HAPTIC_INFINITY) {
|
||||
haptic->hwdata->stopTicks = SDL_HAPTIC_INFINITY;
|
||||
@@ -302,15 +288,14 @@ SDL_XINPUT_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect, Ui
|
||||
} else {
|
||||
haptic->hwdata->stopTicks = SDL_GetTicks() + (effect->effect.leftright.length * iterations);
|
||||
if ((haptic->hwdata->stopTicks == SDL_HAPTIC_INFINITY) || (haptic->hwdata->stopTicks == 0)) {
|
||||
haptic->hwdata->stopTicks = 1; /* fix edge cases. */
|
||||
haptic->hwdata->stopTicks = 1; /* fix edge cases. */
|
||||
}
|
||||
}
|
||||
SDL_UnlockMutex(haptic->hwdata->mutex);
|
||||
return (XINPUTSETSTATE(haptic->hwdata->userid, vib) == ERROR_SUCCESS) ? 0 : -1;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
int SDL_XINPUT_HapticStopEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
XINPUT_VIBRATION vibration = { 0, 0 };
|
||||
SDL_LockMutex(haptic->hwdata->mutex);
|
||||
@@ -319,44 +304,37 @@ SDL_XINPUT_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
return (XINPUTSETSTATE(haptic->hwdata->userid, &vibration) == ERROR_SUCCESS) ? 0 : -1;
|
||||
}
|
||||
|
||||
void
|
||||
SDL_XINPUT_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
void SDL_XINPUT_HapticDestroyEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
SDL_XINPUT_HapticStopEffect(haptic, effect);
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticGetEffectStatus(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
int SDL_XINPUT_HapticGetEffectStatus(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
int SDL_XINPUT_HapticSetGain(SDL_Haptic *haptic, int gain)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
int SDL_XINPUT_HapticSetAutocenter(SDL_Haptic *haptic, int autocenter)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticPause(SDL_Haptic * haptic)
|
||||
int SDL_XINPUT_HapticPause(SDL_Haptic *haptic)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticUnpause(SDL_Haptic * haptic)
|
||||
int SDL_XINPUT_HapticUnpause(SDL_Haptic *haptic)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticStopAll(SDL_Haptic * haptic)
|
||||
int SDL_XINPUT_HapticStopAll(SDL_Haptic *haptic)
|
||||
{
|
||||
XINPUT_VIBRATION vibration = { 0, 0 };
|
||||
SDL_LockMutex(haptic->hwdata->mutex);
|
||||
@@ -376,113 +354,94 @@ SDL_XINPUT_HapticStopAll(SDL_Haptic * haptic)
|
||||
|
||||
typedef struct SDL_hapticlist_item SDL_hapticlist_item;
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticInit(void)
|
||||
int SDL_XINPUT_HapticInit(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticMaybeAddDevice(const DWORD dwUserid)
|
||||
int SDL_XINPUT_HapticMaybeAddDevice(const DWORD dwUserid)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticMaybeRemoveDevice(const DWORD dwUserid)
|
||||
int SDL_XINPUT_HapticMaybeRemoveDevice(const DWORD dwUserid)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticOpen(SDL_Haptic * haptic, SDL_hapticlist_item *item)
|
||||
int SDL_XINPUT_HapticOpen(SDL_Haptic *haptic, SDL_hapticlist_item *item)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_XINPUT_JoystickSameHaptic(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick)
|
||||
int SDL_XINPUT_HapticOpenFromJoystick(SDL_Haptic *haptic, SDL_Joystick *joystick)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
void
|
||||
SDL_XINPUT_HapticClose(SDL_Haptic * haptic)
|
||||
void SDL_XINPUT_HapticClose(SDL_Haptic *haptic)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
SDL_XINPUT_HapticQuit(void)
|
||||
void SDL_XINPUT_HapticQuit(void)
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SDL_HapticEffect * base)
|
||||
int SDL_XINPUT_HapticNewEffect(SDL_Haptic *haptic, struct haptic_effect *effect, SDL_HapticEffect *base)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticUpdateEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SDL_HapticEffect * data)
|
||||
int SDL_XINPUT_HapticUpdateEffect(SDL_Haptic *haptic, struct haptic_effect *effect, SDL_HapticEffect *data)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect, Uint32 iterations)
|
||||
int SDL_XINPUT_HapticRunEffect(SDL_Haptic *haptic, struct haptic_effect *effect, Uint32 iterations)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
int SDL_XINPUT_HapticStopEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
void
|
||||
SDL_XINPUT_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
void SDL_XINPUT_HapticDestroyEffect(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticGetEffectStatus(SDL_Haptic * haptic, struct haptic_effect *effect)
|
||||
int SDL_XINPUT_HapticGetEffectStatus(SDL_Haptic *haptic, struct haptic_effect *effect)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticSetGain(SDL_Haptic * haptic, int gain)
|
||||
int SDL_XINPUT_HapticSetGain(SDL_Haptic *haptic, int gain)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter)
|
||||
int SDL_XINPUT_HapticSetAutocenter(SDL_Haptic *haptic, int autocenter)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticPause(SDL_Haptic * haptic)
|
||||
int SDL_XINPUT_HapticPause(SDL_Haptic *haptic)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticUnpause(SDL_Haptic * haptic)
|
||||
int SDL_XINPUT_HapticUnpause(SDL_Haptic *haptic)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
||||
int
|
||||
SDL_XINPUT_HapticStopAll(SDL_Haptic * haptic)
|
||||
int SDL_XINPUT_HapticStopAll(SDL_Haptic *haptic)
|
||||
{
|
||||
return SDL_Unsupported();
|
||||
}
|
||||
|
@@ -30,22 +30,22 @@ extern "C" {
|
||||
extern int SDL_XINPUT_HapticInit(void);
|
||||
extern int SDL_XINPUT_HapticMaybeAddDevice(const DWORD dwUserid);
|
||||
extern int SDL_XINPUT_HapticMaybeRemoveDevice(const DWORD dwUserid);
|
||||
extern int SDL_XINPUT_HapticOpen(SDL_Haptic * haptic, SDL_hapticlist_item *item);
|
||||
extern int SDL_XINPUT_JoystickSameHaptic(SDL_Haptic * haptic, SDL_Joystick * joystick);
|
||||
extern int SDL_XINPUT_HapticOpenFromJoystick(SDL_Haptic * haptic, SDL_Joystick * joystick);
|
||||
extern void SDL_XINPUT_HapticClose(SDL_Haptic * haptic);
|
||||
extern int SDL_XINPUT_HapticOpen(SDL_Haptic *haptic, SDL_hapticlist_item *item);
|
||||
extern int SDL_XINPUT_JoystickSameHaptic(SDL_Haptic *haptic, SDL_Joystick *joystick);
|
||||
extern int SDL_XINPUT_HapticOpenFromJoystick(SDL_Haptic *haptic, SDL_Joystick *joystick);
|
||||
extern void SDL_XINPUT_HapticClose(SDL_Haptic *haptic);
|
||||
extern void SDL_XINPUT_HapticQuit(void);
|
||||
extern int SDL_XINPUT_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SDL_HapticEffect * base);
|
||||
extern int SDL_XINPUT_HapticUpdateEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SDL_HapticEffect * data);
|
||||
extern int SDL_XINPUT_HapticRunEffect(SDL_Haptic * haptic, struct haptic_effect *effect, Uint32 iterations);
|
||||
extern int SDL_XINPUT_HapticStopEffect(SDL_Haptic * haptic, struct haptic_effect *effect);
|
||||
extern void SDL_XINPUT_HapticDestroyEffect(SDL_Haptic * haptic, struct haptic_effect *effect);
|
||||
extern int SDL_XINPUT_HapticGetEffectStatus(SDL_Haptic * haptic, struct haptic_effect *effect);
|
||||
extern int SDL_XINPUT_HapticSetGain(SDL_Haptic * haptic, int gain);
|
||||
extern int SDL_XINPUT_HapticSetAutocenter(SDL_Haptic * haptic, int autocenter);
|
||||
extern int SDL_XINPUT_HapticPause(SDL_Haptic * haptic);
|
||||
extern int SDL_XINPUT_HapticUnpause(SDL_Haptic * haptic);
|
||||
extern int SDL_XINPUT_HapticStopAll(SDL_Haptic * haptic);
|
||||
extern int SDL_XINPUT_HapticNewEffect(SDL_Haptic *haptic, struct haptic_effect *effect, SDL_HapticEffect *base);
|
||||
extern int SDL_XINPUT_HapticUpdateEffect(SDL_Haptic *haptic, struct haptic_effect *effect, SDL_HapticEffect *data);
|
||||
extern int SDL_XINPUT_HapticRunEffect(SDL_Haptic *haptic, struct haptic_effect *effect, Uint32 iterations);
|
||||
extern int SDL_XINPUT_HapticStopEffect(SDL_Haptic *haptic, struct haptic_effect *effect);
|
||||
extern void SDL_XINPUT_HapticDestroyEffect(SDL_Haptic *haptic, struct haptic_effect *effect);
|
||||
extern int SDL_XINPUT_HapticGetEffectStatus(SDL_Haptic *haptic, struct haptic_effect *effect);
|
||||
extern int SDL_XINPUT_HapticSetGain(SDL_Haptic *haptic, int gain);
|
||||
extern int SDL_XINPUT_HapticSetAutocenter(SDL_Haptic *haptic, int autocenter);
|
||||
extern int SDL_XINPUT_HapticPause(SDL_Haptic *haptic);
|
||||
extern int SDL_XINPUT_HapticUnpause(SDL_Haptic *haptic);
|
||||
extern int SDL_XINPUT_HapticStopAll(SDL_Haptic *haptic);
|
||||
|
||||
/* Ends C function definitions when using C++ */
|
||||
#ifdef __cplusplus
|
||||
|
Reference in New Issue
Block a user