#ifndef AUDIOPLAYERENGINE_H_
#define AUDIOPLAYERENGINE_H_

#include <mdaaudiosampleplayer.h>



#include <audioeffectbase.h>
#include <audioeffectdata.h>
#include <maudioeffectobserver.h>

#include <BassBoostbase.h>
#include <BassBoostData.h>
#include <MBassBoostObserver.H>

#include <Loudnessbase.h>
#include <loudnessData.h>
#include <mloudnessObserver.h>

#include <stereowideningbase.h>
#include <stereowideningdata.h>
#include <mstereowideningObserver.h>
class CAudioPlayerEngine : public CBase,			
MMdaAudioPlayerCallback
{
public:
	static CAudioPlayerEngine* NewL();
	static CAudioPlayerEngine* NewLC();
	
public:
	void PlayFileL(const TDesC& aFile);
	void MapcInitComplete(TInt aError, const TTimeIntervalMicroSeconds& aDuration);
	void MapcPlayComplete(TInt aError);
	void ConstructL();
	virtual ~CAudioPlayerEngine();
	CAudioPlayerEngine();
	void StopFileL();
	void Cleanup();
	void PauseL();
	void PlayL();
	void SetVolume(TInt volume);
	void PlayPauseL();
	TReal iVolFactor;
	void Volume();
	TInt Control(TInt ant);
public:
	enum TState
	{
		EIdle,
			EPlayFilePrepare,
			EPlayFilePlaying,
			EPlayFilePause
	};
	
private:
	
public:
	TState iState;
	CMdaAudioPlayerUtility* iAudioPlayer;
};	



class CLoudnessEffect : public CBase,
						public MLoudnessObserver
{	
	
public:
	//From base class MAudioEffectObserver
	void EffectChanged( const CAudioEffect* aObservedEffect, TUint8 aEvent );
	
	static CLoudnessEffect* NewL(CMdaAudioPlayerUtility &iAudioPlayer,TBool aEnable=EFalse);
	~CLoudnessEffect();
	
public:
	void EnableEffect();
	void DisableEffect();
	
private:
	void ConstructL(CMdaAudioPlayerUtility &iAudioPlayer,TBool aEnable=EFalse);
	CLoudnessEffect();
	virtual void ApplyL();
	
private:
	CLoudness* iLoudnessEffect;
	TBool iEnable;
	//Why is this needed ???
	MAudioEffectObserver* iMAudioEffectObserver;
	CAudioPlayerEngine* iAudioPlayerEngine;
	//Why is this needed ???
	CAudioEffect* iAudioEffect;
	
};

class CBassEffect : public CBase,
					public MBassBoostObserver
{	
	
public:
	
	static CBassEffect* NewL(CMdaAudioPlayerUtility &iAudioPlayer,TBool aEnable=EFalse);
	~CBassEffect();
	//From base class MBassBoostObserver
	void EffectChanged( const CAudioEffect* aObservedEffect, TUint8 aEvent );
	void ApplyL();
	
public:
	void EnableEffect();
	void DisableEffect();
	
private:
	void ConstructL(CMdaAudioPlayerUtility &iAudioPlayer,TBool aEnable=EFalse);
	CBassEffect();
	
private:
	//The pointer to bass boost effect
	CBassBoost* iBassEffect;
	TBool iEnable;
	MAudioEffectObserver* iMAudioEffectObserver;
	CAudioPlayerEngine* iAudioPlayerEngine;
	//CAudioEffect* iAudioEffect;
public:
	//public data
	static const TUint KEnabled ;				// The effect is enabled.
	static const TUint KDisabled;				// The effect is disabled
	static const TUint KEnforced;				// The effect is enforced
	static const TUint KNotEnforced;			// The effect is not enforced
	static const TUint KLostUpdateRights;		// The effect has lost update rights
	static const TUint KGainedUpdateRights;		// The effect has gained update rights
	static const TUint KSpecificEffectBase;	// Offset to specific effect events
	
	
};

class CStereoEffect : public CBase,
public MStereoWideningObserver
{	
	
public:
	
	static CStereoEffect* NewL(CMdaAudioPlayerUtility &iAudioPlayer,TBool aEnable=EFalse);
	~CStereoEffect();
	virtual void ApplyL();
	//From Base class MAudioEffectObserver
	void EffectChanged( const CAudioEffect* aObservedEffect, TUint8 aEvent );
	
public:
	void EnableEffect();
	void DisableEffect();
	//Methods to get/configure the stereo widening effect
	TBool IsContinuousLevelSupported();
	void SetStereoWideningLevelL(TUint8 aLevel);
	TUint8 StereoWideningLevel();
	
private:
	void ConstructL(CMdaAudioPlayerUtility &iAudioPlayer,TBool aEnable=EFalse);
	CStereoEffect();
	
private:
	CStereoWidening* iStereoEffect;
	TBool aEnable;
	MAudioEffectObserver* iMAudioEffectObserver;
	CAudioPlayerEngine* iAudioPlayerEngine;
	CAudioEffect* iAudioEffect;
	
	static const TUint KEnabled ;				// The effect is enabled.
	static const TUint KDisabled;				// The effect is disabled
	static const TUint KEnforced;				// The effect is enforced
	static const TUint KNotEnforced;			// The effect is not enforced
	static const TUint KLostUpdateRights;		// The effect has lost update rights
	static const TUint KGainedUpdateRights;		// The effect has gained update rights
	static const TUint KSpecificEffectBase;	// Offset to specific effect events
};


#endif /*AUDIOPLAYERENGINE_H_*/
