#ifndef CSoundCardDriver_h
#define CSoundCardDriver_h 

/*!
 	@file
 	@brief	サウンドドライバ
 */

#include"../../../Setup/CompileMode.h"
#include"../../../Auxiliary/mstring.h"
#include"../../../Storage/DefaultFunction/SoundFileLoader/CSoundDecoder.h"
#include"CSoundBuffer.h"
#include"CSoundBufferPCMStatic.h"
#include"CSoundBufferPCMStream.h"
#include<boost/smart_ptr.hpp>
#include<vector>

namespace Maid
{
	/*!
	 	\class	ISoundCardDriver CSoundCardDriver.h
	 	\brief	サウンドドライバクラス
	\n			サウンド関係のクラスはすべてこのクラスと関係がある
	 */
	class ISoundCardDriver
	{
	public:
		virtual ~ISoundCardDriver(){}	//!<	デストラクタ

		struct PCMBUFFERFORMAT
		{
			int	Channels;			//	チャンネル数
			int	SamplesPerSec;		//	１秒当たりのサンプル数
			int	BitsPerSample;		//	１サンプルあたりのビット数
		};

		//! ドライバの初期化
		/*!
		 	@param	Format	[i ]	プライマリバッファのフォーマット
		 */
		virtual void	Initialize( const PCMBUFFERFORMAT& Format )=0;


		//! 開放処理
		/*!
		*/
		virtual void	Finalize()=0;

		//! ドライバ情報を取得する
		/*!
		 	Initialize() を成功してあること
		 
		 	@return	SoundCaps	[ o]	出力された情報
		 */
		virtual mstring	DeviceCapsStringOut()const=0;



		//! サウンドバッファの作成
		/*!
		 	@return 作成されたサウンドバッファクラス
		 */
		virtual SPSOUNDBUFFERPCMSTATIC	CreateBufferPCMStatic( const MySTL::vector<unt08>& buf, const PCMBUFFERFORMAT& fmt )const=0;


		//! サウンドバッファの複製
		/*!
		 	複製バッファとは共有ポインタみたいにひとつのバッファを
		 	共有することによってメモリの節約を行う機能です
		 
		 	@param	pSrc	[i ]	複製元のバッファ
		 
		 	@return 複製されたサウンドバッファクラス
		 */
		virtual SPSOUNDBUFFERPCMSTATIC		DuplicateSoundBuffer( const ISoundBufferPCMStatic& pSrc )const=0;


		//! ストリームバッファの作成
		/*!
		 	@return 作成されたサウンドバッファクラス
		 */
		virtual SPSOUNDBUFFERPCMSTREAM	CreateBufferPCMStream( const SPSOUNDDECODER& pDecoder )const=0;


	};

	typedef boost::shared_ptr<ISoundCardDriver> SPSOUNDCARDDRIVER;
}
#endif
