diff --git a/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll index a45e3e6..daf6660 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 eb1feaa..82941c2 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 a3d5180..99419c2 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.cpp @@ -46,7 +46,8 @@ void Duplicator::InitializeDevice() void Duplicator::InitializeDuplication() { ComPtr output1; - if (FAILED(monitor_->GetOutput().As(&output1))) { + if (FAILED(monitor_->GetOutput().As(&output1))) + { return; } @@ -243,6 +244,8 @@ void Duplicator::Duplicate(UINT timeout) if (!dupl_ || !device_) return; + Release(); + ComPtr resource; DXGI_OUTDUPL_FRAME_INFO frameInfo; const auto hr = dupl_->AcquireNextFrame(timeout, &frameInfo, &resource); @@ -285,33 +288,7 @@ void Duplicator::Duplicate(UINT timeout) return; } - ScopedReleaser releaser([this] - { - const auto hr = dupl_->ReleaseFrame(); - if (FAILED(hr)) - { - switch (hr) - { - case DXGI_ERROR_ACCESS_LOST: - { - Debug::Log("Duplicator::Duplicate() => DXGI_ERROR_ACCESS_LOST."); - state_ = State::AccessLost; - break; - } - case DXGI_ERROR_INVALID_CALL: - { - Debug::Error("Duplicator::Duplicate() => DXGI_ERROR_INVALID_CALL."); - break; - } - default: - { - state_ = State::Unknown; - Debug::Error("Duplicator::Duplicate() => Unknown Error."); - break; - } - } - } - }); + isFrameAcquired_ = true; ComPtr texture; if (FAILED(resource.As(&texture))) @@ -349,6 +326,39 @@ void Duplicator::Duplicate(UINT timeout) } +void Duplicator::Release() +{ + if (!isFrameAcquired_) return; + + const auto hr = dupl_->ReleaseFrame(); + if (FAILED(hr)) + { + switch (hr) + { + case DXGI_ERROR_ACCESS_LOST: + { + Debug::Log("Duplicator::Duplicate() => DXGI_ERROR_ACCESS_LOST."); + state_ = State::AccessLost; + break; + } + case DXGI_ERROR_INVALID_CALL: + { + Debug::Error("Duplicator::Duplicate() => DXGI_ERROR_INVALID_CALL."); + break; + } + default: + { + state_ = State::Unknown; + Debug::Error("Duplicator::Duplicate() => Unknown Error."); + break; + } + } + } + + isFrameAcquired_ = false; +} + + void Duplicator::UpdateCursor( const ComPtr& texture, const DXGI_OUTDUPL_FRAME_INFO& frameInfo) diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h index 3f4523b..38795d9 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Duplicator.h @@ -68,6 +68,7 @@ private: void CheckUnityAdapter(); void Duplicate(UINT timeout); + void Release(); void UpdateCursor( const Microsoft::WRL::ComPtr& texture, @@ -83,6 +84,7 @@ private: Microsoft::WRL::ComPtr dupl_; Frame lastFrame_; UINT lastFrameId_ = 0; + bool isFrameAquired_ = false; volatile bool shouldRun_ = false; std::thread thread_;