using namespace std;
using namespace PBD;
+namespace Evoral {
+template class EventRingBuffer<timestamp_t>;
+}
+
pthread_t JackMIDIPort::_process_thread;
Signal0<void> JackMIDIPort::JackHalted;
Signal0<void> JackMIDIPort::MakeConnections;
, _nframes_this_cycle (0)
, _jack_client (jack_client)
, _jack_port (0)
+ , _last_write_timestamp (0)
, output_fifo (512)
, input_fifo (1024)
, xthread (true)
, _nframes_this_cycle (0)
, _jack_client (jack_client)
, _jack_port (0)
+ , _last_write_timestamp (0)
, output_fifo (512)
, input_fifo (1024)
, xthread (true)
}
void
-JackMIDIPort::init (string const & name, Flags flags)
+JackMIDIPort::init (const string& /*name*/, Flags /*flags*/)
{
if (!create_port ()) {
_ok = true;
JackMIDIPort::~JackMIDIPort ()
{
- for (int i = 0; i < 16; i++) {
- delete _channel[i];
- }
-
if (_jack_port) {
if (_jack_client) {
jack_port_unregister (_jack_client, _jack_port);
}
int
-JackMIDIPort::write(byte * msg, size_t msglen, timestamp_t timestamp)
+JackMIDIPort::write (const byte * msg, size_t msglen, timestamp_t timestamp)
{
int ret = 0;
+ if (!_jack_client || !_jack_port) {
+ /* poof ! make it just vanish into thin air, since we are no
+ longer connected to JACK.
+ */
+ return msglen;
+ }
+
if (!sends_output()) {
return ret;
}
if (!is_process_thread()) {
- Glib::Mutex::Lock lm (output_fifo_lock);
+ Glib::Threads::Mutex::Lock lm (output_fifo_lock);
RingBuffer< Evoral::Event<double> >::rw_vector vec = { { 0, 0 }, { 0, 0} };
output_fifo.get_write_vector (&vec);
} else {
- // XXX This had to be temporarily commented out to make export work again
- if (!(timestamp < _nframes_this_cycle)) {
+ if (timestamp >= _nframes_this_cycle) {
std::cerr << "attempting to write MIDI event of " << msglen << " bytes at time "
<< timestamp << " of " << _nframes_this_cycle
<< " (this will not work - needs a code fix)"
timestamp = _last_write_timestamp;
}
- if (jack_midi_event_write (jack_port_get_buffer (_jack_port, _nframes_this_cycle),
- timestamp, msg, msglen) == 0) {
+ if ((ret = jack_midi_event_write (jack_port_get_buffer (_jack_port, _nframes_this_cycle),
+ timestamp, msg, msglen)) == 0) {
ret = msglen;
_last_write_timestamp = timestamp;
} else {
- ret = 0;
- cerr << "write of " << msglen << " failed, port holds "
+ cerr << "write of " << msglen << " @ " << timestamp << " failed, port holds "
<< jack_midi_get_event_count (jack_port_get_buffer (_jack_port, _nframes_this_cycle))
- << endl;
- // PBD::stacktrace (cerr, 20);
+ << " port is " << _jack_port
+ << " ntf = " << _nframes_this_cycle
+ << " buf = " << jack_port_get_buffer (_jack_port, _nframes_this_cycle)
+ << " ret = " << ret
+ << endl;
+ PBD::stacktrace (cerr, 20);
+ ret = 0;
}
} else {
cerr << "write to JACK midi port failed: not currently in a process cycle." << endl;