Browse Source

libobs: Delay stop detection of audio source

Delay the "audio stopped" detection by one audio tick to ensure that
audio doesn't get intentionally cut out in some situations
jp9000 8 years ago
parent
commit
dc4e205008
2 changed files with 12 additions and 0 deletions
  1. 11 0
      libobs/obs-audio.c
  2. 1 0
      libobs/obs-internal.h

+ 11 - 0
libobs/obs-audio.c

@@ -108,10 +108,20 @@ static bool discard_if_stopped(obs_source_t *source, size_t channels)
 	/* if perpetually pending data, it means the audio has stopped,
 	 * so clear the audio data */
 	if (last_size == size) {
+		if (!source->pending_stop) {
+			source->pending_stop = true;
+#if DEBUG_AUDIO == 1
+			blog(LOG_DEBUG, "doing pending stop trick: '%s'",
+					source->context.name);
+#endif
+			return true;
+		}
+
 		for (size_t ch = 0; ch < channels; ch++)
 			circlebuf_pop_front(&source->audio_input_buf[ch], NULL,
 					source->audio_input_buf[ch].size);
 
+		source->pending_stop = false;
 		source->audio_ts = 0;
 		source->last_audio_input_buf_size = 0;
 #if DEBUG_AUDIO == 1
@@ -212,6 +222,7 @@ static inline void discard_audio(struct obs_core_audio *audio,
 				ts->end);
 #endif
 
+	source->pending_stop = false;
 	source->audio_ts = ts->end;
 }
 

+ 1 - 0
libobs/obs-internal.h

@@ -562,6 +562,7 @@ struct obs_source {
 	/* audio */
 	bool                            audio_failed;
 	bool                            audio_pending;
+	bool                            pending_stop;
 	bool                            user_muted;
 	bool                            muted;
 	struct obs_source               *next_audio_source;