set + store signal chain latency for all processors; DiskWriter sets its capture_offs...
[ardour.git] / libs / ardour / ardour / midi_region.h
index 48706ee7d9b4634480af5d3877f085a3b753b3c9..36c9125a84341b4b1fc46e9347c469bf6a2f80f9 100644 (file)
 #include <vector>
 
 #include "evoral/Beats.hpp"
+#include "evoral/Range.hpp"
+
+#include "pbd/string_convert.h"
 
 #include "ardour/ardour.h"
+#include "ardour/midi_cursor.h"
 #include "ardour/region.h"
 
 class XMLNode;
 
 namespace ARDOUR {
        namespace Properties {
-               LIBARDOUR_API extern PBD::PropertyDescriptor<Evoral::Beats> start_beats;
-               LIBARDOUR_API extern PBD::PropertyDescriptor<Evoral::Beats> length_beats;
-               LIBARDOUR_API extern PBD::PropertyDescriptor<double> start_pulse;
-               LIBARDOUR_API extern PBD::PropertyDescriptor<double> length_pulse;
+               LIBARDOUR_API extern PBD::PropertyDescriptor<double> start_beats;
+               LIBARDOUR_API extern PBD::PropertyDescriptor<double> length_beats;
        }
 }
 
@@ -77,6 +79,8 @@ class LIBARDOUR_API MidiRegion : public Region
        framecnt_t read_at (Evoral::EventSink<framepos_t>& dst,
                            framepos_t position,
                            framecnt_t dur,
+                           Evoral::Range<framepos_t>* loop_range,
+                           MidiCursor& cursor,
                            uint32_t  chan_n = 0,
                            NoteMode  mode = Sustained,
                            MidiStateTracker* tracker = 0,
@@ -85,13 +89,15 @@ class LIBARDOUR_API MidiRegion : public Region
        framecnt_t master_read_at (MidiRingBuffer<framepos_t>& dst,
                                   framepos_t position,
                                   framecnt_t dur,
+                                  Evoral::Range<framepos_t>* loop_range,
+                                  MidiCursor& cursor,
                                   uint32_t  chan_n = 0,
                                   NoteMode  mode = Sustained) const;
 
        XMLNode& state ();
        int      set_state (const XMLNode&, int version);
 
-       int separate_by_channel (ARDOUR::Session&, std::vector< boost::shared_ptr<Region> >&) const;
+       int separate_by_channel (std::vector< boost::shared_ptr<Region> >&) const;
 
        /* automation */
 
@@ -105,10 +111,11 @@ class LIBARDOUR_API MidiRegion : public Region
        boost::shared_ptr<const MidiModel> model() const;
 
        void fix_negative_start ();
-       Evoral::Beats start_beats () {return _start_beats.val(); }
-       Evoral::Beats length_beats () {return _length_beats.val(); }
-       double start_pulse () const {return _start_pulse; }
-       double length_pulse () const {return _length_pulse; }
+       double start_beats () const {return _start_beats; }
+       double length_beats () const {return _length_beats; }
+
+       void clobber_sources (boost::shared_ptr<MidiSource> source);
+
   protected:
 
        virtual bool can_trim_start_before_source_start () const {
@@ -117,18 +124,18 @@ class LIBARDOUR_API MidiRegion : public Region
 
   private:
        friend class RegionFactory;
-       PBD::Property<Evoral::Beats> _start_beats;
-       PBD::Property<Evoral::Beats> _length_beats;
-       PBD::Property<double> _start_pulse;
-       PBD::Property<double> _length_pulse;
+       PBD::Property<double> _start_beats;
+       PBD::Property<double> _length_beats;
 
        MidiRegion (const SourceList&);
        MidiRegion (boost::shared_ptr<const MidiRegion>);
-       MidiRegion (boost::shared_ptr<const MidiRegion>, frameoffset_t offset, const int32_t sub_num = 0);
+       MidiRegion (boost::shared_ptr<const MidiRegion>, ARDOUR::MusicFrame offset);
 
        framecnt_t _read_at (const SourceList&, Evoral::EventSink<framepos_t>& dst,
                             framepos_t position,
                             framecnt_t dur,
+                            Evoral::Range<framepos_t>* loop_range,
+                            MidiCursor& cursor,
                             uint32_t chan_n = 0,
                             NoteMode mode = Sustained,
                             MidiStateTracker* tracker = 0,
@@ -141,12 +148,14 @@ class LIBARDOUR_API MidiRegion : public Region
        void recompute_at_end ();
 
        void set_position_internal (framepos_t pos, bool allow_bbt_recompute, const int32_t sub_num);
+       void set_position_music_internal (double qn);
        void set_length_internal (framecnt_t len, const int32_t sub_num);
        void set_start_internal (framecnt_t, const int32_t sub_num);
        void trim_to_internal (framepos_t position, framecnt_t length, const int32_t sub_num);
        void update_length_beats (const int32_t sub_num);
 
        void model_changed ();
+       void model_shifted (double qn_distance);
        void model_automation_state_changed (Evoral::Parameter const &);
 
        void set_start_beats_from_start_frames ();
@@ -154,10 +163,10 @@ class LIBARDOUR_API MidiRegion : public Region
 
        std::set<Evoral::Parameter> _filtered_parameters; ///< parameters that we ask our source not to return when reading
        PBD::ScopedConnection _model_connection;
+       PBD::ScopedConnection _model_shift_connection;
        PBD::ScopedConnection _source_connection;
        PBD::ScopedConnection _model_contents_connection;
-
-       double _last_length_beats;
+       bool _ignore_shift;
 };
 
 } /* namespace ARDOUR */