windows-nt/Source/XPSP1/NT/drivers/wdm/dvd/mini/tecra/classlib.h
2020-09-26 16:20:57 +08:00

521 lines
15 KiB
C++
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
クラスライブラリ内の共通ヘッダーファイル
NP2) Sachiko Yasukawa
*/
// Date | Author | Description
// -----------+--------------+--------------------------------------------
// 1998.03.27 | Hideki Yagi | Change the specification about GetSTC().
// | | Change the specification about
// | | Get***Property().
//
#define ISMIXSTREAM(type) ((type == Dvd || type == VideoCD) ? TRUE : FALSE)
typedef enum{
Video,
Audio,
Subpicture,
Dvd,
VideoCD,
} STREAMTYPE;
class CBaseStream;
class IMPEGBoardBaseState
{
public:
virtual BOOL ChangePowerOff(IClassLibHAL *, IHALStreamControl *)=0;
virtual BOOL ChangeStop(IClassLibHAL *, IHALStreamControl *, CBaseStream *)=0;
virtual BOOL ChangePlay(IClassLibHAL *, IHALStreamControl *)=0;
virtual BOOL ChangePause(IClassLibHAL *, IHALStreamControl *)=0;
virtual BOOL ChangePauseViaSingleStep(IClassLibHAL *, IHALStreamControl *)=0;
virtual BOOL ChangeSlow(DWORD, IClassLibHAL *, IHALStreamControl *)=0;
virtual BOOL ChangeScan(DWORD, IClassLibHAL *, IHALStreamControl *)=0;
};
class CPowerOffState : public IMPEGBoardBaseState
{
public:
void Init(IMPEGBoardState *pMPEGBoardState){m_pMPEGBoardState = pMPEGBoardState;};
BOOL ChangePowerOff(IClassLibHAL *, IHALStreamControl *);
BOOL ChangeStop(IClassLibHAL *, IHALStreamControl *, CBaseStream *);
BOOL ChangePlay(IClassLibHAL *, IHALStreamControl *);
BOOL ChangePause(IClassLibHAL *, IHALStreamControl *);
BOOL ChangePauseViaSingleStep(IClassLibHAL *, IHALStreamControl *);
BOOL ChangeSlow(DWORD, IClassLibHAL *, IHALStreamControl *);
BOOL ChangeScan(DWORD, IClassLibHAL *, IHALStreamControl *);
private:
IMPEGBoardState *m_pMPEGBoardState;
};
class CStopState : public IMPEGBoardBaseState
{
public:
void Init(IMPEGBoardState *pMPEGBoardState){m_pMPEGBoardState = pMPEGBoardState;};
BOOL ChangePowerOff(IClassLibHAL *, IHALStreamControl *);
BOOL ChangeStop(IClassLibHAL *, IHALStreamControl *, CBaseStream *);
BOOL ChangePlay(IClassLibHAL *, IHALStreamControl *);
BOOL ChangePause(IClassLibHAL *, IHALStreamControl *);
BOOL ChangePauseViaSingleStep(IClassLibHAL *, IHALStreamControl *);
BOOL ChangeSlow(DWORD, IClassLibHAL *, IHALStreamControl *);
BOOL ChangeScan(DWORD, IClassLibHAL *, IHALStreamControl *);
private:
IMPEGBoardState *m_pMPEGBoardState;
};
class CPlayState : public IMPEGBoardBaseState
{
public:
void Init(IMPEGBoardState *pMPEGBoardState){m_pMPEGBoardState = pMPEGBoardState;};
BOOL ChangePowerOff(IClassLibHAL *, IHALStreamControl *);
BOOL ChangeStop(IClassLibHAL *, IHALStreamControl *, CBaseStream *);
BOOL ChangePlay(IClassLibHAL *, IHALStreamControl *);
BOOL ChangePause(IClassLibHAL *, IHALStreamControl *);
BOOL ChangePauseViaSingleStep(IClassLibHAL *, IHALStreamControl *);
BOOL ChangeSlow(DWORD, IClassLibHAL *, IHALStreamControl *);
BOOL ChangeScan(DWORD, IClassLibHAL *, IHALStreamControl *);
private:
IMPEGBoardState *m_pMPEGBoardState;
};
class CPauseState : public IMPEGBoardBaseState
{
public:
void Init(IMPEGBoardState *pMPEGBoardState){m_pMPEGBoardState = pMPEGBoardState;};
BOOL ChangePowerOff(IClassLibHAL *, IHALStreamControl *);
BOOL ChangeStop(IClassLibHAL *, IHALStreamControl *, CBaseStream *);
BOOL ChangePlay(IClassLibHAL *, IHALStreamControl *);
BOOL ChangePause(IClassLibHAL *, IHALStreamControl *);
BOOL ChangePauseViaSingleStep(IClassLibHAL *, IHALStreamControl *);
BOOL ChangeSlow(DWORD, IClassLibHAL *, IHALStreamControl *);
BOOL ChangeScan(DWORD, IClassLibHAL *, IHALStreamControl *);
private:
IMPEGBoardState *m_pMPEGBoardState;
};
class CSlowState : public IMPEGBoardBaseState
{
public:
void Init(IMPEGBoardState *pMPEGBoardState){m_pMPEGBoardState = pMPEGBoardState;};
BOOL ChangePowerOff(IClassLibHAL *, IHALStreamControl *);
BOOL ChangeStop(IClassLibHAL *, IHALStreamControl *, CBaseStream *);
BOOL ChangePlay(IClassLibHAL *, IHALStreamControl *);
BOOL ChangePause(IClassLibHAL *, IHALStreamControl *);
BOOL ChangePauseViaSingleStep(IClassLibHAL *, IHALStreamControl *);
BOOL ChangeSlow(DWORD, IClassLibHAL *, IHALStreamControl *);
BOOL ChangeScan(DWORD, IClassLibHAL *, IHALStreamControl *);
private:
IMPEGBoardState *m_pMPEGBoardState;
};
class CScanState : public IMPEGBoardBaseState
{
public:
void Init(IMPEGBoardState *pMPEGBoardState){m_pMPEGBoardState = pMPEGBoardState;};
BOOL ChangePowerOff(IClassLibHAL *, IHALStreamControl *);
BOOL ChangeStop(IClassLibHAL *, IHALStreamControl *, CBaseStream *);
BOOL ChangePlay(IClassLibHAL *, IHALStreamControl *);
BOOL ChangePause(IClassLibHAL *, IHALStreamControl *);
BOOL ChangePauseViaSingleStep(IClassLibHAL *, IHALStreamControl *);
BOOL ChangeSlow(DWORD, IClassLibHAL *, IHALStreamControl *);
BOOL ChangeScan(DWORD, IClassLibHAL *, IHALStreamControl *);
private:
IMPEGBoardState *m_pMPEGBoardState;
};
class CMPEGBoardState : public IMPEGBoardState
{
friend class CMPEGBoard;
friend class CBaseStream;
public:
BOOL Init(){ m_pStateObject = (IMPEGBoardBaseState *)&m_PowerOffState; m_State = PowerOff;
m_PowerOffState.Init(this); m_StopState.Init(this); m_PauseState.Init(this); m_PlayState.Init(this);
m_ScanState.Init(this); m_SlowState.Init(this); return TRUE;};
//独自
CMPEGBoardState(){Init();};
IMPEGBoardBaseState *GetMPEGBoardState(){return m_pStateObject;};
LIBSTATE GetState(){ return m_State;};
void SetState(LIBSTATE);
private:
//IMPEGBoardState *m_this;
IMPEGBoardBaseState *m_pStateObject;
CPowerOffState m_PowerOffState;
CStopState m_StopState;
CPauseState m_PauseState;
CPlayState m_PlayState;
CSlowState m_SlowState;
CScanState m_ScanState;
LIBSTATE m_State;
};
class CTransfer;
class CClassLibEvent : public IMPEGBoardEvent
{
public:
void Advice(PVOID);
HALEVENTTYPE GetEventType(){return m_Type;};
IMBoardListItem* GetNext( void ){ return m_pNextEvent;};
void SetNext( IMBoardListItem *Item ){ m_pNextEvent = Item;};
CClassLibEvent(){m_pNextEvent = NULL; m_pTransfer = NULL; m_Type = ClassLibEvent_SendData;};
void SetTransfer(CTransfer *pTransfer){m_pTransfer = pTransfer;};
void SetEventType(HALEVENTTYPE type){ m_Type = type;};
private:
HALEVENTTYPE m_Type;
IMBoardListItem *m_pNextEvent;
CTransfer *m_pTransfer;
};
class CBaseStream : public IBaseStream
{
friend class CMPEGBoard;
public:
//IBaseStreamから
BOOL Init();
BOOL Play();
BOOL Stop();
BOOL Pause();
BOOL Slow(DWORD);
BOOL Scan(DWORD);
BOOL SingleStep();
LIBSTATE GetState();
BOOL SendData(IMPEGBuffer *);
BOOL SetStateObject(IMPEGBoardState *pMPEGBoardStateObject);
BOOL SetTransferObject(ITransfer *pTransfer);
BOOL SetTransferMode(HALSTREAMMODE);
BOOL SetDataDirection(DirectionType type );
BOOL GetDataDirection(DirectionType *ptype );
//独自
CBaseStream();
IMPEGBoardBaseState *GetStateObject();
IClassLibHAL *GetClassLibHAL(){return m_pIHAL;};
IHALStreamControl *GetHALStreamControl(){return m_pIStreamHAL;};
IMPEGBoardBaseState *GetIMPEGBoardState(){ return (((CMPEGBoardState *)m_pMPEGBoardStateObject)->GetMPEGBoardState());};
void FlushTransferBuffer();
IBaseStream *GetNextStream(){return m_pNextStreamObject;};
IBaseStream *GetPrevStream(){return m_pPrevStreamObject;};
void SetNextStream(IBaseStream *pNextStreamObject){m_pNextStreamObject = (CBaseStream *)pNextStreamObject;};
void SetPrevStream(IBaseStream *pPrevStreamObject){m_pPrevStreamObject = (CBaseStream *)pPrevStreamObject;};
BOOL ISMIXSTREAMTYPE(STREAMTYPE StreamType){return (StreamType == VideoCD) ? TRUE : ((StreamType == Dvd) ? TRUE : FALSE);};
protected:
CBaseStream *m_pNextStreamObject;
CBaseStream *m_pPrevStreamObject;
STREAMTYPE m_StreamType;
IMPEGBoardState *m_pMPEGBoardStateObject;
IClassLibHAL *m_pIHAL;
IHALStreamControl *m_pIStreamHAL;
ITransfer *m_pTransfer;
UCHAR m_DriveChlgKey[10];
UCHAR m_DecoderChlgKey[10];
UCHAR m_DriveResKey[5];
UCHAR m_DecoderResKey[5];
};
class CVideoStream : public CBaseStream, public IVideoProperty, public ICopyProtectProperty
{
public:
BOOL CppInit();
BOOL GetVideoProperty(VIDEOPROPTYPE PropertyType, PVOID pProperty);
BOOL SetVideoProperty(VIDEOPROPTYPE PropertyType, PVOID pProperty);
BOOL SetChlgKey(UCHAR *);
BOOL GetChlgKey(UCHAR *);
BOOL SetDVDKey1(UCHAR *);
BOOL GetDVDKey2(UCHAR *);
BOOL SetTitleKey(UCHAR *);
BOOL SetDiscKey(UCHAR *);
CVideoStream(){m_StreamType = Video;};
};
class CAudioStream : public CBaseStream, public IAudioProperty, public ICopyProtectProperty
{
public:
BOOL CppInit();
BOOL GetAudioProperty(AUDIOPROPTYPE PropertyType, PVOID pProperty);
BOOL SetAudioProperty(AUDIOPROPTYPE PropertyType, PVOID pProperty);
BOOL SetChlgKey(UCHAR *);
BOOL GetChlgKey(UCHAR *);
BOOL SetDVDKey1(UCHAR *);
BOOL GetDVDKey2(UCHAR *);
BOOL SetTitleKey(UCHAR *);
BOOL SetDiscKey(UCHAR *);
CAudioStream(){m_StreamType = Audio;};
};
class CSubpicStream : public CBaseStream, public ISubpicProperty, public ICopyProtectProperty
{
public:
BOOL CppInit();
BOOL GetSubpicProperty(SUBPICPROPTYPE PropertyType, PVOID pProperty);
BOOL SetSubpicProperty(SUBPICPROPTYPE PropertyType, PVOID pProperty);
BOOL SetChlgKey(UCHAR *);
BOOL GetChlgKey(UCHAR *);
BOOL SetDVDKey1(UCHAR *);
BOOL GetDVDKey2(UCHAR *);
BOOL SetTitleKey(UCHAR *);
BOOL SetDiscKey(UCHAR *);
CSubpicStream(){m_StreamType = Subpicture;};
};
class CVideoCDStream : public CBaseStream, public IVideoProperty, public IAudioProperty, public ICopyProtectProperty
{
public:
BOOL CppInit();
BOOL GetVideoProperty(VIDEOPROPTYPE PropertyType, PVOID pProperty);
BOOL SetVideoProperty(VIDEOPROPTYPE PropertyType, PVOID pProperty);
BOOL GetAudioProperty(AUDIOPROPTYPE PropertyType, PVOID pProperty);
BOOL SetAudioProperty(AUDIOPROPTYPE PropertyType, PVOID pProperty);
BOOL SetChlgKey(UCHAR *);
BOOL GetChlgKey(UCHAR *);
BOOL SetDVDKey1(UCHAR *);
BOOL GetDVDKey2(UCHAR *);
BOOL SetTitleKey(UCHAR *);
BOOL SetDiscKey(UCHAR *);
CVideoCDStream(){ m_StreamType = VideoCD;};
};
class CDVDStream : public CBaseStream, public IVideoProperty, public IAudioProperty,public ISubpicProperty, public ICopyProtectProperty
{
public:
BOOL CppInit();
BOOL GetVideoProperty(VIDEOPROPTYPE PropertyType, PVOID pProperty);
BOOL SetVideoProperty(VIDEOPROPTYPE PropertyType, PVOID pProperty);
BOOL GetAudioProperty(AUDIOPROPTYPE PropertyType, PVOID pProperty);
BOOL SetAudioProperty(AUDIOPROPTYPE PropertyType, PVOID pProperty);
BOOL GetSubpicProperty(SUBPICPROPTYPE PropertyType, PVOID pProperty);
BOOL SetSubpicProperty(SUBPICPROPTYPE PropertyType, PVOID pProperty);
BOOL SetChlgKey(UCHAR *);
BOOL GetChlgKey(UCHAR *);
BOOL SetDVDKey1(UCHAR *);
BOOL GetDVDKey2(UCHAR *);
BOOL SetTitleKey(UCHAR *);
BOOL SetDiscKey(UCHAR *);
BOOL GetCapability( CAPSTYPE PropType, DWORD *pPropType ); // H.Yagi
CDVDStream(){m_StreamType = Dvd;};
};
class CClassLibBuffer : public IHALBuffer
{
public:
DWORD GetSize();
DWORD Flags();
BYTE *GetBuffPointer();
BYTE *GetLinBuffPointer();
IMBoardListItem* GetNext(){ return m_pNext; };
void SetNext( IMBoardListItem *Item ){ m_pNext = Item; };
PVOID GetIMPEGBuffer(){ return m_pMPEGBoardBuffer;};
CBaseStream *GetStream(){ return m_pStream;};
CClassLibBuffer( void );
CClassLibBuffer(IMBoardListItem *pBuffer, CBaseStream *pStream, DWORD PageNum);
CClassLibBuffer(IMBoardListItem *pBuffer, CBaseStream *pStream, DWORD PageNum, DWORD Size, DWORD Add, DWORD LinAdd, DWORD flag);
void SetParam(IMBoardListItem *pBuffer, CBaseStream *pStream, DWORD PageNum, DWORD Size, DWORD Add, DWORD LinAdd, DWORD flag);
private:
IMBoardListItem *m_pNext;
DWORD m_PageNum;
DWORD m_Size;
DWORD m_flag;
UCHAR *m_Add;
UCHAR *m_LinAdd;
CBaseStream *m_pStream;
IMPEGBuffer *m_pMPEGBoardBuffer;
public:
BOOL m_fEnd;
};
#define MAXCLIBBUFF (20)
class CMemoryAllocator
{
private:
CClassLibBuffer Buff[MAXCLIBBUFF];
int TopFreePoint;
int LastFreePoint;
int FreeBuffNum;
public:
CMemoryAllocator(){
TopFreePoint = 0;
LastFreePoint = 0;
FreeBuffNum = MAXCLIBBUFF;
for( int i = 0; i < MAXCLIBBUFF ; i ++ )
Buff[i].SetNext( NULL );
};
~CMemoryAllocator(){
};
CClassLibBuffer *Alloc(IMBoardListItem *pBuffer, CBaseStream *pStream, DWORD PageNum, DWORD Size, DWORD Add, DWORD LinAdd, DWORD flag)
{
CClassLibBuffer *pNewBuffer;
if( FreeBuffNum == 0 )
return NULL;
pNewBuffer = &Buff[TopFreePoint];
pNewBuffer->SetParam(pBuffer, pStream, PageNum, Size, Add, LinAdd, flag);
FreeBuffNum--;
TopFreePoint++;
if( TopFreePoint == MAXCLIBBUFF )
TopFreePoint = 0;
return pNewBuffer;
};
void Free(CClassLibBuffer *pBuffer)
{
ASSERT( pBuffer == &Buff[LastFreePoint] );
ASSERT( FreeBuffNum != MAXCLIBBUFF );
LastFreePoint ++;
if( LastFreePoint == MAXCLIBBUFF )
LastFreePoint = 0;
FreeBuffNum ++;
pBuffer->SetNext(NULL);
};
int GetMaxBuffNum( void )
{
return MAXCLIBBUFF;
};
void Flush( void )
{
TopFreePoint = 0;
LastFreePoint = 0;
FreeBuffNum = MAXCLIBBUFF;
for( int i = 0; i < MAXCLIBBUFF ; i ++ )
Buff[i].SetNext( NULL );
};
};
class CTransferStreamList : public IMBoardListItem
{
public:
CTransferStreamList(){m_pNextItem = NULL; m_pBaseStream = NULL;};
CTransferStreamList(CBaseStream *pStream){m_pNextItem = NULL; m_pBaseStream = pStream;};
//378742 PNPBOOT: tosdvd03 leaks 1 page of memory on unload.
void Init(CBaseStream *pStream){m_pNextItem = NULL; m_pBaseStream = pStream;};
//378742
IMBoardListItem* GetNext( void ){ return (IMBoardListItem *)m_pNextItem;};
void SetNext( IMBoardListItem *Item ){ m_pNextItem = (CTransferStreamList *)Item;};
CBaseStream *GetBaseStream(void){ return m_pBaseStream;};
void SetBaseStream (CBaseStream *pStream){ m_pBaseStream = pStream;};
private:
CBaseStream *m_pBaseStream;
CTransferStreamList *m_pNextItem;
};
class CTransfer : public ITransfer
{
friend class CMPEGBoard;
#ifdef TEST
friend class CMBoardAppDlg;
#endif
public:
BOOL EnQueue( IMPEGBuffer *Buff);
BOOL Init();
BOOL SetSink(IMPEGBoardEvent *pEvent);
BOOL UnSetSink(IMPEGBoardEvent *pEvent);
BOOL SetDMABuffer(DWORD size, BYTE* LinerAdd, BYTE *PhysAdd);
//独自
CTransfer(){Init();};
~CTransfer();
BOOL DeQueue();
BOOL AddStreamObject(IBaseStream *);
BOOL ReleaseStreamObject(IBaseStream *);
BOOL EndOfTransfer(CClassLibBuffer *);
void Flush();
private:
CTransferStreamList *m_pStreamObject;
//378742 PNPBOOT: tosdvd03 leaks 1 page of memory on unload.
CTransferStreamList m_pNewTransferStreamList;
//378742
IMBoardListItem *m_pTopEventList, *m_pLastEventList;
BYTE *m_LinerAdd;
BYTE *m_PhysAdd;
DWORD m_DMABufferSize;
CClassLibEvent m_EndOfTransferEvent;
IClassLibHAL *m_pIHAL;
CMemoryAllocator m_Mem;
IMPEGBuffer *m_pTopQueuedMPEGBuffer;
IMPEGBuffer *m_pLastQueuedMPEGBuffer;
IMPEGBuffer *m_pNextTransferMPEGBuffer;
DWORD m_TopPagePoint;
DWORD m_LastPagePoint;
BOOL HasQueuedBuffer( void );
BOOL GetNextTransferPoint( IMPEGBuffer **Point, DWORD *Page );
BOOL FreeTopTransferPoint( IMPEGBuffer **Free );
//デバッグ用
int BufCount;
DWORD StreamCount;
};
class CMPEGBoard : public IMPEGBoard
{
public:
//IMPEGBoardから
BOOL Init();
BOOL AddStreamObjectInterface(IBaseStream *);
BOOL ReleaseStreamObjectInterface(IBaseStream *);
BOOL PowerOn();
BOOL PowerOff();
BOOL SetSTC(DWORD);
BOOL GetSTC(DWORD *); // 98.03.27 H.Yagi
BOOL SetHALObjectInterface(IClassLibHAL *);
//独自
CMPEGBoard(){Init();};
BOOL ChangePower(POWERSTATE);
BOOL ISPOWEROFF(); //HALが設定されてからつかうこと
BOOL SetHALStream(CBaseStream *, IClassLibHAL *);
private:
CBaseStream *m_pBaseStreamObject;//管理すべきストリームのチェーンの先頭
IClassLibHAL *m_pIHAL;//ハルインタフェースへのポインタ
};