【问题标题】:How to understand the seemingly default/implicit ALSA MIDI default queue?如何理解看似默认/隐式的 ALSA MIDI 默认队列?
【发布时间】:2015-06-05 23:53:55
【问题描述】:

背景

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

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

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

问题

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

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

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

附件

上面提到的sn-p:

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

【问题讨论】:

    标签: midi libalsa


    【解决方案1】:

    没有默认队列。

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

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

    【讨论】:

    • 我使用snd_seq_ev_set_direct(&ev);ev.queue = SND_SEQ_QUEUE_DIRECT; 进行了检查,当未使用snd_seq_ev_set_note 设置注释并且仅设置了ev.data.note.channelev.data.note.noteev.data.note.velocity 时,是可以的。
    猜你喜欢
    • 1970-01-01
    • 2013-03-28
    • 2020-02-25
    • 2021-01-15
    • 2017-07-01
    • 2012-05-30
    • 1970-01-01
    • 1970-01-01
    • 2021-04-30
    相关资源
    最近更新 更多