void PAPlayer::Process() { if (!m_startEvent.WaitMSec(100)) { CLog::Log(LOGDEBUG, "PAPlayer::Process - Failed to receive start event"); return; } CLog::Log(LOGDEBUG, "PAPlayer::Process - Playback started"); while(m_isPlaying && !m_bStop) { /* this needs to happen outside of any locks to prevent deadlocks */ if (m_signalSpeedChange) { m_callback.OnPlayBackSpeedChanged(m_playbackSpeed); m_signalSpeedChange = false; } double delay = 100.0; double buffer = 100.0; ProcessStreams(delay, buffer); double watermark = buffer * 0.5; if (delay < buffer && delay > watermark) CThread::Sleep(MathUtils::round_int((delay - watermark) * 1000.0)); GetTimeInternal(); //update for GUI } }
void PAPlayer::Process() { if (!m_startEvent.WaitMSec(100)) { CLog::Log(LOGDEBUG, "PAPlayer::Process - Failed to receive start event"); return; } CLog::Log(LOGDEBUG, "PAPlayer::Process - Playback started"); while(m_isPlaying && !m_bStop) { /* this needs to happen outside of any locks to prevent deadlocks */ if (m_signalSpeedChange) { m_callback.OnPlayBackSpeedChanged(m_playbackSpeed); m_signalSpeedChange = false; } double freeBufferTime = 0.0; ProcessStreams(freeBufferTime); // if none of our streams wants at least 10ms of data, we sleep if (freeBufferTime < 0.01) { CThread::Sleep(10); } GetTimeInternal(); //update for GUI } if(m_isFinished && !m_bStop) m_callback.OnPlayBackEnded(); else m_callback.OnPlayBackStopped(); }
//! Implement VideoInput::GrabNewest() bool DebayerVideo::GrabNewest( unsigned char* image, bool wait ) { if(videoin[0]->GrabNewest(buffer.get(),wait)) { ProcessStreams(image, buffer.get()); return true; }else{ return false; } }
void PAPlayer::Process() { if (!m_startEvent.WaitMSec(100)) { CLog::Log(LOGDEBUG, "PAPlayer::Process - Failed to receive start event"); return; } CLog::Log(LOGDEBUG, "PAPlayer::Process - Playback started"); while(m_isPlaying && !m_bStop) { /* this needs to happen outside of any locks to prevent deadlocks */ if (m_signalSpeedChange) { m_callback.OnPlayBackSpeedChanged(m_playbackSpeed); m_signalSpeedChange = false; } double delay = 100.0; double buffer = 100.0; ProcessStreams(delay, buffer); double watermark = buffer * 0.5; #if defined(TARGET_DARWIN) // In CoreAudio the delay can be bigger then the buffer // because of delay from the HAL/Hardware // This is the case when the buffer is full (e.x. 1 sec) // and there is a HAL-Delay. In that case we would never sleep // but load one cpu core up to 100% (happens on osx/ios whenever // the first stream is finished and a prebuffered second stream // starts to play. A BIG FIXME HERE. if ((delay < buffer || buffer == 1) && delay > watermark) #else if ((delay < buffer) && delay > watermark) #endif CThread::Sleep(MathUtils::round_int((delay - watermark) * 1000.0)); GetTimeInternal(); //update for GUI } // wait for any pending jobs to complete { CSharedLock lock(m_streamsLock); while (m_jobCounter > 0) { lock.Leave(); m_jobEvent.WaitMSec(100); lock.Enter(); } } if(m_isFinished && !m_bStop) m_callback.OnPlayBackEnded(); else m_callback.OnPlayBackStopped(); }