Lines Matching refs:q
63 static int queue_list_add(struct snd_seq_queue *q) in queue_list_add() argument
71 queue_list[i] = q; in queue_list_add()
72 q->queue = i; in queue_list_add()
84 struct snd_seq_queue *q; in queue_list_remove() local
88 q = queue_list[id]; in queue_list_remove()
89 if (q) { in queue_list_remove()
90 spin_lock(&q->owner_lock); in queue_list_remove()
91 if (q->owner == client) { in queue_list_remove()
93 q->klocked = 1; in queue_list_remove()
94 spin_unlock(&q->owner_lock); in queue_list_remove()
98 return q; in queue_list_remove()
100 spin_unlock(&q->owner_lock); in queue_list_remove()
111 struct snd_seq_queue *q; in queue_new() local
113 q = kzalloc(sizeof(*q), GFP_KERNEL); in queue_new()
114 if (!q) in queue_new()
117 spin_lock_init(&q->owner_lock); in queue_new()
118 spin_lock_init(&q->check_lock); in queue_new()
119 mutex_init(&q->timer_mutex); in queue_new()
120 snd_use_lock_init(&q->use_lock); in queue_new()
121 q->queue = -1; in queue_new()
123 q->tickq = snd_seq_prioq_new(); in queue_new()
124 q->timeq = snd_seq_prioq_new(); in queue_new()
125 q->timer = snd_seq_timer_new(); in queue_new()
126 if (q->tickq == NULL || q->timeq == NULL || q->timer == NULL) { in queue_new()
127 snd_seq_prioq_delete(&q->tickq); in queue_new()
128 snd_seq_prioq_delete(&q->timeq); in queue_new()
129 snd_seq_timer_delete(&q->timer); in queue_new()
130 kfree(q); in queue_new()
134 q->owner = owner; in queue_new()
135 q->locked = locked; in queue_new()
136 q->klocked = 0; in queue_new()
138 return q; in queue_new()
142 static void queue_delete(struct snd_seq_queue *q) in queue_delete() argument
145 mutex_lock(&q->timer_mutex); in queue_delete()
146 snd_seq_timer_stop(q->timer); in queue_delete()
147 snd_seq_timer_close(q); in queue_delete()
148 mutex_unlock(&q->timer_mutex); in queue_delete()
150 snd_use_lock_sync(&q->use_lock); in queue_delete()
152 snd_seq_prioq_delete(&q->tickq); in queue_delete()
153 snd_seq_prioq_delete(&q->timeq); in queue_delete()
154 snd_seq_timer_delete(&q->timer); in queue_delete()
156 kfree(q); in queue_delete()
183 struct snd_seq_queue *q; in snd_seq_queue_alloc() local
185 q = queue_new(client, locked); in snd_seq_queue_alloc()
186 if (q == NULL) in snd_seq_queue_alloc()
188 q->info_flags = info_flags; in snd_seq_queue_alloc()
189 queue_use(q, client, 1); in snd_seq_queue_alloc()
190 snd_use_lock_use(&q->use_lock); in snd_seq_queue_alloc()
191 if (queue_list_add(q) < 0) { in snd_seq_queue_alloc()
192 snd_use_lock_free(&q->use_lock); in snd_seq_queue_alloc()
193 queue_delete(q); in snd_seq_queue_alloc()
196 return q; in snd_seq_queue_alloc()
202 struct snd_seq_queue *q; in snd_seq_queue_delete() local
206 q = queue_list_remove(queueid, client); in snd_seq_queue_delete()
207 if (q == NULL) in snd_seq_queue_delete()
209 queue_delete(q); in snd_seq_queue_delete()
218 struct snd_seq_queue *q; in queueptr() local
224 q = queue_list[queueid]; in queueptr()
225 if (q) in queueptr()
226 snd_use_lock_use(&q->use_lock); in queueptr()
228 return q; in queueptr()
235 struct snd_seq_queue *q; in snd_seq_queue_find_name() local
238 if ((q = queueptr(i)) != NULL) { in snd_seq_queue_find_name()
239 if (strncmp(q->name, name, sizeof(q->name)) == 0) in snd_seq_queue_find_name()
240 return q; in snd_seq_queue_find_name()
241 queuefree(q); in snd_seq_queue_find_name()
250 void snd_seq_check_queue(struct snd_seq_queue *q, int atomic, int hop) in snd_seq_check_queue() argument
255 if (q == NULL) in snd_seq_check_queue()
259 spin_lock_irqsave(&q->check_lock, flags); in snd_seq_check_queue()
260 if (q->check_blocked) { in snd_seq_check_queue()
261 q->check_again = 1; in snd_seq_check_queue()
262 spin_unlock_irqrestore(&q->check_lock, flags); in snd_seq_check_queue()
265 q->check_blocked = 1; in snd_seq_check_queue()
266 spin_unlock_irqrestore(&q->check_lock, flags); in snd_seq_check_queue()
271 cell = snd_seq_prioq_cell_out(q->tickq, in snd_seq_check_queue()
272 &q->timer->tick.cur_tick); in snd_seq_check_queue()
280 cell = snd_seq_prioq_cell_out(q->timeq, &q->timer->cur_time); in snd_seq_check_queue()
287 spin_lock_irqsave(&q->check_lock, flags); in snd_seq_check_queue()
288 if (q->check_again) { in snd_seq_check_queue()
289 q->check_again = 0; in snd_seq_check_queue()
290 spin_unlock_irqrestore(&q->check_lock, flags); in snd_seq_check_queue()
293 q->check_blocked = 0; in snd_seq_check_queue()
294 spin_unlock_irqrestore(&q->check_lock, flags); in snd_seq_check_queue()
302 struct snd_seq_queue *q; in snd_seq_enqueue_event() local
307 q = queueptr(dest); in snd_seq_enqueue_event()
308 if (q == NULL) in snd_seq_enqueue_event()
314 cell->event.time.tick += q->timer->tick.cur_tick; in snd_seq_enqueue_event()
319 &q->timer->cur_time); in snd_seq_enqueue_event()
328 err = snd_seq_prioq_cell_in(q->tickq, cell); in snd_seq_enqueue_event()
333 err = snd_seq_prioq_cell_in(q->timeq, cell); in snd_seq_enqueue_event()
338 queuefree(q); /* unlock */ in snd_seq_enqueue_event()
343 snd_seq_check_queue(q, atomic, hop); in snd_seq_enqueue_event()
345 queuefree(q); /* unlock */ in snd_seq_enqueue_event()
353 static inline int check_access(struct snd_seq_queue *q, int client) in check_access() argument
355 return (q->owner == client) || (!q->locked && !q->klocked); in check_access()
361 static int queue_access_lock(struct snd_seq_queue *q, int client) in queue_access_lock() argument
366 spin_lock_irqsave(&q->owner_lock, flags); in queue_access_lock()
367 access_ok = check_access(q, client); in queue_access_lock()
369 q->klocked = 1; in queue_access_lock()
370 spin_unlock_irqrestore(&q->owner_lock, flags); in queue_access_lock()
375 static inline void queue_access_unlock(struct snd_seq_queue *q) in queue_access_unlock() argument
379 spin_lock_irqsave(&q->owner_lock, flags); in queue_access_unlock()
380 q->klocked = 0; in queue_access_unlock()
381 spin_unlock_irqrestore(&q->owner_lock, flags); in queue_access_unlock()
387 struct snd_seq_queue *q = queueptr(queueid); in snd_seq_queue_check_access() local
391 if (! q) in snd_seq_queue_check_access()
393 spin_lock_irqsave(&q->owner_lock, flags); in snd_seq_queue_check_access()
394 access_ok = check_access(q, client); in snd_seq_queue_check_access()
395 spin_unlock_irqrestore(&q->owner_lock, flags); in snd_seq_queue_check_access()
396 queuefree(q); in snd_seq_queue_check_access()
407 struct snd_seq_queue *q = queueptr(queueid); in snd_seq_queue_set_owner() local
409 if (q == NULL) in snd_seq_queue_set_owner()
412 if (! queue_access_lock(q, client)) { in snd_seq_queue_set_owner()
413 queuefree(q); in snd_seq_queue_set_owner()
417 q->locked = locked ? 1 : 0; in snd_seq_queue_set_owner()
418 q->owner = client; in snd_seq_queue_set_owner()
419 queue_access_unlock(q); in snd_seq_queue_set_owner()
420 queuefree(q); in snd_seq_queue_set_owner()
470 struct snd_seq_queue *q = queueptr(queueid); in snd_seq_queue_timer_set_tempo() local
473 if (q == NULL) in snd_seq_queue_timer_set_tempo()
475 if (! queue_access_lock(q, client)) { in snd_seq_queue_timer_set_tempo()
476 queuefree(q); in snd_seq_queue_timer_set_tempo()
480 result = snd_seq_timer_set_tempo_ppq(q->timer, info->tempo, info->ppq); in snd_seq_queue_timer_set_tempo()
482 result = snd_seq_timer_set_skew(q->timer, info->skew_value, in snd_seq_queue_timer_set_tempo()
484 queue_access_unlock(q); in snd_seq_queue_timer_set_tempo()
485 queuefree(q); in snd_seq_queue_timer_set_tempo()
533 struct snd_seq_queue *q; in snd_seq_queue_is_used() local
536 q = queueptr(queueid); in snd_seq_queue_is_used()
537 if (q == NULL) in snd_seq_queue_is_used()
539 result = test_bit(client, q->clients_bitmap) ? 1 : 0; in snd_seq_queue_is_used()
540 queuefree(q); in snd_seq_queue_is_used()
554 struct snd_seq_queue *q; in snd_seq_queue_client_termination() local
557 if ((q = queueptr(i)) == NULL) in snd_seq_queue_client_termination()
559 spin_lock_irqsave(&q->owner_lock, flags); in snd_seq_queue_client_termination()
560 if (q->owner == client) in snd_seq_queue_client_termination()
561 q->klocked = 1; in snd_seq_queue_client_termination()
562 spin_unlock_irqrestore(&q->owner_lock, flags); in snd_seq_queue_client_termination()
563 if (q->owner == client) { in snd_seq_queue_client_termination()
564 if (q->timer->running) in snd_seq_queue_client_termination()
565 snd_seq_timer_stop(q->timer); in snd_seq_queue_client_termination()
566 snd_seq_timer_reset(q->timer); in snd_seq_queue_client_termination()
568 queuefree(q); in snd_seq_queue_client_termination()
579 struct snd_seq_queue *q; in snd_seq_queue_client_leave() local
583 if ((q = queue_list_remove(i, client)) != NULL) in snd_seq_queue_client_leave()
584 queue_delete(q); in snd_seq_queue_client_leave()
591 if ((q = queueptr(i)) == NULL) in snd_seq_queue_client_leave()
593 if (test_bit(client, q->clients_bitmap)) { in snd_seq_queue_client_leave()
594 snd_seq_prioq_leave(q->tickq, client, 0); in snd_seq_queue_client_leave()
595 snd_seq_prioq_leave(q->timeq, client, 0); in snd_seq_queue_client_leave()
596 snd_seq_queue_use(q->queue, client, 0); in snd_seq_queue_client_leave()
598 queuefree(q); in snd_seq_queue_client_leave()
610 struct snd_seq_queue *q; in snd_seq_queue_client_leave_cells() local
613 if ((q = queueptr(i)) == NULL) in snd_seq_queue_client_leave_cells()
615 snd_seq_prioq_leave(q->tickq, client, 0); in snd_seq_queue_client_leave_cells()
616 snd_seq_prioq_leave(q->timeq, client, 0); in snd_seq_queue_client_leave_cells()
617 queuefree(q); in snd_seq_queue_client_leave_cells()
625 struct snd_seq_queue *q; in snd_seq_queue_remove_cells() local
628 if ((q = queueptr(i)) == NULL) in snd_seq_queue_remove_cells()
630 if (test_bit(client, q->clients_bitmap) && in snd_seq_queue_remove_cells()
632 q->queue == info->queue)) { in snd_seq_queue_remove_cells()
633 snd_seq_prioq_remove_events(q->tickq, client, info); in snd_seq_queue_remove_cells()
634 snd_seq_prioq_remove_events(q->timeq, client, info); in snd_seq_queue_remove_cells()
636 queuefree(q); in snd_seq_queue_remove_cells()
645 static void queue_broadcast_event(struct snd_seq_queue *q, struct snd_seq_event *ev, in queue_broadcast_event() argument
653 sev.time.tick = q->timer->tick.cur_tick; in queue_broadcast_event()
654 sev.queue = q->queue; in queue_broadcast_event()
655 sev.data.queue.queue = q->queue; in queue_broadcast_event()
668 static void snd_seq_queue_process_event(struct snd_seq_queue *q, in snd_seq_queue_process_event() argument
674 snd_seq_prioq_leave(q->tickq, ev->source.client, 1); in snd_seq_queue_process_event()
675 snd_seq_prioq_leave(q->timeq, ev->source.client, 1); in snd_seq_queue_process_event()
676 if (! snd_seq_timer_start(q->timer)) in snd_seq_queue_process_event()
677 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
681 if (! snd_seq_timer_continue(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_stop(q->timer); in snd_seq_queue_process_event()
687 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
691 snd_seq_timer_set_tempo(q->timer, ev->data.queue.param.value); in snd_seq_queue_process_event()
692 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
696 if (snd_seq_timer_set_position_tick(q->timer, ev->data.queue.param.time.tick) == 0) { in snd_seq_queue_process_event()
697 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
702 if (snd_seq_timer_set_position_time(q->timer, ev->data.queue.param.time.time) == 0) { in snd_seq_queue_process_event()
703 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
707 if (snd_seq_timer_set_skew(q->timer, in snd_seq_queue_process_event()
710 queue_broadcast_event(q, ev, atomic, hop); in snd_seq_queue_process_event()
723 struct snd_seq_queue *q; in snd_seq_control_queue() local
727 q = queueptr(ev->data.queue.queue); in snd_seq_control_queue()
729 if (q == NULL) in snd_seq_control_queue()
732 if (! queue_access_lock(q, ev->source.client)) { in snd_seq_control_queue()
733 queuefree(q); in snd_seq_control_queue()
737 snd_seq_queue_process_event(q, ev, atomic, hop); in snd_seq_control_queue()
739 queue_access_unlock(q); in snd_seq_control_queue()
740 queuefree(q); in snd_seq_control_queue()
753 struct snd_seq_queue *q; in snd_seq_info_queues_read() local
757 if ((q = queueptr(i)) == NULL) in snd_seq_info_queues_read()
760 tmr = q->timer; in snd_seq_info_queues_read()
766 snd_iprintf(buffer, "queue %d: [%s]\n", q->queue, q->name); in snd_seq_info_queues_read()
767 snd_iprintf(buffer, "owned by client : %d\n", q->owner); in snd_seq_info_queues_read()
768 snd_iprintf(buffer, "lock status : %s\n", q->locked ? "Locked" : "Free"); in snd_seq_info_queues_read()
769 snd_iprintf(buffer, "queued time events : %d\n", snd_seq_prioq_avail(q->timeq)); in snd_seq_info_queues_read()
770 snd_iprintf(buffer, "queued tick events : %d\n", snd_seq_prioq_avail(q->tickq)); in snd_seq_info_queues_read()
778 queuefree(q); in snd_seq_info_queues_read()