SessionEvent::create_per_thread_pool (X_("Audioengine"), 512);
MIDI::Port::set_process_thread (pthread_self());
- MIDI::MachineControl::set_sending_thread (pthread_self ());
}
typedef void (*_JackInfoShutdownCallback)(jack_status_t code, const char* reason, void *arg);
}
}
- _mmc->flush_pending ();
-
_engine.main_thread()->get_buffers ();
(this->*process_function) (nframes);
byte send_device_id () const { return _send_device_id; }
void enable_send (bool);
void send (MachineControlCommand const &);
- void flush_pending ();
static bool is_mmc (byte *sysex_buf, size_t len);
- static void set_sending_thread (pthread_t);
/* Signals to connect to if you want to run "callbacks"
when certain MMC commands are received.
Port* _port;
bool _enable_send; ///< true if MMC sending is enabled
- /** A ringbuffer of MMC commands that were `sent' from the wrong thread, which
- are queued up and sent when flush_pending() is called.
- */
- RingBuffer<MachineControlCommand> _pending;
-
- /** The thread to use for sending MMC commands */
- static pthread_t _sending_thread;
-
void process_mmc_message (Parser &p, byte *, size_t len);
PBD::ScopedConnectionList port_connections; ///< connections to our parser for incoming data
int do_locate (byte *, size_t len);
int do_step (byte *, size_t len);
int do_shuttle (byte *, size_t len);
- void send_immediately (MachineControlCommand const &);
void write_track_status (byte *, size_t len, byte reg);
void spp_start (Parser&, nframes_t);
using namespace MIDI;
using namespace PBD;
-pthread_t MachineControl::_sending_thread;
-
static std::map<int,string> mmc_cmd_map;
static void build_mmc_cmd_map ()
{
MachineControl::MachineControl ()
: _port (0)
- , _pending (16)
{
build_mmc_cmd_map ();
_enable_send = yn;
}
-/** Send a MMC command. It will be sent immediately if the call is made in _sending_thread,
- * otherwise it will be queued and sent next time flush_pending()
- * is called.
- * @param c command, which this method takes ownership of.
+/** Send a MMC command to a the MMC port.
+ * @param c command.
*/
void
MachineControl::send (MachineControlCommand const & c)
-{
- if (pthread_self() == _sending_thread) {
- send_immediately (c);
- } else {
- _pending.write (&c, 1);
- }
-}
-
-/** Send any pending MMC commands immediately. Must be called from _sending_thread */
-void
-MachineControl::flush_pending ()
-{
- MachineControlCommand c;
- while (_pending.read (&c, 1) == 1) {
- send_immediately (c);
- }
-}
-
-/** Send a MMC immediately. Must be called from _sending_thread.
- * @param c command, which this method takes ownership of.
- */
-void
-MachineControl::send_immediately (MachineControlCommand const & c)
{
if (_port == 0 || !_enable_send) {
// cerr << "Not delivering MMC " << _mmc->port() << " - " << session_send_mmc << endl;
}
}
-/** Set the thread that we should send MMC in */
-void
-MachineControl::set_sending_thread (pthread_t t)
-{
- _sending_thread = t;
-}
-
void
MachineControl::spp_start (Parser& parser, nframes_t timestamp)
{