Fix corrupt MIDI file writing when meta events are present (fixes missing first note...
[ardour.git] / libs / midi++2 / midi++ / jack.h
index c20b2693f134f212dd6ab02f9f8f792066fd9f19..6d3e3341bc16f8d1ae3c6cf3d1447fbf2eb5d73a 100644 (file)
 #include <fcntl.h>
 #include <unistd.h>
 
+#include <glibmm/thread.h>
+
+#include <pbd/ringbuffer.h>
 #include <jack/jack.h>
 #include <jack/midiport.h>
 #include <midi++/port.h>
+#include <midi++/event.h>
 
 namespace MIDI
 {
@@ -39,26 +43,45 @@ namespace MIDI
 class JACK_MidiPort : public Port
 {
 public:
-       JACK_MidiPort (PortRequest &req, jack_client_t* jack_client);
+       JACK_MidiPort (const XMLNode& node, jack_client_t* jack_client);
        virtual ~JACK_MidiPort ();
 
+       int write(byte *msg, size_t msglen, timestamp_t timestamp);
+       int read(byte *buf, size_t max);
+
        /* No select(2)/poll(2)-based I/O */
        virtual int selectable() const { return -1; }
        
        virtual void cycle_start(nframes_t nframes);
 
-protected:
-       /* Direct I/O */
-       int write(byte *msg, size_t msglen, timestamp_t timestamp);
-       int read(byte *buf, size_t max, timestamp_t timestamp);
+       static std::string typestring;
+
+       virtual XMLNode& get_state () const;
+       virtual void set_state (const XMLNode&);
+
+       static void set_process_thread (pthread_t);
+
+  protected:
+       std::string get_typestring () const {
+               return typestring;
+       }
 
 private:
-       int create_ports(PortRequest &req);
+       int create_ports(const XMLNode&);
 
        jack_client_t* _jack_client;
        jack_port_t*   _jack_input_port;
        jack_port_t*   _jack_output_port;
        nframes_t      _last_read_index;
+       timestamp_t    _last_write_timestamp;
+
+       void flush (void* jack_port_buffer);
+
+       static pthread_t _process_thread;
+       static bool is_process_thread();
+
+       RingBuffer<MIDI::Event> non_process_thread_fifo;
+       Glib::Mutex non_process_thread_fifo_lock;
 };