From b1e3ebe14c2c72262455ca558e6a40b37f2e784c Mon Sep 17 00:00:00 2001 From: Memphiz Date: Sat, 16 May 2015 13:58:26 +0200 Subject: [osx/videosync] - move calls to displaylink init/deinit into the vsync thread and make sure that init is only called once the display reset is done - same as GLX does --- xbmc/video/videosync/VideoSyncOsx.cpp | 42 +++++++++++++++++++++++++---------- xbmc/video/videosync/VideoSyncOsx.h | 8 +++++-- 2 files changed, 36 insertions(+), 14 deletions(-) diff --git a/xbmc/video/videosync/VideoSyncOsx.cpp b/xbmc/video/videosync/VideoSyncOsx.cpp index 53992fe9f9..a59a4b9efe 100644 --- a/xbmc/video/videosync/VideoSyncOsx.cpp +++ b/xbmc/video/videosync/VideoSyncOsx.cpp @@ -34,35 +34,44 @@ bool CVideoSyncOsx::Setup(PUPDATECLOCK func) { CLog::Log(LOGDEBUG, "CVideoSyncOsx::%s setting up OSX", __FUNCTION__); - bool setupOk = false; //init the vblank timestamp m_LastVBlankTime = CurrentHostCounter(); UpdateClock = func; - m_abort = false; - - setupOk = InitDisplayLink(); - if (setupOk) - { - g_Windowing.Register(this); - } + m_displayLost = false; + m_displayReset = false; + m_lostEvent.Reset(); + + g_Windowing.Register(this); - return setupOk; + return true; } void CVideoSyncOsx::Run(volatile bool& stop) { + InitDisplayLink(); + //because cocoa has a vblank callback, we just keep sleeping until we're asked to stop the thread - while(!stop && !m_abort) + while(!stop && !m_displayLost && !m_displayReset) { Sleep(100); } + + m_lostEvent.Set(); + + while(!stop && m_displayLost && !m_displayReset) + { + Sleep(10); + } + + DeinitDisplayLink(); } void CVideoSyncOsx::Cleanup() { CLog::Log(LOGDEBUG, "CVideoSyncOsx::%s cleaning up OSX", __FUNCTION__); - DeinitDisplayLink(); + m_lostEvent.Set(); + m_LastVBlankTime = 0; g_Windowing.Unregister(this); } @@ -73,9 +82,18 @@ float CVideoSyncOsx::GetFps() return m_fps; } +void CVideoSyncOsx::OnLostDevice() +{ + if (!m_displayLost) + { + m_displayLost = true; + m_lostEvent.WaitMSec(1000); + } +} + void CVideoSyncOsx::OnResetDevice() { - m_abort = true; + m_displayReset = true; } void CVideoSyncOsx::VblankHandler(int64_t nowtime) diff --git a/xbmc/video/videosync/VideoSyncOsx.h b/xbmc/video/videosync/VideoSyncOsx.h index d24204a690..4133884df9 100644 --- a/xbmc/video/videosync/VideoSyncOsx.h +++ b/xbmc/video/videosync/VideoSyncOsx.h @@ -22,12 +22,13 @@ #if defined(TARGET_DARWIN_OSX) #include "VideoSync.h" #include "guilib/DispResource.h" +#include "threads/Event.h" class CVideoSyncOsx : public CVideoSync, IDispResource { public: - CVideoSyncOsx() : m_LastVBlankTime(0), m_abort(false){} + CVideoSyncOsx() : m_LastVBlankTime(0), m_displayLost(false), m_displayReset(false){} // CVideoSync interface virtual bool Setup(PUPDATECLOCK func); @@ -36,6 +37,7 @@ public: virtual float GetFps(); // IDispResource interface + virtual void OnLostDevice(); virtual void OnResetDevice(); // used in the displaylink callback @@ -46,7 +48,9 @@ private: virtual void DeinitDisplayLink(); int64_t m_LastVBlankTime; //timestamp of the last vblank, used for calculating how many vblanks happened - volatile bool m_abort; + volatile bool m_displayLost; + volatile bool m_displayReset; + CEvent m_lostEvent; }; #endif// TARGET_DARWIN_OSX -- cgit v1.2.3