Секвенсор ALSA: избегайте переполнения входного буфера с помощью высокоскоростного MIDI - PullRequest
0 голосов
/ 31 марта 2020

Я хочу отправлять большие сообщения SysEx (которые могут составлять несколько мегабайт) через секвенсор ALSA: в настоящее время я разбил их на несколько событий ALSA и отправил каждое из них в oop следующим образом:

    while (1) {
      result = snd_seq_event_output_direct( seq, const_cast<snd_seq_event_t*>(&ev) );
      if (result != -EAGAIN && result != -EWOULDBLOCK)
        break;
      snd_seq_sync_output_queue( seq );
      //std::this_thread::sleep_for(sleeptime);
    }

Этот l oop обеспечивает отправку всех событий от отправляющего клиента / порта. Но как только snd_seq_event_output_direct возвращает -EAGAIN, входной пул получающего клиента очищается, безоговорочно выбрасывая около 70 событий, а не только отклоненный пакет. Поскольку отправляющий клиент не имеет информации о событиях, которые были отправлены принимающему клиенту, он не может знать, сколько пакетов было потеряно и передано повторно.

Некоторые люди предлагают ограничить скорость передачи до 31,25 кбит / с. определяется спецификацией MIDI 1.0. Но это не обязательно хорошая идея, поскольку протокол MIDI и скорость передачи практически разделены поддержкой аппаратных уровней Ethe rnet, Bluetooth и USB, которые намного быстрее. Спецификация MIDI 2.0 явно не зависит от скорости передачи и предлагает разрабатывать / использовать аппаратные уровни с более высокими скоростями передачи.

Поэтому мой вопрос: как я могу надежно доставлять большие объемы данных MIDI по крайней мере в программное обеспечение? клиенты без искусственного ограничения передачи?

Я думал о том, чтобы заглянуть в пул ввода получающего клиента, но я не знаю, как это сделать. Пока я могу найти информацию о входной очереди принимающего порта, но я не знаю, как с этим справиться.

1 Ответ

0 голосов
/ 31 марта 2020

Секвенсор ALSA был разработан для отправки сообщений в режиме реального времени. Невозможно ограничить передачу в зависимости от состояния буфера приемника.

Если вы не хотите ограничивать скорость до уровня MIDI 1.0, тогда ваш единственный выбор - использовать вместо этого интерфейс ALSA RawMIDI.

...