From 50f8a066b93ece38ab600de3c1cf86d98b7655fe Mon Sep 17 00:00:00 2001 From: Richard Stanway Date: Mon, 15 May 2017 12:04:11 +0200 Subject: [PATCH] libobs: Add support for output error messages --- libobs/obs-internal.h | 2 ++ libobs/obs-output.c | 35 +++++++++++++++++++++++++++++++++-- libobs/obs.h | 4 ++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/libobs/obs-internal.h b/libobs/obs-internal.h index 077affc0a..4d3a75c68 100644 --- a/libobs/obs-internal.h +++ b/libobs/obs-internal.h @@ -872,6 +872,8 @@ struct obs_output { volatile long delay_restart_refs; volatile bool delay_active; volatile bool delay_capturing; + + char *last_error_message; }; static inline void do_output_signal(struct obs_output *output, diff --git a/libobs/obs-output.c b/libobs/obs-output.c index b689d73e6..17d8f346e 100644 --- a/libobs/obs-output.c +++ b/libobs/obs-output.c @@ -212,6 +212,8 @@ void obs_output_destroy(obs_output_t *output) circlebuf_free(&output->delay_data); if (output->owns_info_id) bfree((void*)output->info.id); + if (output->last_error_message) + bfree(output->last_error_message); bfree(output); } } @@ -228,6 +230,10 @@ bool obs_output_actual_start(obs_output_t *output) os_event_wait(output->stopping_event); output->stop_code = 0; + if (output->last_error_message) { + bfree(output->last_error_message); + output->last_error_message = NULL; + } if (output->context.data) success = output->info.start(output->context.data); @@ -1558,12 +1564,15 @@ static inline void signal_reconnect_success(struct obs_output *output) static inline void signal_stop(struct obs_output *output) { struct calldata params; - uint8_t stack[128]; - calldata_init_fixed(¶ms, stack, sizeof(stack)); + calldata_init(¶ms); + calldata_set_string(¶ms, "last_error", output->last_error_message); calldata_set_int(¶ms, "code", output->stop_code); calldata_set_ptr(¶ms, "output", output); + signal_handler_signal(output->context.signals, "stop", ¶ms); + + calldata_free(¶ms); } static inline void convert_flags(const struct obs_output *output, @@ -2116,6 +2125,28 @@ int obs_output_get_connect_time_ms(obs_output_t *output) return -1; } +const char *obs_output_get_last_error(obs_output_t *output) +{ + if (!obs_output_valid(output, "obs_output_get_last_error")) + return NULL; + + return output->last_error_message; +} + +void obs_output_set_last_error(obs_output_t *output, const char *message) +{ + if (!obs_output_valid(output, "obs_output_set_last_error")) + return; + + if (output->last_error_message) + bfree(output->last_error_message); + + if (message) + output->last_error_message = bstrdup(message); + else + output->last_error_message = NULL; +} + bool obs_output_reconnecting(const obs_output_t *output) { if (!obs_output_valid(output, "obs_output_reconnecting")) diff --git a/libobs/obs.h b/libobs/obs.h index a629cec3f..5a22530b9 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -1513,6 +1513,10 @@ EXPORT int obs_output_get_connect_time_ms(obs_output_t *output); EXPORT bool obs_output_reconnecting(const obs_output_t *output); +/** Pass a string of the last output error, for UI use */ +EXPORT void obs_output_set_last_error(obs_output_t *output, + const char *message); + /* ------------------------------------------------------------------------- */ /* Functions used by outputs */