+ ALenum format = get_sample_format(file);
+ ALuint buffer;
+ alGenBuffers(1, &buffer);
+ check_al_error("Couldn't create audio buffer: ");
+ std::unique_ptr<char[]> samples(new char[file.size]);
+ file.read(samples.get(), file.size);
+ alBufferData(buffer, format, samples.get(),
+ static_cast<ALsizei>(file.size),
+ static_cast<ALsizei>(file.rate));
+ check_al_error("Couldn't fill audio buffer: ");
+
+ return buffer;
+}
+
+std::unique_ptr<OpenALSoundSource>
+SoundManager::intern_create_sound_source(const std::string& filename)
+{
+ assert(sound_enabled);
+
+ std::unique_ptr<OpenALSoundSource> source(new OpenALSoundSource);
+
+ ALuint buffer;
+
+ // reuse an existing static sound buffer
+ SoundBuffers::iterator i = buffers.find(filename);
+ if(i != buffers.end()) {
+ buffer = i->second;
+ } else {
+ // Load sound file
+ std::unique_ptr<SoundFile> file(load_sound_file(filename));
+
+ if(file->size < 100000) {
+ buffer = load_file_into_buffer(*file);
+ buffers.insert(std::make_pair(filename, buffer));
+ } else {
+ std::unique_ptr<StreamSoundSource> source_(new StreamSoundSource);
+ source_->set_sound_file(std::move(file));
+ return std::move(source_);
+ }
+
+ log_debug << "Uncached sound \"" << filename << "\" requested to be played" << std::endl;