Trim include dependency graph, especially for io.h and session.h.
[ardour.git] / libs / ardour / ardour / smf_source.h
index 626aa64defc5f70b70ef4ea345552b931273d46a..0c0dba3d96f26da36a7dfd13069939193870b16f 100644 (file)
 #include <time.h>
 
 #include <ardour/midi_source.h>
+#include <evoral/SMF.hpp>
+
+namespace Evoral { class Event; }
 
 namespace ARDOUR {
 
 class MidiRingBuffer;
 
 /** Standard Midi File (Type 0) Source */
-class SMFSource : public MidiSource {
+class SMFSource : public MidiSource, public Evoral::SMF {
   public:
        enum Flag {
                Writable = 0x1,
@@ -65,20 +68,16 @@ class SMFSource : public MidiSource {
        int set_source_name (string newname, bool destructive);
        
        static bool safe_file_extension (const Glib::ustring& path);
-
+       
        Glib::ustring path() const { return _path; }
 
        void set_allow_remove_if_empty (bool yn);
        void mark_for_remove();
 
-       void append_event_unlocked(EventTimeUnit unit, const MIDI::Event& ev);
+       void append_event_unlocked(EventTimeUnit unit, const Evoral::Event& ev);
 
-       int flush_header ();
-       int flush_footer ();
-       
        int move_to_trash (const string trash_dir_name);
 
-       bool is_empty () const;
        void mark_streaming_midi_write_started (NoteMode mode, nframes_t start_time);
        void mark_streaming_write_completed ();
 
@@ -91,45 +90,36 @@ class SMFSource : public MidiSource {
        XMLNode& get_state ();
        int set_state (const XMLNode&);
 
-       void seek_to(nframes_t time);
-       
        void load_model(bool lock=true, bool force_reload=false);
        void destroy_model();
 
-       uint16_t ppqn() const { return _ppqn; }
+       void flush_midi();
 
   private:
 
        int init (string idstr, bool must_exist);
 
-       nframes_t read_unlocked (MidiRingBuffer& dst, nframes_t start, nframes_t cn, nframes_t stamp_offset) const;
-       nframes_t write_unlocked (MidiRingBuffer& dst, nframes_t cnt);
+       nframes_t read_unlocked (
+                       MidiRingBuffer& dst,
+                       nframes_t start,
+                       nframes_t cn,
+                       nframes_t stamp_offset,
+                       nframes_t negative_stamp_offset) const;
+
+       nframes_t write_unlocked (
+                       MidiRingBuffer& src,
+                       nframes_t cnt);
 
        bool find (std::string path, bool must_exist, bool& is_new);
        bool removable() const;
        bool writable() const { return _flags & Writable; }
+       
+       void make_sure_controls_have_the_right_interpolation();
 
-       int  open();
-       void seek_to_end();
-       void write_footer();
-
-       void     write_chunk_header(const char id[4], uint32_t length);
-       void     write_chunk(const char id[4], uint32_t length, void* data);
-       size_t   write_var_len(uint32_t val);
-       uint32_t read_var_len() const;
-       int      read_event(uint32_t* delta_t, uint32_t* size, Byte** buf) const;
-
-       static const uint16_t _ppqn = 19200;
-
-       uint16_t       _channel;
        Glib::ustring  _path;
        Flag           _flags;
        string         _take_id;
        bool           _allow_remove_if_empty;
-       FILE*          _fd;
-       double         _last_ev_time; // last frame time written, relative to source start
-       uint32_t       _track_size;
-       uint32_t       _header_size; // size of SMF header, including MTrk chunk header
 
        static string _search_path;
 };