Index: /trunk/src/lib/sound/ogg_player.cc
===================================================================
--- /trunk/src/lib/sound/ogg_player.cc	(revision 7303)
+++ /trunk/src/lib/sound/ogg_player.cc	(revision 7304)
@@ -40,4 +40,5 @@
   this->buffers[0] = 0;
   this->buffers[1] = 0;
+  this->musicThread = NULL;
 
   if (!fileName.empty())
@@ -135,4 +136,24 @@
   return true;
 }
+
+
+
+int OggPlayer::createAudioThread(void* oggPlayer)
+{
+  if (oggPlayer == NULL)
+    return -1;
+  OggPlayer* ogg = (OggPlayer*)oggPlayer;
+  PRINTF(4)("STARTIG AUDIO THREAD\n");
+
+  ogg->playback();
+
+  while (ogg->state & Playing)
+  {
+    ogg->update();
+    SDL_Delay(1);
+  }
+  PRINTF(4)("End the AudioThread\n");
+}
+
 
 /**
@@ -171,6 +192,20 @@
     this->state &= ! FileOpened;
   }
-}
-
+
+  // Kill the Music Thread.
+  if (this->musicThread != NULL)
+  {
+    assert (!(this->state & Playing));
+    SDL_WaitThread(this->musicThread, NULL);
+    this->musicThread = NULL;
+  }
+}
+
+
+bool OggPlayer::play()
+{
+  if (this->musicThread == NULL)
+    this->musicThread = SDL_CreateThread(OggPlayer::createAudioThread, (void*)this);
+}
 
 /**
Index: /trunk/src/lib/sound/ogg_player.h
===================================================================
--- /trunk/src/lib/sound/ogg_player.h	(revision 7303)
+++ /trunk/src/lib/sound/ogg_player.h	(revision 7304)
@@ -15,4 +15,5 @@
 #include <ogg/ogg.h>
 #include <vorbis/vorbisfile.h>
+#include <SDL_thread.h>
 
 struct File;
@@ -31,6 +32,5 @@
   bool open(const std::string& fileName);
   void release();
-  void debug();
-  bool playback();
+  bool play();
   bool playing();
   bool update();
@@ -38,5 +38,9 @@
   void jumpTo(float timeCode);
 
+  void debug();
   void printState();
+
+  static int createAudioThread(void* oggPlayer);
+
 
 protected:
@@ -45,15 +49,19 @@
   const char* errorString(int code);
 
-  public:
-    typedef enum {
-      None                   = 0x000,
-      FileOpened             = 0x100,
-      SourceAllocated        = 0x200,
-      BuffersAllocated       = 0x400,
-      Stopped                = 0x010,
-      Playing                = 0x020,
-      Paused                 = 0x040,
-      Error                  = 0x001,
-    } State;
+private:
+  bool playback();
+
+
+public:
+  typedef enum {
+    None                   = 0x000,
+    FileOpened             = 0x100,
+    SourceAllocated        = 0x200,
+    BuffersAllocated       = 0x400,
+    Stopped                = 0x010,
+    Playing                = 0x020,
+    Paused                 = 0x040,
+    Error                  = 0x001,
+  } State;
 
 private:
@@ -67,5 +75,6 @@
   ALenum              format;               //!< The format we play back
   unsigned int        state;
-  //bool                trackLoaded;          //!< If a Track has been loaded.
+
+  SDL_Thread*         musicThread;          //!< The Thread in which music is Played back.
 };
 
Index: /trunk/src/story_entities/game_world.cc
===================================================================
--- /trunk/src/story_entities/game_world.cc	(revision 7303)
+++ /trunk/src/story_entities/game_world.cc	(revision 7304)
@@ -89,6 +89,4 @@
 
   this->dataXML = NULL;
-
-  this->audioThread = NULL;
 }
 
@@ -134,19 +132,4 @@
 }
 
-int GameWorld::createAudioThread(void* gameWorld)
-{
-  GameWorld* gw = (GameWorld*)gameWorld;
-  printf("STARTIG AUDIO THREAD\n");
-  if(gw->dataTank && gw->dataTank->music != NULL)
-    gw->dataTank->music->playback();
-
-  while (gw->bRunning)
-  {
-    if(gw->dataTank && gw->dataTank->music != NULL)
-      gw->dataTank->music->update();
-    SDL_Delay(1);
-  }
-  printf("End the AudioThread\n");
-}
 
 /**
@@ -204,11 +187,4 @@
   PRINTF(3)("GameWorld::~GameWorld() - unloading the current GameWorld\n");
 
-  if (this->audioThread != NULL)
-  {
-    this->bRunning = false;
-    SDL_WaitThread(this->audioThread, NULL);
-    this->audioThread = NULL;
-  }
-
   this->dataTank->unloadData();
 
@@ -227,7 +203,4 @@
   this->bRunning = true;
 
-  if (this->audioThread == NULL)
-    this->audioThread = SDL_CreateThread(GameWorld::createAudioThread, (void*)this);
-
   this->run();
 }
@@ -241,13 +214,4 @@
   PRINTF(3)("GameWorld::stop() - got stop signal\n");
   this->bRunning = false;
-
-  if (this->audioThread != NULL)
-  {
-    this->bRunning = false;
-    SDL_WaitThread(this->audioThread, NULL);
-    this->audioThread = NULL;
-  }
-
-  this->audioThread = NULL;
 }
 
@@ -288,4 +252,7 @@
   this->dtS = 0.0f;
   this->lastFrame = SDL_GetTicks ();
+
+  if (this->dataTank->music != NULL)
+    this->dataTank->music->play();
 
   while( this->bRunning) /* @todo implement pause */
Index: /trunk/src/story_entities/game_world.h
===================================================================
--- /trunk/src/story_entities/game_world.h	(revision 7303)
+++ /trunk/src/story_entities/game_world.h	(revision 7304)
@@ -10,6 +10,4 @@
 #include "story_entity.h"
 #include "game_world_data.h"
-
-#include <SDL_thread.h>
 
 class Shell;
@@ -56,7 +54,4 @@
     static void toggleBVVisibility();
 
-    static int createAudioThread(void* GameWorld);
-
-
     inline void setSky(WorldEntity* sky) { this->dataTank->sky = sky; }
 
@@ -80,5 +75,4 @@
 
   protected:
-    SDL_Thread*         audioThread;
     GameWorldData*      dataTank;                     //!< reference to the GameWorld Data Tank
     TiXmlElement*       dataXML;                      //!< The XML-Element this World has been loaded with.
