Browse Source

fix a few bugs with callback system, add some test signals

jp9000 12 years ago
parent
commit
261b9d7056
4 changed files with 44 additions and 7 deletions
  1. 8 0
      libobs/callback/proc.h
  2. 7 1
      libobs/callback/signal.c
  3. 15 6
      libobs/callback/signal.h
  4. 14 0
      libobs/obs-source.c

+ 8 - 0
libobs/callback/proc.h

@@ -20,6 +20,10 @@
 
 #include "calldata.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * Dynamic procedure handler
  *
@@ -43,3 +47,7 @@ EXPORT void proc_handler_add(proc_handler_t handler, const char *name,
  */
 EXPORT bool proc_handler_call(proc_handler_t handler, const char *name,
 		calldata_t params);
+
+#ifdef __cplusplus
+}
+#endif

+ 7 - 1
libobs/callback/signal.c

@@ -39,7 +39,7 @@ static inline struct signal_info *signal_info_create(const char *name)
 	si->next = NULL;
 	da_init(si->callbacks);
 
-	if (!pthread_mutex_init(&si->mutex, NULL) != 0) {
+	if (pthread_mutex_init(&si->mutex, NULL) != 0) {
 		blog(LOG_ERROR, "Could not create signal!");
 		bfree(si->name);
 		bfree(si);
@@ -179,6 +179,9 @@ void signal_handler_disconnect(signal_handler_t handler, const char *signal,
 	struct signal_info *sig = getsignal_locked(handler, signal);
 	size_t idx;
 
+	if (!sig)
+		return;
+
 	pthread_mutex_lock(&sig->mutex);
 
 	idx = signal_get_callback_idx(sig, callback, data);
@@ -193,6 +196,9 @@ void signal_handler_signal(signal_handler_t handler, const char *signal,
 {
 	struct signal_info *sig = getsignal_locked(handler, signal);
 
+	if (!sig)
+		return;
+
 	pthread_mutex_lock(&sig->mutex);
 
 	for (size_t i = 0; i < sig->callbacks.num; i++) {

+ 15 - 6
libobs/callback/signal.h

@@ -20,6 +20,10 @@
 
 #include "calldata.h"
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 /*
  * Signal handler
  *
@@ -30,13 +34,18 @@
 struct signal_handler;
 typedef struct signal_handler *signal_handler_t;
 
-signal_handler_t signal_handler_create(void);
-void signal_handler_destroy(signal_handler_t handler);
+EXPORT signal_handler_t signal_handler_create(void);
+EXPORT void signal_handler_destroy(signal_handler_t handler);
 
-void signal_handler_connect(signal_handler_t handler, const char *signal,
-		void (*callback)(calldata_t, void*), void *data);
-void signal_handler_disconnect(signal_handler_t handler, const char *signal,
+EXPORT void signal_handler_connect(signal_handler_t handler, const char *signal,
 		void (*callback)(calldata_t, void*), void *data);
+EXPORT void signal_handler_disconnect(signal_handler_t handler,
+		const char *signal, void (*callback)(calldata_t, void*),
+		void *data);
 
-void signal_handler_signal(signal_handler_t handler, const char *signal,
+EXPORT void signal_handler_signal(signal_handler_t handler, const char *signal,
 		calldata_t params);
+
+#ifdef __cplusplus
+}
+#endif

+ 14 - 0
libobs/obs-source.c

@@ -127,6 +127,17 @@ bool obs_source_init(struct obs_source *source, const char *settings,
 	return true;
 }
 
+static inline void obs_source_dosignal(struct obs_source *source,
+		const char *signal)
+{
+	struct calldata data;
+
+	calldata_init(&data);
+	calldata_setptr(&data, "source", source);
+	signal_handler_signal(obs->signals, signal, &data);
+	calldata_free(&data);
+}
+
 obs_source_t obs_source_create(enum obs_source_type type, const char *id,
 		const char *name, const char *settings)
 {
@@ -165,6 +176,7 @@ obs_source_t obs_source_create(enum obs_source_type type, const char *id,
 	if (!obs_source_init(source, settings, info))
 		goto fail;
 
+	obs_source_create_dosignal(source, "source-create");
 	return source;
 
 fail:
@@ -177,6 +189,8 @@ static void obs_source_destroy(obs_source_t source)
 {
 	size_t i;
 
+	obs_source_dosignal(source, "source-destroy");
+
 	if (source->filter_parent)
 		obs_source_filter_remove(source->filter_parent, source);