summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authornick_m <mainsbridge@gmail.com>2017-03-04 11:28:49 +1100
committernick_m <mainsbridge@gmail.com>2017-03-04 11:28:49 +1100
commite8b5b4fcf3e9b755c953a6e25a343640d64fe3d9 (patch)
tree247d52b9b2ed84121d49599daa3a51a70a61b5b0 /libs/ardour
parent645441d093dd3ff92f502048ab1c50be058fb192 (diff)
offset linked regions to compensate for negative start after trim drag.
- should fix 7105
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/midi_model.h1
-rw-r--r--libs/ardour/ardour/midi_region.h3
-rw-r--r--libs/ardour/midi_model.cc2
-rw-r--r--libs/ardour/midi_region.cc30
4 files changed, 35 insertions, 1 deletions
diff --git a/libs/ardour/ardour/midi_model.h b/libs/ardour/ardour/midi_model.h
index cdf7b3fd3b..fb71f69085 100644
--- a/libs/ardour/ardour/midi_model.h
+++ b/libs/ardour/ardour/midi_model.h
@@ -275,6 +275,7 @@ public:
int set_state(const XMLNode&) { return 0; }
PBD::Signal0<void> ContentsChanged;
+ PBD::Signal1<void, double> ContentsShifted;
boost::shared_ptr<const MidiSource> midi_source ();
void set_midi_source (boost::shared_ptr<MidiSource>);
diff --git a/libs/ardour/ardour/midi_region.h b/libs/ardour/ardour/midi_region.h
index b41f620e87..e6357746f7 100644
--- a/libs/ardour/ardour/midi_region.h
+++ b/libs/ardour/ardour/midi_region.h
@@ -153,6 +153,7 @@ class LIBARDOUR_API MidiRegion : public Region
void update_length_beats (const int32_t sub_num);
void model_changed ();
+ void model_shifted (double qn_distance);
void model_automation_state_changed (Evoral::Parameter const &);
void set_start_beats_from_start_frames ();
@@ -160,8 +161,10 @@ class LIBARDOUR_API MidiRegion : public Region
std::set<Evoral::Parameter> _filtered_parameters; ///< parameters that we ask our source not to return when reading
PBD::ScopedConnection _model_connection;
+ PBD::ScopedConnection _model_shift_connection;
PBD::ScopedConnection _source_connection;
PBD::ScopedConnection _model_contents_connection;
+ bool _ignore_shift;
};
} /* namespace ARDOUR */
diff --git a/libs/ardour/midi_model.cc b/libs/ardour/midi_model.cc
index 4da2dc3396..d4c690c55b 100644
--- a/libs/ardour/midi_model.cc
+++ b/libs/ardour/midi_model.cc
@@ -1979,6 +1979,8 @@ MidiModel::insert_silence_at_start (TimeType t)
apply_command_as_subcommand (s->session(), c);
}
+
+ ContentsShifted (t.to_double());
}
void
diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc
index 9826fa5641..2ce234b634 100644
--- a/libs/ardour/midi_region.cc
+++ b/libs/ardour/midi_region.cc
@@ -80,6 +80,7 @@ MidiRegion::MidiRegion (const SourceList& srcs)
: Region (srcs)
, _start_beats (Properties::start_beats, 0.0)
, _length_beats (Properties::length_beats, midi_source(0)->length_beats().to_double())
+ , _ignore_shift (false)
{
register_properties ();
midi_source(0)->ModelChanged.connect_same_thread (_source_connection, boost::bind (&MidiRegion::model_changed, this));
@@ -92,6 +93,7 @@ MidiRegion::MidiRegion (boost::shared_ptr<const MidiRegion> other)
: Region (other)
, _start_beats (Properties::start_beats, other->_start_beats)
, _length_beats (Properties::length_beats, other->_length_beats)
+ , _ignore_shift (false)
{
//update_length_beats ();
register_properties ();
@@ -585,6 +587,24 @@ MidiRegion::model_changed ()
midi_source()->AutomationStateChanged.connect_same_thread (
_model_connection, boost::bind (&MidiRegion::model_automation_state_changed, this, _1)
);
+
+ model()->ContentsShifted.connect_same_thread (_model_shift_connection, boost::bind (&MidiRegion::model_shifted, this, _1));
+}
+void
+MidiRegion::model_shifted (double qn_distance)
+{
+ if (!model()) {
+ return;
+ }
+
+ if (!_ignore_shift) {
+ _start_beats += qn_distance;
+ framepos_t const new_start = _session.tempo_map().frames_between_quarter_notes (_quarter_note - _start_beats, _quarter_note);
+ _start = new_start;
+ send_change (Properties::start);
+ } else {
+ _ignore_shift = false;
+ }
}
void
@@ -620,7 +640,10 @@ MidiRegion::fix_negative_start ()
{
BeatsFramesConverter c (_session.tempo_map(), _position);
- model()->insert_silence_at_start (c.from (-_start));
+ _ignore_shift = true;
+
+ model()->insert_silence_at_start (Evoral::Beats (- _start_beats));
+
_start = 0;
_start_beats = 0.0;
}
@@ -629,6 +652,11 @@ void
MidiRegion::set_start_internal (framecnt_t s, const int32_t sub_num)
{
Region::set_start_internal (s, sub_num);
+
+ if (_start_beats < 0.0) {
+ fix_negative_start();
+ }
+
set_start_beats_from_start_frames ();
}