void MFStream::doRead() { bool readDone = true; IUnknown *pUnk = NULL; HRESULT hr = m_currentReadResult->GetObject(&pUnk); if (SUCCEEDED(hr)) { //do actual read AsyncReadState *state = static_cast<AsyncReadState*>(pUnk); ULONG cbRead; Read(state->pb(), state->cb() - state->bytesRead(), &cbRead); pUnk->Release(); state->setBytesRead(cbRead + state->bytesRead()); if (state->cb() > state->bytesRead() && !m_stream->atEnd()) { readDone = false; } } if (readDone) { //now inform the original caller m_currentReadResult->SetStatus(hr); MFInvokeCallback(m_currentReadResult); } }
STDMETHODIMP MFStream::EndRead(IMFAsyncResult* pResult, ULONG *pcbRead) { if (!pcbRead) return E_INVALIDARG; IUnknown *pUnk; pResult->GetObject(&pUnk); AsyncReadState *state = static_cast<AsyncReadState*>(pUnk); *pcbRead = state->bytesRead(); pUnk->Release(); m_currentReadResult->Release(); m_currentReadResult = NULL; return S_OK; }