Bug #2554 ยป 0001-Avoid-calling-chn_wrfeed-with-an-empty-soft-buffer.patch
| sys/dev/sound/pcm/channel.c | ||
|---|---|---|
|
if ((c->flags & (CHN_F_MAPPED | CHN_F_VIRTUAL)) || !(c->flags & CHN_F_TRIGGERED))
|
||
|
return;
|
||
|
chn_dmaupdate(c);
|
||
|
if (sndbuf_getsize(c->bufsoft) == 0) {
|
||
|
DEB(kprintf("chn_wrupdate: avoid calling chn_wrfeed without any data in soft buffer");)
|
||
|
return;
|
||
|
}
|
||
|
ret = chn_wrfeed(c);
|
||
|
/* tell the driver we've updated the primary buffer */
|
||
|
chn_trigger(c, PCMTRIG_EMLDMAWR);
|
||
| ... | ... | |
|
/* update pointers in primary buffer */
|
||
|
chn_dmaupdate(c);
|
||
|
/* ...and feed from secondary to primary */
|
||
|
if (sndbuf_getsize(c->bufsoft) == 0) {
|
||
|
DEB(kprintf("chn_wrintr: avoid calling chn_wrfeed without any data in soft buffer");)
|
||
|
return;
|
||
|
}
|
||
|
ret = chn_wrfeed(c);
|
||
|
/* tell the driver we've updated the primary buffer */
|
||
|
chn_trigger(c, PCMTRIG_EMLDMAWR);
|
||
| ... | ... | |
|
if (resid == resid_p)
|
||
|
count--;
|
||
|
if (resid > resid_p)
|
||
|
DEB(printf("chn_flush: buffer length increasind %d -> %d\n", resid_p, resid));
|
||
|
DEB(kprintf("chn_flush: buffer length increasind %d -> %d\n", resid_p, resid));
|
||
|
resid_p = resid;
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
desc.type = FEEDER_MIXER;
|
||
|
desc.in = 0;
|
||
|
} else {
|
||
|
DEB(printf("can't decide which feeder type to use!\n"));
|
||
|
DEB(kprintf("can't decide which feeder type to use!\n"));
|
||
|
return EOPNOTSUPP;
|
||
|
}
|
||
|
desc.out = c->format;
|
||
| ... | ... | |
|
tmp[0] = fc->desc->in;
|
||
|
tmp[1] = 0;
|
||
|
if (chn_fmtchain(c, tmp) == 0) {
|
||
|
DEB(printf("failed\n"));
|
||
|
DEB(kprintf("failed\n"));
|
||
|
return ENODEV;
|
||
|
}
|
||
|
DEB(printf("ok\n"));
|
||
|
DEB(kprintf("ok\n"));
|
||
|
err = chn_addfeeder(c, fc, fc->desc);
|
||
|
if (err) {
|
||
| ... | ... | |
|
hwfmt = chn_fmtchain(c, fmtlist);
|
||
|
if (hwfmt == 0 || !fmtvalid(hwfmt, fmtlist)) {
|
||
|
DEB(printf("Invalid hardware format: 0x%08x\n", hwfmt));
|
||
|
DEB(kprintf("Invalid hardware format: 0x%08x\n", hwfmt));
|
||
|
return ENODEV;
|
||
|
}
|
||