From 2e35d61d65c8ac02b6557c53065ce61b3a21f718 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Sun, 6 Mar 2022 11:22:23 -0500 Subject: Improve aliasing on approaching objects --- src/spatial.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 47 insertions(+), 13 deletions(-) diff --git a/src/spatial.c b/src/spatial.c index 87307f0..5d74fad 100644 --- a/src/spatial.c +++ b/src/spatial.c @@ -1,3 +1,4 @@ +#include #include #include #include @@ -282,8 +283,45 @@ ssize_t scene_fill(xas_spatial_scene *scene, index_l = index_r = buffer->index; - dest[XAS_AUDIO_STEREO*index_l] += value_l; - dest[XAS_AUDIO_STEREO*index_r+1] += value_r; + if (obj->shift_l == 0) { + dest[XAS_AUDIO_STEREO*index_l] += value_l; + } else { + while (obj->shift_l > 0) { + size_t index = index_l + obj->shift_l; + + if (index < buffer->size) { + dest[XAS_AUDIO_STEREO*index] += value_l; + } + + obj->shift_l--; + } + + while (obj->shift_l < 0) { + dest[XAS_AUDIO_STEREO*index_l] += value_l; + + obj->shift_l++; + } + } + + if (obj->shift_r == 0) { + dest[XAS_AUDIO_STEREO*index_r] += value_r; + } else { + while (obj->shift_r > 0) { + size_t index = index_r + obj->shift_r; + + if (index < buffer->size) { + dest[XAS_AUDIO_STEREO*index+1] += value_r; + } + + obj->shift_r--; + } + + while (obj->shift_r < 0) { + dest[XAS_AUDIO_STEREO*index_r] += value_r; + + obj->shift_r++; + } + } buffer->index++; } @@ -399,17 +437,13 @@ xas_spatial_object *xas_spatial_scene_add_object(xas_spatial_scene *scene, goto error_malloc_object; } - object->point = point; - object->source = source; - object->ctx = ctx; - object->flags = XAS_SPATIAL_OBJECT_NONE; - object->heading.x = 0; - object->heading.y = 0; - object->heading.z = 0; - object->speed = XAS_SPATIAL_DEFAULT_OBJECT_SPEED; - object->next = NULL; - object->delay_l = 0; - object->delay_r = 0; + memset(object, '\0', sizeof(*object)); + + object->point = point; + object->source = source; + object->ctx = ctx; + object->flags = XAS_SPATIAL_OBJECT_NONE; + object->speed = XAS_SPATIAL_DEFAULT_OBJECT_SPEED; object_position(scene, object, point); -- cgit v1.2.3