# HG changeset patch # User Edgar Simo # Date 1216590601 0 # Node ID f2649eaa552e685b6a171ad8bb3e1fe4b8d11754 # Parent 56cf872c723a77a07b33f47cc16702234f5550e5 More verbose errors. diff -r 56cf872c723a -r f2649eaa552e src/haptic/darwin/SDL_syshaptic.c --- a/src/haptic/darwin/SDL_syshaptic.c Sun Jul 20 21:34:04 2008 +0000 +++ b/src/haptic/darwin/SDL_syshaptic.c Sun Jul 20 21:50:01 2008 +0000 @@ -74,6 +74,62 @@ static int HIDGetDeviceProduct(io_service_t dev, char * name); +/* + * Like strerror but for force feedback errors. + */ +static const char * +FFStrError(HRESULT err) +{ + switch (err) { + case FFERR_DEVICEFULL: + return "device full"; + case FFERR_DEVICENOTREG: + return "device not registered"; + case FFERR_DEVICEPAUSED: + return "device paused"; + case FFERR_DEVICERELEASED: + return "device released"; + case FFERR_EFFECTPLAYING: + return "effect playing"; + case FFERR_EFFECTTYPEMISMATCH: + return "effect type mismatch"; + case FFERR_EFFECTTYPENOTSUPPORTED: + return "effect type not supported"; + case FFERR_GENERIC: + return "undetermined error"; + case FFERR_HASEFFECTS: + return "device has effects"; + case FFERR_INCOMPLETEEFFECT: + return "incomplete effect"; + case FFERR_INTERNAL: + return "internal fault"; + case FFERR_INVALIDDOWNLOADID: + return "invalid download id"; + case FFERR_INVALIDPARAM: + return "invalid parameter"; + case FFERR_MOREDATA: + return "more data"; + case FFERR_NOINTERFACE: + return "interface not supported"; + case FFERR_NOTDOWNLOADED: + return "effect is not downloaded"; + case FFERR_NOTINITIALIZED: + return "object has not been initialized"; + case FFERR_OUTOFMEMORY: + return "out of memory"; + case FFERR_UNPLUGGED: + return "device is unplugged"; + case FFERR_UNSUPPORTED: + return "function call unsupported"; + case FFERR_UNSUPPORTEDAXIS: + return "axis unsupported"; + + default: + return "unknown error"; + } +} + + /* * Initializes the haptic subsystem. */ @@ -244,7 +300,8 @@ &val, sizeof(val)); if (ret == FF_OK) supported |= SDL_HAPTIC_GAIN; else if (ret != FFERR_UNSUPPORTED) { - SDL_SetError("Haptic: Unable to get if device supports gain."); + SDL_SetError("Haptic: Unable to get if device supports gain: %s.", + FFStrError(ret);); return 0; } @@ -253,7 +310,8 @@ &val, sizeof(val)); if (ret == FF_OK) supported |= SDL_HAPTIC_AUTOCENTER; else if (ret != FFERR_UNSUPPORTED) { - SDL_SetError("Haptic: Unable to get if device supports autocenter."); + SDL_SetError("Haptic: Unable to get if device supports autocenter: %s.", + FFStrError(ret)); return 0; } @@ -273,6 +331,8 @@ static int SDL_SYS_HapticOpenFromService(SDL_Haptic * haptic, io_service_t service) { + HRESULT ret; + /* Allocate the hwdata */ haptic->hwdata = (struct haptic_hwdata *) SDL_malloc(sizeof(*haptic->hwdata)); @@ -283,8 +343,10 @@ SDL_memset(haptic->hwdata, 0, sizeof(*haptic->hwdata)); /* Open the device */ - if (FFCreateDevice( service, &haptic->hwdata->device ) != FF_OK) { - SDL_SetError("Haptic: Unable to create device from service."); + ret = FFCreateDevice( service, &haptic->hwdata->device); + if (ret != FF_OK) { + SDL_SetError("Haptic: Unable to create device from service: %s.", + FFStrError(ret)); goto creat_err; } @@ -840,9 +902,8 @@ /* 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."); + SDL_SetError("Haptic: Unable to create effect: %s.", FFStrError(ret)); goto err_effectdone; } @@ -885,7 +946,7 @@ &temp, flags); if (ret != FF_OK) { - SDL_SetError("Haptic: Unable to update effect."); + SDL_SetError("Haptic: Unable to update effect: %s.", FFStrError(ret)); goto err_update; } @@ -921,7 +982,7 @@ /* Run the effect. */ ret = FFEffectStart(effect->hweffect->ref, iter, 0); if (ret != FF_OK) { - SDL_SetError("Haptic: Unable to run the effect."); + SDL_SetError("Haptic: Unable to run the effect: %s.", FFStrError(ret)); return -1; } @@ -939,7 +1000,7 @@ ret = FFEffectStop(effect->hweffect->ref); if (ret != FF_OK) { - SDL_SetError("Haptic: Unable to stop the effect."); + SDL_SetError("Haptic: Unable to stop the effect: %s.", FFStrError(ret)); return -1; } @@ -957,7 +1018,8 @@ ret = FFDeviceReleaseEffect(haptic->hwdata->device, effect->hweffect->ref); if (ret != FF_OK) { - SDL_SetError("Haptic: Error removing the effect from the device."); + SDL_SetError("Haptic: Error removing the effect from the device: %s.", + FFStrError(ret)); } SDL_free(effect->hweffect->effect.lpvTypeSpecificParams); effect->hweffect->effect.lpvTypeSpecificParams = NULL; @@ -977,7 +1039,7 @@ ret = FFEffectGetEffectStatus(effect->hweffect->ref, &status); if (ret != FF_OK) { - SDL_SetError("Haptic: Unable to get effect status."); + SDL_SetError("Haptic: Unable to get effect status: %s.", FFStrError(ret)); return -1; } @@ -998,7 +1060,7 @@ val = gain * 100; /* Mac OS X uses 0 to 10,000 */ ret = FFDeviceSetForceFeedbackProperty(haptic->hwdata->device, FFPROP_FFGAIN, &val); if (ret != FF_OK) { - SDL_SetError("Haptic: Error setting gain."); + SDL_SetError("Haptic: Error setting gain: %s.", FFStrError(ret)); return -1; } @@ -1022,7 +1084,7 @@ ret = FFDeviceSetForceFeedbackProperty(haptic->hwdata->device, FFPROP_AUTOCENTER, &val); if (ret != FF_OK) { - SDL_SetError("Haptic: Error setting autocenter."); + SDL_SetError("Haptic: Error setting autocenter: %s.", FFStrError(ret)); return -1; } @@ -1031,4 +1093,4 @@ } -#endif /* SDL_HAPTIC_LINUX */ +#endif /* SDL_HAPTIC_IOKIT */