Browse Source

libobs: Don't use removed sources

Exeldro 1 month ago
parent
commit
d84ff0eb6f
2 changed files with 14 additions and 5 deletions
  1. 8 1
      libobs/obs-audio.c
  2. 6 4
      libobs/obs-video.c

+ 8 - 1
libobs/obs-audio.c

@@ -91,6 +91,9 @@ static inline void check_audio_output_source_is_monitoring_device(obs_source_t *
  */
 static void push_audio_tree2(obs_source_t *parent, obs_source_t *source, void *p)
 {
+	if (obs_source_removed(source))
+		return;
+
 	struct obs_core_audio *audio = p;
 	size_t idx = da_find(audio->render_order, &source, 0);
 
@@ -631,6 +634,8 @@ bool audio_callback(void *param, uint64_t start_ts_in, uint64_t end_ts_in, uint6
 				continue;
 			if (!obs_source_active(source))
 				continue;
+			if (obs_source_removed(source))
+				continue;
 
 			/* first, add top - level sources as root_nodes */
 			if (obs->video.mixes.array[j]->mix_audio)
@@ -653,7 +658,9 @@ bool audio_callback(void *param, uint64_t start_ts_in, uint64_t end_ts_in, uint6
 
 	source = data->first_audio_source;
 	while (source) {
-		push_audio_tree(NULL, source, audio);
+		if (!obs_source_removed(source)) {
+			push_audio_tree(NULL, source, audio);
+		}
 		source = (struct obs_source *)source->next_audio_source;
 	}
 

+ 6 - 4
libobs/obs-video.c

@@ -64,7 +64,7 @@ static uint64_t tick_sources(uint64_t cur_time, uint64_t last_time)
 
 	source = data->sources;
 	while (source) {
-		obs_source_t *s = obs_source_get_ref(source);
+		obs_source_t *s = obs_source_removed(source) ? NULL : obs_source_get_ref(source);
 		if (s)
 			da_push_back(data->sources_to_tick, &s);
 		source = (struct obs_source *)source->context.hh_uuid.next;
@@ -77,9 +77,11 @@ static uint64_t tick_sources(uint64_t cur_time, uint64_t last_time)
 
 	for (size_t i = 0; i < data->sources_to_tick.num; i++) {
 		obs_source_t *s = data->sources_to_tick.array[i];
-		const uint64_t start = source_profiler_source_tick_start();
-		obs_source_video_tick(s, seconds);
-		source_profiler_source_tick_end(s, start);
+		if (!obs_source_removed(s)) {
+			const uint64_t start = source_profiler_source_tick_start();
+			obs_source_video_tick(s, seconds);
+			source_profiler_source_tick_end(s, start);
+		}
 		obs_source_release(s);
 	}