version 1.47, 2010/04/17 09:16:57 |
version 1.48, 2010/04/21 06:13:07 |
|
|
*/ |
*/ |
void |
void |
dev_attach(char *name, unsigned mode, |
dev_attach(char *name, unsigned mode, |
struct abuf *ibuf, struct aparams *sipar, |
struct abuf *ibuf, struct aparams *sipar, unsigned inch, |
struct abuf *obuf, struct aparams *sopar, |
struct abuf *obuf, struct aparams *sopar, unsigned onch, |
unsigned xrun, int vol) |
unsigned xrun, int vol) |
{ |
{ |
struct abuf *pbuf = NULL, *rbuf = NULL; |
struct abuf *pbuf = NULL, *rbuf = NULL; |
struct aparams ipar, opar; |
struct aparams ipar, opar; |
struct aproc *conv; |
struct aproc *conv; |
unsigned round, nblk; |
unsigned round, nblk, nch; |
|
|
#ifdef DEBUG |
#ifdef DEBUG |
if ((!APROC_OK(dev_mix) && (mode & MODE_PLAY)) || |
if ((!APROC_OK(dev_mix) && (mode & MODE_PLAY)) || |
|
|
return; |
return; |
} |
} |
#endif |
#endif |
|
|
if (mode & MODE_PLAY) { |
if (mode & MODE_PLAY) { |
ipar = *sipar; |
ipar = *sipar; |
pbuf = LIST_FIRST(&dev_mix->obuflist); |
pbuf = LIST_FIRST(&dev_mix->obuflist); |
nblk = (dev_bufsz / dev_round + 3) / 4; |
nblk = (dev_bufsz / dev_round + 3) / 4; |
round = dev_roundof(ipar.rate); |
round = dev_roundof(ipar.rate); |
|
nch = ipar.cmax - ipar.cmin + 1; |
if (!aparams_eqenc(&ipar, &dev_opar)) { |
if (!aparams_eqenc(&ipar, &dev_opar)) { |
conv = dec_new(name, &ipar); |
conv = dec_new(name, &ipar); |
ipar.bps = dev_opar.bps; |
ipar.bps = dev_opar.bps; |
|
|
ibuf = abuf_new(nblk * round, &ipar); |
ibuf = abuf_new(nblk * round, &ipar); |
aproc_setout(conv, ibuf); |
aproc_setout(conv, ibuf); |
} |
} |
|
if (inch > 0 && nch >= inch * 2) { |
|
conv = join_new(name); |
|
aproc_setin(conv, ibuf); |
|
ipar.cmax = ipar.cmin + inch - 1; |
|
ibuf = abuf_new(nblk * round, &ipar); |
|
aproc_setout(conv, ibuf); |
|
} |
if (!aparams_eqrate(&ipar, &dev_opar)) { |
if (!aparams_eqrate(&ipar, &dev_opar)) { |
conv = resamp_new(name, round, dev_round); |
conv = resamp_new(name, round, dev_round); |
ipar.rate = dev_opar.rate; |
ipar.rate = dev_opar.rate; |
|
|
ibuf = abuf_new(nblk * round, &ipar); |
ibuf = abuf_new(nblk * round, &ipar); |
aproc_setout(conv, ibuf); |
aproc_setout(conv, ibuf); |
} |
} |
|
if (inch > 0 && nch * 2 <= inch) { |
|
conv = join_new(name); |
|
aproc_setin(conv, ibuf); |
|
ipar.cmax = ipar.cmin + inch - 1; |
|
ibuf = abuf_new(nblk * round, &ipar); |
|
aproc_setout(conv, ibuf); |
|
} |
aproc_setin(dev_mix, ibuf); |
aproc_setin(dev_mix, ibuf); |
ibuf->r.mix.xrun = xrun; |
ibuf->r.mix.xrun = xrun; |
ibuf->r.mix.maxweight = vol; |
ibuf->r.mix.maxweight = vol; |
|
|
rbuf = LIST_FIRST(&dev_sub->ibuflist); |
rbuf = LIST_FIRST(&dev_sub->ibuflist); |
round = dev_roundof(opar.rate); |
round = dev_roundof(opar.rate); |
nblk = (dev_bufsz / dev_round + 3) / 4; |
nblk = (dev_bufsz / dev_round + 3) / 4; |
|
nch = opar.cmax - opar.cmin + 1; |
if (!aparams_eqenc(&opar, &dev_ipar)) { |
if (!aparams_eqenc(&opar, &dev_ipar)) { |
conv = enc_new(name, &opar); |
conv = enc_new(name, &opar); |
opar.bps = dev_ipar.bps; |
opar.bps = dev_ipar.bps; |
|
|
obuf = abuf_new(nblk * round, &opar); |
obuf = abuf_new(nblk * round, &opar); |
aproc_setin(conv, obuf); |
aproc_setin(conv, obuf); |
} |
} |
|
if (onch > 0 && nch >= onch * 2) { |
|
conv = join_new(name); |
|
aproc_setout(conv, obuf); |
|
opar.cmax = opar.cmin + onch - 1; |
|
obuf = abuf_new(nblk * round, &opar); |
|
aproc_setin(conv, obuf); |
|
} |
if (!aparams_eqrate(&opar, &dev_ipar)) { |
if (!aparams_eqrate(&opar, &dev_ipar)) { |
conv = resamp_new(name, dev_round, round); |
conv = resamp_new(name, dev_round, round); |
opar.rate = dev_ipar.rate; |
opar.rate = dev_ipar.rate; |
|
|
obuf = abuf_new(nblk * round, &opar); |
obuf = abuf_new(nblk * round, &opar); |
aproc_setin(conv, obuf); |
aproc_setin(conv, obuf); |
} |
} |
|
if (onch > 0 && nch * 2 <= onch) { |
|
conv = join_new(name); |
|
aproc_setout(conv, obuf); |
|
opar.cmax = opar.cmin + onch - 1; |
|
obuf = abuf_new(nblk * round, &opar); |
|
aproc_setin(conv, obuf); |
|
} |
aproc_setout(dev_sub, obuf); |
aproc_setout(dev_sub, obuf); |
obuf->w.sub.xrun = xrun; |
obuf->w.sub.xrun = xrun; |
} |
} |
|
|
rbuf = LIST_FIRST(&dev_submon->ibuflist); |
rbuf = LIST_FIRST(&dev_submon->ibuflist); |
round = dev_roundof(opar.rate); |
round = dev_roundof(opar.rate); |
nblk = (dev_bufsz / dev_round + 3) / 4; |
nblk = (dev_bufsz / dev_round + 3) / 4; |
|
nch = opar.cmax - opar.cmin + 1; |
if (!aparams_eqenc(&opar, &dev_opar)) { |
if (!aparams_eqenc(&opar, &dev_opar)) { |
conv = enc_new(name, &opar); |
conv = enc_new(name, &opar); |
opar.bps = dev_opar.bps; |
opar.bps = dev_opar.bps; |
|
|
obuf = abuf_new(nblk * round, &opar); |
obuf = abuf_new(nblk * round, &opar); |
aproc_setin(conv, obuf); |
aproc_setin(conv, obuf); |
} |
} |
|
if (onch > 0 && nch >= onch * 2) { |
|
conv = join_new(name); |
|
aproc_setout(conv, obuf); |
|
opar.cmax = opar.cmin + onch - 1; |
|
obuf = abuf_new(nblk * round, &opar); |
|
aproc_setin(conv, obuf); |
|
} |
if (!aparams_eqrate(&opar, &dev_opar)) { |
if (!aparams_eqrate(&opar, &dev_opar)) { |
conv = resamp_new(name, dev_round, round); |
conv = resamp_new(name, dev_round, round); |
opar.rate = dev_opar.rate; |
opar.rate = dev_opar.rate; |
round = dev_round; |
round = dev_round; |
aproc_setout(conv, obuf); |
aproc_setout(conv, obuf); |
|
obuf = abuf_new(nblk * round, &opar); |
|
aproc_setin(conv, obuf); |
|
} |
|
if (onch > 0 && nch * 2 <= onch) { |
|
conv = join_new(name); |
|
aproc_setout(conv, obuf); |
|
opar.cmax = opar.cmin + onch - 1; |
obuf = abuf_new(nblk * round, &opar); |
obuf = abuf_new(nblk * round, &opar); |
aproc_setin(conv, obuf); |
aproc_setin(conv, obuf); |
} |
} |