|
@@ -87,7 +87,7 @@ void snd_seq_prioq_delete(struct snd_seq_prioq **fifo)
|
|
|
if (f->cells > 0) {
|
|
|
/* drain prioQ */
|
|
|
while (f->cells > 0)
|
|
|
- snd_seq_cell_free(snd_seq_prioq_cell_out(f));
|
|
|
+ snd_seq_cell_free(snd_seq_prioq_cell_out(f, NULL));
|
|
|
}
|
|
|
|
|
|
kfree(f);
|
|
@@ -214,8 +214,18 @@ int snd_seq_prioq_cell_in(struct snd_seq_prioq * f,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/* return 1 if the current time >= event timestamp */
|
|
|
+static int event_is_ready(struct snd_seq_event *ev, void *current_time)
|
|
|
+{
|
|
|
+ if ((ev->flags & SNDRV_SEQ_TIME_STAMP_MASK) == SNDRV_SEQ_TIME_STAMP_TICK)
|
|
|
+ return snd_seq_compare_tick_time(current_time, &ev->time.tick);
|
|
|
+ else
|
|
|
+ return snd_seq_compare_real_time(current_time, &ev->time.time);
|
|
|
+}
|
|
|
+
|
|
|
/* dequeue cell from prioq */
|
|
|
-struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f)
|
|
|
+struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f,
|
|
|
+ void *current_time)
|
|
|
{
|
|
|
struct snd_seq_event_cell *cell;
|
|
|
unsigned long flags;
|
|
@@ -227,6 +237,8 @@ struct snd_seq_event_cell *snd_seq_prioq_cell_out(struct snd_seq_prioq *f)
|
|
|
spin_lock_irqsave(&f->lock, flags);
|
|
|
|
|
|
cell = f->head;
|
|
|
+ if (cell && current_time && !event_is_ready(&cell->event, current_time))
|
|
|
+ cell = NULL;
|
|
|
if (cell) {
|
|
|
f->head = cell->next;
|
|
|
|
|
@@ -252,18 +264,6 @@ int snd_seq_prioq_avail(struct snd_seq_prioq * f)
|
|
|
return f->cells;
|
|
|
}
|
|
|
|
|
|
-
|
|
|
-/* peek at cell at the head of the prioq */
|
|
|
-struct snd_seq_event_cell *snd_seq_prioq_cell_peek(struct snd_seq_prioq * f)
|
|
|
-{
|
|
|
- if (f == NULL) {
|
|
|
- pr_debug("ALSA: seq: snd_seq_prioq_cell_in() called with NULL prioq\n");
|
|
|
- return NULL;
|
|
|
- }
|
|
|
- return f->head;
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
static inline int prioq_match(struct snd_seq_event_cell *cell,
|
|
|
int client, int timestamp)
|
|
|
{
|