diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index fdb0f695fd..971776f360 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -3156,12 +3156,6 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move) char name[64]; snprintf (name, sizeof(name), "%g/%g", _marker->meter().divisions_per_bar(), _marker->meter().note_divisor ()); - MeterSection section (_marker->meter()); - - if (!section.movable()) { - return; - } - _marker = new MeterMarker ( *_editor, *_editor->meter_group, @@ -3174,7 +3168,6 @@ MeterMarkerDrag::motion (GdkEvent* event, bool first_move) swap_grab (&_marker->the_item(), 0, GDK_CURRENT_TIME); if (!_copy) { - _editor->begin_reversible_command (_("move meter mark")); TempoMap& map (_editor->session()->tempo_map()); /* get current state */ before_state = &map.get_state(); @@ -3203,37 +3196,29 @@ MeterMarkerDrag::finished (GdkEvent* event, bool movement_occurred) return; } - if (!_marker->meter().movable()) { - return; - } - - //motion (event, false); - - //Timecode::BBT_Time when; - TempoMap& map (_editor->session()->tempo_map()); - //map.bbt_time (_marker->position(), when); if (_copy == true) { _editor->begin_reversible_command (_("copy meter mark")); XMLNode &before = map.get_state(); - if (_marker->meter().position_lock_style() == AudioTime) { - map.add_meter (_marker->meter(), _marker->position()); + if (_real_section->position_lock_style() == AudioTime) { + map.add_meter (Meter (_real_section->divisions_per_bar(), _real_section->note_divisor()), _real_section->frame()); } else { - map.add_meter (_marker->meter(), _real_section->pulse(), _real_section->bbt()); + map.add_meter (Meter (_real_section->divisions_per_bar(), _real_section->note_divisor()), _real_section->pulse(), _real_section->bbt()); } - XMLNode &after = map.get_state(); _editor->session()->add_command(new MementoCommand(map, &before, &after)); _editor->commit_reversible_command (); } else { + _editor->begin_reversible_command (_("move meter mark")); + /* we removed it before, so add it back now */ - if (_marker->meter().position_lock_style() == AudioTime) { - map.replace_meter (*_real_section, _marker->meter(), _marker->position()); + if (_real_section->position_lock_style() == AudioTime) { + map.replace_meter (*_real_section, Meter (_real_section->divisions_per_bar(), _real_section->note_divisor()), _real_section->frame()); } else { - map.replace_meter (*_real_section, _marker->meter(), _real_section->bbt()); + map.replace_meter (*_real_section, Meter (_real_section->divisions_per_bar(), _real_section->note_divisor()), _real_section->bbt()); } XMLNode &after = map.get_state(); diff --git a/libs/ardour/tempo.cc b/libs/ardour/tempo.cc index e6c9a829b9..db1be14ef7 100644 --- a/libs/ardour/tempo.cc +++ b/libs/ardour/tempo.cc @@ -946,6 +946,10 @@ TempoMap::replace_meter (const MeterSection& ms, const Meter& meter, const frame /* cannot move the first meter section */ *static_cast(&first) = meter; first.set_position_lock_style (pl); + double paf = pulse_at_frame_locked (_metrics, frame); + pair pulse = make_pair (paf, beats_to_bbt_locked (_metrics, beat_at_pulse_locked (_metrics, paf))); + first.set_pulse (pulse); + first.set_frame (frame); recompute_map (_metrics); } } @@ -1022,9 +1026,7 @@ TempoMap::add_meter_locked (const Meter& meter, framepos_t frame, bool recompute { MeterSection* new_meter = new MeterSection (frame, meter.divisions_per_bar(), meter.note_divisor()); - double paf = pulse_at_frame_locked (_metrics, frame); - pair beat = make_pair (paf, beats_to_bbt_locked (_metrics, beat_at_pulse_locked (_metrics, paf))); - new_meter->set_pulse (beat); + do_insert (new_meter); if (recompute) { @@ -1048,6 +1050,7 @@ TempoMap::predict_tempo_frame (TempoSection* section, const Tempo& bpm, const BB Metrics future_map; framepos_t ret = 0; TempoSection* new_section = copy_metrics_and_point (future_map, section); + double const beat = bbt_to_beats_locked (future_map, bbt); if (solve_map (future_map, new_section, bpm, pulse_at_beat_locked (future_map, beat))) { ret = new_section->frame(); @@ -1177,8 +1180,7 @@ TempoMap::copy_metrics_and_point (Metrics& copy, TempoSection* section) if (m->position_lock_style() == MusicTime) { copy.push_back (new MeterSection (m->pulse(), m->bbt(), m->divisions_per_bar(), m->note_divisor())); } else { - copy.push_back (new MeterSection (m->frame(), m->bbt(), m->divisions_per_bar(), m->note_divisor())); - + copy.push_back (new MeterSection (m->frame(), m->divisions_per_bar(), m->note_divisor())); } } } @@ -1796,11 +1798,13 @@ TempoMap::frame_at_pulse_locked (const Metrics& metrics, const double& pulse) co TempoSection* t; if ((t = dynamic_cast (*i)) != 0) { - if (prev_ts) { - if (t->pulse() > pulse) { - return prev_ts->frame_at_pulse (pulse, _frame_rate); + if (prev_ts && t->pulse() > pulse) { + if (prev_ts->pulse() > pulse) { + return 0; } + return prev_ts->frame_at_pulse (pulse, _frame_rate); } + accumulated_pulses = t->pulse(); prev_ts = t; }