SDL haptic subsystem allows you to control haptic (force feedback) devices.
The basic usage is as follows:
Simple rumble example:
SDL_Haptic *haptic;
// Open the device
0 );
haptic = SDL_HapticOpen( if (haptic == NULL)
return -1;
// Initialize simple rumble
if (SDL_HapticRumbleInit( haptic ) != 0)
return -1;
// Play effect at 50% strength for 2 seconds
if (SDL_HapticRumblePlay( haptic, 0.5, 2000 ) != 0)
return -1;
2000 );
SDL_Delay(
// Clean up
SDL_HapticClose( haptic );
Complete example:
int test_haptic( SDL_Joystick * joystick ) {
SDL_Haptic *haptic;
SDL_HapticEffect effect;int effect_id;
// Open the device
haptic = SDL_HapticOpenFromJoystick( joystick );if (haptic == NULL) return -1; // Most likely joystick isn't haptic
// See if it can do sine waves
if ((SDL_HapticQuery(haptic) & SDL_HAPTIC_SINE)==0) {
// No sine effect
SDL_HapticClose(haptic); return -1;
}
// Create the effect
0, sizeof(SDL_HapticEffect) ); // 0 is safe default
SDL_memset( &effect,
effect.type = SDL_HAPTIC_SINE;// Polar coordinates
effect.periodic.direction.type = SDL_HAPTIC_POLAR; 0] = 18000; // Force comes from south
effect.periodic.direction.dir[1000; // 1000 ms
effect.periodic.period = 20000; // 20000/32767 strength
effect.periodic.magnitude = 5000; // 5 seconds long
effect.periodic.length = 1000; // Takes 1 second to get max strength
effect.periodic.attack_length = 1000; // Takes 1 second to fade away
effect.periodic.fade_length =
// Upload the effect
effect_id = SDL_HapticNewEffect( haptic, &effect );
// Test the effect
1 );
SDL_HapticRunEffect( haptic, effect_id, 5000); // Wait for the effect to finish
SDL_Delay(
// We destroy the effect, although closing the device also does this
SDL_HapticDestroyEffect( haptic, effect_id );
// Close the device
SDL_HapticClose(haptic);
return 0; // Success
}