View Issue Details
ID | Project | Category | View Status | Date Submitted | Last Update |
---|---|---|---|---|---|
0002430 | ardour | bugs | public | 2008-10-26 20:58 | 2020-04-19 20:13 |
Reporter | peppot | Assigned To | cth103 | ||
Priority | normal | Severity | minor | Reproducibility | have not tried |
Status | closed | Resolution | fixed | ||
Fixed in Version | SVN/2.0-ongoing | ||||
Summary | 0002430: "Insert time" should move all objects; markers, automation et al | ||||
Description | To make "Insert time" more useful, it should move all objects including automation, markers, ranges | ||||
Tags | No tags attached. | ||||
|
As far as I can see, markers can already be moved (optionally). Automation should move though, and currently doesn't. |
2008-12-02 03:37
|
2430-insert-time.patch (5,308 bytes)
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 51cb8b6..6b86750 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -36,7 +36,6 @@ #include <gtkmm2ext/window_title.h> #include <gtkmm2ext/popup.h> - #include <ardour/audioengine.h> #include <ardour/session.h> #include <ardour/audioplaylist.h> @@ -6014,26 +6013,34 @@ Editor::insert_time (nframes64_t pos, nframes64_t frames, InsertTimeOption opt, begin_reversible_command (_("insert time")); for (TrackSelection::iterator x = selection->tracks.begin(); x != selection->tracks.end(); ++x) { + /* regions */ boost::shared_ptr<Playlist> pl = (*x)->playlist(); - if (!pl) { - continue; - } - - XMLNode &before = pl->get_state(); + if (pl) { - if (opt == SplitIntersected) { - pl->split (pos); + XMLNode &before = pl->get_state(); + + if (opt == SplitIntersected) { + pl->split (pos); + } + + pl->shift (pos, frames, (opt == MoveIntersected), ignore_music_glue); + + XMLNode &after = pl->get_state(); + + session->add_command (new MementoCommand<Playlist> (*pl, &before, &after)); + commit = true; + } + + /* automation */ + RouteTimeAxisView* rtav = dynamic_cast<RouteTimeAxisView*> (*x); + if (rtav) { + rtav->route ()->shift (pos, frames); + commit = true; } - - pl->shift (pos, frames, (opt == MoveIntersected), ignore_music_glue); - - XMLNode &after = pl->get_state(); - - session->add_command (new MementoCommand<Playlist> (*pl, &before, &after)); - commit = true; } + /* markers */ if (markers_too) { bool moved = false; XMLNode& before (session->locations()->get_state()); diff --git a/libs/ardour/ardour/automation_event.h b/libs/ardour/ardour/automation_event.h index b9c243f..02b306c 100644 --- a/libs/ardour/ardour/automation_event.h +++ b/libs/ardour/ardour/automation_event.h @@ -108,6 +108,7 @@ class AutomationList : public PBD::StatefulDestructible void erase (iterator, iterator); void move_range (iterator start, iterator end, double, double); void modify (iterator, double, double); + void shift (nframes64_t, nframes64_t); AutomationList* cut (double, double); AutomationList* copy (double, double); diff --git a/libs/ardour/ardour/route.h b/libs/ardour/ardour/route.h index f80eb45..0ac50f4 100644 --- a/libs/ardour/ardour/route.h +++ b/libs/ardour/ardour/route.h @@ -106,6 +106,8 @@ class Route : public IO /* end of vfunc-based API */ + void shift (nframes64_t, nframes64_t); + /* override IO::set_gain() to provide group control */ void set_gain (gain_t val, void *src); diff --git a/libs/ardour/automation_event.cc b/libs/ardour/automation_event.cc index 3e257d2..44cba83 100644 --- a/libs/ardour/automation_event.cc +++ b/libs/ardour/automation_event.cc @@ -1426,3 +1426,20 @@ AutomationList::set_state (const XMLNode& node) return 0; } +void +AutomationList::shift (nframes64_t pos, nframes64_t frames) +{ + { + Glib::Mutex::Lock lm (lock); + + for (iterator i = begin (); i != end (); ++i) { + if ((*i)->when >= pos) { + (*i)->when += frames; + } + } + + mark_dirty (); + } + + maybe_signal_changed (); +} diff --git a/libs/ardour/io.cc b/libs/ardour/io.cc index da0529b..865814b 100644 --- a/libs/ardour/io.cc +++ b/libs/ardour/io.cc @@ -2806,3 +2806,4 @@ IO::set_active (bool yn) active_changed(); /* EMIT SIGNAL */ } + diff --git a/libs/ardour/route.cc b/libs/ardour/route.cc index 41ba51b..edfcaa7 100644 --- a/libs/ardour/route.cc +++ b/libs/ardour/route.cc @@ -25,6 +25,7 @@ #include <pbd/xml++.h> #include <pbd/enumwriter.h> #include <pbd/stacktrace.h> +#include <pbd/memento_command.h> #include <ardour/timestamps.h> #include <ardour/buffer.h> @@ -2614,3 +2615,47 @@ Route::set_pending_declick (int declick) } } + +/** Shift automation forwards from a particular place, thereby inserting time. + * Adds undo commands for any shifts that are performed. + * + * @param pos Position to start shifting from. + * @param frames Amount to shift forwards by. + */ + +void +Route::shift (nframes64_t pos, nframes64_t frames) +{ + /* gain automation */ + XMLNode &before = _gain_automation_curve.get_state (); + _gain_automation_curve.shift (pos, frames); + XMLNode &after = _gain_automation_curve.get_state (); + _session.add_command (new MementoCommand<AutomationList> (_gain_automation_curve, &before, &after)); + + /* pan automation */ + for (std::vector<StreamPanner*>::iterator i = _panner->begin (); i != _panner->end (); ++i) { + Curve & c = (*i)->automation (); + XMLNode &before = c.get_state (); + c.shift (pos, frames); + XMLNode &after = c.get_state (); + _session.add_command (new MementoCommand<AutomationList> (c, &before, &after)); + } + + /* redirect automation */ + { + Glib::RWLock::ReaderLock lm (redirect_lock); + for (RedirectList::iterator i = _redirects.begin (); i != _redirects.end (); ++i) { + + set<uint32_t> a; + (*i)->what_has_automation (a); + + for (set<uint32_t>::const_iterator j = a.begin (); j != a.end (); ++j) { + AutomationList & al = (*i)->automation_list (*j); + XMLNode &before = al.get_state (); + al.shift (pos, frames); + XMLNode &after = al.get_state (); + _session.add_command (new MementoCommand<AutomationList> (al, &before, &after)); + } + } + } +} |
|
The attached patch should fix the movement of automation when time is inserted. Is there anything else that I'm missing? |
|
This should now be fixed in 2.0-ongoing SVN. |
|
Issue has been closed automatically, by Trigger Close Plugin. Feel free to re-open with additional information if you think the issue is not resolved. |
Date Modified | Username | Field | Change |
---|---|---|---|
2008-10-26 20:58 | peppot | New Issue | |
2008-11-24 10:55 | seablade | Status | new => acknowledged |
2008-12-02 01:42 | cth103 | Note Added: 0005416 | |
2008-12-02 03:37 | cth103 | File Added: 2430-insert-time.patch | |
2008-12-02 03:38 | cth103 | Note Added: 0005417 | |
2008-12-02 03:38 | cth103 | Status | acknowledged => feedback |
2008-12-05 14:34 | cth103 | cost | => 0.00 |
2008-12-05 14:34 | cth103 | Status | feedback => resolved |
2008-12-05 14:34 | cth103 | Fixed in Version | => SVN/2.0-ongoing |
2008-12-05 14:34 | cth103 | Resolution | open => fixed |
2008-12-05 14:34 | cth103 | Assigned To | => cth103 |
2008-12-05 14:34 | cth103 | Note Added: 0005498 | |
2010-04-24 10:28 | cth103 | Category | bugs => bugs2 |
2010-04-24 10:32 | cth103 | Category | bugs2 => bugs |
2020-04-19 20:13 | system | Note Added: 0021805 | |
2020-04-19 20:13 | system | Status | resolved => closed |