SoundSourcePtr SoundManager::createSoundSource(const std::string& filename) { SoundSourcePtr source; try { auto it = m_buffers.find(filename); if(it != m_buffers.end()) { source = SoundSourcePtr(new SoundSource); source->setBuffer(it->second); } else { SoundFilePtr soundFile = SoundFile::loadSoundFile(filename); if(!soundFile) return nullptr; if(soundFile->getSize() <= MAX_CACHE_SIZE) { source = SoundSourcePtr(new SoundSource); SoundBufferPtr buffer = SoundBufferPtr(new SoundBuffer); buffer->fillBuffer(soundFile); source->setBuffer(buffer); m_buffers[filename] = buffer; g_logger.warning(stdext::format("uncached sound '%s' requested to be played", filename)); } else { StreamSoundSourcePtr streamSource(new StreamSoundSource); streamSource->setSoundFile(soundFile); source = streamSource; #if defined __linux && !defined OPENGL_ES // due to OpenAL implementation bug, stereo buffers are always downmixed to mono on linux systems // this is hack to work around the issue // solution taken from http://opensource.creative.com/pipermail/openal/2007-April/010355.html if(soundFile->getSampleFormat() == AL_FORMAT_STEREO16) { CombinedSoundSourcePtr combinedSource(new CombinedSoundSource); streamSource->downMix(StreamSoundSource::DownMixLeft); streamSource->setRelative(true); streamSource->setPosition(Point(-128, 0)); combinedSource->addSource(streamSource); streamSource = StreamSoundSourcePtr(new StreamSoundSource); streamSource->setSoundFile(SoundFile::loadSoundFile(filename)); streamSource->downMix(StreamSoundSource::DownMixRight); streamSource->setRelative(true); streamSource->setPosition(Point(128,0)); combinedSource->addSource(streamSource); source = combinedSource; } #endif } } } catch(std::exception& e) { g_logger.error(stdext::format("failed to load sound source: '%s'", e.what())); return nullptr; } return source; }
void SoundManager::preload(const std::string& filename) { auto it = m_buffers.find(filename); if(it != m_buffers.end()) return; SoundFilePtr soundFile = SoundFile::loadSoundFile(filename); // only keep small files if(soundFile->getSize() > MAX_CACHE_SIZE) return; SoundBufferPtr buffer = SoundBufferPtr(new SoundBuffer); if(buffer->fillBuffer(soundFile)) m_buffers[filename] = buffer; }
void SoundManager::preload(std::string filename) { filename = resolveSoundFile(filename); auto it = m_buffers.find(filename); if(it != m_buffers.end()) return; ensureContext(); SoundFilePtr soundFile = SoundFile::loadSoundFile(filename); // only keep small files if(!soundFile || soundFile->getSize() > MAX_CACHE_SIZE) return; SoundBufferPtr buffer = SoundBufferPtr(new SoundBuffer); if(buffer->fillBuffer(soundFile)) m_buffers[filename] = buffer; }