From 528325578fa81f2092debca18bb40a3ebacbe1a2 Mon Sep 17 00:00:00 2001 From: jp9000 Date: Tue, 21 Feb 2017 10:59:02 -0800 Subject: [PATCH] libobs: Fix audio monitoring delaying perpetually On windows, when a source has only audio (no video) yet is marked as capable of both video and audio, it would be programmed to expect a video frame to synchronize with. This fixes that potential issue by detecting whether any video is actually playing or not. --- libobs/audio-monitoring/win32/wasapi-output.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/libobs/audio-monitoring/win32/wasapi-output.c b/libobs/audio-monitoring/win32/wasapi-output.c index 1145f8a00..7d2522c8a 100644 --- a/libobs/audio-monitoring/win32/wasapi-output.c +++ b/libobs/audio-monitoring/win32/wasapi-output.c @@ -30,6 +30,8 @@ struct audio_monitor { IAudioRenderClient *render; uint64_t last_recv_time; + uint64_t prev_video_ts; + uint64_t time_since_prev; audio_resampler_t *resampler; uint32_t sample_rate; uint32_t channels; @@ -66,6 +68,16 @@ static bool process_audio_delay(struct audio_monitor *monitor, circlebuf_push_back(&monitor->delay_buffer, *data, *frames * blocksize); + if (!monitor->prev_video_ts) { + monitor->prev_video_ts = last_frame_ts; + + } else if (monitor->prev_video_ts == last_frame_ts) { + monitor->time_since_prev += (uint64_t)*frames * + 1000000000ULL / (uint64_t)monitor->sample_rate; + } else { + monitor->time_since_prev = 0; + } + while (monitor->delay_buffer.size != 0) { size_t size; bool bad_diff; @@ -76,7 +88,9 @@ static bool process_audio_delay(struct audio_monitor *monitor, ((uint64_t)pad * 1000000000ULL / (uint64_t)monitor->sample_rate); diff = (int64_t)front_ts - (int64_t)last_frame_ts; - bad_diff = llabs(diff) > 5000000000; + bad_diff = !last_frame_ts || + llabs(diff) > 5000000000 || + monitor->time_since_prev > 100000000ULL; /* delay audio if rushing */ if (!bad_diff && diff > 75000000) {