#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);