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

#ifndef IUISOUNDSYSTEM_H
#define IUISOUNDSYSTEM_H

#ifdef _WIN32
#pragma once
#endif

#if !defined( SOURCE2_PANORAMA )
#include "audio/iaudiointerface.h"
#endif

#ifdef SUPPORTS_AUDIO
class IAudioOutputStream;
#endif

namespace panorama
{

typedef void * HAUDIOSAMPLE;

//
// Interface that handles sound
//
class IUISoundSystem
{
public:
	virtual ~IUISoundSystem() {}

	// Play a sound referenced by name.
	// flVolume should be 0.0 to 1.0, 0.5 would equal -10DB. volume is modulated by the mixer volume for the specified sound type.
	// flVolumePan sets the position on mono samples, or panning on stereo, 0.0 is full left, 1.0 is full right, 0.5 is no attenuation.
	// flRepeats sets the number of times to repeat the sound, 0.0f will result in infinite
	virtual HAUDIOSAMPLE PlaySound( const char *pchSoundName, ESoundType soundType,
		float flVolume = 1.0f, float flVolumePan = 0.5f, float flRepeats = 1.0f ) = 0;

	// Set the base volume / panning for the sound sample
	virtual void SetSoundSampleVolumePan( HAUDIOSAMPLE hSample, float flVolume, float flVolumePan ) = 0;

	// Fade out the sound sample and stop it 
	virtual void FadeOutAndStopSoundSample( HAUDIOSAMPLE hSample, float flFadeOutSeconds ) = 0;

	// Set a volume ramp that will change the volume of the sample smoothly, note that this acts as a filter and scales the volume from
	// the base set when playing or with SetSoundSampleVolumePan, the base is not actually modified and still must be set as audible for
	// this ramp to have any impact.
	virtual void VolumeRampSoundSample( HAUDIOSAMPLE hSample, float flVolumeTarget, float flTransitionSeconds ) = 0;

	// retrieves the user-specified sound volume for the specified sound type.
	//
	// Normally you don't need to use this as PlaySound auto-applies the right volume;
	// but it is needed on raw audio streams created with CreateAudioOutputStream.
	//
	// The value returned here honors the muted state.
	virtual float GetSoundVolume( ESoundType soundType ) = 0;

	// here you can set the volume for the specified sound type programmatically
	virtual void SetSoundVolume( ESoundType soundType, float flVolume ) = 0;

	// and you can set a global mute state
	virtual void SetSoundMuted( bool bMute ) = 0;

#ifdef SUPPORTS_AUDIO
	virtual IAudioOutputStream *CreateAudioOutputStream( int nRate, int nChannels, int nBits ) = 0;
	virtual void FreeAudioOutputStream( IAudioOutputStream *pStream ) = 0;
#endif

	// Push that the system now requires a larger mix ahead buffer to prevent skipping, "large" is somewhat undefined
	// at this level, but you are trading off latency on sounds beginning to get a bigger buffer pre-mixed by miles
	// to avoid skipping/stuttering.
	virtual void PushAudioBigMixAheadBuffer() = 0;

	// Pop that the system now requires a larger mix ahead buffer to prevent skipping, "large" is somewhat undefined
	// at this level, but you are trading off latency on sounds beginning to get a bigger buffer pre-mixed by miles
	// to avoid skipping/stuttering.  Popping moves back towards the lower latency setup once nothing needs the no-skipping
	// larger buffer setup.
	virtual void PopAudioBigMixAheadBuffer() = 0;

	// Give time to audio service
	virtual void ServiceAudio() = 0;

	// Consider pausing audio based on the last time audio was started. Used when the app loses focus.
	virtual void ConsiderPausingAudio() = 0;
};

} // namespace panorama

#endif // IUISOUNDSYSTEM_H