]> git.mxchange.org Git - simgear.git/blobdiff - simgear/sound/sample_group.cxx
Fixes for headless mode.
[simgear.git] / simgear / sound / sample_group.cxx
index 3cd0d9aee46e4b755a3f22922683e16b542bdd58..1610d088fbfabb3871d290ad5670866ee36e81fa 100644 (file)
@@ -103,9 +103,12 @@ void SGSampleGroup::update( double dt ) {
         }
 
         if ( result == AL_STOPPED ) {
-            ALuint buffer = sample->get_buffer();
-            alDeleteBuffers( 1, &buffer );
-            testForALError("buffer remove");
+            sample->stop();
+            if ( !sample->is_queue() ) {
+                ALuint buffer = sample->get_buffer();
+                alDeleteBuffers( 1, &buffer );
+                testForALError("buffer remove");
+            }
             _removed_samples.erase( _removed_samples.begin()+i );
             size--;
             continue;
@@ -128,44 +131,44 @@ void SGSampleGroup::update( double dt ) {
             //
             // a request to start playing a sound has been filed.
             //
-            if ( _smgr->request_buffer(sample) == SGSoundMgr::NO_BUFFER )
-                continue;
-
-            // start playing the sample
-            ALuint buffer = sample->get_buffer();
             ALuint source = _smgr->request_source();
-            if (alIsSource(source) == AL_TRUE && alIsBuffer(buffer) == AL_TRUE)
+            if (alIsSource(source) == AL_TRUE )
             {
-                sample->set_source( source );
-                
-                alSourcei( source, AL_BUFFER, buffer );
-                testForALError("assign buffer to source");
-
-                sample->set_source( source );
-                update_sample_config( sample );
-
                 ALboolean looping = sample->is_looping() ? AL_TRUE : AL_FALSE;
-                alSourcei( source, AL_LOOPING, looping );
-                alSourcef( source, AL_ROLLOFF_FACTOR, 0.3 );
-                alSourcei( source, AL_SOURCE_RELATIVE, AL_FALSE );
-                alSourcePlay( source );
-                testForALError("sample play");
-            } else {
-                if (alIsBuffer(buffer) == AL_FALSE) 
-                   SG_LOG( SG_GENERAL, SG_ALERT, "No such buffer!\n");
-                // sample->no_valid_source();
-                // sadly, no free source available at this time
-            }
-
-        } else if ( sample->is_valid_source() && sample->has_changed() ) {
-            if ( !sample->is_playing() ) {
-                // a request to stop playing the sound has been filed.
-
-                sample->stop();
-                sample->no_valid_source();
-                _smgr->release_source( sample->get_source() );
-            } else if ( _smgr->has_changed() ) {
-                update_sample_config( sample );
+                if ( sample->is_queue() )
+                {
+                    sample->set_source( source );
+                    update_sample_config( sample );
+
+                    alSourcef( source, AL_ROLLOFF_FACTOR, 0.3 );
+                    alSourcei( source, AL_LOOPING, looping );
+                    alSourcei( source, AL_SOURCE_RELATIVE, AL_FALSE );
+                    alSourcePlay( source );
+                    testForALError("sample play");
+                }
+                else
+                {
+                    if (_smgr->request_buffer(sample) == SGSoundMgr::NO_BUFFER)
+                        continue;
+
+                    // start playing the sample
+                    ALuint buffer = sample->get_buffer();
+                    if ( alIsBuffer(buffer) == AL_TRUE )
+                    {
+                        alSourcei( source, AL_BUFFER, buffer );
+                        testForALError("assign buffer to source");
+
+                        sample->set_source( source );
+                        update_sample_config( sample );
+
+                        alSourcei( source, AL_LOOPING, looping );
+                        alSourcef( source, AL_ROLLOFF_FACTOR, 0.3 );
+                        alSourcei( source, AL_SOURCE_RELATIVE, AL_FALSE );
+                        alSourcePlay( source );
+                        testForALError("sample play");
+                    } else
+                        SG_LOG( SG_GENERAL, SG_ALERT, "No such buffer!\n");
+                }
             }
 
         } else if ( sample->is_valid_source() ) {
@@ -183,6 +186,18 @@ void SGSampleGroup::update( double dt ) {
                 _smgr->release_buffer( sample );
                 remove( sample->get_sample_name() );
             }
+            else
+            if ( sample->has_changed() ) {
+                if ( !sample->is_playing() ) {
+                    // a request to stop playing the sound has been filed.
+                    sample->stop();
+                    sample->no_valid_source();
+                    _smgr->release_source( sample->get_source() );
+                } else if ( _smgr->has_changed() ) {
+                    update_sample_config( sample );
+                }
+            }
+
         }
         testForALError("update");
     }
@@ -213,6 +228,7 @@ bool SGSampleGroup::remove( const string &refname ) {
 
     if ( sample_it->second->is_valid_buffer() )
         _removed_samples.push_back( sample_it->second );
+
     _samples.erase( sample_it );
 
     return true;
@@ -244,9 +260,8 @@ SGSoundSample *SGSampleGroup::find( const string &refname ) {
 }
 
 
-// stop playing all associated samples
 void
-SGSampleGroup::suspend ()
+SGSampleGroup::stop ()
 {
     _pause = true;
     sample_map_iterator sample_current = _samples.begin();
@@ -254,28 +269,59 @@ SGSampleGroup::suspend ()
     for ( ; sample_current != sample_end; ++sample_current ) {
         SGSoundSample *sample = sample_current->second;
 
-        if ( sample->is_valid_source() && sample->is_playing() ) {
-            alSourcePause( sample->get_source() );
+        if ( sample->is_valid_source() ) {
+            ALint source = sample->get_source();
+            if ( sample->is_playing() ) {
+                alSourceStop( source );
+            }
+            _smgr->release_source( source );
+            sample->no_valid_source();
         }
+
+        if ( sample->is_valid_buffer() ) {
+            _smgr->release_buffer( sample );
+            sample->no_valid_buffer();
+        }
+    }
+    testForALError("stop");
+}
+
+// stop playing all associated samples
+void
+SGSampleGroup::suspend ()
+{
+    if (_active && _pause == false) {
+        _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() && sample->is_playing() ) {
+                alSourcePause( sample->get_source() );
+            }
+        }
+        testForALError("suspend");
     }
-    testForALError("suspend");
 }
 
 // resume playing all associated samples
 void
 SGSampleGroup::resume ()
 {
-    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() && sample->is_playing() ) {
-            alSourcePlay( sample->get_source() );
+    if (_active && _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() && sample->is_playing() ) {
+                alSourcePlay( sample->get_source() );
+            }
         }
+        testForALError("resume");
+        _pause = false;
     }
-    testForALError("resume");
-    _pause = false;
 }
 
 
@@ -317,9 +363,12 @@ bool SGSampleGroup::stop( const string& refname ) {
 
 void SGSampleGroup::set_volume( float vol )
 {
-    _volume = vol;
-    if (_volume < 0.0) _volume = 0.0;
-    if (_volume > 1.0) _volume = 1.0;
+    if (vol > _volume*1.01 || vol < _volume*0.99) {
+        _volume = vol;
+        if (_volume < 0.0) _volume = 0.0;
+        if (_volume > 1.0) _volume = 1.0;
+        _changed = true;
+    }
 }
 
 // set the source position and orientation of all managed sounds