uint64 CFileDataIO::Seek(sint64 offset, wxSeekMode from) const { sint64 newpos = 0; switch (from) { case wxFromStart: newpos = offset; break; case wxFromCurrent: newpos = GetPosition() + offset; break; case wxFromEnd: newpos = GetLength() + offset; break; default: MULE_VALIDATE_PARAMS(false, wxT("Invalid seek-mode specified.")); } MULE_VALIDATE_PARAMS(newpos >= 0, wxT("Position after seeking would be less than zero!")); sint64 result = doSeek(newpos); MULE_VALIDATE_STATE(result >= 0, wxT("Seeking resulted in invalid offset.")); MULE_VALIDATE_STATE(result == newpos, wxT("Target position and actual position disagree.")); return result; }
/** * relative seek **/ ::std::streampos seekoff(::std::streamoff off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which) { // absolute seek if ( (way == ::std::ios_base::beg) ) { return seekpos(off,which); } // seek relative to current position else if ( (way == ::std::ios_base::cur) ) { if ( which == std::ios_base::in ) { return seekpos(readpos + (gptr()-eback()),which); } else if ( which == std::ios_base::out ) { return seekpos(writepos + (pptr()-pbase()),which); } else { return -1; } } // seek relative to end of file else if ( (way == ::std::ios_base::end) ) { off_t const curoff = doSeek(0, SEEK_CUR); off_t const endoff = doSeek(0, SEEK_END); off_t const curag = doSeek(curoff,SEEK_SET); if ( curag != curoff ) return -1; if ( endoff == static_cast<off_t>(-1) ) return -1; return seekpos(endoff+off,which); } else { return -1; } }
void checkWriteBuffer() { // if write buffer is not empty, then flush it if ( pptr() != pbase() ) { doSync(); // get write position assert ( static_cast<off_t>(writepos) == doSeek(0,SEEK_CUR) ); } }
/** * seek to absolute position **/ ::std::streampos seekpos(::std::streampos sp, ::std::ios_base::openmode /* which */) { // flush write buffer before seeking anywhere checkWriteBuffer(); // seek off_t const off = doSeek(sp,SEEK_SET); if ( off == static_cast<off_t>(-1) ) return -1; // empty get buffer setg(buffer.end(),buffer.end(),buffer.end()); // empty put buffer setp(buffer.begin(),buffer.end()-1); // set positions readpos = off; writepos = off; return off; }
void DirectShowPlayerService::run() { QMutexLocker locker(&m_mutex); for (;;) { ::ResetEvent(m_taskHandle); while (m_pendingTasks == 0) { DWORD result = 0; locker.unlock(); if (m_eventHandle) { HANDLE handles[] = { m_taskHandle, m_eventHandle }; result = ::WaitForMultipleObjects(2, handles, false, INFINITE); } else { result = ::WaitForSingleObject(m_taskHandle, INFINITE); } locker.relock(); if (result == WAIT_OBJECT_0 + 1) { graphEvent(&locker); } } if (m_pendingTasks & ReleaseGraph) { m_pendingTasks ^= ReleaseGraph; m_executingTask = ReleaseGraph; doReleaseGraph(&locker); } else if (m_pendingTasks & Shutdown) { return; } else if (m_pendingTasks & ReleaseAudioOutput) { m_pendingTasks ^= ReleaseAudioOutput; m_executingTask = ReleaseAudioOutput; doReleaseAudioOutput(&locker); } else if (m_pendingTasks & ReleaseVideoOutput) { m_pendingTasks ^= ReleaseVideoOutput; m_executingTask = ReleaseVideoOutput; doReleaseVideoOutput(&locker); } else if (m_pendingTasks & SetUrlSource) { m_pendingTasks ^= SetUrlSource; m_executingTask = SetUrlSource; doSetUrlSource(&locker); } else if (m_pendingTasks & SetStreamSource) { m_pendingTasks ^= SetStreamSource; m_executingTask = SetStreamSource; doSetStreamSource(&locker); } else if (m_pendingTasks & Render) { m_pendingTasks ^= Render; m_executingTask = Render; doRender(&locker); } else if (!(m_executedTasks & Render)) { m_pendingTasks &= ~(FinalizeLoad | SetRate | Stop | Pause | Seek | Play); } else if (m_pendingTasks & FinalizeLoad) { m_pendingTasks ^= FinalizeLoad; m_executingTask = FinalizeLoad; doFinalizeLoad(&locker); } else if (m_pendingTasks & Stop) { m_pendingTasks ^= Stop; m_executingTask = Stop; doStop(&locker); } else if (m_pendingTasks & SetRate) { m_pendingTasks ^= SetRate; m_executingTask = SetRate; doSetRate(&locker); } else if (m_pendingTasks & Pause) { m_pendingTasks ^= Pause; m_executingTask = Pause; doPause(&locker); } else if (m_pendingTasks & Seek) { m_pendingTasks ^= Seek; m_executingTask = Seek; doSeek(&locker); } else if (m_pendingTasks & Play) { m_pendingTasks ^= Play; m_executingTask = Play; doPlay(&locker); } m_executingTask = 0; } }