sample->stop();
if ( !sample->is_queue() ) {
ALuint buffer = sample->get_buffer();
+ // disconnect buffer from its source - otherwise it cannot be deleted
+ alSourceUnqueueBuffers(sample->get_source(), 1, &buffer);
alDeleteBuffers( 1, &buffer );
testForALError("buffer remove");
}
}
else
{
- if (_smgr->request_buffer(sample) == SGSoundMgr::NO_BUFFER)
+ ALuint buffer = _smgr->request_buffer(sample);
+ if (buffer == SGSoundMgr::FAILED_BUFFER ||
+ buffer == SGSoundMgr::NO_BUFFER)
+ {
+ _smgr->release_source(source);
continue;
+ }
// start playing the sample
- ALuint buffer = sample->get_buffer();
+ buffer = sample->get_buffer();
if ( alIsBuffer(buffer) == AL_TRUE )
{
alSourcei( source, AL_BUFFER, buffer );
alSourcePlay( source );
testForALError("sample play");
} else
- SG_LOG( SG_GENERAL, SG_ALERT, "No such buffer!\n");
+ SG_LOG( SG_SOUND, SG_ALERT, "No such buffer!\n");
}
}
sample->set_rotation( ec2body );
sample->set_position( position );
sample->set_velocity( velocity );
+
+ // Test if a sample is farther away than max distance, if so
+ // stop the sound playback and free it's source.
+ if (!_tied_to_listener) {
+ float max2 = sample->get_max_dist() * sample->get_max_dist();
+ float dist2 = position[0]*position[0]
+ + position[1]*position[1] + position[2]*position[2];
+ if ((dist2 > max2) && !sample->test_out_of_range()) {
+ sample->set_out_of_range(true);
+ } else if ((dist2 < max2) && sample->test_out_of_range()) {
+ sample->set_out_of_range(false);
+ }
+ }
}
}
bool SGSampleGroup::testForError(void *p, string s)
{
if (p == NULL) {
- SG_LOG( SG_GENERAL, SG_ALERT, "Error (sample group): " << s);
+ SG_LOG( SG_SOUND, SG_ALERT, "Error (sample group): " << s);
return true;
}
return false;
{
ALenum error = alGetError();
if (error != AL_NO_ERROR) {
- SG_LOG( SG_GENERAL, SG_ALERT, "AL Error (" << _refname << "): "
+ SG_LOG( SG_SOUND, SG_ALERT, "AL Error (" << _refname << "): "
<< alGetString(error) << " at " << s);
return true;
}