32 #include "util/log/logger.h"
33 #include "util/time/timemanager.h"
34 #include "util/base/exception.h"
35 #include "soundemitter.h"
36 #include "soundmanager.h"
37 #include "soundclipmanager.h"
40 static Logger _log(LM_AUDIO);
42 SoundEmitter::SoundEmitter(SoundManager* manager, uint32_t uid) : m_manager(manager), m_source(0), m_soundclip(), m_soundclipid(0), m_streamid(0),
43 m_emitterid(uid), m_loop(false) {
44 if (!m_manager->isActive()) {
48 TimeManager::instance()->registerEvent(
this);
50 alGenSources(1, &m_source);
51 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error creating source")
54 SoundEmitter::~SoundEmitter() {
55 if (!m_manager->isActive()) {
60 TimeManager::instance()->unregisterEvent(
this);
62 alDeleteSources(1, &m_source);
69 alSourceStop(m_source);
72 alSourcei(m_source, AL_BUFFER, AL_NONE);
89 alSourcei(m_source, AL_LOOPING, AL_FALSE);
95 m_manager->releaseEmitter(m_emitterid);
99 m_soundclipid = soundclip->getHandle();
100 m_soundclip = soundclip;
109 void SoundEmitter::attachSoundClip() {
113 alSourcei(m_source, AL_LOOPING, m_loop ? AL_TRUE : AL_FALSE);
121 alSourceQueueBuffers(m_source, BUFFER_NUM, m_soundclip->
getBuffers(m_streamid));
122 alSourcei(m_source, AL_LOOPING, AL_FALSE);
125 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error attaching sound clip")
128 void SoundEmitter::updateEvent(uint32_t time) {
133 alGetSourcei(m_source, AL_BUFFERS_PROCESSED, &procs);
136 alSourceUnqueueBuffers(m_source, 1, &buffer);
138 if (m_soundclip->
getStream(m_streamid, buffer)) {
143 m_soundclip->
getStream(m_streamid, buffer);
147 alGetSourcei(m_source, AL_BUFFERS_QUEUED, &bufs);
150 alSourceStop(m_source);
158 alSourceQueueBuffers(m_source, 1, &buffer);
161 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error while streaming")
167 alSourcei(m_source, AL_LOOPING, loop ? AL_TRUE : AL_FALSE);
169 alSourcei(m_source, AL_LOOPING, AL_FALSE);
177 alSourcePlay(m_source);
186 alSourceStop(m_source);
192 alSourceRewind(m_source);
207 alSourcef(m_source, AL_BYTE_OFFSET, value);
210 alSourcef(m_source, AL_SAMPLE_OFFSET, value);
213 alSourcef(m_source, AL_SEC_OFFSET, value);
217 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error setting cursor position")
220 alGetSourcei(m_source, AL_SOURCE_STATE, &state);
222 if (state == AL_PLAYING || AL_PAUSED) {
224 alSourceStop(m_source);
230 alSourcei(m_source, AL_BUFFER, 0);
234 alSourceQueueBuffers(m_source, BUFFER_NUM, m_soundclip->
getBuffers(m_streamid));
236 if (state == AL_PLAYING) {
238 alSourcePlay(m_source);
241 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error setting stream cursor position")
254 alGetSourcef(m_source, AL_BYTE_OFFSET, &pos);
257 alGetSourcef(m_source, AL_SAMPLE_OFFSET, &pos);
260 alGetSourcef(m_source, AL_SEC_OFFSET, &pos);
268 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error getting cursor")
bool getStream(uint32_t streamid, ALuint buffer)
void reset(bool defaultall=false)
void setCallback(const type_callback &cb)
void setCursor(SoundPositionType type, float value)
void acquireStream(uint32_t streamid)
void setSoundClip(SoundClipPtr soundclip)
void setPosition(float x, float y, float z)
float getCursor(SoundPositionType type)
float getStreamPos(uint32_t streamid, SoundPositionType type) const
void setLooping(bool loop)
void setVelocity(float x, float y, float z)
void setPeriod(int32_t period)
void quitStreaming(uint32_t streamid)
void setPositioning(bool relative)
ALuint * getBuffers(uint32_t streamid=0) const
uint32_t countBuffers() const
bool setStreamPos(uint32_t streamid, SoundPositionType type, float value)
uint32_t beginStreaming()