Apply fix for 2546 from lincoln. Many thanks.
[ardour.git] / libs / midi++2 / jack_midiport.cc
index 0b49517212e00a55fb91a8e0a22b18221de14ecd..0f707a4b21082cae20fd3792e5240a53bb4388f2 100644 (file)
@@ -60,9 +60,33 @@ JACK_MidiPort::cycle_start (nframes_t nframes)
        _last_read_index = 0;
        _last_write_timestamp = 0;
 
-       void *buffer = jack_port_get_buffer (_jack_output_port, nframes);
-       jack_midi_clear_buffer (buffer);
-       flush (buffer);
+       if (_jack_output_port != 0) {
+               // output
+               void *buffer = jack_port_get_buffer (_jack_output_port, nframes);
+               jack_midi_clear_buffer (buffer);
+               flush (buffer); 
+       }
+       
+       if (_jack_input_port != 0) {
+               // input
+               void* jack_buffer = jack_port_get_buffer(_jack_input_port, nframes);
+               const nframes_t event_count = jack_midi_get_event_count(jack_buffer);
+
+               jack_midi_event_t ev;
+
+               for (nframes_t i=0; i < event_count; ++i) {
+
+                       jack_midi_event_get (&ev, jack_buffer, i);
+
+                       if (input_parser) {
+                               for (size_t i = 0; i < ev.size; i++) {
+                                       // the midi events here are used for MIDI clock only
+                                       input_parser->set_midi_clock_timestamp(ev.time + jack_last_frame_time(_jack_client));
+                                       input_parser->scanner (ev.buffer[i]);
+                               }       
+                       }
+               }       
+       }
 }
 
 int
@@ -73,7 +97,7 @@ JACK_MidiPort::write(byte * msg, size_t msglen, timestamp_t timestamp)
        if (!is_process_thread()) {
 
                Glib::Mutex::Lock lm (non_process_thread_fifo_lock);
-               RingBuffer<Event>::rw_vector vec;
+               RingBuffer< Evoral::Event<double> >::rw_vector vec;
                
                non_process_thread_fifo.get_write_vector (&vec);
 
@@ -96,7 +120,11 @@ JACK_MidiPort::write(byte * msg, size_t msglen, timestamp_t timestamp)
        } else {
 
                assert(_jack_output_port);
-               assert(timestamp < _nframes_this_cycle);
+               
+               // XXX This had to be temporarily commented out to make export work again
+               if (!(timestamp < _nframes_this_cycle)) {
+                       std::cerr << "assertion timestamp < _nframes_this_cycle failed!" << std::endl;
+               }
 
                if (_currently_in_cycle) {
                        if (timestamp == 0) {
@@ -133,7 +161,7 @@ JACK_MidiPort::write(byte * msg, size_t msglen, timestamp_t timestamp)
 void
 JACK_MidiPort::flush (void* jack_port_buffer)
 {
-       RingBuffer<Event>::rw_vector vec;
+       RingBuffer< Evoral::Event<double> >::rw_vector vec;
        size_t written;
 
        non_process_thread_fifo.get_read_vector (&vec);
@@ -143,7 +171,7 @@ JACK_MidiPort::flush (void* jack_port_buffer)
        }
 
        if (vec.len[0]) {
-               Event* evp = vec.buf[0];
+               Evoral::Event<double>* evp = vec.buf[0];
                
                for (size_t n = 0; n < vec.len[0]; ++n, ++evp) {
                        jack_midi_event_write (jack_port_buffer,
@@ -152,7 +180,7 @@ JACK_MidiPort::flush (void* jack_port_buffer)
        }
        
        if (vec.len[1]) {
-               Event* evp = vec.buf[1];
+               Evoral::Event<double>* evp = vec.buf[1];
 
                for (size_t n = 0; n < vec.len[1]; ++n, ++evp) {
                        jack_midi_event_write (jack_port_buffer,
@@ -170,9 +198,11 @@ JACK_MidiPort::read(byte * buf, size_t bufsize)
 {
        assert(_currently_in_cycle);
        assert(_jack_input_port);
-
+       
        jack_midi_event_t ev;
 
+       cerr << "JACK_MidiPort::read called" << endl;
+       
        int err = jack_midi_event_get (&ev,
                                       jack_port_get_buffer(_jack_input_port, _nframes_this_cycle),
                                       _last_read_index++);
@@ -213,7 +243,9 @@ JACK_MidiPort::create_ports(const XMLNode& node)
                _jack_output_port = jack_port_register(_jack_client,
                                                       string(desc.tag).append("_out").c_str(),
                                                       JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0);
-               jack_midi_clear_buffer(jack_port_get_buffer(_jack_output_port, nframes));
+               if (_jack_output_port) {
+                       jack_midi_clear_buffer(jack_port_get_buffer(_jack_output_port, nframes));
+               }
                ret = ret && (_jack_output_port != NULL);
        }
        
@@ -221,7 +253,9 @@ JACK_MidiPort::create_ports(const XMLNode& node)
                _jack_input_port = jack_port_register(_jack_client,
                                                      string(desc.tag).append("_in").c_str(),
                                                      JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
-               jack_midi_clear_buffer(jack_port_get_buffer(_jack_input_port, nframes));
+               if (_jack_input_port) {
+                       jack_midi_clear_buffer(jack_port_get_buffer(_jack_input_port, nframes));
+               }
                ret = ret && (_jack_input_port != NULL);
        }