#ifndef SOUND_H
#define SOUND_H
#pragma once

class CAudioMixer;

class CAudioInput
{
public:
	// factory to create a suitable audio input for this system
	static CAudioInput *Create( void );

	// base class needs virtual destructor
	virtual ~CAudioInput( void ) {}

	// ------------------- interface ------------------------

	// Returns the current count of available samples
	virtual int SampleCount( void ) = 0;
	
	// returns the size of each sample in bytes
	virtual int SampleSize( void ) = 0;
	
	// returns the sampling rate of the data
	virtual int SampleRate( void ) = 0;

	// returns a pointer to the available data
	virtual void *SampleData( void ) = 0;

	// release the available data (mark as done)
	virtual void SampleRelease( void ) = 0;

	// returns the mono/stereo status of this device (true if stereo)
	virtual bool IsStereo( void ) = 0;

	// begin sampling
	virtual void Start( void ) = 0;

	// stop sampling
	virtual void Stop( void ) = 0;
};

class CAudioSource;

class CAudioOutput
{
public:
	// factory to create a suitable audio output for this system
	static CAudioOutput *Create( void );

	// base class needs virtual destructor
	virtual ~CAudioOutput( void ) {}

	// ------------------- interface ------------------------

	// returns the size of each sample in bytes
	virtual int		SampleSize( void ) = 0;
	
	// returns the sampling rate of the data
	virtual int		SampleRate( void ) = 0;

	// returns the mono/stereo status of this device (true if stereo)
	virtual bool	IsStereo( void ) = 0;

	// move up to time (time is absolute)
	virtual void	Update( float dt ) = 0;

	virtual void	Flush( void ) = 0;

	// Hook up a filter to the input channel
	virtual void	AddSource( CAudioMixer *pSource ) = 0;

	virtual void	StopSounds( void ) = 0;

	virtual void	FreeChannel( int channel ) = 0;

	virtual int		FindSourceIndex( CAudioMixer *pSource ) = 0;

	virtual float	GetAmountofTimeAhead( void ) = 0;

	virtual int		GetNumberofSamplesAhead( void ) = 0;

	virtual CAudioMixer *GetMixerForSource( CAudioSource *pDevice ) = 0;
};


int AudioResample( void *pInput,	int inCount,	int inSize,		bool inStereo,	int inRate,
				    void *pOutput,	int outCount,	int outSize,	bool outStereo, int outRate );

#endif		// SOUND_H
