//------------------------------------------------------------------------------ // File: SourceInfo.cpp // // Desc: DirectShow sample code // Implementation of CMediaList, play-list of media files // // Copyright (c) 2000-2001 Microsoft Corporation. All rights reserved. //------------------------------------------------------------------------------ #include "stdafx.h" #include "SourceInfo.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CMediaList::CMediaList() : m_avgDuration(0L), m_N(0), m_ppSI(NULL) { } CMediaList::~CMediaList() { Clean(); } //------------------------------------------------------------------------------ void CMediaList::Clean() { for( int i=0; im_N-1) ? m_N-1 : n1; n2 = ( n2>m_N-1) ? m_N-1 : n2; if( n1 == n2 ) continue; pSIaux = m_ppSI[n1]; m_ppSI[n1] = m_ppSI[n2]; m_ppSI[n2] = pSIaux; } } //------------------------------------------------------------------------------ // Name: SetInitialParameters // Purpose: calculates initial demonstration parameters for each media file -- // destination rectangles and alpha levels // Note that these values are used as parameters in CDemonstration and // that changing them can cause different appearence of the demonstration //------------------------------------------------------------------------------ void CMediaList::SetInitialParameters() { NORMALIZEDRECT rectD; double Alpha; int i; // set alpha levels and destination rectangles here for( i=0; i< m_N; i++) { Alpha = 0.3 + 0.68 * (double)rand() / RAND_MAX; // random in [0.3; 0.98] rectD.left = rectD.top = 0.1f; rectD.right = rectD.bottom = 0.9f; this->GetItem(i)->m_fAlpha = Alpha; this->GetItem(i)->m_rD = rectD; }// for } //------------------------------------------------------------------------------ // Name: Initialize // Purpose: go through m_szMediaFolder and retrieve all media files into // Parameters: none // Return: true if folder contains at least one valid file; // false otherewise //------------------------------------------------------------------------------ bool CMediaList::Initialize(char *szFolder) { struct _finddata_t fileinfo; long filehandle = -1L; int nRes; int nCounter = 0; // to prevent loading huge number of files, // let's restrict it to 50 char szMask[MAX_PATH]; char szExt[] = "*.AVI;*.MOV;*.MPG;*.MPEG;*.VOB;*.QT;"; char szCurExt[MAX_PATH]; char szFilePath[MAX_PATH]; char *psz = NULL; // clean the list Clean(); if( !_strcmpi(szFolder,"")) return false; do { strcpy(szCurExt,szExt); psz = strstr(szCurExt,";"); if( psz) { *psz = 0; psz = NULL; psz = strstr( szExt, ";"); if( psz ) { strcpy( szExt, psz+1); } } else { strcpy( szExt, ""); } sprintf(szMask, "%s%s", szFolder, szCurExt); filehandle = _findfirst(szMask, &fileinfo); if( filehandle == -1L) continue; SourceInfo * pSI = NULL; pSI = new SourceInfo; if( !pSI ) { return false; } sprintf( szFilePath, "%s%s", szFolder, fileinfo.name); strcpy( pSI->m_szPath, (const char*)szFilePath); MultiByteToWideChar(CP_ACP, 0, (const char*)szFilePath, -1, pSI->m_wszPath, _MAX_PATH); Add( pSI ); nCounter++; nRes = _findnext(filehandle, &fileinfo); while( -1L != nRes ) { pSI = NULL; pSI = new SourceInfo; if( !pSI ) { return false; } sprintf( szFilePath, "%s%s", szFolder,fileinfo.name); strcpy( pSI->m_szPath, (const char*)szFilePath); MultiByteToWideChar(CP_ACP, 0, (const char*)szFilePath, -1, pSI->m_wszPath, _MAX_PATH); Add( pSI ); nCounter++; nRes = _findnext(filehandle, &fileinfo); }// while } while( _strcmpi(szExt, "") && nCounter < 50 ); if( 0 == Size() ) { return false; } else { return true; } } //------------------------------------------------------------------------------ // Name: Clone // Purpose: copies elements (nStart; nStart+n) to the list pML // Parameters: n - number of elements // pML - cloned media list // nStart - start position in (this) list; default: 0 // Return: true if success; // false otherewise //------------------------------------------------------------------------------ bool CMediaList::Clone(int n, CMediaList *pML, int nStart /* = 0 */) { bool bRes = true; if( n < 1 || nStart < 0 || nStart + n > m_N) return false; pML->Clean(); for(int i = nStart; i< nStart + n; i++) { SourceInfo *pSI = NULL; pSI = new SourceInfo; if( !pSI ) goto cleanup; bRes = bRes && GetItem(i)->CopyTo( pSI); if( false == bRes) { delete pSI; goto cleanup; } pSI->m_bInUse = false; bRes = bRes && pML->Add(pSI); if( false == bRes) goto cleanup; }// for return true; cleanup: pML->Clean(); return false; } //------------------------------------------------------------------------------ // Name: AdjustDuration // Purpose: calculates demonstration time. Here, it is duration of the longest file // Change this function to set a fixed time, average time etc. //------------------------------------------------------------------------------ void CMediaList::AdjustDuration() { m_avgDuration = 0L; if( 0 == m_N ) { return; } for( int i=0; iGetItem(i)->m_llDuration > m_avgDuration) ? this->GetItem(i)->m_llDuration : m_avgDuration; }// for }