summaryrefslogtreecommitdiffstats
path: root/sys/dev/sound/pcm
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/sound/pcm')
-rw-r--r--sys/dev/sound/pcm/fake.c7
-rw-r--r--sys/dev/sound/pcm/feeder.c15
-rw-r--r--sys/dev/sound/pcm/sound.c1
3 files changed, 22 insertions, 1 deletions
diff --git a/sys/dev/sound/pcm/fake.c b/sys/dev/sound/pcm/fake.c
index 28ae84a..e73fb6d 100644
--- a/sys/dev/sound/pcm/fake.c
+++ b/sys/dev/sound/pcm/fake.c
@@ -55,6 +55,12 @@ fkchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
}
static int
+fkchan_free(kobj_t obj, void *data)
+{
+ return 0;
+}
+
+static int
fkchan_setformat(kobj_t obj, void *data, u_int32_t format)
{
return 0;
@@ -92,6 +98,7 @@ fkchan_getcaps(kobj_t obj, void *data)
static kobj_method_t fkchan_methods[] = {
KOBJMETHOD(channel_init, fkchan_init),
+ KOBJMETHOD(channel_free, fkchan_free),
KOBJMETHOD(channel_setformat, fkchan_setformat),
KOBJMETHOD(channel_setspeed, fkchan_setspeed),
KOBJMETHOD(channel_setblocksize, fkchan_setblocksize),
diff --git a/sys/dev/sound/pcm/feeder.c b/sys/dev/sound/pcm/feeder.c
index 5853770..1d7af27 100644
--- a/sys/dev/sound/pcm/feeder.c
+++ b/sys/dev/sound/pcm/feeder.c
@@ -66,7 +66,6 @@ feeder_register(void *p)
feedercnt++;
return;
}
- /* printf("installing feeder: %s\n", f->name); */
i = 0;
while ((feedercnt < MAXFEEDERS) && (fc->desc[i].type > 0)) {
@@ -83,6 +82,19 @@ feeder_register(void *p)
printf("MAXFEEDERS exceeded\n");
}
+static void
+feeder_unregisterall(void *p)
+{
+ struct feedertab_entry *fte, *next;
+
+ next = SLIST_FIRST(&feedertab);
+ while (next != NULL) {
+ fte = next;
+ next = SLIST_NEXT(fte, link);
+ free(fte, M_FEEDER);
+ }
+}
+
static int
cmpdesc(struct pcm_feederdesc *n, struct pcm_feederdesc *m)
{
@@ -326,6 +338,7 @@ static struct feeder_class feeder_root_class = {
data: NULL,
};
SYSINIT(feeder_root, SI_SUB_DRIVERS, SI_ORDER_FIRST, feeder_register, &feeder_root_class);
+SYSUNINIT(feeder_root, SI_SUB_DRIVERS, SI_ORDER_FIRST, feeder_unregisterall, NULL);
diff --git a/sys/dev/sound/pcm/sound.c b/sys/dev/sound/pcm/sound.c
index fa4698f..95e7762 100644
--- a/sys/dev/sound/pcm/sound.c
+++ b/sys/dev/sound/pcm/sound.c
@@ -454,6 +454,7 @@ pcm_unregister(device_t dev)
if (d->ref) free(d->ref, M_DEVBUF);
if (d->atype) free(d->atype, M_DEVBUF);
+ chn_kill(&d->fakechan);
fkchan_kill(&d->fakechan);
#ifdef USING_DEVFS
OpenPOWER on IntegriCloud