00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef RAUL_SMF_WRITER_HPP
00019 #define RAUL_SMF_WRITER_HPP
00020
00021 #include <stdexcept>
00022 #include <raul/MIDISink.hpp>
00023 #include <raul/TimeStamp.hpp>
00024
00025 namespace Raul {
00026
00027
00030 class SMFWriter : public Raul::MIDISink {
00031 public:
00032 SMFWriter(TimeUnit unit);
00033 ~SMFWriter();
00034
00035 bool start(const std::string& filename,
00036 TimeStamp start_time) throw (std::logic_error);
00037
00038 TimeUnit unit() const { return _unit; }
00039
00040 void write_event(TimeStamp time,
00041 size_t ev_size,
00042 const unsigned char* ev) throw (std::logic_error);
00043
00044 void flush();
00045
00046 void finish() throw (std::logic_error);
00047
00048 protected:
00049 static const uint32_t VAR_LEN_MAX = 0x0FFFFFFF;
00050
00051 void write_header();
00052 void write_footer();
00053
00054 void write_chunk_header(const char id[4], uint32_t length);
00055 void write_chunk(const char id[4], uint32_t length, void* data);
00056 size_t write_var_len(uint32_t val);
00057
00058 std::string _filename;
00059 FILE* _fd;
00060 TimeUnit _unit;
00061 Raul::TimeStamp _start_time;
00062 Raul::TimeStamp _last_ev_time;
00063 uint32_t _track_size;
00064 uint32_t _header_size;
00065 };
00066
00067
00068 }
00069
00070 #endif // RAUL_SMF_WRITER_HPP
00071