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"); } }
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; }