@@ -172,18 +172,26 @@ void CallbackManager::addSource(obs_source_t *source)
172172 if (obs_source_get_type (source) == OBS_SOURCE_TYPE_TRANSITION ) {
173173 std::unique_lock<std::mutex> ulock (transitions_mtx);
174174
175- blog (LOG_INFO , " addSource - transition!: %s" , obs_source_get_name (source));
175+ const char *raw_name = obs_source_get_name (source);
176+ if (!raw_name)
177+ return ;
178+
179+ blog (LOG_INFO , " addSource - transition!: %s" , raw_name);
176180
177- TransitionInfo * ti = new TransitionInfo;
181+ auto ti = std::make_unique< TransitionInfo>() ;
178182 ti->transition = source;
179183
184+ auto result = transitions.try_emplace (std::string (raw_name), std::move (ti));
185+ if (!result.second ) {
186+ blog (LOG_WARNING , " addSource - transition '%s' is already tracked; skipping" , raw_name);
187+ return ;
188+ }
189+
180190 signal_handler_t *sh = obs_source_get_signal_handler (source);
181191 if (sh) {
182- signal_handler_connect (sh, " transition_start" , transition_start_handler, ti );
183- signal_handler_connect (sh, " transition_stop" , transition_stop_handler, ti );
192+ signal_handler_connect (sh, " transition_start" , transition_start_handler, result. first -> second . get () );
193+ signal_handler_connect (sh, " transition_stop" , transition_stop_handler, result. first -> second . get () );
184194 }
185-
186- transitions.emplace (std::make_pair (std::string (obs_source_get_name (source)), ti));
187195 } else {
188196 // Regular source
189197 std::unique_lock<std::mutex> ulock (sources_mtx);
0 commit comments