Ejemplo n.º 1
0
/*
 * release the midi device if it was registered
 */
int
snd_seq_oss_midi_check_exit_port(int client, int port)
{
	struct seq_oss_midi *mdev;
	unsigned long flags;
	int index;

	if ((mdev = find_slot(client, port)) != NULL) {
		spin_lock_irqsave(&register_lock, flags);
		midi_devs[mdev->seq_device] = NULL;
		spin_unlock_irqrestore(&register_lock, flags);
		snd_use_lock_free(&mdev->use_lock);
		snd_use_lock_sync(&mdev->use_lock);
		snd_midi_event_free(mdev->coder);
		kfree(mdev);
	}
	spin_lock_irqsave(&register_lock, flags);
	for (index = max_midi_devs - 1; index >= 0; index--) {
		if (midi_devs[index])
			break;
	}
	max_midi_devs = index + 1;
	spin_unlock_irqrestore(&register_lock, flags);
	return 0;
}
Ejemplo n.º 2
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);
}
/* clear queue */
void snd_seq_fifo_clear(fifo_t *f)
{
	snd_seq_event_cell_t *cell;
	unsigned long flags;

	/* clear overflow flag */
	atomic_set(&f->overflow, 0);

	snd_use_lock_sync(&f->use_lock);
	spin_lock_irqsave(&f->lock, flags);
	/* drain the fifo */
	while ((cell = fifo_cell_out(f)) != NULL) {
		snd_seq_cell_free(cell);
	}
	spin_unlock_irqrestore(&f->lock, flags);
}
Ejemplo n.º 4
0
int
snd_seq_oss_synth_remove(struct device *_dev)
{
    struct snd_seq_device *dev = to_seq_dev(_dev);
    int index;
    struct seq_oss_synth *rec = dev->driver_data;
    unsigned long flags;

    spin_lock_irqsave(&register_lock, flags);
    for (index = 0; index < max_synth_devs; index++) {
        if (synth_devs[index] == rec)
            break;
    }
    if (index >= max_synth_devs) {
        spin_unlock_irqrestore(&register_lock, flags);
        pr_err("ALSA: seq_oss: can't unregister synth\n");
        return -EINVAL;
    }
    synth_devs[index] = NULL;
    if (index == max_synth_devs - 1) {
        for (index--; index >= 0; index--) {
            if (synth_devs[index])
                break;
        }
        max_synth_devs = index + 1;
    }
    spin_unlock_irqrestore(&register_lock, flags);
#ifdef SNDRV_OSS_INFO_DEV_SYNTH
    if (rec->seq_device < SNDRV_CARDS)
        snd_oss_info_unregister(SNDRV_OSS_INFO_DEV_SYNTH, rec->seq_device);
#endif

    snd_use_lock_sync(&rec->use_lock);
    kfree(rec);

    return 0;
}