void Param::setProcessor( const NodeRef &node ) { if( ! node ) return; initInternalBuffer(); lock_guard<mutex> lock( getContext()->getMutex() ); resetImpl(); // force node to be mono and initialize it node->setNumChannels( 1 ); node->initializeImpl(); mProcessor = node; }
void Param::setProcessor( const NodeRef &node ) { if( ! node ) return; initInternalBuffer(); lock_guard<mutex> lock( getContext()->getMutex() ); resetImpl(); // force node to be mono and initialize it node->setNumChannels( 1 ); node->initializeImpl(); mProcessor = node; mIsVaryingThisBlock = true; // stays true until there is no more processor and eval() sets this to false. }
// TODO: Checking for DelayNode below is a kludge and will not work for other types that want to support feedback. // With more investigation it might be possible to avoid this, or at least define some interface that // specifies whether this input needs to be summed. void Node::configureConnections() { CI_ASSERT( getContext() ); mProcessInPlace = supportsProcessInPlace(); if( getNumConnectedInputs() > 1 || getNumConnectedOutputs() > 1 ) mProcessInPlace = false; bool isDelay = ( dynamic_cast<DelayNode *>( this ) != nullptr ); // see note above bool inputChannelsUnequal = inputChannelsAreUnequal(); for( auto &input : mInputs ) { bool inputProcessInPlace = true; size_t inputNumChannels = input->getNumChannels(); if( ! supportsInputNumChannels( inputNumChannels ) ) { if( mChannelMode == ChannelMode::MATCHES_INPUT ) setNumChannels( getMaxNumInputChannels() ); else if( input->getChannelMode() == ChannelMode::MATCHES_OUTPUT ) { input->setNumChannels( mNumChannels ); input->configureConnections(); } else { mProcessInPlace = false; inputProcessInPlace = false; } } // inputs with more than one output cannot process in-place, so make them sum if( input->getProcessesInPlace() && input->getNumConnectedOutputs() > 1 ) inputProcessInPlace = false; // when there are multiple inputs and their channel counts don't match, they must be summed if( inputChannelsUnequal ) inputProcessInPlace = false; // if we're unable to process in-place and we're a DelayNode, its possible that the input may be part of a feedback loop, in which case input must sum. if( ! mProcessInPlace && isDelay ) inputProcessInPlace = false; if( ! inputProcessInPlace ) input->setupProcessWithSumming(); input->initializeImpl(); } for( auto &out : mOutputs ) { NodeRef output = out.lock(); if( ! output ) continue; if( ! output->supportsInputNumChannels( mNumChannels ) ) { if( output->getChannelMode() == ChannelMode::MATCHES_INPUT ) { output->setNumChannels( mNumChannels ); output->configureConnections(); } else mProcessInPlace = false; } } if( ! mProcessInPlace ) setupProcessWithSumming(); initializeImpl(); }