Refactor LTC File decoder, prepare for Lua bindings
[ardour.git] / libs / ardour / ardour / midi_playlist.h
index cb07bc18205d7901a11e686a627cea980dc29861..f784b7317723d89bb9e57f2ee1548b830823278e 100644 (file)
 #include <boost/utility.hpp>
 
 #include "ardour/ardour.h"
+#include "ardour/midi_cursor.h"
 #include "ardour/midi_model.h"
 #include "ardour/midi_state_tracker.h"
 #include "ardour/note_fixer.h"
 #include "ardour/playlist.h"
-#include "evoral/Beats.hpp"
 #include "evoral/Note.hpp"
 #include "evoral/Parameter.hpp"
 
 namespace Evoral {
 template<typename Time> class EventSink;
+class                         Beats;
 }
 
 namespace ARDOUR
 {
 
-class BeatsFramesConverter;
+class BeatsSamplesConverter;
 class MidiChannelFilter;
 class MidiRegion;
 class Session;
@@ -58,8 +59,8 @@ public:
 
        /** This constructor does NOT notify others (session) */
        MidiPlaylist (boost::shared_ptr<const MidiPlaylist> other,
-                     framepos_t                            start,
-                     framecnt_t                            cnt,
+                     samplepos_t                            start,
+                     samplecnt_t                            cnt,
                      std::string                           name,
                      bool                                  hidden = false);
 
@@ -68,22 +69,25 @@ public:
        /** Read a range from the playlist into an event sink.
         *
         * @param buf Destination for events.
-        * @param start First frame of read range.
-        * @param cnt Number of frames in read range.
+        * @param start First sample of read range.
+        * @param cnt Number of samples in read range.
+        * @param loop_range If non-null, all event times will be mapped into this loop range.
         * @param chan_n Must be 0 (this is the audio-style "channel", where each
         * channel is backed by a separate region, not MIDI channels, which all
         * exist in the same region and are not handled here).
-        * @return The number of frames read (time, not an event count).
+        * @return The number of samples read (time, not an event count).
         */
-       framecnt_t read (Evoral::EventSink<framepos_t>& buf,
-                        framepos_t                     start,
-                        framecnt_t                     cnt,
+       samplecnt_t read (Evoral::EventSink<samplepos_t>& buf,
+                        samplepos_t                     start,
+                        samplecnt_t                     cnt,
+                        Evoral::Range<samplepos_t>*     loop_range,
                         uint32_t                       chan_n = 0,
                         MidiChannelFilter*             filter = NULL);
 
        int set_state (const XMLNode&, int version);
 
        bool destroy_region (boost::shared_ptr<Region>);
+       void _split_region (boost::shared_ptr<Region>, const MusicSample& position);
 
        void set_note_mode (NoteMode m) { _note_mode = m; }
 
@@ -106,16 +110,18 @@ public:
         * @param dst Sink to write note offs to.
         * @param time Time stamp of all written note offs.
         */
-       void resolve_note_trackers (Evoral::EventSink<framepos_t>& dst, framepos_t time);
+       void resolve_note_trackers (Evoral::EventSink<samplepos_t>& dst, samplepos_t time);
 
 protected:
        void remove_dependents (boost::shared_ptr<Region> region);
+       void region_going_away (boost::weak_ptr<Region> region);
 
 private:
-       typedef Evoral::Note<Evoral::Beats> Note;
-       typedef Evoral::Event<framepos_t>   Event;
+       typedef Evoral::Note<Temporal::Beats> Note;
+       typedef Evoral::Event<samplepos_t>   Event;
 
        struct RegionTracker : public boost::noncopyable {
+               MidiCursor       cursor;   ///< Cursor (iterator and read state)
                MidiStateTracker tracker;  ///< Active note tracker
                NoteFixer        fixer;    ///< Edit compensation
        };
@@ -126,7 +132,7 @@ private:
 
        NoteTrackers _note_trackers;
        NoteMode     _note_mode;
-       framepos_t   _read_end;
+       samplepos_t   _read_end;
 };
 
 } /* namespace ARDOUR */