46 joyhandle_ = SDL_JoystickOpen(deviceindex);
47 if (!joyhandle_)
return false;
49 instanceid_ = SDL_JoystickInstanceID(joyhandle_);
52 SDL_JoystickGUID sdlguid = SDL_JoystickGetGUID(joyhandle_);
53 SDL_JoystickGetGUIDString(sdlguid, cstr,
static_cast<int>(
sizeof(cstr)));
58 const char* joyname = SDL_JoystickName(joyhandle_);
59 if (!joyname && controller_) joyname = SDL_GameControllerName(controller_);
60 name_ = joyname ? joyname :
"";
170 char* sdlmapping =
nullptr;
171 if (controller_) sdlmapping = SDL_GameControllerMapping(controller_);
173 SDL_JoystickGUID sdlguid = SDL_JoystickGetGUIDFromString(guid_.c_str());
174 sdlmapping = SDL_GameControllerMappingForGUID(sdlguid);
176 if (!sdlmapping)
return "";
178 std::string mappingstr(sdlmapping);
179 SDL_free(sdlmapping);
181 if (mappingstr.find_last_of(
',') != mappingstr.length() - 1) mappingstr +=
",";
182 mappingstr +=
"platform:" + std::string(SDL_GetPlatform());
254 left = std::min(std::max(left, 0.0f), 1.0f);
255 right = std::min(std::max(right, 0.0f), 1.0f);
257 if (left == 0.0f && right == 0.0f)
return setVibration();
258 if (!checkCreateHaptic())
return false;
260 Uint32 length = SDL_HAPTIC_INFINITY;
261 if (duration >= 0.0f) {
262 float maxduration =
static_cast<float>(std::numeric_limits<Uint32>::max()) / 1000.0f;
263 length =
static_cast<Uint32
>(std::min(duration, maxduration) * 1000.0f);
266 bool success =
false;
267 unsigned int features = SDL_HapticQuery(haptic_);
268 int axes = SDL_HapticNumAxes(haptic_);
270 if ((features & SDL_HAPTIC_LEFTRIGHT) != 0) {
271 memset(&vibration_.effect, 0,
sizeof(SDL_HapticEffect));
272 vibration_.effect.type = SDL_HAPTIC_LEFTRIGHT;
273 vibration_.effect.leftright.length = length;
274 vibration_.effect.leftright.large_magnitude =
static_cast<Uint16
>(left * 0xFFFF);
275 vibration_.effect.leftright.small_magnitude =
static_cast<Uint16
>(right * 0xFFFF);
276 success = runVibrationEffect();
279 if (!success &&
isGamepad() && (features & SDL_HAPTIC_CUSTOM) && axes == 2) {
280 vibration_.data[0] = vibration_.data[2] =
static_cast<Uint16
>(left * 0x7FFF);
281 vibration_.data[1] = vibration_.data[3] =
static_cast<Uint16
>(right * 0x7FFF);
282 memset(&vibration_.effect, 0,
sizeof(SDL_HapticEffect));
283 vibration_.effect.type = SDL_HAPTIC_CUSTOM;
284 vibration_.effect.custom.length = length;
285 vibration_.effect.custom.channels = 2;
286 vibration_.effect.custom.period = 10;
287 vibration_.effect.custom.samples = 2;
288 vibration_.effect.custom.data = vibration_.data;
289 success = runVibrationEffect();
292 if (!success && (features & SDL_HAPTIC_SINE) != 0) {
293 memset(&vibration_.effect, 0,
sizeof(SDL_HapticEffect));
294 vibration_.effect.type = SDL_HAPTIC_SINE;
295 vibration_.effect.periodic.length = length;
296 vibration_.effect.periodic.period = 10;
297 float strength = std::max(left, right);
298 vibration_.effect.periodic.magnitude =
static_cast<Sint16
>(strength * 0x7FFF);
299 success = runVibrationEffect();
303 vibration_.left = left;
304 vibration_.right = right;
306 (length == SDL_HAPTIC_INFINITY) ? SDL_HAPTIC_INFINITY : (SDL_GetTicks() + length);
308 vibration_.left = vibration_.right = 0.0f;
309 vibration_.endtime = SDL_HAPTIC_INFINITY;
323 if (vibration_.endtime != SDL_HAPTIC_INFINITY) {
326 vibration_.endtime = SDL_HAPTIC_INFINITY;
330 int id = vibration_.id;
331 if (!haptic_ ||
id == -1 || SDL_HapticGetEffectStatus(haptic_,
id) != 1)
332 vibration_.left = vibration_.right = 0.0f;
334 left = vibration_.left;
335 right = vibration_.right;