+ vector<ALuint>::iterator it;
+
+ it = std::find(_sources_in_use.begin(), _sources_in_use.end(), source);
+ if ( it != _sources_in_use.end() ) {
+ ALint result;
+
+ alGetSourcei( source, AL_SOURCE_STATE, &result );
+ if ( result == AL_PLAYING )
+ alSourceStop( source );
+ testForALError("release source");
+
+ alSourcei( source, AL_BUFFER, 0 );
+ _free_sources.push_back( source );
+ _sources_in_use.erase( it );
+ }
+}
+
+unsigned int SGSoundMgr::request_buffer(SGSoundSample *sample)
+{
+ ALuint buffer = NO_BUFFER;
+
+ if ( !sample->is_valid_buffer() ) {
+ // sample was not yet loaded or removed again
+ string sample_name = sample->get_sample_name();
+ void *sample_data = NULL;
+
+ // see if the sample name is already cached
+ buffer_map_iterator buffer_it = _buffers.find( sample_name );
+ if ( buffer_it != _buffers.end() ) {
+ buffer_it->second.refctr++;
+ buffer = buffer_it->second.id;
+ sample->set_buffer( buffer );
+ return buffer;
+ }
+
+ // sample name was not found in the buffer cache.
+ if ( sample->is_file() ) {
+ int freq, format;
+ size_t size;
+ bool res;
+
+ res = load(sample_name, &sample_data, &format, &size, &freq);
+ if (res == false) return buffer;