+start_queue_timer (snd_seq_t *seq, int queue)
+{
+ int ret;
+
+ ret = snd_seq_start_queue (seq, queue, NULL);
+ if (ret < 0) {
+ GST_ERROR ("Timer event output error: %s\n", snd_strerror (ret));
+ return ret;
+ }
+
+ ret = snd_seq_drain_output (seq);
+ if (ret < 0)
+ GST_ERROR ("Drain output error: %s\n", snd_strerror (ret));
+
+ return ret;
+}
+
+static void
+schedule_tick (App * app)
+{
+ snd_seq_event_t ev;
+ snd_seq_real_time_t time;
+ int ret;
+
+ snd_seq_ev_clear (&ev);
+ snd_seq_ev_set_source (&ev, 0);
+ snd_seq_ev_set_dest (&ev, snd_seq_client_id (app->seq), 0);
+
+ ev.type = SND_SEQ_EVENT_TICK;
+
+ GST_TIME_TO_TIMESPEC (app->tick * DEFAULT_TICK_PERIOD_MS * GST_MSECOND, time);
+ app->tick += 1;
+
+ snd_seq_ev_schedule_real (&ev, app->queue, 0, &time);
+
+ ret = snd_seq_event_output (app->seq, &ev);
+ if (ret < 0)
+ GST_ERROR ("Event output error: %s\n", snd_strerror (ret));
+
+ ret = snd_seq_drain_output (app->seq);
+ if (ret < 0)
+ GST_ERROR ("Event drain error: %s\n", snd_strerror (ret));
+}
+
+static int