pair<double, float> Param::findEndTimeAndValue() const { auto ctx = getContext(); lock_guard<mutex> lock( ctx->getMutex() ); if( mEvents.empty() ) return make_pair( ctx->getNumProcessedSeconds(), mValue.load() ); else { const EventRef &event = mEvents.back(); return make_pair( event->mTimeEnd, event->mValueEnd ); } }
float Param::findDuration() const { auto ctx = getContext(); lock_guard<mutex> lock( ctx->getMutex() ); if( mEvents.empty() ) return 0; else { const EventRef &event = mEvents.back(); return event->mTimeEnd - (float)ctx->getNumProcessedSeconds(); } }
bool Param::eval() { if( mProcessor ) { mProcessor->pullInputs( &mInternalBuffer ); mValue = mInternalBuffer[mInternalBuffer.getNumFrames() - 1]; return true; } else { auto ctx = getContext(); return eval( (float)ctx->getNumProcessedSeconds(), mInternalBuffer.getData(), mInternalBuffer.getSize(), ctx->getSampleRate() ); } }
EventRef Param::applyRamp( float valueBegin, float valueEnd, float rampSeconds, const Options &options ) { initInternalBuffer(); auto ctx = getContext(); float timeBegin = (float)ctx->getNumProcessedSeconds() + options.getDelay(); float timeEnd = timeBegin + rampSeconds; EventRef event( new Event( timeBegin, timeEnd, valueBegin, valueEnd, options.getRampFn() ) ); lock_guard<mutex> lock( ctx->getMutex() ); resetImpl(); mEvents.push_back( event ); return event; }
EventRef Param::applyRamp( float valueEnd, double rampSeconds, const Options &options ) { initInternalBuffer(); auto ctx = getContext(); double timeBegin = ( options.getBeginTime() >= 0 ? options.getBeginTime() : ctx->getNumProcessedSeconds() + options.getDelay() ); double timeEnd = timeBegin + rampSeconds; EventRef event( new Event( timeBegin, timeEnd, mValue, valueEnd, true, options.getRampFn() ) ); if( ! options.getLabel().empty() ) event->mLabel = options.getLabel(); lock_guard<mutex> lock( ctx->getMutex() ); removeEventsAt( timeBegin ); if( mProcessor ) mProcessor.reset(); mEvents.push_back( event ); return event; }