308 lines
8.4 KiB
C++
308 lines
8.4 KiB
C++
/*
|
||
ボード管理クラス
|
||
(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;
|
||
}
|