Exemple #1
0
/* use or unuse this queue -
 * if it is the first client, starts the timer.
 * if it is not longer used by any clients, stop the timer.
 */
int snd_seq_queue_use(int queueid, int client, int use)
{
    struct snd_seq_queue *queue;

    queue = queueptr(queueid);
    if (queue == NULL)
        return -EINVAL;
    mutex_lock(&queue->timer_mutex);
    if (use) {
        if (!test_and_set_bit(client, queue->clients_bitmap))
            queue->clients++;
    } else {
        if (test_and_clear_bit(client, queue->clients_bitmap))
            queue->clients--;
    }
    if (queue->clients) {
        if (use && queue->clients == 1)
            snd_seq_timer_defaults(queue->timer);
        snd_seq_timer_open(queue);
    } else {
        snd_seq_timer_close(queue);
    }
    mutex_unlock(&queue->timer_mutex);
    queuefree(queue);
    return 0;
}
Exemple #2
0
/* close timer -
 * q->use mutex should be down before calling this function
 */
int snd_seq_queue_timer_close(int queueid)
{
	struct snd_seq_queue *queue;
	int result = 0;

	queue = queueptr(queueid);
	if (queue == NULL)
		return -EINVAL;
	snd_seq_timer_close(queue);
	queuefree(queue);
	return result;
}
Exemple #3
0
/* delete queue (destructor) */
static void queue_delete(struct snd_seq_queue *q)
{
    /* stop and release the timer */
    snd_seq_timer_stop(q->timer);
    snd_seq_timer_close(q);
    /* wait until access free */
    snd_use_lock_sync(&q->use_lock);
    /* release resources... */
    snd_seq_prioq_delete(&q->tickq);
    snd_seq_prioq_delete(&q->timeq);
    snd_seq_timer_delete(&q->timer);

    kfree(q);
}
Exemple #4
0
/* close timer -
 * q->use mutex should be down before calling this function
 */
int snd_seq_queue_timer_close(int queueid)
{
	queue_t *queue;
	seq_timer_t *tmr;
	int result = 0;

	queue = queueptr(queueid);
	if (queue == NULL)
		return -EINVAL;
	tmr = queue->timer;
	snd_seq_timer_close(queue);
	queuefree(queue);
	return result;
}