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 <string>
00023
00024 #include "raul/MIDISink.hpp"
00025 #include "raul/TimeStamp.hpp"
00026
00027 namespace Raul {
00028
00029
00033 class SMFWriter : public Raul::MIDISink {
00034 public:
00035 explicit SMFWriter(TimeUnit unit);
00036 ~SMFWriter();
00037
00038 bool start(const std::string& filename,
00039 TimeStamp start_time) throw (std::logic_error);
00040
00041 TimeUnit unit() const { return _unit; }
00042
00043 void write_event(TimeStamp time,
00044 size_t ev_size,
00045 const unsigned char* ev) throw (std::logic_error);
00046
00047 void flush();
00048
00049 void finish() throw (std::logic_error);
00050
00051 protected:
00052 static const uint32_t VAR_LEN_MAX = 0x0FFFFFFF;
00053
00054 void write_header();
00055 void write_footer();
00056
00057 void write_chunk_header(const char id[4], uint32_t length);
00058 void write_chunk(const char id[4], uint32_t length, void* data);
00059 size_t write_var_len(uint32_t val);
00060
00061 std::string _filename;
00062 FILE* _fd;
00063 TimeUnit _unit;
00064 Raul::TimeStamp _start_time;
00065 Raul::TimeStamp _last_ev_time;
00066 uint32_t _track_size;
00067 uint32_t _header_size;
00068 };
00069
00070
00071 }
00072
00073 #endif // RAUL_SMF_WRITER_HPP
00074