251 lines
6.2 KiB
C++
251 lines
6.2 KiB
C++
/* Copyright (c) Microsoft Corporation.
|
|
Licensed under the MIT License. */
|
|
|
|
/***************************************************************************
|
|
|
|
tatr.cpp: Theater class
|
|
|
|
Primary Author: ******
|
|
Review Status: REVIEWED - any changes to this file must be reviewed!
|
|
|
|
A TATR (theater) is similar to a STDIO, but has no UI and is used for
|
|
playback only.
|
|
|
|
***************************************************************************/
|
|
#include "studio.h"
|
|
ASSERTNAME
|
|
|
|
RTCLASS(TATR)
|
|
|
|
const long kcmhlTheater = 0x10000;
|
|
|
|
BEGIN_CMD_MAP(TATR, CMH)
|
|
ON_CID_GEN(cidTheaterLoad, FCmdLoad, pvNil)
|
|
ON_CID_GEN(cidTheaterPlay, FCmdPlay, pvNil)
|
|
ON_CID_GEN(cidTheaterStop, FCmdStop, pvNil)
|
|
ON_CID_GEN(cidTheaterRewind, FCmdRewind, pvNil)
|
|
END_CMD_MAP_NIL()
|
|
|
|
|
|
/***************************************************************************
|
|
Create a new TATR
|
|
***************************************************************************/
|
|
PTATR TATR::PtatrNew(long kidParent)
|
|
{
|
|
PTATR ptatr;
|
|
|
|
ptatr = NewObj TATR(HidUnique());
|
|
if (pvNil == ptatr)
|
|
return pvNil;
|
|
if (!ptatr->_FInit(kidParent))
|
|
{
|
|
ReleasePpo(&ptatr);
|
|
return pvNil;
|
|
}
|
|
AssertPo(ptatr, 0);
|
|
return ptatr;
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
Initialize the TATR
|
|
***************************************************************************/
|
|
bool TATR::_FInit(long kidParent)
|
|
{
|
|
AssertBaseThis(0);
|
|
|
|
_kidParent = kidParent;
|
|
|
|
if (!vpcex->FAddCmh(this, kcmhlTheater))
|
|
return fFalse;
|
|
|
|
return fTrue;
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
Clean up and delete this theater
|
|
***************************************************************************/
|
|
TATR::~TATR(void)
|
|
{
|
|
AssertBaseThis(0);
|
|
ReleasePpo(&_pmvie);
|
|
#ifdef BUG1907
|
|
vptagm->ClearCache(sidNil, ftagmFile); // Clear content out of HD cache
|
|
// Note: could clear out the RAM cache too, but I'm keeping this change
|
|
// as small as possible.
|
|
#endif //BUG1907
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
Load a new movie into the theater
|
|
***************************************************************************/
|
|
bool TATR::FCmdLoad(PCMD pcmd)
|
|
{
|
|
AssertThis(0);
|
|
AssertVarMem(pcmd);
|
|
|
|
PMCC pmcc;
|
|
FNI fni;
|
|
PMVIE pmvie = pvNil;
|
|
PGOB pgob;
|
|
GCB gcb;
|
|
|
|
pmcc = NewObj MCC(kdxpWorkspace, kdypWorkspace, kcbStudioCache);
|
|
if (pvNil == pmcc)
|
|
goto LFail;
|
|
|
|
vpapp->GetPortfolioDoc(&fni);
|
|
if (fni.Ftg() != kftg3mm)
|
|
{
|
|
Bug("Portfolio's FNI has bad FTG in theater");
|
|
goto LFail;
|
|
}
|
|
|
|
vpappb->BeginLongOp();
|
|
#ifdef BUG1907
|
|
// Close up the previous movie, if any
|
|
if (_pmvie != pvNil)
|
|
{
|
|
if (!_pmvie->PmvuCur()->FCloseDoc(fFalse))
|
|
goto LFail;
|
|
ReleasePpo(&_pmvie);
|
|
}
|
|
vptagm->ClearCache(sidNil, ftagmFile); // Clear content out of HD cache
|
|
// Note: could clear out the RAM cache too, but I'm keeping this change
|
|
// as small as possible.
|
|
#endif //BUG1907
|
|
pmvie = MVIE::PmvieNew(vpapp->FSlowCPU(), pmcc, &fni, cnoNil);
|
|
if (pmvie == pvNil)
|
|
goto LFail;
|
|
ReleasePpo(&pmcc);
|
|
|
|
// Create a new MVU (with PddgNew()) as a child GOB of _kidParent.
|
|
// Make it invisible until we get a play command
|
|
pgob = vpapp->Pkwa()->PgobFromHid(_kidParent);
|
|
if (pvNil == pgob)
|
|
{
|
|
Bug("Couldn't find gob for TATR's kidParent");
|
|
goto LFail;
|
|
}
|
|
gcb.Set(HidUnique(), pgob);
|
|
if (pmvie->PddgNew(&gcb) == pvNil)
|
|
goto LFail;
|
|
|
|
if (pmvie->Cscen() > 0)
|
|
{
|
|
if (!pmvie->FSwitchScen(0))
|
|
goto LFail;
|
|
}
|
|
|
|
#ifndef BUG1907
|
|
// Close up the previous movie, if any
|
|
if (_pmvie != pvNil)
|
|
{
|
|
if (!_pmvie->PmvuCur()->FCloseDoc(fFalse))
|
|
goto LFail;
|
|
ReleasePpo(&_pmvie);
|
|
}
|
|
#endif //!BUG1907
|
|
_pmvie = pmvie;
|
|
|
|
vpcex->EnqueueCid(cidTheaterLoadCompleted, pvNil, pvNil, fTrue);
|
|
return fTrue;
|
|
LFail:
|
|
ReleasePpo(&pmcc);
|
|
ReleasePpo(&pmvie);
|
|
vpcex->EnqueueCid(cidTheaterLoadCompleted, pvNil, pvNil, fFalse);
|
|
return fTrue;
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
Play the current movie. Also makes the MVU visible, if it was hidden.
|
|
***************************************************************************/
|
|
bool TATR::FCmdPlay(PCMD pcmd)
|
|
{
|
|
AssertThis(ftatrMvie); // make sure we have a movie
|
|
AssertVarMem(pcmd);
|
|
|
|
PMVU pmvu;
|
|
RC rcAbs;
|
|
RC rcRel;
|
|
|
|
if (pvNil == _pmvie) // Prevent crash if _pmvie is pvNil (although it
|
|
return fTrue; // shouldn't ever be if this function is called)
|
|
|
|
pmvu = _pmvie->PmvuCur();
|
|
pmvu->GetPos(&rcAbs, &rcRel);
|
|
rcRel.Set(0, 0, krelOne, krelOne);
|
|
pmvu->SetPos(&rcAbs, &rcRel);
|
|
|
|
if (!_pmvie->FPlaying())
|
|
_pmvie->Play();
|
|
|
|
return fTrue;
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
Stop the current movie
|
|
***************************************************************************/
|
|
bool TATR::FCmdStop(PCMD pcmd)
|
|
{
|
|
AssertThis(ftatrMvie); // make sure we have a movie
|
|
AssertVarMem(pcmd);
|
|
|
|
if (pvNil == _pmvie) // Prevent crash if _pmvie is pvNil (although it
|
|
return fTrue; // shouldn't ever be if this function is called)
|
|
|
|
if (_pmvie->FPlaying())
|
|
_pmvie->Play(); // Play() stops the movie if it's currently playing
|
|
|
|
return fTrue;
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
Rewind the current movie
|
|
***************************************************************************/
|
|
bool TATR::FCmdRewind(PCMD pcmd)
|
|
{
|
|
AssertThis(ftatrMvie); // make sure we have a movie
|
|
AssertVarMem(pcmd);
|
|
|
|
if (pvNil == _pmvie) // Prevent crash if _pmvie is pvNil (although it
|
|
return fTrue; // shouldn't ever be if this function is called)
|
|
|
|
if (_pmvie->Cscen() > 0)
|
|
{
|
|
StopAllMovieSounds();
|
|
if (_pmvie->FSwitchScen(0))
|
|
_pmvie->Pscen()->FGotoFrm(_pmvie->Pscen()->NfrmFirst());
|
|
}
|
|
return fTrue;
|
|
}
|
|
|
|
|
|
#ifdef DEBUG
|
|
/***************************************************************************
|
|
Assert the validity of the TATR.
|
|
***************************************************************************/
|
|
void TATR::AssertValid(ulong grf)
|
|
{
|
|
TATR_PAR::AssertValid(fobjAllocated);
|
|
if (grf & ftatrMvie)
|
|
AssertPo(_pmvie, 0);
|
|
}
|
|
|
|
|
|
/***************************************************************************
|
|
Mark memory used by the TATR
|
|
***************************************************************************/
|
|
void TATR::MarkMem(void)
|
|
{
|
|
AssertThis(0);
|
|
TATR_PAR::MarkMem();
|
|
MarkMemObj(_pmvie);
|
|
}
|
|
#endif //DEBUG
|