# HG changeset patch # User Chris Cannam # Date 1562342154 -3600 # Node ID fd7f127ecd89e87e6901dcaad2ac4c9d8209601c # Parent 8529763e2258dc018ec1586365fa6d124ad29779 Don't hold on to borrowed pointer around the loop - so as to be informed when it becomes obsolete diff -r 8529763e2258 -r fd7f127ecd89 transform/FeatureExtractionModelTransformer.cpp --- a/transform/FeatureExtractionModelTransformer.cpp Fri Jul 05 16:55:27 2019 +0100 +++ b/transform/FeatureExtractionModelTransformer.cpp Fri Jul 05 16:55:54 2019 +0100 @@ -648,17 +648,29 @@ if (m_abandoned) return; ModelId inputId = getInputModel(); - auto input = ModelById::getAs(inputId); - if (!input) { - abandon(); - return; - } - sv_samplerate_t sampleRate = input->getSampleRate(); + sv_samplerate_t sampleRate; + int channelCount; + sv_frame_t startFrame; + sv_frame_t endFrame; + + { // scope so as not to have this borrowed pointer retained around + // the edges of the process loop + auto input = ModelById::getAs(inputId); + if (!input) { + abandon(); + return; + } - int channelCount = input->getChannelCount(); - if ((int)m_plugin->getMaxChannelCount() < channelCount) { - channelCount = 1; + sampleRate = input->getSampleRate(); + + channelCount = input->getChannelCount(); + if ((int)m_plugin->getMaxChannelCount() < channelCount) { + channelCount = 1; + } + + startFrame = input->getStartFrame(); + endFrame = input->getEndFrame(); } float **buffers = new float*[channelCount]; @@ -696,9 +708,6 @@ } } - sv_frame_t startFrame = input->getStartFrame(); - sv_frame_t endFrame = input->getEndFrame(); - RealTime contextStartRT = primaryTransform.getStartTime(); RealTime contextDurationRT = primaryTransform.getDuration(); @@ -761,6 +770,11 @@ ((((blockFrame - contextStart) / stepSize) * 99) / (contextDuration / stepSize + 1)); + if (!ModelById::get(inputId)) { + abandon(); + return; + } + // channelCount is either input->channelCount or 1 if (frequencyDomain) { diff -r 8529763e2258 -r fd7f127ecd89 transform/RealTimeEffectModelTransformer.cpp --- a/transform/RealTimeEffectModelTransformer.cpp Fri Jul 05 16:55:27 2019 +0100 +++ b/transform/RealTimeEffectModelTransformer.cpp Fri Jul 05 16:55:54 2019 +0100 @@ -142,6 +142,25 @@ return; } + sv_samplerate_t sampleRate; + int channelCount; + sv_frame_t startFrame; + sv_frame_t endFrame; + + { // scope so as not to have this borrowed pointer retained around + // the edges of the process loop + auto input = ModelById::getAs(getInputModel()); + if (!input) { + abandon(); + return; + } + + sampleRate = input->getSampleRate(); + channelCount = input->getChannelCount(); + startFrame = input->getStartFrame(); + endFrame = input->getEndFrame(); + } + auto stvm = ModelById::getAs(m_outputs[0]); auto wwfm = ModelById::getAs(m_outputs[0]); @@ -153,17 +172,12 @@ return; } - sv_samplerate_t sampleRate = input->getSampleRate(); - int channelCount = input->getChannelCount(); if (!wwfm && m_input.getChannel() != -1) channelCount = 1; sv_frame_t blockSize = m_plugin->getBufferSize(); float **inbufs = m_plugin->getAudioInputBuffers(); - sv_frame_t startFrame = input->getStartFrame(); - sv_frame_t endFrame = input->getEndFrame(); - Transform transform = m_transforms[0]; RealTime contextStartRT = transform.getStartTime(); @@ -205,6 +219,12 @@ sv_frame_t got = 0; + auto input = ModelById::getAs(getInputModel()); + if (!input) { + abandon(); + return; + } + if (channelCount == 1) { if (inbufs && inbufs[0]) { auto data = input->getData