Deleted Added
full compact
38c38
< SND_DECLARE_FILE("$FreeBSD: head/sys/dev/sound/pcm/sound.c 170289 2007-06-04 18:25:08Z dwmalone $");
---
> SND_DECLARE_FILE("$FreeBSD: head/sys/dev/sound/pcm/sound.c 170815 2007-06-16 03:37:28Z ariff $");
133a134
> struct snddev_info *d;
139a141,144
> d = device_get_softc(dev);
> if (d != NULL && (flags & INTR_MPSAFE))
> d->flags |= SD_F_MPSAFE;
>
172c177
< snd_mtxassert(d->lock);
---
> PCM_BUSYASSERT(d);
191c196
< err = 0;
---
> PCM_BUSYASSERT(d);
193,194d197
< pcm_inprog(d, 1);
<
196,199c199,200
< (direction == PCMDIR_REC && d->reccount < 1)) {
< err = ENODEV;
< goto pcm_setvchans_out;
< }
---
> (direction == PCMDIR_REC && d->reccount < 1))
> return (ENODEV);
201,204c202,203
< if (!(d->flags & SD_F_AUTOVCHAN)) {
< err = EINVAL;
< goto pcm_setvchans_out;
< }
---
> if (!(d->flags & SD_F_AUTOVCHAN))
> return (EINVAL);
206,209c205,206
< if (newcnt < 0 || newcnt > SND_MAXVCHANS) {
< err = E2BIG;
< goto pcm_setvchans_out;
< }
---
> if (newcnt < 0 || newcnt > SND_MAXVCHANS)
> return (E2BIG);
215,218c212,213
< else {
< err = EINVAL;
< goto pcm_setvchans_out;
< }
---
> else
> return (EINVAL);
225a221
> ch = NULL;
230,231c226,229
< !(c->flags & (CHN_F_BUSY | CHN_F_VIRTUAL)))))
< goto pcm_setvchans_addok;
---
> !(c->flags & (CHN_F_BUSY | CHN_F_VIRTUAL))))) {
> ch = c;
> break;
> }
234,237c232,235
< err = EBUSY;
< goto pcm_setvchans_out;
< pcm_setvchans_addok:
< c->flags |= CHN_F_BUSY;
---
> if (ch == NULL)
> return (EBUSY);
> ch->flags |= CHN_F_BUSY;
> err = 0;
239c237
< err = vchan_create(c, num);
---
> err = vchan_create(ch, num);
248,252c246,251
< c->flags &= ~CHN_F_BUSY;
< CHN_UNLOCK(c);
< pcm_lock(d);
< pcm_clonereset(d);
< pcm_unlock(d);
---
> ch->flags &= ~CHN_F_BUSY;
> CHN_UNLOCK(ch);
> if (err != 0)
> return (err);
> else
> pcm_clonereset(d);
275,276c274
< if (vcnt == newcnt) {
< err = 0;
---
> if (vcnt == newcnt)
278d275
< }
283d279
< pcm_lock(d);
285d280
< pcm_unlock(d);
288,290c283
< pcm_setvchans_out:
< pcm_inprog(d, -1);
< return err;
---
> return (0);
304c297
< ("%s() invalid d=%p ch=%p direction=%d pid=%d devunit=%d",
---
> ("%s(): invalid d=%p ch=%p direction=%d pid=%d devunit=%d",
305a299
> PCM_BUSYASSERT(d);
329c323
< err = ENODEV;
---
> err = EOPNOTSUPP;
353a348,350
> if (devunit == -2)
> return (err);
>
355,357c352,353
< if (devunit == -1 || (devunit != -2 &&
< (snd_unit2d(devunit) == SND_DEV_DSPHW_VPLAY ||
< snd_unit2d(devunit) == SND_DEV_DSPHW_VREC))) {
---
> if (devunit == -1 || snd_unit2d(devunit) == SND_DEV_DSPHW_VPLAY ||
> snd_unit2d(devunit) == SND_DEV_DSPHW_VREC) {
380a377
> PCM_BUSYASSERT(c->parentsnddev);
381a379
>
385c383,384
< return 0;
---
>
> return (0);
391,392c390
< int r;
<
---
> PCM_BUSYASSERT(c->parentsnddev);
393a392
>
395,396c394,395
< r = c->refcount;
< return r;
---
>
> return (c->refcount);
402c401
< int r;
---
> snd_mtxassert(d->lock);
404,408d402
< if (delta == 0)
< return d->inprog;
<
< /* backtrace(); */
< pcm_lock(d);
410,412c404,405
< r = d->inprog;
< pcm_unlock(d);
< return r;
---
>
> return (d->inprog);
417a411,412
> PCM_BUSYASSERT(d);
>
431d425
< pcm_lock(d);
433d426
< pcm_unlock(d);
447c440
< if (d == NULL || CHN_EMPTY(d, channels.pcm))
---
> if (!PCM_REGISTERED(d) || CHN_EMPTY(d, channels.pcm))
475c468
< if (d == NULL)
---
> if (!PCM_REGISTERED(d))
476a470
> PCM_ACQUIRE_QUICK(d);
477a472
> PCM_RELEASE_QUICK(d);
492a488,489
> PCM_BUSYASSERT(d);
> snd_mtxassert(d->lock);
495d491
< pcm_lock(d);
497c493
< switch(dir) {
---
> switch (dir) {
527,528c523
< pcm_unlock(d);
< return NULL;
---
> return (NULL);
533,536c528,529
< if (*pnum >= max || chan >= max) {
< pcm_unlock(d);
< return NULL;
< }
---
> if (*pnum >= max || chan >= max)
> return (NULL);
547,548c540
< pcm_unlock(d);
< return NULL;
---
> return (NULL);
554,555c546
< pcm_unlock(d);
< return NULL;
---
> return (NULL);
565,566c556
< pcm_unlock(d);
< return NULL;
---
> return (NULL);
575,576c565
< pcm_unlock(d);
< return NULL;
---
> return (NULL);
579d567
< (*pnum)++;
581d568
<
593a581
> pcm_lock(d);
599,603c587
< pcm_lock(d);
< (*pnum)--;
< pcm_unlock(d);
<
< return NULL;
---
> return (NULL);
606c590
< return ch;
---
> return (ch);
615a600,601
> PCM_BUSYASSERT(d);
>
618,619c604,606
< device_printf(d->dev, "chn_kill(%s) failed, err = %d\n", ch->name, err);
< return err;
---
> device_printf(ch->dev, "chn_kill(%s) failed, err = %d\n",
> ch->name, err);
> return (err);
625c612
< return 0;
---
> return (0);
634,635c621,622
< pcm_lock(d);
<
---
> PCM_BUSYASSERT(d);
> snd_mtxassert(d->lock);
651,652c638
< pcm_unlock(d);
< return ENODEV;
---
> return (ENODEV);
672a659,675
> switch (CHN_DEV(ch)) {
> case SND_DEV_DSPHW_PLAY:
> d->playcount++;
> break;
> case SND_DEV_DSPHW_VPLAY:
> d->pvchancount++;
> break;
> case SND_DEV_DSPHW_REC:
> d->reccount++;
> break;
> case SND_DEV_DSPHW_VREC:
> d->rvchancount++;
> break;
> default:
> break;
> }
>
674d676
< pcm_unlock(d);
676c678
< return 0;
---
> return (0);
683a686,688
> PCM_BUSYASSERT(d);
> snd_mtxassert(d->lock);
>
692c697
< return EINVAL;
---
> return (EINVAL);
694a700
>
712c718,720
< return 0;
---
> d->devcount--;
>
> return (0);
721a730,732
> PCM_BUSYASSERT(d);
>
> pcm_lock(d);
724,725c735,738
< device_printf(d->dev, "pcm_chn_create(%s, %d, %p) failed\n", cls->name, dir, devinfo);
< return ENODEV;
---
> device_printf(d->dev, "pcm_chn_create(%s, %d, %p) failed\n",
> cls->name, dir, devinfo);
> pcm_unlock(d);
> return (ENODEV);
728a742
> pcm_unlock(d);
730c744,745
< device_printf(d->dev, "pcm_chn_add(%s) failed, err=%d\n", ch->name, err);
---
> device_printf(d->dev, "pcm_chn_add(%s) failed, err=%d\n",
> ch->name, err);
732d746
< return err;
735c749
< return err;
---
> return (err);
743c757
< int error = 0;
---
> int error;
744a759,760
> PCM_BUSYASSERT(d);
>
746a763
> pcm_lock(d);
747a765
> pcm_unlock(d);
758c776
< pcm_setmaxautovchans(d, snd_maxautovchans);
---
> PCM_BUSYASSERT(d);
760c778,779
< pcm_lock(d);
---
> if (d->playcount == 0 || d->reccount == 0)
> d->flags |= SD_F_SIMPLEX;
761a781,788
> if ((d->playcount > 0 || d->reccount > 0) &&
> !(d->flags & SD_F_AUTOVCHAN)) {
> d->flags |= SD_F_AUTOVCHAN;
> vchan_initsys(dev);
> }
>
> pcm_setmaxautovchans(d, snd_maxautovchans);
>
763a791,792
> pcm_lock(d);
>
765c794
< if (d->clones != NULL) {
---
> if (d->clones != NULL)
767d795
< }
768a797,801
> /* Done, we're ready.. */
> d->flags |= SD_F_REGISTERED;
>
> PCM_RELEASE(d);
>
771c804
< return 0;
---
> return (0);
837c870
< if (d == NULL || d->clones == NULL)
---
> if (!PCM_REGISTERED(d) || d->clones == NULL)
840c873,874
< pcm_lock(d);
---
> PCM_ACQUIRE_QUICK(d);
>
842d875
< pcm_unlock(d);
846c879
< if ((flags & ~SND_CLONE_MASK))
---
> if (flags & ~SND_CLONE_MASK)
848,849c881
< else {
< pcm_lock(d);
---
> else
851,852d882
< pcm_unlock(d);
< }
854a885,886
> PCM_RELEASE_QUICK(d);
>
865c897
< if (d == NULL || d->clones == NULL)
---
> if (!PCM_REGISTERED(d) || d->clones == NULL)
868c900,901
< pcm_lock(d);
---
> PCM_ACQUIRE_QUICK(d);
>
870d902
< pcm_unlock(d);
876,877c908
< else {
< pcm_lock(d);
---
> else
879,880d909
< pcm_unlock(d);
< }
882a912,913
> PCM_RELEASE_QUICK(d);
>
893c924
< if (d == NULL || d->clones == NULL)
---
> if (!PCM_REGISTERED(d) || d->clones == NULL)
900,902c931,935
< pcm_lock(d);
< (void)snd_clone_gc(d->clones);
< pcm_unlock(d);
---
> PCM_ACQUIRE_QUICK(d);
> val = snd_clone_gc(d->clones);
> PCM_RELEASE_QUICK(d);
> if (bootverbose != 0 || snd_verbose > 3)
> device_printf(d->dev, "clone gc: pruned=%d\n", val);
921c954
< if (d == NULL || d->clones == NULL)
---
> if (!PCM_REGISTERED(d) || d->clones == NULL)
923,925c956,961
< pcm_lock(d);
< (void)snd_clone_gc(d->clones);
< pcm_unlock(d);
---
> PCM_ACQUIRE_QUICK(d);
> val = snd_clone_gc(d->clones);
> PCM_RELEASE_QUICK(d);
> if (bootverbose != 0 || snd_verbose > 3)
> device_printf(d->dev, "clone gc: pruned=%d\n",
> val);
955a992
> d->dev = dev;
957c994,996
<
---
> cv_init(&d->cv, device_get_nameunit(dev));
> PCM_ACQUIRE_QUICK(d);
> dsp_cdevinfo_init(d);
966d1004
< d->dev = dev;
984,988c1022,1023
< d->clones = snd_clone_create(
< #ifdef SND_DIAGNOSTIC
< d->lock,
< #endif
< SND_U_MASK | SND_D_MASK, PCMMAXCLONE, SND_CLONE_DEADLINE_DEFAULT,
---
> d->clones = snd_clone_create(SND_U_MASK | SND_D_MASK, PCMMAXCLONE,
> SND_CLONE_DEADLINE_DEFAULT, SND_CLONE_WAITOK |
993d1027
< pcm_lock(d);
998d1031
< pcm_unlock(d);
1003a1037
> /* XXX This is incorrect, but lets play along for now. */
1041a1076
>
1047a1083
>
1054c1090
< struct snddev_info *d = device_get_softc(dev);
---
> struct snddev_info *d;
1059a1096
> d = device_get_softc(dev);
1060a1098,1102
> if (!PCM_ALIVE(d)) {
> device_printf(dev, "unregister: device not configured\n");
> return (0);
> }
>
1063c1105
< return EBUSY;
---
> return (EBUSY);
1067c1109,1111
< if (d->inprog) {
---
> PCM_WAIT(d);
>
> if (d->inprog != 0) {
1071c1115
< return EBUSY;
---
> return (EBUSY);
1073a1118,1120
> PCM_ACQUIRE(d);
> pcm_unlock(d);
>
1074a1122
> CHN_LOCK(ch);
1076,1077c1124,1128
< device_printf(dev, "unregister: channel %s busy (pid %d)\n", ch->name, ch->pid);
< pcm_unlock(d);
---
> device_printf(dev,
> "unregister: channel %s busy (pid %d)\n",
> ch->name, ch->pid);
> CHN_UNLOCK(ch);
> PCM_RELEASE_QUICK(d);
1079c1130
< return EBUSY;
---
> return (EBUSY);
1080a1132
> CHN_UNLOCK(ch);
1086c1138
< pcm_unlock(d);
---
> PCM_RELEASE_QUICK(d);
1088,1089c1140,1142
< return EBUSY;
< } else
---
> return (EBUSY);
> } else {
> pcm_lock(d);
1090a1144,1145
> pcm_unlock(d);
> }
1094a1150
> pcm_lock(d);
1096a1153
> PCM_RELEASE(d);
1099c1156
< return EBUSY;
---
> return (EBUSY);
1101a1159,1167
> pcm_lock(d);
> d->flags |= SD_F_DYING;
> d->flags &= ~SD_F_REGISTERED;
> pcm_unlock(d);
>
> /*
> * No lock being held, so this thing can be flushed without
> * stucking into devdrn oblivion.
> */
1107,1108d1172
< d->devcount = 0;
<
1125a1190,1194
> dsp_cdevinfo_flush(d);
>
> pcm_lock(d);
> PCM_RELEASE(d);
> cv_destroy(&d->cv);
1137,1138c1206
< if (device_get_unit(dev) == i ||
< devclass_get_softc(pcm_devclass, i) == NULL)
---
> if (device_get_unit(dev) == i)
1140,1141c1208,1212
< snd_unit = i;
< break;
---
> d = devclass_get_softc(pcm_devclass, i);
> if (PCM_REGISTERED(d)) {
> snd_unit = i;
> break;
> }
1145c1216
< return 0;
---
> return (0);
1164,1169c1235,1245
< pcm_lock(d);
< if (!CHN_EMPTY(d, channels.pcm)) {
< sbuf_printf(s, " (%dp:%dv/%dr:%dv channels%s%s)",
< d->playcount, d->pvchancount,
< d->reccount, d->rvchancount,
< (d->flags & SD_F_SIMPLEX)? "" : " duplex",
---
> PCM_BUSYASSERT(d);
>
> if (CHN_EMPTY(d, channels.pcm)) {
> sbuf_printf(s, " (mixer only)");
> return 0;
> }
>
> sbuf_printf(s, " (%dp:%dv/%dr:%dv channels%s%s)",
> d->playcount, d->pvchancount,
> d->reccount, d->rvchancount,
> (d->flags & SD_F_SIMPLEX)? "" : " duplex",
1171c1247
< (device_get_unit(dev) == snd_unit)? " default" : ""
---
> (device_get_unit(dev) == snd_unit)? " default" : ""
1173c1249
< ""
---
> ""
1175c1251
< );
---
> );
1177,1180c1253,1254
< if (verbose <= 1) {
< pcm_unlock(d);
< return 0;
< }
---
> if (verbose <= 1)
> return 0;
1182c1256
< CHN_FOREACH(c, d, channels.pcm) {
---
> CHN_FOREACH(c, d, channels.pcm) {
1184,1185c1258,1259
< KASSERT(c->bufhard != NULL && c->bufsoft != NULL,
< ("hosed pcm channel setup"));
---
> KASSERT(c->bufhard != NULL && c->bufsoft != NULL,
> ("hosed pcm channel setup"));
1187c1261
< sbuf_printf(s, "\n\t");
---
> sbuf_printf(s, "\n\t");
1189,1200c1263,1274
< /* it would be better to indent child channels */
< sbuf_printf(s, "%s[%s]: ", c->parentchannel? c->parentchannel->name : "", c->name);
< sbuf_printf(s, "spd %d", c->speed);
< if (c->speed != sndbuf_getspd(c->bufhard))
< sbuf_printf(s, "/%d", sndbuf_getspd(c->bufhard));
< sbuf_printf(s, ", fmt 0x%08x", c->format);
< if (c->format != sndbuf_getfmt(c->bufhard))
< sbuf_printf(s, "/0x%08x", sndbuf_getfmt(c->bufhard));
< sbuf_printf(s, ", flags 0x%08x, 0x%08x", c->flags, c->feederflags);
< if (c->pid != -1)
< sbuf_printf(s, ", pid %d", c->pid);
< sbuf_printf(s, "\n\t");
---
> /* it would be better to indent child channels */
> sbuf_printf(s, "%s[%s]: ", c->parentchannel? c->parentchannel->name : "", c->name);
> sbuf_printf(s, "spd %d", c->speed);
> if (c->speed != sndbuf_getspd(c->bufhard))
> sbuf_printf(s, "/%d", sndbuf_getspd(c->bufhard));
> sbuf_printf(s, ", fmt 0x%08x", c->format);
> if (c->format != sndbuf_getfmt(c->bufhard))
> sbuf_printf(s, "/0x%08x", sndbuf_getfmt(c->bufhard));
> sbuf_printf(s, ", flags 0x%08x, 0x%08x", c->flags, c->feederflags);
> if (c->pid != -1)
> sbuf_printf(s, ", pid %d", c->pid);
> sbuf_printf(s, "\n\t");
1202,1217c1276,1291
< sbuf_printf(s, "interrupts %d, ", c->interrupts);
< if (c->direction == PCMDIR_REC)
< sbuf_printf(s, "overruns %d, feed %u, hfree %d, sfree %d [b:%d/%d/%d|bs:%d/%d/%d]",
< c->xruns, c->feedcount, sndbuf_getfree(c->bufhard), sndbuf_getfree(c->bufsoft),
< sndbuf_getsize(c->bufhard), sndbuf_getblksz(c->bufhard),
< sndbuf_getblkcnt(c->bufhard),
< sndbuf_getsize(c->bufsoft), sndbuf_getblksz(c->bufsoft),
< sndbuf_getblkcnt(c->bufsoft));
< else
< sbuf_printf(s, "underruns %d, feed %u, ready %d [b:%d/%d/%d|bs:%d/%d/%d]",
< c->xruns, c->feedcount, sndbuf_getready(c->bufsoft),
< sndbuf_getsize(c->bufhard), sndbuf_getblksz(c->bufhard),
< sndbuf_getblkcnt(c->bufhard),
< sndbuf_getsize(c->bufsoft), sndbuf_getblksz(c->bufsoft),
< sndbuf_getblkcnt(c->bufsoft));
< sbuf_printf(s, "\n\t");
---
> sbuf_printf(s, "interrupts %d, ", c->interrupts);
> if (c->direction == PCMDIR_REC)
> sbuf_printf(s, "overruns %d, feed %u, hfree %d, sfree %d [b:%d/%d/%d|bs:%d/%d/%d]",
> c->xruns, c->feedcount, sndbuf_getfree(c->bufhard), sndbuf_getfree(c->bufsoft),
> sndbuf_getsize(c->bufhard), sndbuf_getblksz(c->bufhard),
> sndbuf_getblkcnt(c->bufhard),
> sndbuf_getsize(c->bufsoft), sndbuf_getblksz(c->bufsoft),
> sndbuf_getblkcnt(c->bufsoft));
> else
> sbuf_printf(s, "underruns %d, feed %u, ready %d [b:%d/%d/%d|bs:%d/%d/%d]",
> c->xruns, c->feedcount, sndbuf_getready(c->bufsoft),
> sndbuf_getsize(c->bufhard), sndbuf_getblksz(c->bufhard),
> sndbuf_getblkcnt(c->bufhard),
> sndbuf_getsize(c->bufsoft), sndbuf_getblksz(c->bufsoft),
> sndbuf_getblkcnt(c->bufsoft));
> sbuf_printf(s, "\n\t");
1219c1293,1306
< sbuf_printf(s, "{%s}", (c->direction == PCMDIR_REC)? "hardware" : "userland");
---
> sbuf_printf(s, "{%s}", (c->direction == PCMDIR_REC)? "hardware" : "userland");
> sbuf_printf(s, " -> ");
> f = c->feeder;
> while (f->source != NULL)
> f = f->source;
> while (f != NULL) {
> sbuf_printf(s, "%s", f->class->name);
> if (f->desc->type == FEEDER_FMT)
> sbuf_printf(s, "(0x%08x -> 0x%08x)", f->desc->in, f->desc->out);
> if (f->desc->type == FEEDER_RATE)
> sbuf_printf(s, "(%d -> %d)", FEEDER_GET(f, FEEDRATE_SRC), FEEDER_GET(f, FEEDRATE_DST));
> if (f->desc->type == FEEDER_ROOT || f->desc->type == FEEDER_MIXER ||
> f->desc->type == FEEDER_VOLUME)
> sbuf_printf(s, "(0x%08x)", f->desc->out);
1221,1236c1308
< f = c->feeder;
< while (f->source != NULL)
< f = f->source;
< while (f != NULL) {
< sbuf_printf(s, "%s", f->class->name);
< if (f->desc->type == FEEDER_FMT)
< sbuf_printf(s, "(0x%08x -> 0x%08x)", f->desc->in, f->desc->out);
< if (f->desc->type == FEEDER_RATE)
< sbuf_printf(s, "(%d -> %d)", FEEDER_GET(f, FEEDRATE_SRC), FEEDER_GET(f, FEEDRATE_DST));
< if (f->desc->type == FEEDER_ROOT || f->desc->type == FEEDER_MIXER ||
< f->desc->type == FEEDER_VOLUME)
< sbuf_printf(s, "(0x%08x)", f->desc->out);
< sbuf_printf(s, " -> ");
< f = f->parent;
< }
< sbuf_printf(s, "{%s}", (c->direction == PCMDIR_REC)? "userland" : "hardware");
---
> f = f->parent;
1238,1240c1310,1311
< } else
< sbuf_printf(s, " (mixer only)");
< pcm_unlock(d);
---
> sbuf_printf(s, "{%s}", (c->direction == PCMDIR_REC)? "userland" : "hardware");
> }
1253c1324
< int err, newcnt;
---
> int err, cnt;
1256,1257c1327,1328
< if (d == NULL)
< return EINVAL;
---
> if (!PCM_REGISTERED(d) || !(d->flags & SD_F_AUTOVCHAN))
> return (EINVAL);
1258a1330,1332
> pcm_lock(d);
> PCM_WAIT(d);
>
1261,1262d1334
< if (d->playcount < 1)
< return ENODEV;
1264a1337
> cnt = d->playcount;
1267,1268d1339
< if (d->reccount < 1)
< return ENODEV;
1270a1342
> cnt = d->reccount;
1273c1345,1346
< return EINVAL;
---
> pcm_unlock(d);
> return (EINVAL);
1277,1278c1350,1353
< newcnt = vchancount;
< err = sysctl_handle_int(oidp, &newcnt, 0, req);
---
> if (cnt < 1) {
> pcm_unlock(d);
> return (ENODEV);
> }
1280,1285c1355,1366
< if (err == 0 && req->newptr != NULL && vchancount != newcnt) {
< if (newcnt < 0)
< newcnt = 0;
< if (newcnt > SND_MAXVCHANS)
< newcnt = SND_MAXVCHANS;
< err = pcm_setvchans(d, direction, newcnt, -1);
---
> PCM_ACQUIRE(d);
> pcm_unlock(d);
>
> cnt = vchancount;
> err = sysctl_handle_int(oidp, &cnt, 0, req);
>
> if (err == 0 && req->newptr != NULL && vchancount != cnt) {
> if (cnt < 0)
> cnt = 0;
> if (cnt > SND_MAXVCHANS)
> cnt = SND_MAXVCHANS;
> err = pcm_setvchans(d, direction, cnt, -1);
1287a1369,1370
> PCM_RELEASE_QUICK(d);
>
1335,1336c1418
< if (pcm_devclass != NULL) {
< j = 0;
---
> j = 0;
1338,1342c1420,1424
< for (i = 0; pcm_devclass != NULL &&
< i < devclass_get_maxunit(pcm_devclass); i++) {
< d = devclass_get_softc(pcm_devclass, i);
< if (!d)
< continue;
---
> for (i = 0; pcm_devclass != NULL &&
> i < devclass_get_maxunit(pcm_devclass); i++) {
> d = devclass_get_softc(pcm_devclass, i);
> if (!PCM_REGISTERED(d))
> continue;
1344,1348c1426
< /* See note in function's docblock */
< mtx_assert(d->lock, MA_NOTOWNED);
< /* Increment device's "operations in progress" */
< pcm_inprog(d, 1);
< pcm_lock(d);
---
> /* XXX Need Giant magic entry ??? */
1350,1351c1428,1430
< si->numaudios += d->devcount;
< ++ncards;
---
> /* See note in function's docblock */
> mtx_assert(d->lock, MA_NOTOWNED);
> pcm_lock(d);
1353,1361c1432,1433
< CHN_FOREACH(c, d, channels.pcm) {
< mtx_assert(c->lock, MA_NOTOWNED);
< CHN_LOCK(c);
< if (c->flags & CHN_F_BUSY)
< si->openedaudio[j / intnbits] |=
< (1 << (j % intnbits));
< CHN_UNLOCK(c);
< j++;
< }
---
> si->numaudios += d->devcount;
> ++ncards;
1363,1364c1435,1442
< pcm_unlock(d);
< pcm_inprog(d, -1);
---
> CHN_FOREACH(c, d, channels.pcm) {
> mtx_assert(c->lock, MA_NOTOWNED);
> CHN_LOCK(c);
> if (c->flags & CHN_F_BUSY)
> si->openedaudio[j / intnbits] |=
> (1 << (j % intnbits));
> CHN_UNLOCK(c);
> j++;
1365a1444,1445
>
> pcm_unlock(d);