RhythmFerret: fix heap-use-after-free
After splitting regions, the AudioRegionView of the original Region no longer exists when the RhythmFerret calls `clear_transients()` at the end.
This commit is contained in:
parent
eebc902564
commit
49abbe5777
@ -231,7 +231,9 @@ RhythmFerret::run_analysis ()
|
|||||||
|
|
||||||
clear_transients ();
|
clear_transients ();
|
||||||
|
|
||||||
regions_with_transients = editor.get_selection().regions;
|
for (auto const& rv : editor.get_selection().regions) {
|
||||||
|
regions_with_transients.push_back (rv->region ());
|
||||||
|
}
|
||||||
|
|
||||||
current_results.clear ();
|
current_results.clear ();
|
||||||
|
|
||||||
@ -239,22 +241,22 @@ RhythmFerret::run_analysis ()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (RegionSelection::iterator i = regions_with_transients.begin(); i != regions_with_transients.end(); ++i) {
|
for (auto const& r : regions_with_transients) {
|
||||||
|
|
||||||
std::shared_ptr<AudioReadable> rd = std::static_pointer_cast<AudioRegion> ((*i)->region());
|
std::shared_ptr<AudioReadable> rd = std::static_pointer_cast<AudioRegion> (r);
|
||||||
|
|
||||||
switch (get_analysis_mode()) {
|
switch (get_analysis_mode()) {
|
||||||
case PercussionOnset:
|
case PercussionOnset:
|
||||||
run_percussion_onset_analysis (rd, (*i)->region()->position_sample(), current_results);
|
run_percussion_onset_analysis (rd, r->position_sample(), current_results);
|
||||||
break;
|
break;
|
||||||
case NoteOnset:
|
case NoteOnset:
|
||||||
run_note_onset_analysis (rd, (*i)->region()->position_sample(), current_results);
|
run_note_onset_analysis (rd, r->position_sample(), current_results);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*i)->region()->set_onsets (current_results);
|
r->set_onsets (current_results);
|
||||||
current_results.clear();
|
current_results.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -448,8 +450,8 @@ RhythmFerret::clear_transients ()
|
|||||||
{
|
{
|
||||||
current_results.clear ();
|
current_results.clear ();
|
||||||
|
|
||||||
for (RegionSelection::iterator i = regions_with_transients.begin(); i != regions_with_transients.end(); ++i) {
|
for (auto const& r : regions_with_transients) {
|
||||||
(*i)->region()->set_onsets (current_results);
|
r->set_onsets (current_results);
|
||||||
}
|
}
|
||||||
|
|
||||||
regions_with_transients.clear ();
|
regions_with_transients.clear ();
|
||||||
|
@ -109,7 +109,7 @@ private:
|
|||||||
|
|
||||||
void clear_transients ();
|
void clear_transients ();
|
||||||
/** Regions that we have added transient marks to */
|
/** Regions that we have added transient marks to */
|
||||||
RegionSelection regions_with_transients;
|
ARDOUR::RegionList regions_with_transients;
|
||||||
|
|
||||||
AnalysisMode get_analysis_mode () const;
|
AnalysisMode get_analysis_mode () const;
|
||||||
Action get_action() const;
|
Action get_action() const;
|
||||||
|
Loading…
Reference in New Issue
Block a user