From cd1f89fade802c48c92680f1ddbadfbd0d04017d Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Wed, 16 Mar 2022 00:10:55 -0400 Subject: Add optional callbacks to xas_object Changes: * Implement xas_object_init() to initialise an object call table to all null values * Rework dispatch methods to fail gracefully if no pointer value is provided for a given callback entry Additional changes: * Add callbacks for changing bank and frequency --- include/xas/object.h | 12 ++++++++++++ src/object.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/include/xas/object.h b/include/xas/object.h index a164277..4392892 100644 --- a/include/xas/object.h +++ b/include/xas/object.h @@ -11,6 +11,10 @@ typedef int (*xas_object_stop_callback)(xas_object *object); typedef int (*xas_object_set_gain_callback)(xas_object *object, float gain); +typedef int (*xas_object_set_freq_callback)(xas_object *object, size_t freq); + +typedef int (*xas_object_set_bank_callback)(xas_object *object, size_t gain); + typedef xas_audio_stream *(*xas_object_stream_new_callback)(xas_object *object); typedef void (*xas_object_destroy_callback)(xas_object *object); @@ -19,16 +23,24 @@ struct _xas_object { xas_object_start_callback start; xas_object_stop_callback stop; xas_object_set_gain_callback set_gain; + xas_object_set_bank_callback set_bank; + xas_object_set_freq_callback set_freq; xas_object_stream_new_callback stream_new; xas_object_destroy_callback destroy; }; +void xas_object_init(xas_object *object); + int xas_object_start(xas_object *object); int xas_object_stop(xas_object *object); int xas_object_set_gain(xas_object *object, float gain); +int xas_object_set_bank(xas_object *object, size_t bank); + +int xas_object_set_freq(xas_object *object, size_t freq); + xas_audio_stream *xas_object_stream_new(xas_object *object); void xas_object_destroy(xas_object *object); diff --git a/src/object.c b/src/object.c index 7aaaa6e..4526bc5 100644 --- a/src/object.c +++ b/src/object.c @@ -1,21 +1,74 @@ +#include +#include + #include +void xas_object_init(xas_object *object) { + memset(object, '\0', sizeof(xas_object)); +} + int xas_object_start(xas_object *object) { + if (object->start == NULL) { + errno = ENOSYS; + + return -1; + } + return object->start(object); } int xas_object_stop(xas_object *object) { + if (object->stop == NULL) { + errno = ENOSYS; + + return -1; + } + return object->stop(object); } int xas_object_set_gain(xas_object *object, float gain) { + if (object->set_gain == NULL) { + errno = ENOSYS; + + return -1; + } + return object->set_gain(object, gain); } +int xas_object_set_bank(xas_object *object, size_t bank) { + if (object->set_bank == NULL) { + errno = ENOSYS; + + return -1; + } + + return object->set_bank(object, bank); +} + +int xas_object_set_freq(xas_object *object, size_t freq) { + if (object->set_freq == NULL) { + errno = ENOSYS; + + return -1; + } + + return object->set_freq(object, freq); +} + xas_audio_stream *xas_object_stream_new(xas_object *object) { + if (object->stream_new == NULL) { + errno = ENOSYS; + + return NULL; + } + return object->stream_new(object); } void xas_object_destroy(xas_object *object) { - object->destroy(object); + if (object->destroy) { + object->destroy(object); + } } -- cgit v1.2.3