#ifndef SOUNDDESCRIPTOR_H
#define SOUNDDESCRIPTOR_H

#include <string>
#include <map>
using namespace std;
#include "Sound.h"


namespace SoundSystem
{
	// forward declaration
	class Sound;
	
	/**
	 * enumeration decrivante les differents type de descripteurs heritant de SoundDescriptor.
	 */
	enum DescriptorType
	{
		STREAM,
		SAMPLE,
	};
	/**
	 * classe definissant l'abstraction servant a decrire les differentes forme de son utiliser par le
	 * system de son (sample ou stream).
	 */
	class SoundDescriptor
	{
	protected:
		/**
		 * le chemin du son.
		 */
		string path;
		/**
		 * permet de savoir si le son a été chargé ou pas.
		 */
		bool loaded;

	public:
		/**
		 * constructeur par defaut.
		 */
		SoundDescriptor();

		/**
		 * desturcteur par defaut.
		 */
		virtual ~SoundDescriptor(void);

		/**
		 * methode chargeant un son en memoire.
		 *
		 * Un son doit etre chargé en memoire pour pouvoir etre joué. Neanmoins, lors de la methode play, si le
		 * son n'est pas chargé en memoire, il le sera afin d'assurer le succes de la methode.
		 *
		 * Cette methode peut par contre servire a pré-charger les son en memoire afin d'eviter les ralentissement lié 
		 * au chargement durant l'execution du programme.
		 */
		virtual void load(bool loop = false) = 0;

		/**
		 * methode servant a liberer les ressource alloué par le descripteur.
		 */
		virtual void free() = 0;

		/**
		 * methode servant a lancer le son.
		 *
		 * Cette methode ne doit etre appelée que si canPlay() est vrai.
		 *
		 * @return int : le numero du channel sur lequel est joué le son.
		 */
		virtual int play() = 0;

		/**
		 * methode permettant de savoir si le son peut etre joué ou pas. certains son comme les Stream ne peuvent etre
		 * joué qu'une seule fois en même temps, il est donc indispensable d'appeler cette methode avant de jouer un son.
		 *
		 * @return bool : true si le son peut etre joué, false sinon.
		 */
		virtual bool canPlay() = 0;

		/**
		 * definit le chemin du son. Ne doit pas etre appelé si le son est chargé en memoire (isLoaded() == true)
		 *
		 * @param path : le chemin du son
		 */
		void setPath(const string& path = "");

		/**
		 * retourne le chemin du son
		 *
		 * @return string : le chemin du son
		 */
		string getPath();

		/**
		 * methode permettant de savoir si un son est chargé en memoire ou pas .
		 *
		 * @return bool : true si le son est chargé en memoire, false sinon.
		 */
		bool isLoaded();

		/**
		 * retourne le type du descripteur
		 */
		virtual DescriptorType getType() = 0;
		
	};
}// namespace SoundSystem


#endif
