HRESULT CAsyncIo::SyncRead( LONGLONG llPos, LONG lLength, BYTE* pBuffer) { if (IsAligned(llPos) && IsAligned(lLength) && IsAligned((LONG) pBuffer)) { LONG cbUnused; return SyncReadAligned(llPos, lLength, pBuffer, &cbUnused, NULL); } CAsyncRequest request; HRESULT hr = request.Request( this, m_pStream, llPos, lLength, FALSE, pBuffer, NULL, 0); if (FAILED(hr)) { return hr; } return request.Complete(); }
// perform a synchronous read request on this thread. // may not be aligned - so we will have to buffer. HRESULT CAsyncIo::SyncRead( LONGLONG llPos, LONG lLength, BYTE * pBuffer) { if(IsAligned(llPos) && IsAligned(lLength) && IsAligned((LONG_PTR) pBuffer)) { LONG cbUnused; return SyncReadAligned(llPos, lLength, pBuffer, &cbUnused, NULL); } // not aligned with requirements - use buffered file handle. //!!! might want to fix this to buffer the data ourselves? CAsyncRequest request; HRESULT hr = request.Request(this, m_pStream, llPos, lLength, FALSE, pBuffer, NULL, 0); if(FAILED(hr)) { return hr; } return request.Complete(); }
STDMETHODIMP QAsyncReader::WaitForNext(DWORD timeout, IMediaSample **sample, DWORD_PTR *user) { QMutexLocker locker(&m_mutexWait); if (!sample ||!user) { return E_POINTER; } *sample = 0; *user = 0; AsyncRequest r = getNextRequest(); if (r.sample == 0) { //there is no request in the queue if (isFlushing()) { return VFW_E_WRONG_STATE; } else { //First we need to lock the mutex if (m_requestWait.wait(&m_mutexWait, timeout) == false) { return VFW_E_TIMEOUT; } if (isFlushing()) { return VFW_E_WRONG_STATE; } r = getNextRequest(); } } //at this point we're sure to have a request to proceed if (r.sample == 0) { return E_FAIL; } *sample = r.sample; *user = r.user; return SyncReadAligned(r.sample); }