cAudioSource.h
00001
00002
00003
00004
00005 #ifndef CAUDIOSOURCE_H_INCLUDED
00006 #define CAUDIOSOURCE_H_INCLUDED
00007 #include <list>
00008 #include <string>
00009 #include <vector>
00010 #include <AL/al.h>
00011 #include <AL/alc.h>
00012
00013 #include "../include/IAudioSource.h"
00014 #include "../include/cVector3.h"
00015 #include "../Headers/cMutex.h"
00016 #include "../include/ILogger.h"
00017 #include "../Headers/cEFXFunctions.h"
00018
00019 namespace cAudio
00020 {
00021
00022 class cAudioSource : public IAudioSource
00023 {
00024 public:
00025
00026 enum Events{
00027 ON_UPDATE,
00028 ON_RELEASE,
00029 ON_PLAY,
00030 ON_PAUSE,
00031 ON_STOP,
00032 };
00033
00034 #ifdef CAUDIO_EFX_ENABLED
00035 cAudioSource(IAudioDecoder* decoder, ALCcontext* context, cEFXFunctions* oALFunctions);
00036 #else
00037 cAudioSource(IAudioDecoder* decoder, ALCcontext* context);
00038 #endif
00039 ~cAudioSource();
00040
00041 virtual bool play();
00042 virtual bool play2d(const bool& toLoop = false);
00043 virtual bool play3d(const cVector3& position, const float& soundstr = 1.0 , const bool& toLoop = false);
00044
00045 virtual void pause();
00046 virtual void stop();
00047 virtual void loop(const bool& toLoop);
00048 virtual bool seek(const float& seconds, bool relative = false);
00049
00050 virtual float getTotalAudioTime();
00051 virtual int getTotalAudioSize();
00052 virtual int getCompressedAudioSize();
00053
00054 virtual float getCurrentAudioTime();
00055 virtual int getCurrentAudioPosition();
00056 virtual int getCurrentCompressedAudioPosition();
00057
00058 virtual bool update();
00059 virtual void release();
00060
00061 virtual const bool isValid() const;
00062 virtual const bool isPlaying() const;
00063 virtual const bool isPaused() const;
00064 virtual const bool isStopped() const;
00065 virtual const bool isLooping() const;
00066
00067 virtual void setPosition(const cVector3& position);
00068 virtual void setVelocity(const cVector3& velocity);
00069 virtual void setDirection(const cVector3& direction);
00070
00071 virtual void setRolloffFactor(const float& rolloff);
00072 virtual void setStrength(const float& soundstrength);
00073 virtual void setMinDistance(const float& minDistance);
00074 virtual void setMaxDistance(const float& maxDistance);
00075
00076 virtual void setPitch(const float& pitch);
00077 virtual void setVolume(const float& volume);
00078 virtual void setMinVolume(const float& minVolume);
00079 virtual void setMaxVolume(const float& maxVolume);
00080
00081 virtual void setInnerConeAngle(const float& innerAngle);
00082 virtual void setOuterConeAngle(const float& outerAngle);
00083 virtual void setOuterConeVolume(const float& outerVolume);
00084
00085 virtual void setDopplerStrength(const float& dstrength);
00086 virtual void setDopplerVelocity(const cVector3& dvelocity);
00087
00088 virtual void move(const cVector3& position);
00089
00090 virtual const cVector3 getPosition() const;
00091 virtual const cVector3 getVelocity() const;
00092 virtual const cVector3 getDirection() const;
00093
00094 virtual const float getRolloffFactor() const;
00095 virtual const float getStrength() const;
00096 virtual const float getMinDistance() const;
00097 virtual const float getMaxDistance() const;
00098
00099 virtual const float getPitch() const;
00100 virtual const float getVolume() const;
00101 virtual const float getMinVolume() const;
00102 virtual const float getMaxVolume() const;
00103
00104 virtual const float getInnerConeAngle() const;
00105 virtual const float getOuterConeAngle() const;
00106 virtual const float getOuterConeVolume() const;
00107
00108 virtual const float getDopplerStrength() const;
00109 virtual const cVector3 getDopplerVelocity() const;
00110
00111 virtual void registerEventHandler(ISourceEventHandler* handler);
00112 virtual void unRegisterEventHandler(ISourceEventHandler* handler);
00113 virtual void unRegisterAllEventHandlers();
00114
00115 #ifdef CAUDIO_EFX_ENABLED
00116 virtual unsigned int getNumEffectSlotsAvailable() const;
00117 virtual bool attachEffect(unsigned int slot, IEffect* effect);
00118 virtual void removeEffect(unsigned int slot);
00119
00120 virtual bool attachFilter(IFilter* filter);
00121 virtual void removeFilter();
00122 #endif
00123
00124 protected:
00125 private:
00127 cAudioMutex Mutex;
00129 void empty();
00131 bool checkError();
00133 bool stream(ALuint buffer);
00135 void signalEvent(Events sevent);
00137 ALenum convertAudioFormatEnum(AudioFormats format);
00138
00140 ALCcontext* Context;
00141
00143 ALuint Buffers[CAUDIO_SOURCE_NUM_BUFFERS];
00145 ALuint Source;
00146
00147 ALenum oldState;
00149 IAudioDecoder* Decoder;
00150
00152 bool Loop;
00154 bool Valid;
00155
00157 std::list<ISourceEventHandler*> eventHandlerList;
00158
00159 #ifdef CAUDIO_EFX_ENABLED
00161 cEFXFunctions* EFX;
00163 void updateFilter(bool remove = false);
00165 void updateEffect(unsigned int slot, bool remove = false);
00166
00168 IEffect* Effects[CAUDIO_SOURCE_MAX_EFFECT_SLOTS];
00170 unsigned int LastEffectTimeStamp[CAUDIO_SOURCE_MAX_EFFECT_SLOTS];
00171
00173 IFilter* Filter;
00175 unsigned int LastFilterTimeStamp;
00176
00178 unsigned int EffectSlotsAvailable;
00179 #endif
00180 };
00181 };
00182 #endif