diff --git a/lib/nodes/signal.c b/lib/nodes/signal.c index ca5a2941e..bae4cbe09 100644 --- a/lib/nodes/signal.c +++ b/lib/nodes/signal.c @@ -99,7 +99,6 @@ int signal_parse(struct node *n, json_t *cfg) int signal_parse_cli(struct node *n, int argc, char *argv[]) { - int ret; char *type; struct signal *s = n->_vd; @@ -158,11 +157,12 @@ check: if (optarg == endptr) type = argv[optind]; - ret = signal_lookup_type(type); - if (ret == -1) + s->type = signal_lookup_type(type); + if (s->type == -1) error("Invalid signal type: %s", type); - s->type = ret; + /* We know the expected number of values. */ + n->samplelen = s->values; return 0; } @@ -240,13 +240,13 @@ int signal_read(struct node *n, struct sample *smps[], unsigned cnt) t->length = n->samplelen; for (int i = 0; i < MIN(s->values, t->capacity); i++) { - int rtype = (s->type != SIGNAL_TYPE_MIXED) ? s->type : i % 5; + int rtype = (s->type != SIGNAL_TYPE_MIXED) ? s->type : i % 7; switch (rtype) { case SIGNAL_TYPE_CONSTANT: t->data[i].f = s->offset + s->amplitude; break; case SIGNAL_TYPE_SINE: t->data[i].f = s->offset + s->amplitude * sin(running * s->frequency * 2 * M_PI); break; case SIGNAL_TYPE_TRIANGLE: t->data[i].f = s->offset + s->amplitude * (fabs(fmod(running * s->frequency, 1) - .5) - 0.25) * 4; break; case SIGNAL_TYPE_SQUARE: t->data[i].f = s->offset + s->amplitude * ( (fmod(running * s->frequency, 1) < .5) ? -1 : 1); break; - case SIGNAL_TYPE_RAMP: t->data[i].f = s->offset + s->amplitude * fmod(running, s->frequency); break; + case SIGNAL_TYPE_RAMP: t->data[i].f = s->offset + s->amplitude * fmod(running, s->frequency); break; case SIGNAL_TYPE_COUNTER: t->data[i].f = s->offset + s->amplitude * s->counter; break; case SIGNAL_TYPE_RANDOM: s->last[i] += box_muller(0, s->stddev); diff --git a/src/signal.c b/src/signal.c index cbb54b64c..77c6e9864 100644 --- a/src/signal.c +++ b/src/signal.c @@ -33,6 +33,7 @@ #include #include #include +#include #include #include @@ -40,6 +41,7 @@ struct node n; struct log l; struct io io; +struct pool q; struct sample *t; @@ -53,6 +55,8 @@ void usage() printf(" triangle\n"); printf(" square\n"); printf(" ramp\n"); + printf(" constants\n"); + printf(" counter\n"); printf("\n"); printf(" OPTIONS is one or more of the following options:\n"); printf(" -d LVL set debug level\n"); @@ -89,12 +93,14 @@ static void quit(int signal, siginfo_t *sinfo, void *ctx) if (ret) error("Failed to destroy output"); + ret = pool_destroy(&q); + if (ret) + error("Failed to destroy pool"); + ret = log_stop(&l); if (ret) error("Failed to stop log"); - free(t); - info(CLR_GRN("Goodbye!")); exit(EXIT_SUCCESS); } @@ -146,20 +152,21 @@ int main(int argc, char *argv[]) if (ret) error("Failed to verify node configuration"); - /* Allocate memory for message buffer */ - struct signal *s = n._vd; - - t = alloc(SAMPLE_LEN(s->values)); - - t->capacity = s->values; + ret = pool_init(&q, 1, SAMPLE_LEN(n.samplelen), &memtype_heap); + if (ret) + error("Failed to initialize pool"); ret = node_start(&n); if (ret) serror("Failed to start node"); for (;;) { + sample_alloc(&q, &t, 1); + node_read(&n, &t, 1); io_print(&io, &t, 1); + + sample_put(t); } return 0;