#ifndef __mixer_hpp__
#define __mixer_hpp__

#include "waveformfile.hpp"

class JFAudMixerChannel {
private:
protected:
	void (*stopcallback)(int);
	int stopcallbackid;
public:
	typedef enum {
		FilterNearest = 0,
		FilterLinear  = 1,
		Filter4Point  = 2,
	} Filter;

	typedef enum {
		DistanceModelInverse = 0,
		DistanceModelLinear = 1,
	} DistanceModel;

	JFAudMixerChannel();
	virtual ~JFAudMixerChannel();

	virtual bool SetMedia(WaveformFile *) = 0;
		// The waveform file becomes the property of the channel
		// if it was successfully attached, and should be deleted
		// in the destructor or if another file is attached.
	virtual bool SetStopCallback( void (*cb)(int), int id);
		// If this function is passed a non-NULL cb, the function will be
		// called passing 'id' when the sound stops playing.
	virtual bool SetFilter(Filter which);
	virtual bool SetDistanceModel(DistanceModel which);
	
	virtual bool Play(void) = 0;
	virtual bool Pause(void) = 0;
	virtual bool Update(void) = 0;
	virtual bool IsPlaying(void) const = 0;
	virtual bool IsPaused(void) const = 0;
	virtual bool IsStopped(void) const = 0;

	virtual bool SetGain(float gain) = 0;
	virtual bool SetPitch(float pitch) = 0;
	virtual bool SetPosition(float x, float y, float z) = 0;
	virtual bool SetVelocity(float x, float y, float z) = 0;
	virtual bool SetDirection(float x, float y, float z) = 0;
	virtual bool SetRefDist(float refdist) = 0;
	virtual bool SetMaxDist(float maxdist) = 0;
	virtual bool SetRolloff(float rolloff) = 0;
	virtual bool SetLoop(bool onf) = 0;
	virtual bool SetFollowListener(bool onf) = 0;
	
	virtual float GetGain(void) const = 0;
	virtual float GetPitch(void) const = 0;
	virtual void  GetPosition(float *x, float *y, float *z) const = 0;
	virtual void  GetVelocity(float *x, float *y, float *z) const = 0;
	virtual void  GetDirection(float *x, float *y, float *z) const = 0;
	virtual float GetRefDist(void) const = 0;
	virtual float GetMaxDist(void) const = 0;
	virtual float GetRolloff(void) const = 0;
	virtual bool  GetLoop(void) const = 0;
	virtual bool  GetFollowListener(void) const = 0;
};

class JFAudMixer {
private:
protected:
public:
	JFAudMixer() { }
	virtual ~JFAudMixer() { }

	virtual JFAudMixerChannel *AcquireChannel(void) = 0;
	virtual bool ReleaseChannel(JFAudMixerChannel *) = 0;

	virtual bool Update() = 0;

	virtual bool SetListenerPosition(float x, float y, float z) = 0;
	virtual bool SetListenerOrientation(float atx, float aty, float atz, float upx, float upy, float upz) = 0;
	virtual bool SetListenerVelocity(float x, float y, float z) = 0;
	virtual bool SetListenerGain(float gain) = 0;

	virtual void  GetListenerPosition(float *x, float *y, float *z) const = 0;
	virtual void  GetListenerOrientation(float *atx, float *aty, float *atz, float *upx, float *upy, float *upz) const = 0;
	virtual void  GetListenerVelocity(float *x, float *y, float *z) const = 0;
	virtual float GetListenerGain(void) const = 0;
};

#endif
