summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXANTRONIX Development2022-03-16 00:10:55 -0400
committerXANTRONIX Development2022-03-16 00:10:55 -0400
commitcd1f89fade802c48c92680f1ddbadfbd0d04017d (patch)
tree89b8f620a0e1380a72652ef69dcec6059be11f2d
parent87d8e756713e67f3932a94f7d2e3f0ca596e3131 (diff)
downloadxas-cd1f89fade802c48c92680f1ddbadfbd0d04017d.tar.gz
xas-cd1f89fade802c48c92680f1ddbadfbd0d04017d.tar.bz2
xas-cd1f89fade802c48c92680f1ddbadfbd0d04017d.zip
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
-rw-r--r--include/xas/object.h12
-rw-r--r--src/object.c55
2 files changed, 66 insertions, 1 deletions
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 <string.h>
+#include <errno.h>
+
#include <xas/object.h>
+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);
+ }
}