Ambient sound loops again, Part III. A more global solution of the problem.
authorWolfgang Becker <uafr@gmx.de>
Fri, 30 Jun 2006 22:31:42 +0000 (22:31 +0000)
committerWolfgang Becker <uafr@gmx.de>
Fri, 30 Jun 2006 22:31:42 +0000 (22:31 +0000)
SVN-Revision: 3816

src/audio/dummy_sound_source.cpp
src/audio/sound_manager.cpp
src/audio/sound_manager.hpp
src/audio/sound_source.hpp
src/audio/stream_sound_source.cpp
src/object/ambient_sound.cpp

index 4e4d999..0ca6392 100644 (file)
@@ -43,10 +43,6 @@ public:
     return is_playing;
   }
 
-  virtual void update()
-  {
-  }
-
   virtual void set_looping(bool )
   {
   }
index cc10db7..3976eb6 100644 (file)
@@ -200,6 +200,27 @@ SoundManager::manage_source(SoundSource* source)
   }
 }
 
+void 
+SoundManager::register_for_update( StreamSoundSource* sss ){
+  if( sss != NULL ){
+    update_list.push_back( sss );
+  } 
+}
+
+void
+SoundManager::remove_from_update( StreamSoundSource* sss  ){
+  if( sss != NULL ){
+    StreamSoundSources::iterator i = update_list.begin();
+       while( i != update_list.end() ){
+      if( *i == sss ){
+        i = update_list.erase(i);
+      } else {
+        i++;
+      }
+    }
+  }    
+}
+
 void
 SoundManager::enable_sound(bool enable)
 {
@@ -322,6 +343,13 @@ SoundManager::update()
     alcProcessContext(context);
     check_alc_error("Error while processing audio context: ");
   }
+  
+  //run update() for stream_sound_source
+  StreamSoundSources::iterator s = update_list.begin();
+  while( s != update_list.end() ){
+    (*s)->update();
+    s++;
+  }
 }
 
 ALenum
index a715d99..153bf36 100644 (file)
@@ -74,6 +74,15 @@ public:
   }
 
   void update();
+  
+  /*
+   * Tell soundmanager to call update() for stream_sound_source.
+   */
+  void register_for_update( StreamSoundSource* sss );
+  /*
+   * Unsubscribe from updates for stream_sound_source.
+   */
+  void remove_from_update( StreamSoundSource* sss );
 
 private:
   friend class OpenALSoundSource;
@@ -95,6 +104,9 @@ private:
   typedef std::vector<OpenALSoundSource*> SoundSources;
   SoundSources sources;
 
+  typedef std::vector<StreamSoundSource*> StreamSoundSources;
+  StreamSoundSources update_list;
+
   StreamSoundSource* music_source;
 
   bool music_enabled;
index 75469c3..3824c3c 100644 (file)
@@ -34,7 +34,6 @@ public:
 
   virtual void play() = 0;
   virtual void stop() = 0;
-  virtual void update() = 0;
   virtual bool playing() = 0;
 
   virtual void set_looping(bool looping) = 0;
index 0cf75b2..3569ecd 100644 (file)
@@ -33,10 +33,14 @@ StreamSoundSource::StreamSoundSource()
 {
   alGenBuffers(STREAMFRAGMENTS, buffers);
   SoundManager::check_al_error("Couldn't allocate audio buffers: ");
+  //add me to update list
+  sound_manager->register_for_update( this );
 }
 
 StreamSoundSource::~StreamSoundSource()
 {
+  //don't update me any longer
+  sound_manager->remove_from_update( this );
   delete file;
   stop();
   alDeleteBuffers(STREAMFRAGMENTS, buffers);
index 1287391..6893054 100644 (file)
@@ -197,10 +197,6 @@ AmbientSound::update(float deltat)
 
   //  if (latency>0.001/distance_factor)
   // latency=
-  
-  if( sound_source != NULL ){
-      sound_source->update();
-  }
 }
 
 void