remove reference to PluginState in VST code, for real this time
[ardour.git] / libs / ardour / audio_playlist.cc
index d9902c8b599e8fe034c964d962eb74c74595d886..19609da2a4c6df4f70fc236d930b4f20e9fa3c81 100644 (file)
@@ -39,18 +39,12 @@ using namespace sigc;
 using namespace std;
 using namespace PBD;
 
-AudioPlaylist::State::~State ()
-{
-}
-
 AudioPlaylist::AudioPlaylist (Session& session, const XMLNode& node, bool hidden)
        : Playlist (session, node, hidden)
 {
-       in_set_state = true;
+       in_set_state++;
        set_state (node);
-       in_set_state = false;
-
-       save_state (_("initial state"));
+       in_set_state--;
 
        if (!hidden) {
                PlaylistCreated (this); /* EMIT SIGNAL */
@@ -60,8 +54,6 @@ AudioPlaylist::AudioPlaylist (Session& session, const XMLNode& node, bool hidden
 AudioPlaylist::AudioPlaylist (Session& session, string name, bool hidden)
        : Playlist (session, name, hidden)
 {
-       save_state (_("initial state"));
-
        if (!hidden) {
                PlaylistCreated (this); /* EMIT SIGNAL */
        }
@@ -71,8 +63,6 @@ AudioPlaylist::AudioPlaylist (Session& session, string name, bool hidden)
 AudioPlaylist::AudioPlaylist (const AudioPlaylist& other, string name, bool hidden)
        : Playlist (other, name, hidden)
 {
-       save_state (_("initial state"));
-
        RegionList::const_iterator in_o  = other.regions.begin();
        RegionList::iterator in_n = regions.begin();
 
@@ -115,18 +105,15 @@ AudioPlaylist::AudioPlaylist (const AudioPlaylist& other, string name, bool hidd
        }
 }
 
-AudioPlaylist::AudioPlaylist (const AudioPlaylist& other, jack_nframes_t start, jack_nframes_t cnt, string name, bool hidden)
+AudioPlaylist::AudioPlaylist (const AudioPlaylist& other, nframes_t start, nframes_t cnt, string name, bool hidden)
        : Playlist (other, start, cnt, name, hidden)
 {
-       save_state (_("initial state"));
-
        /* this constructor does NOT notify others (session) */
 }
 
 AudioPlaylist::~AudioPlaylist ()
 {
        set<Crossfade*> all_xfades;
-       set<Region*> all_regions;
 
        GoingAway (); /* EMIT SIGNAL */
 
@@ -134,25 +121,15 @@ AudioPlaylist::~AudioPlaylist ()
 
        notify_callbacks ();
 
-       for (Crossfades::iterator x = _crossfades.begin(); x != _crossfades.end(); ++x) {
-               all_xfades.insert (*x);
-       }
-
-       for (StateMap::iterator i = states.begin(); i != states.end(); ++i) {
-               
-               AudioPlaylist::State* apstate = dynamic_cast<AudioPlaylist::State*> (*i);
-
-       for (Crossfades::iterator xf = apstate->crossfades.begin(); xf != apstate->crossfades.end(); ++xf) {
-                       all_xfades.insert (*xf);
-               }
+       for (Crossfades::iterator x = _crossfades.begin(); x != _crossfades.end(); ) {
+               Crossfades::iterator tmp;
 
-               delete apstate;
-       }
+               tmp = x;
+               ++tmp;
 
-       /* delete every crossfade */
+               delete *x;
 
-       for (set<Crossfade *>::iterator axf = all_xfades.begin(); axf != all_xfades.end(); ++axf) {
-               delete *axf;
+               x = tmp;
        }
 }
 
@@ -162,14 +139,14 @@ struct RegionSortByLayer {
     }
 };
 
-jack_nframes_t
-AudioPlaylist::read (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, jack_nframes_t start,
-                    jack_nframes_t cnt, unsigned chan_n)
+nframes_t
+AudioPlaylist::read (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, nframes_t start,
+                    nframes_t cnt, unsigned chan_n)
 {
-       jack_nframes_t ret = cnt;
-       jack_nframes_t end;
-       jack_nframes_t read_frames;
-       jack_nframes_t skip_frames;
+       nframes_t ret = cnt;
+       nframes_t end;
+       nframes_t read_frames;
+       nframes_t skip_frames;
 
        /* optimizing this memset() away involves a lot of conditionals
           that may well cause more of a hit due to cache misses 
@@ -204,7 +181,6 @@ AudioPlaylist::read (Sample *buf, Sample *mixdown_buffer, float *gain_buffer, ja
 
        for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) {
                if ((*i)->coverage (start, end) != OverlapNone) {
-                       
                        relevant_regions[(*i)->layer()].push_back (*i);
                        relevant_layers.push_back ((*i)->layer());
                }
@@ -257,6 +233,10 @@ AudioPlaylist::remove_dependents (boost::shared_ptr<Region> region)
 {
        Crossfades::iterator i, tmp;
        boost::shared_ptr<AudioRegion> r = boost::dynamic_pointer_cast<AudioRegion> (region);
+
+       if (in_set_state) {
+               return;
+       }
        
        if (r == 0) {
                fatal << _("programming error: non-audio Region passed to remove_overlap in audio playlist")
@@ -268,9 +248,9 @@ AudioPlaylist::remove_dependents (boost::shared_ptr<Region> region)
                tmp = i;
                tmp++;
 
+               
                if ((*i)->involves (r)) {
-                       /* do not delete crossfades */
-                       _crossfades.erase (i);
+                       delete *i;
                }
                
                i = tmp;
@@ -440,7 +420,7 @@ AudioPlaylist::check_dependents (boost::shared_ptr<Region> r, bool norefresh)
                                           audio engineering.
                                        */
                                        
-                                       jack_nframes_t xfade_length = min ((jack_nframes_t) 720, top->length());
+                                       nframes_t xfade_length = min ((nframes_t) 720, top->length());
                                        
                                                            /*  in,      out */
                                        xfade = new Crossfade (top, bottom, xfade_length, top->first_frame(), StartOfIn);
@@ -449,8 +429,8 @@ AudioPlaylist::check_dependents (boost::shared_ptr<Region> r, bool norefresh)
                                        add_crossfade (*xfade);
                                        
                                } else {
-               
-                                       xfade = new Crossfade (other, region, _session.get_xfade_model(), _session.get_crossfades_active());
+
+                                       xfade = new Crossfade (other, region, Config->get_xfade_model(), Config->get_xfades_active());
                                        add_crossfade (*xfade);
                                }
                        } 
@@ -519,9 +499,10 @@ AudioPlaylist::set_state (const XMLNode& node)
        XMLNodeList nlist;
        XMLNodeConstIterator niter;
 
-       if (!in_set_state) {
-               Playlist::set_state (node);
-       }
+       in_set_state++;
+       freeze ();
+
+       Playlist::set_state (node);
 
        nlist = node.children();
 
@@ -529,155 +510,49 @@ AudioPlaylist::set_state (const XMLNode& node)
 
                child = *niter;
 
-               if (child->name() == "Crossfade") {
-
-                       Crossfade *xfade;
-                       
-                       try {
-                               xfade = new Crossfade (*((const Playlist *)this), *child);
-                       }
-
-                       catch (failed_constructor& err) {
-                         //    cout << string_compose (_("could not create crossfade object in playlist %1"),
-                         //      _name) 
-                         //    << endl;
-                               continue;
-                       }
-
-                       Crossfades::iterator ci;
-
-                       for (ci = _crossfades.begin(); ci != _crossfades.end(); ++ci) {
-                               if (*(*ci) == *xfade) {
-                                       break;
-                               }
-                       }
-
-                       if (ci == _crossfades.end()) {
-                               _crossfades.push_back (xfade);
-                               xfade->Invalidated.connect (mem_fun (*this, &AudioPlaylist::crossfade_invalidated));
-                               xfade->StateChanged.connect (mem_fun (*this, &AudioPlaylist::crossfade_changed));
-                               /* no need to notify here */
-                       } else {
-                               delete xfade;
-                       }
-               }
-
-       }
-
-       return 0;
-}
-
-void
-AudioPlaylist::drop_all_states ()
-{
-       set<Crossfade*> all_xfades;
-       set<boost::shared_ptr<Region> > all_regions;
-
-       /* find every region we've ever used, and add it to the set of 
-          all regions. same for xfades;
-       */
-
-       for (StateMap::iterator i = states.begin(); i != states.end(); ++i) {
-               
-               AudioPlaylist::State* apstate = dynamic_cast<AudioPlaylist::State*> (*i);
-
-               for (RegionList::iterator r = apstate->regions.begin(); r != apstate->regions.end(); ++r) {
-                       all_regions.insert (*r);
-               }
-
-               for (Crossfades::iterator xf = apstate->crossfades.begin(); xf != apstate->crossfades.end(); ++xf) {
-                       all_xfades.insert (*xf);
+               if (child->name() != "Crossfade") {
+                       continue;
                }
-       }
-
-       /* now remove from the "all" lists every region that is in the current list. */
 
-       for (RegionList::iterator i = regions.begin(); i != regions.end(); ++i) {
-               set<boost::shared_ptr<Region> >::iterator x = all_regions.find (*i);
-               if (x != all_regions.end()) {
-                       all_regions.erase (x);
+               try {
+                       Crossfade* xfade = new Crossfade (*((const Playlist *)this), *child);
+                       _crossfades.push_back (xfade);
+                       xfade->Invalidated.connect (mem_fun (*this, &AudioPlaylist::crossfade_invalidated));
+                       xfade->StateChanged.connect (mem_fun (*this, &AudioPlaylist::crossfade_changed));
+                       NewCrossfade(xfade);
                }
-       }
-
-       /* ditto for every crossfade */
-
-       for (list<Crossfade*>::iterator i = _crossfades.begin(); i != _crossfades.end(); ++i) {
-               set<Crossfade*>::iterator x = all_xfades.find (*i);
-               if (x != all_xfades.end()) {
-                       all_xfades.erase (x);
+               
+               catch (failed_constructor& err) {
+                       //      cout << string_compose (_("could not create crossfade object in playlist %1"),
+                       //        _name) 
+                       //    << endl;
+                       continue;
                }
        }
 
-       /* delete every crossfade that is left (ditto as per regions) */
-
-       for (set<Crossfade *>::iterator axf = all_xfades.begin(); axf != all_xfades.end(); ++axf) {
-               delete *axf;
-       }
-
-       /* Now do the generic thing ... */
+       thaw ();
+       in_set_state++;
 
-       StateManager::drop_all_states ();
+       return 0;
 }
 
-StateManager::State*
-AudioPlaylist::state_factory (std::string why) const
+void
+AudioPlaylist::clear (bool with_signals)
 {
-       State* state = new State (why);
-
-       state->regions = regions;
-       state->region_states.clear ();
-       for (RegionList::const_iterator i = regions.begin(); i != regions.end(); ++i) {
-               state->region_states.push_back ((*i)->get_memento());
-       }
-
-       state->crossfades = _crossfades;
-       state->crossfade_states.clear ();
-       for (Crossfades::const_iterator i = _crossfades.begin(); i != _crossfades.end(); ++i) {
-               state->crossfade_states.push_back ((*i)->get_memento());
-       }
-       return state;
-}
-
-Change
-AudioPlaylist::restore_state (StateManager::State& state)
-{ 
-       { 
-               RegionLock rlock (this);
-               State* apstate = dynamic_cast<State*> (&state);
-
-               in_set_state = true;
+       for (Crossfades::iterator i = _crossfades.begin(); i != _crossfades.end(); ) {
 
-               regions = apstate->regions;
-
-               for (list<UndoAction>::iterator s = apstate->region_states.begin(); s != apstate->region_states.end(); ++s) {
-                       (*s) ();
-               }
+               Crossfades::iterator tmp;
+               tmp = i;
+               ++tmp;
 
-               _crossfades = apstate->crossfades;
-               
-               for (list<UndoAction>::iterator s = apstate->crossfade_states.begin(); s != apstate->crossfade_states.end(); ++s) {
-                       (*s) ();
-               }
+               delete *i;
 
-               in_set_state = false;
+               i = tmp;
        }
 
-       notify_length_changed ();
-       return Change (~0);
-}
-
-UndoAction
-AudioPlaylist::get_memento () const
-{
-       return sigc::bind (mem_fun (*(const_cast<AudioPlaylist*> (this)), &StateManager::use_state), _current_state_id);
-}
-
-void
-AudioPlaylist::clear (bool with_save)
-{
        _crossfades.clear ();
        
-       Playlist::clear (with_save);
+       Playlist::clear (with_signals);
 }
 
 XMLNode&
@@ -778,52 +653,6 @@ AudioPlaylist::destroy_region (boost::shared_ptr<Region> region)
                c = ctmp;
        }
 
-       for (StateMap::iterator s = states.begin(); s != states.end(); ) {
-               StateMap::iterator tmp;
-
-               tmp = s;
-               ++tmp;
-
-               State* astate = dynamic_cast<State*> (*s);
-               
-               for (c = astate->crossfades.begin(); c != astate->crossfades.end(); ) {
-
-                       ctmp = c;
-                       ++ctmp;
-
-                       if ((*c)->involves (r)) {
-                               unique_xfades.insert (*c);
-                               _crossfades.erase (c);
-                       }
-
-                       c = ctmp;
-               }
-
-               list<UndoAction>::iterator rsi, rsitmp;
-               RegionList::iterator ri, ritmp;
-
-               for (ri = astate->regions.begin(), rsi = astate->region_states.begin(); 
-                    ri != astate->regions.end() && rsi != astate->region_states.end();) {
-
-
-                       ritmp = ri;
-                       ++ritmp;
-
-                       rsitmp = rsi; 
-                       ++rsitmp;
-
-                       if (region == (*ri)) {
-                               astate->regions.erase (ri);
-                               astate->region_states.erase (rsi);
-                       }
-
-                       ri = ritmp;
-                       rsi = rsitmp;
-               }
-               
-               s = tmp;
-       }
-
        for (set<Crossfade*>::iterator c = unique_xfades.begin(); c != unique_xfades.end(); ++c) {
                delete *c;
        }
@@ -849,8 +678,6 @@ AudioPlaylist::crossfade_changed (Change ignored)
           that occured.
        */
 
-       maybe_save_state (_("xfade change"));
-
        notify_modified ();
 }
 
@@ -872,8 +699,6 @@ AudioPlaylist::region_changed (Change what_changed, boost::shared_ptr<Region> re
 
        parent_wants_notify = Playlist::region_changed (what_changed, region);
 
-       maybe_save_state (_("region modified"));
-
        if ((parent_wants_notify || (what_changed & our_interests))) {
                notify_modified ();
        }
@@ -882,12 +707,12 @@ AudioPlaylist::region_changed (Change what_changed, boost::shared_ptr<Region> re
 }
 
 void
-AudioPlaylist::crossfades_at (jack_nframes_t frame, Crossfades& clist)
+AudioPlaylist::crossfades_at (nframes_t frame, Crossfades& clist)
 {
        RegionLock rlock (this);
 
        for (Crossfades::iterator i = _crossfades.begin(); i != _crossfades.end(); ++i) {
-               jack_nframes_t start, end;
+               nframes_t start, end;
 
                start = (*i)->position();
                end = start + (*i)->overlap_length(); // not length(), important difference
@@ -897,3 +722,4 @@ AudioPlaylist::crossfades_at (jack_nframes_t frame, Crossfades& clist)
                } 
        }
 }
+