bool CXBMCRenderManager::FrameWait(int ms)
{
XbmcThreads::EndTime timeout(ms);
- CRetakeLock<CExclusiveLock> lock(m_sharedSection);
+ CSingleLock lock(m_presentlock);
while(m_presentstep == PRESENT_IDLE && !timeout.IsTimePast())
{
lock.Leave();
void CXBMCRenderManager::FrameMove()
{
- { CRetakeLock<CExclusiveLock> lock(m_sharedSection);
+ { CSharedLock lock(m_sharedSection);
+ CSingleLock lock2(m_presentlock);
+
if (!m_pRenderer)
return;
if(g_graphicsContext.IsFullScreenVideo())
WaitPresentTime(m_presenttime);
- { CRetakeLock<CExclusiveLock> lock(m_sharedSection);
+ { CSingleLock lock(m_presentlock);
if(m_presentstep == PRESENT_FRAME)
{
void CXBMCRenderManager::FlipPage(volatile bool& bStop, double timestamp /* = 0LL*/, int source /*= -1*/, EFIELDSYNC sync /*= FS_NONE*/)
{
- { CRetakeLock<CExclusiveLock> lock(m_sharedSection);
+ { CSharedLock lock(m_sharedSection);
if(bStop)
return;
if(timestamp > GetPresentTime() + 5.0)
timestamp = GetPresentTime() + 5.0;
+ CSingleLock lock2(m_presentlock);
+
if(source < 0)
source = GetNextDecode();
int CXBMCRenderManager::WaitForBuffer(volatile bool& bStop, int timeout)
{
CSharedLock lock(m_sharedSection);
+ CSingleLock lock2(m_presentlock);
if (!m_pRenderer)
return -1;
XbmcThreads::EndTime endtime(timeout);
while(GetNextDecode() < 0)
{
+ lock2.Leave();
lock.Leave();
m_presentevent.WaitMSec(std::min(50, timeout));
if(endtime.IsTimePast() || bStop)
return -1;
}
lock.Enter();
+ lock2.Enter();
}
// make sure overlay buffer is released, this won't happen on AddOverlay
void CXBMCRenderManager::PrepareNextRender()
{
+ CSingleLock lock(m_presentlock);
+
int nxt = GetNextRender();
if (nxt < 0)
return;
void CXBMCRenderManager::DiscardBuffer()
{
- CRetakeLock<CExclusiveLock> lock(m_sharedSection);
+ CSharedLock lock(m_sharedSection);
+ CSingleLock lock2(m_presentlock);
while(m_QueueOutput != m_QueueRender)
{
m_pRenderer->ReleaseBuffer(m_QueueOutput);