// NeL - MMORPG Framework <http://dev.ryzom.com/projects/nel/>
// Copyright (C) 2010  Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.


#ifndef OV_SOUND_SYTEM_H
#define OV_SOUND_SYTEM_H


#include <nel/misc/types_nl.h>
#include <nel/misc/vector.h>
#include <string>
#include <set>

#include "nel/sound/sound_anim_manager.h"


namespace NLSOUND
{
	class UAudioMixer;
	class USource;
}

namespace NLMISC
{
	class CMatrix;
}

/// this class init the sound system used by the object viewer
class CSoundSystem
{
public:
	/// set the name of the file containing the sound bank
/*	static void addSoundBank(const std::string &soundBankFileName)
	{
		_SoundBanksFileName.insert(soundBankFileName);
	}
*/	/// set the name of the file containing the sample bank
	static void addSampleBank(const std::string &sampleBankFileName)
	{
		_SampleBanksFileName.insert(sampleBankFileName);
	}

	static void setSamplePath(std::string& path)		{ _SamplePath = NLMISC::CPath::standardizePath(path, true); }
	static void setPackedSheetPath(std::string& path)		{ _PackedSheetPath = NLMISC::CPath::standardizePath(path, true); }

	/** Init the sound system this also load the sound bank
	  * See setSoundBank
	  */
	static void initSoundSystem(void);

	/// release the sound system
	static void releaseSoundSystem(void);

	/// set the listener matrix.
	static void setListenerMatrix(const NLMISC::CMatrix &m);

	/// poll sound. Must be called periodically
	static void poll(void);

	// spawn a sound at the user position
	static void play(const std::string &soundName);
	// create a sound at the user position (don't spawn it)
	static NLSOUND::USource *create(const std::string &soundName);

	// get the audio mixer, or null if init failed
	static NLSOUND::UAudioMixer *getAudioMixer(void)	{ return _AudioMixer; }	

	/// Load the sound animation with the specified name
	static void loadAnimation(std::string& name)		{ _AnimManager->loadAnimation(name); }

	/// Start playing a sound animation. 
	static void playAnimation(std::string& name, float lastTime, float curTime, NLSOUND::CSoundContext &context);

	/// Update the sound animations. 
	//static void updateAnimations(float lastTime, float curTime)	{ _AnimManager->update(lastTime, curTime); };


	/// Returns a reference to the animation manager
	static NLSOUND::CSoundAnimManager* getSoundAnimManager()		{ return _AnimManager; }

private:
	static NLSOUND::UAudioMixer			*_AudioMixer;
//	static std::set<std::string>		_SoundBanksFileName;
	static std::set<std::string>		_SampleBanksFileName;
	static NLSOUND::CSoundAnimManager	*_AnimManager;
	//static sint							_AnimIndex;
	//static NLSOUND::TSoundAnimId		_CurrentAnimation;
	//static NLSOUND::TSoundAnimPlayId	_CurrentPlayback;
	static NLMISC::CVector				_Zero;
	static std::string					_SamplePath;
	static std::string					_PackedSheetPath;

};


#endif