VCA API-change: return created VCAs (handy for Lua scripts)
[ardour.git] / libs / ardour / ardour / midi_region.h
index 132048a2426602793543c82f86ae0586eaf88bc2..d46f59a6aaa03d5f168f7c8908a567895054ec1a 100644 (file)
 
 #include <vector>
 
-#include "evoral/Beats.hpp"
+#include "temporal/beats.h"
 #include "evoral/Range.hpp"
 
+#include "pbd/string_convert.h"
+
 #include "ardour/ardour.h"
+#include "ardour/midi_cursor.h"
 #include "ardour/region.h"
 
 class XMLNode;
@@ -70,29 +73,31 @@ class LIBARDOUR_API MidiRegion : public Region
        boost::shared_ptr<MidiSource> midi_source (uint32_t n=0) const;
 
        /* Stub Readable interface */
-       virtual framecnt_t read (Sample*, framepos_t /*pos*/, framecnt_t /*cnt*/, int /*channel*/) const { return 0; }
-       virtual framecnt_t readable_length() const { return length(); }
-
-       framecnt_t read_at (Evoral::EventSink<framepos_t>& dst,
-                           framepos_t position,
-                           framecnt_t dur,
-                           Evoral::Range<framepos_t>* loop_range,
+       virtual samplecnt_t read (Sample*, samplepos_t /*pos*/, samplecnt_t /*cnt*/, int /*channel*/) const { return 0; }
+       virtual samplecnt_t readable_length() const { return length(); }
+
+       samplecnt_t read_at (Evoral::EventSink<samplepos_t>& dst,
+                           samplepos_t position,
+                           samplecnt_t dur,
+                           Evoral::Range<samplepos_t>* loop_range,
+                           MidiCursor& cursor,
                            uint32_t  chan_n = 0,
                            NoteMode  mode = Sustained,
                            MidiStateTracker* tracker = 0,
                            MidiChannelFilter* filter = 0) const;
 
-       framecnt_t master_read_at (MidiRingBuffer<framepos_t>& dst,
-                                  framepos_t position,
-                                  framecnt_t dur,
-                                  Evoral::Range<framepos_t>* loop_range,
+       samplecnt_t master_read_at (MidiRingBuffer<samplepos_t>& dst,
+                                  samplepos_t position,
+                                  samplecnt_t dur,
+                                  Evoral::Range<samplepos_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 */
 
@@ -106,8 +111,8 @@ class LIBARDOUR_API MidiRegion : public Region
        boost::shared_ptr<const MidiModel> model() const;
 
        void fix_negative_start ();
-       double start_beats () {return _start_beats; }
-       double length_beats () {return _length_beats; }
+       double start_beats () const {return _start_beats; }
+       double length_beats () const {return _length_beats; }
 
        void clobber_sources (boost::shared_ptr<MidiSource> source);
 
@@ -124,12 +129,13 @@ class LIBARDOUR_API MidiRegion : public Region
 
        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::MusicSample offset);
 
-       framecnt_t _read_at (const SourceList&, Evoral::EventSink<framepos_t>& dst,
-                            framepos_t position,
-                            framecnt_t dur,
-                            Evoral::Range<framepos_t>* loop_range,
+       samplecnt_t _read_at (const SourceList&, Evoral::EventSink<samplepos_t>& dst,
+                            samplepos_t position,
+                            samplecnt_t dur,
+                            Evoral::Range<samplepos_t>* loop_range,
+                            MidiCursor& cursor,
                             uint32_t chan_n = 0,
                             NoteMode mode = Sustained,
                             MidiStateTracker* tracker = 0,
@@ -141,24 +147,26 @@ class LIBARDOUR_API MidiRegion : public Region
        void recompute_at_start ();
        void recompute_at_end ();
 
-       void set_position_internal (framepos_t pos, bool allow_bbt_recompute, const int32_t sub_num);
-       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 set_position_internal (samplepos_t pos, bool allow_bbt_recompute, const int32_t sub_num);
+       void set_position_music_internal (double qn);
+       void set_length_internal (samplecnt_t len, const int32_t sub_num);
+       void set_start_internal (samplecnt_t, const int32_t sub_num);
+       void trim_to_internal (samplepos_t position, samplecnt_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 ();
+       void set_start_beats_from_start_samples ();
        void update_after_tempo_map_change (bool send_change = true);
 
        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 */