comparison transform/FeatureExtractionModelTransformer.cpp @ 1755:fd7f127ecd89 by-id

Don't hold on to borrowed pointer around the loop - so as to be informed when it becomes obsolete
author Chris Cannam
date Fri, 05 Jul 2019 16:55:54 +0100
parents 6d09d68165a4
children 110f853c3149
comparison
equal deleted inserted replaced
1754:8529763e2258 1755:fd7f127ecd89
646 } 646 }
647 } 647 }
648 if (m_abandoned) return; 648 if (m_abandoned) return;
649 649
650 ModelId inputId = getInputModel(); 650 ModelId inputId = getInputModel();
651 auto input = ModelById::getAs<DenseTimeValueModel>(inputId); 651
652 if (!input) { 652 sv_samplerate_t sampleRate;
653 abandon(); 653 int channelCount;
654 return; 654 sv_frame_t startFrame;
655 } 655 sv_frame_t endFrame;
656 656
657 sv_samplerate_t sampleRate = input->getSampleRate(); 657 { // scope so as not to have this borrowed pointer retained around
658 658 // the edges of the process loop
659 int channelCount = input->getChannelCount(); 659 auto input = ModelById::getAs<DenseTimeValueModel>(inputId);
660 if ((int)m_plugin->getMaxChannelCount() < channelCount) { 660 if (!input) {
661 channelCount = 1; 661 abandon();
662 return;
663 }
664
665 sampleRate = input->getSampleRate();
666
667 channelCount = input->getChannelCount();
668 if ((int)m_plugin->getMaxChannelCount() < channelCount) {
669 channelCount = 1;
670 }
671
672 startFrame = input->getStartFrame();
673 endFrame = input->getEndFrame();
662 } 674 }
663 675
664 float **buffers = new float*[channelCount]; 676 float **buffers = new float*[channelCount];
665 for (int ch = 0; ch < channelCount; ++ch) { 677 for (int ch = 0; ch < channelCount; ++ch) {
666 buffers[ch] = new float[primaryTransform.getBlockSize() + 2]; 678 buffers[ch] = new float[primaryTransform.getBlockSize() + 2];
694 } 706 }
695 fftModels.push_back(model); 707 fftModels.push_back(model);
696 } 708 }
697 } 709 }
698 710
699 sv_frame_t startFrame = input->getStartFrame();
700 sv_frame_t endFrame = input->getEndFrame();
701
702 RealTime contextStartRT = primaryTransform.getStartTime(); 711 RealTime contextStartRT = primaryTransform.getStartTime();
703 RealTime contextDurationRT = primaryTransform.getDuration(); 712 RealTime contextDurationRT = primaryTransform.getDuration();
704 713
705 sv_frame_t contextStart = 714 sv_frame_t contextStart =
706 RealTime::realTime2Frame(contextStartRT, sampleRate); 715 RealTime::realTime2Frame(contextStartRT, sampleRate);
758 #endif 767 #endif
759 768
760 int completion = int 769 int completion = int
761 ((((blockFrame - contextStart) / stepSize) * 99) / 770 ((((blockFrame - contextStart) / stepSize) * 99) /
762 (contextDuration / stepSize + 1)); 771 (contextDuration / stepSize + 1));
772
773 if (!ModelById::get(inputId)) {
774 abandon();
775 return;
776 }
763 777
764 // channelCount is either input->channelCount or 1 778 // channelCount is either input->channelCount or 1
765 779
766 if (frequencyDomain) { 780 if (frequencyDomain) {
767 for (int ch = 0; ch < channelCount; ++ch) { 781 for (int ch = 0; ch < channelCount; ++ch) {