//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Applicaton-level hooks for clients of the audio subsystem
//
// $NoKeywords: $
//=============================================================================//

#ifndef SOUNDSERVICE_H
#define SOUNDSERVICE_H

#if defined( _WIN32 )
#pragma once
#endif

class Vector;
class QAngle;
class CAudioSource;
typedef int SoundSource;
struct SpatializationInfo_t;
typedef void *FileNameHandle_t;
struct StartSoundParams_t;

#include "utlrbtree.h"

//-----------------------------------------------------------------------------
// Purpose: Services required by the audio system to function, this facade
//			defines the bridge between the audio code and higher level
//			systems.
//
//			Note that some of these currently suggest that certain
//			functionality would like to exist at a deeper layer so
//			systems like audio can take advantage of them
//			diectly (toml 05-02-02)
//-----------------------------------------------------------------------------

abstract_class ISoundServices
{
public:
	//---------------------------------
	// Allocate a block of memory that will be automatically
	// cleaned up on level change
	//---------------------------------
	virtual void *LevelAlloc( int nBytes, const char *pszTag ) = 0;

	//---------------------------------
	// Notification that someone called S_ExtraUpdate()
	//---------------------------------
	virtual void OnExtraUpdate() = 0;

	//---------------------------------
	// Return false if the entity doesn't exist or is out of the PVS, in which case the sound shouldn't be heard.
	//---------------------------------
	virtual bool GetSoundSpatialization( int entIndex, SpatializationInfo_t& info ) = 0;

	//---------------------------------
	// This is the client's clock, which follows the servers and thus isn't 100% smooth all the time (it is in single player)
	//---------------------------------
	virtual float GetClientTime() = 0;

	//---------------------------------
	// This is the engine's filtered timer, it's pretty smooth all the time
	//---------------------------------
	virtual float GetHostTime() = 0;

	//---------------------------------
	//---------------------------------
	virtual int GetViewEntity() = 0;

	//---------------------------------
	//---------------------------------
	virtual float GetHostFrametime() = 0;
	virtual void SetSoundFrametime( float realDt, float hostDt ) = 0;

	//---------------------------------
	//---------------------------------
	virtual int GetServerCount() = 0;

	//---------------------------------
	//---------------------------------
	virtual bool IsPlayer( SoundSource source ) = 0;

	//---------------------------------
	//---------------------------------
	virtual void OnChangeVoiceStatus( int entity, bool status) = 0;

	// Is the player fully connected (don't do DSP processing if not)
	virtual bool IsConnected() = 0;

	// Calls into client .dll with list of close caption tokens to construct a caption out of
	virtual void EmitSentenceCloseCaption( char const *tokenstream ) = 0;
	// Calls into client .dll with list of close caption tokens to construct a caption out of
	virtual void EmitCloseCaption( char const *captionname, float duration ) = 0;

	virtual char const *GetGameDir() = 0;

	// If the game is paused, certain audio will pause, too (anything with phoneme/sentence data for now)
	virtual bool	IsGamePaused() = 0;

	// If the game is not active, certain audio will pause
	virtual bool	IsGameActive() = 0;

	// restarts the sound system externally
	virtual void	RestartSoundSystem() = 0;

	virtual void	GetAllSoundFilesReferencedInReslists( CUtlRBTree< FileNameHandle_t, int >& list ) = 0;
	virtual void	GetAllManifestFiles( CUtlRBTree< FileNameHandle_t, int >& list ) = 0;
	virtual void	GetAllSoundFilesInManifest( CUtlRBTree< FileNameHandle_t, int >& list, char const *manifestfile ) = 0;

	virtual void	CacheBuildingStart() = 0;
	virtual void	CacheBuildingUpdateProgress( float percent, char const *cachefile ) = 0;
	virtual void	CacheBuildingFinish() = 0;

	// For building sound cache manifests
	virtual int			GetPrecachedSoundCount() = 0;
	virtual char const *GetPrecachedSound( int index ) = 0;

	virtual void		OnSoundStarted( int guid, StartSoundParams_t& params, char const *soundname  ) = 0;
	virtual void		OnSoundStopped( int guid, int soundsource, int channel, char const *soundname ) = 0;

	virtual bool		GetToolSpatialization( int iUserData, int guid, SpatializationInfo_t& info ) = 0;

#if defined( _XBOX )
	virtual bool		ShouldSuppressNonUISounds() = 0;
#endif

	virtual char const *GetUILanguage() = 0;
};

//-------------------------------------

extern ISoundServices *g_pSoundServices;

//=============================================================================

#endif // SOUNDSERVICE_H