Added graph making, used 32-bit float samples.
[aftubes.git] / graph.c
blobd89c99fd682077761a8eceb07391e756a5734918
1 #include "graph.h"
2 #include "stdlib.h"
3 #include "string.h"
5 struct graphnode *graphnode_create(void)
7 struct graphnode *node;
8 node = malloc(sizeof *node);
9 if (!node){
10 return NULL;
12 memset(node, 0, sizeof *node);
13 return node;
16 void graphnode_free(struct graphnode *node)
18 free(node);
21 int graph_create(struct graph *graph)
23 graph->node_first = graph->node_last = NULL;
24 return 0;
27 void graph_destroy(struct graph *graph)
32 void graph_append_node(struct graph *graph, struct graphnode *node)
34 node->prev = graph->node_last;
35 node->next = NULL;
36 *(graph->node_last ? &graph->node_last->next : &graph->node_first) = node;
37 graph->node_last = node;
40 void graph_insert_node(struct graph *graph, struct graphnode *node, struct graphnode *before_node)
42 if (!before_node){
43 graph_append_node(graph, node);
44 } else {
45 node->next = before_node;
46 node->prev = before_node->prev;
47 *(before_node->prev ? &before_node->prev->next : &graph->node_first) = node;
48 before_node->prev = node;
52 void graph_remove(struct graph *graph, struct graphnode *node)
54 *(node->prev ? &node->prev->next : &graph->node_first) = node->next;
55 *(node->next ? &node->next->prev : &graph->node_last) = node->prev;
58 int graph_run(struct graph *graph, long n_samples)
60 struct graphnode *node;
61 void *buf_ptr = NULL;
62 node = graph->node_first;
63 while (node){
64 if (node->ef->vtab->process(node->ef, &buf_ptr, n_samples)){
65 if (buf_ptr){
66 free(buf_ptr);
68 return 1;
70 node = node->next;
72 if (buf_ptr){
73 free(buf_ptr);
75 return 0;