2#include "cAudioSource.h"
25 cAudioVector<char>::Type data(totalSize, 0);
28 unsigned errorcount = 0;
29 while (totalread < totalSize)
31 const int actualread = decoder->
readAudioData(&data[totalread], totalSize - totalread);
33 totalread += actualread;
34 }
else if (actualread < 0) {
36 getLogger()->
logDebug(
"Audio Buffer",
"Decoder returned an error: %i (%i of 3)", actualread, errorcount);
44 if (totalread != totalSize) {
48 alGenBuffers(1, &Buffer);
52 getLogger()->
logDebug(
"Audio Buffer",
"Buffered %d bytes of data into buffer %d at %d hz.", totalread, (
int)Buffer, (
int)freq);
53 alBufferData(Buffer, format, &data[0], data.size(), freq);
63 alDeleteBuffers(1, &Buffer);
67 bool isValid()
const {
return Valid; }
68 unsigned getBuffer()
const {
return Buffer; }
70 int getChannels()
const
73 alGetBufferi(Buffer, AL_CHANNELS, &channels);
77 int getTotalAudioSize()
const
80 alGetBufferi(Buffer, AL_SIZE, &size);
84 float getTotalAudioTime()
const {
return TotalTime; }
117 alSourcei(
Source, AL_BUFFER, Buffer->getBuffer());
134 oldState = AL_PLAYING;
140 alSourcei(
Source, AL_SOURCE_RELATIVE,
true);
141 alSourcei(
Source, AL_LOOPING, toLoop);
148 alSourcei(
Source, AL_SOURCE_RELATIVE,
false);
149 alSourcei(
Source, AL_LOOPING, toLoop);
162 oldState = AL_PAUSED;
172 oldState = AL_STOPPED;
177 alSourcei(
Source, AL_LOOPING, toLoop);
181 bool seek(
const float& seconds,
bool relative)
184 alSourcef(
Source, AL_SEC_OFFSET, start + seconds);
197 alGetSourcef(
Source, AL_SEC_OFFSET, &time);
204 alGetSourcei(
Source, AL_BYTE_OFFSET, &offset);
217 alGetSourcei(
Source, AL_SOURCE_STATE, &state);
219 if(state == AL_STOPPED && oldState != state)
225 return state != AL_STOPPED;
230 return Buffer ? Buffer->isValid() :
false;
235 ALint looping =
false;
236 alGetSourcei(
Source, AL_LOOPING, &looping);
237 return looping == AL_TRUE;
240#if CAUDIO_EFX_ENABLED == 1
241 virtual unsigned int getNumEffectSlotsAvailable()
const {
return 0; }
242 virtual bool attachEffect(
unsigned int slot, IEffect* effect) {
return false; }
243 virtual void removeEffect(
unsigned int slot) {}
244 virtual bool attachFilter(IFilter* filter) {
return false; }
245 virtual void removeFilter() {}
interface for a sample (audio buffer): completely loaded into memory, shareable across sources
Interface for all Audio Decoders in cAudio.
virtual float getTotalTime()=0
If seeking is supported, will return the length of the audio steam in seconds. Returns a negative num...
virtual int getFrequency()=0
Returns the frequency (sample rate) of the audio data.
virtual AudioFormats getFormat()=0
Returns the format of the audio data.
virtual bool setPosition(int position, bool relative)=0
Sets the position in the stream to read from.
virtual int readAudioData(void *output, int amount)=0
Reads a section of data out of the audio stream.
virtual int getTotalSize()=0
If available, returns the total decoded size of the audio stream. Returns a negative number if this c...
virtual void logDebug(const char *sender, const char *msg,...)=0
Used to log a debug message to the logging system.
virtual void logError(const char *sender, const char *msg,...)=0
Used to log an error message to the logging system.
virtual void grab()
Increments the reference count by one.
virtual bool drop()
Decrements the reference count by one. If it hits zero, this object is deleted.
virtual bool isPlaying() const
Returns if the source is playing.
void signalEvent(Events sevent)
Signals a event to all event handlers.
virtual void setStrength(const float &soundstrength)
Sets how well the source carries over distance.
virtual void setPosition(const cVector3 &position)
Sets the position of the source in 3D space.
ALuint Source
OpenAL source.
float getCurrentAudioTime()
Returns the current position in the audio stream in seconds. See IAudioDecoder for details.
int getCurrentAudioPosition()
Returns the current position in the decoded audio stream in bytes. See IAudioDecoder for details.
bool play()
Plays the source with the last set parameters.
bool seek(const float &seconds, bool relative)
Seeks through the audio stream to a specific spot.
bool play2d(const bool &toLoop)
Plays the source in 2D mode.
bool play3d(const cVector3 &position, const float &soundstr, const bool &toLoop)
Plays the source in 3D mode.
IAudioBuffer * getBuffer()
Get the audio buffer associated with the source.
int getTotalAudioSize()
Returns the total decoded size of the audio stream. See IAudioDecoder for details.
bool isLooping() const
Returns if the source is looping.
void stop()
Stops playback of the sound source.
bool setBuffer(IAudioBuffer *buffer)
Change the audio buffer associated with the source.
bool update()
Normally called every frame by the audio manager to update the internal buffers. Note: For internal u...
int getCurrentCompressedAudioPosition()
Returns the current position in the original audio stream in bytes. See IAudioDecoder for details.
int getCompressedAudioSize()
Returns the original size of the audio stream. See IAudioDecoder for details.
float getTotalAudioTime()
Returns the total amount of time in the audio stream. See IAudioDecoder for details.
void loop(const bool &toLoop)
Controls whether the source should loop or not.
bool isValid() const
Returns if the source is ready to be used.
void pause()
Pauses playback of the sound source.
Class for manipulating vectors in 3D space.
Main namespace for the entire cAudio library.
ALenum convertAudioFormatEnum(AudioFormats format)
Converts our audio format enum to OpenAL's.
CAUDIO_API ILogger * getLogger()
Gets the interface to the logger.