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

#ifndef IVAUDIO_H
#define IVAUDIO_H
#ifdef _WIN32
#pragma once
#endif

class IAudioStreamEvent
{
public:
	// called by the stream to request more data
	// seek the source to position "offset"
	// -1 indicates previous position
	// copy the data to pBuffer and return the number of bytes copied
	// you may return less than bytesRequested if the end of the stream
	// is encountered.
	virtual int StreamRequestData( void *pBuffer, int bytesRequested, int offset ) = 0;
};


class IAudioStream
{
public:
	virtual ~IAudioStream() {}

	// Decode another bufferSize output bytes from the stream
	// returns number of bytes decoded
	virtual int	Decode( void *pBuffer, unsigned int bufferSize ) = 0;

	// output sampling bits (8/16)
	virtual int GetOutputBits() = 0;
	// output sampling rate in Hz
	virtual int GetOutputRate() = 0;
	// output channels (1=mono,2=stereo)
	virtual int GetOutputChannels() = 0;

	// seek
	virtual unsigned int GetPosition() = 0;

	// NOTE: BUGBUG: Only supports seeking forward currently!
	virtual void SetPosition( unsigned int position ) = 0;

	// reset?
};


#define VAUDIO_INTERFACE_VERSION		"VAudio002"
class IVAudio
{
public:
	virtual ~IVAudio() {}

	virtual IAudioStream	*CreateMP3StreamDecoder( IAudioStreamEvent *pEventHandler ) = 0;
	virtual void			DestroyMP3StreamDecoder( IAudioStream *pDecoder ) = 0;
};


#endif // IVAUDIO_H