void CForceFeedBackSystem::PlayForceFeedbackEffect( ForceFeedbackFxId id, const SForceFeedbackRuntimeParams& runtimeParams )
{
	if(m_effectLock > 0)
	{
		return;
	}

	//Note: As requested, if the effect is running prefer to re-start, and reset its runtimeParams
	if (TryToRestartEffectIfAlreadyRunning(id, runtimeParams))
	{
		return;
	}

	const int activeEffectSize = m_activeEffects.size();
	bool freeSlotsAvailable = (activeEffectSize < (int)MAX_FORCE_FEEDBACK_EFFECTS);

	if (freeSlotsAvailable)
	{
		const int testId = (int)id;
		bool validId = ( (testId >= 0) && (testId < (int)(m_effects.size())) );

		if (validId)
		{
			const SEffect& effect = m_effects[id];

			const SPattern& effectPatternA = FindPattern(effect.patternA);
			const SPattern& effectPatternB = (effect.patternA == effect.patternB) ? effectPatternA : FindPattern(effect.patternB);

			const SEnvelope& effectEnvelopeA = FindEnvelope(effect.envelopeA);
			const SEnvelope& effectEnvelopeB = (effect.envelopeA == effect.envelopeB) ? effectEnvelopeA : FindEnvelope(effect.envelopeB);

			SActiveEffect newActiveEffect;
			m_activeEffects.push_back(newActiveEffect);

			SActiveEffect& justAddedEffect = m_activeEffects[activeEffectSize];
			justAddedEffect.effectId = id;
			justAddedEffect.effectTime = effect.time;
			justAddedEffect.runningTime = 0.0f;
			justAddedEffect.frequencyA = effect.frequencyA;
			justAddedEffect.frequencyB = effect.frequencyB;
			justAddedEffect.runtimeParams = runtimeParams;

			//Patters are copied, for faster access when loop-processing, instead of being a pointer
			//Since we have a very small amount of fixed FX it should not be a big deal.
			justAddedEffect.m_patternA = effectPatternA;
			justAddedEffect.m_envelopeA = effectEnvelopeA;
			justAddedEffect.m_patternB = effectPatternB;
			justAddedEffect.m_envelopeB = effectEnvelopeB;
		}
		else
		{
			FORCEFEEDBACK_LOG("Play effect could not find effect. Invalid id '%d' provided", id);
		}

	}
	else
	{
		FORCEFEEDBACK_LOG("Too many effects already running, could not execute");
	}
}
Example #2
0
static int envext(CSOUND *csound, int argc, char **argv)
{
    char        *inputfile = NULL;
    SNDFILE     *infd;
    char        c, *s;
    OPARMS      OO;
    double      window = 0.25;
    SOUNDIN     *p;  /* space allocated by SAsndgetset() */
    char        *outname = NULL;

    memset(&OO, 0, sizeof(OO));

    /* Check arguments */
    if (!(--argc))
      envext_usage(csound, Str("Insufficient arguments"));
    do {
      s = *++argv;
      if (*s++ == '-')                        /* read all flags:  */
        while ((c = *s++) != '\0')
          switch(c) {
          case 'o':
            FIND(Str("no outfilename"))
            outname = s;
            while (*++s);
            break;
          case 'w':
            FIND(Str("No window size"));
            window = atof(s);
            while (*++s);
            break;
          default:
            envext_usage(csound, Str("unknown flag -%c"), c);
          }
      else if (inputfile == NULL) {
        inputfile = --s;
      }
      else envext_usage(csound, Str("too many arguments"));
    } while (--argc);

    /* Read sound file */
    if (UNLIKELY(inputfile==NULL ||
                 (infd = SCsndgetset(csound, &p, inputfile))==NULL)) {
      csound->Message(csound,Str("%s: error while opening %s"), argv[0], inputfile);
      return 1;
    }
    FindEnvelope(csound, infd, p, window, outname);
    return 0;
}