如何理解看似default/implicit的ALSA MIDI默认队列?

How to understand the seemingly default/implicit ALSA MIDI default queue?

背景

在下面的代码片段中,我将带有持续时间的 MIDI 音符发送到合成器端口。为此,我需要分配并启动一个队列,否则我会收到“无效参数”。 (错误代码 -22)来自 ALSA。

发送事件的操作,正确的,没有引用队列,这似乎是隐式引用的。但是,一个MIDI应用程序可能有多个队列,我也很纳闷。

在我的理解中,队列不像缓冲区,而是需要管理定时事件(为什么需要队列来发送带有持续时间的注释的原因),所以我理解需要一个来发送一些具有特定演示文稿的事件(开始 and/or 结束时间)。

问题

当发送事件时没有明确引用队列时,如何确定看似默认的队列?

在上述问题的上下文中,当应用程序创建多个队列时究竟发生了什么?是隐含的,第一个?

在我创建一个默认队列之前是否已经有一个默认队列,我可以启动它而不是一个(唯一的)新创建的队列?

附件

上面提到的片段:

static void test_send(void) {

   snd_seq_event_t ev;
   int queue = snd_seq_alloc_queue(seq);
   check_error(queue, "snd_seq_alloc_queue");

   snd_seq_start_queue(seq, queue, NULL);

   snd_seq_ev_clear(&ev);
   snd_seq_ev_set_note(&ev, 0, 64, 127, 1);
   snd_seq_ev_set_source(&ev, out_port);
   snd_seq_ev_set_dest(&ev, synth_addr.client, synth_addr.port);

   int status = snd_seq_event_output_direct(seq, &ev);
   check_error(status, "snd_seq_event_output_direct");

   snd_seq_free_queue(seq, queue);
}

没有默认队列。

事件始终必须指定发送事件的队列(这可以通过 snd_seq_ev_schedule_tick() or snd_seq_ev_schedule_real()), or it must set the queue field to SND_SEQ_QUEUE_DIRECT to specify that no queue is to be used (this can be done with snd_seq_ev_set_direct() 完成)。

当您忘记设置事件的队列字段时,它会保持为零,这恰好是您的队列编号。