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 "soundclippool.h"
40 static Logger _log(LM_AUDIO);
42 SoundEmitter::SoundEmitter(SoundManager* manager, SoundClipPool* pool,
unsigned int uid) : m_manager(manager), m_pool(pool), m_source(0), m_soundclip(NULL), 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);
66 if (m_soundclip != NULL) {
69 alSourceStop(m_source);
72 alSourcei(m_source, AL_BUFFER, AL_NONE);
80 m_pool->
release(m_soundclipid,
true);
89 alSourcei(m_source, AL_LOOPING, AL_FALSE);
95 m_manager->releaseEmitter(m_emitterid);
99 m_soundclipid = sound_id;
100 m_soundclip = &(m_pool->getSoundClip(m_soundclipid));
110 void SoundEmitter::attachSoundClip() {
114 alSourcei(m_source, AL_LOOPING, m_loop ? AL_TRUE : AL_FALSE);
122 alSourceQueueBuffers(m_source, BUFFER_NUM, m_soundclip->
getBuffers(m_streamid));
123 alSourcei(m_source, AL_LOOPING, AL_FALSE);
126 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error attaching sound clip")
129 void SoundEmitter::updateEvent(
unsigned long time) {
134 alGetSourcei(m_source, AL_BUFFERS_PROCESSED, &procs);
137 alSourceUnqueueBuffers(m_source, 1, &buffer);
139 if (m_soundclip->
getStream(m_streamid, buffer)) {
144 m_soundclip->
getStream(m_streamid, buffer);
148 alGetSourcei(m_source, AL_BUFFERS_QUEUED, &bufs);
151 alSourceStop(m_source);
159 alSourceQueueBuffers(m_source, 1, &buffer);
162 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error while streaming")
168 alSourcei(m_source, AL_LOOPING, loop ? AL_TRUE : AL_FALSE);
170 alSourcei(m_source, AL_LOOPING, AL_FALSE);
178 alSourcePlay(m_source);
187 alSourceStop(m_source);
193 alSourceRewind(m_source);
208 alSourcef(m_source, AL_BYTE_OFFSET, value);
211 alSourcef(m_source, AL_SAMPLE_OFFSET, value);
214 alSourcef(m_source, AL_SEC_OFFSET, value);
218 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error setting cursor position")
221 alGetSourcei(m_source, AL_SOURCE_STATE, &state);
223 if (state == AL_PLAYING || AL_PAUSED) {
225 alSourceStop(m_source);
231 alSourcei(m_source, AL_BUFFER, 0);
235 alSourceQueueBuffers(m_source, BUFFER_NUM, m_soundclip->
getBuffers(m_streamid));
237 if (state == AL_PLAYING) {
239 alSourcePlay(m_source);
242 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error setting stream cursor position")
255 alGetSourcef(m_source, AL_BYTE_OFFSET, &pos);
258 alGetSourcef(m_source, AL_SAMPLE_OFFSET, &pos);
261 alGetSourcef(m_source, AL_SEC_OFFSET, &pos);
269 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error getting cursor")