#ifndef __Player__H
#define __Player__H

#include "Media.h"
#include "WimpLib:WList.h"
#include "WimpLib:Template.h"
#include "CmdList.h"

struct PlayList;
typedef struct Player Player;
typedef void (*FPlayer_ReloadSkin)(void* /*Player* pPlayer*/);

typedef enum
{
	  ECmd_Type_Player_Ctrl     = 0
	, ECmd_Type_Player_Volume   = 1
	, ECmd_Type_Player_Position = 2
} ECmd_Type_Player;

#define Player_IntroScan        0x00000001
#define Player_Shortcuts        0x00000002
#define Player_SeparateShuffle  0x00000004
#define Player_ShuffleMenu      0x00000008
#define Player_RememberPosition 0x00000010
#define Player_SlowPolling      0x00000020
#define Player_CreateMask       0x0000003C

Player* throw_New_Player(struct PlayList* pPlayList, const char* pSuffix, FPlayer_ReloadSkin pReloadSkin, int flags);
void Delete_Player(Player*);

int Player_GetNr(Player*);
int Player_GetDCDUtilsHandle(Player*);
struct PlayList* Player_GetPlayList(Player*);
bool Player_AllowsShortcuts(Player*);
HWind Player_GetWindow(Player*, int which);
int Player_GetHardwareType(Player*);
Media_Status Player_GetStatus(Player*);
unsigned int Player_GetShuffleMode(Player*);
bool Player_IsStatusActive(Player*);
bool Player_IsStatusPlaying(Player*);

void throw_Player_ReloadSkin(Player*);

void Player_SetLoopMode(Player* This, Media_LoopMode mode);
void Player_SetShuffleMode(Player*, unsigned int shuffle);
void Player_SetIntroScan(Player* This, bool on);
void Player_SetListMode(Player*, bool on);
void Player_SetStatus(Player*, Media_Status status);
void Player_SetHardwareType(Player*, int type);
void Player_ToggleShortcuts(Player*);

void Player_PlayTrack(Player*, int track);

void Player_SetCmdHandler(Player*, const CmdHandler* pHandler, void* handle);
int Player_CheckCommand(void* handle, CmdID id);
bool Player_ExecCommand(void* handle, CmdID id);

void Player_RemoteControl(Player*, ECmd_Type_Player cmd, uint32_t value);
void Player_ShowMessage(Player* This, const char* pmsg);
void Player_ShowControls(Player*, HWind behind);

#define player_refresh_initlist     0x01
#define player_refresh_tracklist    0x02
#define player_refresh_track        0x04
#define player_refresh_position     0x08
#define player_refresh_volume       0x10
#define player_refresh_listtitle    0x20
#define player_refresh_loopmode     0x40
#define player_refresh_params       0x80
void Player_Refresh(Player*, unsigned int flags);

void Player_StartPlugIn(Player*);
void Player_StopPlugIns(Player*);
int Player_FindTrack(Player*, const void* ptrack);
void Player_RemoveTrack(Player*, const void* ptrack);
void Player_WriteProfile(Player*);

void throw_Players_Players(void);
void Players_NotPlayers(void);
void Players_ModeChange(void);
int Players_Count(void);
void throw_Players_Add(Player* pobj);
void Players_Del(Player* pObj);
Player* Players_Get(int i);
void throw_Players_LoadSkins(void);
void throw_Players_ReloadSkins(void);

#endif
