32 #include "util/base/exception.h"
33 #include "util/log/logger.h"
35 #include "soundclip.h"
38 static Logger _log(LM_AUDIO);
40 SoundClip::SoundClip(SoundDecoder* decptr,
bool deletedecoder) : m_isstream(decptr->needsStreaming()), m_decoder(decptr), m_deletedecoder(deletedecoder) {
44 SoundBufferEntry* ptr =
new SoundBufferEntry();
47 for (
int i = 0; i < BUFFER_NUM; i++) {
49 if (m_decoder->decode(BUFFER_LEN)) {
55 alGenBuffers(1, &ptr->buffers[i]);
57 alBufferData(ptr->buffers[i], m_decoder->getALFormat(), m_decoder->getBuffer(),
58 m_decoder->getBufferSize(), m_decoder->getSampleRate());
60 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error copying data to buffers")
65 m_decoder->releaseBuffer();
68 m_buffervec.push_back(ptr);
75 SoundBufferEntry* ptr =
new SoundBufferEntry();
77 alGenBuffers(BUFFER_NUM, ptr->buffers);
79 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error creating streaming-buffers")
81 m_buffervec.push_back(ptr);
83 return m_buffervec.size()-1;
87 unsigned long pos = 0;
92 pos =
static_cast<unsigned long>(value);
95 value *= m_decoder->getSampleRate();
97 pos =
static_cast<unsigned long>((m_decoder->getBitResolution() / 8) * (m_decoder->isStereo() ? 2 : 1) * value);
101 if (pos > m_decoder->getDecodedLength()) {
107 m_buffervec.at(streamid)->deccursor = pos;
112 unsigned long pos = m_buffervec.at(streamid)->deccursor;
117 return pos / (m_decoder->getBitResolution() / 8 * (m_decoder->isStereo() ? 2 : 1));
119 return pos / (m_decoder->getBitResolution() / 8 * (m_decoder->isStereo() ? 2 : 1) * m_decoder->getSampleRate());
126 SoundBufferEntry* ptr = m_buffervec.at(streamid);
128 for (
int i = 0; i < BUFFER_NUM; i++) {
135 SoundBufferEntry* ptr = m_buffervec.at(streamid);
137 if (ptr->deccursor >= m_decoder->getDecodedLength()) {
143 m_decoder->setCursor(ptr->deccursor);
146 if (m_decoder->decode(BUFFER_LEN)) {
147 throw Exception(
"error while reading from audio file");
151 alBufferData(buffer, m_decoder->getALFormat(),
152 m_decoder->getBuffer(), m_decoder->getBufferSize(), m_decoder->getSampleRate());
154 m_decoder->releaseBuffer();
157 ptr->deccursor += BUFFER_LEN;
159 CHECK_OPENAL_LOG(_log, LogManager::LEVEL_ERROR,
"error catching stream")
166 SoundBufferEntry* ptr = m_buffervec.at(streamid);
167 alDeleteBuffers(BUFFER_NUM, ptr->buffers);
171 SoundClip::~SoundClip() {
174 std::vector<SoundBufferEntry*>::iterator it;
176 for (it = m_buffervec.begin(); it != m_buffervec.end(); ++it) {
177 if ((*it)->buffers[0] != 0) {
178 alDeleteBuffers(BUFFER_NUM, (*it)->buffers);
186 SoundBufferEntry* ptr = m_buffervec.at(0);
188 for(
unsigned int i = 0; i < ptr->usedbufs; i++) {
189 alDeleteBuffers(1, &ptr->buffers[i]);
194 if (m_deletedecoder && m_decoder != NULL) {