#include"CSound.h"
#include"Core/CSoundObjectCore.h"

#include"CSoundObject.h"
#include"../auxiliary/Debug/CTrace.h"

namespace Maid
{
CSound*	GlobalPointer<CSound>::s_pPointer;


//! コンストラクタ
/*!
 */
CSound::CSound()
{
	GlobalPointer<CSound>::Set();
	m_GlobalVolume = CSoundObject::VOLUME_DEFAULT;
	m_IsMute = false;
}

//! デストラクタ
/*!
 */
CSound::~CSound()
{
	GlobalPointer<CSound>::Clear();
}




//! 初期化
/*!
 */
void CSound::Initialize()
{
	//	特になにもしない
}

//! 解放処理
/*!
 */
void CSound::Finalize()
{

}


//! サウンド全体のミュート
/*!
	@param	IsMute [i ]	true でミュート false で音が鳴る
 */
void CSound::SetGlobalMute( bool IsMute )
{
	m_IsMute = IsMute;
	VolumeUpdate();
}


//! サウンド全体がミュートになっているか？
/*!
	@return	true  ミュート中
\n			false 音が鳴る
 */
bool CSound::GetGlobalMute()
{
	return m_IsMute;
}



//! サウンド全体のボリュームの設定
/*!
	@param	vol [i ]	設定するボリューム( 最小0 - 10000 最大)
 */
void CSound::SetGlobalVolume( int vol )
{
	if( vol < VOLUME_MIN ) { vol = VOLUME_MIN; }
	if( VOLUME_MAX < vol ) { vol = VOLUME_MAX; }

	m_GlobalVolume = vol;
	VolumeUpdate();
}


//! サウンド全体のボリュームの取得
/*!
	@return	設定されているボリューム( 最小0 - 10000 最大)
 */
int  CSound::GetGlobalVolume()
{
	return m_GlobalVolume;
}



//! 管理するサウンドオブジェクトの追加
/*!
	ライブラリ側で処理されるので、ユーザーが使うことはない
 */
void CSound::AddSoundObject( CSoundObject* pObj )
{
	m_ObjectList.insert( pObj );
}

//! 管理するサウンドオブジェクトの削除
/*!
	ライブラリ側で処理されるので、ユーザーが使うことはない
 */
void CSound::DelSoundObject( CSoundObject* pObj )
{
	m_ObjectList.erase( pObj );
}


//! 管理しているサウンドオブジェクトのボリューム変更をする
/*!
	ライブラリ側で処理されるので、ユーザーが使うことはない
 */
void CSound::VolumeUpdate()
{
	for( OBJECTLIST::iterator ite=m_ObjectList.begin(); ite!=m_ObjectList.end(); ++ite )
	{
		CSoundObject* pObj = (*ite);
		if( pObj->IsNowLoading() ) { continue; }
		pObj->UpdateVolume(20);
	}
}


CSound::GLOBALINFO::GLOBALINFO()
	:Volume(5000),IsMute(false)
{
}

//! 各チャンネルのボリュームの設定
/*!
	@param	type [i ]	設定するチャンネル
	@param	vol  [i ]	設定するボリューム( 最小0 - 10000 最大)
 */
void CSound::SetVolume( int type, int vol )
{
	if( vol < VOLUME_MIN ) { vol = VOLUME_MIN; }
	if( VOLUME_MAX < vol ) { vol = VOLUME_MAX; }

	m_GlobalInfo[type].Volume = vol;

	VolumeUpdate();
}


//! 各チャンネルのミュートの設定
/*!
	@param	type   [i ]	設定するチャンネル
	@param	IsMute [i ]	true でミュート。 false で音が鳴る
 */
void CSound::SetMute( int type, bool IsMute )
{
	m_GlobalInfo[type].IsMute = IsMute;
	VolumeUpdate();
}

//! 各チャンネルのボリュームの取得
/*!
	@param	type [i ]	取得したいチャンネル

	@return	設定されているボリューム( 最小0 - 10000 最大)
 */
int  CSound::GetVolume( int type )
{
	return m_GlobalInfo[type].Volume;
}

//! 各チャンネルのミュート状態の取得
/*!
	@param	type [i ]	取得したいチャンネル

	@return	true  ミュート中
\n			false 音が鳴る
 */
bool CSound::IsMute( int type )
{
	return m_GlobalInfo[type].IsMute;
}


void CSound::PauseAll()
{
	for( OBJECTLIST::iterator ite=m_ObjectList.begin(); ite!=m_ObjectList.end(); ++ite )
	{
		CSoundObject* pObj = (*ite);
		pObj->Pause();
	}
}

void CSound::ResumeAll()
{
	for( OBJECTLIST::iterator ite=m_ObjectList.begin(); ite!=m_ObjectList.end(); ++ite )
	{
		CSoundObject* pObj = (*ite);
		pObj->UpdateVolume(0);
		pObj->Resume();
	}
}


void CSound::SendDeviceCaps()
{
	GlobalPointer<CSoundCore>::Get()->SendDeviceCaps();
}

mstring CSound::GetDeviceCaps()
{
	return GlobalPointer<CSoundCore>::Get()->GetDeviceCaps();
}

}