]> git.mxchange.org Git - simgear.git/commitdiff
Updates to allow runtime chaning of the sound device
authorehofman <ehofman>
Mon, 30 Nov 2009 14:22:40 +0000 (14:22 +0000)
committerTim Moore <timoore@redhat.com>
Mon, 30 Nov 2009 21:41:14 +0000 (22:41 +0100)
simgear/sound/sample_group.cxx
simgear/sound/sample_group.hxx
simgear/sound/soundmgr_openal.cxx

index 3cd0d9aee46e4b755a3f22922683e16b542bdd58..de173dbdf770c2d9b2539a770c91fbb945799d3b 100644 (file)
@@ -261,6 +261,29 @@ SGSampleGroup::suspend ()
     testForALError("suspend");
 }
 
+void
+SGSampleGroup::stop ()
+{
+    _pause = true;
+    sample_map_iterator sample_current = _samples.begin();
+    sample_map_iterator sample_end = _samples.end();
+    for ( ; sample_current != sample_end; ++sample_current ) {
+        SGSoundSample *sample = sample_current->second;
+
+        if ( sample->is_valid_source() ) {
+            if ( sample->is_playing() ) {
+                alSourcePause( sample->get_source() );
+            }
+            _smgr->release_source( sample->get_source() );
+            sample->no_valid_source();
+
+            _smgr->release_buffer( sample );
+            sample->no_valid_buffer();
+        }
+    }
+    testForALError("suspend");
+}
+
 // resume playing all associated samples
 void
 SGSampleGroup::resume ()
index c0b0fdc6b6c2f5a676ee988587f4095d11debd1e..d2d47394d4530a32a33f68db431e4212f5e6638b 100644 (file)
@@ -128,6 +128,11 @@ public:
      */
     SGSoundSample *find( const string& refname );
 
+    /**
+     * Stop all playing samples and set the source id to invalid.
+     */
+    void stop();
+
     /**
      * Request to stop playing all audio samples until further notice.
      */
index 2ccbcf5543141ac381550d1adef0214fc33e27d5..6ead4d196a4602b34fd237903510fc479bdebdd6 100644 (file)
@@ -200,10 +200,18 @@ void SGSoundMgr::stop() {
         }
         _buffers.clear();
 
+        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->stop();
+        }
+
         _context = alcGetCurrentContext();
         _device = alcGetContextsDevice(_context);
         alcDestroyContext(_context);
         alcCloseDevice(_device);
+        _context = NULL;
     }
 }
 
@@ -213,7 +221,7 @@ void SGSoundMgr::suspend() {
         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->suspend();
+            sgrp->stop();
         }
         _active = false;
     }