예제 #1
0
파일: PAPlayer.cpp 프로젝트: huigll/xbmc
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
  }
}
예제 #2
0
파일: PAPlayer.cpp 프로젝트: 7orlum/xbmc
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();
}
예제 #3
0
//! 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;
    }
}
예제 #4
0
파일: PAPlayer.cpp 프로젝트: ebardie/xbmc
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();
}