Files
Client/Library/dxx8/samples/Multimedia/DirectShow_WinXP/VMR/VMRMix/SourceInfo.cpp
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

294 lines
7.5 KiB
C++

//------------------------------------------------------------------------------
// 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; i<m_N; i++)
{
delete m_ppSI[i];
m_ppSI[i] = NULL;
}// for
delete[] m_ppSI;
m_ppSI = NULL;
m_N = 0;
}
//------------------------------------------------------------------------------
// CMediaList::Add
// Desc: adds a new source to the media list
// return: true if success, false otherwise
//------------------------------------------------------------------------------
bool CMediaList::Add( SourceInfo * pSI)
{
SourceInfo ** ppSInew = NULL;
ppSInew = new SourceInfo*[m_N+1];
if( !ppSInew )
return false;
for( int i=0; i<m_N; i++)
{
ppSInew[i] = m_ppSI[i];
}// for
ppSInew[m_N] = pSI;
delete[] m_ppSI;
m_ppSI = ppSInew;
m_N++;
return true;
}
//------------------------------------------------------------------------------
// CMediaList::Shuffle()
// Desc: randomly shuffles media list content to
// have different playback settings every time
//------------------------------------------------------------------------------
void CMediaList::Shuffle()
{
SourceInfo *pSIaux = NULL;
int n1;
int n2;
for(int i=0; i< m_N; i++)
{
n1 = rand() * (m_N+1) / RAND_MAX;
n2 = rand() * (m_N+1) / RAND_MAX;
n1 = ( n1<0) ? 0 : n1;
n2 = ( n2<0) ? 0 : n2;
n1 = ( n1>m_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; i<m_N; i++)
{
m_avgDuration = (this->GetItem(i)->m_llDuration > m_avgDuration) ?
this->GetItem(i)->m_llDuration :
m_avgDuration;
}// for
}