src/haptic/SDL_haptic.c
branchgsoc2008_force_feedback
changeset 2480 b883974445fc
parent 2479 b9eb2cfe16cd
child 2483 9d52368ebcf5
equal deleted inserted replaced
2479:b9eb2cfe16cd 2480:b883974445fc
   164    /* Check if it's still in use */
   164    /* Check if it's still in use */
   165    if (--haptic->ref_count < 0) {
   165    if (--haptic->ref_count < 0) {
   166       return;
   166       return;
   167    }
   167    }
   168 
   168 
   169    /* Close it */
   169    /* Close it, properly removing effects if needed */
       
   170    for (i=0; i<haptic->neffects; i++) {
       
   171       if (haptic->effects[i].hweffect != NULL) {
       
   172          SDL_HapticDestroyEffect(haptic,i);
       
   173       }
       
   174    }
   170    SDL_SYS_HapticClose(haptic);
   175    SDL_SYS_HapticClose(haptic);
   171 
   176 
   172    /* Remove from the list */
   177    /* Remove from the list */
   173    for (i = 0; SDL_haptics[i]; ++i) {
   178    for (i = 0; SDL_haptics[i]; ++i) {
   174       if (haptic == SDL_haptics[i]) {
   179       if (haptic == SDL_haptics[i]) {
   246    /* Check for device validity. */
   251    /* Check for device validity. */
   247    if (!ValidHaptic(&haptic)) {
   252    if (!ValidHaptic(&haptic)) {
   248       return -1;
   253       return -1;
   249    }
   254    }
   250 
   255 
       
   256    /* Check to see if effect is supported */
       
   257    if (SDL_HapticEffectSupported(haptic,effect)==SDL_FALSE) {
       
   258       SDL_SetError("Haptic effect not supported by haptic device.");
       
   259       return -1;
       
   260    }
       
   261 
   251    /* See if there's a free slot */
   262    /* See if there's a free slot */
   252    for (i=0; i<haptic->neffects; i++) {
   263    for (i=0; i<haptic->neffects; i++) {
   253       if (haptic->effects[i].hweffect == NULL) {
   264       if (haptic->effects[i].hweffect == NULL) {
   254 
   265 
   255          /* Now let the backend create the real effect */
   266          /* Now let the backend create the real effect */
   256          if (SDL_SYS_HapticNewEffect(haptic,&haptic->effects[i]) != 0) {
   267          if (SDL_SYS_HapticNewEffect(haptic,&haptic->effects[i],effect) != 0) {
   257             return -1; /* Backend failed to create effect */
   268             return -1; /* Backend failed to create effect */
   258          }
   269          }
   259          return i;
   270          return i;
   260       }
   271       }
   261    }
   272    }
   263    SDL_SetError("Haptic device has no free space left.");
   274    SDL_SetError("Haptic device has no free space left.");
   264    return -1;
   275    return -1;
   265 }
   276 }
   266 
   277 
   267 /*
   278 /*
       
   279  * Checks to see if an effect is valid.
       
   280  */
       
   281 static int
       
   282 ValidEffect(SDL_Haptic * haptic, int effect)
       
   283 {
       
   284    if ((effect < 0) || (effect >= haptic->neffects)) {
       
   285       SDL_SetError("Invalid haptic effect identifier.");
       
   286       return 0;
       
   287    }
       
   288    return 1;
       
   289 }
       
   290 
       
   291 /*
   268  * Runs the haptic effect on the device.
   292  * Runs the haptic effect on the device.
   269  */
   293  */
   270 int
   294 int
   271 SDL_HapticRunEffect(SDL_Haptic * haptic, int effect)
   295 SDL_HapticRunEffect(SDL_Haptic * haptic, int effect)
   272 {
   296 {
   273    if (!ValidHaptic(&haptic)) {
   297    if (!ValidHaptic(&haptic) || !ValidEffect(haptic,effect)) {
   274       return -1;
   298       return -1;
   275    }
   299    }
   276 
   300 
   277    /* Run the effect */
   301    /* Run the effect */
   278    if (SDL_SYS_HapticRunEffect(haptic,&haptic->effects[effect]) < 0) {
   302    if (SDL_SYS_HapticRunEffect(haptic,&haptic->effects[effect]) < 0) {
   286  * Gets rid of a haptic effect.
   310  * Gets rid of a haptic effect.
   287  */
   311  */
   288 void
   312 void
   289 SDL_HapticDestroyEffect(SDL_Haptic * haptic, int effect)
   313 SDL_HapticDestroyEffect(SDL_Haptic * haptic, int effect)
   290 {
   314 {
   291    if (!ValidHaptic(&haptic)) {
   315    if (!ValidHaptic(&haptic) || !ValidEffect(haptic,effect)) {
   292       return;
   316       return;
   293    }
   317    }
   294 
   318 
   295    /* Not allocated */
   319    /* Not allocated */
   296    if (haptic->effects[effect].hweffect == NULL) {
   320    if (haptic->effects[effect].hweffect == NULL) {