#ifndef __MediaDrv__H
#define __MediaDrv__H

#include <stdbool.h>
#include "Media.h"

typedef bool (*throw_Driver_LoadObject)(MediaObject* pobj, const char* pObject);
typedef void (*Driver_UnLoadObject)(MediaObject* pobj);
typedef void (*Driver_Chain)(MediaObject* pobj, MediaObject* pnext);

typedef void (*Driver_Play)(MediaObject* pobj, uint64_t pos);
typedef void (*Driver_Freeze)(MediaObject* pobj, bool on);
typedef void (*Driver_Stop)(MediaObject* pobj);
typedef void (*Driver_Seek)(MediaObject* pobj, EMedia_Seek set);

typedef void (*Driver_SetLoopMode)(MediaObject* pobj, Media_LoopMode mode);
typedef Media_LoopMode (*Driver_GetLoopMode)(MediaObject* pobj);

typedef Media_Status (*Driver_GetStatus)(MediaObject* pobj);
typedef void (*Driver_GetPosition)(MediaObject* pobj, MediaPosition* pos);
typedef uint64_t (*Driver_GetSectionPos)(MediaObject* pobj, unsigned int section);
typedef void (*Driver_SetConfig)(MediaObject* pobj, Media_Config type, const void* value);
typedef unsigned int (*Driver_GetConfig)(MediaObject* pobj, Media_Config type);

struct MediaDriver
{
	const char*				pDriverName;
	throw_Driver_LoadObject	pthrow_LoadObject;
	Driver_UnLoadObject		pUnLoadObject;
	Driver_Chain            pChain;

	Driver_Play				pPlay;
	Driver_Freeze			pFreeze;
	Driver_Stop				pStop;
	Driver_Seek				pSeek;

	Driver_SetLoopMode		pSetLoopMode;
	Driver_GetLoopMode		pGetLoopMode;
	Driver_GetStatus		pGetStatus;
	Driver_GetPosition		pGetPosition;
	Driver_GetSectionPos	pGetSectionPos;
	Driver_SetConfig		pSetConfig;
	Driver_GetConfig		pGetConfig;
};

#endif
