События JACK MIDI теряются на 64-битных машинах - PullRequest
2 голосов
/ 27 июня 2011

У меня есть приложение, использующее JACK MIDI под Linux.Он отлично работает на 32-битных машинах, но на моей новой, которая является 64-битной, я постоянно получаю потери событий.

Я проверил:

  • Значения, поступающие с jack_ringbuffer_read они в порядке (допустимые 2-3 байтовые MIDI-сообщения);
  • midi_out_port и client, они в порядке (не нулевые) и отображаются в моем списке портов JACK;

Вот часть кода:

#define MidiMessageSize 3

jack_client_t* client;
jack_port_t* midi_out_port;

char current_message[MidiMessageSize];

jack_ringbuffer_t* midi_rb;

int process (jack_nframes_t nframes, void *arg)
{
  void* output_buffer = jack_port_get_buffer(midi_out_port, nframes);

  jack_midi_clear_buffer(output_buffer);

  int read_space = jack_ringbuffer_read_space(midi_rb);

  if (read_space == 0) return 0;

  int i;

  for (i = 0; i < read_space; i += MidiMessageSize)
  {
    jack_ringbuffer_read(midi_rb, current_message, MidiMessageSize);
    jack_midi_event_write(output_buffer, i/MidiMessageSize,
               (jack_midi_data_t*)current_message, MidiMessageSize);
    if (jack_midi_get_lost_event_count(midi_out_port)) {
      printf("Lost\n"); // I get here always
    }
  }  

  jack_ringbuffer_reset(midi_rb);

  return 0;
}

Что может быть не так?

Спасибо,

1 Ответ

2 голосов
/ 04 июля 2011

Как ни странно, JACK (последняя версия) отправляет все MIDI-события правильно, но jack_midi_get_lost_event_count всегда возвращает меня 1. Просто проигнорировал это, и теперь мой код работает.Тем не менее, в 32-битной версии этого не происходит, но в любом случае сейчас это работает.

...