#pragma once

//! @file Mix/Sound/IManager.h
//! @brief サウンドマネージャーインターフェースインクルードファイル

#include "Mix/Reference.h"

namespace Mix{ namespace Sound{

	//! @class IManager
	//! @brief サウンドマネージャーインターフェース
	//! @note
	//! <ul>
	//! <li>シンプル</li><br>
	//! デコードされたメモリ上のサウンドファイルを再生します。<br>
	//! 効果音などの短い時間のものを再生するのに適しています。<br>
	//! また、コントローラー、エミッターともにクローンを作成することができます。<br>
	//! <li>ストリーミング</li><br>
	//! サウンドファイルを少しずつデコードしながら、再生します。<br>
	//! 曲などの長い時間のものを再生するのに適しています。<br>
	//! また、ストリーミングにはサウンドファイルを直接デコードする方法と、メモリ上のサウンドファイル( 圧縮されている状態 )をデコードする、二つの方法があり、
	//! 後者はコントローラー、エミッターともにクローンを作成することができます。<br>
	//! ※ 前者はクローンを作成することはできません
	//! </ul>
	class IManager : public Mix::Reference
	{
	protected:
		//! @brief デストラクタ
		virtual ~IManager( void ){}

	public:
		//! @name 2D サウンド
		//! @{

		//! @brief シンプルコントローラーを作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[out] ppController 作成したシンプルコントローラーを渡す Mix::Sound::IController インターフェースへのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean CreateSimpleController( const wchar_t* pFilePath, Mix::Sound::IController** ppController ) = 0;
		//! @brief シンプルコントローラーを作成します
		//! @param[in] pReader Mix::IO::IReader インターフェースのポインタ
		//! @param[out] ppController 作成したシンプルコントローラーを渡す Mix::Sound::IController インターフェースへのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note シンプルコントローラーの作成に成功した場合、pReader の参照カウンタを +1 します
		virtual Boolean CreateSimpleController( Mix::IO::IReader* pReader, Mix::Sound::IController** ppController ) = 0;

		//! @brief ストリーミングコントローラーを作成します
		//! @param[in] pFilePath ファイルパス
		//! @param[in] bBuffered ファイルをメモリに格納して再生する場合は True
		//! @param[out] ppController 作成したストリーミングコントローラーを渡す Mix::Sound::IController インターフェースへのポインタのアドレス
		//! @return 成功した場合は True を返します
		virtual Boolean CreateStreamingController( const wchar_t* pFilePath, Boolean bBuffered, Mix::Sound::IController** ppController ) = 0;
		//! @brief ストリーミングコントローラーを作成します
		//! @param[in] pReader Mix::IO::IReader インターフェースのポインタ
		//! @param[out] ppController ストリーミングコントローラーを渡す Mix::Sound::IController インターフェースへのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note ストリーミングコントローラーの作成に成功した場合、pReader の参照カウンタを +1 します
		virtual Boolean CreateStreamingController( Mix::IO::IReader* pReader, Mix::Sound::IController** ppController ) = 0;

		//! @}

		//! @name 3D サウンド
		//! @{

		//! @brief リスナーを作成します
		//! @param[in] localFront ローカルの前方を表す Mix::Vector3 クラス
		//! @param[in] localUp ローカルの上方を表す Mix::Vector3 クラス
		//! @param[out] ppListener 作成したリスナーを渡す Mix::Sound::IListener インターフェースのポインタのアドレス
		//! @param[in] pDebugName デバッグ名
		//! @return 作成に成功した場合は True を返します
		virtual Boolean CreateListener( const Mix::Vector3& localFront, const Mix::Vector3& localUp, Mix::Sound::IListener** ppListener, const wchar_t* pDebugName = NULL ) = 0;

		//! @brief シンプルエミッターを作成します
		//! @param[in] pListener リスナーを表す Mix::Sound::IListener インターフェースのポインタ
		//! @param[in] pFilePath ファイルパス
		//! @param[in] localFront ローカルの前方を表す Mix::Vector3 クラス
		//! @param[in] localUp ローカルの上方を表す Mix::Vector3 クラス
		//! @param[out] ppEmitter 作成したシンプルエミッターを渡す Mix::Sound::IEmitter インターフェースへのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note シンプルエミッターの作成に成功した場合、pListener の参照カウンタを +1 します
		virtual Boolean CreateSimpleEmitter( Mix::Sound::IListener* pListener, const wchar_t* pFilePath, const Mix::Vector3& localFront, const Mix::Vector3& localUp, Mix::Sound::IEmitter** ppEmitter ) = 0;
		//! @brief シンプルエミッターを作成します
		//! @param[in] pListener リスナーを表す Mix::Sound::IListener インターフェースのポインタ
		//! @param[in] pReader Mix::IO::IReader インターフェースのポインタ
		//! @param[in] localFront ローカルの前方を表す Mix::Vector3 クラス
		//! @param[in] localUp ローカルの上方を表す Mix::Vector3 クラス
		//! @param[out] ppEmitter 作成したシンプルエミッターを渡す Mix::Sound::IEmitter インターフェースへのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note シンプルエミッターの作成に成功した場合、pListener pReader の参照カウンタを +1 します
		virtual Boolean CreateSimpleEmitter( Mix::Sound::IListener* pListener, Mix::IO::IReader* pReader, const Mix::Vector3& localFront, const Mix::Vector3& localUp, Mix::Sound::IEmitter** ppEmitter ) = 0;

		//! @brief ストリーミングエミッターを作成します
		//! @param[in] pListener リスナーを表す Mix::Sound::IListener インターフェースのポインタ
		//! @param[in] pFilePath ファイルパス
		//! @param[in] bBuffered ファイルをメモリに格納して再生する場合は True
		//! @param[in] localFront ローカルの前方を表す Mix::Vector3 クラス
		//! @param[in] localUp ローカルの上方を表す Mix::Vector3 クラス
		//! @param[out] ppEmitter 作成したストリーミングエミッターを渡す Mix::Sound::IEmitter インターフェースへのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note ストリーミングエミッターの作成に成功した場合、pListener の参照カウンタを +1 します
		virtual Boolean CreateStreamingEmitter( Mix::Sound::IListener* pListener, const wchar_t* pFilePath, Boolean bBuffered, const Mix::Vector3& localFront, const Mix::Vector3& localUp, Mix::Sound::IEmitter** ppEmitter ) = 0;
		//! @brief ストリーミングエミッターを作成します
		//! @param[in] pListener リスナーを表す Mix::Sound::IListener インターフェースのポインタ
		//! @param[in] pReader Mix::IO::IReader インターフェースのポインタ
		//! @param[in] localFront ローカルの前方を表す Mix::Vector3 クラス
		//! @param[in] localUp ローカルの上方を表す Mix::Vector3 クラス
		//! @param[out] ppEmitter 作成したストリーミングエミッターを渡す Mix::Sound::IEmitter インターフェースへのポインタのアドレス
		//! @return 成功した場合は True を返します
		//! @note ストリーミングエミッターの作成に成功した場合、pListener pReader の参照カウンタを +1 します
		virtual Boolean CreateStreamingEmitter( Mix::Sound::IListener* pListener, Mix::IO::IReader* pReader, const Mix::Vector3& localFront, const Mix::Vector3& localUp, Mix::Sound::IEmitter** ppEmitter ) = 0;

		//! @}
	};

}}
