[Test] Added tests for CUtil::SplitParams
[xbmc.git] / xbmc / windowing / ios / VideoSyncIos.cpp
blobbca43b5704d69b52ffafde641b440c2b5083dd69
1 /*
2 * Copyright (C) 2015-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
9 #include "VideoSyncIos.h"
11 #include "cores/VideoPlayer/VideoReferenceClock.h"
12 #include "utils/MathUtils.h"
13 #include "utils/TimeUtils.h"
14 #include "utils/log.h"
15 #include "windowing/GraphicContext.h"
16 #include "windowing/ios/WinSystemIOS.h"
18 bool CVideoSyncIos::Setup()
20 CLog::Log(LOGDEBUG, "CVideoSyncIos::{} setting up OSX", __FUNCTION__);
22 //init the vblank timestamp
23 m_LastVBlankTime = CurrentHostCounter();
24 m_abortEvent.Reset();
26 bool setupOk = InitDisplayLink();
27 if (setupOk)
29 m_winSystem.Register(this);
32 return setupOk;
35 void CVideoSyncIos::Run(CEvent& stopEvent)
37 //because cocoa has a vblank callback, we just keep sleeping until we're asked to stop the thread
38 XbmcThreads::CEventGroup waitGroup{&stopEvent, &m_abortEvent};
39 waitGroup.wait();
42 void CVideoSyncIos::Cleanup()
44 CLog::Log(LOGDEBUG, "CVideoSyncIos::{} cleaning up OSX", __FUNCTION__);
45 DeinitDisplayLink();
46 m_winSystem.Unregister(this);
49 float CVideoSyncIos::GetFps()
51 m_fps = CServiceBroker::GetWinSystem()->GetGfxContext().GetFPS();
52 CLog::Log(LOGDEBUG, "CVideoSyncIos::{} Detected refreshrate: {:f} hertz", __FUNCTION__, m_fps);
53 return m_fps;
56 void CVideoSyncIos::OnResetDisplay()
58 m_abortEvent.Set();
61 void CVideoSyncIos::IosVblankHandler()
63 int NrVBlanks;
64 double VBlankTime;
65 int64_t nowtime = CurrentHostCounter();
67 //calculate how many vblanks happened
68 VBlankTime = (double)(nowtime - m_LastVBlankTime) / (double)CurrentHostFrequency();
69 NrVBlanks = MathUtils::round_int(VBlankTime * static_cast<double>(m_fps));
71 //save the timestamp of this vblank so we can calculate how many happened next time
72 m_LastVBlankTime = nowtime;
74 //update the vblank timestamp, update the clock and send a signal that we got a vblank
75 m_refClock->UpdateClock(NrVBlanks, nowtime);
78 bool CVideoSyncIos::InitDisplayLink()
80 bool ret = true;
81 CLog::Log(LOGDEBUG, "CVideoSyncIos: setting up displaylink");
82 if (!m_winSystem.InitDisplayLink(this))
84 CLog::Log(LOGDEBUG, "CVideoSyncIos: InitDisplayLink failed");
85 ret = false;
87 return ret;
90 void CVideoSyncIos::DeinitDisplayLink()
92 m_winSystem.DeinitDisplayLink();