version 1.8, 2008/11/17 07:04:13 |
version 1.9, 2008/12/07 17:10:41 |
|
|
sock_setpar(struct sock *f) |
sock_setpar(struct sock *f) |
{ |
{ |
struct amsg_par *p = &f->rmsg.u.par; |
struct amsg_par *p = &f->rmsg.u.par; |
unsigned minbuf, maxbuf; |
unsigned min, max, rate; |
|
|
if (AMSG_ISSET(p->mode)) { |
if (AMSG_ISSET(p->mode)) { |
if ((p->mode & ~(AMSG_PLAY | AMSG_REC)) || p->mode == 0) { |
if ((p->mode & ~(AMSG_PLAY | AMSG_REC)) || p->mode == 0) { |
|
|
p->rate = RATE_MIN; |
p->rate = RATE_MIN; |
if (p->rate > RATE_MAX) |
if (p->rate > RATE_MAX) |
p->rate = RATE_MAX; |
p->rate = RATE_MAX; |
dev_roundrate(&p->rate, &f->round); |
f->round = dev_roundof(p->rate); |
f->rpar.rate = f->wpar.rate = p->rate; |
f->rpar.rate = f->wpar.rate = p->rate; |
if (f->mode & AMSG_PLAY) |
if (!AMSG_ISSET(p->bufsz)) |
f->bufsz = 2 * dev_bufsz * f->rpar.rate / dev_rate; |
p->bufsz = 2 * dev_bufsz / dev_round * f->round; |
else |
DPRINTF("sock_setpar: rate -> %u, round -> %u\n", |
f->bufsz = 2 * dev_bufsz * f->wpar.rate / dev_rate; |
p->rate, f->round); |
DPRINTF("sock_setpar: rate -> %u\n", p->rate); |
|
} |
} |
if (AMSG_ISSET(p->xrun)) { |
if (AMSG_ISSET(p->xrun)) { |
if (p->xrun != AMSG_IGNORE && |
if (p->xrun != AMSG_IGNORE && |
|
|
DPRINTF("sock_setpar: xrun -> %u\n", f->xrun); |
DPRINTF("sock_setpar: xrun -> %u\n", f->xrun); |
} |
} |
if (AMSG_ISSET(p->bufsz)) { |
if (AMSG_ISSET(p->bufsz)) { |
minbuf = 3 * dev_bufsz / 2; |
rate = (f->mode & AMSG_PLAY) ? f->rpar.rate : f->wpar.rate; |
minbuf -= minbuf % dev_round; |
min = (3 * (dev_bufsz / dev_round) + 1) / 2; |
maxbuf = dev_bufsz; |
max = (dev_bufsz + rate + dev_round - 1) / dev_round; |
if (f->mode & AMSG_PLAY) { |
min *= f->round; |
minbuf = minbuf * f->rpar.rate / dev_rate; |
max *= f->round; |
maxbuf = maxbuf * f->rpar.rate / dev_rate; |
p->bufsz += f->round - 1; |
maxbuf += f->rpar.rate; |
p->bufsz -= p->bufsz % f->round; |
} else { |
if (p->bufsz < min) |
minbuf = minbuf * f->wpar.rate / dev_rate; |
p->bufsz = min; |
maxbuf = maxbuf * f->wpar.rate / dev_rate; |
if (p->bufsz > max) |
maxbuf += f->wpar.rate; |
p->bufsz = max; |
} |
f->bufsz = p->bufsz; |
if (p->bufsz < minbuf) |
|
p->bufsz = minbuf; |
|
if (p->bufsz > maxbuf) |
|
p->bufsz = maxbuf; |
|
f->bufsz = p->bufsz + f->round - 1; |
|
f->bufsz -= f->bufsz % f->round; |
|
DPRINTF("sock_setpar: bufsz -> %u\n", f->bufsz); |
DPRINTF("sock_setpar: bufsz -> %u\n", f->bufsz); |
} |
} |
#ifdef DEBUG |
#ifdef DEBUG |
|
|
AMSG_INIT(m); |
AMSG_INIT(m); |
m->cmd = AMSG_GETCAP; |
m->cmd = AMSG_GETCAP; |
m->u.cap.rate = dev_rate; |
m->u.cap.rate = dev_rate; |
m->u.cap.rate_div = dev_rate_div; |
m->u.cap.rate_div = dev_rate; |
m->u.cap.pchan = dev_mix ? |
m->u.cap.pchan = dev_mix ? |
(f->templ_rpar.cmax - f->templ_rpar.cmin + 1) : 0; |
(f->templ_rpar.cmax - f->templ_rpar.cmin + 1) : 0; |
m->u.cap.rchan = dev_sub ? |
m->u.cap.rchan = dev_sub ? |