Use ARDOUR::user_config_directory in ARDOUR::user_template_directory
[ardour.git] / libs / ardour / midi_port.cc
index 83322dedb6f7d179ef59fc1e68531cf680e3d4a3..ba8d1aa841b87cc43088ee23f9cee3d1ce7359a7 100644 (file)
 */
 
 #include <cassert>
+#include <iostream>
+
 #include <ardour/midi_port.h>
 #include <ardour/data_type.h>
-#include <iostream>
 
 using namespace ARDOUR;
 using namespace std;
 
 MidiPort::MidiPort(jack_port_t* p)
        : Port(p)
-       , _buffer(NULL)
+       , _buffer(4096) // FIXME FIXME FIXME Jack needs to tell us this
        , _nframes_this_cycle(0)
 {
        DataType dt(_type);
@@ -34,22 +35,25 @@ MidiPort::MidiPort(jack_port_t* p)
 
        reset();
 
-       _buffer = new MidiBuffer(4096); // FIXME FIXME FIXME
+
 }
 
 
 MidiPort::~MidiPort()
 {
-       delete _buffer;
 }
 
 void
-MidiPort::cycle_start (jack_nframes_t nframes)
+MidiPort::cycle_start (nframes_t nframes)
 {
+       _buffer.clear();
+       assert(_buffer.size() == 0);
+
        _nframes_this_cycle = nframes;
 
        if (_flags & JackPortIsOutput) {
-               _buffer->set_size(0);
+               _buffer.silence(nframes);
+               assert(_buffer.size() == 0);
                return;
        }
 
@@ -57,24 +61,23 @@ MidiPort::cycle_start (jack_nframes_t nframes)
        
        void* jack_buffer = jack_port_get_buffer(_port, nframes);
 
-       const jack_nframes_t event_count
-               = jack_midi_port_get_info(jack_buffer, nframes)->event_count;
+       const nframes_t event_count
+               = jack_midi_get_event_count(jack_buffer);
+
+       assert(event_count < _buffer.capacity());
 
-       assert(event_count < _buffer->capacity());
+       jack_midi_event_t ev;
 
-       for (jack_nframes_t i=0; i < event_count; ++i) {
-               jack_midi_event_t* const ev = &_buffer->data()[i];
-               jack_midi_event_get(ev, jack_buffer, i, nframes);
+       for (nframes_t i=0; i < event_count; ++i) {
 
-               // Convert note ons with velocity 0 to proper note offs
-               // FIXME: Jack MIDI should guarantee this - does it?
-               //if (ev->buffer[0] == MIDI_CMD_NOTE_ON && ev->buffer[2] == 0)
-               //      ev->buffer[0] = MIDI_CMD_NOTE_OFF;
+               jack_midi_event_get(&ev, jack_buffer, i);
+
+               _buffer.push_back(ev);
        }
 
-       _buffer->set_size(event_count);
-       
-       //if (_buffer->size() > 0)
+       assert(_buffer.size() == event_count);
+
+       //if (_buffer.size() > 0)
        //      cerr << "MIDIPort got " << event_count << " events." << endl;
 }
 
@@ -82,7 +85,7 @@ void
 MidiPort::cycle_end()
 {
        if (_flags & JackPortIsInput) {
-               _nframes_this_cycle = 0; // catch any oopses
+               _nframes_this_cycle = 0;
                return;
        }
 
@@ -90,13 +93,19 @@ MidiPort::cycle_end()
        
        void* jack_buffer = jack_port_get_buffer(_port, _nframes_this_cycle);
 
-       const jack_nframes_t event_count = _buffer->size();
-
-       jack_midi_clear_buffer(jack_buffer, _nframes_this_cycle);
-       for (jack_nframes_t i=0; i < event_count; ++i) {
-               const jack_midi_event_t& ev = _buffer->data()[i];
-               jack_midi_event_write(jack_buffer, ev.time, ev.buffer, ev.size, _nframes_this_cycle);
+       const nframes_t event_count = _buffer.size();
+       
+       //if (event_count > 0)
+       //      cerr << "MIDIPort writing " << event_count << " events." << endl;
+
+       jack_midi_clear_buffer(jack_buffer);
+       for (nframes_t i=0; i < event_count; ++i) {
+               const MidiEvent& ev = _buffer[i];
+               // event times should be frames, relative to cycle start
+               assert(ev.time >= 0);
+               assert(ev.time < _nframes_this_cycle);
+               jack_midi_event_write(jack_buffer, (jack_nframes_t)ev.time, ev.buffer, ev.size);
        }
        
-       _nframes_this_cycle = 0; // catch oopses
+       _nframes_this_cycle = 0;
 }