From 0bdbe56cf16cb2abaee65adc682830806e9d8940 Mon Sep 17 00:00:00 2001 From: nick_m Date: Mon, 4 Jul 2016 01:12:55 +1000 Subject: [PATCH] Stop passing references to things that may disappear when a metric section is replaced. --- gtk2_ardour/editor_drag.cc | 6 ++++-- gtk2_ardour/editor_markers.cc | 32 ++++++++++++++++++++++-------- gtk2_ardour/editor_ops.cc | 3 ++- gtk2_ardour/editor_tempodisplay.cc | 16 ++++++++++----- 4 files changed, 41 insertions(+), 16 deletions(-) diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index cb4de0cf7c..c8afd81476 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -3324,14 +3324,16 @@ TempoMarkerDrag::motion (GdkEvent* event, bool first_move) _editor->begin_reversible_command (_("move tempo mark")); } else { + const Tempo tempo (_marker->tempo()); const framepos_t frame = adjusted_current_frame (event) + 1; + const TempoSection::Type type = _real_section->type(); _editor->begin_reversible_command (_("copy tempo mark")); if (_real_section->position_lock_style() == MusicTime) { - _real_section = map.add_tempo (_marker->tempo(), map.pulse_at_frame (frame), 0, _real_section->type(), MusicTime); + _real_section = map.add_tempo (tempo, map.pulse_at_frame (frame), 0, type, MusicTime); } else { - _real_section = map.add_tempo (_marker->tempo(), 0.0, frame, _real_section->type(), AudioTime); + _real_section = map.add_tempo (tempo, 0.0, frame, type, AudioTime); } if (!_real_section) { diff --git a/gtk2_ardour/editor_markers.cc b/gtk2_ardour/editor_markers.cc index 9808777083..71b4744d95 100644 --- a/gtk2_ardour/editor_markers.cc +++ b/gtk2_ardour/editor_markers.cc @@ -1391,20 +1391,30 @@ Editor::toggle_marker_lock_style () begin_reversible_command (_("change meter lock style")); XMLNode &before = _session->tempo_map().get_state(); MeterSection* msp = &mm->meter(); + + const Meter meter (msp->divisions_per_bar(), msp->note_divisor()); + const Timecode::BBT_Time bbt (msp->bbt()); + const framepos_t frame = msp->frame(); const PositionLockStyle pls = (msp->position_lock_style() == AudioTime) ? MusicTime : AudioTime; - _session->tempo_map().replace_meter (*msp, Meter (msp->divisions_per_bar(), msp->note_divisor()), msp->bbt(), msp->frame(), pls); + _session->tempo_map().replace_meter (*msp, meter, bbt, frame, pls); XMLNode &after = _session->tempo_map().get_state(); _session->add_command(new MementoCommand(_session->tempo_map(), &before, &after)); commit_reversible_command (); } else if (tm) { - begin_reversible_command (_("change tempo lock style")); - XMLNode &before = _session->tempo_map().get_state(); TempoSection* tsp = &tm->tempo(); + + const Tempo tempo (tsp->beats_per_minute()); + const double pulse = tsp->pulse(); + const framepos_t frame = tsp->frame(); + const TempoSection::Type type = tsp->type(); const PositionLockStyle pls = (tsp->position_lock_style() == AudioTime) ? MusicTime : AudioTime; - _session->tempo_map().replace_tempo (*tsp, Tempo (tsp->beats_per_minute(), tsp->note_type()), tsp->pulse(), tsp->frame(), tsp->type(), pls); + begin_reversible_command (_("change tempo lock style")); + XMLNode &before = _session->tempo_map().get_state(); + + _session->tempo_map().replace_tempo (*tsp, tempo, pulse, frame, type, pls); XMLNode &after = _session->tempo_map().get_state(); _session->add_command(new MementoCommand(_session->tempo_map(), &before, &after)); @@ -1420,12 +1430,18 @@ Editor::toggle_tempo_type () dynamic_cast_marker_object (marker_menu_item->get_data ("marker"), &mm, &tm); if (tm) { + TempoSection* tsp = &tm->tempo(); + + const Tempo tempo (tsp->beats_per_minute(), tsp->note_type()); + const double pulse = tsp->pulse(); + const framepos_t frame = tsp->frame(); + const TempoSection::Type type = (tsp->type() == TempoSection::Ramp) ? TempoSection::Constant : TempoSection::Ramp; + const PositionLockStyle pls = tsp->position_lock_style(); + begin_reversible_command (_("change tempo type")); XMLNode &before = _session->tempo_map().get_state(); - TempoSection* tsp = &tm->tempo(); - const TempoSection::Type type = (tsp->type() == TempoSection::Ramp) ? TempoSection::Constant : TempoSection::Ramp; - _session->tempo_map().replace_tempo (*tsp, Tempo (tsp->beats_per_minute(), tsp->note_type()), tsp->pulse(), tsp->frame() - , type, tsp->position_lock_style()); + + _session->tempo_map().replace_tempo (*tsp, tempo, pulse, frame, type, pls); XMLNode &after = _session->tempo_map().get_state(); _session->add_command(new MementoCommand(_session->tempo_map(), &before, &after)); diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index b7809f0394..117c80262f 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -6557,7 +6557,8 @@ Editor::define_one_bar (framepos_t start, framepos_t end) } else if (t.frame() == start) { _session->tempo_map().change_existing_tempo_at (start, beats_per_minute, t.note_type()); } else { - _session->tempo_map().add_tempo (Tempo (beats_per_minute, t.note_type()), 0.0, start, TempoSection::Constant, AudioTime); + const Tempo tempo (beats_per_minute, t.note_type()); + _session->tempo_map().add_tempo (tempo, 0.0, start, TempoSection::Constant, AudioTime); } XMLNode& after (_session->tempo_map().get_state()); diff --git a/gtk2_ardour/editor_tempodisplay.cc b/gtk2_ardour/editor_tempodisplay.cc index 6aa6494f36..6c009b66e2 100644 --- a/gtk2_ardour/editor_tempodisplay.cc +++ b/gtk2_ardour/editor_tempodisplay.cc @@ -409,14 +409,18 @@ Editor::edit_meter_section (MeterSection* section) bpb = max (1.0, bpb); // XXX is this a reasonable limit? double const note_type = meter_dialog.get_note_type (); + const Meter meter (bpb, note_type); + Timecode::BBT_Time when; meter_dialog.get_bbt_time (when); + framepos_t const frame = _session->tempo_map().frame_at_bbt (when); + const PositionLockStyle pls = (meter_dialog.get_lock_style() == AudioTime) ? AudioTime : MusicTime; begin_reversible_command (_("replace meter mark")); XMLNode &before = _session->tempo_map().get_state(); - _session->tempo_map().replace_meter (*section, Meter (bpb, note_type), when, frame, meter_dialog.get_lock_style()); + _session->tempo_map().replace_meter (*section, meter, when, frame, pls); XMLNode &after = _session->tempo_map().get_state(); _session->add_command(new MementoCommand(_session->tempo_map(), &before, &after)); @@ -437,21 +441,23 @@ Editor::edit_tempo_section (TempoSection* section) double bpm = tempo_dialog.get_bpm (); double nt = tempo_dialog.get_note_type (); - Timecode::BBT_Time when; + bpm = max (0.01, bpm); + const Tempo tempo (bpm, nt); + Timecode::BBT_Time when; tempo_dialog.get_bbt_time (when); - bpm = max (0.01, bpm); + const TempoSection::Type ttype (tempo_dialog.get_tempo_type()); begin_reversible_command (_("replace tempo mark")); XMLNode &before = _session->tempo_map().get_state(); if (tempo_dialog.get_lock_style() == AudioTime) { framepos_t const f = _session->tempo_map().predict_tempo_position (section, when).second; - _session->tempo_map().replace_tempo (*section, Tempo (bpm, nt), 0.0, f, tempo_dialog.get_tempo_type(), AudioTime); + _session->tempo_map().replace_tempo (*section, tempo, 0.0, f, ttype, AudioTime); } else { double const p = _session->tempo_map().predict_tempo_position (section, when).first; - _session->tempo_map().replace_tempo (*section, Tempo (bpm, nt), p, 0, tempo_dialog.get_tempo_type(), MusicTime); + _session->tempo_map().replace_tempo (*section, tempo, p, 0, ttype, MusicTime); } XMLNode &after = _session->tempo_map().get_state();