diff options
Diffstat (limited to 'sys/dev/sound/pcm/sound.c')
-rw-r--r-- | sys/dev/sound/pcm/sound.c | 27 |
1 files changed, 12 insertions, 15 deletions
diff --git a/sys/dev/sound/pcm/sound.c b/sys/dev/sound/pcm/sound.c index 0458cd7..0aecfb0 100644 --- a/sys/dev/sound/pcm/sound.c +++ b/sys/dev/sound/pcm/sound.c @@ -149,12 +149,13 @@ SYSCTL_PROC(_hw, OID_AUTO, sndunit, CTLTYPE_INT | CTLFLAG_RW, 0, sizeof(int), sysctl_hw_sndunit, "I", ""); int -pcm_addchan(device_t dev, int dir, pcm_channel *templ, void *devinfo) +pcm_addchan(device_t dev, int dir, kobj_class_t cls, void *devinfo) { int unit = device_get_unit(dev), idx; snddev_info *d = device_get_softc(dev); pcm_channel *chns, *ch; char *dirs; + int err; dirs = ((dir == PCMDIR_PLAY)? "play" : "record"); chns = ((dir == PCMDIR_PLAY)? d->play : d->rec); @@ -165,10 +166,11 @@ pcm_addchan(device_t dev, int dir, pcm_channel *templ, void *devinfo) return 1; } ch = &chns[idx]; - *ch = *templ; + ch->methods = kobj_create(cls, M_DEVBUF, M_WAITOK); ch->parent = d; - if (chn_init(ch, devinfo, dir)) { - device_printf(dev, "chn_init() for (%s:%d) failed\n", dirs, idx); + err = chn_init(ch, devinfo, dir); + if (err) { + device_printf(dev, "chn_init() for (%s:%d) failed: err = %d\n", dirs, idx, err); return 1; } make_dev(&snd_cdevsw, PCMMKMINOR(unit, SND_DEV_DSP, d->chancount), @@ -206,6 +208,8 @@ pcm_killchan(device_t dev, int dir) device_printf(dev, "chn_kill() for (%s:%d) failed\n", dirs, idx); return 1; } + kobj_delete(ch->methods, M_DEVBUF); + ch->methods = NULL; d->chancount--; pdev = makedev(CDEV_MAJOR, PCMMKMINOR(unit, SND_DEV_DSP, d->chancount)); destroy_dev(pdev); @@ -245,13 +249,6 @@ pcm_getdevinfo(device_t dev) return d->devinfo; } -void -pcm_setswap(device_t dev, pcm_swap_t *swap) -{ - snddev_info *d = device_get_softc(dev); - d->swap = swap; -} - /* This is the generic init routine */ int pcm_register(device_t dev, void *devinfo, int numplay, int numrec) @@ -309,7 +306,6 @@ pcm_register(device_t dev, void *devinfo, int numplay, int numrec) fkchan_setup(&d->fakechan); chn_init(&d->fakechan, NULL, 0); d->magic = MAGIC(unit); /* debugging... */ - d->swap = NULL; return 0; no: @@ -335,7 +331,7 @@ pcm_unregister(device_t dev) device_printf(dev, "unregister: channel busy"); return r; } - if (mixer_isbusy(d)) { + if (mixer_isbusy(d->mixer)) { device_printf(dev, "unregister: mixer busy"); return EBUSY; } @@ -356,6 +352,7 @@ pcm_unregister(device_t dev) if (d->rec) free(d->rec, M_DEVBUF); if (d->ref) free(d->ref, M_DEVBUF); + fkchan_kill(&d->fakechan); pcm_makelinks(NULL); return 0; } @@ -417,7 +414,7 @@ sndopen(dev_t i_dev, int flags, int mode, struct proc *p) return 0; case SND_DEV_CTL: - return d? mixer_busy(d, 1) : ENXIO; + return d? mixer_busy(d->mixer, 1) : ENXIO; case SND_DEV_AUDIO: case SND_DEV_DSP: @@ -445,7 +442,7 @@ sndclose(dev_t i_dev, int flags, int mode, struct proc *p) return 0; case SND_DEV_CTL: - return d? mixer_busy(d, 0) : ENXIO; + return d? mixer_busy(d->mixer, 0) : ENXIO; case SND_DEV_AUDIO: case SND_DEV_DSP: |