X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=libs%2Fardour%2Faudio_playlist.cc;h=9c3bce4196eb39b9560afa27e343c3a584fb45b3;hb=b6f1f02131d99392899cd394f1fb408438b1dd58;hp=6a27541bcd1fe2c18f4fa13c0f7c5285c93e701a;hpb=f4401c59284258c6aa56707da64e3da32756329f;p=ardour.git diff --git a/libs/ardour/audio_playlist.cc b/libs/ardour/audio_playlist.cc index 6a27541bcd..9c3bce4196 100644 --- a/libs/ardour/audio_playlist.cc +++ b/libs/ardour/audio_playlist.cc @@ -21,7 +21,6 @@ #include - #include "ardour/types.h" #include "ardour/debug.h" #include "ardour/configuration.h" @@ -38,11 +37,76 @@ using namespace ARDOUR; using namespace std; using namespace PBD; +namespace ARDOUR { + namespace Properties { + PBD::PropertyDescriptor crossfades; + } +} + +void +AudioPlaylist::make_property_quarks () +{ + Properties::crossfades.property_id = g_quark_from_static_string (X_("crossfades")); + DEBUG_TRACE (DEBUG::Properties, string_compose ("quark for crossfades = %1\n", Properties::crossfades.property_id)); +} + +CrossfadeListProperty::CrossfadeListProperty (AudioPlaylist& pl) + : SequenceProperty > > (Properties::crossfades.property_id, boost::bind (&AudioPlaylist::update, &pl, _1)) + , _playlist (pl) +{ + +} + +CrossfadeListProperty::CrossfadeListProperty (CrossfadeListProperty const & p) + : PBD::SequenceProperty > > (p) + , _playlist (p._playlist) +{ + +} + + +CrossfadeListProperty * +CrossfadeListProperty::create () const +{ + return new CrossfadeListProperty (_playlist); +} + +CrossfadeListProperty * +CrossfadeListProperty::clone () const +{ + return new CrossfadeListProperty (*this); +} + +void +CrossfadeListProperty::get_content_as_xml (boost::shared_ptr xfade, XMLNode & node) const +{ + /* Crossfades are not written to any state when they are no + longer in use, so we must write their state here. + */ + + XMLNode& c = xfade->get_state (); + node.add_child_nocopy (c); +} + +boost::shared_ptr +CrossfadeListProperty::get_content_from_xml (XMLNode const & node) const +{ + XMLNodeList const c = node.children (); + assert (c.size() == 1); + return boost::shared_ptr (new Crossfade (_playlist, *c.front())); +} + + AudioPlaylist::AudioPlaylist (Session& session, const XMLNode& node, bool hidden) : Playlist (session, node, DataType::AUDIO, hidden) + , _crossfades (*this) { +#ifndef NDEBUG const XMLProperty* prop = node.property("type"); assert(!prop || DataType(prop->value()) == DataType::AUDIO); +#endif + + add_property (_crossfades); in_set_state++; set_state (node, Stateful::loading_state_version); @@ -51,12 +115,17 @@ AudioPlaylist::AudioPlaylist (Session& session, const XMLNode& node, bool hidden AudioPlaylist::AudioPlaylist (Session& session, string name, bool hidden) : Playlist (session, name, DataType::AUDIO, hidden) + , _crossfades (*this) { + add_property (_crossfades); } AudioPlaylist::AudioPlaylist (boost::shared_ptr other, string name, bool hidden) : Playlist (other, name, hidden) + , _crossfades (*this) { + add_property (_crossfades); + RegionList::const_iterator in_o = other->regions.begin(); RegionList::iterator in_n = regions.begin(); @@ -97,7 +166,10 @@ AudioPlaylist::AudioPlaylist (boost::shared_ptr other, stri AudioPlaylist::AudioPlaylist (boost::shared_ptr other, nframes_t start, nframes_t cnt, string name, bool hidden) : Playlist (other, start, cnt, name, hidden) + , _crossfades (*this) { + add_property (_crossfades); + /* this constructor does NOT notify others (session) */ } @@ -239,9 +311,9 @@ AudioPlaylist::remove_dependents (boost::shared_ptr region) void -AudioPlaylist::flush_notifications () +AudioPlaylist::flush_notifications (bool from_undo) { - Playlist::flush_notifications(); + Playlist::flush_notifications (from_undo); if (in_flush) { return; @@ -397,7 +469,7 @@ AudioPlaylist::check_dependents (boost::shared_ptr r, bool norefresh) touched_regions = 0; try { - nframes_t xfade_length; + framecnt_t xfade_length; switch (c) { case OverlapNone: break; @@ -793,3 +865,28 @@ AudioPlaylist::foreach_crossfade (boost::function +AudioPlaylist::find_crossfade (const PBD::ID& id) const +{ + Crossfades::const_iterator i = _crossfades.begin (); + while (i != _crossfades.end() && (*i)->id() != id) { + ++i; + } + + if (i == _crossfades.end()) { + return boost::shared_ptr (); + } + + return *i; +}