Lines Matching full:q
50 static int queue_list_add(struct snd_seq_queue *q) in queue_list_add() argument
58 queue_list[i] = q; in queue_list_add()
59 q->queue = i; in queue_list_add()
71 struct snd_seq_queue *q; in queue_list_remove() local
75 q = queue_list[id]; in queue_list_remove()
76 if (q) { in queue_list_remove()
77 spin_lock(&q->owner_lock); in queue_list_remove()
78 if (q->owner == client) { in queue_list_remove()
80 q->klocked = 1; in queue_list_remove()
81 spin_unlock(&q->owner_lock); in queue_list_remove()
85 return q; in queue_list_remove()
87 spin_unlock(&q->owner_lock); in queue_list_remove()
98 struct snd_seq_queue *q; in queue_new() local
100 q = kzalloc(sizeof(*q), GFP_KERNEL); in queue_new()
101 if (!q) in queue_new()
104 spin_lock_init(&q->owner_lock); in queue_new()
105 spin_lock_init(&q->check_lock); in queue_new()
106 mutex_init(&q->timer_mutex); in queue_new()
107 snd_use_lock_init(&q->use_lock); in queue_new()
108 q->queue = -1; in queue_new()
110 q->tickq = snd_seq_prioq_new(); in queue_new()
111 q->timeq = snd_seq_prioq_new(); in queue_new()
112 q->timer = snd_seq_timer_new(); in queue_new()
113 if (q->tickq == NULL || q->timeq == NULL || q->timer == NULL) { in queue_new()
114 snd_seq_prioq_delete(&q->tickq); in queue_new()
115 snd_seq_prioq_delete(&q->timeq); in queue_new()
116 snd_seq_timer_delete(&q->timer); in queue_new()
117 kfree(q); in queue_new()
121 q->owner = owner; in queue_new()
122 q->locked = locked; in queue_new()
123 q->klocked = 0; in queue_new()
125 return q; in queue_new()
129 static void queue_delete(struct snd_seq_queue *q) in queue_delete() argument
132 mutex_lock(&q->timer_mutex); in queue_delete()
133 snd_seq_timer_stop(q->timer); in queue_delete()
134 snd_seq_timer_close(q); in queue_delete()
135 mutex_unlock(&q->timer_mutex); in queue_delete()
137 snd_use_lock_sync(&q->use_lock); in queue_delete()
139 snd_seq_prioq_delete(&q->tickq); in queue_delete()
140 snd_seq_prioq_delete(&q->timeq); in queue_delete()
141 snd_seq_timer_delete(&q->timer); in queue_delete()
143 kfree(q); in queue_delete()
166 * call snd_use_lock_free(&q->use_lock).
170 struct snd_seq_queue *q; in snd_seq_queue_alloc() local
172 q = queue_new(client, locked); in snd_seq_queue_alloc()
173 if (q == NULL) in snd_seq_queue_alloc()
175 q->info_flags = info_flags; in snd_seq_queue_alloc()
176 queue_use(q, client, 1); in snd_seq_queue_alloc()
177 snd_use_lock_use(&q->use_lock); in snd_seq_queue_alloc()
178 if (queue_list_add(q) < 0) { in snd_seq_queue_alloc()
179 snd_use_lock_free(&q->use_lock); in snd_seq_queue_alloc()
180 queue_delete(q); in snd_seq_queue_alloc()
183 return q; in snd_seq_queue_alloc()
189 struct snd_seq_queue *q; in snd_seq_queue_delete() local
193 q = queue_list_remove(queueid, client); in snd_seq_queue_delete()
194 if (q == NULL) in snd_seq_queue_delete()
196 queue_delete(q); in snd_seq_queue_delete()
205 struct snd_seq_queue *q; in queueptr() local
211 q = queue_list[queueid]; in queueptr()
212 if (q) in queueptr()
213 snd_use_lock_use(&q->use_lock); in queueptr()
215 return q; in queueptr()
222 struct snd_seq_queue *q; in snd_seq_queue_find_name() local
225 if ((q = queueptr(i)) != NULL) { in snd_seq_queue_find_name()
226 if (strncmp(q->name, name, sizeof(q->name)) == 0) in snd_seq_queue_find_name()
227 return q; in snd_seq_queue_find_name()
228 queuefree(q); in snd_seq_queue_find_name()
237 void snd_seq_check_queue(struct snd_seq_queue *q, int atomic, int hop) in snd_seq_check_queue() argument
244 if (q == NULL) in snd_seq_check_queue()
248 spin_lock_irqsave(&q->check_lock, flags); in snd_seq_check_queue()
249 if (q->check_blocked) { in snd_seq_check_queue()
250 q->check_again = 1; in snd_seq_check_queue()
251 spin_unlock_irqrestore(&q->check_lock, flags); in snd_seq_check_queue()
254 q->check_blocked = 1; in snd_seq_check_queue()
255 spin_unlock_irqrestore(&q->check_lock, flags); in snd_seq_check_queue()
259 cur_tick = snd_seq_timer_get_cur_tick(q->timer); in snd_seq_check_queue()
261 cell = snd_seq_prioq_cell_out(q->tickq, &cur_tick); in snd_seq_check_queue()
268 cur_time = snd_seq_timer_get_cur_time(q->timer, false); in snd_seq_check_queue()
270 cell = snd_seq_prioq_cell_out(q->timeq, &cur_time); in snd_seq_check_queue()
277 spin_lock_irqsave(&q->check_lock, flags); in snd_seq_check_queue()
278 if (q->check_again) { in snd_seq_check_queue()
279 q->check_again = 0; in snd_seq_check_queue()
280 spin_unlock_irqrestore(&q->check_lock, flags); in snd_seq_check_queue()
283 q->check_blocked = 0; in snd_seq_check_queue()
284 spin_unlock_irqrestore(&q->check_lock, flags); in snd_seq_check_queue()
292 struct snd_seq_queue *q; in snd_seq_enqueue_event() local
297 q = queueptr(dest); in snd_seq_enqueue_event()
298 if (q == NULL) in snd_seq_enqueue_event()
304 cell->event.time.tick += q->timer->tick.cur_tick; in snd_seq_enqueue_event()
309 &q->timer->cur_time); in snd_seq_enqueue_event()
318 err = snd_seq_prioq_cell_in(q->tickq, cell); in snd_seq_enqueue_event()
323 err = snd_seq_prioq_cell_in(q->timeq, cell); in snd_seq_enqueue_event()
328 queuefree(q); /* unlock */ in snd_seq_enqueue_event()
333 snd_seq_check_queue(q, atomic, hop); in snd_seq_enqueue_event()
335 queuefree(q); /* unlock */ in snd_seq_enqueue_event()
343 static inline int check_access(struct snd_seq_queue *q, int client) in check_access() argument
345 return (q->owner == client) || (!q->locked && !q->klocked); in check_access()
351 static int queue_access_lock(struct snd_seq_queue *q, int client) in queue_access_lock() argument
356 spin_lock_irqsave(&q->owner_lock, flags); in queue_access_lock()
357 access_ok = check_access(q, client); in queue_access_lock()
359 q->klocked = 1; in queue_access_lock()
360 spin_unlock_irqrestore(&q->owner_lock, flags); in queue_access_lock()
365 static inline void queue_access_unlock(struct snd_seq_queue *q) in queue_access_unlock() argument
369 spin_lock_irqsave(&q->owner_lock, flags); in queue_access_unlock()
370 q->klocked = 0; in queue_access_unlock()
371 spin_unlock_irqrestore(&q->owner_lock, flags); in queue_access_unlock()
377 struct snd_seq_queue *q = queueptr(queueid); in snd_seq_queue_check_access() local
381 if (! q) in snd_seq_queue_check_access()
383 spin_lock_irqsave(&q->owner_lock, flags); in snd_seq_queue_check_access()
384 access_ok = check_access(q, client); in snd_seq_queue_check_access()
385 spin_unlock_irqrestore(&q->owner_lock, flags); in snd_seq_queue_check_access()
386 queuefree(q); in snd_seq_queue_check_access()
397 struct snd_seq_queue *q = queueptr(queueid); in snd_seq_queue_set_owner() local
400 if (q == NULL) in snd_seq_queue_set_owner()
403 if (! queue_access_lock(q, client)) { in snd_seq_queue_set_owner()
404 queuefree(q); in snd_seq_queue_set_owner()
408 spin_lock_irqsave(&q->owner_lock, flags); in snd_seq_queue_set_owner()
409 q->locked = locked ? 1 : 0; in snd_seq_queue_set_owner()
410 q->owner = client; in snd_seq_queue_set_owner()
411 spin_unlock_irqrestore(&q->owner_lock, flags); in snd_seq_queue_set_owner()
412 queue_access_unlock(q); in snd_seq_queue_set_owner()
413 queuefree(q); in snd_seq_queue_set_owner()
422 * q->use mutex should be down before calling this function to avoid
444 * q->use mutex should be down before calling this function
463 struct snd_seq_queue *q = queueptr(queueid); in snd_seq_queue_timer_set_tempo() local
466 if (q == NULL) in snd_seq_queue_timer_set_tempo()
468 if (! queue_access_lock(q, client)) { in snd_seq_queue_timer_set_tempo()
469 queuefree(q); in snd_seq_queue_timer_set_tempo()
473 result = snd_seq_timer_set_tempo_ppq(q->timer, info->tempo, info->ppq); in snd_seq_queue_timer_set_tempo()
475 result = snd_seq_timer_set_skew(q->timer, info->skew_value, in snd_seq_queue_timer_set_tempo()
477 queue_access_unlock(q); in snd_seq_queue_timer_set_tempo()
478 queuefree(q); in snd_seq_queue_timer_set_tempo()
526 struct snd_seq_queue *q; in snd_seq_queue_is_used() local
529 q = queueptr(queueid); in snd_seq_queue_is_used()
530 if (q == NULL) in snd_seq_queue_is_used()
532 result = test_bit(client, q->clients_bitmap) ? 1 : 0; in snd_seq_queue_is_used()
533 queuefree(q); in snd_seq_queue_is_used()
547 struct snd_seq_queue *q; in snd_seq_queue_client_termination() local
551 if ((q = queueptr(i)) == NULL) in snd_seq_queue_client_termination()
553 spin_lock_irqsave(&q->owner_lock, flags); in snd_seq_queue_client_termination()
554 matched = (q->owner == client); in snd_seq_queue_client_termination()
556 q->klocked = 1; in snd_seq_queue_client_termination()
557 spin_unlock_irqrestore(&q->owner_lock, flags); in snd_seq_queue_client_termination()
559 if (q->timer->running) in snd_seq_queue_client_termination()
560 snd_seq_timer_stop(q->timer); in snd_seq_queue_client_termination()
561 snd_seq_timer_reset(q->timer); in snd_seq_queue_client_termination()
563 queuefree(q); in snd_seq_queue_client_termination()
574 struct snd_seq_queue *q; in snd_seq_queue_client_leave() local
578 if ((q = queue_list_remove(i, client)) != NULL) in snd_seq_queue_client_leave()
579 queue_delete(q); in snd_seq_queue_client_leave()
586 if ((q = queueptr(i)) == NULL) in snd_seq_queue_client_leave()
588 if (test_bit(client, q->clients_bitmap)) { in snd_seq_queue_client_leave()
589 snd_seq_prioq_leave(q->tickq, client, 0); in snd_seq_queue_client_leave()
590 snd_seq_prioq_leave(q->timeq, client, 0); in snd_seq_queue_client_leave()
591 snd_seq_queue_use(q->queue, client, 0); in snd_seq_queue_client_leave()
593 queuefree(q); in snd_seq_queue_client_leave()
605 struct snd_seq_queue *q; in snd_seq_queue_client_leave_cells() local
608 if ((q = queueptr(i)) == NULL) in snd_seq_queue_client_leave_cells()
610 snd_seq_prioq_leave(q->tickq, client, 0); in snd_seq_queue_client_leave_cells()
611 snd_seq_prioq_leave(q->timeq, client, 0); in snd_seq_queue_client_leave_cells()
612 queuefree(q); in snd_seq_queue_client_leave_cells()
620 struct snd_seq_queue *q; in snd_seq_queue_remove_cells() local
623 if ((q = queueptr(i)) == NULL) in snd_seq_queue_remove_cells()
625 if (test_bit(client, q->clients_bitmap) && in snd_seq_queue_remove_cells()
627 q->queue == info->queue)) { in snd_seq_queue_remove_cells()
628 snd_seq_prioq_remove_events(q->tickq, client, info); in snd_seq_queue_remove_cells()
629 snd_seq_prioq_remove_events(q->timeq, client, info); in snd_seq_queue_remove_cells()
631 queuefree(q); in snd_seq_queue_remove_cells()
640 static void queue_broadcast_event(struct snd_seq_queue *q, struct snd_seq_event *ev, in queue_broadcast_event() argument
648 sev.time.tick = q->timer->tick.cur_tick; in queue_broadcast_event()
649 sev.queue = q->queue; in queue_broadcast_event()
650 sev.data.queue.queue = q->queue; in queue_broadcast_event()
663 static void snd_seq_queue_process_event(struct snd_seq_queue *q, in snd_seq_queue_process_event() argument
669 snd_seq_prioq_leave(q->tickq, ev->source.client, 1); in snd_seq_queue_process_event()
670 snd_seq_prioq_leave(q->timeq, ev->source.client, 1); in snd_seq_queue_process_event()
671 if (! snd_seq_timer_start(q->timer)) in snd_seq_queue_process_event()
672 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
676 if (! snd_seq_timer_continue(q->timer)) in snd_seq_queue_process_event()
677 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
681 snd_seq_timer_stop(q->timer); in snd_seq_queue_process_event()
682 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
686 snd_seq_timer_set_tempo(q->timer, ev->data.queue.param.value); in snd_seq_queue_process_event()
687 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
691 if (snd_seq_timer_set_position_tick(q->timer, ev->data.queue.param.time.tick) == 0) { in snd_seq_queue_process_event()
692 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
697 if (snd_seq_timer_set_position_time(q->timer, ev->data.queue.param.time.time) == 0) { in snd_seq_queue_process_event()
698 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
702 if (snd_seq_timer_set_skew(q->timer, in snd_seq_queue_process_event()
705 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
718 struct snd_seq_queue *q; in snd_seq_control_queue() local
722 q = queueptr(ev->data.queue.queue); in snd_seq_control_queue()
724 if (q == NULL) in snd_seq_control_queue()
727 if (! queue_access_lock(q, ev->source.client)) { in snd_seq_control_queue()
728 queuefree(q); in snd_seq_control_queue()
732 snd_seq_queue_process_event(q, ev, atomic, hop); in snd_seq_control_queue()
734 queue_access_unlock(q); in snd_seq_control_queue()
735 queuefree(q); in snd_seq_control_queue()
748 struct snd_seq_queue *q; in snd_seq_info_queues_read() local
754 if ((q = queueptr(i)) == NULL) in snd_seq_info_queues_read()
757 tmr = q->timer; in snd_seq_info_queues_read()
763 spin_lock_irq(&q->owner_lock); in snd_seq_info_queues_read()
764 locked = q->locked; in snd_seq_info_queues_read()
765 owner = q->owner; in snd_seq_info_queues_read()
766 spin_unlock_irq(&q->owner_lock); in snd_seq_info_queues_read()
768 snd_iprintf(buffer, "queue %d: [%s]\n", q->queue, q->name); in snd_seq_info_queues_read()
771 snd_iprintf(buffer, "queued time events : %d\n", snd_seq_prioq_avail(q->timeq)); in snd_seq_info_queues_read()
772 snd_iprintf(buffer, "queued tick events : %d\n", snd_seq_prioq_avail(q->tickq)); in snd_seq_info_queues_read()
780 queuefree(q); in snd_seq_info_queues_read()