diff options
author | David Robillard <d@drobilla.net> | 2008-05-03 21:55:43 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2008-05-03 21:55:43 +0000 |
commit | e55e3fde7cec89c49e01046a2db276b2d8f30958 (patch) | |
tree | 13ed43fe3303e559ca2ee2a30c9074e1f220aa3d /libs/ardour/smf_source.cc | |
parent | d2465f311fa1102e99e1639b3a643268f0da3bb1 (diff) |
Comment out excessive terminal output.
Write all events (not just notes) to SMF file from MidiModel
(just use iterator instead of hand-hacked MidiModel::write_to).
Various MIDI bug fixes.
git-svn-id: svn://localhost/ardour2/branches/3.0@3312 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/smf_source.cc')
-rw-r--r-- | libs/ardour/smf_source.cc | 63 |
1 files changed, 36 insertions, 27 deletions
diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc index 371824b833..dadb919b17 100644 --- a/libs/ardour/smf_source.cc +++ b/libs/ardour/smf_source.cc @@ -133,6 +133,14 @@ SMFSource::init (string pathstr, bool must_exist) return 0; } +/** Attempt to open the SMF file for reading and writing. + * + * Currently SMFSource is always read/write. + * + * \return 0 on success + * -1 if the file can not be opened for reading, + * -2 if the file can not be opened for writing + */ int SMFSource::open() { @@ -153,6 +161,11 @@ SMFSource::open() // We're making a new file } else { _fd = fopen(path().c_str(), "w+"); + if (_fd == NULL) { + cerr << "ERROR: Can not open SMF file " << path() << " for writing: " << + strerror(errno) << endl; + return -2; + } _track_size = 4; // Write a tentative header just to pad things out so writing happens in the right spot @@ -160,18 +173,29 @@ SMFSource::open() write_footer(); seek_to_end(); } - + return (_fd == 0) ? -1 : 0; } void +SMFSource::close() +{ + if (_fd) { + flush_header(); + flush_footer(); + fclose(_fd); + _fd = NULL; + } +} + +void SMFSource::seek_to_end() { fseek(_fd, -4, SEEK_END); } int -SMFSource::flush_header () +SMFSource::flush_header() { // FIXME: write timeline position somehow? @@ -211,8 +235,6 @@ SMFSource::flush_footer() void SMFSource::write_footer() { - //cerr << "SMF " << name() << " writing EOT at byte " << ftell(_fd) << endl; - write_var_len(0); char eot[3] = { 0xFF, 0x2F, 0x00 }; // end-of-track meta-event fwrite(eot, 1, 3, _fd); @@ -318,11 +340,11 @@ SMFSource::read_event(uint32_t* delta_t, uint32_t* size, Byte** buf) const if (event_size > 1) fread((*buf) + 1, 1, *size - 1, _fd); - printf("%s read event: delta = %u, size = %u, data = ", _name.c_str(), *delta_t, *size); + /*printf("%s read event: delta = %u, size = %u, data = ", _name.c_str(), *delta_t, *size); for (size_t i=0; i < *size; ++i) { printf("%X ", (*buf)[i]); } - printf("\n"); + printf("\n");*/ return (int)*size; } @@ -451,12 +473,13 @@ SMFSource::write_unlocked (MidiRingBuffer& src, nframes_t cnt) void SMFSource::append_event_unlocked(EventTimeUnit unit, const MIDI::Event& ev) { - //printf("%s - append chan = %u, time = %lf, size = %u, data = ", _path.c_str(), (unsigned)ev.channel(), ev.time(), ev.size()); + /*printf("%s - append chan = %u, time = %lf, size = %u, data = ", + name().c_str(), (unsigned)ev.channel(), ev.time(), ev.size()); for (size_t i=0; i < ev.size(); ++i) { printf("%X ", ev.buffer()[i]); } - printf("\n"); - + printf("\n");*/ + assert(ev.time() >= 0); assert(ev.time() >= _last_ev_time); @@ -535,6 +558,7 @@ SMFSource::mark_streaming_midi_write_started (NoteMode mode, nframes_t start_fra { MidiSource::mark_streaming_midi_write_started (mode, start_frame); _last_ev_time = 0; + fseek(_fd, _header_size, 0); } void @@ -546,20 +570,9 @@ SMFSource::mark_streaming_write_completed () return; } + _model->set_edited(false); flush_header(); flush_footer(); - -#if 0 - Glib::Mutex::Lock lm (_lock); - - - next_peak_clear_should_notify = true; - - if (_peaks_built || pending_peak_builds.empty()) { - _peaks_built = true; - PeaksReady (); /* EMIT SIGNAL */ - } -#endif } void @@ -861,13 +874,8 @@ SMFSource::load_model(bool lock, bool force_reload) if (lock) Glib::Mutex::Lock lm (_lock); - if (_model && !force_reload && !_model->empty()) { - //cerr << _name << " NOT reloading model " << _model.get() << " (" << _model->n_notes() - // << " notes)" << endl; + if (_model && !force_reload && !_model->empty()) return; - } else { - cerr << _name << " loading model" << endl; - } if (! _model) { _model = boost::shared_ptr<MidiModel>(new MidiModel(this)); @@ -912,6 +920,7 @@ SMFSource::load_model(bool lock, bool force_reload) } _model->end_write(false); + _model->set_edited(false); free(ev.buffer()); } |