From 5a48f99f72c2e2f3ed313e00446dfdaa05dc5d56 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sun, 15 Feb 2009 01:24:26 +0000 Subject: Use nframes_t for timestamps of real (jack) time MIDI events (i.e. in MidiBuffer and MidiRingBuffer). Use iterator interface of Sequence to read events in a MIDISource rather than Sequence::read, avoiding timestamp confusion. Disable no longer useful Sequence::read. git-svn-id: svn://localhost/ardour2/branches/3.0@4570 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/midi_buffer.h | 4 ++-- libs/ardour/ardour/midi_diskstream.h | 22 ++++++++++------------ libs/ardour/ardour/midi_playlist.h | 2 +- libs/ardour/ardour/midi_region.h | 8 +++----- libs/ardour/ardour/midi_source.h | 13 +++++++------ libs/ardour/ardour/midi_track.h | 5 ++--- libs/ardour/ardour/smf_source.h | 4 ++-- 7 files changed, 27 insertions(+), 31 deletions(-) (limited to 'libs/ardour/ardour') diff --git a/libs/ardour/ardour/midi_buffer.h b/libs/ardour/ardour/midi_buffer.h index f90cbfd8e3..8ea5e32e81 100644 --- a/libs/ardour/ardour/midi_buffer.h +++ b/libs/ardour/ardour/midi_buffer.h @@ -32,7 +32,7 @@ namespace ARDOUR { class MidiBuffer : public Buffer { public: - typedef double TimeType; + typedef nframes_t TimeType; MidiBuffer(size_t capacity); ~MidiBuffer(); @@ -45,7 +45,7 @@ public: bool push_back(const Evoral::MIDIEvent& event); bool push_back(const jack_midi_event_t& event); - uint8_t* reserve(double time, size_t size); + uint8_t* reserve(TimeType time, size_t size); void resize(size_t); diff --git a/libs/ardour/ardour/midi_diskstream.h b/libs/ardour/ardour/midi_diskstream.h index 7a0daf37e8..eddeaa451a 100644 --- a/libs/ardour/ardour/midi_diskstream.h +++ b/libs/ardour/ardour/midi_diskstream.h @@ -170,18 +170,16 @@ class MidiDiskstream : public Diskstream void engage_record_enable (); void disengage_record_enable (); - void check_note_onoffs(Evoral::MIDIEvent &event); - void emit_pending_note_offs(MidiBuffer &dst, nframes_t time); - - MidiRingBuffer* _playback_buf; - MidiRingBuffer* _capture_buf; - MidiPort* _source_port; - boost::shared_ptr _write_source; - nframes_t _last_flush_frame; - NoteMode _note_mode; - MidiStateTracker _midi_state_tracker; - volatile gint _frames_written_to_ringbuffer; - volatile gint _frames_read_from_ringbuffer; + + MidiRingBuffer* _playback_buf; + MidiRingBuffer* _capture_buf; + MidiPort* _source_port; + boost::shared_ptr _write_source; + nframes_t _last_flush_frame; + NoteMode _note_mode; + MidiStateTracker _midi_state_tracker; + volatile gint _frames_written_to_ringbuffer; + volatile gint _frames_read_from_ringbuffer; }; }; /* namespace ARDOUR */ diff --git a/libs/ardour/ardour/midi_playlist.h b/libs/ardour/ardour/midi_playlist.h index d7fdadb2f5..a956878348 100644 --- a/libs/ardour/ardour/midi_playlist.h +++ b/libs/ardour/ardour/midi_playlist.h @@ -47,7 +47,7 @@ public: ~MidiPlaylist (); - nframes_t read (MidiRingBuffer& buf, + nframes_t read (MidiRingBuffer& buf, nframes_t start, nframes_t cnt, uint32_t chan_n=0); int set_state (const XMLNode&); diff --git a/libs/ardour/ardour/midi_region.h b/libs/ardour/ardour/midi_region.h index 781f815ec5..356e418fc1 100644 --- a/libs/ardour/ardour/midi_region.h +++ b/libs/ardour/ardour/midi_region.h @@ -48,8 +48,6 @@ template class MidiRingBuffer; class MidiRegion : public Region { public: - typedef double TimeType; - ~MidiRegion(); boost::shared_ptr midi_source (uint32_t n=0) const; @@ -58,13 +56,13 @@ class MidiRegion : public Region virtual nframes64_t read (Sample*, nframes64_t pos, nframes64_t cnt, int channel) const { return 0; } virtual nframes64_t readable_length() const { return length(); } - nframes_t read_at (MidiRingBuffer& dst, + nframes_t read_at (MidiRingBuffer& dst, nframes_t position, nframes_t dur, uint32_t chan_n = 0, NoteMode mode = Sustained) const; - nframes_t master_read_at (MidiRingBuffer& dst, + nframes_t master_read_at (MidiRingBuffer& dst, nframes_t position, nframes_t dur, uint32_t chan_n = 0, @@ -108,7 +106,7 @@ class MidiRegion : public Region MidiRegion (const SourceList &, const XMLNode&); private: - nframes_t _read_at (const SourceList&, MidiRingBuffer& dst, + nframes_t _read_at (const SourceList&, MidiRingBuffer& dst, nframes_t position, nframes_t dur, uint32_t chan_n = 0, diff --git a/libs/ardour/ardour/midi_source.h b/libs/ardour/ardour/midi_source.h index c0b105decd..2126b4b162 100644 --- a/libs/ardour/ardour/midi_source.h +++ b/libs/ardour/ardour/midi_source.h @@ -57,8 +57,8 @@ class MidiSource : public Source virtual uint32_t n_channels () const { return 1; } // FIXME: integrate this with the Readable::read interface somehow - virtual nframes_t midi_read (MidiRingBuffer& dst, nframes_t start, nframes_t cnt, nframes_t stamp_offset, nframes_t negative_stamp_offset) const; - virtual nframes_t midi_write (MidiRingBuffer& src, nframes_t cnt); + virtual nframes_t midi_read (MidiRingBuffer& dst, nframes_t start, nframes_t cnt, nframes_t stamp_offset, nframes_t negative_stamp_offset) const; + virtual nframes_t midi_write (MidiRingBuffer& src, nframes_t cnt); virtual void append_event_unlocked(EventTimeUnit unit, const Evoral::Event& ev) = 0; @@ -98,11 +98,9 @@ class MidiSource : public Source protected: virtual void flush_midi() = 0; - //virtual int flush_header() = 0; - //virtual int flush_footer() = 0; - virtual nframes_t read_unlocked (MidiRingBuffer& dst, nframes_t start, nframes_t cnt, nframes_t stamp_offset, nframes_t negative_stamp_offset) const = 0; - virtual nframes_t write_unlocked (MidiRingBuffer& dst, nframes_t cnt) = 0; + virtual nframes_t read_unlocked (MidiRingBuffer& dst, nframes_t start, nframes_t cnt, nframes_t stamp_offset, nframes_t negative_stamp_offset) const = 0; + virtual nframes_t write_unlocked (MidiRingBuffer& dst, nframes_t cnt) = 0; mutable Glib::Mutex _lock; string _captured_for; @@ -112,6 +110,9 @@ class MidiSource : public Source boost::shared_ptr _model; bool _writing; + + mutable Evoral::Sequence::const_iterator _model_iter; + mutable nframes_t _last_read_end; private: bool file_changed (string path); diff --git a/libs/ardour/ardour/midi_track.h b/libs/ardour/ardour/midi_track.h index 09c64c2978..d4054066f1 100644 --- a/libs/ardour/ardour/midi_track.h +++ b/libs/ardour/ardour/midi_track.h @@ -90,7 +90,6 @@ public: void set_note_mode (NoteMode m); protected: - XMLNode& state (bool full); int _set_state (const XMLNode&, bool call_base); @@ -104,8 +103,8 @@ private: void set_state_part_two (); void set_state_part_three (); - MidiRingBuffer _immediate_events; - NoteMode _note_mode; + MidiRingBuffer _immediate_events; + NoteMode _note_mode; }; } /* namespace ARDOUR*/ diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h index 9981408abc..ccc03acd66 100644 --- a/libs/ardour/ardour/smf_source.h +++ b/libs/ardour/ardour/smf_source.h @@ -102,14 +102,14 @@ class SMFSource : public MidiSource, public Evoral::SMF { int init (string idstr, bool must_exist); nframes_t read_unlocked ( - MidiRingBuffer& dst, + MidiRingBuffer& dst, nframes_t start, nframes_t cn, nframes_t stamp_offset, nframes_t negative_stamp_offset) const; nframes_t write_unlocked ( - MidiRingBuffer& src, + MidiRingBuffer& src, nframes_t cnt); bool find (std::string path, bool must_exist, bool& is_new); -- cgit v1.2.3