X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fsmf_source.h;h=82f41ebf2d74a906d9de7f9d22f77a88a7c13cd6;hb=41ac4afff50b1730e61e302e60f66e6ef94720c1;hp=302fb15838a39c272a833efd7067dc35367b0d9a;hpb=c190aca4a0debe1220558d14afb8f1ab4adb959f;p=ardour.git diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h index 302fb15838..82f41ebf2d 100644 --- a/libs/ardour/ardour/smf_source.h +++ b/libs/ardour/ardour/smf_source.h @@ -25,13 +25,16 @@ #include #include +#include + +namespace Evoral { template class Event; } namespace ARDOUR { -class MidiRingBuffer; +template class MidiRingBuffer; /** Standard Midi File (Type 0) Source */ -class SMFSource : public MidiSource { +class SMFSource : public MidiSource, public Evoral::SMF { public: enum Flag { Writable = 0x1, @@ -51,32 +54,21 @@ class SMFSource : public MidiSource { virtual ~SMFSource (); - /* this block of methods do nothing for regular file sources, but are significant - for files used in destructive recording. - */ - // 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() {} - bool set_name (const std::string& newname) { return (set_source_name(newname, false) == 0); } int set_source_name (string newname, bool destructive); - - string path() const { return _path; } + + 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(const MidiEvent& 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 (); void mark_take (string); @@ -88,45 +80,38 @@ 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; } + double last_event_time() const { return _last_ev_time; } - private: + 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 set_default_controls_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; - string _path; + 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 + double _last_ev_time; static string _search_path; };