/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
////																					 ////
////																					 ////
////								   - WSound.cpp -   								 ////
////																					 ////
////																					 ////
////				Implémentation des fonctions SCOL de la librairie sonore			 ////
////									 Version  1.0									 ////
////																					 ////
////								  Hilaire Verschuere								 ////
////																					 ////
////																					 ////
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////


#include "../Basic/ZooWorld.h"

//-----------------------------------------------------------------------------
// Global variables
//-----------------------------------------------------------------------------
extern HSoundManager* pHSoundManager ;

//-----------------------------------------------------------------------------
// Name: WSound::WSound()
// Constructor
//-----------------------------------------------------------------------------
WSound::WSound( DWORD flag )
{
	pHSound		= NULL ;
	pHListener	= NULL ;
	pZSound		= NULL ;
	pZScene		= NULL ;
	volume		= INIT_VOLUME ;				
	pan			= INIT_PAN ;
	m_3dEnable	= false ;			
	this->flag	= DSBCAPS_CTRL | flag ;
}



//-----------------------------------------------------------------------------
// Name: WSound::WSound()
// Copy Constructor
//-----------------------------------------------------------------------------
WSound::WSound( const WSound &w )
{
	pHSound		= NULL ;
	pHListener	= NULL ;
	pZSound		= NULL ;
	pZScene		= NULL ;
	volume		= w.volume ;				
	pan			= w.pan ;		
	m_3dEnable	= false ;
	this->flag	= w.flag ;

	if( w.pHSound ) 
	{
		if( w.pHSound->WaveType ) load( new HWave( *(HWave*)(w.pHSound) ) ) ;
		if( w.pHSound->Mp3Type )  load( new HMp3( *(HMp3*)(w.pHSound) ) ) ;
		if( w.pHSound->DataType ) load( new HData( *(HData*)(w.pHSound) ) ) ;
	}
}




//-----------------------------------------------------------------------------
// Name: WSound::~WSound()
// Destructor
//-----------------------------------------------------------------------------
WSound::~WSound()
{
	SAFE_DELETE( pHSound ) ;
	SAFE_DELETE( pHListener ) ;
}






//-----------------------------------------------------------------------------
// Name: WSound::load()
// Load or reload a HSound
//-----------------------------------------------------------------------------
void WSound::load(HSound* pHSound)
{
	SAFE_DELETE( this->pHSound ) ;
	SAFE_DELETE( this->pHListener ) ;

	this->pHSound = pHSound ;
	pHSound->m_pWSound = this ;
}



//-----------------------------------------------------------------------------
// Name: WSound::load()
// Load or reload a Listener
//-----------------------------------------------------------------------------
void WSound::load(HListener* pHListener)
{
	SAFE_DELETE( this->pHSound ) ;
	SAFE_DELETE( this->pHListener ) ;

	this->pHListener = pHListener;
}



//-----------------------------------------------------------------------------
// Name: WSound::SetVolume()
// Desc: Set the volume for the sound
//       Volume should be give between 0 and 100
//-----------------------------------------------------------------------------
HRESULT	WSound::SetVolume( int volume )
{
	if( volume < 0 )  volume = 0 ;
	if( volume > 100) volume = 100 ;
		
	this->volume = volume ;

	int globalVolume = pHSoundManager->GetGlobalVolume() ;
	float vol = (float)(volume * globalVolume) / 10000.0 ;
	
	if( vol < 0.01 ) volume = -10000 ;
	else volume = (int)( 5000.0*log10( vol ) ) ;

	if( pHSound ) pHSound->m_pBuffer->SetVolume(volume) ;
	
	return S_OK ;
}


//-----------------------------------------------------------------------------
// Name: WSound::SetPan()
// Desc: Set the panoramic for the sound
//       Panoramic should be give between -100 and 100
//-----------------------------------------------------------------------------
HRESULT	WSound::SetPan( int pan )
{
	if     ( pan >  100 ) pan =  100 ;
	else if( pan < -100 ) pan = -100 ;

	this->pan = pan ;

	if( pHSound ) pHSound->m_pBuffer->SetPan( (long)(10000.0 * tanh( pan / 150.0 ) ) )  ;
	
	return S_OK ;
}