diff --git a/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll index 3e79509..bffcb10 100644 Binary files a/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll and b/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll differ diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index 7b91e1b..98e89cb 100644 Binary files a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll and b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll differ diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp index 85bec14..a04a2d4 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp @@ -214,9 +214,11 @@ bool Duplicator::Duplicate() { if (!dupl_ || !device_) return false; + const UINT timeout = 16; + ComPtr resource; DXGI_OUTDUPL_FRAME_INFO frameInfo; - const auto hr = dupl_->AcquireNextFrame(INFINITE, &frameInfo, &resource); + const auto hr = dupl_->AcquireNextFrame(timeout, &frameInfo, &resource); if (FAILED(hr)) { @@ -228,32 +230,31 @@ bool Duplicator::Duplicate() // it is necessary to re-initialize monitors. Debug::Log("Duplicator::Duplicate() => DXGI_ERROR_ACCESS_LOST."); state_ = State::AccessLost; - break; + return false; } case DXGI_ERROR_WAIT_TIMEOUT: { // This often occurs when timeout value is small and it is not problem. // Debug::Log("Duplicator::Duplicate() => DXGI_ERROR_WAIT_TIMEOUT."); - break; + return true; } case DXGI_ERROR_INVALID_CALL: { Debug::Error("Duplicator::Duplicate() => DXGI_ERROR_INVALID_CALL."); - break; + return false; } case E_INVALIDARG: { Debug::Error("Duplicator::Duplicate() => E_INVALIDARG."); - break; + return false; } default: { state_ = State::Unknown; Debug::Error("Duplicator::Duplicate() => Unknown Error."); - break; + return false; } } - return false; } ScopedReleaser releaser([this] diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h index a048377..d94aad7 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -73,7 +74,7 @@ private: void UpdateDirtyRects(); Monitor* monitor_ = nullptr; - State state_ = State::Ready; + std::atomic state_ = State::Ready; std::shared_ptr device_; Microsoft::WRL::ComPtr dupl_;