version 1.5, 2008/11/16 17:08:32 |
version 1.6, 2008/11/16 18:34:56 |
|
|
* parameters |
* parameters |
*/ |
*/ |
struct sock * |
struct sock * |
sock_new(struct fileops *ops, int fd, char *name, int maxweight) |
sock_new(struct fileops *ops, int fd, char *name, |
|
struct aparams *wpar, struct aparams *rpar, int maxweight) |
{ |
{ |
struct aproc *rproc, *wproc; |
struct aproc *rproc, *wproc; |
struct sock *f; |
struct sock *f; |
|
|
f = (struct sock *)pipe_new(ops, fd, name); |
f = (struct sock *)pipe_new(ops, fd, name); |
f->pstate = SOCK_INIT; |
f->pstate = SOCK_INIT; |
f->mode = 0; |
f->mode = 0; |
if (dev_rec) { |
if (dev_rec) { |
f->wpar = dev_ipar; |
f->templ_wpar = *wpar; |
|
f->wpar = f->templ_wpar; |
f->mode |= AMSG_REC; |
f->mode |= AMSG_REC; |
} |
} |
if (dev_play) { |
if (dev_play) { |
f->rpar = dev_opar; |
f->templ_rpar = *rpar; |
|
f->rpar = f->templ_rpar; |
f->mode |= AMSG_PLAY; |
f->mode |= AMSG_PLAY; |
} |
} |
f->xrun = AMSG_IGNORE; |
f->xrun = AMSG_IGNORE; |
|
|
if (AMSG_ISSET(p->rchan) && (f->mode & AMSG_REC)) { |
if (AMSG_ISSET(p->rchan) && (f->mode & AMSG_REC)) { |
if (p->rchan < 1) |
if (p->rchan < 1) |
p->rchan = 1; |
p->rchan = 1; |
if (p->rchan > NCHAN_MAX - 1) |
if (p->rchan > NCHAN_MAX) |
p->rchan = NCHAN_MAX - 1; |
p->rchan = NCHAN_MAX; |
f->wpar.cmin = 0; |
f->wpar.cmin = f->templ_wpar.cmin; |
f->wpar.cmax = p->rchan - 1; |
f->wpar.cmax = f->templ_wpar.cmin + p->rchan - 1; |
DPRINTF("sock_setpar: rchan -> %u\n", p->rchan); |
if (f->wpar.cmax > NCHAN_MAX - 1) |
|
f->wpar.cmax = NCHAN_MAX - 1; |
|
DPRINTF("sock_setpar: rchan -> %u:%u\n", |
|
f->wpar.cmin, f->wpar.cmax); |
} |
} |
if (AMSG_ISSET(p->pchan) && (f->mode & AMSG_PLAY)) { |
if (AMSG_ISSET(p->pchan) && (f->mode & AMSG_PLAY)) { |
if (p->pchan < 1) |
if (p->pchan < 1) |
p->pchan = 1; |
p->pchan = 1; |
if (p->pchan > NCHAN_MAX - 1) |
if (p->pchan > NCHAN_MAX) |
p->pchan = NCHAN_MAX - 1; |
p->pchan = NCHAN_MAX; |
f->rpar.cmin = 0; |
f->rpar.cmin = f->templ_rpar.cmin; |
f->rpar.cmax = p->pchan - 1; |
f->rpar.cmax = f->templ_wpar.cmin + p->pchan - 1; |
DPRINTF("sock_setpar: pchan -> %u\n", p->pchan); |
if (f->rpar.cmax > NCHAN_MAX - 1) |
|
f->rpar.cmax = NCHAN_MAX - 1; |
|
DPRINTF("sock_setpar: pchan -> %u:%u\n", |
|
f->rpar.cmin, f->rpar.cmax); |
} |
} |
if (AMSG_ISSET(p->rate)) { |
if (AMSG_ISSET(p->rate)) { |
if (p->rate < RATE_MIN) |
if (p->rate < RATE_MIN) |
|
|
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_div; |
m->u.cap.pchan = dev_opar.cmax - dev_opar.cmin + 1; |
m->u.cap.pchan = dev_mix ? |
m->u.cap.rchan = dev_ipar.cmax - dev_ipar.cmin + 1; |
(f->templ_rpar.cmax - f->templ_rpar.cmin + 1) : 0; |
|
m->u.cap.rchan = dev_sub ? |
|
(f->templ_wpar.cmax - f->templ_wpar.cmin + 1) : 0; |
m->u.cap.bits = sizeof(short) * 8; |
m->u.cap.bits = sizeof(short) * 8; |
m->u.cap.bps = sizeof(short); |
m->u.cap.bps = sizeof(short); |
f->rstate = SOCK_RRET; |
f->rstate = SOCK_RRET; |
|
|
} |
} |
return 1; |
return 1; |
} |
} |
|
|