Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

307 lines
8.4 KiB

/*
 ボード管理クラス
 (NP2) Sachiko Yasukawa
*/
// Date | Author | Description
// -----------+--------------+--------------------------------------------
// 1998.03.27 | Hideki Yagi | Change the specification about GetSTC().
//
#include "stdafx.h"
#include "includes.h"
#include "classlib.h"
//初期化
BOOL CMPEGBoard::Init()
{
m_pBaseStreamObject=NULL;
m_pIHAL=NULL;
return TRUE;
}
//管理すべき新しいストリームの追加
//パラメータ
//IBaseStream ラッパーが作るストリームクラスの基本クラスへのポインタ
BOOL CMPEGBoard::AddStreamObjectInterface(IBaseStream *INewStreamObject)
{
CBaseStream *pBSt1, *pBSt2;
ASSERT(INewStreamObject);
//HALを設定していないのでエラー
//if(m_pIHAL == NULL){
// _RPTF0(_CRT_ERROR, "m_pIHAL = NULL\n");
// return FALSE;
//}
//まだ一つもストリームが追加されていない。
//m_pBaseStreamObject ... 管理すべきストリームの先頭をさす
if(m_pBaseStreamObject == NULL){
m_pBaseStreamObject = (CBaseStream *) INewStreamObject;
pBSt1 = m_pBaseStreamObject;
}
//管理すべき新しいストリームを追加
else{
pBSt1 = (CBaseStream *)INewStreamObject;
//MIXタイプのストリームに追加できない
if(ISMIXSTREAM(pBSt1->m_StreamType) == TRUE || ISMIXSTREAM(m_pBaseStreamObject->m_StreamType) == TRUE){
_RPTF0(_CRT_ERROR, "INVALID STREAM\n");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::AddStreamObjectInterface:SET INVALID TYPE STREAM\n"));
DBG_BREAK();
return FALSE;
}
//管理すべきストリームのラストを探す
for(pBSt2 = m_pBaseStreamObject; pBSt2->m_pNextStreamObject != NULL; pBSt2 = pBSt2->m_pNextStreamObject);
pBSt2->m_pNextStreamObject= pBSt1;//いままでラストだったもののNextにパラメータで指定されたストリームを
pBSt1->m_pPrevStreamObject = pBSt2;//パラメータで指定されたストリームのPrevに今までラストだったものを
}
//追加しようとしているストリームにHALインタフェースへのポインタを教える。
pBSt1->m_pIHAL=m_pIHAL;
//追加しようとしているストリームにStreamControlHALインタフェースへのポインタを取得させる。
if(SetHALStream(pBSt1, m_pIHAL) == FALSE){
_RPTF0(_CRT_ERROR, "CAN'T GET STREAMCONTROLHAL\n");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::AddStreamObjectInterface:CAN'T GET STREAMCONTROLHAL\n"));
DBG_BREAK();
return FALSE;
}
return TRUE;
}
//管理すべきストリームからの解放
//パラメータ
//IBaseStream ラッパーが作るストリームクラスの基本クラスへのポインタ
BOOL CMPEGBoard::ReleaseStreamObjectInterface(IBaseStream *IReleaseStreamObject)
{
CBaseStream *pBSt1;
ASSERT(IReleaseStreamObject);
//解放すべきストリームがないのでエラー
if(m_pBaseStreamObject == NULL){
_RPTF0(_CRT_WARN, "NO ADDED STREAM\n");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::ReleaseStreamObjectInterface:NO ADDED STREAM\n"));
DBG_BREAK();
return FALSE;
}
else{
pBSt1 = (CBaseStream *)IReleaseStreamObject;
//リリースしてはいけないばあいがあるはず?
//管理すべきストリームのチェーンから解放
pBSt1->m_pPrevStreamObject->m_pNextStreamObject = pBSt1->m_pNextStreamObject;
pBSt1->m_pNextStreamObject->m_pPrevStreamObject = pBSt1->m_pPrevStreamObject;
//Transferオブジェクトでも管理しているはずなのでリリース
ASSERT(((CBaseStream *)IReleaseStreamObject)->m_pTransfer);
if(((CTransfer *)((CBaseStream *)IReleaseStreamObject)->m_pTransfer)->ReleaseStreamObject(IReleaseStreamObject) == FALSE){
_RPTF0(_CRT_WARN, "NO RELEASE STREAM FROM TRANSFER OBJECT\n");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::ReleaseStreamObjectInterface:CAN'T RELEASE STREAM FROM TRANSFER OBJECT\n"));
DBG_BREAK();
return FALSE;
}
}
return TRUE;
}
//電源をオンにする
BOOL CMPEGBoard::PowerOn()
{
return ChangePower(POWERSTATE_ON);
}
//電源をオフにする
BOOL CMPEGBoard::PowerOff()
{
return ChangePower(POWERSTATE_OFF);
}
//STCの値をセットする
BOOL CMPEGBoard::SetSTC(DWORD time)
{
//まだ初期化が終わってない。
if(m_pIHAL == NULL || m_pBaseStreamObject == NULL){
_RPTF0(_CRT_WARN, "NOT INITILIZE CMPEGBoard \n");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::SetSTC:NOT BE INITILIZE CMPEGBoard CORRECTLY\n"));
DBG_BREAK();
return FALSE;
}
if(m_pIHAL->SetSTC(time) != HAL_SUCCESS){
_RPTF0(_CRT_WARN, "CAN'T SETSTC \n");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::SetSTC:CAN'T SETSTC \n"));
DBG_BREAK();
return FALSE;
}
return TRUE;
}
//STCの値をゲットする
//リターン値を考え直す。
BOOL CMPEGBoard::GetSTC(DWORD *foo) // 98.03.27 H.Yagi
{
DWORD Time;
//まだ初期化が終わってない。
if(m_pIHAL == NULL || m_pBaseStreamObject == NULL){
_RPTF0(_CRT_ERROR, "NOT INITILIZE CMPEGBoard \n");
*foo = 0xffffffff;
return FALSE;
}
//STCの取得
if(m_pIHAL->GetSTC(&Time) != HAL_SUCCESS){
_RPTF0(_CRT_WARN, "CAN'T GETSTC \n");
*foo = 0xffffffff;
return FALSE; // 98.04.21 H.Yagi
}
*foo = Time;
return TRUE;
}
//HALオブジェクトへのインタフェースの設定
BOOL CMPEGBoard::SetHALObjectInterface(IClassLibHAL *pILibHAL)
{
CBaseStream *pStream;
ASSERT(pILibHAL);
m_pIHAL = pILibHAL;
//10/14訂正
for(pStream = m_pBaseStreamObject; pStream; pStream = (CBaseStream *)pStream->GetNextStream()){
if(SetHALStream(pStream, m_pIHAL) == FALSE){
_RPTF0(_CRT_ERROR, "CAN'T GET STREAMCONTROLHAL\n");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::SetHALInterface:CAN'T GET STREAMCONTROLHAL\n"));
DBG_BREAK();
return FALSE;
}
}
return TRUE;
}
//電源のオンオフ
BOOL CMPEGBoard::ChangePower(POWERSTATE fOnOff)
{
CBaseStream *pBSt;
IMPEGBoardBaseState *pState;
//まだ初期化が終わってない。
if(m_pIHAL == NULL || m_pBaseStreamObject == NULL ){
_RPTF0(_CRT_WARN, "NOT INITILIZE CMPEGBoard \n");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::ChangePower:NOT INITILIZE CMPEGBoard CRRECTLY\n"));
DBG_BREAK();
return FALSE;
}
else{
for(pBSt = m_pBaseStreamObject; pBSt; pBSt = pBSt->m_pNextStreamObject){
ASSERT(pBSt->m_pMPEGBoardStateObject);
//BaseState(CPowerOffState, CStopState etc.の基本クラス)へのポインタをとってくる
pState = pBSt->GetIMPEGBoardState();
//初期化が正しく終わってない。
if(pState == NULL){
_RPTF0(_CRT_WARN, "NOT INITILIZE CMPEGBoard \n");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::ChangePower:NOT INITILIZE CMPEGBoard \n"));
DBG_BREAK();
return FALSE;
}
//電源のステータス変更
//オフなら
if(fOnOff == POWERSTATE_ON){
if(!ISPOWEROFF()){
//_RPTF0(_CRT_WARN, "STATE CHANGE ERROR From PowerON To PowerON\n");
return TRUE;//FALSE???
}
if(pState->ChangeStop(m_pIHAL, pBSt->GetHALStreamControl(), NULL) == FALSE){
_RPTF0(_CRT_WARN, "CANT CHANGE POWERSTATE\n");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::ChangePower:CANT CHANGE POWERSTATE\n"));
DBG_BREAK();
return FALSE;
}
}
else{
//// if(ISPOWEROFF()){
//// //_RPTF0(_CRT_WARN, "STATE CHANGE ERROR From PowerOff To PowerOff\n");
//// return TRUE;//FALSE???
//// }
if(pState->ChangePowerOff(m_pIHAL, pBSt->GetHALStreamControl()) == FALSE){
_RPTF0(_CRT_WARN, "CANT CHANGE POWERSTATE");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::ChangePower:CANT CHANGE POWERSTATE\n"));
DBG_BREAK();
return FALSE;
}
}
}
}
return TRUE;
}
BOOL CMPEGBoard::ISPOWEROFF()
{
POWERSTATE PowerState;
ASSERT(m_pIHAL);
m_pIHAL->GetPowerState(&PowerState);
if(PowerState == POWERSTATE_ON)
return POWERSTATE_ON;
else
return POWERSTATE_OFF;
}
BOOL CMPEGBoard::SetHALStream(CBaseStream *pStream, IClassLibHAL *pIHAL)
{
HALRESULT st;
ASSERT(pStream);
//MIXストリーム用
if(ISMIXSTREAM(pStream->m_StreamType) == TRUE){
if((st = pIHAL->GetMixHALStream(&pStream->m_pIStreamHAL)) != HAL_SUCCESS){
if(st != HAL_NOT_IMPLEMENT){
_RPTF0(_CRT_WARN, "NOT IMPLEMENT");
}
//実際にインプリメントされないのは許される???
_RPTF0(_CRT_WARN, "CAN'T GET MIXHALSTREAM INTERFACE\n");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::ChangePower:CAN'T GET MIXHALSTREAM INTERFACE\n"));
DBG_BREAK();
return FALSE;
}
}
//単独ストリーム用
else{
switch(pStream->m_StreamType){
case Video:
st = pIHAL->GetVideoHALStream(&pStream->m_pIStreamHAL);
break;
case Audio:
st = pIHAL->GetAudioHALStream(&pStream->m_pIStreamHAL);
break;
case Subpicture:
st = pIHAL->GetSubpicHALStream(&pStream->m_pIStreamHAL);
break;
default:
_RPTF0(_CRT_WARN, "INVALID STREAMTYPE\n");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::SetHALStream:INVALID STREAMTYPE\n"));
DBG_BREAK();
return FALSE;
}
if(st != HAL_SUCCESS){
_RPTF0(_CRT_WARN, "INVALID STREAMTYPE\n");
DBG_PRINTF(("CLASSLIB:CMPEGBOARD::SetHALStream:INVALID STREAMTYPE\n"));
DBG_BREAK();
return FALSE;
}
}
return TRUE;
}