Example #1
0
//-----------------------------------------------------------------------------
// Name: CWaveFile::Open()
// Desc: Opens a wave file for reading
//-----------------------------------------------------------------------------
HRESULT CWaveFile::Open( LPSTR strFileName, WAVEFORMATEX* pwfx, DWORD dwFlags )
{
    HRESULT hr;

    m_dwFlags = dwFlags;
    m_bIsReadingFromMemory = FALSE;

    if( m_dwFlags == WAVEFILE_READ )
    {
        if( strFileName == NULL )
            return E_INVALIDARG;
        SAFE_DELETE_ARRAY( m_pwfx );

        m_hmmio = mmioOpen( strFileName, NULL, MMIO_ALLOCBUF | MMIO_READ );

        if( FAILED( hr = ReadMMIO() ) )
        {
            // ReadMMIO will fail if its an not a wave file
            mmioClose( m_hmmio, 0 );
            return WAVEFILE_ERROR( L"ReadMMIO", hr );
        }

        if( FAILED( hr = ResetFile() ) )
            return WAVEFILE_ERROR( L"ResetFile", hr );

        // After the reset, the size of the wav file is m_ck.cksize so store it now
        m_dwSize = m_ck.cksize;
    }
    else
    {
        m_hmmio = mmioOpen( strFileName, NULL, MMIO_ALLOCBUF  |
                                                  MMIO_READWRITE |
                                                  MMIO_CREATE );
        if( NULL == m_hmmio )
            return WAVEFILE_ERROR( L"mmioOpen", E_FAIL );

        if( FAILED( hr = WriteMMIO( pwfx ) ) )
        {
            mmioClose( m_hmmio, 0 );
            return WAVEFILE_ERROR( L"WriteMMIO", hr );
        }

        if( FAILED( hr = ResetFile() ) )
            return WAVEFILE_ERROR( L"ResetFile", hr );
    }

    return hr;
}
Example #2
0
HRESULT WaveDecoder::Seek(float duration ,DWORD *newPosition) 
{
	*newPosition = 0;
	if(duration < 0 || duration >= m_id3.duration_times)
	{
		return M_DURATION_OUT_OF_RANGE;//E_FAIL;
	}

	if(0 == duration)
	{
		*newPosition = 0;
		return ResetFile();
	}
	else
	{
		DWORD seekSize = (DWORD)(duration * m_pwfx->nAvgBytesPerSec);

		if(seekSize > m_dwSize)
		{
			return E_FAIL;
		}
		*newPosition = seekSize;
		if( -1 == mmioSeek( m_hmmio, m_ckRiff.dwDataOffset + sizeof( FOURCC ) + seekSize,
                    SEEK_SET ) )
            return E_FAIL;

        // Search the input file for the 'data' chunk.
        //m_ck.ckid = mmioFOURCC( 'd', 'a', 't', 'a' );
        //if( 0 != mmioDescend( m_hmmio, &m_ck, &m_ckRiff, MMIO_FINDCHUNK ) )
        //    return E_FAIL;
	}
	
	return S_OK;
}
Example #3
0
void CTextView::InitVars(void)
{
	m_hwnd = NULL;
	m_pfnOldTextViewWndProc = NULL;
	m_lOldStyle = 0;
	m_nWheelLines = g_dwDefaultNumWheels;
	ResetFile();
}
Example #4
0
void CFileStream::Close(void)
{
	if (m_hFile != INVALID_HANDLE_VALUE)
	{
		FlushBuffer();
		CloseHandle(m_hFile);
		ResetFile(GetLastError());
	}
}
Example #5
0
void CRunLog::WriteRunLog(const char *shm,...)
{
    char buffer[MAX_LINE_SIZE];
    va_list sp;

    AddHead(buffer);

    va_start(sp,shm);
    vsnprintf(buffer+strlen(buffer),MAX_LINE_SIZE - strlen(buffer),shm,sp);
    va_end(sp);

    strcat(buffer,"\n");
    buffer[MAX_LINE_SIZE - 2] = '\n';

    if (GetFileSize(this->LogFile) > this->FileSize) ResetFile();
    if (NULL == fp) OpenFile();
    WriteContent(buffer);
}
Example #6
0
HRESULT ApeDecoder::Seek(float duration ,DWORD *newPosition ) 
{
	*newPosition = 0;
	if(duration < 0 || duration >= m_id3.duration_times)
	{
		return M_DURATION_OUT_OF_RANGE;//E_FAIL;
	}

	if(0 == duration)
	{
		*newPosition = 0;
		return ResetFile();
	}
	else
	{
		
		DWORD seekSize = (DWORD)(duration * m_pwfx->nAvgBytesPerSec);

		if(seekSize > m_dwSize)
		{
			return E_FAIL;
		}
		m_nWaveDataNum = 0;
		*newPosition = seekSize;
		unsigned int mcBlock = seekSize / m_block_algin; 
		if(mcBlock > m_total_blocks)
		{
			return E_FAIL;
		}
		int num = m_pAPEDecompress->Seek(mcBlock);
		m_current_blocks = mcBlock;
		//return (0 == num);
		
	}
	return S_OK;;
}
Example #7
0
//-----------------------------------------------------------------------------
// Name: CWaveFile::Open()
// Desc: Opens a wave file for reading
//-----------------------------------------------------------------------------
HRESULT CWaveFile::Open( LPTSTR strFileName, WAVEFORMATEX* pwfx, DWORD dwFlags )
{
    HRESULT hr;

    m_dwFlags = dwFlags;
    m_bIsReadingFromMemory = FALSE;

    if( m_dwFlags == WAVEFILE_READ )
    {
        if( strFileName == NULL )
            return E_INVALIDARG;
        SAFE_DELETE_ARRAY( m_pwfx );

        m_hmmio = mmioOpen( strFileName, NULL, MMIO_ALLOCBUF | MMIO_READ );

        if( NULL == m_hmmio )
        {
            HRSRC   hResInfo;
            HGLOBAL hResData;
            DWORD   dwSize;
            VOID*   pvRes;

            // Loading it as a file failed, so try it as a resource
            if( NULL == ( hResInfo = FindResource( NULL, strFileName, TEXT("WAVE") ) ) )
            {
                if( NULL == ( hResInfo = FindResource( NULL, strFileName, TEXT("WAV") ) ) )
                    return DXTRACE_ERR( TEXT("FindResource"), E_FAIL );
            }

            if( NULL == ( hResData = LoadResource( NULL, hResInfo ) ) )
                return DXTRACE_ERR( TEXT("LoadResource"), E_FAIL );

            if( 0 == ( dwSize = SizeofResource( NULL, hResInfo ) ) ) 
                return DXTRACE_ERR( TEXT("SizeofResource"), E_FAIL );

            if( NULL == ( pvRes = LockResource( hResData ) ) )
                return DXTRACE_ERR( TEXT("LockResource"), E_FAIL );

            m_pResourceBuffer = new CHAR[ dwSize ];
            memcpy( m_pResourceBuffer, pvRes, dwSize );

            MMIOINFO mmioInfo;
            ZeroMemory( &mmioInfo, sizeof(mmioInfo) );
            mmioInfo.fccIOProc = FOURCC_MEM;
            mmioInfo.cchBuffer = dwSize;
            mmioInfo.pchBuffer = (CHAR*) m_pResourceBuffer;

            m_hmmio = mmioOpen( NULL, &mmioInfo, MMIO_ALLOCBUF | MMIO_READ );
        }

        if( FAILED( hr = ReadMMIO() ) )
        {
            // ReadMMIO will fail if its an not a wave file
            mmioClose( m_hmmio, 0 );
            return DXTRACE_ERR( TEXT("ReadMMIO"), hr );
        }

        if( FAILED( hr = ResetFile() ) )
            return DXTRACE_ERR( TEXT("ResetFile"), hr );

        // After the reset, the size of the wav file is m_ck.cksize so store it now
        m_dwSize = m_ck.cksize;
    }
    else
    {
        m_hmmio = mmioOpen( strFileName, NULL, MMIO_ALLOCBUF  | 
                                                  MMIO_READWRITE | 
                                                  MMIO_CREATE );
        if( NULL == m_hmmio )
            return DXTRACE_ERR( TEXT("mmioOpen"), E_FAIL );

        if( FAILED( hr = WriteMMIO( pwfx ) ) )
        {
            mmioClose( m_hmmio, 0 );
            return DXTRACE_ERR( TEXT("WriteMMIO"), hr );
        }
                        
        if( FAILED( hr = ResetFile() ) )
            return DXTRACE_ERR( TEXT("ResetFile"), hr );
    }

    return hr;
}
Example #8
0
void CTextView::LoadCache(void)
{
	_ASSERTE(m_hFile != INVALID_HANDLE_VALUE);
	m_dwFirstCachedLine = m_dwNumCachedLines = 0;
	m_nMaxLineWidth = 0;
	DWORD dwNumLines = m_arrLines.GetCount();
	if (dwNumLines > 0)
	{
		HDC hdc = GetDC(m_hwnd);
		HFONT hOldFont = g_pResManager->m_hFixedFont ? SelectFont(hdc, g_pResManager->m_hFixedFont) : NULL;
		TEXTMETRIC tmetr;
		::GetTextMetrics(hdc, &tmetr);
		int nExtraWidth = tmetr.tmAveCharWidth + LOWORD(GetTabbedTextExtent(hdc, g_szEllipsis, g_dwEllipsisLength, 0, NULL));

		if (m_pTextCache == NULL)
		{
			_ASSERTE(MAX_NUMBER_OF_SYMBOLS <= TEXT_CACHE_SIZE);
			m_pTextCache = new TCHAR[TEXT_CACHE_SIZE];
			if (m_pTextCache == NULL)
			{
				ResetFile();
				goto end;
			}
		}
		const CLineInfo& rLineInfo = m_arrLines[0];
		SetFilePointer(m_hFile, rLineInfo.m_dwLineStart, NULL, FILE_BEGIN);
		DWORD dwLineBufferPos = 0, dwTextCachePos = 0;
		for (;;)
		{
			DWORD dwNumRead = 0;
			if (! ReadFile(m_hFile, m_pLineBuffer + dwLineBufferPos, m_dwLineBufferSize - dwLineBufferPos, &dwNumRead, NULL))
				goto end;
			dwNumRead += dwLineBufferPos;
			dwLineBufferPos = 0;
			if (dwNumRead == 0)
				break;
			for (;;)
			{
				DWORD dwBytesLeft = dwNumRead - dwLineBufferPos;
				if (dwBytesLeft == 0)
				{
					dwLineBufferPos = 0;
					break;
				}
				CLineInfo& rLineInfo = m_arrLines[(int)m_dwNumCachedLines];
				if (dwTextCachePos + rLineInfo.m_dwLength > TEXT_CACHE_SIZE)
					goto end;
				DWORD dwLineSize;
				if (m_dwNumCachedLines + 1 < dwNumLines)
				{
					const CLineInfo& rNextLineInfo = m_arrLines[(int)(m_dwNumCachedLines + 1)];
					dwLineSize = rNextLineInfo.m_dwLineStart - rLineInfo.m_dwLineStart; // line size includes line end
				}
				else
					dwLineSize = rLineInfo.m_dwSize;
				if (dwLineSize > dwBytesLeft)
				{
					MoveMemory(m_pLineBuffer, m_pLineBuffer + dwLineBufferPos, dwBytesLeft);
					dwLineBufferPos = dwBytesLeft;
					break;
				}
				m_pDecoder->DecodeString(m_pLineBuffer + dwLineBufferPos, rLineInfo.m_dwSize, m_pTextCache + dwTextCachePos, rLineInfo.m_dwLength);
				int nLineWidth = LOWORD(GetTabbedTextExtent(hdc, m_pTextCache + dwTextCachePos, rLineInfo.m_dwLength, 0, NULL));
				if (m_nMaxLineWidth < nLineWidth)
					m_nMaxLineWidth = nLineWidth;

				rLineInfo.m_dwTextStart = dwTextCachePos;
				dwTextCachePos += rLineInfo.m_dwLength;
				dwLineBufferPos += dwLineSize;
				++m_dwNumCachedLines;
			}
		}
end:
		m_nMaxLineWidth += nExtraWidth;
		ResizeTextView(TRUE);
		if (hOldFont)
			SelectFont(hdc, hOldFont);
		ReleaseDC(m_hwnd, hdc);
	}
}
Example #9
0
void CTextView::CountLines(void)
{
	_ASSERTE(m_hFile != INVALID_HANDLE_VALUE);
	m_arrLines.DeleteAll(false);

	DWORD dwFileSize = GetFileSize(m_hFile, NULL);
	DWORD dwFilePos = SetFilePointer(m_hFile, 0, NULL, FILE_CURRENT);
	dwFileSize -= dwFilePos;
	DWORD dwBufferSize = min(dwFileSize, g_dwMaxBufferSize);
	PBYTE pFileBuffer = new BYTE[dwBufferSize];
	if (pFileBuffer == NULL)
		return;

	m_arrLines.EnsureSize(dwFileSize / APROX_NUMBER_OF_SYMBOLS, false); // approximate number of lines
	DWORD dwBufferPos = 0, dwNumSymbols = 0, dwNumChars = 0, dwLineStartPos = dwFilePos, dwLineEndPos = dwFilePos;
	TCHAR chPrevLineEnd = _T('\0');
	m_dwLineBufferSize = 0;

	for (;;)
	{
		DWORD dwNumRead = 0, dwFreeSize = dwBufferSize - dwBufferPos;
		if (! ReadFile(m_hFile, pFileBuffer + dwBufferPos, dwFreeSize, &dwNumRead, NULL))
			break;
		BOOL bEndOfFile = dwNumRead < dwFreeSize;
		dwNumRead += dwBufferPos;
		dwBufferPos = 0;
		if (dwNumRead == 0)
			break;
		for (;;)
		{
			DWORD dwBytesLeft = dwNumRead - dwBufferPos;
			// one character in UTF-16 encoding may require up to 4 bytes
			// one character in UTF-8 encoding may require up to 4 bytes
			// one character in ANSI encoding may require up to 2 bytes
			// make sure at least one character can be read from the buffer
			// (i.e. at least 4 bytes should be available)
			if (dwBytesLeft < 4 && ! bEndOfFile)
			{
				MoveMemory(pFileBuffer, pFileBuffer + dwBufferPos, dwBytesLeft);
				dwBufferPos = dwBytesLeft;
				break;
			}
			BOOL bGotoNewLine, bSkipLineEnd, bLineEndChar;
			if (dwBytesLeft > 0)
			{
				TCHAR arrChar[2];
				int nNumBytesInChar, nCharSize;
				nNumBytesInChar = m_pDecoder->DecodeChar(pFileBuffer + dwBufferPos, dwBytesLeft, arrChar, nCharSize);
				if (nCharSize <= 0)
				{
					++dwBufferPos;
					++dwFilePos;
					++dwLineEndPos;
					continue;
				}
				else
				{
					dwBufferPos += nNumBytesInChar;
					dwFilePos += nNumBytesInChar;
				}
				if (nCharSize == 1 && (arrChar[0] == _T('\r') || arrChar[0] == _T('\n')))
				{
					bGotoNewLine = bLineEndChar = TRUE;
					if (chPrevLineEnd != _T('\0') && chPrevLineEnd != arrChar[0])
					{
						chPrevLineEnd = _T('\0');
						bSkipLineEnd = TRUE;
					}
					else
					{
						chPrevLineEnd = arrChar[0];
						bSkipLineEnd = FALSE;
					}
				}
				else
				{
					++dwNumSymbols;
					dwNumChars += nCharSize;
					bGotoNewLine = dwNumSymbols == MAX_NUMBER_OF_SYMBOLS;
					chPrevLineEnd = _T('\0');
					bSkipLineEnd = bLineEndChar = FALSE;
					dwLineEndPos = dwFilePos;
				}
			}
			else
			{
				bGotoNewLine = TRUE;
				bSkipLineEnd = FALSE;
				bLineEndChar = TRUE;
			}
			if (bGotoNewLine)
			{
				if (! bSkipLineEnd)
				{
					CLineInfo LineInfo;
					LineInfo.m_dwLineStart = dwLineStartPos;
					LineInfo.m_dwLength = dwNumChars;
					LineInfo.m_dwSize = dwLineEndPos - dwLineStartPos;
					LineInfo.m_bTruncated = ! bLineEndChar;
					m_arrLines.AddItem(LineInfo);
					if (m_dwLineBufferSize < LineInfo.m_dwSize)
						m_dwLineBufferSize = LineInfo.m_dwSize;
					if (dwBytesLeft == 0)
						goto end;
				}
				dwLineStartPos = dwLineEndPos = dwFilePos;
				dwNumSymbols = 0;
				dwNumChars = 0;
			}
		}
	}
end:
	delete[] pFileBuffer;
	// reserve space for two line end characters in order to retrieve contiguous lines using ReadFile() sequentially
	// (for Unicode encoding this requires 4 bytes)
	m_dwLineBufferSize += 4;
	// add some extra space to the buffer to let several lines to be loaded
	if (m_dwLineBufferSize < LINE_BUFFER_SIZE)
		m_dwLineBufferSize = LINE_BUFFER_SIZE;
	m_pLineBuffer = new BYTE[m_dwLineBufferSize];
	if (m_pLineBuffer == NULL)
		ResetFile();
}
Example #10
0
HRESULT WaveDecoder::Open( LPWSTR strFileName, WAVEFORMATEX* pwfx, DWORD dwFlags )
{
	m_id3.EmptyTags();
	/*char ex[2048] = "wav";
	if(!isFile_ex(strFileName,ex))
	{
		return E_FAIL;
	}*/
	HRESULT hr;
	if(WAVEFILE_READ != dwFlags)
	{
		return M_INVALID_PARAMETERS;//E_FAIL;
	}

    m_dwFlags = dwFlags;
    //m_bIsReadingFromMemory = FALSE;
	SAFE_DELETE_ARRAY( m_pwfx );
	m_pwfx = NULL;
    if( m_dwFlags == WAVEFILE_READ )
    {
        if( strFileName == NULL )
            return E_INVALIDARG;
        
        m_hmmio = mmioOpen( strFileName, NULL, MMIO_ALLOCBUF | MMIO_READ );

        if( NULL == m_hmmio )
        {
            HRSRC hResInfo;
            HGLOBAL hResData;
            DWORD dwSize;
            VOID* pvRes;

            // Loading it as a file failed, so try it as a resource
            if( NULL == ( hResInfo = FindResource( NULL, strFileName, L"WAVE" ) ) )
            {
                if( NULL == ( hResInfo = FindResource( NULL, strFileName, L"WAV" ) ) )
                    //return DXTRACE_ERR( L"FindResource", E_FAIL );
					return E_FAIL;
            }

            if( NULL == ( hResData = LoadResource( GetModuleHandle( NULL ), hResInfo ) ) )
                //return DXTRACE_ERR( L"LoadResource", E_FAIL );
				return E_FAIL;

            if( 0 == ( dwSize = SizeofResource( GetModuleHandle( NULL ), hResInfo ) ) )
                //return DXTRACE_ERR( L"SizeofResource", E_FAIL );
				return E_FAIL;

            if( NULL == ( pvRes = LockResource( hResData ) ) )
                //return DXTRACE_ERR( L"LockResource", E_FAIL );
				return E_FAIL;

            m_pResourceBuffer = new CHAR[ dwSize ];
            if( m_pResourceBuffer == NULL )
                //return DXTRACE_ERR( L"new", E_OUTOFMEMORY );
				return  E_OUTOFMEMORY;
            memcpy( m_pResourceBuffer, pvRes, dwSize );

            MMIOINFO mmioInfo;
            ZeroMemory( &mmioInfo, sizeof( mmioInfo ) );
            mmioInfo.fccIOProc = FOURCC_MEM;
            mmioInfo.cchBuffer = dwSize;
            mmioInfo.pchBuffer = ( CHAR* )m_pResourceBuffer;

            m_hmmio = mmioOpen( NULL, &mmioInfo, MMIO_ALLOCBUF | MMIO_READ );
        }

        if( FAILED( hr = ReadMMIO() ) )
        {
            // ReadMMIO will fail if its an not a wave file
            mmioClose( m_hmmio, 0 );
           // return DXTRACE_ERR( L"ReadMMIO", hr );
			return hr;
        }

        if( FAILED( hr = ResetFile() ) )
            //return DXTRACE_ERR( L"ResetFile", hr );
			return hr;

        // After the reset, the size of the wav file is m_ck.cksize so store it now
        m_dwSize = m_ck.cksize;
		m_id3.duration_times = (float)m_dwSize / (float) m_pwfx->nAvgBytesPerSec;
		m_id3.bitrate = m_pwfx->nChannels * m_pwfx->nSamplesPerSec * m_pwfx->wBitsPerSample;
    }
    else
    {
        m_hmmio = mmioOpen( strFileName, NULL, MMIO_ALLOCBUF |
                            MMIO_READWRITE |
                            MMIO_CREATE );
        if( NULL == m_hmmio )
            //return DXTRACE_ERR( L"mmioOpen", E_FAIL );
			return E_FAIL;

        if( FAILED( hr = WriteMMIO( pwfx ) ) )
        {
            mmioClose( m_hmmio, 0 );
            //return DXTRACE_ERR( L"WriteMMIO", hr );
			return hr;
        }

        if( FAILED( hr = ResetFile() ) )
            //return DXTRACE_ERR( L"ResetFile", hr );
			return hr;
    }

    return hr;
}
//-----------------------------------------------------------------------------
// Name: idWaveFile::Open()
// Desc: Opens a wave file for reading
//-----------------------------------------------------------------------------
int idWaveFile::Open(const char *strFileName, waveformatex_t *pwfx)
{

	mbIsReadingFromMemory = false;

	mpbData     = NULL;
	mpbDataCur  = mpbData;

	if (strFileName == NULL) {
		return -1;
	}

	idStr name = strFileName;

	// note: used to only check for .wav when making a build
	name.SetFileExtension(".ogg");

	if (fileSystem->ReadFile(name, NULL, NULL) != -1) {
		return OpenOGG(name, pwfx);
	}

	memset(&mpwfx, 0, sizeof(waveformatextensible_t));

	mhmmio = fileSystem->OpenFileRead(strFileName);

	if (!mhmmio) {
		mdwSize = 0;
		return -1;
	}

	if (mhmmio->Length() <= 0) {
		mhmmio = NULL;
		return -1;
	}

	if (ReadMMIO() != 0) {
		// ReadMMIO will fail if its an not a wave file
		Close();
		return -1;
	}

	mfileTime = mhmmio->Timestamp();

	if (ResetFile() != 0) {
		Close();
		return -1;
	}

	// After the reset, the size of the wav file is mck.cksize so store it now
	mdwSize = mck.cksize / sizeof(short);
	mMemSize = mck.cksize;

	if (mck.cksize != 0xffffffff) {
		if (pwfx) {
			memcpy(pwfx, (waveformatex_t *)&mpwfx, sizeof(waveformatex_t));
		}

		return 0;
	}

	return -1;
}