diff --git a/libobs/obs-data.h b/libobs/obs-data.h index c67ab2f96..2fe3dd9ff 100644 --- a/libobs/obs-data.h +++ b/libobs/obs-data.h @@ -68,6 +68,8 @@ struct obs_audio { /* user sources, output channels, and displays */ struct obs_data { + /* arrays of pointers jim? you should really stop being lazy and use + * linked lists. */ DARRAY(struct obs_display*) displays; DARRAY(struct obs_source*) sources; diff --git a/libobs/obs-source.c b/libobs/obs-source.c index 9413004a0..e74f1cda6 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -144,6 +144,7 @@ obs_source_t obs_source_create(enum obs_source_type type, const char *id, memset(source, 0, sizeof(struct obs_source)); source->name = bstrdup(name); + source->type = type; source->data = info->create(settings, source); if (!source->data) goto fail; @@ -618,12 +619,12 @@ void obs_source_filter_setorder(obs_source_t source, obs_source_t filter, } } -const char *obs_source_get_settings(obs_source_t source) +const char *obs_source_getsettings(obs_source_t source) { return source->settings.array; } -void obs_source_save_settings(obs_source_t source, const char *settings) +void obs_source_savesettings(obs_source_t source, const char *settings) { dstr_copy(&source->settings, settings); } @@ -873,3 +874,21 @@ void obs_source_releaseframe(obs_source_t source, struct source_frame *frame) obs_source_release(source); } } + +const char *obs_source_getname(obs_source_t source) +{ + return source->name; +} + +void obs_source_setname(obs_source_t source, const char *name) +{ + bfree(source->name); + source->name = bstrdup(name); +} + +void obs_source_getid(obs_source_t source, enum obs_source_type *type, + const char **id) +{ + *type = source->type; + *id = source->callbacks.id; +} diff --git a/libobs/obs-source.h b/libobs/obs-source.h index 2195243a5..684f9dc4a 100644 --- a/libobs/obs-source.h +++ b/libobs/obs-source.h @@ -205,6 +205,7 @@ struct obs_source { /* source-specific data */ char *name; /* user-defined name */ + enum obs_source_type type; struct dstr settings; void *data; struct source_info callbacks; diff --git a/libobs/obs.c b/libobs/obs.c index c43fd63a4..fef5fdcc0 100644 --- a/libobs/obs.c +++ b/libobs/obs.c @@ -450,15 +450,37 @@ void obs_set_output_source(uint32_t channel, obs_source_t source) obs_source_release(prev_source); } -void obs_enum_sources(ENUM_SOURCES_PROC enum_proc, void *param) +void obs_enum_sources(bool (*enum_proc)(obs_source_t, void*), void *param) { struct obs_data *data = &obs->data; size_t i; pthread_mutex_lock(&data->sources_mutex); - for (i = 0; i < data->sources.num; i++) - enum_proc(data->sources.array[i], param); + for (i = 0; i < data->sources.num; i++) { + if (!enum_proc(data->sources.array[i], param)) + break; + } pthread_mutex_unlock(&data->sources_mutex); } + +obs_source_t obs_get_source_by_name(const char *name) +{ + struct obs_data *data = &obs->data; + struct obs_source *source = NULL; + size_t i; + + pthread_mutex_lock(&data->sources_mutex); + + for (i = 0; i < data->sources.num; i++) { + struct obs_source *cur_source = data->sources.array[i]; + if (strcmp(cur_source->name, name) == 0) { + source = cur_source; + break; + } + } + + pthread_mutex_unlock(&data->sources_mutex); + return source; +} diff --git a/libobs/obs.h b/libobs/obs.h index 57f907268..3f14bb399 100644 --- a/libobs/obs.h +++ b/libobs/obs.h @@ -142,9 +142,6 @@ typedef struct obs_scene_item *obs_sceneitem_t; typedef struct obs_output *obs_output_t; typedef struct obs_service *obs_service_t; -/* typedefs */ -typedef void (*ENUM_SOURCES_PROC)(obs_source_t source, void *param); - /* ------------------------------------------------------------------------- */ /* OBS context */ @@ -242,8 +239,22 @@ EXPORT void obs_set_output_source(uint32_t channel, obs_source_t source); */ EXPORT obs_source_t obs_get_output_source(uint32_t channel); -/** Enumerates user sources */ -EXPORT void obs_enum_sources(ENUM_SOURCES_PROC enum_proc, void *param); +/** + * Enumerates user sources + * + * Callback function returns true to continue enumeration, or false to end + * enumeration. + */ +EXPORT void obs_enum_sources(bool (*enum_proc)(obs_source_t, void*), + void *param); + +/** + * Gets a source by its name. + * + * Increments the source reference counter, use obs_source_release to + * release it when complete. + */ +EXPORT obs_source_t obs_get_source_by_name(const char *name); /** * Returns the location of a plugin data file. @@ -287,7 +298,7 @@ EXPORT const char *obs_source_getdisplayname(enum obs_source_type type, * Creates a source of the specified type with the specified settings. * * The "source" context is used for anything related to presenting - * or modifying video/audio. + * or modifying video/audio. Use obs_source_release to release it. */ EXPORT obs_source_t obs_source_create(enum obs_source_type type, const char *id, const char *name, const char *settings); @@ -359,13 +370,23 @@ EXPORT void obs_source_filter_setorder(obs_source_t source, obs_source_t filter, enum order_movement movement); /** Gets the settings string for a source */ -EXPORT const char *obs_source_get_settings(obs_source_t source); +EXPORT const char *obs_source_getsettings(obs_source_t source); + +/** Gets the name of a source */ +EXPORT const char *obs_source_getname(obs_source_t source); + +/** Sets the name of a source */ +EXPORT void obs_source_setname(obs_source_t source, const char *name); + +/** Gets the source type and identifier */ +EXPORT void obs_source_getid(obs_source_t source, enum obs_source_type *type, + const char **id); /* ------------------------------------------------------------------------- */ /* Functions used by sources */ /** Saves the settings string for a source */ -EXPORT void obs_source_save_settings(obs_source_t source, const char *settings); +EXPORT void obs_source_savesettings(obs_source_t source, const char *settings); /** Outputs asynchronous video data */ EXPORT void obs_source_output_video(obs_source_t source,