summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authornick_m <mainsbridge@gmail.com>2016-09-07 00:18:35 +1000
committernick_m <mainsbridge@gmail.com>2016-09-07 00:18:35 +1000
commit3f4d49fd2f6fca3237668897e91212ea93b05b07 (patch)
tree081fe108242fb8f8311721385efda6a7cbad915b /libs/ardour
parentd6e0e75f3ce48ba864f315e3bfcfe39275ee90bc (diff)
Load midi region length and start correctly in sessions modified by v5.0 -> 5.3-41
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/session.h4
-rw-r--r--libs/ardour/midi_region.cc14
-rw-r--r--libs/ardour/session.cc3
-rw-r--r--libs/ardour/session_state.cc14
4 files changed, 31 insertions, 4 deletions
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 858a2c6d97..bb2da411c8 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -1128,6 +1128,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
VCAManager& vca_manager() { return *_vca_manager; }
+ bool midi_regions_use_bbt_beats () { return _midi_regions_use_bbt_beats; }
+
protected:
friend class AudioEngine;
void set_block_size (pframes_t nframes);
@@ -2016,6 +2018,8 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
boost::shared_ptr<Route> get_midi_nth_route_by_id (PresentationInfo::order_t n) const;
std::string created_with;
+
+ bool _midi_regions_use_bbt_beats;
};
diff --git a/libs/ardour/midi_region.cc b/libs/ardour/midi_region.cc
index cf72379211..67bd7a1b3d 100644
--- a/libs/ardour/midi_region.cc
+++ b/libs/ardour/midi_region.cc
@@ -439,10 +439,18 @@ MidiRegion::set_state (const XMLNode& node, int version)
if (position_lock_style() == AudioTime) {
update_length_beats (0);
}
- }
- _start_pulse = _start_beats.val().to_double() / 4.0;
- _length_pulse = _length_beats.val().to_double() / 4.0;
+ if (_session.midi_regions_use_bbt_beats()) {
+ info << _("Updating midi region start and length beats") << endmsg;
+ TempoMap& map (_session.tempo_map());
+ _start_beats = Evoral::Beats ((map.pulse_at_beat (_beat) - map.pulse_at_beat (_beat - _start_beats.val().to_double())) * 4.0);
+ _length_beats = Evoral::Beats ((map.pulse_at_beat (_beat + _length_beats.val().to_double()) - map.pulse_at_beat (_beat)) * 4.0);
+
+ }
+
+ _start_pulse = _start_beats.val().to_double() / 4.0;
+ _length_pulse = _length_beats.val().to_double() / 4.0;
+ }
return ret;
}
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index fc66dfe602..9fd3539dae 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -318,6 +318,7 @@ Session::Session (AudioEngine &eng,
, _midi_ports (0)
, _mmc (0)
, _vca_manager (new VCAManager (*this))
+ , _midi_regions_use_bbt_beats (false)
{
uint32_t sr = 0;
@@ -477,10 +478,10 @@ Session::Session (AudioEngine &eng,
}
}
#endif
+ _midi_regions_use_bbt_beats = false;
_is_new = false;
session_loaded ();
-
BootMessage (_("Session loading complete"));
}
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 41d6d51979..48048ba764 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -1000,6 +1000,20 @@ Session::load_state (string snapshot_name)
return -1;
}
}
+ } else {
+ XMLNode* child;
+ if ((child = find_named_node (root, "ProgramVersion")) != 0) {
+ if ((prop = child->property ("modified-with")) != 0) {
+ std::string modified_with = prop->value ();
+
+ const double modified_with_version = atof (modified_with.substr ( modified_with.find(" ", 0) + 1, string::npos).c_str());
+ const int modified_with_revision = atoi (modified_with.substr (modified_with.find("-", 0) + 1, string::npos).c_str());
+
+ if (modified_with_version <= 5.3 && !(modified_with_version == 5.3 && modified_with_revision >= 42)) {
+ _midi_regions_use_bbt_beats = true;
+ }
+ }
+ }
}
save_snapshot_name (snapshot_name);