我想通过 ALSA 定序器发送大型 SysEx 消息(可以是几兆字节):目前我将它们分成几个 ALSA 事件,并像这样在一个循环中发送它们:
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);
}
此循环确保所有事件都从发送客户端/端口发送。但是一旦 snd_seq_event_output_direct 返回 -EAGAIN,接收客户端的输入池就会被清空,无条件地丢弃大约 70 个事件,而不仅仅是被拒绝的数据包。由于发送客户端没有关于发送到接收客户端的事件的信息,它无法知道有多少数据包丢失并重新传输。
有人建议将传输速率限制为 MIDI 1.0 硬件规范定义的 31.25 kbit/s。但这不一定是一个好主意,因为 MIDI 协议和传输速度实际上已经被更快的以太网、蓝牙和 USB 硬件层的支持所分割。MIDI 2.0 规范明确独立于传输速率,并建议开发/使用具有更高传输速率的硬件层。
所以我的问题是:如何在不人为限制传输的情况下可靠地将大量 MIDI 数据至少传输到软件客户端?
我想偷看接收客户端的输入池,但我不知道该怎么做。到目前为止,我可以找到有关接收端口的输入队列的信息,但我不知道如何处理。