- SoundManager doesn't need Effects for now - ambient sound volume
authorBastiaan Zapf <bzapf@example.org>
Fri, 6 May 2005 22:12:38 +0000 (22:12 +0000)
committerBastiaan Zapf <bzapf@example.org>
Fri, 6 May 2005 22:12:38 +0000 (22:12 +0000)
  can be adjusted via mix_volume
- ambient_sound is doing so now. Still clicks, because volume is done
  frame wise, not sample wise as it ought to be.

SVN-Revision: 2422

data/levels/test/ambient_sound.stl
src/audio/sound_manager.cpp
src/audio/sound_manager.h
src/object/ambient_sound.cpp
src/object/ambient_sound.h

index 63ab676..de699bc 100644 (file)
          (speed 0.500000)
        )
        (spawnpoint (name "main") (x 96) (y 160))
-      (ambient_sound (x 128) (y 800) (distance_factor 0.1) 
+      (ambient_sound (x 128) (y 800) (distance_factor 1) 
         (distance_bias 200) (sample "waterfall"))
       (infoblock (x 128) (y 800)
         (message (_ "-Info
index 8e0d558..d0c547e 100644 (file)
@@ -25,6 +25,7 @@
 #include <sstream>
 
 #include "audio/sound_manager.h"
+
 #include "audio/musicref.h"
 #include "moving_object.h"
 #include "resources.h"
@@ -43,20 +44,6 @@ SoundManager::~SoundManager()
   sounds.clear();
 }
 
-void
-SoundManager::play_sound(const std::string& name)
-{
-  if(!audio_device || !m_sound_enabled)
-    return;
-  
-  Mix_Chunk* chunk = preload_sound(name);
-  if(chunk == 0) {
-    std::cerr << "Sound '" << name << "' not found.\n";
-    return;
-  }
-  Mix_PlayChannel(-1, chunk, 0);  
-}
-
 int
 SoundManager::play_sound(const std::string& name,int loops)
 {
@@ -71,6 +58,7 @@ SoundManager::play_sound(const std::string& name,int loops)
   return Mix_PlayChannel(-1, chunk, loops);  
 }
 
+
 void
 SoundManager::play_sound(const std::string& sound, const MovingObject* object,
     const Vector& pos)
@@ -112,6 +100,10 @@ SoundManager::play_sound(const std::string& sound, const Vector& pos,
     Mix_SetPanning(chan, 24, 230);
 }
 
+/*
+
+ok, i was stupid. We won't need this now.
+
 // Register a sound effect function - basti_
 
 void 
@@ -125,23 +117,24 @@ SoundManager::register_effect(int channel,Mix_EffectFunc_t f,
 
 // Adjust the Volume of a channel "on line". Needs sizeof(float) static data.
 
-#define __ATYPE__ signed short int
-
 void 
 SoundManager::volume_adjust(int chan, void *stream, int len, void *udata) {
+
+  typedef signed short int atype;
+
   ((float *)udata)[1]=((float *)udata)[1]*0.95+
     (((float *)udata)[0]-
      ((float *)udata)[1])*0.05; // decay towards [0] - declick
   float vol=((float*)udata)[1];
 
   for (int i=0;i<len/2;i++)
-    ((__ATYPE__ *)stream)[i]=
-      ((__ATYPE__)(((signed short int *)stream)[i]*vol)); 
+    ((atype *)stream)[i]=
+      ((atype)(((atype *)stream)[i]*vol)); 
   // FIXME: This should be audio-type dependant - how to do this correctly?
   
   chan=0; // -Werror sucks
 }
-
+*/
 
 
 MusicRef
index e994b30..e934315 100644 (file)
@@ -38,11 +38,8 @@ public:
   SoundManager();
   ~SoundManager();
 
-  /// Play sound.
-  void play_sound(const std::string& sound);
-
-  /// Play sound looping, return channel number - basti_
-  int play_sound(const std::string& sound,int loops);
+  /// Play sound (maybe looping), return channel number (or -1 on error)
+  int play_sound(const std::string& sound,int loops=0);
 
   /// Play sound relative to two Vectors.
   void play_sound(const std::string& sound, const Vector& pos,
index 31e3f3a..e50e946 100644 (file)
 #include "lisp/lisp.h"
 #include "sector.h"
 
-/***
- *  Ambient Sound Source, beta version. Features:
- *
- *  - "disc" like structure. Full volume up to some distance
- *    (distance_bias) to the source, then fading proportional to
- *    inverse square distance
- *  
- *  This is experimental, clicks sometimes and still leaks mem 
- *
- *      basti_ 
- */
-
 AmbientSound::AmbientSound(const lisp::Lisp& lisp)
 {
 
-  //  position=pos;
-  lisp.get("x", position.x);
-  lisp.get("y", position.y);
+  position.x=0;
+  position.y=0;
+  distance_factor=0;
+  distance_bias=0;
+  sample="";
+
+  if (!(lisp.get("x", position.x)&&lisp.get("y", position.y))) {
+    std::cerr << "No Position in ambient_sound"  << std::endl;
+  }
   lisp.get("distance_factor",distance_factor);
   lisp.get("distance_bias"  ,distance_bias  );
   lisp.get("sample"         ,sample         );
@@ -52,7 +46,6 @@ AmbientSound::AmbientSound(const lisp::Lisp& lisp)
   else
     silence_distance = distance_factor*10e2;
 
-  volume_ptr=NULL;
   playing=0;
   startPlaying();
 }
@@ -67,11 +60,8 @@ void
 AmbientSound::startPlaying()
 {
   playing=sound_manager->play_sound(sample,-1);
-  volume_ptr=new float[2];
-  volume_ptr[0]=0;
-  volume_ptr[1]=0;
-  sound_manager->register_effect(playing,&SoundManager::volume_adjust,
-                                NULL,(void *)volume_ptr);
+  Mix_Volume(playing,0);
+  currentvolume=targetvolume=1e-20;
 }
 
 void
@@ -86,16 +76,18 @@ AmbientSound::action(float)
   if (distance<0)
     distance=0;
 
-  volume_ptr[0]=1/(1+distance*distance_factor); // inverse square of distance
+  targetvolume=1/(1+distance*distance_factor);
+  float rise=targetvolume/currentvolume;
+  currentvolume*=pow(rise,.05);
+  currentvolume += 1e-30;
+  //  std::cout << currentvolume << " " << targetvolume << std::endl;
+  Mix_Volume(playing,(int)(currentvolume*MIX_MAX_VOLUME));
 
 }
 
 void
-AmbientSound::draw(DrawingContext &dc
+AmbientSound::draw(DrawingContext &) 
 {
-  return;
-  sprite->draw(dc,position,1);
-
 }
 
 IMPLEMENT_FACTORY(AmbientSound, "ambient_sound");
index 7963c40..f6fd285 100644 (file)
 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
 //  02111-1307, USA.
 
+/**
+ *  Ambient Sound Source, beta version. Features:
+ *
+ *  - "disc" like structure. Full volume up to some distance
+ *    (distance_bias) to the source, then fading proportional to
+ *    inverse square distance
+ *  
+ *  This is experimental and clicks a little. It is not possible to
+ *  get the clicks out without sample-granular volume adjustment.
+ *
+ *      basti_ 
+ */
+
 #ifndef __AMBIENT_SOUND_H__
 #define __AMBIENT_SOUND_H__
 
@@ -24,6 +37,7 @@
 #include "game_object.h"
 #include "resources.h"
 #include "player.h"
+#include "SDL_mixer.h"
 
 class AmbientSound : public GameObject
 {
@@ -37,16 +51,18 @@ protected:
   virtual void startPlaying();
 private:
   Vector position;
-  Sprite *sprite;
 
   std::string sample;
   int playing;
-  float distance_factor;
 
-  float distance_bias;
-  float silence_distance;
+  float distance_factor;  /// distance scaling
+  float distance_bias;    /// 100% volume disc radius
+  float silence_distance; /// not implemented yet 
+
+  float targetvolume;  /// how loud we want to be
+  float currentvolume; /// how loud we are
 
-  float * volume_ptr; // this will be used by the volume adjustment effect.
+  float * volume_ptr; /// this will be used by the volume adjustment effect.
 };
 
 #endif