Очередь секвенсора ALSA не запускается

В моем примере кода используется snd_seq_queue_status_get_tick_time() для проверки работающей очереди. Но в результате он всегда сообщает о нулевом времени тика.

#include <stdio.h>
#include <alsa/asoundlib.h>

int queue;
snd_seq_t *seq_handle;
snd_seq_tick_time_t current_tick;
snd_seq_queue_status_t *status;

int main (int argc, char **argv) {

    snd_seq_open(&seq_handle, "default", SND_SEQ_OPEN_INPUT | SND_SEQ_OPEN_OUTPUT, 0);
    queue = snd_seq_alloc_queue( seq_handle );
    fprintf(stderr,"queue id=%d\n", queue);

    snd_seq_start_queue( seq_handle, queue, NULL );

    for(int i=0;i<4;i++) {
        snd_seq_queue_status_malloc(&status);
        snd_seq_get_queue_status(seq_handle, queue, status);
        current_tick = snd_seq_queue_status_get_tick_time(status);
        snd_seq_queue_status_free(status);

        fprintf(stderr,"tick=%d\n", current_tick );
        sleep(1);
    }

    snd_seq_stop_queue( seq_handle, queue, NULL );
    snd_seq_free_queue( seq_handle, queue );
    return 0;
}

person johnnyO    schedule 19.05.2018    source источник


Ответы (1)


Как показано на /proc/asound/seq/queues, очередь никогда не запускалась.

snd_seq_start_queue() помещает событие начала очереди в локальный буфер; чтобы фактически отправить все буферизованные события в ядро, вам нужно вызвать snd_seq_drain_output():

    snd_seq_start_queue( seq_handle, queue, NULL );
    snd_seq_drain_output( seq_handle );
person CL.    schedule 19.05.2018