#include "ardour/utils.h"
#include "ardour/session.h"
#include "ardour/source.h"
+#include "ardour/region_factory.h"
#include "i18n.h"
#include <locale.h>
_out = out;
_anchor_point = ap;
_fixed = true;
+ _follow_overlap = false;
initialize ();
}
initialize ();
}
-Crossfade::Crossfade (const Playlist& playlist, XMLNode& node)
+Crossfade::Crossfade (const Playlist& playlist, XMLNode const & node)
: AudioRegion (playlist.session(), 0, 0, "unnamed crossfade")
, CROSSFADE_DEFAULT_PROPERTIES
, _fade_in (Evoral::Parameter(FadeInAutomation)) // linear (gain coefficient) => -inf..+6dB
{
boost::shared_ptr<Region> r;
- XMLProperty* prop;
+ XMLProperty const * prop;
LocaleGuard lg (X_("POSIX"));
/* we have to find the in/out regions before we can do anything else */
PBD::ID id (prop->value());
- if ((r = playlist.find_region (id)) == 0) {
- error << string_compose (_("Crossfade: no \"in\" region %1 found in playlist %2"), id, playlist.name())
+ r = playlist.find_region (id);
+
+ if (!r) {
+ /* the `in' region is not in a playlist, which probably means that this crossfade
+ is in the undo record, so we have to find the region in the global region map.
+ */
+ r = RegionFactory::region_by_id (id);
+ }
+
+ if (!r) {
+ error << string_compose (_("Crossfade: no \"in\" region %1 found in playlist %2 nor in region map"), id, playlist.name())
<< endmsg;
throw failed_constructor();
}
PBD::ID id2 (prop->value());
- if ((r = playlist.find_region (id2)) == 0) {
- error << string_compose (_("Crossfade: no \"out\" region %1 found in playlist %2"), id2, playlist.name())
+ r = playlist.find_region (id2);
+
+ if (!r) {
+ r = RegionFactory::region_by_id (id2);
+ }
+
+ if (!r) {
+ error << string_compose (_("Crossfade: no \"out\" region %1 found in playlist %2 nor in region map"), id2, playlist.name())
<< endmsg;
throw failed_constructor();
}
_sources = _in->sources();
_sources.insert (_sources.end(), _out->sources().begin(), _out->sources().end());
+
+ for (SourceList::iterator i = _sources.begin(); i != _sources.end(); ++i) {
+ (*i)->inc_use_count ();
+ }
+
_master_sources = _in->master_sources();
_master_sources.insert(_master_sources.end(), _out->master_sources().begin(), _out->master_sources().end());
+ for (SourceList::iterator i = _master_sources.begin(); i != _master_sources.end(); ++i) {
+ (*i)->inc_use_count ();
+ }
+
_in_update = false;
_out->suspend_fade_out ();
}
}
+ _fade_in.front()->value = 0.0;
+ _fade_in.back()->value = 1.0;
+
_fade_in.thaw ();
/* fade out */
}
}
+ _fade_out.front()->value = 1.0;
+ _fade_out.back()->value = 0.0;
+
_fade_out.thaw ();
PropertyChanged (what_changed); /* EMIT SIGNAL */
+ FadesChanged (); /* EMIT SIGNAL */
return 0;
}