X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fardour%2Fasync_midi_port.h;h=3639304f7783ff603f78702f9a3f566abc814430;hb=e5a181c323243a03338f5a9934a5df254986370d;hp=c5babf6135c3bbda22b9310d980bede82a2e3120;hpb=658bb3ccd43658de18fbd43cd91a8e66650e27a7;p=ardour.git diff --git a/libs/ardour/ardour/async_midi_port.h b/libs/ardour/ardour/async_midi_port.h index c5babf6135..3639304f77 100644 --- a/libs/ardour/ardour/async_midi_port.h +++ b/libs/ardour/ardour/async_midi_port.h @@ -1,5 +1,5 @@ /* - Copyright (C) 1998-2010 Paul Barton-Davis + Copyright (C) 1998-2010 Paul Barton-Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or @@ -22,18 +22,20 @@ #include #include +#include + #include "pbd/xml++.h" #include "pbd/crossthread.h" #include "pbd/signals.h" #include "pbd/ringbuffer.h" #include "evoral/Event.hpp" -#include "evoral/EventRingBuffer.hpp" #include "midi++/types.h" #include "midi++/parser.h" #include "midi++/port.h" +#include "ardour/event_ring_buffer.h" #include "ardour/libardour_visibility.h" #include "ardour/midi_port.h" @@ -41,58 +43,66 @@ namespace ARDOUR { class LIBARDOUR_API AsyncMIDIPort : public ARDOUR::MidiPort, public MIDI::Port { - public: - AsyncMIDIPort (std::string const &, PortFlags); - ~AsyncMIDIPort (); - - /* called from an RT context */ - - void cycle_start (pframes_t nframes); - void cycle_end (pframes_t nframes); - - /* called from non-RT context */ - - void parse (framecnt_t timestamp); - int write (const MIDI::byte *msg, size_t msglen, MIDI::timestamp_t timestamp); - int read (MIDI::byte *buf, size_t bufsize); - void drain (int check_interval_usecs); - int selectable () const { -#ifdef PLATFORM_WINDOWS - return false; -#else - return xthread.selectable(); -#endif - } - - static void set_process_thread (pthread_t); - static pthread_t get_process_thread () { return _process_thread; } - static bool is_process_thread(); - - private: - bool _currently_in_cycle; - MIDI::timestamp_t _last_write_timestamp; - RingBuffer< Evoral::Event > output_fifo; - Evoral::EventRingBuffer input_fifo; - Glib::Threads::Mutex output_fifo_lock; -#ifndef PLATFORM_WINDOWS - CrossThreadChannel xthread; -#endif - - int create_port (); - - /** Channel used to signal to the MidiControlUI that input has arrived */ - - std::string _connections; - PBD::ScopedConnection connect_connection; - PBD::ScopedConnection halt_connection; - void flush (void* jack_port_buffer); - void jack_halted (); - void make_connections (); - void init (std::string const &, Flags); - - void flush_output_fifo (pframes_t); - - static pthread_t _process_thread; + public: + AsyncMIDIPort (std::string const &, PortFlags); + ~AsyncMIDIPort (); + + bool flush_at_cycle_start () const { return _flush_at_cycle_start; } + void set_flush_at_cycle_start (bool en) { _flush_at_cycle_start = en; } + + /* called from an RT context */ + void cycle_start (pframes_t nframes); + void cycle_end (pframes_t nframes); + + /* called from non-RT context */ + void parse (samplecnt_t timestamp); + int write (const MIDI::byte *msg, size_t msglen, MIDI::timestamp_t timestamp); + int read (MIDI::byte *buf, size_t bufsize); + /* waits for output to be cleared */ + void drain (int check_interval_usecs, int total_usecs_to_wait); + + /* clears async request communication channel */ + void clear () { + _xthread.drain (); + } + + CrossThreadChannel& xthread() { + return _xthread; + } + + /* Not selectable; use ios() */ + int selectable() const { return -1; } + void set_timer (boost::function&); + + static void set_process_thread (pthread_t); + static pthread_t get_process_thread () { return _process_thread; } + static bool is_process_thread(); + + private: + bool _currently_in_cycle; + MIDI::timestamp_t _last_write_timestamp; + bool _flush_at_cycle_start; + bool have_timer; + boost::function timer; + PBD::RingBuffer< Evoral::Event > output_fifo; + EventRingBuffer input_fifo; + Glib::Threads::Mutex output_fifo_lock; + CrossThreadChannel _xthread; + + int create_port (); + + /** Channel used to signal to the MidiControlUI that input has arrived */ + + std::string _connections; + PBD::ScopedConnection connect_connection; + PBD::ScopedConnection halt_connection; + void jack_halted (); + void make_connections (); + void init (std::string const &, Flags); + + void flush_output_fifo (pframes_t); + + static pthread_t _process_thread; }; } // namespace ARDOUR