summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2008-12-02 17:34:05 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2008-12-02 17:34:05 +0000
commit6e3190e17c83b468abf262618e7341b778819d85 (patch)
treec1f589f06a89a1b211f7fad86ac0a86749aac0ba /libs
parent4fc93e9381c44e4a7f1be787727a65caacae50aa (diff)
define ARCH_X86 even on x86_64 (untested!); giso's patch for control surface track indexing; carl's patches for insert-time and double-click on redirect boxes
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@4279 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/automation_event.h1
-rw-r--r--libs/ardour/ardour/route.h2
-rw-r--r--libs/ardour/automation_event.cc17
-rw-r--r--libs/ardour/io.cc1
-rw-r--r--libs/ardour/route.cc45
-rw-r--r--libs/surfaces/control_protocol/control_protocol.cc10
6 files changed, 71 insertions, 5 deletions
diff --git a/libs/ardour/ardour/automation_event.h b/libs/ardour/ardour/automation_event.h
index b9c243fa37..02b306c355 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 f80eb45fc7..0ac50f4452 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 3e257d2b7a..44cba83f38 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 da0529b9c6..865814b114 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 41ba51b0d1..edfcaa7962 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));
+ }
+ }
+ }
+}
diff --git a/libs/surfaces/control_protocol/control_protocol.cc b/libs/surfaces/control_protocol/control_protocol.cc
index 8456654f20..6565342944 100644
--- a/libs/surfaces/control_protocol/control_protocol.cc
+++ b/libs/surfaces/control_protocol/control_protocol.cc
@@ -70,14 +70,14 @@ ControlProtocol::next_track (uint32_t initial_id)
id++;
}
- while (id < limit) {
+ while (id <= limit) {
if ((cr = session->route_by_remote_id (id)) != 0) {
break;
}
id++;
}
- if (id == limit) {
+ if (id >= limit) {
id = 0;
while (id != initial_id) {
if ((cr = session->route_by_remote_id (id)) != 0) {
@@ -93,9 +93,9 @@ ControlProtocol::next_track (uint32_t initial_id)
void
ControlProtocol::prev_track (uint32_t initial_id)
{
- uint32_t limit = session->nroutes() - 1;
+ uint32_t limit = session->nroutes();
boost::shared_ptr<Route> cr = route_table[0];
- uint32_t id;
+ int32_t id;
if (cr) {
id = cr->remote_control_id ();
@@ -104,7 +104,7 @@ ControlProtocol::prev_track (uint32_t initial_id)
}
if (id == 0) {
- id = session->nroutes() - 1;
+ id = limit;
} else {
id--;
}