Я хочу отправлять большие сообщения 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 по крайней мере в программное обеспечение? клиенты без искусственного ограничения передачи?
Я думал о том, чтобы заглянуть в пул ввода получающего клиента, но я не знаю, как это сделать. Пока я могу найти информацию о входной очереди принимающего порта, но я не знаю, как с этим справиться.