return;
}
+ if (_context != NULL)
+ SG_LOG(SG_GENERAL, SG_ALERT, "context is already assigned");
_context = context;
_working = true;
_at_up_vec[0] = 0.0; _at_up_vec[1] = 0.0; _at_up_vec[2] = -1.0;
_at_up_vec[3] = 0.0; _at_up_vec[4] = 1.0; _at_up_vec[5] = 0.0;
- alListenerf( AL_GAIN, 0.2f );
+ alListenerf( AL_GAIN, 0.0f );
alListenerfv( AL_ORIENTATION, _at_up_vec );
alListenerfv( AL_POSITION, SGVec3f::zeros().data() );
alListenerfv( AL_VELOCITY, SGVec3f::zeros().data() );
if (_free_sources.size() == 0) {
SG_LOG(SG_GENERAL, SG_ALERT, "Unable to grab any OpenAL sources!");
}
+}
- sample_group_map_iterator sample_grp_current = _sample_groups.begin();
- sample_group_map_iterator sample_grp_end = _sample_groups.end();
- for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) {
- SGSampleGroup *sgrp = sample_grp_current->second;
- sgrp->activate();
+void SGSoundMgr::activate() {
+ if ( _working ) {
+ _active = true;
+ sample_group_map_iterator sample_grp_current = _sample_groups.begin();
+ sample_group_map_iterator sample_grp_end = _sample_groups.end();
+ for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) {
+ SGSampleGroup *sgrp = sample_grp_current->second;
+ sgrp->activate();
+ }
}
}
_active = false;
// clear any OpenAL buffers before shutting down
- buffer_map_iterator buffers_current;
- while(_buffers.size()){
- buffers_current = _buffers.begin();
+ buffer_map_iterator buffers_current = _buffers.begin();
+ buffer_map_iterator buffers_end = _buffers.end();
+ for ( ; buffers_current != buffers_end; ++buffers_current ) {
refUint ref = buffers_current->second;
ALuint buffer = ref.id;
alDeleteBuffers(1, &buffer);
- _buffers.erase( buffers_current );
}
+ _buffers.clear();
_context = alcGetCurrentContext();
_device = alcGetContextsDevice(_context);
}
void SGSoundMgr::suspend() {
- if (_active) {
+ if (_working) {
sample_group_map_iterator sample_grp_current = _sample_groups.begin();
sample_group_map_iterator sample_grp_end = _sample_groups.end();
for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) {
}
void SGSoundMgr::resume() {
- if (!_active) {
+ if (_working) {
sample_group_map_iterator sample_grp_current = _sample_groups.begin();
sample_group_map_iterator sample_grp_end = _sample_groups.end();
for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) {
// delete free sources
for (unsigned int i=0; i<_free_sources.size(); i++) {
- ALuint source = _free_sources.at( i );
+ ALuint source = _free_sources[i];
alDeleteSources( 1 , &source );
}
if (_changed) {
alListenerf( AL_GAIN, _volume );
+#if 0
alListenerfv( AL_ORIENTATION, _at_up_vec );
alListenerfv( AL_POSITION, toVec3f(_position).data() );
alListenerfv( AL_VELOCITY, toVec3f(_velocity).data() );
+#endif
// alDopplerVelocity(340.3); // TODO: altitude dependent
testForALError("update");
_changed = false;
return false;
}
- if (_working) sgrp->activate();
+ if (_active) sgrp->activate();
_sample_groups[refname] = sgrp;
return true;
return false;
}
- _sample_groups.erase( refname );
+ _sample_groups.erase( sample_grp_it );
return true;
}
_free_sources.pop_back();
_sources_in_use.push_back(source);
}
+ else
+ SG_LOG( SG_GENERAL, SG_INFO, "No more free sources available\n");
return source;
}
alSourceStop( source );
testForALError("release source");
- _free_sources.push_back(source);
- _sources_in_use.erase(it, it+1);
+ alSourcei( source, AL_BUFFER, 0 );
+ _free_sources.push_back( source );
+ _sources_in_use.erase( it );
}
}
void *data;
load(sample_name, &data, &format, &size, &freq);
- sample->set_data( (unsigned char *)data );
+ sample->set_data( &data );
sample->set_frequency( freq );
sample->set_format( format );
sample->set_size( size );
// If this sample was read from a file we have all the information
// needed to read it again. For data buffers provided by the
// program we don't; so don't delete it's data.
- if (sample->is_file()) sample->free_data();
+ if ( sample->is_file() ) sample->free_data();
if ( !testForALError("buffer add data") ) {
sample->set_buffer(buffer);
}
}
}
- else
+ else {
buffer = sample->get_buffer();
+}
return buffer;
}
void SGSoundMgr::release_buffer(SGSoundSample *sample)
{
string sample_name = sample->get_sample_name();
-
buffer_map_iterator buffer_it = _buffers.find( sample_name );
if ( buffer_it == _buffers.end() ) {
// buffer was not found
buffer_it->second.refctr--;
if (buffer_it->second.refctr == 0) {
ALuint buffer = buffer_it->second.id;
- _buffers.erase( buffer_it );
alDeleteBuffers(1, &buffer);
+ _buffers.erase( buffer_it );
testForALError("release buffer");
}
}
bool SGSoundMgr::load(string &samplepath, void **dbuf, int *fmt,
size_t *sz, int *frq )
{
+ if ( !_working ) return false;
+
ALenum format;
ALsizei size;
ALsizei freq;
ALenum error = alGetError();
if ( error != AL_NO_ERROR ) {
string msg = "Failed to load wav file: ";
- msg.append(alutGetErrorString(error));
+ msg.append(alGetString(error));
throw sg_io_exception(msg.c_str(), sg_location(samplepath));
return false;
}