X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fautomation_time_axis.cc;h=369989334b2e71a5134a1d0ef52f2f82f375ce3c;hb=2dc3c8b3650266eba09cf7fe53c39c6728d4d5b6;hp=4ff48464f7241d52f7f2661d2eb9252b2d662065;hpb=1545c426d9e3bc0411f3b5532c0c5a9eb09394c8;p=ardour.git diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc index 4ff48464f7..369989334b 100644 --- a/gtk2_ardour/automation_time_axis.cc +++ b/gtk2_ardour/automation_time_axis.cc @@ -31,7 +31,7 @@ #include "pbd/unwind.h" #include "ardour/automation_control.h" -#include "ardour/beats_frames_converter.h" +#include "ardour/beats_samples_converter.h" #include "ardour/event_type_map.h" #include "ardour/parameter_types.h" #include "ardour/profile.h" @@ -138,6 +138,7 @@ AutomationTimeAxisView::AutomationTimeAxisView ( auto_off_item = 0; auto_touch_item = 0; + auto_latch_item = 0; auto_write_item = 0; auto_play_item = 0; mode_discrete_item = 0; @@ -170,6 +171,7 @@ AutomationTimeAxisView::AutomationTimeAxisView ( _parameter.type() <= MidiChannelPressureAutomation)) { auto_dropdown.AddMenuElem (MenuElem (_("Write"), sigc::bind (sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state), (AutoState) Write))); auto_dropdown.AddMenuElem (MenuElem (_("Touch"), sigc::bind (sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state), (AutoState) Touch))); + auto_dropdown.AddMenuElem (MenuElem (_("Latch"), sigc::bind (sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state), (AutoState) Latch))); } /* XXX translators: use a string here that will be at least as long @@ -369,7 +371,7 @@ AutomationTimeAxisView::automation_state_changed () state = ARDOUR::Off; } - switch (state & (ARDOUR::Off|Play|Touch|Write)) { + switch (state & (ARDOUR::Off|Play|Touch|Write|Latch)) { case ARDOUR::Off: auto_dropdown.set_text (automation_state_off_string()); ignore_state_request = true; @@ -379,6 +381,7 @@ AutomationTimeAxisView::automation_state_changed () } if (auto_touch_item) { auto_touch_item->set_active (false); + auto_latch_item->set_active (false); auto_write_item->set_active (false); } ignore_state_request = false; @@ -392,6 +395,7 @@ AutomationTimeAxisView::automation_state_changed () } if (auto_touch_item) { auto_touch_item->set_active (false); + auto_latch_item->set_active (false); auto_write_item->set_active (false); } ignore_state_request = false; @@ -406,6 +410,7 @@ AutomationTimeAxisView::automation_state_changed () if (auto_touch_item) { auto_write_item->set_active (true); auto_touch_item->set_active (false); + auto_latch_item->set_active (false); } ignore_state_request = false; break; @@ -419,6 +424,21 @@ AutomationTimeAxisView::automation_state_changed () if (auto_touch_item) { auto_touch_item->set_active (true); auto_write_item->set_active (false); + auto_latch_item->set_active (false); + } + ignore_state_request = false; + break; + case Latch: + auto_dropdown.set_text (_("Latch")); + ignore_state_request = true; + if (auto_off_item) { + auto_off_item->set_active (false); + auto_play_item->set_active (false); + } + if (auto_touch_item) { + auto_latch_item->set_active (true); + auto_touch_item->set_active (false); + auto_write_item->set_active (false); } ignore_state_request = false; break; @@ -622,6 +642,11 @@ AutomationTimeAxisView::build_display_menu () sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state), (AutoState) Touch))); auto_touch_item = dynamic_cast(&as_items.back()); + + as_items.push_back (CheckMenuElem (_("Latch"), sigc::bind ( + sigc::mem_fun(*this, &AutomationTimeAxisView::set_automation_state), + (AutoState) Latch))); + auto_latch_item = dynamic_cast(&as_items.back()); } items.push_back (MenuElem (_("State"), *auto_state_menu)); @@ -701,7 +726,7 @@ AutomationTimeAxisView::build_display_menu () } void -AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t frame, double y, bool with_guard_points) +AutomationTimeAxisView::add_automation_event (GdkEvent* event, samplepos_t sample, double y, bool with_guard_points) { if (!_line) { return; @@ -716,14 +741,14 @@ AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t frame, return; } - MusicFrame when (frame, 0); + MusicSample when (sample, 0); _editor.snap_to_with_modifier (when, event); if (UIConfiguration::instance().get_new_automation_points_on_lane()) { if (_control->list()->size () == 0) { y = _control->get_value (); } else { - y = _control->list()->eval (when.frame); + y = _control->list()->eval (when.sample); } } else { double x = 0; @@ -737,12 +762,12 @@ AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t frame, XMLNode& before = list->get_state(); std::list results; - if (list->editor_add (when.frame, y, with_guard_points)) { + if (list->editor_add (when.sample, y, with_guard_points)) { XMLNode& after = list->get_state(); _editor.begin_reversible_command (_("add automation event")); _session->add_command (new MementoCommand (*list.get (), &before, &after)); - _line->get_selectables (when.frame, when.frame, 0.0, 1.0, results); + _line->get_selectables (when.sample, when.sample, 0.0, 1.0, results); _editor.get_selection ().set (results); _editor.commit_reversible_command (); @@ -751,7 +776,7 @@ AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t frame, } bool -AutomationTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t divisions) +AutomationTimeAxisView::paste (samplepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t divisions) { if (_line) { return paste_one (pos, ctx.count, ctx.times, selection, ctx.counts, ctx.greedy); @@ -772,7 +797,7 @@ AutomationTimeAxisView::paste (framepos_t pos, const Selection& selection, Paste } bool -AutomationTimeAxisView::paste_one (framepos_t pos, unsigned paste_count, float times, const Selection& selection, ItemCounts& counts, bool greedy) +AutomationTimeAxisView::paste_one (samplepos_t pos, unsigned paste_count, float times, const Selection& selection, ItemCounts& counts, bool greedy) { boost::shared_ptr alist(_line->the_list()); @@ -799,7 +824,7 @@ AutomationTimeAxisView::paste_one (framepos_t pos, unsigned paste_count, float t if (parameter_is_midi (src_type)) { // convert length to samples (incl tempo-ramps) - len = DoubleBeatsFramesConverter (_session->tempo_map(), pos).to (len * paste_count); + len = DoubleBeatsSamplesConverter (_session->tempo_map(), pos).to (len * paste_count); pos += _editor.get_paste_offset (pos, paste_count > 0 ? 1 : 0, len); } else { pos += _editor.get_paste_offset (pos, paste_count, len); @@ -809,14 +834,14 @@ AutomationTimeAxisView::paste_one (framepos_t pos, unsigned paste_count, float t double const model_pos = _line->time_converter().from (pos - _line->time_converter().origin_b ()); XMLNode &before = alist->get_state(); - alist->paste (**p, model_pos, DoubleBeatsFramesConverter (_session->tempo_map(), pos)); + alist->paste (**p, model_pos, DoubleBeatsSamplesConverter (_session->tempo_map(), pos)); _session->add_command (new MementoCommand(*alist.get(), &before, &alist->get_state())); return true; } void -AutomationTimeAxisView::get_selectables (framepos_t start, framepos_t end, double top, double bot, list& results, bool /*within*/) +AutomationTimeAxisView::get_selectables (samplepos_t start, samplepos_t end, double top, double bot, list& results, bool /*within*/) { if (!_line && !_view) { return; @@ -1113,7 +1138,7 @@ AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& sel XMLNode &before = alist->get_state(); /* convert time selection to automation list model coordinates */ - const Evoral::TimeConverter& tc = line.time_converter (); + const Evoral::TimeConverter& tc = line.time_converter (); double const start = tc.from (selection.time.front().start - tc.origin_b ()); double const end = tc.from (selection.time.front().end - tc.origin_b ());