1

背景

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

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

据我了解,队列不像缓冲区,而是需要管理定时事件(需要队列来发送具有持续时间的便笺的原因),所以我知道需要发送带有特定演示文稿的一些事件(带有开始和/或结束时间)。

问题

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

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

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

附件

上面提到的片段:

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);
}
4

1 回答 1

1

没有默认队列。

一个事件总是必须指定发送它的队列(这可以通过snd_seq_ev_schedule_tick()snd_seq_ev_schedule_real()完成),或者它必须将队列字段设置为SND_SEQ_QUEUE_DIRECT以指定不使用队列(这可以是用snd_seq_ev_set_direct()完成)。

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

于 2015-06-05T07:04:18.627 回答