#ifndef __FEEDER_STDIO_C__
/*****************************************************************************/
/* stdin feeder */
#define FEEDSTDIO_BUFSIZE 4096
#define FEEDSTDIO_MAXBYTES 1
static int
feed_stdio_set(struct pcm_feeder *f, int what, int value)
{
switch (what) {
case FEEDSTDIO_MAXBYTES:
f->data = (void *)(uintptr_t)value;
break;
default:
return (-1);
break;
}
return (0);
}
static int
feed_stdin(struct pcm_feeder *f,
struct pcm_channel *c,
uint8_t *b,
uint32_t count,
void *source __unused)
{
size_t got;
if ((uintptr_t)f->data != 0) {
got = fread(b, 1, min(count, (uintptr_t)f->data), c->in_fp);
f->data = (void *)((uintptr_t)f->data - got);
} else
got = fread(b, 1, count, c->in_fp);
return (int)got;
}
static struct pcm_feederdesc feeder_stdin_desc[] = {
{ FEEDER_STDIO, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 }
};
static kobj_method_t feeder_stdin_methods[] = {
KOBJMETHOD(feeder_set, feed_stdio_set),
KOBJMETHOD(feeder_feed, feed_stdin),
{ NULL, NULL }
};
FEEDER_DECLARE(feeder_stdin, 0);
/*****************************************************************************/
/* stdout feeder */
static int
feed_stdout(struct pcm_feeder *f,
struct pcm_channel *c,
uint8_t *b,
uint32_t count,
void *source)
{
size_t done;
done = FEEDER_FEED(f->source, c, b, count, source);
if (done > 0)
done = fwrite(b, 1, done, c->out_fp);
return done;
}
static struct pcm_feederdesc feeder_stdout_desc[] = {
{ FEEDER_STDIO, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0 }
};
static kobj_method_t feeder_stdout_methods[] = {
KOBJMETHOD(feeder_set, feed_stdio_set),
KOBJMETHOD(feeder_feed, feed_stdout),
{ NULL, NULL }
};
FEEDER_DECLARE(feeder_stdout, 0);
#endif /* __FEEDER_STDIO_C__ */