Esempio n. 1
0
ULONGLONG CMultiFiles::Seek(LONGLONG lOff, UINT nFrom)
{
	LARGE_INTEGER	llNewPos;
	LARGE_INTEGER	llOff;

	if (m_strFiles.GetCount() == 1)
	{
		llOff.QuadPart = lOff;
		SetFilePointerEx (m_hFile, llOff, &llNewPos, nFrom);

		return llNewPos.QuadPart;
	}
	else
	{
		LONGLONG	lAbsolutePos = GetAbsolutePosition(lOff, nFrom);
		int			nNewPart	 = 0;
		ULONGLONG	llSum		 = 0;

		while (m_FilesSize[nNewPart]+llSum <= lAbsolutePos)
		{
			llSum += m_FilesSize[nNewPart];
			nNewPart++;
		}

		OpenPart (nNewPart);
		llOff.QuadPart = lAbsolutePos - llSum;
		SetFilePointerEx (m_hFile, llOff, &llNewPos, FILE_BEGIN);

		return llSum + llNewPos.QuadPart;
	}
}
Esempio n. 2
0
BOOL CMultiFiles::Open(LPCTSTR lpszFileName, UINT nOpenFlags)
{
	Reset();
	m_strFiles.Add (lpszFileName);

	return OpenPart(0);
}
Esempio n. 3
0
BOOL CMultiFiles::OpenFiles(CAtlList<CHdmvClipInfo::PlaylistItem>& files, UINT nOpenFlags)
{
	POSITION		pos = files.GetHeadPosition();
	LARGE_INTEGER	llSize;
	int				nPos  = 0;
	REFERENCE_TIME	rtDur = 0;

	Reset();
	while(pos)
	{
		CHdmvClipInfo::PlaylistItem& s = files.GetNext(pos);
		m_strFiles.Add(s.m_strFileName);
		if (!OpenPart(nPos)) return false;

		llSize.QuadPart = 0;
		GetFileSizeEx (m_hFile, &llSize);
		m_llTotalLength += llSize.QuadPart;
		m_FilesSize.Add (llSize.QuadPart);
		m_rtPtsOffsets.Add (rtDur);
		rtDur += s.Duration();
		nPos++;
	}

	if (files.GetCount() > 1) ClosePart();
	
	return TRUE;
}
Esempio n. 4
0
UINT CMultiFiles::Read(void* lpBuf, UINT nCount)
{
	DWORD		dwRead;
	do {
		if (!ReadFile(m_hFile, lpBuf, nCount, &dwRead, NULL)) {
			break;
		}

		if (dwRead != nCount && (m_nCurPart < 0 || (size_t)m_nCurPart < m_strFiles.GetCount()-1)) {
			OpenPart (m_nCurPart+1);
			lpBuf	 = (void*)((BYTE*)lpBuf + dwRead);
			nCount  -= dwRead;
		}
	} while (nCount != dwRead && (m_nCurPart < 0 || (size_t)m_nCurPart < m_strFiles.GetCount()-1));
	return dwRead;
}