Browse Source

Fix MIDI queue bugs. Make latency test output unexpected message count even if an error occurs.

tags/1.9.8
Devin Anderson 14 years ago
parent
commit
61ae5bc2ad
8 changed files with 37 additions and 24 deletions
  1. +17
    -15
      common/JackMidiAsyncQueue.cpp
  2. +0
    -1
      common/JackMidiAsyncQueue.h
  3. +3
    -4
      example-clients/midi_latency_test.c
  4. +2
    -2
      linux/firewire/JackFFADOMidiOutputPort.cpp
  5. +6
    -1
      linux/firewire/JackFFADOMidiReceiveQueue.cpp
  6. +2
    -0
      linux/firewire/JackFFADOMidiReceiveQueue.h
  7. +5
    -1
      linux/firewire/JackFFADOMidiSendQueue.cpp
  8. +2
    -0
      linux/firewire/JackFFADOMidiSendQueue.h

+ 17
- 15
common/JackMidiAsyncQueue.cpp View File

@@ -26,13 +26,13 @@ using Jack::JackMidiAsyncQueue;
JackMidiAsyncQueue::JackMidiAsyncQueue(size_t max_bytes, size_t max_messages) JackMidiAsyncQueue::JackMidiAsyncQueue(size_t max_bytes, size_t max_messages)
{ {
data_buffer = new jack_midi_data_t[max_bytes]; data_buffer = new jack_midi_data_t[max_bytes];
byte_ring = jack_ringbuffer_create(max_bytes + 1);
byte_ring = jack_ringbuffer_create((max_bytes * sizeof(jack_midi_data_t)) +
1);
if (byte_ring) { if (byte_ring) {
info_ring = jack_ringbuffer_create((max_messages * INFO_SIZE) + 1); info_ring = jack_ringbuffer_create((max_messages * INFO_SIZE) + 1);
if (info_ring) { if (info_ring) {
jack_ringbuffer_mlock(byte_ring); jack_ringbuffer_mlock(byte_ring);
jack_ringbuffer_mlock(info_ring); jack_ringbuffer_mlock(info_ring);
advance_space = 0;
this->max_bytes = max_bytes; this->max_bytes = max_bytes;
return; return;
} }
@@ -54,26 +54,23 @@ JackMidiAsyncQueue::DequeueEvent()
{ {
jack_midi_event_t *event = 0; jack_midi_event_t *event = 0;
if (jack_ringbuffer_read_space(info_ring) >= INFO_SIZE) { if (jack_ringbuffer_read_space(info_ring) >= INFO_SIZE) {
if (advance_space) {
jack_ringbuffer_read_advance(byte_ring, advance_space);
}
event = &dequeue_event; event = &dequeue_event;
jack_ringbuffer_read(info_ring, (char *) &(event->time), jack_ringbuffer_read(info_ring, (char *) &(event->time),
sizeof(jack_nframes_t)); sizeof(jack_nframes_t));
size_t size; size_t size;
jack_ringbuffer_read(info_ring, (char *) &size, sizeof(size_t)); jack_ringbuffer_read(info_ring, (char *) &size, sizeof(size_t));
event->buffer = data_buffer;
event->size = size; event->size = size;
jack_ringbuffer_data_t vector[2]; jack_ringbuffer_data_t vector[2];
jack_ringbuffer_get_read_vector(byte_ring, vector); jack_ringbuffer_get_read_vector(byte_ring, vector);
size_t size1 = vector[0].len; size_t size1 = vector[0].len;
if (size1 >= size) {
event->buffer = (jack_midi_data_t *) vector[0].buf;
} else {
event->buffer = data_buffer;
memcpy(data_buffer, vector[0].buf, size1);
memcpy(data_buffer + size1, vector[1].buf, size - size1);
memcpy(data_buffer, vector[0].buf, size1 * sizeof(jack_midi_data_t));
if (size1 < size) {
memcpy(data_buffer + size1, vector[1].buf,
(size - size1) * sizeof(jack_midi_data_t));
} }
advance_space = size;
jack_ringbuffer_read_advance(byte_ring,
size * sizeof(jack_midi_data_t));
} }
return event; return event;
} }
@@ -82,11 +79,16 @@ Jack::JackMidiWriteQueue::EnqueueResult
JackMidiAsyncQueue::EnqueueEvent(jack_nframes_t time, size_t size, JackMidiAsyncQueue::EnqueueEvent(jack_nframes_t time, size_t size,
jack_midi_data_t *buffer) jack_midi_data_t *buffer)
{ {
if (size > max_bytes) {
return BUFFER_TOO_SMALL;
}
if (! ((jack_ringbuffer_write_space(info_ring) >= INFO_SIZE) && if (! ((jack_ringbuffer_write_space(info_ring) >= INFO_SIZE) &&
(jack_ringbuffer_write_space(byte_ring) >= size))) {
return size > max_bytes ? BUFFER_TOO_SMALL : BUFFER_FULL;
(jack_ringbuffer_write_space(byte_ring) >=
(size * sizeof(jack_midi_data_t))))) {
return BUFFER_FULL;
} }
jack_ringbuffer_write(byte_ring, (const char *) buffer, size);
jack_ringbuffer_write(byte_ring, (const char *) buffer,
size * sizeof(jack_midi_data_t));
jack_ringbuffer_write(info_ring, (const char *) (&time), jack_ringbuffer_write(info_ring, (const char *) (&time),
sizeof(jack_nframes_t)); sizeof(jack_nframes_t));
jack_ringbuffer_write(info_ring, (const char *) (&size), sizeof(size_t)); jack_ringbuffer_write(info_ring, (const char *) (&size), sizeof(size_t));


+ 0
- 1
common/JackMidiAsyncQueue.h View File

@@ -46,7 +46,6 @@ namespace Jack {
static const size_t INFO_SIZE = static const size_t INFO_SIZE =
sizeof(jack_nframes_t) + sizeof(size_t); sizeof(jack_nframes_t) + sizeof(size_t);


size_t advance_space;
jack_ringbuffer_t *byte_ring; jack_ringbuffer_t *byte_ring;
jack_midi_data_t *data_buffer; jack_midi_data_t *data_buffer;
jack_midi_event_t dequeue_event; jack_midi_event_t dequeue_event;


+ 3
- 4
example-clients/midi_latency_test.c View File

@@ -554,10 +554,9 @@ main(int argc, char **argv)
if (jitter_plot[100]) { if (jitter_plot[100]) {
printf(" > 10 ms: %u\n", jitter_plot[100]); printf(" > 10 ms: %u\n", jitter_plot[100]);
} }
if (unexpected_messages) {
printf("\nUnexpected messages received: %d\n",
unexpected_messages);
}
}
if (unexpected_messages) {
printf("\nUnexpected messages received: %d\n", unexpected_messages);
} }
deactivate_client: deactivate_client:
jack_deactivate(client); jack_deactivate(client);


+ 2
- 2
linux/firewire/JackFFADOMidiOutputPort.cpp View File

@@ -33,9 +33,9 @@ JackFFADOMidiOutputPort::JackFFADOMidiOutputPort(size_t non_rt_size,
std::auto_ptr<JackMidiBufferReadQueue> read_queue_ptr(read_queue); std::auto_ptr<JackMidiBufferReadQueue> read_queue_ptr(read_queue);
send_queue = new JackFFADOMidiSendQueue(); send_queue = new JackFFADOMidiSendQueue();
std::auto_ptr<JackFFADOMidiSendQueue> send_queue_ptr(send_queue); std::auto_ptr<JackFFADOMidiSendQueue> send_queue_ptr(send_queue);
raw_queue = new JackMidiRawOutputWriteQueue(send_queue, max_rt_messages,
raw_queue = new JackMidiRawOutputWriteQueue(send_queue, non_rt_size,
max_non_rt_messages, max_non_rt_messages,
non_rt_size);
max_rt_messages);
send_queue_ptr.release(); send_queue_ptr.release();
read_queue_ptr.release(); read_queue_ptr.release();
} }


+ 6
- 1
linux/firewire/JackFFADOMidiReceiveQueue.cpp View File

@@ -24,7 +24,7 @@ using Jack::JackFFADOMidiReceiveQueue;


JackFFADOMidiReceiveQueue::JackFFADOMidiReceiveQueue() JackFFADOMidiReceiveQueue::JackFFADOMidiReceiveQueue()
{ {
// Empty
bytes_received = 0;
} }


jack_midi_event_t * jack_midi_event_t *
@@ -38,6 +38,11 @@ JackFFADOMidiReceiveQueue::DequeueEvent()
event.size = 1; event.size = 1;
event.time = last_frame + index; event.time = last_frame + index;
index += 8; index += 8;
bytes_received++;

jack_info("Jack::JackFFADOMidiReceiveQueue: %d bytes received",
bytes_received);

return &event; return &event;
} }
} }


+ 2
- 0
linux/firewire/JackFFADOMidiReceiveQueue.h View File

@@ -28,6 +28,8 @@ namespace Jack {


private: private:


unsigned long bytes_received;

jack_midi_data_t byte; jack_midi_data_t byte;
jack_midi_event_t event; jack_midi_event_t event;
jack_nframes_t index; jack_nframes_t index;


+ 5
- 1
linux/firewire/JackFFADOMidiSendQueue.cpp View File

@@ -26,7 +26,7 @@ using Jack::JackFFADOMidiSendQueue;


JackFFADOMidiSendQueue::JackFFADOMidiSendQueue() JackFFADOMidiSendQueue::JackFFADOMidiSendQueue()
{ {
// Empty
bytes_sent = 0;
} }


Jack::JackMidiWriteQueue::EnqueueResult Jack::JackMidiWriteQueue::EnqueueResult
@@ -44,6 +44,10 @@ JackFFADOMidiSendQueue::EnqueueEvent(jack_nframes_t time, size_t size,
} }
output_buffer[index] = 0x01000000 | ((uint32_t) *buffer); output_buffer[index] = 0x01000000 | ((uint32_t) *buffer);
index += 8; index += 8;

bytes_sent++;
jack_info("Jack::JackFFADOMidiSendQueue: %d bytes sent", bytes_sent);

return OK; return OK;
} }




+ 2
- 0
linux/firewire/JackFFADOMidiSendQueue.h View File

@@ -28,6 +28,8 @@ namespace Jack {


private: private:


unsigned long bytes_sent;

jack_nframes_t index; jack_nframes_t index;
jack_nframes_t last_frame; jack_nframes_t last_frame;
jack_nframes_t length; jack_nframes_t length;


Loading…
Cancel
Save