summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour
diff options
context:
space:
mode:
Diffstat (limited to 'libs/ardour/ardour')
-rw-r--r--libs/ardour/ardour/midi_playlist.h5
-rw-r--r--libs/ardour/ardour/midi_region.h19
-rw-r--r--libs/ardour/ardour/midi_source.h15
-rw-r--r--libs/ardour/ardour/midi_state_tracker.h5
-rw-r--r--libs/ardour/ardour/midi_track.h5
-rw-r--r--libs/ardour/ardour/smf_source.h13
6 files changed, 38 insertions, 24 deletions
diff --git a/libs/ardour/ardour/midi_playlist.h b/libs/ardour/ardour/midi_playlist.h
index c83bf80a28..6d617ad0f0 100644
--- a/libs/ardour/ardour/midi_playlist.h
+++ b/libs/ardour/ardour/midi_playlist.h
@@ -25,6 +25,7 @@
#include "ardour/ardour.h"
#include "ardour/playlist.h"
+#include "ardour/midi_state_tracker.h"
#include "evoral/Parameter.hpp"
namespace ARDOUR
@@ -74,6 +75,10 @@ private:
bool region_changed (Change, boost::shared_ptr<Region>);
NoteMode _note_mode;
+
+ typedef std::map<Region*,MidiStateTracker*> NoteTrackers;
+ NoteTrackers _note_trackers;
+
};
} /* namespace ARDOUR */
diff --git a/libs/ardour/ardour/midi_region.h b/libs/ardour/ardour/midi_region.h
index c796ee742b..f8f663bc78 100644
--- a/libs/ardour/ardour/midi_region.h
+++ b/libs/ardour/ardour/midi_region.h
@@ -42,6 +42,7 @@ class Playlist;
class Session;
class MidiFilter;
class MidiSource;
+class MidiStateTracker;
template<typename T> class MidiRingBuffer;
class MidiRegion : public Region
@@ -56,10 +57,11 @@ class MidiRegion : public Region
virtual sframes_t readable_length() const { return length(); }
nframes_t read_at (MidiRingBuffer<nframes_t>& dst,
- sframes_t position,
- nframes_t dur,
- uint32_t chan_n = 0,
- NoteMode mode = Sustained) const;
+ sframes_t position,
+ nframes_t dur,
+ uint32_t chan_n = 0,
+ NoteMode mode = Sustained,
+ MidiStateTracker* tracker = 0) const;
nframes_t master_read_at (MidiRingBuffer<nframes_t>& dst,
sframes_t position,
@@ -104,10 +106,11 @@ class MidiRegion : public Region
private:
nframes_t _read_at (const SourceList&, MidiRingBuffer<nframes_t>& dst,
- nframes_t position,
- nframes_t dur,
- uint32_t chan_n = 0,
- NoteMode mode = Sustained) const;
+ sframes_t position,
+ nframes_t dur,
+ uint32_t chan_n = 0,
+ NoteMode mode = Sustained,
+ MidiStateTracker* tracker = 0) const;
void recompute_at_start ();
void recompute_at_end ();
diff --git a/libs/ardour/ardour/midi_source.h b/libs/ardour/ardour/midi_source.h
index bffcde5192..5298ab2f4f 100644
--- a/libs/ardour/ardour/midi_source.h
+++ b/libs/ardour/ardour/midi_source.h
@@ -34,6 +34,7 @@
namespace ARDOUR {
+class MidiStateTracker;
class MidiModel;
template<typename T> class MidiRingBuffer;
@@ -55,11 +56,12 @@ class MidiSource : virtual public Source
* \param cnt Length of range to be read (in audio frames)
* \param stamp_offset Offset to add to event times written to dst
* \param negative_stamp_offset Offset to subtract from event times written to dst
+ * \param tracker an optional pointer to MidiStateTracker object, for note on/off tracking
*/
virtual nframes_t midi_read (MidiRingBuffer<nframes_t>& dst,
- sframes_t source_start,
- sframes_t start, nframes_t cnt,
- sframes_t stamp_offset, sframes_t negative_stamp_offset) const;
+ sframes_t source_start,
+ sframes_t start, nframes_t cnt,
+ sframes_t stamp_offset, sframes_t negative_stamp_offset, MidiStateTracker*) const;
virtual nframes_t midi_write (MidiRingBuffer<nframes_t>& src,
sframes_t source_start,
@@ -113,9 +115,10 @@ class MidiSource : virtual public Source
virtual void flush_midi() = 0;
virtual nframes_t read_unlocked (MidiRingBuffer<nframes_t>& dst,
- sframes_t position,
- sframes_t start, nframes_t cnt,
- sframes_t stamp_offset, sframes_t negative_stamp_offset) const = 0;
+ sframes_t position,
+ sframes_t start, nframes_t cnt,
+ sframes_t stamp_offset, sframes_t negative_stamp_offset,
+ MidiStateTracker* tracker) const = 0;
virtual nframes_t write_unlocked (MidiRingBuffer<nframes_t>& dst,
sframes_t position,
diff --git a/libs/ardour/ardour/midi_state_tracker.h b/libs/ardour/ardour/midi_state_tracker.h
index a058121da8..7b95772cac 100644
--- a/libs/ardour/ardour/midi_state_tracker.h
+++ b/libs/ardour/ardour/midi_state_tracker.h
@@ -21,11 +21,11 @@
#define __ardour_midi_state_tracker_h__
#include <bitset>
-
#include "ardour/midi_buffer.h"
namespace ARDOUR {
+template <typename T> class MidiRingBuffer;
/** Tracks played notes, so they can be resolved in potential stuck note
* situations (e.g. looping, transport stop, etc).
@@ -36,7 +36,10 @@ public:
MidiStateTracker();
void track (const MidiBuffer::iterator& from, const MidiBuffer::iterator& to, bool& looped);
+ void add (uint8_t note, uint8_t chn);
+ void remove (uint8_t note, uint8_t chn);
void resolve_notes (MidiBuffer& buffer, nframes64_t time);
+ void resolve_notes (MidiRingBuffer<nframes_t>& buffer, nframes64_t time);
void dump (std::ostream&);
void reset ();
diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h
index c273395a74..bc636eea83 100644
--- a/libs/ardour/ardour/midi_track.h
+++ b/libs/ardour/ardour/midi_track.h
@@ -22,6 +22,7 @@
#include "ardour/track.h"
#include "ardour/midi_ring_buffer.h"
+#include "ardour/midi_state_tracker.h"
namespace ARDOUR
{
@@ -96,8 +97,7 @@ protected:
int _set_state (const XMLNode&, int, bool call_base);
private:
- void write_out_of_band_data (
- BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes);
+ void write_out_of_band_data (BufferSet& bufs, sframes_t start_frame, sframes_t end_frame, nframes_t nframes);
int set_diskstream (boost::shared_ptr<MidiDiskstream> ds);
void use_new_diskstream ();
@@ -111,7 +111,6 @@ private:
uint8_t _default_channel;
bool _midi_thru;
-
int no_roll (nframes_t nframes, sframes_t start_frame, sframes_t end_frame,
bool state_changing, bool can_record, bool rec_monitors_input);
void push_midi_input_to_step_edit_ringbuffer (nframes_t nframes);
diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h
index fbaa049d8a..7793b6a91c 100644
--- a/libs/ardour/ardour/smf_source.h
+++ b/libs/ardour/ardour/smf_source.h
@@ -71,12 +71,13 @@ public:
private:
nframes_t read_unlocked (MidiRingBuffer<nframes_t>& dst,
- sframes_t position,
- sframes_t start,
- nframes_t cnt,
- sframes_t stamp_offset,
- sframes_t negative_stamp_offset) const;
-
+ sframes_t position,
+ sframes_t start,
+ nframes_t cnt,
+ sframes_t stamp_offset,
+ sframes_t negative_stamp_offset,
+ MidiStateTracker* tracker) const;
+
nframes_t write_unlocked (MidiRingBuffer<nframes_t>& src,
sframes_t position,
nframes_t cnt);