//----------------------------------------------------------------------------- // Name: CWaveFile::Read() // Desc: Reads section of data from a wave file into pBuffer and returns // how much read in pdwSizeRead, reading not more than dwSizeToRead. // This uses m_ck to determine where to start reading from. So // subsequent calls will be continue where the last left off unless // Reset() is called. //----------------------------------------------------------------------------- HRESULT CWaveFile::Read( BYTE* pBuffer, DWORD dwSizeToRead, DWORD* pdwSizeRead ) { if( m_bIsReadingFromMemory ) { if( m_pbDataCur == NULL ) return CO_E_NOTINITIALIZED; if( pdwSizeRead != NULL ) *pdwSizeRead = 0; if( ( BYTE* )( m_pbDataCur + dwSizeToRead ) > ( BYTE* )( m_pbData + m_ulDataSize ) ) { dwSizeToRead = m_ulDataSize - ( DWORD )( m_pbDataCur - m_pbData ); } #pragma warning( disable: 4616 ) // disable warning about warning number '22104' being out of range #pragma warning( disable: 22104 ) // disable PREfast warning during static code analysis CopyMemory( pBuffer, m_pbDataCur, dwSizeToRead ); #pragma warning( default: 22104 ) #pragma warning( default: 4616 ) if( pdwSizeRead != NULL ) *pdwSizeRead = dwSizeToRead; return S_OK; } else { MMIOINFO mmioinfoIn; // current status of m_hmmio if( m_hmmio == NULL ) return CO_E_NOTINITIALIZED; if( pBuffer == NULL || pdwSizeRead == NULL ) return E_INVALIDARG; *pdwSizeRead = 0; if( 0 != mmioGetInfo( m_hmmio, &mmioinfoIn, 0 ) ) return DXTRACE_ERR( L"mmioGetInfo", E_FAIL ); UINT cbDataIn = dwSizeToRead; if( cbDataIn > m_ck.cksize ) cbDataIn = m_ck.cksize; m_ck.cksize -= cbDataIn; for( DWORD cT = 0; cT < cbDataIn; cT++ ) { // Copy the bytes from the io to the buffer. if( mmioinfoIn.pchNext == mmioinfoIn.pchEndRead ) { if( 0 != mmioAdvance( m_hmmio, &mmioinfoIn, MMIO_READ ) ) return DXTRACE_ERR( L"mmioAdvance", E_FAIL ); if( mmioinfoIn.pchNext == mmioinfoIn.pchEndRead ) return DXTRACE_ERR( L"mmioinfoIn.pchNext", E_FAIL ); } // Actual copy. *( ( BYTE* )pBuffer + cT ) = *( ( BYTE* )mmioinfoIn.pchNext ); mmioinfoIn.pchNext++; } if( 0 != mmioSetInfo( m_hmmio, &mmioinfoIn, 0 ) ) return DXTRACE_ERR( L"mmioSetInfo", E_FAIL ); *pdwSizeRead = cbDataIn; return S_OK; } }
int WaveReadFile( HMMIO hmmioIn, // IN UINT cbRead, // IN BYTE *pbDest, // IN MMCKINFO *pckIn, // IN. UINT *cbActualRead // OUT. ) { MMIOINFO mmioinfoIn; // current status of <hmmioIn> int nError; UINT cT, cbDataIn; nError = 0; if (nError = mmioGetInfo(hmmioIn, &mmioinfoIn, 0) != 0) { goto ERROR_CANNOT_READ; } cbDataIn = cbRead; if (cbDataIn > pckIn->cksize) cbDataIn = pckIn->cksize; pckIn->cksize -= cbDataIn; for (cT = 0; cT < cbDataIn; cT++) { /* Copy the bytes from the io to the buffer. */ if (mmioinfoIn.pchNext == mmioinfoIn.pchEndRead) { if ((nError = mmioAdvance(hmmioIn, &mmioinfoIn, MMIO_READ)) != 0) { goto ERROR_CANNOT_READ; } if (mmioinfoIn.pchNext == mmioinfoIn.pchEndRead) { nError = ER_CORRUPTWAVEFILE; goto ERROR_CANNOT_READ; } } // Actual copy. // *((BYTE*)pbDest+cT) = *((BYTE*)mmioinfoIn.pchNext)++; } if ((nError = mmioSetInfo(hmmioIn, &mmioinfoIn, 0)) != 0) { goto ERROR_CANNOT_READ; } *cbActualRead = cbDataIn; goto FINISHED_READING; ERROR_CANNOT_READ: *cbActualRead = 0; FINISHED_READING: return(nError); }