diff --git a/libobs/callback/proc.h b/libobs/callback/proc.h index 1bf1581ac..37f882b69 100644 --- a/libobs/callback/proc.h +++ b/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 diff --git a/libobs/callback/signal.c b/libobs/callback/signal.c index 33f90a6ce..8d388fd11 100644 --- a/libobs/callback/signal.c +++ b/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++) { diff --git a/libobs/callback/signal.h b/libobs/callback/signal.h index 9cdad6957..c2e8317d8 100644 --- a/libobs/callback/signal.h +++ b/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 diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 228907c94..236bd34e3 100644 --- a/libobs/obs-source.c +++ b/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);