Esempio n. 1
0
static int sound_open(struct inode *inode, struct file *file)
{
	int dev = MINOR(inode->i_rdev);
	int retval;

	DEB(printk("sound_open(dev=%d)\n", dev));
	if ((dev >= SND_NDEVS) || (dev < 0)) {
		printk(KERN_ERR "Invalid minor device %d\n", dev);
		return -ENXIO;
	}
	switch (dev & 0x0f) {
	case SND_DEV_CTL:
		dev >>= 4;
		if (dev >= 0 && dev < MAX_MIXER_DEV && mixer_devs[dev] == NULL) {
			char modname[20];
			sprintf(modname, "mixer%d", dev);
			request_module(modname);
		}
		if (dev && (dev >= num_mixers || mixer_devs[dev] == NULL))
			return -ENXIO;

		if (mixer_devs[dev]->owner)
			__MOD_INC_USE_COUNT (mixer_devs[dev]->owner);
		break;

	case SND_DEV_SEQ:
	case SND_DEV_SEQ2:
		if ((retval = sequencer_open(dev, file)) < 0)
			return retval;
		break;

	case SND_DEV_MIDIN:
		if ((retval = MIDIbuf_open(dev, file)) < 0)
			return retval;
		break;

	case SND_DEV_DSP:
	case SND_DEV_DSP16:
	case SND_DEV_AUDIO:
		if ((retval = audio_open(dev, file)) < 0)
			return retval;
		break;

	default:
		printk(KERN_ERR "Invalid minor device %d\n", dev);
		return -ENXIO;
	}

	return 0;
}
Esempio n. 2
0
static int sound_open(struct inode *inode, struct file *file)
{
	int dev = iminor(inode);
	int retval;

	DEB(printk("sound_open(dev=%d)\n", dev));
	if ((dev >= SND_NDEVS) || (dev < 0)) {
		printk(KERN_ERR "Invalid minor device %d\n", dev);
		return -ENXIO;
	}
	mutex_lock(&soundcard_mutex);
	switch (dev & 0x0f) {
	case SND_DEV_CTL:
		dev >>= 4;
		if (dev >= 0 && dev < MAX_MIXER_DEV && mixer_devs[dev] == NULL) {
			request_module("mixer%d", dev);
		}
		retval = -ENXIO;
		if (dev && (dev >= num_mixers || mixer_devs[dev] == NULL))
			break;
	
		if (!try_module_get(mixer_devs[dev]->owner))
			break;

		retval = 0;
		break;

	case SND_DEV_SEQ:
	case SND_DEV_SEQ2:
		retval = sequencer_open(dev, file);
		break;

	case SND_DEV_MIDIN:
		retval = MIDIbuf_open(dev, file);
		break;

	case SND_DEV_DSP:
	case SND_DEV_DSP16:
	case SND_DEV_AUDIO:
		retval = audio_open(dev, file);
		break;

	default:
		printk(KERN_ERR "Invalid minor device %d\n", dev);
		retval = -ENXIO;
	}

	mutex_unlock(&soundcard_mutex);
	return retval;
}
Esempio n. 3
0
static int sound_open(struct inode *inode, struct file *file)
{
	int dev, retval;

	if (is_unloading) {
		/* printk(KERN_ERR "Sound: Driver partially removed. Can't open device\n");*/
		return -EBUSY;
	}
	dev = MINOR(inode->i_rdev);
	if (!soundcard_configured && dev != SND_DEV_CTL && dev != SND_DEV_STATUS) {
		/* printk("SoundCard Error: The sound system has not been configured\n");*/
		return -ENXIO;
	}
	DEB(printk("sound_open(dev=%d)\n", dev));
	if ((dev >= SND_NDEVS) || (dev < 0)) {
		/* printk(KERN_ERR "Invalid minor device %d\n", dev);*/
		return -ENXIO;
	}
	switch (dev & 0x0f) {
	case SND_DEV_STATUS:
		break;

	case SND_DEV_CTL:
		dev >>= 4;
		if (dev >= 0 && dev < MAX_MIXER_DEV && mixer_devs[dev] == NULL) {
			char modname[20];
			sprintf(modname, "mixer%d", dev);
			request_module(modname);
		}
		if (dev && (dev >= num_mixers || mixer_devs[dev] == NULL))
			return -ENXIO;
		break;

#ifdef CONFIG_SEQUENCER
	case SND_DEV_SEQ:
	case SND_DEV_SEQ2:
		if ((retval = sequencer_open(dev, file)) < 0)
			return retval;
		break;
#endif

#ifdef CONFIG_MIDI
	case SND_DEV_MIDIN:
		if ((retval = MIDIbuf_open(dev, file)) < 0)
			return retval;
		break;
#endif

#ifdef CONFIG_AUDIO
	case SND_DEV_DSP:
	case SND_DEV_DSP16:
	case SND_DEV_AUDIO:
		if ((retval = audio_open(dev, file)) < 0)
			return retval;
		break;
#endif

	default:
		printk(KERN_ERR "Invalid minor device %d\n", dev);
		return -ENXIO;
	}
	in_use++;

#ifdef CONFIG_MODULES
	notifier_call_chain(&sound_locker, 1, 0);
	lock_depth++;
#endif

	return 0;
}