version 1.53, 2010/04/21 06:13:07 |
version 1.54, 2010/04/24 06:18:23 |
|
|
p = malloc(sizeof(struct aproc)); |
p = malloc(sizeof(struct aproc)); |
if (p == NULL) |
if (p == NULL) |
err(1, name); |
err(1, name); |
LIST_INIT(&p->ibuflist); |
LIST_INIT(&p->ins); |
LIST_INIT(&p->obuflist); |
LIST_INIT(&p->outs); |
p->name = name; |
p->name = name; |
p->ops = ops; |
p->ops = ops; |
p->refs = 0; |
p->refs = 0; |
|
|
#endif |
#endif |
p->ops->done(p); |
p->ops->done(p); |
} |
} |
while (!LIST_EMPTY(&p->ibuflist)) { |
while (!LIST_EMPTY(&p->ins)) { |
i = LIST_FIRST(&p->ibuflist); |
i = LIST_FIRST(&p->ins); |
abuf_hup(i); |
abuf_hup(i); |
} |
} |
while (!LIST_EMPTY(&p->obuflist)) { |
while (!LIST_EMPTY(&p->outs)) { |
i = LIST_FIRST(&p->obuflist); |
i = LIST_FIRST(&p->outs); |
abuf_eof(i); |
abuf_eof(i); |
} |
} |
p->flags |= APROC_ZOMB; |
p->flags |= APROC_ZOMB; |
|
|
void |
void |
aproc_setin(struct aproc *p, struct abuf *ibuf) |
aproc_setin(struct aproc *p, struct abuf *ibuf) |
{ |
{ |
LIST_INSERT_HEAD(&p->ibuflist, ibuf, ient); |
LIST_INSERT_HEAD(&p->ins, ibuf, ient); |
ibuf->rproc = p; |
ibuf->rproc = p; |
if (p->ops->newin) |
if (p->ops->newin) |
p->ops->newin(p, ibuf); |
p->ops->newin(p, ibuf); |
|
|
void |
void |
aproc_setout(struct aproc *p, struct abuf *obuf) |
aproc_setout(struct aproc *p, struct abuf *obuf) |
{ |
{ |
LIST_INSERT_HEAD(&p->obuflist, obuf, oent); |
LIST_INSERT_HEAD(&p->outs, obuf, oent); |
obuf->wproc = p; |
obuf->wproc = p; |
if (p->ops->newout) |
if (p->ops->newout) |
p->ops->newout(p, obuf); |
p->ops->newout(p, obuf); |
|
|
{ |
{ |
struct abuf *obuf; |
struct abuf *obuf; |
|
|
LIST_FOREACH(obuf, &p->obuflist, oent) { |
LIST_FOREACH(obuf, &p->outs, oent) { |
abuf_ipos(obuf, delta); |
abuf_ipos(obuf, delta); |
} |
} |
} |
} |
|
|
{ |
{ |
struct abuf *ibuf; |
struct abuf *ibuf; |
|
|
LIST_FOREACH(ibuf, &p->ibuflist, ient) { |
LIST_FOREACH(ibuf, &p->ins, ient) { |
abuf_opos(ibuf, delta); |
abuf_opos(ibuf, delta); |
} |
} |
} |
} |
|
|
{ |
{ |
struct abuf *i; |
struct abuf *i; |
|
|
LIST_FOREACH(i, &p->ibuflist, ient) { |
LIST_FOREACH(i, &p->ins, ient) { |
if (i->inuse) |
if (i->inuse) |
return 1; |
return 1; |
} |
} |
LIST_FOREACH(i, &p->obuflist, oent) { |
LIST_FOREACH(i, &p->outs, oent) { |
if (i->inuse) |
if (i->inuse) |
return 1; |
return 1; |
} |
} |
|
|
|
|
if (p == dep) |
if (p == dep) |
return 1; |
return 1; |
LIST_FOREACH(i, &p->ibuflist, ient) { |
LIST_FOREACH(i, &p->ins, ient) { |
if (i->wproc && aproc_depend(i->wproc, dep)) |
if (i->wproc && aproc_depend(i->wproc, dep)) |
return 1; |
return 1; |
} |
} |
|
|
int |
int |
rfile_do(struct aproc *p, unsigned todo, unsigned *done) |
rfile_do(struct aproc *p, unsigned todo, unsigned *done) |
{ |
{ |
struct abuf *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *obuf = LIST_FIRST(&p->outs); |
struct file *f = p->u.io.file; |
struct file *f = p->u.io.file; |
unsigned char *data; |
unsigned char *data; |
unsigned n, count, off; |
unsigned n, count, off; |
|
|
int |
int |
rfile_in(struct aproc *p, struct abuf *ibuf_dummy) |
rfile_in(struct aproc *p, struct abuf *ibuf_dummy) |
{ |
{ |
struct abuf *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *obuf = LIST_FIRST(&p->outs); |
struct file *f = p->u.io.file; |
struct file *f = p->u.io.file; |
|
|
if (!ABUF_WOK(obuf) || !(f->state & FILE_ROK)) |
if (!ABUF_WOK(obuf) || !(f->state & FILE_ROK)) |
|
|
* all buffers must be detached before deleting f->wproc, |
* all buffers must be detached before deleting f->wproc, |
* because otherwise it could trigger this code again |
* because otherwise it could trigger this code again |
*/ |
*/ |
obuf = LIST_FIRST(&p->obuflist); |
obuf = LIST_FIRST(&p->outs); |
if (obuf) |
if (obuf) |
abuf_eof(obuf); |
abuf_eof(obuf); |
if (f->wproc) { |
if (f->wproc) { |
|
|
* all buffers must be detached before deleting f->rproc, |
* all buffers must be detached before deleting f->rproc, |
* because otherwise it could trigger this code again |
* because otherwise it could trigger this code again |
*/ |
*/ |
ibuf = LIST_FIRST(&p->ibuflist); |
ibuf = LIST_FIRST(&p->ins); |
if (ibuf) |
if (ibuf) |
abuf_hup(ibuf); |
abuf_hup(ibuf); |
if (f->rproc) { |
if (f->rproc) { |
|
|
int |
int |
wfile_do(struct aproc *p, unsigned todo, unsigned *done) |
wfile_do(struct aproc *p, unsigned todo, unsigned *done) |
{ |
{ |
struct abuf *ibuf = LIST_FIRST(&p->ibuflist); |
struct abuf *ibuf = LIST_FIRST(&p->ins); |
struct file *f = p->u.io.file; |
struct file *f = p->u.io.file; |
unsigned char *data; |
unsigned char *data; |
unsigned n, count, off; |
unsigned n, count, off; |
|
|
int |
int |
wfile_out(struct aproc *p, struct abuf *obuf_dummy) |
wfile_out(struct aproc *p, struct abuf *obuf_dummy) |
{ |
{ |
struct abuf *ibuf = LIST_FIRST(&p->ibuflist); |
struct abuf *ibuf = LIST_FIRST(&p->ins); |
struct file *f = p->u.io.file; |
struct file *f = p->u.io.file; |
|
|
if (!abuf_fill(ibuf)) |
if (!abuf_fill(ibuf)) |
|
|
int |
int |
mix_xrun(struct aproc *p, struct abuf *i) |
mix_xrun(struct aproc *p, struct abuf *i) |
{ |
{ |
struct abuf *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *obuf = LIST_FIRST(&p->outs); |
unsigned fdrop, remain; |
unsigned fdrop, remain; |
|
|
if (i->r.mix.done > 0) |
if (i->r.mix.done > 0) |
|
|
int |
int |
mix_in(struct aproc *p, struct abuf *ibuf) |
mix_in(struct aproc *p, struct abuf *ibuf) |
{ |
{ |
struct abuf *i, *inext, *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *i, *inext, *obuf = LIST_FIRST(&p->outs); |
unsigned odone; |
unsigned odone; |
unsigned maxwrite; |
unsigned maxwrite; |
unsigned scount; |
unsigned scount; |
|
|
mix_bzero(obuf); |
mix_bzero(obuf); |
scount = 0; |
scount = 0; |
odone = obuf->w.mix.todo; |
odone = obuf->w.mix.todo; |
for (i = LIST_FIRST(&p->ibuflist); i != NULL; i = inext) { |
for (i = LIST_FIRST(&p->ins); i != NULL; i = inext) { |
inext = LIST_NEXT(i, ient); |
inext = LIST_NEXT(i, ient); |
if (i->r.mix.drop >= 0 && !abuf_fill(i)) |
if (i->r.mix.drop >= 0 && !abuf_fill(i)) |
continue; /* eof */ |
continue; /* eof */ |
|
|
if (odone > i->r.mix.done) |
if (odone > i->r.mix.done) |
odone = i->r.mix.done; |
odone = i->r.mix.done; |
} |
} |
if (LIST_EMPTY(&p->ibuflist) || scount == 0) |
if (LIST_EMPTY(&p->ins) || scount == 0) |
return 0; |
return 0; |
#ifdef DEBUG |
#ifdef DEBUG |
if (debug_level >= 4) { |
if (debug_level >= 4) { |
|
|
odone = maxwrite; |
odone = maxwrite; |
p->u.mix.lat += odone; |
p->u.mix.lat += odone; |
p->u.mix.abspos += odone; |
p->u.mix.abspos += odone; |
LIST_FOREACH(i, &p->ibuflist, ient) { |
LIST_FOREACH(i, &p->ins, ient) { |
i->r.mix.done -= odone; |
i->r.mix.done -= odone; |
} |
} |
abuf_wcommit(obuf, odone); |
abuf_wcommit(obuf, odone); |
|
|
mix_bzero(obuf); |
mix_bzero(obuf); |
scount = 0; |
scount = 0; |
odone = obuf->len; |
odone = obuf->len; |
for (i = LIST_FIRST(&p->ibuflist); i != NULL; i = inext) { |
for (i = LIST_FIRST(&p->ins); i != NULL; i = inext) { |
inext = LIST_NEXT(i, ient); |
inext = LIST_NEXT(i, ient); |
if (i->r.mix.drop >= 0 && !abuf_fill(i)) |
if (i->r.mix.drop >= 0 && !abuf_fill(i)) |
continue; /* eof */ |
continue; /* eof */ |
|
|
if (odone > i->r.mix.done) |
if (odone > i->r.mix.done) |
odone = i->r.mix.done; |
odone = i->r.mix.done; |
} |
} |
if (LIST_EMPTY(&p->ibuflist)) { |
if (LIST_EMPTY(&p->ins)) { |
if (p->flags & APROC_QUIT) { |
if (p->flags & APROC_QUIT) { |
aproc_del(p); |
aproc_del(p); |
return 0; |
return 0; |
|
|
odone = maxwrite; |
odone = maxwrite; |
p->u.mix.lat += odone; |
p->u.mix.lat += odone; |
p->u.mix.abspos += odone; |
p->u.mix.abspos += odone; |
LIST_FOREACH(i, &p->ibuflist, ient) { |
LIST_FOREACH(i, &p->ins, ient) { |
i->r.mix.done -= odone; |
i->r.mix.done -= odone; |
} |
} |
abuf_wcommit(obuf, odone); |
abuf_wcommit(obuf, odone); |
|
|
void |
void |
mix_eof(struct aproc *p, struct abuf *ibuf) |
mix_eof(struct aproc *p, struct abuf *ibuf) |
{ |
{ |
struct abuf *i, *inext, *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *i, *inext, *obuf = LIST_FIRST(&p->outs); |
unsigned odone; |
unsigned odone; |
|
|
mix_setmaster(p); |
mix_setmaster(p); |
|
|
* Find a blocked input. |
* Find a blocked input. |
*/ |
*/ |
odone = obuf->len; |
odone = obuf->len; |
for (i = LIST_FIRST(&p->ibuflist); i != NULL; i = inext) { |
for (i = LIST_FIRST(&p->ins); i != NULL; i = inext) { |
inext = LIST_NEXT(i, ient); |
inext = LIST_NEXT(i, ient); |
if (!abuf_fill(i)) |
if (!abuf_fill(i)) |
continue; |
continue; |
|
|
/* |
/* |
* No blocked inputs. Check if output is blocked. |
* No blocked inputs. Check if output is blocked. |
*/ |
*/ |
if (LIST_EMPTY(&p->ibuflist) || odone == obuf->w.mix.todo) |
if (LIST_EMPTY(&p->ins) || odone == obuf->w.mix.todo) |
abuf_run(obuf); |
abuf_run(obuf); |
} |
} |
} |
} |
|
|
* share their volume |
* share their volume |
*/ |
*/ |
n = 0; |
n = 0; |
LIST_FOREACH(i, &p->ibuflist, ient) { |
LIST_FOREACH(i, &p->ins, ient) { |
j = LIST_NEXT(i, ient); |
j = LIST_NEXT(i, ient); |
for (;;) { |
for (;;) { |
if (j == NULL) { |
if (j == NULL) { |
|
|
j = LIST_NEXT(j, ient); |
j = LIST_NEXT(j, ient); |
} |
} |
} |
} |
LIST_FOREACH(i, &p->ibuflist, ient) { |
LIST_FOREACH(i, &p->ins, ient) { |
weight = ADATA_UNIT / n; |
weight = ADATA_UNIT / n; |
if (weight > i->r.mix.maxweight) |
if (weight > i->r.mix.maxweight) |
weight = i->r.mix.maxweight; |
weight = i->r.mix.maxweight; |
|
|
void |
void |
mix_clear(struct aproc *p) |
mix_clear(struct aproc *p) |
{ |
{ |
struct abuf *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *obuf = LIST_FIRST(&p->outs); |
|
|
p->u.mix.lat = 0; |
p->u.mix.lat = 0; |
p->u.mix.abspos = 0; |
p->u.mix.abspos = 0; |
|
|
void |
void |
mix_prime(struct aproc *p) |
mix_prime(struct aproc *p) |
{ |
{ |
struct abuf *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *obuf = LIST_FIRST(&p->outs); |
unsigned todo, count; |
unsigned todo, count; |
|
|
for (;;) { |
for (;;) { |
|
|
int |
int |
sub_xrun(struct aproc *p, struct abuf *i) |
sub_xrun(struct aproc *p, struct abuf *i) |
{ |
{ |
struct abuf *ibuf = LIST_FIRST(&p->ibuflist); |
struct abuf *ibuf = LIST_FIRST(&p->ins); |
unsigned fdrop, remain; |
unsigned fdrop, remain; |
|
|
if (i->w.sub.done > 0) |
if (i->w.sub.done > 0) |
|
|
if (!ABUF_ROK(ibuf)) |
if (!ABUF_ROK(ibuf)) |
return 0; |
return 0; |
idone = ibuf->len; |
idone = ibuf->len; |
for (i = LIST_FIRST(&p->obuflist); i != NULL; i = inext) { |
for (i = LIST_FIRST(&p->outs); i != NULL; i = inext) { |
inext = LIST_NEXT(i, oent); |
inext = LIST_NEXT(i, oent); |
sub_silence(i, 0); |
sub_silence(i, 0); |
if (!SUB_WOK(i)) { |
if (!SUB_WOK(i)) { |
|
|
if (!abuf_flush(i)) |
if (!abuf_flush(i)) |
continue; |
continue; |
} |
} |
if (LIST_EMPTY(&p->obuflist)) { |
if (LIST_EMPTY(&p->outs)) { |
if (p->flags & APROC_QUIT) { |
if (p->flags & APROC_QUIT) { |
aproc_del(p); |
aproc_del(p); |
return 0; |
return 0; |
|
|
} |
} |
if (idone == 0) |
if (idone == 0) |
return 0; |
return 0; |
LIST_FOREACH(i, &p->obuflist, oent) { |
LIST_FOREACH(i, &p->outs, oent) { |
i->w.sub.done -= idone; |
i->w.sub.done -= idone; |
} |
} |
abuf_rdiscard(ibuf, idone); |
abuf_rdiscard(ibuf, idone); |
|
|
int |
int |
sub_out(struct aproc *p, struct abuf *obuf) |
sub_out(struct aproc *p, struct abuf *obuf) |
{ |
{ |
struct abuf *ibuf = LIST_FIRST(&p->ibuflist); |
struct abuf *ibuf = LIST_FIRST(&p->ins); |
struct abuf *i, *inext; |
struct abuf *i, *inext; |
unsigned idone; |
unsigned idone; |
|
|
|
|
if (!abuf_fill(ibuf)) |
if (!abuf_fill(ibuf)) |
return 0; /* eof */ |
return 0; /* eof */ |
idone = ibuf->len; |
idone = ibuf->len; |
for (i = LIST_FIRST(&p->obuflist); i != NULL; i = inext) { |
for (i = LIST_FIRST(&p->outs); i != NULL; i = inext) { |
inext = LIST_NEXT(i, oent); |
inext = LIST_NEXT(i, oent); |
sub_silence(i, 0); |
sub_silence(i, 0); |
sub_bcopy(ibuf, i); |
sub_bcopy(ibuf, i); |
|
|
if (!abuf_flush(i)) |
if (!abuf_flush(i)) |
continue; |
continue; |
} |
} |
if (LIST_EMPTY(&p->obuflist) || idone == 0) |
if (LIST_EMPTY(&p->outs) || idone == 0) |
return 0; |
return 0; |
LIST_FOREACH(i, &p->obuflist, oent) { |
LIST_FOREACH(i, &p->outs, oent) { |
i->w.sub.done -= idone; |
i->w.sub.done -= idone; |
} |
} |
abuf_rdiscard(ibuf, idone); |
abuf_rdiscard(ibuf, idone); |
|
|
void |
void |
sub_hup(struct aproc *p, struct abuf *obuf) |
sub_hup(struct aproc *p, struct abuf *obuf) |
{ |
{ |
struct abuf *i, *inext, *ibuf = LIST_FIRST(&p->ibuflist); |
struct abuf *i, *inext, *ibuf = LIST_FIRST(&p->ins); |
unsigned idone; |
unsigned idone; |
|
|
if (!aproc_inuse(p)) { |
if (!aproc_inuse(p)) { |
|
|
* Find a blocked output. |
* Find a blocked output. |
*/ |
*/ |
idone = ibuf->len; |
idone = ibuf->len; |
for (i = LIST_FIRST(&p->obuflist); i != NULL; i = inext) { |
for (i = LIST_FIRST(&p->outs); i != NULL; i = inext) { |
inext = LIST_NEXT(i, oent); |
inext = LIST_NEXT(i, oent); |
if (!abuf_flush(i)) |
if (!abuf_flush(i)) |
continue; |
continue; |
|
|
/* |
/* |
* No blocked outputs. Check if input is blocked. |
* No blocked outputs. Check if input is blocked. |
*/ |
*/ |
if (LIST_EMPTY(&p->obuflist) || idone == ibuf->used) |
if (LIST_EMPTY(&p->outs) || idone == ibuf->used) |
abuf_run(ibuf); |
abuf_run(ibuf); |
} |
} |
} |
} |
|
|
int |
int |
resamp_in(struct aproc *p, struct abuf *ibuf) |
resamp_in(struct aproc *p, struct abuf *ibuf) |
{ |
{ |
struct abuf *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *obuf = LIST_FIRST(&p->outs); |
|
|
if (!ABUF_WOK(obuf) || !ABUF_ROK(ibuf)) |
if (!ABUF_WOK(obuf) || !ABUF_ROK(ibuf)) |
return 0; |
return 0; |
|
|
int |
int |
resamp_out(struct aproc *p, struct abuf *obuf) |
resamp_out(struct aproc *p, struct abuf *obuf) |
{ |
{ |
struct abuf *ibuf = LIST_FIRST(&p->ibuflist); |
struct abuf *ibuf = LIST_FIRST(&p->ins); |
|
|
if (!abuf_fill(ibuf)) |
if (!abuf_fill(ibuf)) |
return 0; |
return 0; |
|
|
void |
void |
resamp_ipos(struct aproc *p, struct abuf *ibuf, int delta) |
resamp_ipos(struct aproc *p, struct abuf *ibuf, int delta) |
{ |
{ |
struct abuf *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *obuf = LIST_FIRST(&p->outs); |
long long ipos; |
long long ipos; |
|
|
ipos = (long long)delta * p->u.resamp.oblksz + p->u.resamp.idelta; |
ipos = (long long)delta * p->u.resamp.oblksz + p->u.resamp.idelta; |
|
|
void |
void |
resamp_opos(struct aproc *p, struct abuf *obuf, int delta) |
resamp_opos(struct aproc *p, struct abuf *obuf, int delta) |
{ |
{ |
struct abuf *ibuf = LIST_FIRST(&p->ibuflist); |
struct abuf *ibuf = LIST_FIRST(&p->ins); |
long long opos; |
long long opos; |
|
|
opos = (long long)delta * p->u.resamp.iblksz + p->u.resamp.odelta; |
opos = (long long)delta * p->u.resamp.iblksz + p->u.resamp.odelta; |
|
|
int |
int |
enc_in(struct aproc *p, struct abuf *ibuf) |
enc_in(struct aproc *p, struct abuf *ibuf) |
{ |
{ |
struct abuf *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *obuf = LIST_FIRST(&p->outs); |
|
|
if (!ABUF_WOK(obuf) || !ABUF_ROK(ibuf)) |
if (!ABUF_WOK(obuf) || !ABUF_ROK(ibuf)) |
return 0; |
return 0; |
|
|
int |
int |
enc_out(struct aproc *p, struct abuf *obuf) |
enc_out(struct aproc *p, struct abuf *obuf) |
{ |
{ |
struct abuf *ibuf = LIST_FIRST(&p->ibuflist); |
struct abuf *ibuf = LIST_FIRST(&p->ins); |
|
|
if (!abuf_fill(ibuf)) |
if (!abuf_fill(ibuf)) |
return 0; |
return 0; |
|
|
int |
int |
dec_in(struct aproc *p, struct abuf *ibuf) |
dec_in(struct aproc *p, struct abuf *ibuf) |
{ |
{ |
struct abuf *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *obuf = LIST_FIRST(&p->outs); |
|
|
if (!ABUF_WOK(obuf) || !ABUF_ROK(ibuf)) |
if (!ABUF_WOK(obuf) || !ABUF_ROK(ibuf)) |
return 0; |
return 0; |
|
|
int |
int |
dec_out(struct aproc *p, struct abuf *obuf) |
dec_out(struct aproc *p, struct abuf *obuf) |
{ |
{ |
struct abuf *ibuf = LIST_FIRST(&p->ibuflist); |
struct abuf *ibuf = LIST_FIRST(&p->ins); |
|
|
if (!abuf_fill(ibuf)) |
if (!abuf_fill(ibuf)) |
return 0; |
return 0; |
|
|
int |
int |
join_in(struct aproc *p, struct abuf *ibuf) |
join_in(struct aproc *p, struct abuf *ibuf) |
{ |
{ |
struct abuf *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *obuf = LIST_FIRST(&p->outs); |
|
|
if (!ABUF_WOK(obuf) || !ABUF_ROK(ibuf)) |
if (!ABUF_WOK(obuf) || !ABUF_ROK(ibuf)) |
return 0; |
return 0; |
|
|
int |
int |
join_out(struct aproc *p, struct abuf *obuf) |
join_out(struct aproc *p, struct abuf *obuf) |
{ |
{ |
struct abuf *ibuf = LIST_FIRST(&p->ibuflist); |
struct abuf *ibuf = LIST_FIRST(&p->ins); |
|
|
if (!abuf_fill(ibuf)) |
if (!abuf_fill(ibuf)) |
return 0; |
return 0; |
|
|
void |
void |
mon_flush(struct aproc *p) |
mon_flush(struct aproc *p) |
{ |
{ |
struct abuf *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *obuf = LIST_FIRST(&p->outs); |
unsigned count; |
unsigned count; |
|
|
#ifdef DEBUG |
#ifdef DEBUG |
|
|
void |
void |
mon_snoop(struct aproc *p, struct abuf *ibuf, unsigned pos, unsigned todo) |
mon_snoop(struct aproc *p, struct abuf *ibuf, unsigned pos, unsigned todo) |
{ |
{ |
struct abuf *obuf = LIST_FIRST(&p->obuflist); |
struct abuf *obuf = LIST_FIRST(&p->outs); |
unsigned scount, icount, ocount; |
unsigned scount, icount, ocount; |
short *idata, *odata; |
short *idata, *odata; |
|
|