Remove unnecessary 0 checks before delete; see http://www.parashift.com/c++-faq-lite...
[ardour.git] / libs / ardour / base_midi_port.cc
index 3757d2221d0b51d08503c852476d29e4de0bc226..0ba4b7c7b25c2ccac6cd26c6284b147fa6b5bc1c 100644 (file)
@@ -18,7 +18,7 @@
 
 #include <cassert>
 #include <iostream>
-
+#include <glib.h>
 #include <ardour/base_midi_port.h>
 #include <ardour/data_type.h>
 
@@ -31,12 +31,12 @@ BaseMidiPort::BaseMidiPort (const std::string& name, Flags flags)
        , _own_buffer (false)
 {
        _type = DataType::MIDI;
-       reset();
+       _mixdown = default_mixdown;
 }
 
 BaseMidiPort::~BaseMidiPort()
 {
-       if (_own_buffer && _buffer) {
+       if (_own_buffer) {
                delete _buffer;
        }
 }
@@ -47,23 +47,21 @@ BaseMidiPort::default_mixdown (const set<Port*>& ports, MidiBuffer* dest, nframe
        set<Port*>::const_iterator p = ports.begin();
 
        if (first_overwrite) {
-               dest->read_from ((dynamic_cast<BaseMidiPort*>(*p))->get_midi_buffer(), cnt, offset);
+               cout << "first overwrite" << endl;
+               dest->read_from ((dynamic_cast<BaseMidiPort*>(*p))->get_midi_buffer(cnt, offset), cnt, offset);
                p++;
        }
 
        // XXX DAVE: this is just a guess
 
        for (; p != ports.end(); ++p) {
-               dest->merge (*dest, (dynamic_cast<BaseMidiPort*>(*p))->get_midi_buffer());
+               //cout << "merge" << endl;
+               dest->merge (*dest, (dynamic_cast<BaseMidiPort*>(*p))->get_midi_buffer(cnt, offset));
        }
 }
 
 void 
 BaseMidiPort::set_mixdown_function (void (*func)(const set<Port*>&, MidiBuffer*, nframes_t, nframes_t, bool))
 {
-       /* caller should (but not must) hold process lock since this is an atomic operation on most platforms
-          and even if its not, it doesn't really matter.
-       */
-
-       _mixdown = func;
+       g_atomic_pointer_set(&_mixdown, func);
 }