diff --git a/src/virtual-source/virtual-audio.cpp b/src/virtual-source/virtual-audio.cpp index afd92e7..056487c 100644 --- a/src/virtual-source/virtual-audio.cpp +++ b/src/virtual-source/virtual-audio.cpp @@ -94,10 +94,10 @@ HRESULT CVAudioStream::FillBuffer(IMediaSample *pms) hr = pms->GetPointer((BYTE**)&dst); - current_time = get_current_time(); - - if (prev_end_ts <= 0) - prev_end_ts = current_time; + if (system_start_time <= 0) + system_start_time = get_current_time(); + else + current_time = get_current_time() - system_start_time; if (!queue.hwnd) shared_queue_open(&queue, ModeAudio); @@ -105,6 +105,9 @@ HRESULT CVAudioStream::FillBuffer(IMediaSample *pms) if (sync_timeout <= 0) { SetTimeout(); } + else if (prev_end_ts >current_time) { + sleepto(prev_end_ts); + } else if (current_time - prev_end_ts > sync_timeout) { if (queue.header) share_queue_init_index(&queue); @@ -112,8 +115,6 @@ HRESULT CVAudioStream::FillBuffer(IMediaSample *pms) prev_end_ts = current_time; } - sleepto(prev_end_ts); - while (queue.header && !get_sample){ if (get_times > 20 || queue.header->state != OutputReady) @@ -127,7 +128,6 @@ HRESULT CVAudioStream::FillBuffer(IMediaSample *pms) } } - if (get_sample && !obs_start_ts){ obs_start_ts = timestamp; dshow_start_ts = prev_end_ts; @@ -253,6 +253,7 @@ HRESULT CVAudioStream::OnThreadCreate() obs_start_ts = 0; dshow_start_ts = 0; prev_end_ts = 0; + system_start_time = 0; return NOERROR; } diff --git a/src/virtual-source/virtual-audio.h b/src/virtual-source/virtual-audio.h index c27d960..8518cd2 100644 --- a/src/virtual-source/virtual-audio.h +++ b/src/virtual-source/virtual-audio.h @@ -107,6 +107,7 @@ class CVAudioStream : public CSourceStream, public IAMStreamConfig, uint64_t obs_start_ts = 0; uint64_t dshow_start_ts = 0; uint64_t sync_timeout = 0; + uint64_t system_start_time = 0; REFERENCE_TIME prev_end_ts = 0; ALLOCATOR_PROPERTIES alloc_prop; diff --git a/src/virtual-source/virtual-cam.cpp b/src/virtual-source/virtual-cam.cpp index c0f7a44..2fcc351 100644 --- a/src/virtual-source/virtual-cam.cpp +++ b/src/virtual-source/virtual-cam.cpp @@ -150,10 +150,11 @@ HRESULT CVCamStream::FillBuffer(IMediaSample *pms) hr = pms->GetPointer((BYTE**)&dst); - current_time = get_current_time(); - - if (prev_end_ts <= 0) - prev_end_ts = current_time; + if (system_start_time <= 0) + system_start_time = get_current_time(); + else + current_time = get_current_time() - system_start_time; + if (!queue.hwnd) { if (shared_queue_open(&queue, queue_mode)) { @@ -167,6 +168,9 @@ HRESULT CVCamStream::FillBuffer(IMediaSample *pms) if (sync_timeout <= 0) { SetTimeout(); } + else if (prev_end_ts >current_time) { + sleepto(prev_end_ts); + } else if (current_time - prev_end_ts > sync_timeout) { if(queue.header) share_queue_init_index(&queue); @@ -198,7 +202,6 @@ HRESULT CVCamStream::FillBuffer(IMediaSample *pms) duration = time_perframe; } else { int size = pms->GetActualDataLength(); - sleepto(prev_end_ts); memset(dst, 127, size); start_time = prev_end_ts; duration = ((VIDEOINFOHEADER*)m_mt.pbFormat)->AvgTimePerFrame; @@ -349,6 +352,7 @@ HRESULT CVCamStream::OnThreadCreate() prev_end_ts = 0; obs_start_ts = 0; dshow_start_ts = 0; + system_start_time = 0; return NOERROR; } diff --git a/src/virtual-source/virtual-cam.h b/src/virtual-source/virtual-cam.h index a30e5ba..e683c42 100644 --- a/src/virtual-source/virtual-cam.h +++ b/src/virtual-source/virtual-cam.h @@ -125,6 +125,7 @@ class CVCamStream : public CSourceStream, public IAMStreamConfig, public IKsProp uint64_t obs_start_ts = 0; uint64_t dshow_start_ts = 0; uint64_t time_perframe = 0; + uint64_t system_start_time = 0; uint64_t sync_timeout = 0; REFERENCE_TIME prev_end_ts = 0;