X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fsmf_source.h;h=0c0dba3d96f26da36a7dfd13069939193870b16f;hb=aaa91db6d9592684258267981e619b44cc2b7c40;hp=88bf1e5d1370157a97ec5888594b0b3b7224124a;hpb=449aab3c465bbbf66d221fac3d7ea559f1720357;p=ardour.git diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h index 88bf1e5d13..0c0dba3d96 100644 --- a/libs/ardour/ardour/smf_source.h +++ b/libs/ardour/ardour/smf_source.h @@ -25,13 +25,16 @@ #include #include +#include + +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,56 +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, nframes_t negative_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; } - - int open(); - void close(); - - /** - * This method is only used by flush_footer() to find the right seek position - * for the footer (at the end after recording or -4 offset ro SEEK_END - * if a footer is already present) - */ - void seek_to_footer_position(); - /** - * write the track footer at the current seek position - */ - 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, uint8_t** buf) const; - - static const uint16_t _ppqn = 19200; + void make_sure_controls_have_the_right_interpolation(); 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 - bool _empty; ///< true iff file contains (non-empty) events static string _search_path; };