/*!
 	@file
 	@brief	それぞれの形式にあるファイルをＰＣＭに変換するインターフェース
 */

#ifndef CSoundDecoder_h
#define CSoundDecoder_h 

#include"../../../Setup/CompileMode.h"
#include"../../../auxiliary/mstring.h"

#include<boost/smart_ptr.hpp>

namespace Maid
{
	/*!
	 	@class	ISoundDecoder CSoundDecoder.h
	 	@brief	サウンドファイルの基本クラス
	\n			このクラスを継承して行きます
	 */

	class ISoundDecoder
	{
	public:

		virtual ~ISoundDecoder(){}	//!<	デストラクタ

		//! ファイルのオープン
		/*!
			@param	FileName	[i ]	読み込むファイル名
		 */
		virtual void Open( const mstring& FileName ) = 0;

		//! デコードする
		/*!
		 	@param	pDst	[i ]	書き込まれるバッファ
		 	@param	dwSize	[i ]	書き込む量（バイト単位）
		 
		 	@return 実際にデコードした量（バイト単位）
		 */
		virtual int	Read( void* pDst, int Size )=0;

		enum POSITION
		{
			BEGIN,		//!<	ファイルの先頭から
			END,		//!<	ファイルの終端から
			CURRENT,	//!<	現在の位置から
		};

		//! デコード開始位置を移動する
		/*!
		 	@param	Offset	[i ]	新しい位置（バイト単位）
		 	@param	ePos	[i ]	どの位置から移動を開始するか？
		 */
		virtual void SetPosition( int Offset, POSITION Pos )=0;

		//! 読み込んだファイルの解放
		/*!
		 */
		virtual void Close()=0;

		//! 現在の位置の取得
		/*!
		 	@return 現在の位置（バイト単位）
		 */
		virtual int GetPosition()			const= 0;

		//! コンバート後のファイルの長さを取得する（バイト単位単位）
		/*!
		 	@return ファイルの長さ（バイト単位）
		 */
		virtual int GetLength()			const= 0;

		//! １秒あたり何サンプルあるかの取得
		/*!
		 	@return 周波数
		 */
		virtual int GetSamplesPerSec()	const= 0;

		//! チャンネル数(mono,stereo 等)の取得
		/*!
		 	@return チャンネル数
		 */
		virtual int GetChannels()		const= 0;

		//! １サンプルあたりに使用しているビット量の取得
		/*!
		 	@return ビット数
		 */
		virtual int GetBitsPerSamples()	const= 0;

		//! １ブロックあたりに使用しているバイト量の取得
		/*!
			ブロックとは 1サンプルがチャンネル数分並んでいる単位です

		 	@return バイト量
		 */
		int GetBytePerBlock()	const
		{
			return GetChannels()*GetBitsPerSamples()/8;
		}
	};

	typedef boost::shared_ptr<ISoundDecoder> SPSOUNDDECODER;
}

#endif