Skip to content

Commit 41fc3e2

Browse files
committed
remove references on remove signal
1 parent 824c935 commit 41fc3e2

1 file changed

Lines changed: 47 additions & 20 deletions

File tree

source-clone.c

Lines changed: 47 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,22 @@ const char *source_clone_get_name(void *type_data)
1010
return obs_module_text("SourceClone");
1111
}
1212

13-
static void *source_clone_create(obs_data_t *settings, obs_source_t *source)
13+
void source_clone_audio_activate(void *data, calldata_t *calldata)
1414
{
15-
UNUSED_PARAMETER(settings);
16-
struct source_clone *context = bzalloc(sizeof(struct source_clone));
17-
context->source = source;
18-
pthread_mutex_init(&context->audio_mutex, NULL);
19-
context->cx = 1;
20-
context->cy = 1;
21-
obs_source_update(source, NULL);
22-
return context;
15+
struct source_clone *context = data;
16+
obs_source_t *source = calldata_ptr(calldata, "source");
17+
if (context->audio_enabled && context->clone && obs_weak_source_references_source(context->clone, source)) {
18+
obs_source_set_audio_active(context->source, true);
19+
}
20+
}
21+
22+
void source_clone_audio_deactivate(void *data, calldata_t *calldata)
23+
{
24+
struct source_clone *context = data;
25+
obs_source_t *source = calldata_ptr(calldata, "source");
26+
if (context->clone && obs_weak_source_references_source(context->clone, source)) {
27+
obs_source_set_audio_active(context->source, false);
28+
}
2329
}
2430

2531
void source_clone_audio_callback(void *data, obs_source_t *source, const struct audio_data *audio_data, bool muted)
@@ -37,22 +43,43 @@ void source_clone_audio_callback(void *data, obs_source_t *source, const struct
3743
pthread_mutex_unlock(&context->audio_mutex);
3844
}
3945

40-
void source_clone_audio_activate(void *data, calldata_t *calldata)
41-
{
46+
static void source_clone_remove(void *data, calldata_t *cd) {
47+
UNUSED_PARAMETER(cd);
4248
struct source_clone *context = data;
43-
obs_source_t *source = calldata_ptr(calldata, "source");
44-
if (context->audio_enabled && context->clone && obs_weak_source_references_source(context->clone, source)) {
45-
obs_source_set_audio_active(context->source, true);
49+
if (context->audio_wrapper) {
50+
audio_wrapper_remove(context->audio_wrapper, context);
51+
context->audio_wrapper = NULL;
4652
}
53+
obs_source_t *source = obs_weak_source_get_source(context->clone);
54+
if (source) {
55+
signal_handler_t *sh = obs_source_get_signal_handler(source);
56+
signal_handler_disconnect(sh, "audio_activate", source_clone_audio_activate, data);
57+
signal_handler_disconnect(sh, "audio_deactivate", source_clone_audio_deactivate, data);
58+
obs_source_remove_audio_capture_callback(source, source_clone_audio_callback, data);
59+
if (obs_source_showing(context->source))
60+
obs_source_dec_showing(source);
61+
if (context->active_clone && obs_source_active(context->source))
62+
obs_source_dec_active(source);
63+
obs_source_release(source);
64+
}
65+
obs_weak_source_release(context->clone);
66+
context->clone = NULL;
67+
obs_weak_source_release(context->current_scene);
68+
context->current_scene = NULL;
4769
}
4870

49-
void source_clone_audio_deactivate(void *data, calldata_t *calldata)
71+
static void *source_clone_create(obs_data_t *settings, obs_source_t *source)
5072
{
51-
struct source_clone *context = data;
52-
obs_source_t *source = calldata_ptr(calldata, "source");
53-
if (context->clone && obs_weak_source_references_source(context->clone, source)) {
54-
obs_source_set_audio_active(context->source, false);
55-
}
73+
UNUSED_PARAMETER(settings);
74+
struct source_clone *context = bzalloc(sizeof(struct source_clone));
75+
context->source = source;
76+
pthread_mutex_init(&context->audio_mutex, NULL);
77+
context->cx = 1;
78+
context->cy = 1;
79+
obs_source_update(source, NULL);
80+
signal_handler_t *sh = obs_source_get_signal_handler(source);
81+
signal_handler_connect(sh, "remove", source_clone_remove, context);
82+
return context;
5683
}
5784

5885
static void source_clone_destroy(void *data)

0 commit comments

Comments
 (0)