|
|
/*
�N���X���C�u�������̋��ʃw�b�_�[�t�@�C�� �iNP2)�@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 );
//�f�o�b�O�p
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;//�Ǘ����ׂ��X�g���[���̃`�F�[���̐擪
IClassLibHAL *m_pIHAL;//�n���C���^�t�F�[�X�ւ̃|�C���^
};
|