/* * Creates a new haptic effect. */ int SDL_SYS_HapticNewEffect(SDL_Haptic * haptic, struct haptic_effect *effect, SDL_HapticEffect * base) { HRESULT ret; CFUUIDRef type; /* Alloc the effect. */ effect->hweffect = (struct haptic_hweffect *) SDL_malloc(sizeof(struct haptic_hweffect)); if (effect->hweffect == NULL) { SDL_OutOfMemory(); goto err_hweffect; } /* Get the type. */ type = SDL_SYS_HapticEffectType(base->type); if (type == NULL) { goto err_hweffect; } /* Get the effect. */ if (SDL_SYS_ToFFEFFECT(haptic, &effect->hweffect->effect, base) < 0) { goto err_effectdone; } /* Create the actual effect. */ ret = FFDeviceCreateEffect(haptic->hwdata->device, type, &effect->hweffect->effect, &effect->hweffect->ref); if (ret != FF_OK) { SDL_SetError("Haptic: Unable to create effect: %s.", FFStrError(ret)); goto err_effectdone; } return 0; err_effectdone: SDL_SYS_HapticFreeFFEFFECT(&effect->hweffect->effect, base->type); err_hweffect: if (effect->hweffect != NULL) { SDL_free(effect->hweffect); effect->hweffect = NULL; } return -1; }
bool joypad::config_force_feedback(io_service_t p_service) { HRESULT ret = FFCreateDevice(p_service, &ff_device); ERR_FAIL_COND_V(ret != FF_OK, false); ret = FFDeviceSendForceFeedbackCommand(ff_device, FFSFFC_RESET); FF_ERR(); ret = FFDeviceSendForceFeedbackCommand(ff_device, FFSFFC_SETACTUATORSON); FF_ERR(); if (check_ff_features()) { ret = FFDeviceCreateEffect(ff_device, kFFEffectType_ConstantForce_ID, &ff_effect, &ff_object); FF_ERR(); return true; } FFReleaseDevice(ff_device); return false; }
static HRESULT WINAPI JoystickWImpl_CreateEffect(IDirectInputDevice8W *iface, const GUID *type, const DIEFFECT *params, IDirectInputEffect **out, IUnknown *outer) { JoystickImpl *This = impl_from_IDirectInputDevice8W(iface); EffectImpl *effect; HRESULT hr; TRACE("%p %s %p %p %p\n", iface, debugstr_guid(type), params, out, outer); dump_DIEFFECT(params, type, 0); if(!This->ff) { TRACE("No force feedback support\n"); *out = NULL; return S_OK; } if(outer) WARN("aggregation not implemented\n"); effect = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(*This)); effect->IDirectInputEffect_iface.lpVtbl = &EffectVtbl; effect->ref = 1; effect->guid = *type; effect->device = This; /* Mac's FFEFFECT and Win's DIEFFECT are binary identical. */ hr = osx_to_win32_hresult(FFDeviceCreateEffect(This->ff, effect_win_to_mac(type), (FFEFFECT*)params, &effect->effect)); if(FAILED(hr)) { WARN("FFDeviceCreateEffect failed: %08x\n", hr); HeapFree(GetProcessHeap(), 0, effect); return hr; } list_add_tail(&This->effects, &effect->entry); *out = &effect->IDirectInputEffect_iface; TRACE("allocated effect: %p\n", effect); return S_OK; }