--- /dev/null
+;; Generated by Flexlay Editor
+(supertux-level
+ (version 2)
+ (name (_ "Ambient Sound Test"))
+ (author "basti_")
+ (sector
+ (name "main")
+ (gravity 10.000000)
+ (background (image "arctis.jpg")
+ (speed 0.5))
+ (tilemap
+ (layer "background")
+ (solid #f)
+ (speed 1.000000)
+ (width 30)
+ (height 30)
+ (tiles
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ ))
+ (tilemap
+ (layer "interactive")
+ (solid #t)
+ (speed 1.000000)
+ (width 30)
+ (height 30)
+ (tiles
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61
+ 61 0 0 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+61 0 0 0 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 0 0 0 61 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 61 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 61
+ 61 0 0 0 0 61 61 61 61 61 61 61 61 0 0 0 0 0 0 0 0 0 0 0 0 61 0
+0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 61 0 0 0 0 0 0 0 0 0 0 0 0 61 61 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 61 61 61 61 0 0 0 0 0 0 0 0 0 0 0 0 0
+61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 61 61 0 0 0 0 0 0 0 0 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 0 0 0 0 0 0 0 0 0 0 61 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 61 61 0 0 0 0 61 0 0 0 0
+61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 0 0 0 0 61 61 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 61 61 0 0 0 0 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 0 0 0 0 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 61 61 0 0 0 0 61
+61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 0 0 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 61 61 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61 61 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61
+ 61 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 61
+ 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
+ ))
+ (tilemap
+ (layer "foreground")
+ (solid #f)
+ (speed 1.000000)
+ (width 30)
+ (height 30)
+ (tiles
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
+ ))
+ (camera
+ (mode "normal")
+ )
+
+ (background
+ (image "arctis.jpg")
+ (speed 0.500000)
+ )
+ (spawnpoint (name "main") (x 96) (y 160))
+ (ambient_sound (x 128) (y 800) (distance_factor 0.1)
+ (distance_bias 200) (sample "waterfall"))
+ (infoblock (x 128) (y 800)
+ (message (_ "-Info
+#An ambient sound source
+#should be audible here"))
+ )
+ )
+ )
+
+;; EOF ;;
Mix_PlayChannel(-1, chunk, 0);
}
+int
+SoundManager::play_sound(const std::string& name,int loops)
+{
+ if(!audio_device || !m_sound_enabled)
+ return -1;
+
+ Mix_Chunk* chunk = preload_sound(name);
+ if(chunk == 0) {
+ std::cerr << "Sound '" << name << "' not found.\n";
+ return -1;
+ }
+ return Mix_PlayChannel(-1, chunk, loops);
+}
+
void
SoundManager::play_sound(const std::string& sound, const MovingObject* object,
const Vector& pos)
Mix_SetPanning(chan, 24, 230);
}
+// Register a sound effect function - basti_
+
+void
+SoundManager::register_effect(int channel,Mix_EffectFunc_t f,
+ Mix_EffectDone_t d,void * arg) {
+
+ if(!audio_device || !m_sound_enabled)
+ return;
+ Mix_RegisterEffect(channel,f,d,arg);
+}
+
+// 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) {
+ ((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));
+ // FIXME: This should be audio-type dependant - how to do this correctly?
+
+ chan=0; // -Werror sucks
+}
+
+
+
MusicRef
SoundManager::load_music(const std::string& file)
{
/// 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 relative to two Vectors.
void play_sound(const std::string& sound, const Vector& pos,
const Vector& pos2);
void play_sound(const std::string& sound, const MovingObject* object,
const Vector& pos);
+ /// register an effect to a channel - basti_
+ void register_effect(int channel,Mix_EffectFunc_t f,Mix_EffectDone_t d,
+ void * arg);
+
+ // effects - basti_
+ static void volume_adjust(int,void *,int,void *);
+
/** Load music.
* Is used to load the music for a MusicRef.
*/
--- /dev/null
+// ambient_sound.cpp basti_
+//
+// SuperTux
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA.
+
+#include <config.h>
+
+#include "ambient_sound.h"
+#include "object_factory.h"
+#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);
+ lisp.get("distance_factor",distance_factor);
+ lisp.get("distance_bias" ,distance_bias );
+ lisp.get("sample" ,sample );
+
+ if (distance_factor == 0)
+ silence_distance = 10e99;
+ else
+ silence_distance = distance_factor*10e2;
+
+ volume_ptr=NULL;
+ playing=0;
+ startPlaying();
+}
+
+
+void
+AmbientSound::hit(Player& )
+{
+}
+
+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);
+}
+
+void
+AmbientSound::action(float)
+{
+ float dx=Sector::current()->player->get_pos().x-position.x;
+ float dy=Sector::current()->player->get_pos().y-position.y;
+ float distance=sqrt(dx*dx+dy*dy);
+
+ distance-=distance_bias;
+
+ if (distance<0)
+ distance=0;
+
+ volume_ptr[0]=1/(1+distance*distance_factor); // inverse square of distance
+
+}
+
+void
+AmbientSound::draw(DrawingContext &dc)
+{
+ return;
+ sprite->draw(dc,position,1);
+
+}
+
+IMPLEMENT_FACTORY(AmbientSound, "ambient_sound");
--- /dev/null
+// ambient_sound.h basti_
+//
+// SuperTux
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// as published by the Free Software Foundation; either version 2
+// of the License, or (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+// 02111-1307, USA.
+
+#ifndef __AMBIENT_SOUND_H__
+#define __AMBIENT_SOUND_H__
+
+
+#include "game_object.h"
+#include "resources.h"
+#include "player.h"
+
+class AmbientSound : public GameObject
+{
+public:
+ AmbientSound(const lisp::Lisp& lisp);
+
+protected:
+ virtual void hit(Player& player);
+ virtual void action(float time);
+ virtual void draw(DrawingContext&);
+ virtual void startPlaying();
+private:
+ Vector position;
+ Sprite *sprite;
+
+ std::string sample;
+ int playing;
+ float distance_factor;
+
+ float distance_bias;
+ float silence_distance;
+
+ float * volume_ptr; // this will be used by the volume adjustment effect.
+};
+
+#endif
+