From 3c6872ccab4dcddc6ab6df7d17df3394964a6e46 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Mon, 28 Feb 2022 09:36:13 -0500 Subject: Initial implementation of src/script.c --- src/script.c | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 211 insertions(+) create mode 100644 src/script.c (limited to 'src/script.c') diff --git a/src/script.c b/src/script.c new file mode 100644 index 0000000..8c58f7f --- /dev/null +++ b/src/script.c @@ -0,0 +1,211 @@ +#include +#include + +#include + +xas_script *xas_script_new(xas_spatial_scene *scene, size_t buffer_size) { + xas_script *script; + + if ((script = malloc(sizeof(*script))) == NULL) { + goto error_malloc_script; + } + + script->scene = scene; + script->first = NULL; + + timerclear(&script->timestamp); + + script->buffer_size = buffer_size; + script->current_index = 0; + + return script; + +error_malloc_script: + return NULL; +} + +void xas_script_destroy(xas_script *script) { + xas_script_event *event = script->first; + + while (event) { + xas_script_event *next = event->next; + + free(event); + + event = next; + } + + free(script); +} + +static void add_event(xas_script *script, xas_script_event *ev) { + xas_script_event *current = script->first; + + if (script->first == NULL) { + script->first = ev; + + return; + } + + while (current) { + xas_script_event *next = current->next; + + if (next == NULL) { + current->next = ev; + + return; + } + + if (!timercmp(¤t->timestamp, &ev->timestamp, <) + && timercmp(¤t->timestamp, &next->timestamp, <)) { + current->next = ev; + ev->next = next; + + return; + } + + current = next; + } +} + +int xas_script_add_event_off(xas_script *script, + xas_spatial_object *object, + struct timeval timestamp) { + xas_script_event *ev; + + if ((ev = malloc(sizeof(*ev))) == NULL) { + goto error_malloc_ev; + } + + ev->type = XAS_SCRIPT_EVENT_OFF; + ev->object = object; + ev->timestamp = timestamp; + ev->next = NULL; + + add_event(script, ev); + + return 0; + +error_malloc_ev: + return -1; +} + +int xas_script_add_event_on(xas_script *script, + xas_spatial_object *object, + struct timeval timestamp) { + xas_script_event *ev; + + if ((ev = malloc(sizeof(*ev))) == NULL) { + goto error_malloc_ev; + } + + ev->type = XAS_SCRIPT_EVENT_ON; + ev->object = object; + ev->timestamp = timestamp; + ev->next = NULL; + + add_event(script, ev); + + return 0; + +error_malloc_ev: + return -1; +} + +int xas_script_add_position_set(xas_script *script, + xas_spatial_object *object, + struct timeval timestamp, + xas_spatial_coord point) { + xas_script_event *ev; + + if ((ev = malloc(sizeof(*ev))) == NULL) { + goto error_malloc_ev; + } + + ev->type = XAS_SCRIPT_EVENT_SET_POSITION; + ev->object = object; + ev->timestamp = timestamp; + ev->point = point; + ev->next = NULL; + + add_event(script, ev); + + return 0; + +error_malloc_ev: + return -1; +} + +int xas_script_add_gain_set(xas_script *script, + xas_spatial_object *object, + struct timeval timestamp, + float gain) { + xas_script_event *ev; + + if ((ev = malloc(sizeof(*ev))) == NULL) { + goto error_malloc_ev; + } + + ev->type = XAS_SCRIPT_EVENT_ON; + ev->object = object; + ev->timestamp = timestamp; + ev->gain = gain; + ev->next = NULL; + + add_event(script, ev); + + return 0; + +error_malloc_ev: + return -1; +} + +int xas_script_add_bank_set(xas_script *script, + xas_spatial_object *object, + struct timeval timestamp, + size_t index) { + xas_script_event *ev; + + if ((ev = malloc(sizeof(*ev))) == NULL) { + goto error_malloc_ev; + } + + ev->type = XAS_SCRIPT_EVENT_SET_BANK_INDEX; + ev->object = object; + ev->timestamp = timestamp; + ev->next = NULL; + ev->index = index; + + add_event(script, ev); + + return 0; + +error_malloc_ev: + return -1; +} + +int xas_script_add_frequency_set(xas_script *script, + xas_spatial_object *object, + struct timeval timestamp, + size_t frequency) { + xas_script_event *ev; + + if ((ev = malloc(sizeof(*ev))) == NULL) { + goto error_malloc_ev; + } + + ev->type = XAS_SCRIPT_EVENT_SET_FREQUENCY; + ev->object = object; + ev->timestamp = timestamp; + ev->next = NULL; + ev->frequency = frequency; + + add_event(script, ev); + + return 0; + +error_malloc_ev: + return -1; +} + +int xas_script_play(xas_script *script, xas_audio_stream *sink); -- cgit v1.2.3