Skip to content

Commit ec7c574

Browse files
committed
Add active clone option
1 parent 0029e58 commit ec7c574

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

data/locale/en-US.ini

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@ Full="Full"
88
Half="Half"
99
Third="Third"
1010
Quarter="Quarter"
11+
ActiveClone="Active Clone"

source-clone.c

Lines changed: 41 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ struct source_clone {
2222
uint32_t source_cy;
2323
enum gs_color_space space;
2424
bool rendering;
25+
bool active_clone;
2526
};
2627

2728
const char *source_clone_get_name(void *type_data)
@@ -91,11 +92,12 @@ static void source_clone_destroy(void *data)
9192
source_clone_audio_activate, data);
9293
signal_handler_disconnect(sh, "audio_deactivate",
9394
source_clone_audio_deactivate, data);
94-
9595
obs_source_remove_audio_capture_callback(
9696
source, source_clone_audio_callback, data);
9797
if (obs_source_showing(context->source))
9898
obs_source_dec_showing(source);
99+
if (context->active_clone && obs_source_active(context->source))
100+
obs_source_dec_active(source);
99101
obs_source_release(source);
100102
}
101103
obs_weak_source_release(context->clone);
@@ -117,6 +119,7 @@ void source_clone_update(void *data, obs_data_t *settings)
117119
{
118120
struct source_clone *context = data;
119121
bool audio_enabled = obs_data_get_bool(settings, "audio");
122+
bool active_clone = obs_data_get_bool(settings, "active_clone");
120123
const char *source_name = obs_data_get_string(settings, "clone");
121124
obs_source_t *source = obs_get_source_by_name(source_name);
122125
if (source == context->source) {
@@ -126,7 +129,8 @@ void source_clone_update(void *data, obs_data_t *settings)
126129
if (source) {
127130
if (!obs_weak_source_references_source(context->clone,
128131
source) ||
129-
context->audio_enabled != audio_enabled) {
132+
context->audio_enabled != audio_enabled ||
133+
context->active_clone != active_clone) {
130134
obs_source_t *prev_source =
131135
obs_weak_source_get_source(context->clone);
132136
if (prev_source) {
@@ -144,6 +148,9 @@ void source_clone_update(void *data, obs_data_t *settings)
144148
source_clone_audio_callback, data);
145149
if (obs_source_showing(context->source))
146150
obs_source_dec_showing(prev_source);
151+
if (context->active_clone &&
152+
obs_source_active(context->source))
153+
obs_source_dec_active(source);
147154
obs_source_release(prev_source);
148155
}
149156
obs_weak_source_release(context->clone);
@@ -171,10 +178,13 @@ void source_clone_update(void *data, obs_data_t *settings)
171178
}
172179
if (obs_source_showing(context->source))
173180
obs_source_inc_showing(source);
181+
if (active_clone && obs_source_active(context->source))
182+
obs_source_inc_active(source);
174183
}
175184
obs_source_release(source);
176185
}
177186
context->audio_enabled = audio_enabled;
187+
context->active_clone = active_clone;
178188
context->num_channels = audio_output_get_channels(obs_get_audio());
179189
context->buffer_frame =
180190
(uint8_t)obs_data_get_int(settings, "buffer_frame");
@@ -228,6 +238,9 @@ obs_properties_t *source_clone_properties(void *data)
228238
obs_property_list_add_int(p, obs_module_text("Third"), 3);
229239
obs_property_list_add_int(p, obs_module_text("Quarter"), 4);
230240

241+
obs_properties_add_bool(props, "active_clone",
242+
obs_module_text("ActiveClone"));
243+
231244
obs_properties_add_text(
232245
props, "plugin_info",
233246
"<a href=\"https://obsproject.com/forum/resources/source-clone.1632/\">Source Clone</a> (" PROJECT_VERSION
@@ -453,6 +466,30 @@ void source_clone_hide(void *data)
453466
obs_source_release(source);
454467
}
455468

469+
void source_clone_activate(void *data)
470+
{
471+
struct source_clone *context = data;
472+
if (!context->clone || !context->active_clone)
473+
return;
474+
obs_source_t *source = obs_weak_source_get_source(context->clone);
475+
if (!source)
476+
return;
477+
obs_source_inc_active(source);
478+
obs_source_release(source);
479+
}
480+
481+
void source_clone_deactivate(void *data)
482+
{
483+
struct source_clone *context = data;
484+
if (!context->clone || !context->active_clone)
485+
return;
486+
obs_source_t *source = obs_weak_source_get_source(context->clone);
487+
if (!source)
488+
return;
489+
obs_source_dec_active(source);
490+
obs_source_release(source);
491+
}
492+
456493
void source_clone_save(void *data, obs_data_t *settings)
457494
{
458495
struct source_clone *context = data;
@@ -542,6 +579,8 @@ struct obs_source_info source_clone_info = {
542579
.video_tick = source_clone_video_tick,
543580
.show = source_clone_show,
544581
.hide = source_clone_hide,
582+
.activate = source_clone_activate,
583+
.deactivate = source_clone_deactivate,
545584
.get_defaults = source_clone_defaults,
546585
.get_properties = source_clone_properties,
547586
};

0 commit comments

Comments
 (0)