De-templatify Evoral::SMF which has no concept of time other than SMF time.
authorDavid Robillard <d@drobilla.net>
Sun, 15 Feb 2009 01:32:41 +0000 (01:32 +0000)
committerDavid Robillard <d@drobilla.net>
Sun, 15 Feb 2009 01:32:41 +0000 (01:32 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@4571 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/smf_source.h
libs/ardour/import.cc
libs/ardour/smf_source.cc
libs/evoral/evoral/SMF.hpp
libs/evoral/src/SMF.cpp
libs/evoral/test/SMFTest.cpp
libs/evoral/test/SMFTest.hpp

index ccc03acd667102ab61d701336aae19534107b56c..1dd993c686522cfb10cbda6e9b8b8358e6fe3159 100644 (file)
@@ -34,7 +34,7 @@ namespace ARDOUR {
 template<typename T> class MidiRingBuffer;
 
 /** Standard Midi File (Type 0) Source */
-class SMFSource : public MidiSource, public Evoral::SMF<double> {
+class SMFSource : public MidiSource, public Evoral::SMF {
   public:
        enum Flag {
                Writable = 0x1,
index 97cebf14568f2344f8539eb74185d260a41ab30b..1b6d604d8f5832c6e831bd40bc97cba66f27a679 100644 (file)
@@ -309,7 +309,7 @@ write_audio_data_to_new_files (ImportableSource* source, Session::import_status&
 }
 
 static void
-write_midi_data_to_new_files (Evoral::SMF<double>* source, Session::import_status& status,
+write_midi_data_to_new_files (Evoral::SMF* source, Session::import_status& status,
                               vector<boost::shared_ptr<Source> >& newfiles)
 {
        uint32_t buf_size = 4;
@@ -402,8 +402,8 @@ Session::import_audiofiles (import_status& status)
                        p != status.paths.end() && !status.cancel;
                        ++p, ++cnt)
        {
-               boost::shared_ptr<ImportableSource>  source;
-               std::auto_ptr< Evoral::SMF<double> > smf_reader;
+               boost::shared_ptr<ImportableSource> source;
+               std::auto_ptr<Evoral::SMF>          smf_reader;
                const DataType type = ((*p).rfind(".mid") != string::npos) ? 
                        DataType::MIDI : DataType::AUDIO;
                
@@ -419,7 +419,7 @@ Session::import_audiofiles (import_status& status)
 
                } else {
                        try {
-                               smf_reader = std::auto_ptr< Evoral::SMF<double> >(new Evoral::SMF<double>());
+                               smf_reader = std::auto_ptr<Evoral::SMF>(new Evoral::SMF());
                                smf_reader->open(*p);
                                channels = smf_reader->num_tracks();
                        } catch (...) {
index d55226aa69f444d962c3af1b02edeac00bf97f34..d75c4b93d55ae57bac461b142c653186bc3a06b5 100644 (file)
@@ -50,7 +50,7 @@ string SMFSource::_search_path;
 
 SMFSource::SMFSource (Session& s, std::string path, Flag flags)
        : MidiSource (s, region_name_from_path(path, false))
-       , Evoral::SMF<double> ()
+       , Evoral::SMF ()
        , _flags (Flag(flags | Writable)) // FIXME: this needs to be writable for now
        , _allow_remove_if_empty(true)
        , _last_ev_time(0)
@@ -144,7 +144,7 @@ SMFSource::read_unlocked (MidiRingBuffer<nframes_t>& dst, nframes_t start, nfram
        size_t scratch_size = 0; // keep track of scratch to minimize reallocs
 
        // FIXME: don't seek to start and search every read (brutal!)
-       Evoral::SMF<double>::seek_to_start();
+       Evoral::SMF::seek_to_start();
        
        // FIXME: assumes tempo never changes after start
        const double frames_per_beat = _session.tempo_map().tempo_at(_timeline_position).frames_per_beat(
@@ -153,7 +153,7 @@ SMFSource::read_unlocked (MidiRingBuffer<nframes_t>& dst, nframes_t start, nfram
        
        const uint64_t start_ticks = (uint64_t)((start / frames_per_beat) * ppqn());
 
-       while (!Evoral::SMF<double>::eof()) {
+       while (!Evoral::SMF::eof()) {
                int ret = read_event(&ev_delta_t, &ev_size, &ev_buffer);
                if (ret == -1) { // EOF
                        //cerr << "SMF - EOF\n";
@@ -250,7 +250,7 @@ SMFSource::write_unlocked (MidiRingBuffer<nframes_t>& src, nframes_t cnt)
                set_default_controls_interpolation();
        }
 
-       Evoral::SMF<double>::flush();
+       Evoral::SMF::flush();
        free(buf);
 
        const nframes_t oldlen = _length;
@@ -300,7 +300,7 @@ SMFSource::append_event_unlocked(EventTimeUnit unit, const Evoral::Event<double>
                delta_time = (uint32_t)((ev.time() - last_event_time()) * ppqn());
        }
 
-       Evoral::SMF<double>::append_event_delta(delta_time, ev.size(), ev.buffer());
+       Evoral::SMF::append_event_delta(delta_time, ev.size(), ev.buffer());
        _last_ev_time = ev.time();
 
        _write_data_count += ev.size();
@@ -356,7 +356,7 @@ void
 SMFSource::mark_streaming_midi_write_started (NoteMode mode, nframes_t start_frame)
 {
        MidiSource::mark_streaming_midi_write_started (mode, start_frame);
-       Evoral::SMF<double>::begin_write ();
+       Evoral::SMF::begin_write ();
        _last_ev_time = 0;
 }
 
@@ -370,7 +370,7 @@ SMFSource::mark_streaming_write_completed ()
        }
        
        _model->set_edited(false);
-       Evoral::SMF<double>::end_write ();
+       Evoral::SMF::end_write ();
 }
 
 void
@@ -634,7 +634,7 @@ SMFSource::load_model(bool lock, bool force_reload)
        }
 
        _model->start_write();
-       Evoral::SMF<double>::seek_to_start();
+       Evoral::SMF::seek_to_start();
 
        uint64_t time = 0; /* in SMF ticks */
        Evoral::Event<double> ev;
@@ -706,6 +706,6 @@ SMFSource::destroy_model()
 void
 SMFSource::flush_midi()
 {
-       Evoral::SMF<double>::end_write();
+       Evoral::SMF::end_write();
 }
 
index 14046ab8f3ee214d75eb4668591b4cc3d9d6aee1..73d56e5eaada53171f78d7e32998793e01fac34c 100644 (file)
@@ -29,15 +29,11 @@ typedef smf_track_struct smf_track_t;
 
 namespace Evoral {
        
-template<typename Time> class Event;
-template<typename Time> class EventRingBuffer;
-
-#define THROW_FILE_ERROR throw(typename SMF<Time>::FileError)
+#define THROW_FILE_ERROR throw(FileError)
 
 /** Standard Midi File.
  * Currently only tempo-based time of a given PPQN is supported.
  */
-template<typename Time>
 class SMF {
 public:
        class FileError : public std::exception {
index 86110b6401f8e750e7320d78664cd88ee0db372f..e651d4940d53b1a6e37bcb3d318cb73d892b4b2d 100644 (file)
@@ -29,8 +29,7 @@ using namespace std;
 
 namespace Evoral {
 
-template<typename Time>
-SMF<Time>::~SMF()
+SMF::~SMF()
 {      
        if (_smf) {
                smf_delete(_smf);
@@ -39,16 +38,14 @@ SMF<Time>::~SMF()
        } 
 }
 
-template<typename Time>
 uint16_t
-SMF<Time>::num_tracks() const
+SMF::num_tracks() const
 {
        return _smf->number_of_tracks;
 }
 
-template<typename Time>
 uint16_t
-SMF<Time>::ppqn() const
+SMF::ppqn() const
 {
        return _smf->ppqn;
 }
@@ -56,9 +53,8 @@ SMF<Time>::ppqn() const
 /** Seek to the specified track (1-based indexing)
  * \return 0 on success
  */
-template<typename Time>
 int
-SMF<Time>::seek_to_track(int track)
+SMF::seek_to_track(int track)
 {
        _smf_track = smf_get_track_by_number(_smf, track);
        if (_smf_track != NULL) {
@@ -75,9 +71,8 @@ SMF<Time>::seek_to_track(int track)
  *         -1 if the file can not be opened or created
  *         -2 if the file exists but specified track does not exist
  */
-template<typename Time>
 int
-SMF<Time>::open(const std::string& path, int track) THROW_FILE_ERROR
+SMF::open(const std::string& path, int track) THROW_FILE_ERROR
 {
        assert(track >= 1);
        if (_smf) { 
@@ -113,9 +108,8 @@ SMF<Time>::open(const std::string& path, int track) THROW_FILE_ERROR
  *         -1 if the file can not be created
  *         -2 if the track can not be created
  */
-template<typename Time>
 int
-SMF<Time>::create(const std::string& path, int track, uint16_t ppqn) THROW_FILE_ERROR
+SMF::create(const std::string& path, int track, uint16_t ppqn) THROW_FILE_ERROR
 {
        assert(track >= 1);
        if (_smf) { 
@@ -149,9 +143,8 @@ SMF<Time>::create(const std::string& path, int track, uint16_t ppqn) THROW_FILE_
        return 0;
 }
 
-template<typename Time>
 void
-SMF<Time>::close() THROW_FILE_ERROR
+SMF::close() THROW_FILE_ERROR
 {
        if (_smf) {
                if (smf_save(_smf, _path.c_str()) != 0) {
@@ -163,9 +156,8 @@ SMF<Time>::close() THROW_FILE_ERROR
        }
 }
 
-template<typename Time>
 void
-SMF<Time>::seek_to_start() const
+SMF::seek_to_start() const
 {
        _smf_track->next_event_number = 1;
 }
@@ -184,9 +176,8 @@ SMF<Time>::seek_to_start() const
  * \return event length (including status byte) on success, 0 if event was
  * skipped (e.g. a meta event), or -1 on EOF (or end of track).
  */
-template<typename Time>
 int
-SMF<Time>::read_event(uint32_t* delta_t, uint32_t* size, uint8_t** buf) const
+SMF::read_event(uint32_t* delta_t, uint32_t* size, uint8_t** buf) const
 {
        smf_event_t* event;
        
@@ -221,9 +212,8 @@ SMF<Time>::read_event(uint32_t* delta_t, uint32_t* size, uint8_t** buf) const
     }
 }
 
-template<typename Time>
 void
-SMF<Time>::append_event_delta(uint32_t delta_t, uint32_t size, const uint8_t* buf)
+SMF::append_event_delta(uint32_t delta_t, uint32_t size, const uint8_t* buf)
 {
        if (size == 0) {
                return;
@@ -244,9 +234,8 @@ SMF<Time>::append_event_delta(uint32_t delta_t, uint32_t size, const uint8_t* bu
        _empty = false;
 }
 
-template<typename Time>
 void
-SMF<Time>::begin_write()
+SMF::begin_write()
 {
        assert(_smf_track);
        smf_track_delete(_smf_track);
@@ -258,14 +247,12 @@ SMF<Time>::begin_write()
        assert(_smf->number_of_tracks == 1);
 }
 
-template<typename Time>
 void
-SMF<Time>::end_write() THROW_FILE_ERROR
+SMF::end_write() THROW_FILE_ERROR
 {
        if (smf_save(_smf, _path.c_str()) != 0)
                throw FileError();
 }
 
-template class SMF<double>;
 
 } // namespace Evoral
index 5a199a3bbdd1ace692295b47e70276dc827753ea..2a299be1f3a258ffecd5eda3a4b83c16b7100d6e 100644 (file)
@@ -7,7 +7,7 @@ CPPUNIT_TEST_SUITE_REGISTRATION( SMFTest );
 void
 SMFTest::createNewFileTest ()
 {
-       TestSMF<Time> smf;
+       TestSMF smf;
        smf.create("NewFile.mid");
        smf.close();
        CPPUNIT_ASSERT(access("NewFile.mid", R_OK) == 0);
@@ -17,7 +17,7 @@ SMFTest::createNewFileTest ()
 void
 SMFTest::takeFiveTest ()
 {
-       TestSMF<Time> smf;
+       TestSMF smf;
        smf.open("./test/testdata/TakeFive.mid");
        CPPUNIT_ASSERT(!smf.is_empty());
        
index 0f2fcf89fb5b407a84ce70ce67801bac1c12d87f..08f51b2a519a2c02c1a78e8ff2de903aec1d0355 100644 (file)
 
 using namespace Evoral;
 
-template<typename Time>
-class TestSMF : public SMF<Time> {
+class TestSMF : public SMF {
 public:
        std::string path() const { return _path; }
        
        int open(const std::string& path) THROW_FILE_ERROR {
                _path = path;
-               return SMF<Time>::open(path);
+               return SMF::open(path);
        }
        
        void close() THROW_FILE_ERROR {
-               return SMF<Time>::close();
+               return SMF::close();
        }
        
        int read_event(uint32_t* delta_t, uint32_t* size, uint8_t** buf) const {
-               return SMF<Time>::read_event(delta_t, size, buf);
+               return SMF::read_event(delta_t, size, buf);
        }
 
 private: