X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fevoral%2Fevoral%2FSMF.hpp;h=4a6b21870b05312293e53dc0b95e5587b9d73ce2;hb=f219a53744c3ccced52070a0ebab5fbe7f9b9895;hp=2587781d7af06a7fae6481f27a239e821dd681a1;hpb=166ef64e3db4ab72b7b1e7455234e2b9ceddf6d8;p=ardour.git diff --git a/libs/evoral/evoral/SMF.hpp b/libs/evoral/evoral/SMF.hpp index 2587781d7a..4a6b21870b 100644 --- a/libs/evoral/evoral/SMF.hpp +++ b/libs/evoral/evoral/SMF.hpp @@ -1,6 +1,7 @@ /* This file is part of Evoral. * Copyright(C) 2008 Dave Robillard * Copyright(C) 2000-2008 Paul Davis + * Author: Hans Baier * * Evoral 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 @@ -19,63 +20,55 @@ #ifndef EVORAL_SMF_HPP #define EVORAL_SMF_HPP -#include -#include "evoral/types.hpp" +#include + +struct smf_struct; +struct smf_track_struct; +typedef smf_struct smf_t; +typedef smf_track_struct smf_track_t; namespace Evoral { -template class Event; -template class EventRingBuffer; - +#define THROW_FILE_ERROR throw(FileError) -/** Standard Midi File (Type 0) +/** Standard Midi File. + * Currently only tempo-based time of a given PPQN is supported. */ -template class SMF { public: - SMF(); - virtual ~SMF(); + class FileError : public std::exception { + const char* what() const throw() { return "Unknown SMF error"; } + }; - void seek_to_start() const; + SMF() : _smf(0), _smf_track(0), _empty(true) {}; + virtual ~SMF(); - uint16_t ppqn() const { return _ppqn; } - bool is_empty() const { return _empty; } - bool eof() const { return feof(_fd); } + int open(const std::string& path, int track=1) THROW_FILE_ERROR; + int create(const std::string& path, int track=1, uint16_t ppqn=19200) THROW_FILE_ERROR; + void close() THROW_FILE_ERROR; - T last_event_time() const { return _last_ev_time; } + const std::string& file_path() const { return _file_path; }; + + void seek_to_start() const; + int seek_to_track(int track); - void begin_write(FrameTime start_time); - void append_event_unlocked(uint32_t delta_t, const Event& ev); - void end_write(); + int read_event(uint32_t* delta_t, uint32_t* size, uint8_t** buf) const; - void flush(); - int flush_header(); - int flush_footer(); - -protected: - int open(const std::string& path); - void close(); + uint16_t num_tracks() const; + uint16_t ppqn() const; + bool is_empty() const { return _empty; } - /** Used by flush_footer() to find the position to write the footer */ - void seek_to_footer_position(); + void begin_write(); + void append_event_delta(uint32_t delta_t, uint32_t size, const uint8_t* buf); + void end_write() THROW_FILE_ERROR; - /** 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; + void flush() {}; private: - static const uint16_t _ppqn = 19200; - - FILE* _fd; - T _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 + std::string _file_path; + smf_t* _smf; + smf_track_t* _smf_track; + bool _empty; ///< true iff file contains(non-empty) events }; }; /* namespace Evoral */