sound: Create the first /dev/dsp* links
authorFrançois Tigeot <ftigeot@wolfpond.org>
Sat, 7 Jul 2012 21:00:02 +0000 (23:00 +0200)
committerFrançois Tigeot <ftigeot@wolfpond.org>
Thu, 8 Jan 2015 10:40:53 +0000 (11:40 +0100)
At this point the sound device can be used, albeit by only one
application at the same time.

sys/dev/sound/pcm/dsp.c
sys/dev/sound/pcm/sound.c
sys/dev/sound/pcm/sound.h

index eaeb7d2..dbc0d75 100644 (file)
@@ -547,10 +547,6 @@ dsp_open(struct dev_open_args *ap)
                break;
        }
 
-       /* No matching devtype? */
-       if (fmt == 0 || spd == 0)
-               panic("impossible devtype %d", devtype);
-
        rdch = NULL;
        wrch = NULL;
        rderror = 0;
@@ -2405,6 +2401,10 @@ dsp_stdclone(const char *name, char *namep, char *sep, int use_sep, int *u, int
        return (0);
 }
 
+/*
+ *     for i = 0 to channels of device N
+ *     if dspN.i isn't busy and in the right dir, create a dev_t and return it
+ */
 int
 dsp_clone(struct dev_clone_args *ap)
 {
index 44b5c19..0568652 100644 (file)
@@ -37,6 +37,7 @@
 #include <dev/sound/pcm/dsp.h>
 #include <dev/sound/pcm/sndstat.h>
 #include <dev/sound/version.h>
+#include <sys/devfs.h>
 #include <sys/limits.h>
 #include <sys/sysctl.h>
 
@@ -1121,6 +1122,14 @@ pcm_register(device_t dev, void *devinfo, int numplay, int numrec)
        if (d->flags & SD_F_EQ)
                feeder_eq_initsys(dev);
 
+       /* XXX use make_autoclone_dev? */
+       /* XXX PCMMAXCHAN can be created for regular channels */
+       d->dsp_clonedev = make_dev(&dsp_ops,
+                           PCMMINOR(device_get_unit(dev)),
+                           UID_ROOT, GID_WHEEL, 0666, "dsp%d",
+                           device_get_unit(dev));
+       devfs_clone_handler_add(devtoname(d->dsp_clonedev), dsp_clone);
+
        sndstat_register(dev, d->status, sndstat_prepare_pcm);
 
        return 0;
index 6deb2e0..942ffe0 100644 (file)
@@ -402,6 +402,7 @@ struct snddev_info {
        char status[SND_STATUSLEN];
        struct lock *lock;
        struct cdev *mixer_dev;
+       struct cdev *dsp_clonedev;
        uint32_t pvchanrate, pvchanformat;
        uint32_t rvchanrate, rvchanformat;
        int32_t eqpreamp;