]> git.mxchange.org Git - simgear.git/commitdiff
Fix a pause situation where more code was executed than expected. Unbind an OpenAL...
authorehofman <ehofman>
Tue, 20 Oct 2009 11:31:00 +0000 (11:31 +0000)
committerTim Moore <timoore@redhat.com>
Wed, 21 Oct 2009 14:25:29 +0000 (16:25 +0200)
simgear/sound/sample_group.cxx
simgear/sound/sample_group.hxx
simgear/sound/soundmgr_openal.cxx
simgear/sound/soundmgr_openal.hxx

index 815fb460f2215a88def21a8b1f0fd22f075cb7ad..5d460be11b763270e7b0812d0777e677fb7b7a05 100644 (file)
@@ -67,6 +67,7 @@ SGSampleGroup::SGSampleGroup () :
     _smgr(NULL),
     _refname(""),
     _active(false),
+    _pause(false),
     _tied_to_listener(false),
     _velocity(SGVec3d::zeros()),
     _orientation(SGQuatd::zeros()),
@@ -79,6 +80,7 @@ SGSampleGroup::SGSampleGroup ( SGSoundMgr *smgr, const string &refname ) :
     _smgr(smgr),
     _refname(refname),
     _active(false), 
+    _pause(false),
     _tied_to_listener(false),
     _velocity(SGVec3d::zeros()),
     _orientation(SGQuatd::zeros()),
@@ -109,10 +111,28 @@ SGSampleGroup::~SGSampleGroup ()
 
 void SGSampleGroup::update( double dt ) {
 
-    if ( !_active ) return;
+    if ( !_active || _pause ) return;
 
     testForALError("start of update!!\n");
 
+    // Delete any OpenAL buffers that might still be in use.
+    unsigned int size = _removed_samples.size();
+    for (unsigned int i=0; i<size; ) {
+        SGSoundSample *sample = _removed_samples[i];
+        ALint result;
+
+        alGetSourcei( sample->get_source(), AL_SOURCE_STATE, &result );
+        if ( result == AL_STOPPED ) {
+            ALuint buffer = sample->get_buffer();
+            alDeleteBuffers( 1, &buffer );
+            testForALError("buffer remove");
+            _removed_samples.erase( _removed_samples.begin()+i );
+            size--;
+            continue;
+        }
+        i++;
+    }
+
     sample_map_iterator sample_current = _samples.begin();
     sample_map_iterator sample_end = _samples.end();
     for ( ; sample_current != sample_end; ++sample_current ) {
@@ -203,9 +223,8 @@ bool SGSampleGroup::remove( const string &refname ) {
         return false;
     }
 
-    // remove the sources buffer
-    _smgr->release_buffer( sample_it->second );
-    _samples.erase( refname );
+    _removed_samples.push_back( sample_it->second );
+    _samples.erase( sample_it );
 
     return true;
 }
@@ -240,7 +259,7 @@ SGSoundSample *SGSampleGroup::find( const string &refname ) {
 void
 SGSampleGroup::suspend ()
 {
-    _active = false;
+    _pause = true;
     sample_map_iterator sample_current = _samples.begin();
     sample_map_iterator sample_end = _samples.end();
     for ( ; sample_current != sample_end; ++sample_current ) {
@@ -267,7 +286,7 @@ SGSampleGroup::resume ()
         }
     }
     testForALError("resume");
-    _active = true;
+    _pause = false;
 }
 
 
index 88f86bcdc87c065da20684f89ecd18df29a87aea..7a3dff70be25ae0be6baa9a023d7c6eb073076f6 100644 (file)
@@ -42,6 +42,7 @@
 #endif
 
 #include <string>
+#include <vector>
 #include <map>
 
 #include <simgear/compiler.h>
@@ -55,7 +56,8 @@
 using std::map;
 using std::string;
 
-typedef map < string, SGSharedPtr<SGSoundSample> > sample_map;
+typedef SGSharedPtr<SGSoundSample> SGSoundSample_ptr;
+typedef map < string, SGSoundSample_ptr > sample_map;
 typedef sample_map::iterator sample_map_iterator;
 typedef sample_map::const_iterator const_sample_map_iterator;
 
@@ -214,6 +216,7 @@ protected:
     bool _active;
 
 private:
+    bool _pause;
     float _volume;
     bool _tied_to_listener;
 
@@ -222,6 +225,7 @@ private:
     SGGeod _position;
 
     sample_map _samples;
+    std::vector<SGSoundSample_ptr> _removed_samples;
 
     bool testForALError(string s);
     bool testForError(void *p, string s);
index eb0a76e409d8b63a7eda13f0d1ee989b3aea05a0..ee5320da8673fd34298771b6c653adfee90bbfcc 100644 (file)
@@ -154,12 +154,17 @@ void SGSoundMgr::init() {
     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();
+        }
     }
 }
 
@@ -187,7 +192,7 @@ void SGSoundMgr::stop() {
 }
 
 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 ) {
@@ -199,7 +204,7 @@ void SGSoundMgr::suspend() {
 }
 
 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 ) {
@@ -225,7 +230,7 @@ void SGSoundMgr::unbind ()
 
     // 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 );
     }
 
@@ -264,7 +269,7 @@ bool SGSoundMgr::add( SGSampleGroup *sgrp, const string& refname )
         return false;
     }
 
-    if (_working) sgrp->activate();
+    if (_active) sgrp->activate();
     _sample_groups[refname] = sgrp;
 
     return true;
@@ -280,7 +285,7 @@ bool SGSoundMgr::remove( const string &refname )
         return false;
     }
 
-    _sample_groups.erase( refname );
+    _sample_groups.erase( sample_grp_it );
 
     return true;
 }
@@ -386,8 +391,9 @@ void SGSoundMgr::release_source( unsigned int 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 );
     }
 }
 
@@ -465,8 +471,8 @@ void SGSoundMgr::release_buffer(SGSoundSample *sample)
     buffer_it->second.refctr--;
     if (buffer_it->second.refctr == 0) {
         ALuint buffer = buffer_it->second.id;
-        _buffers.erase( sample_name );
         alDeleteBuffers(1, &buffer);
+        _buffers.erase( buffer_it );
         testForALError("release buffer");
     }
 }
index ac94788f8a48feb5f12fafc9bfa5671fe515ee90..5d86c6bebd8bfdfbee06e2217201d6af4f519bf4 100644 (file)
@@ -116,13 +116,13 @@ public:
     /**
      * Set the sound manager to a  working condition.
      */
-    inline void activate() { _active = true; }
+    void activate();
 
     /**
      * Test is the sound manager is in an active and working condition.
      * @return true is the sound manager is active
      */
-    inline bool is_active() const { return (_working && _active); }
+    inline bool is_active() const { return _active; }
 
     /**
      * Register a sample group to the sound manager.