caudio/cAudio/Headers/cAudioSource.h
Murat Suri cf79cb7dc1 * Now its possible to drop a cAudioSource which takes then care of releasing itself.
-- The user can call IAudioManager::release with an cAudioSource but its also possible just to call drop on the AudioSource until true is returned and the AudioSource will be removed from the IAudioManager and deleted.
2011-06-12 21:57:42 +00:00

185 lines
5.8 KiB
C++

// Copyright (c) 2008-2011 Raynaldo (Wildicv) Rivera, Joshua (Dark_Kilauea) Jones, Murat (wolfmanfx) Sari
// This file is part of the "cAudio Engine"
// For conditions of distribution and use, see copyright notice in cAudio.h
#pragma once
#include <list>
#include <string>
#include <vector>
#include <al.h>
#include <alc.h>
#include "cMutex.h"
#include "cEFXFunctions.h"
#include "cMemoryOverride.h"
#include "IAudioSource.h"
#include "cVector3.h"
#include "ILogger.h"
#include "cSTLAllocator.h"
#include "IAudioDeviceContext.h"
namespace cAudio
{
class cAudioSource : public IAudioSource, public cMemoryOverride
{
public:
enum Events{
ON_UPDATE,
ON_RELEASE,
ON_PLAY,
ON_PAUSE,
ON_STOP,
};
#if CAUDIO_EFX_ENABLED == 1
cAudioSource(IAudioDecoder* decoder, IAudioDeviceContext* context, cEFXFunctions* oALFunctions);
#else
cAudioSource(IAudioDecoder* decoder, IAudioDeviceContext* context);
#endif
~cAudioSource();
virtual bool play();
virtual bool play2d(const bool& toLoop = false);
virtual bool play3d(const cVector3& position, const float& soundstr = 1.0 , const bool& toLoop = false);
virtual void pause();
virtual void stop();
virtual void loop(const bool& toLoop);
virtual bool seek(const float& seconds, bool relative = false);
virtual float getTotalAudioTime();
virtual int getTotalAudioSize();
virtual int getCompressedAudioSize();
virtual float getCurrentAudioTime();
virtual int getCurrentAudioPosition();
virtual int getCurrentCompressedAudioPosition();
virtual bool update();
virtual const bool isValid() const;
virtual const bool isPlaying() const;
virtual const bool isPaused() const;
virtual const bool isStopped() const;
virtual const bool isLooping() const;
virtual void setPosition(const cVector3& position);
virtual void setVelocity(const cVector3& velocity);
virtual void setDirection(const cVector3& direction);
virtual void setRolloffFactor(const float& rolloff);
virtual void setStrength(const float& soundstrength);
virtual void setMinDistance(const float& minDistance);
virtual void setMaxDistance(const float& maxDistance);
virtual void setPitch(const float& pitch);
virtual void setVolume(const float& volume);
virtual void setMinVolume(const float& minVolume);
virtual void setMaxVolume(const float& maxVolume);
virtual void setInnerConeAngle(const float& innerAngle);
virtual void setOuterConeAngle(const float& outerAngle);
virtual void setOuterConeVolume(const float& outerVolume);
virtual void setDopplerStrength(const float& dstrength);
virtual void setDopplerVelocity(const cVector3& dvelocity);
virtual void move(const cVector3& position);
virtual const cVector3 getPosition() const;
virtual const cVector3 getVelocity() const;
virtual const cVector3 getDirection() const;
virtual const float getRolloffFactor() const;
virtual const float getStrength() const;
virtual const float getMinDistance() const;
virtual const float getMaxDistance() const;
virtual const float getPitch() const;
virtual const float getVolume() const;
virtual const float getMinVolume() const;
virtual const float getMaxVolume() const;
virtual const float getInnerConeAngle() const;
virtual const float getOuterConeAngle() const;
virtual const float getOuterConeVolume() const;
virtual const float getDopplerStrength() const;
virtual const cVector3 getDopplerVelocity() const;
virtual void registerEventHandler(ISourceEventHandler* handler);
virtual void unRegisterEventHandler(ISourceEventHandler* handler);
virtual void unRegisterAllEventHandlers();
virtual bool drop(); //! Override the default behavior
#if CAUDIO_EFX_ENABLED == 1
virtual unsigned int getNumEffectSlotsAvailable() const;
virtual bool attachEffect(unsigned int slot, IEffect* effect);
virtual void removeEffect(unsigned int slot);
virtual bool attachFilter(IFilter* filter);
virtual void removeFilter();
#endif
private:
//! Mutex for thread synchronization
cAudioMutex Mutex;
//! Empties the current working buffer queue
void empty();
//! Checks for OpenAL errors and reports them
bool checkError() const;
//! Streams audio data from the decoder into a buffer
bool stream(ALuint buffer);
//! Signals a event to all event handlers
void signalEvent(Events sevent);
//! Converts our audio format enum to OpenAL's
ALenum convertAudioFormatEnum(AudioFormats format);
//! The context that owns this source
IAudioDeviceContext* Context;
//! Internal audio buffers
ALuint Buffers[CAUDIO_SOURCE_NUM_BUFFERS];
//! OpenAL source
ALuint Source;
ALenum oldState;
//! cAudio decoder being used to stream data
IAudioDecoder* Decoder;
//! Stores whether the source is to loop the audio stream
bool Loop;
//! Stores whether the source is ready to be used
bool Valid;
//! List of registered event handlers
cAudioList<ISourceEventHandler*>::Type eventHandlerList;
#if CAUDIO_EFX_ENABLED == 1
//! Holds pointers to all the EFX related functions
cEFXFunctions* EFX;
//! Updates the attached filter
void updateFilter(bool remove = false);
//! Updates the effect attached to a specific slot
void updateEffect(unsigned int slot, bool remove = false);
//! Stores the effects attached to this source
IEffect* Effects[CAUDIO_SOURCE_MAX_EFFECT_SLOTS];
//! Stores the last updated time stamps for the attached effects
unsigned int LastEffectTimeStamp[CAUDIO_SOURCE_MAX_EFFECT_SLOTS];
//! Stores the attached direct feed filter
IFilter* Filter;
//! Stores the last updated time stamp for the attached filter
unsigned int LastFilterTimeStamp;
//! Number of effects supported by the OpenAL Context
unsigned int EffectSlotsAvailable;
#endif
};
};