Less weak plugin preset system (maybe AU preset stuff can use the 'normal' thing...
[ardour.git] / libs / ardour / ardour / smf_source.h
index d422a8af9ecaf6305ef13e30a3c081b85952a689..4fc868fd35f697ce550215548cc72b6159e4a12b 100644 (file)
 #include <time.h>
 
 #include <ardour/midi_source.h>
+#include <evoral/LibSMF.hpp>
+
+namespace Evoral { template<typename T> class Event; }
 
 namespace ARDOUR {
 
-class MidiRingBuffer;
+template<typename T> class MidiRingBuffer;
 
 /** Standard Midi File (Type 0) Source */
-class SMFSource : public MidiSource {
+class SMFSource : public MidiSource, public Evoral::LibSMF<double> {
   public:
        enum Flag {
                Writable = 0x1,
@@ -57,24 +60,25 @@ class SMFSource : public MidiSource {
        // FIXME and thus are useless for MIDI.. but make MidiDiskstream compile easier! :)
 
        virtual nframes_t last_capture_start_frame() const { return 0; }
-       virtual void           mark_capture_start (nframes_t) {}
-       virtual void           mark_capture_end () {}
-       virtual void           clear_capture_marks() {}
-
-       int set_name (string newname, bool destructive);
+       virtual void      mark_capture_start (nframes_t) {}
+       virtual void      mark_capture_end () {}
+       virtual void      clear_capture_marks() {}
 
-       string path() const { return _path; }
+       bool set_name (const std::string& newname) { return (set_source_name(newname, false) == 0); }
+       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();
 
-       int update_header (nframes_t when, struct tm&, time_t);
-       int flush_header ();
-       int flush_footer ();
+       void append_event_unlocked(EventTimeUnit unit, const Evoral::Event<double>& ev);
 
        int move_to_trash (const string trash_dir_name);
 
-       static bool is_empty (string path);
+       void mark_streaming_midi_write_started (NoteMode mode, nframes_t start_time);
        void mark_streaming_write_completed ();
 
        void   mark_take (string);
@@ -86,35 +90,36 @@ class SMFSource : public MidiSource {
        XMLNode& get_state ();
        int set_state (const XMLNode&);
 
+       void load_model(bool lock=true, bool force_reload=false);
+       void destroy_model();
+
+       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<double>& dst,
+                       nframes_t start,
+                       nframes_t cn,
+                       nframes_t stamp_offset,
+                       nframes_t negative_stamp_offset) const;
+
+       nframes_t write_unlocked (
+                       MidiRingBuffer<double>& src,
+                       nframes_t cnt);
 
        bool find (std::string path, bool must_exist, bool& is_new);
        bool removable() const;
        bool writable() const { return _flags & Writable; }
        
-       int open();
-       
-       void     write_chunk_header(char id[4], uint32_t length);
-       void     write_chunk(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(MidiEvent& ev) const;
-
-       uint16_t       _channel;
-       string         _path;
+       void make_sure_controls_have_the_right_interpolation();
+
+       Glib::ustring  _path;
        Flag           _flags;
        string         _take_id;
        bool           _allow_remove_if_empty;
-       uint64_t       _timeline_position;
-       FILE*          _fd;
-       nframes_t _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;
 };