mirror of https://github.com/tongzx/nt5src
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
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;
|
|
}
|