#ifndef __Options__H
#define __Options__H

#include <stdbool.h>

#define Opt_MAX_EQ_BANDS 5

typedef struct
{
	int	Gain[Opt_MAX_EQ_BANDS];
	int	Freq[Opt_MAX_EQ_BANDS];
} EqualizerParams;

typedef struct
{
	const char*	Target;
	const char*	Driver;
	const char*	SourceLeft;
	const char*	SourceRight;
	const char*	SampleType;
	int		SampleRate;
} SamplerParams;

typedef enum
{
	  ELoadAction_Ignore               = 0
	, ELoadAction_Queue                = 1
	, ELoadAction_QueueAndPlay         = 2
	, ELoadAction_AddToPlaylist        = 3
	, ELoadAction_AddToPlaylistAndPlay = 4
	, ELoadAction_Max                  = 4
} ELoadAction;

#define ECDMode_150FramesBug	0x01
#define ECDMode_TrackByTrack	0x02
#define ECDMode_PlayTrackSWI	0x04
#define ECDMode_ReadAudioSWI	0x08

typedef struct
{
	struct
	{
		const char*	pSkinName;
		bool	bAutoStartPlaylist;
		bool	bRememberPosition;
		bool	bAutoStartNewCDs;
		bool	bStopPlayingOnError;
		bool	bParentalLock;
		bool	bFixTrackVolume;
		bool	bReShuffleOnLoop;
		bool	bSinglePanelMode;
		bool	bRemoveAsNeverPlay;
		bool    bIgnoreSystemVolume;
		bool    bGaplessPlayback;
		int		IntroScanTime;
		int		MaxVisibleTracks;
		int		FadingTime;
	}	Player;
	struct
	{
		bool			bShowFileAsTitle;
		bool			bUnloadModules;
		int				Frequency;
		int				FreqMultiply;
		unsigned int	Balance;
		int				StereoSeparation;
		bool			bInterpol;
		bool			bVolumeRamping;
		ELoadAction		DoubleClickAction;
		ELoadAction		DropOnIconBarAction;
		ELoadAction		DropOnPlayerAction;
		bool			bAutoOpenPlaylist;
		bool			bAutoEnableProgram;
		unsigned int	DMASize;
	}	Music_Files;
	struct
	{
		struct
		{
			int	BufferSize; /* in KBs */
		}	AMPlayer;
		struct
		{
			bool	bSendQuery;
			bool	bAllowRemote;
			bool	bShowQuery;
			char*	pPath;
		}	CDDB;
		struct
		{
			int		NudgeSize[8];
			int		PlayMode[8];
			int		PollingDelay;
			bool	bHideDriveNumber;
			bool	bAutoStart;
		}	CDFS;
		struct
		{
			int		InputBufferSize; /* in KBs */
			int		OutputBufferSize; /* in KBs */
			bool	bFreeVolume;
			bool	bEnableInterrupts;
		}	DiskSample;
		struct
		{
			int		BufferSize; /* in KBs */
			bool	bInterpretUnknown;
			int		Format;
			int		Frequency;
			int		Channels;
		}	PlayIt;
		struct
		{
			bool	bIgnoreLastPatternLoops;
			bool	bIgnoreRestartPos;
			bool	bIgnoreSequenceEndMarkers;
			bool	bIgnoreChannelMutingFlags;
			bool	bFreeVolume;
			bool	bEnableInterrupts;
			int		Polyphony;
		}	TimPlayer;
	}	Drivers;
	struct
	{
		EqualizerParams	Params;
		const char*		Name;
		bool			bActive;
	}	Equalizer;
	struct
	{
		int	Select[3];
		int	Adjust[3];
	}		Iconbar;
	struct
	{
		bool	bAutoStart;
		bool	bRescaleWithTrackVolume;
		bool	bDesktop;
		const char*	pDesktop;
		const char*	pFullScreen;
	}	PlugIns;
	struct
	{
		SamplerParams	Params[10];
		int				Count;
		bool			bForceDriverConfig;
	}	Samplers;
	struct
	{
		int		MaxPoints;
	}	PlayLists;
	struct
	{
		bool	bUseProxy;
		const char*	ProxyUrl;
		bool	bIcyMetadata;
		bool	bAudiocastMetadata;
		int		AudiocastPort;
		int		Reserve;
		int     BandRates[4];
	}	Internet;
} COptions;

const COptions* Options(void);
void throw_Options_Options(COptions*);
void throw_Options_CopyOptions(COptions*, const COptions* pcopy);
void Options_NotOptions(COptions*);
void Options_Load(COptions*);
void Options_Save(const COptions*);

int Quality_FromFrequency(int freq);
int FreqIndex_FromFrequency(int freq);
int Options_MixFrequency(const COptions* This, int input_freq);

extern const char* EquWriteStyles;

#endif
