//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//          
//
// $NoKeywords: $
//=============================================================================//

#ifndef VOICE_SOUND_ENGINE_INTERFACE_H
#define VOICE_SOUND_ENGINE_INTERFACE_H
#pragma once


/*! @defgroup VoiceSoundEngineInterface VoiceSoundEngineInterface
Abstracts out the sound engine for the voice code.
GoldSrc and Src each have a different implementation of this.
@{
*/



//! Max number of receiving voice channels.
#define VOICE_NUM_CHANNELS			5	

// ----------------------------------------------------------------------------- //
// Functions for voice.cpp.
// ----------------------------------------------------------------------------- //

//! Initialize the sound engine interface.
bool VoiceSE_Init();	

//! Shutdown the sound engine interface.
void VoiceSE_Term();	

//! Called each frame.
void VoiceSE_Idle(float frametime);


//! Start audio playback on the specified voice channel.
//! Voice_GetChannelAudio is called by the mixer for each active channel.
int VoiceSE_StartChannel(
	//! Which channel to start.
	int iChannel,
	int iEntity,
	bool bProximity,
	int nViewEntityIndex
	);

//! Stop audio playback on the specified voice channel.
void VoiceSE_EndChannel(
	//! Which channel to stop.
	int iChannel,
	int iEntity
	);

//! Starts the voice overdrive (lowers volume of all sounds other than voice).
void VoiceSE_StartOverdrive();
void VoiceSE_EndOverdrive();

//! Control mouth movement for an entity.
void VoiceSE_InitMouth(int entnum);
void VoiceSE_CloseMouth(int entnum);
void VoiceSE_MoveMouth(int entnum, short *pSamples, int nSamples);


// ----------------------------------------------------------------------------- //
// Functions for voice.cpp to implement.
// ----------------------------------------------------------------------------- //

//! This function is implemented in voice.cpp. Gives 16-bit signed mono samples to the mixer.
//! \return Number of samples actually gotten.
int Voice_GetOutputData(
	//! The voice channel it wants samples from.
	const int iChannel,			
	//! The buffer to copy the samples into.
	char *copyBuf,				
	//! Maximum size of copyBuf.
	const int copyBufSize,		
	//! Which sample to start at.
	const int samplePosition,	
	//! How many samples to get.
	const int sampleCount		
	);

// This is called when an audio source is deleted by the sound engine. The voice could
// should detach whatever it needs to in order to free up the specified channel.
void Voice_OnAudioSourceShutdown( int iChannel );


// ----------------------------------------------------------------------------- //
// Functions for the sound engine.
// ----------------------------------------------------------------------------- //

class CAudioSource;
CAudioSource* Voice_SetupAudioSource( int soundsource, int entchannel );



/*! @} End VoiceSoundEngineInterface group */


#endif // VOICE_SOUND_ENGINE_INTERFACE_H