/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
////																					 ////
////																					 ////
////								   - HListener.cpp -								 ////
////																					 ////
////																					 ////
////				Implémentation des fonctions SCOL de la librairie sonore			 ////
////									 Version  1.0									 ////
////																					 ////
////								  Hilaire Verschuere								 ////
////																					 ////
////																					 ////
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////


#include "../Basic/ZooScene.h"
DEFINE_HGUID(IID_IDirectSound3DListener, 0x279AFA84, 0x4981, 0x11CE, 0xA5, 0x21, 0x00, 0x20, 0xAF, 0x0B, 0xE5, 0x60);

/////////////////////////////////////////////////////////////////////////////////////////////
// Static variables
/////////////////////////////////////////////////////////////////////////////////////////////
LPDIRECTSOUND3DLISTENER HListener::m_pListener ;
ZScene* HListener::activeScene = NULL ;
extern HSoundManager* pHSoundManager ;


//-----------------------------------------------------------------------------
// Name: HListener::HListener()
//-----------------------------------------------------------------------------
HListener::HListener()
{
	if( !pHSoundManager ) { ERRMSG("!(pHSoundManager->GetDirectSound())") ; return ; }

	if(	!m_pListener )
	{
		DSBUFFERDESC		dsbdesc;
		LPDIRECTSOUNDBUFFER	pBuffer = NULL;

		// Obtain primary buffer, asking it for 3D control
		ZeroMemory( &dsbdesc, sizeof(DSBUFFERDESC) );
		dsbdesc.dwSize = sizeof(DSBUFFERDESC) ;
		dsbdesc.dwFlags = DSBCAPS_3D | DSBCAPS_PRIMARYBUFFER ;

		if( FAILED( pHSoundManager->GetDirectSound()->CreateSoundBuffer( &dsbdesc, &pBuffer, NULL ) ) )
		{
			ERRMSG("CreateSoundBuffer");
			return ;
		}

		if( FAILED( pBuffer->QueryInterface( IID_IDirectSound3DListener, (VOID**)&m_pListener ) ) )
		{
			SAFE_RELEASE( pBuffer ) ;
			ERRMSG("QueryInterface3D") ;
			return ;
		}

		// Release the primary buffer, since it is not need anymore
		SAFE_RELEASE( pBuffer );
	}	
}



//-----------------------------------------------------------------------------
// Name: HListener::~HListener()
//-----------------------------------------------------------------------------
HListener::~HListener()
{
}



//-----------------------------------------------------------------------------
// Name: HListener::~HListener()
//		 Set the active listener in the scene
//-----------------------------------------------------------------------------
void HListener::SetActive( ZScene* pZScene, ZSound* pZSound )
{
	if( activeScene != pZScene )
	{
		if( activeScene ) pHSoundManager->Set3dMode( pZScene ) ;
		activeScene = pZScene ;
	}
	pZScene->SetActiveListener( pZSound ) ;
}
