'libs/ardour' - DLL visibility stuff and associated changes needed for building with...
[ardour.git] / libs / ardour / ardour / midi_playlist.h
index da3a72a3fd69b398e0267bd46bdc8211719b881e..b118214c9e2a2a2aaf5f6a23b3ffc86ec7231c16 100644 (file)
@@ -1,17 +1,17 @@
 /*
-    Copyright (C) 2006 Paul Davis 
-       Written by Dave Robillard, 2006
+    Copyright (C) 2006 Paul Davis
+    Author: David Robillard
+
     This program is free software; you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
     the Free Software Foundation; either version 2 of the License, or
     (at your option) any later version.
+
     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.
+
     You should have received a copy of the GNU General Public License
     along with this program; if not, write to the Free Software
     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 #include <vector>
 #include <list>
 
-#include <ardour/ardour.h>
-#include <ardour/playlist.h>
+#include "ardour/ardour.h"
+#include "ardour/playlist.h"
+#include "ardour/midi_state_tracker.h"
+#include "evoral/Parameter.hpp"
 
 namespace ARDOUR
 {
 
 class Session;
-class Region;
 class MidiRegion;
 class Source;
+template<typename T> class MidiRingBuffer;
 
-class MidiPlaylist : public ARDOUR::Playlist
+class LIBARDOUR_API MidiPlaylist : public ARDOUR::Playlist
 {
-private:
-
-       struct State : public ARDOUR::StateManager::State
-       {
-               RegionList regions;
-               std::list<UndoAction> region_states;
-
-               State (std::string why) : ARDOUR::StateManager::State (why)
-               {}
-               ~State ();
-       };
-
 public:
        MidiPlaylist (Session&, const XMLNode&, bool hidden = false);
-       MidiPlaylist (Session&, string name, bool hidden = false);
-       MidiPlaylist (const MidiPlaylist&, string name, bool hidden = false);
-       MidiPlaylist (const MidiPlaylist&, jack_nframes_t start, jack_nframes_t cnt,
-                     string name, bool hidden = false);
+       MidiPlaylist (Session&, std::string name, bool hidden = false);
+       MidiPlaylist (boost::shared_ptr<const MidiPlaylist> other, std::string name, bool hidden = false);
+       MidiPlaylist (boost::shared_ptr<const MidiPlaylist> other, framepos_t start, framecnt_t cnt,
+                     std::string name, bool hidden = false);
 
-       jack_nframes_t read (unsigned char *dst, unsigned char *mixdown,
-                            char * workbuf, jack_nframes_t start, jack_nframes_t cnt, uint32_t chan_n=0);
+       ~MidiPlaylist ();
 
-       int set_state (const XMLNode&);
-       UndoAction get_memento() const;
+       framecnt_t read (Evoral::EventSink<framepos_t>& buf,
+                        framepos_t start, framecnt_t cnt, uint32_t chan_n = 0);
 
-       template<class T>
-       void apply_to_history (T& obj, void (T::*method)(const ARDOUR::StateManager::StateMap&, state_id_t))
-       {
-               RegionLock rlock (this);
-               (obj.*method) (states, _current_state_id);
-       }
+       int set_state (const XMLNode&, int version);
 
-       bool destroy_region (Region*);
+       bool destroy_region (boost::shared_ptr<Region>);
 
-       void get_equivalent_regions (const MidiRegion&, std::vector<MidiRegion*>&);
-       void get_region_list_equivalent_regions (const MidiRegion&, std::vector<MidiRegion*>&);
+       void set_note_mode (NoteMode m) { _note_mode = m; }
 
-       void drop_all_states ();
+       std::set<Evoral::Parameter> contained_automation();
 
-protected:
+       void clear_note_trackers ();
 
-       /* state management */
+protected:
 
-       StateManager::State* state_factory (std::string) const;
-       Change restore_state (StateManager::State&);
-       void send_state_change (Change);
+       void remove_dependents (boost::shared_ptr<Region> region);
 
-       /* playlist "callbacks" */
-       void flush_notifications ();
+private:
+       void dump () const;
 
-       void finalize_split_region (Region *orig, Region *left, Region *right);
+       bool region_changed (const PBD::PropertyChange&, boost::shared_ptr<Region>);
 
-       void refresh_dependents (Region& region);
-       void check_dependents (Region& region, bool norefresh);
-       void remove_dependents (Region& region);
+       NoteMode _note_mode;
 
-protected:
-       ~MidiPlaylist (); /* public should use unref() */
-
-private:
-       XMLNode& state (bool full_state);
-       void dump () const;
+       typedef std::map<Region*,MidiStateTracker*> NoteTrackers;
+       NoteTrackers _note_trackers;
 
-       bool region_changed (Change, Region*);
 };
 
 } /* namespace ARDOUR */