diff options
-rw-r--r-- | include/xas/spatial.h | 14 | ||||
-rw-r--r-- | src/spatial.c | 113 |
2 files changed, 127 insertions, 0 deletions
diff --git a/include/xas/spatial.h b/include/xas/spatial.h index 5287502..ed5157a 100644 --- a/include/xas/spatial.h +++ b/include/xas/spatial.h @@ -1,6 +1,8 @@ #ifndef _XAS_SPATIAL_H #define _XAS_SPATIAL_H +#include <xas/synth.h> +#include <xas/bank.h> #include <xas/audio.h> #define XAS_SPATIAL_OBJECT_NONE 0 @@ -95,6 +97,18 @@ xas_spatial_object *xas_spatial_scene_add_object(xas_spatial_scene *scene, xas_audio_stream *source, void *ctx); +xas_spatial_object *xas_spatial_scene_add_synth(xas_spatial_scene *scene, + xas_spatial_coord point, + enum xas_synth_type type); + +xas_spatial_object *xas_spatial_scene_add_bank_player(xas_spatial_scene *scene, + xas_spatial_coord point, + xas_bank *bank); + +xas_spatial_object *xas_spatial_scene_add_vox(xas_spatial_scene *scene, + xas_spatial_coord point, + const char *text2wave_path); + void xas_spatial_scene_position_object(xas_spatial_scene *scene, xas_spatial_object *object, xas_spatial_coord point); diff --git a/src/spatial.c b/src/spatial.c index 9631603..7688f07 100644 --- a/src/spatial.c +++ b/src/spatial.c @@ -5,6 +5,7 @@ #include <errno.h> #include <xas/object.h> +#include <xas/vox.h> #include <xas/spatial.h> static inline float dist(xas_spatial_coord a, xas_spatial_coord b) { @@ -426,6 +427,118 @@ error_invalid_source: return NULL; } +xas_spatial_object *xas_spatial_scene_add_synth(xas_spatial_scene *scene, + xas_spatial_coord point, + enum xas_synth_type type) { + xas_spatial_object *obj; + xas_synth *synth; + xas_audio_stream *stream; + + if ((synth = xas_synth_new(scene->format, + scene->buffer->size, + type)) == NULL) { + goto error_synth_new; + } + + if ((stream = xas_synth_stream_new(synth)) == NULL) { + goto error_synth_stream_new; + } + + if ((obj = xas_spatial_scene_add_object(scene, + point, + stream, + synth)) == NULL) { + goto error_scene_add_object; + } + + obj->flags |= XAS_SPATIAL_OBJECT_MANAGED; + + return obj; + +error_scene_add_object: + xas_audio_stream_destroy(stream); + +error_synth_stream_new: + xas_synth_destroy(synth); + +error_synth_new: + return NULL; +} + +xas_spatial_object *xas_spatial_scene_add_bank_player(xas_spatial_scene *scene, + xas_spatial_coord point, + xas_bank *bank) { + xas_spatial_object *obj; + xas_bank_player *player; + xas_audio_stream *stream; + + if ((player = xas_bank_player_new(bank)) == NULL) { + goto error_bank_player_new; + } + + if ((stream = xas_bank_player_stream_new(player)) == NULL) { + goto error_bank_player_stream_new; + } + + if ((obj = xas_spatial_scene_add_object(scene, + point, + stream, + player)) == NULL) { + goto error_scene_add_object; + } + + obj->flags |= XAS_SPATIAL_OBJECT_MANAGED; + + return obj; + +error_scene_add_object: + xas_audio_stream_destroy(stream); + +error_bank_player_stream_new: + xas_bank_player_destroy(player); + +error_bank_player_new: + return NULL; +} + +xas_spatial_object *xas_spatial_scene_add_vox(xas_spatial_scene *scene, + xas_spatial_coord point, + const char *text2wave_path) { + xas_spatial_object *obj; + xas_vox *vox; + xas_audio_stream *stream; + + if ((vox = xas_vox_new(scene->format, + scene->buffer->size, + text2wave_path)) == NULL) { + goto error_vox_new; + } + + if ((stream = xas_vox_stream_new(vox)) == NULL) { + goto error_vox_stream_new; + } + + if ((obj = xas_spatial_scene_add_object(scene, + point, + stream, + vox)) == NULL) { + goto error_scene_add_object; + } + + obj->flags |= XAS_SPATIAL_OBJECT_MANAGED; + + return obj; + +error_scene_add_object: + xas_audio_stream_destroy(stream); + +error_vox_stream_new: + xas_vox_destroy(vox); + +error_vox_new: + return NULL; +} + void xas_spatial_scene_position_object(xas_spatial_scene *scene, xas_spatial_object *object, xas_spatial_coord point) { |