@@ -61,11 +61,37 @@ void source_clone_audio_callback(void *data, obs_source_t *source,
6161 pthread_mutex_unlock (& context -> audio_mutex );
6262}
6363
64+ void source_clone_audio_activate (void * data , calldata_t * calldata )
65+ {
66+ struct source_clone * context = data ;
67+ obs_source_t * source = calldata_ptr (calldata , "source" );
68+ if (context -> audio_enabled && context -> clone &&
69+ obs_weak_source_references_source (context -> clone , source )) {
70+ obs_source_set_audio_active (context -> source , true);
71+ }
72+ }
73+
74+ void source_clone_audio_deactivate (void * data , calldata_t * calldata )
75+ {
76+ struct source_clone * context = data ;
77+ obs_source_t * source = calldata_ptr (calldata , "source" );
78+ if (context -> clone &&
79+ obs_weak_source_references_source (context -> clone , source )) {
80+ obs_source_set_audio_active (context -> source , false);
81+ }
82+ }
83+
6484static void source_clone_destroy (void * data )
6585{
6686 struct source_clone * context = data ;
6787 obs_source_t * source = obs_weak_source_get_source (context -> clone );
6888 if (source ) {
89+ signal_handler_t * sh = obs_source_get_signal_handler (source );
90+ signal_handler_disconnect (sh , "audio_activate" ,
91+ source_clone_audio_activate , data );
92+ signal_handler_disconnect (sh , "audio_deactivate" ,
93+ source_clone_audio_deactivate , data );
94+
6995 obs_source_remove_audio_capture_callback (
7096 source , source_clone_audio_callback , data );
7197 if (obs_source_showing (context -> source ))
@@ -104,6 +130,15 @@ void source_clone_update(void *data, obs_data_t *settings)
104130 obs_source_t * prev_source =
105131 obs_weak_source_get_source (context -> clone );
106132 if (prev_source ) {
133+ signal_handler_t * sh =
134+ obs_source_get_signal_handler (
135+ prev_source );
136+ signal_handler_disconnect (
137+ sh , "audio_activate" ,
138+ source_clone_audio_activate , data );
139+ signal_handler_disconnect (
140+ sh , "audio_deactivate" ,
141+ source_clone_audio_deactivate , data );
107142 obs_source_remove_audio_capture_callback (
108143 prev_source ,
109144 source_clone_audio_callback , data );
@@ -113,10 +148,27 @@ void source_clone_update(void *data, obs_data_t *settings)
113148 }
114149 obs_weak_source_release (context -> clone );
115150 context -> clone = obs_source_get_weak_source (source );
116- if (audio_enabled )
151+ if (audio_enabled &&
152+ (obs_source_get_output_flags (source ) &
153+ OBS_SOURCE_AUDIO ) != 0 ) {
117154 obs_source_add_audio_capture_callback (
118155 source , source_clone_audio_callback ,
119156 data );
157+ obs_source_set_audio_active (
158+ context -> source ,
159+ obs_source_audio_active (source ));
160+ signal_handler_t * sh =
161+ obs_source_get_signal_handler (source );
162+ signal_handler_connect (
163+ sh , "audio_activate" ,
164+ source_clone_audio_activate , data );
165+ signal_handler_connect (
166+ sh , "audio_deactivate" ,
167+ source_clone_audio_deactivate , data );
168+ } else {
169+ obs_source_set_audio_active (context -> source ,
170+ false);
171+ }
120172 if (obs_source_showing (context -> source ))
121173 obs_source_inc_showing (source );
122174 }
0 commit comments