Index: trunk/src/lib/sound/sound_engine.cc
===================================================================
--- trunk/src/lib/sound/sound_engine.cc	(revision 7316)
+++ trunk/src/lib/sound/sound_engine.cc	(revision 7317)
@@ -151,5 +151,5 @@
  * @param source the Source to fill with the Value.
  */
-void SoundEngine::popALSource(ALuint& source)
+bool SoundEngine::popALSource(ALuint& source)
 {
   assert (source == 0);
@@ -162,5 +162,8 @@
     this->ALSources.pop();
     SDL_mutexV(this->sourceMutex);
-  }
+    return true;
+  }
+  else
+    return false;
 }
 
Index: trunk/src/lib/sound/sound_engine.h
===================================================================
--- trunk/src/lib/sound/sound_engine.h	(revision 7316)
+++ trunk/src/lib/sound/sound_engine.h	(revision 7317)
@@ -49,5 +49,5 @@
 
   // administrative
-    void popALSource(ALuint& source);
+    bool popALSource(ALuint& source);
     void pushALSource(ALuint& source);
 
Index: trunk/src/lib/sound/sound_source.cc
===================================================================
--- trunk/src/lib/sound/sound_source.cc	(revision 7316)
+++ trunk/src/lib/sound/sound_source.cc	(revision 7317)
@@ -34,8 +34,10 @@
   this->buffer = buffer;
   this->sourceNode = sourceNode;
+  this->resident = false;
 
   this->sourceID = 0;
   this->bPlay = false;
 }
+
 
 /**
@@ -53,4 +55,5 @@
   this->buffer = source.buffer;
   this->sourceNode = source.sourceNode;
+  this->resident = source.resident;
 
   this->sourceID = 0;
@@ -63,4 +66,5 @@
     this->bPlay = false;
 }
+
 
 /**
@@ -74,4 +78,5 @@
   this->buffer = source.buffer;
   this->sourceNode = sourceNode;
+  this->resident = source.resident;
 
   if (source.bPlay)
@@ -81,4 +86,5 @@
 }
 
+
 /**
  * @brief compares two Sources with each other.
@@ -94,4 +100,5 @@
 }
 
+
 /**
  * @brief deletes a SoundSource
@@ -100,5 +107,8 @@
 {
   this->stop();
-}
+  if (this->sourceID != 0)
+    SoundEngine::getInstance()->pushALSource(this->sourceID);
+}
+
 
 /**
@@ -107,28 +117,25 @@
 void SoundSource::play()
 {
-  if (this->sourceID == 0)
-    SoundEngine::getInstance()->popALSource(this->sourceID);
-  alSourcePlay(this->sourceID);
-  if (DEBUG >= 3)
-    SoundEngine::checkError("Play Source", __LINE__);
-  this->bPlay = true;
-}
-
-/**
- * Plays back buffer on this Source
+  if (this->retrieveSource())
+  {
+    alSourcePlay(this->sourceID);
+    if (DEBUG >= 3)
+      SoundEngine::checkError("Play Source", __LINE__);
+    this->bPlay = true;
+  }
+}
+
+
+/**
+ * @brief Plays back buffer on this Source
  * @param buffer the buffer to play back on this Source
  */
 void SoundSource::play(const SoundBuffer* buffer)
 {
-  if (unlikely(this->sourceID == 0))
-  {
-    SoundEngine::getInstance()->popALSource(this->sourceID);
-    if (sourceID == 0)
-    {
-      PRINTF(2)("No more Free source\n");
-      return;
-    }
-  }
-  //  assert (this->sourceID != 0);
+  if (!this->retrieveSource())
+  {
+    PRINTF(2)("No more Free sources (You might consider raising the Source-Count).\n");
+    return;
+  }
 
   alSourceStop(this->sourceID);
@@ -143,4 +150,5 @@
     SoundEngine::checkError("Play Source", __LINE__);
 }
+
 
 /**
@@ -156,9 +164,11 @@
       SoundEngine::checkError("StopSource", __LINE__);
     alSourcei(this->sourceID, AL_BUFFER, 0);
-    SoundEngine::getInstance()->pushALSource(this->sourceID);
+    if (!this->resident)
+      SoundEngine::getInstance()->pushALSource(this->sourceID);
     this->sourceID = 0;
   }
 }
 
+
 /**
  * @brief Pauses Playback of a SoundSource
@@ -171,4 +181,5 @@
 }
 
+
 /**
  * @brief Rewinds Playback of a SoundSource
@@ -181,4 +192,5 @@
     SoundEngine::checkError("Rewind Source", __LINE__);
 }
+
 
 /**
@@ -196,2 +208,46 @@
 }
 
+
+/**
+ * @brief sets the Positional this Source should be attached to.
+ * @param sourceNode the Source this is attached to.
+ * If sourceNode == NULL then the Source will be centered, and Audio will be played on all channels.
+ */
+void SoundSource::setSourceNode(const PNode* sourceNode)
+{
+  this->sourceNode = sourceNode;
+}
+
+/**
+ * @brief retrieve a Source.
+ */
+bool SoundSource::retrieveSource()
+{
+  if (this->sourceID != 0)
+    return true;
+  else
+  {
+    SoundEngine::getInstance()->popALSource(this->sourceID);
+    if (this->sourceID != 0)
+    {
+      if (unlikely(this->sourceNode == NULL))
+        resetSource(this->sourceID);
+      return true;
+    }
+  }
+  return false;
+}
+
+
+/**
+ * @brief reset an alSource to its default Values.
+ */
+void SoundSource::resetSource(ALuint sourceID)
+{
+  alSource3f(sourceID, AL_POSITION,        0.0, 0.0, 0.0);
+  alSource3f(sourceID, AL_VELOCITY,        0.0, 0.0, 0.0);
+  alSource3f(sourceID, AL_DIRECTION,       0.0, 0.0, 0.0);
+  alSourcef (sourceID, AL_ROLLOFF_FACTOR,  0.0          );
+  alSourcei (sourceID, AL_SOURCE_RELATIVE, AL_TRUE      );
+  alSourcef (sourceID, AL_GAIN,            SoundEngine::getInstance()->getEffectsVolume());
+}
Index: trunk/src/lib/sound/sound_source.h
===================================================================
--- trunk/src/lib/sound/sound_source.h	(revision 7316)
+++ trunk/src/lib/sound/sound_source.h	(revision 7317)
@@ -34,18 +34,27 @@
   // development functions
     /** @returns The ID of this Source */
-    inline ALuint getID() const { return this->sourceID; }
+    inline ALuint getID() const { return this->sourceID; };
     /** @returns true, if the Source is Playing */
     inline bool   isPlaying() const { return this->bPlay; };
-    /** @param sourceNode the Source this is attached to. */
-    inline void setSourceNode(const PNode* sourceNode) { this->sourceNode = sourceNode;};
+    void setSourceNode(const PNode* sourceNode);
     /** @returns the SoundBuffer of this Source */
-    inline const SoundBuffer* getBuffer() const { return this->buffer; }
+    inline const SoundBuffer* getBuffer() const { return this->buffer; };
     /** @returns the SourceNode of this Source */
-    inline const PNode* getNode() const { return this->sourceNode;}
+    inline const PNode* getNode() const { return this->sourceNode; };
+    /** @param resident if the Source is Resident */
+    inline void setResident(bool resident) { this->resident = resident; };
+    /** @returns true if the alSource is Resident */
+    inline bool isResident() const { return this->resident; };
 
     void setRolloffFactor(ALfloat rolloffFactor);
 
+    static void resetSource(ALuint sourceID);
+
+  private:
+    bool retrieveSource();
+
   private:
     bool                   bPlay;                 //!< If the Source is Playing.
+    bool                   resident;              //!< If the alSource should be resident (if true, the alSource will be returned on deletion).
     ALuint                 sourceID;              //!< The ID of the Source
     const SoundBuffer*     buffer;                //!< The buffer to play in this source.
