Lines Matching refs:q

50 static int queue_list_add(struct snd_seq_queue *q)  in queue_list_add()  argument
57 queue_list[i] = q; in queue_list_add()
58 q->queue = i; in queue_list_add()
68 struct snd_seq_queue *q; in queue_list_remove() local
71 q = queue_list[id]; in queue_list_remove()
72 if (q) { in queue_list_remove()
73 guard(spinlock)(&q->owner_lock); in queue_list_remove()
74 if (q->owner == client) { in queue_list_remove()
76 q->klocked = 1; in queue_list_remove()
79 return q; in queue_list_remove()
90 struct snd_seq_queue *q; in queue_new() local
92 q = kzalloc(sizeof(*q), GFP_KERNEL); in queue_new()
93 if (!q) in queue_new()
96 spin_lock_init(&q->owner_lock); in queue_new()
97 spin_lock_init(&q->check_lock); in queue_new()
98 mutex_init(&q->timer_mutex); in queue_new()
99 snd_use_lock_init(&q->use_lock); in queue_new()
100 q->queue = -1; in queue_new()
102 q->tickq = snd_seq_prioq_new(); in queue_new()
103 q->timeq = snd_seq_prioq_new(); in queue_new()
104 q->timer = snd_seq_timer_new(); in queue_new()
105 if (q->tickq == NULL || q->timeq == NULL || q->timer == NULL) { in queue_new()
106 snd_seq_prioq_delete(&q->tickq); in queue_new()
107 snd_seq_prioq_delete(&q->timeq); in queue_new()
108 snd_seq_timer_delete(&q->timer); in queue_new()
109 kfree(q); in queue_new()
113 q->owner = owner; in queue_new()
114 q->locked = locked; in queue_new()
115 q->klocked = 0; in queue_new()
117 return q; in queue_new()
121 static void queue_delete(struct snd_seq_queue *q) in queue_delete() argument
124 mutex_lock(&q->timer_mutex); in queue_delete()
125 snd_seq_timer_stop(q->timer); in queue_delete()
126 snd_seq_timer_close(q); in queue_delete()
127 mutex_unlock(&q->timer_mutex); in queue_delete()
129 snd_use_lock_sync(&q->use_lock); in queue_delete()
131 snd_seq_prioq_delete(&q->tickq); in queue_delete()
132 snd_seq_prioq_delete(&q->timeq); in queue_delete()
133 snd_seq_timer_delete(&q->timer); in queue_delete()
135 kfree(q); in queue_delete()
162 struct snd_seq_queue *q; in snd_seq_queue_alloc() local
164 q = queue_new(client, locked); in snd_seq_queue_alloc()
165 if (q == NULL) in snd_seq_queue_alloc()
167 q->info_flags = info_flags; in snd_seq_queue_alloc()
168 queue_use(q, client, 1); in snd_seq_queue_alloc()
169 snd_use_lock_use(&q->use_lock); in snd_seq_queue_alloc()
170 if (queue_list_add(q) < 0) { in snd_seq_queue_alloc()
171 snd_use_lock_free(&q->use_lock); in snd_seq_queue_alloc()
172 queue_delete(q); in snd_seq_queue_alloc()
175 return q; in snd_seq_queue_alloc()
181 struct snd_seq_queue *q; in snd_seq_queue_delete() local
185 q = queue_list_remove(queueid, client); in snd_seq_queue_delete()
186 if (q == NULL) in snd_seq_queue_delete()
188 queue_delete(q); in snd_seq_queue_delete()
197 struct snd_seq_queue *q; in queueptr() local
202 q = queue_list[queueid]; in queueptr()
203 if (q) in queueptr()
204 snd_use_lock_use(&q->use_lock); in queueptr()
205 return q; in queueptr()
214 struct snd_seq_queue *q __free(snd_seq_queue) = NULL; in snd_seq_queue_find_name()
215 q = queueptr(i); in snd_seq_queue_find_name()
216 if (q) { in snd_seq_queue_find_name()
217 if (strncmp(q->name, name, sizeof(q->name)) == 0) in snd_seq_queue_find_name()
218 return no_free_ptr(q); in snd_seq_queue_find_name()
229 void snd_seq_check_queue(struct snd_seq_queue *q, int atomic, int hop) in snd_seq_check_queue() argument
236 if (q == NULL) in snd_seq_check_queue()
240 scoped_guard(spinlock_irqsave, &q->check_lock) { in snd_seq_check_queue()
241 if (q->check_blocked) { in snd_seq_check_queue()
242 q->check_again = 1; in snd_seq_check_queue()
245 q->check_blocked = 1; in snd_seq_check_queue()
250 cur_tick = snd_seq_timer_get_cur_tick(q->timer); in snd_seq_check_queue()
252 cell = snd_seq_prioq_cell_out(q->tickq, &cur_tick); in snd_seq_check_queue()
261 cur_time = snd_seq_timer_get_cur_time(q->timer, false); in snd_seq_check_queue()
263 cell = snd_seq_prioq_cell_out(q->timeq, &cur_time); in snd_seq_check_queue()
273 scoped_guard(spinlock_irqsave, &q->check_lock) { in snd_seq_check_queue()
274 if (q->check_again) { in snd_seq_check_queue()
275 q->check_again = 0; in snd_seq_check_queue()
279 q->check_blocked = 0; in snd_seq_check_queue()
288 struct snd_seq_queue *q __free(snd_seq_queue) = NULL; in snd_seq_enqueue_event()
293 q = queueptr(dest); in snd_seq_enqueue_event()
294 if (q == NULL) in snd_seq_enqueue_event()
300 cell->event.time.tick += q->timer->tick.cur_tick; in snd_seq_enqueue_event()
305 &q->timer->cur_time); in snd_seq_enqueue_event()
314 err = snd_seq_prioq_cell_in(q->tickq, cell); in snd_seq_enqueue_event()
319 err = snd_seq_prioq_cell_in(q->timeq, cell); in snd_seq_enqueue_event()
327 snd_seq_check_queue(q, atomic, hop); in snd_seq_enqueue_event()
335 static inline int check_access(struct snd_seq_queue *q, int client) in check_access() argument
337 return (q->owner == client) || (!q->locked && !q->klocked); in check_access()
343 static int queue_access_lock(struct snd_seq_queue *q, int client) in queue_access_lock() argument
347 guard(spinlock_irqsave)(&q->owner_lock); in queue_access_lock()
348 access_ok = check_access(q, client); in queue_access_lock()
350 q->klocked = 1; in queue_access_lock()
355 static inline void queue_access_unlock(struct snd_seq_queue *q) in queue_access_unlock() argument
357 guard(spinlock_irqsave)(&q->owner_lock); in queue_access_unlock()
358 q->klocked = 0; in queue_access_unlock()
364 struct snd_seq_queue *q __free(snd_seq_queue) = queueptr(queueid); in snd_seq_queue_check_access()
366 if (! q) in snd_seq_queue_check_access()
368 guard(spinlock_irqsave)(&q->owner_lock); in snd_seq_queue_check_access()
369 return check_access(q, client); in snd_seq_queue_check_access()
379 struct snd_seq_queue *q __free(snd_seq_queue) = queueptr(queueid); in snd_seq_queue_set_owner()
381 if (q == NULL) in snd_seq_queue_set_owner()
384 if (!queue_access_lock(q, client)) in snd_seq_queue_set_owner()
387 scoped_guard(spinlock_irqsave, &q->owner_lock) { in snd_seq_queue_set_owner()
388 q->locked = locked ? 1 : 0; in snd_seq_queue_set_owner()
389 q->owner = client; in snd_seq_queue_set_owner()
391 queue_access_unlock(q); in snd_seq_queue_set_owner()
440 struct snd_seq_queue *q __free(snd_seq_queue) = queueptr(queueid); in snd_seq_queue_timer_set_tempo()
443 if (q == NULL) in snd_seq_queue_timer_set_tempo()
445 if (!queue_access_lock(q, client)) in snd_seq_queue_timer_set_tempo()
448 result = snd_seq_timer_set_tempo_ppq(q->timer, info->tempo, info->ppq, in snd_seq_queue_timer_set_tempo()
451 result = snd_seq_timer_set_skew(q->timer, info->skew_value, in snd_seq_queue_timer_set_tempo()
453 queue_access_unlock(q); in snd_seq_queue_timer_set_tempo()
499 struct snd_seq_queue *q __free(snd_seq_queue) = NULL; in snd_seq_queue_is_used()
501 q = queueptr(queueid); in snd_seq_queue_is_used()
502 if (q == NULL) in snd_seq_queue_is_used()
504 return test_bit(client, q->clients_bitmap) ? 1 : 0; in snd_seq_queue_is_used()
520 struct snd_seq_queue *q = queue_list_remove(i, client); in snd_seq_queue_client_leave() local
521 if (q) in snd_seq_queue_client_leave()
522 queue_delete(q); in snd_seq_queue_client_leave()
529 struct snd_seq_queue *q __free(snd_seq_queue) = queueptr(i); in snd_seq_queue_client_leave()
530 if (!q) in snd_seq_queue_client_leave()
532 if (test_bit(client, q->clients_bitmap)) { in snd_seq_queue_client_leave()
533 snd_seq_prioq_leave(q->tickq, client, 0); in snd_seq_queue_client_leave()
534 snd_seq_prioq_leave(q->timeq, client, 0); in snd_seq_queue_client_leave()
535 snd_seq_queue_use(q->queue, client, 0); in snd_seq_queue_client_leave()
550 struct snd_seq_queue *q __free(snd_seq_queue) = queueptr(i); in snd_seq_queue_remove_cells()
551 if (!q) in snd_seq_queue_remove_cells()
553 if (test_bit(client, q->clients_bitmap) && in snd_seq_queue_remove_cells()
555 q->queue == info->queue)) { in snd_seq_queue_remove_cells()
556 snd_seq_prioq_remove_events(q->tickq, client, info); in snd_seq_queue_remove_cells()
557 snd_seq_prioq_remove_events(q->timeq, client, info); in snd_seq_queue_remove_cells()
567 static void queue_broadcast_event(struct snd_seq_queue *q, struct snd_seq_event *ev, in queue_broadcast_event() argument
575 sev.time.tick = q->timer->tick.cur_tick; in queue_broadcast_event()
576 sev.queue = q->queue; in queue_broadcast_event()
577 sev.data.queue.queue = q->queue; in queue_broadcast_event()
590 static void snd_seq_queue_process_event(struct snd_seq_queue *q, in snd_seq_queue_process_event() argument
596 snd_seq_prioq_leave(q->tickq, ev->source.client, 1); in snd_seq_queue_process_event()
597 snd_seq_prioq_leave(q->timeq, ev->source.client, 1); in snd_seq_queue_process_event()
598 if (! snd_seq_timer_start(q->timer)) in snd_seq_queue_process_event()
599 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
603 if (! snd_seq_timer_continue(q->timer)) in snd_seq_queue_process_event()
604 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
608 snd_seq_timer_stop(q->timer); in snd_seq_queue_process_event()
609 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
613 snd_seq_timer_set_tempo(q->timer, ev->data.queue.param.value); in snd_seq_queue_process_event()
614 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
618 if (snd_seq_timer_set_position_tick(q->timer, ev->data.queue.param.time.tick) == 0) { in snd_seq_queue_process_event()
619 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
624 if (snd_seq_timer_set_position_time(q->timer, ev->data.queue.param.time.time) == 0) { in snd_seq_queue_process_event()
625 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
629 if (snd_seq_timer_set_skew(q->timer, in snd_seq_queue_process_event()
632 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
645 struct snd_seq_queue *q __free(snd_seq_queue) = NULL; in snd_seq_control_queue()
649 q = queueptr(ev->data.queue.queue); in snd_seq_control_queue()
651 if (q == NULL) in snd_seq_control_queue()
654 if (!queue_access_lock(q, ev->source.client)) in snd_seq_control_queue()
657 snd_seq_queue_process_event(q, ev, atomic, hop); in snd_seq_control_queue()
659 queue_access_unlock(q); in snd_seq_control_queue()
677 struct snd_seq_queue *q __free(snd_seq_queue) = queueptr(i); in snd_seq_info_queues_read()
678 if (!q) in snd_seq_info_queues_read()
681 tmr = q->timer; in snd_seq_info_queues_read()
687 scoped_guard(spinlock_irq, &q->owner_lock) { in snd_seq_info_queues_read()
688 locked = q->locked; in snd_seq_info_queues_read()
689 owner = q->owner; in snd_seq_info_queues_read()
692 snd_iprintf(buffer, "queue %d: [%s]\n", q->queue, q->name); in snd_seq_info_queues_read()
695 snd_iprintf(buffer, "queued time events : %d\n", snd_seq_prioq_avail(q->timeq)); in snd_seq_info_queues_read()
696 snd_iprintf(buffer, "queued tick events : %d\n", snd_seq_prioq_avail(q->tickq)); in snd_seq_info_queues_read()