summaryrefslogtreecommitdiff
path: root/libs/ardour/ardour/smf_source.h
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2008-06-02 21:41:35 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2008-06-02 21:41:35 +0000
commit449aab3c465bbbf66d221fac3d7ea559f1720357 (patch)
tree6843cc40c88250a132acac701271f1504cd2df04 /libs/ardour/ardour/smf_source.h
parent9c0d7d72d70082a54f823cd44c0ccda5da64bb6f (diff)
rollback to 3428, before the mysterious removal of libs/* at 3431/3432
git-svn-id: svn://localhost/ardour2/branches/3.0@3435 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/ardour/smf_source.h')
-rw-r--r--libs/ardour/ardour/smf_source.h151
1 files changed, 151 insertions, 0 deletions
diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h
new file mode 100644
index 0000000000..88bf1e5d13
--- /dev/null
+++ b/libs/ardour/ardour/smf_source.h
@@ -0,0 +1,151 @@
+/*
+ Copyright (C) 2006 Paul Davis
+ Written by Dave Robillard, 2006
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef __ardour_smf_filesource_h__
+#define __ardour_smf_filesource_h__
+
+#include <cstdio>
+#include <time.h>
+
+#include <ardour/midi_source.h>
+
+namespace ARDOUR {
+
+class MidiRingBuffer;
+
+/** Standard Midi File (Type 0) Source */
+class SMFSource : public MidiSource {
+ public:
+ enum Flag {
+ Writable = 0x1,
+ CanRename = 0x2,
+ Broadcast = 0x4,
+ Removable = 0x8,
+ RemovableIfEmpty = 0x10,
+ RemoveAtDestroy = 0x20,
+ BuildPeaks = 0x40
+ };
+
+ /** Constructor for existing external-to-session files */
+ SMFSource (Session& session, std::string path, Flag flags = Flag(0));
+
+ /* Constructor for existing in-session files */
+ SMFSource (Session& session, const XMLNode&);
+
+ 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);
+
+ 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);
+
+ 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);
+ string take_id() const { return _take_id; }
+
+ static void set_search_path (string);
+ static void set_header_position_offset (nframes_t offset, bool negative);
+
+ 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; }
+
+ 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);
+
+ 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;
+
+ 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;
+};
+
+}; /* namespace ARDOUR */
+
+#endif /* __ardour_smf_filesource_h__ */
+