summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pcm/sound.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/pcm/sound.c')
-rw-r--r--sys/dev/sound/pcm/sound.c27
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:
OpenPOWER on IntegriCloud