#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__ */