int audio_open (int dev, struct fileinfo *file) { int ret; int bits; int dev_type = dev & 0x0f; int mode = file->mode & O_ACCMODE; dev = dev >> 4; if (dev_type == SND_DEV_DSP16) bits = 16; else bits = 8; if ((ret = DMAbuf_open (dev, mode)) < 0) return ret; if (audio_devs[dev]->coproc) if ((ret = audio_devs[dev]->coproc-> open (audio_devs[dev]->coproc->devc, COPR_PCM)) < 0) { audio_release (dev, file); printk ("Sound: Can't access coprocessor device\n"); return ret; } local_conversion[dev] = 0; if (DMAbuf_ioctl (dev, SNDCTL_DSP_SETFMT, (caddr_t) bits, 1) != bits) { printk ("audio: Can't set number of bits on device %d\n", dev); audio_release (dev, file); return -(ENXIO); } if (dev_type == SND_DEV_AUDIO) { set_format (dev, AFMT_MU_LAW); } else set_format (dev, bits); audio_mode[dev] = AM_NONE; dev_nblock[dev] = 0; return ret; }
int audio_open(int dev, struct file *file) { int ret; int bits; int dev_type = dev & 0x0f; int mode = translate_mode(file); const struct audio_driver *driver; const struct coproc_operations *coprocessor; dev = dev >> 4; if (dev_type == SND_DEV_DSP16) bits = 16; else bits = 8; if (dev < 0 || dev >= num_audiodevs) return -ENXIO; driver = audio_devs[dev]->d; if (!try_module_get(driver->owner)) return -ENODEV; if ((ret = DMAbuf_open(dev, mode)) < 0) goto error_1; if ( (coprocessor = audio_devs[dev]->coproc) != NULL ) { if (!try_module_get(coprocessor->owner)) goto error_2; if ((ret = coprocessor->open(coprocessor->devc, COPR_PCM)) < 0) { printk(KERN_WARNING "Sound: Can't access coprocessor device\n"); goto error_3; } } audio_devs[dev]->local_conversion = 0; if (dev_type == SND_DEV_AUDIO) set_format(dev, AFMT_MU_LAW); else set_format(dev, bits); audio_devs[dev]->audio_mode = AM_NONE; return 0; /* * Clean-up stack: this is what needs (un)doing if * we can't open the audio device ... */ error_3: module_put(coprocessor->owner); error_2: DMAbuf_release(dev, mode); error_1: module_put(driver->owner); return ret; }