/*
クラスライブラリのインタフェース
(NP2) Sachiko Yasukawa
*/
//     Date    |   Author     |  Description
//  -----------+--------------+--------------------------------------------
//  1998.03.27 |  Hideki Yagi | Change the specification about
//             |              | Get***Property().
//

typedef enum {
	PowerOff,
	Stop,
	Pause,
	Play,
	Slow,
	Scan
} LIBSTATE;

class IMPEGBuffer : public IMBoardListItem
{
public:
	virtual DWORD GetPageNum()=0;
	virtual DWORD GetPageSize(DWORD PageNum)=0;
	virtual BOOL GetPagePointer(DWORD PageNum, DWORD *LinearAdd, DWORD *PhyAdd)=0;
	virtual DWORD GetBufferFlag()=0;
};

class IMPEGBoardState
{
public:
	virtual BOOL Init()=0;
};

//class IMPEGBoardLibEvent
//{
//public:
//	virtual void Advice(PVOID)=0;
//	virtual HALEVENTTYPE GetEventType()=0;
//};

class ITransfer
{
public:
	virtual BOOL Init()=0;
	virtual BOOL SetSink(IMPEGBoardEvent *pEvent)=0;
	virtual BOOL UnSetSink(IMPEGBoardEvent *pEvent)=0;
	virtual BOOL SetDMABuffer(DWORD size, BYTE* LinerAdd, BYTE *PhysAdd)=0;
};

class IStateObject;

class IBaseStream
{
public:
	virtual BOOL Init()=0;
	virtual BOOL Play()=0;
	virtual BOOL Stop()=0;
	virtual BOOL Pause()=0;
	virtual BOOL Slow(DWORD)=0;
	virtual BOOL Scan(DWORD)=0;
	virtual BOOL SingleStep()=0;
	virtual LIBSTATE GetState()=0;
	virtual BOOL SendData(IMPEGBuffer *)=0;
 	virtual BOOL SetStateObject(IMPEGBoardState *pState)=0;
	virtual BOOL SetTransferObject(ITransfer *pTransfer)=0;
	virtual BOOL SetTransferMode(HALSTREAMMODE)=0;
	virtual BOOL SetDataDirection( DirectionType type ) = 0;
	virtual BOOL GetDataDirection( DirectionType *ptype ) = 0;
};

class IVideoProperty
{
public:
	virtual BOOL GetVideoProperty(VIDEOPROPTYPE PropertyType, PVOID pProperty)=0;
	virtual BOOL SetVideoProperty(VIDEOPROPTYPE PropetyType, PVOID pProperty)=0;
};

class IAudioProperty
{
public:
	virtual BOOL GetAudioProperty(AUDIOPROPTYPE PropertyType, PVOID pProperty)=0;
	virtual BOOL SetAudioProperty(AUDIOPROPTYPE PropertyType, PVOID pProperty)=0;
};

class ISubpicProperty
{
public:
	virtual BOOL GetSubpicProperty(SUBPICPROPTYPE PropertyType, PVOID pProperty)=0;
	virtual BOOL SetSubpicProperty(SUBPICPROPTYPE PropertyType, PVOID pProperty)=0;
};

class ICopyProtectProperty
{
public:
	virtual BOOL CppInit() =0;
	virtual BOOL SetChlgKey(UCHAR *)=0;
	virtual BOOL GetChlgKey(UCHAR *)=0;
	virtual BOOL SetDVDKey1(UCHAR *)=0;
	virtual BOOL GetDVDKey2(UCHAR *)=0;
	virtual BOOL SetTitleKey(UCHAR *)=0;
	virtual BOOL SetDiscKey(UCHAR *)=0;
};

class IMPEGBoard
{
public:
	virtual BOOL Init()=NULL;
	virtual BOOL AddStreamObjectInterface(IBaseStream *)=NULL;
	virtual BOOL ReleaseStreamObjectInterface(IBaseStream *)=NULL;
	virtual BOOL PowerOn()=NULL;
	virtual BOOL PowerOff()=NULL;
	virtual BOOL SetSTC(DWORD)=NULL;
	virtual BOOL GetSTC(DWORD *)=NULL;
	virtual BOOL SetHALObjectInterface(IClassLibHAL *)=NULL;
};