Index: libs/sound/src/win32/playsound/PlaySoundFile.cpp
===================================================================
--- libs/sound/src/win32/playsound/PlaySoundFile.cpp	(revision 468)
+++ libs/sound/src/win32/playsound/PlaySoundFile.cpp	(working copy)
@@ -35,6 +35,8 @@
 
 #include <cstdio>
 
+RecursiveMutex PlaySoundFile::_mutex;
+
 void stopWaveOutDevice(HWAVEOUT * hWaveOut) {
 	if (*hWaveOut != NULL) {
 		waveOutReset(*hWaveOut);
@@ -105,17 +107,25 @@
 static HWAVEOUT _hWaveOut = NULL;
 
 PlaySoundFile::PlaySoundFile() {
+	RecursiveMutex::ScopedLock scopedLock(_mutex);
+
 	stop();
 	_hWaveOut = NULL;
 }
 
 PlaySoundFile::~PlaySoundFile() {
+	RecursiveMutex::ScopedLock scopedLock(_mutex);
+
 	_hWaveOut = NULL;
 }
 
 bool PlaySoundFile::play(const std::string & filename) {
-	SoundFile * soundFile;
+	SoundFile * soundFile = NULL;
 
+	// pre initialize waveHeader
+	WAVEHDR waveHeader;
+	ZeroMemory(&waveHeader, sizeof(WAVEHDR));
+
 	//Opens wave file
 	std::string::size_type pos = filename.find(".raw");
 	if (pos != std::string::npos) {
@@ -126,65 +136,91 @@
 
 	if (!soundFile->open(filename)) {
 		LOG_ERROR("can't open file=" + filename);
-		return false;
+		goto return_soundfalse_1;
 	}
 
 	//Opens output audio wave device
 	HANDLE hDoneEvent = CreateEventA(NULL, FALSE, FALSE, "DONE_EVENT");
-	if (!openWaveOutDevice(&_hWaveOut, _audioDevice.getData()[0].c_str(), soundFile->getFormat(), hDoneEvent)) {
-		LOG_ERROR("can't open wave out device");
-		return false;
-	}
 
-	//Initializes wave header
-	WAVEHDR waveHeader;
-	ZeroMemory(&waveHeader, sizeof(WAVEHDR));
-	waveHeader.lpData = new char[soundFile->getLength()];
-	waveHeader.dwBufferLength = soundFile->getLength();
-	waveHeader.dwUser = 0;
-	waveHeader.dwFlags = 0;
-	waveHeader.dwLoops = 0;
-	waveHeader.dwBytesRecorded = 0;
-	waveHeader.lpNext = 0;
-	waveHeader.reserved = 0;
+	{
+		RecursiveMutex::ScopedLock scopedLock(_mutex);
 
-	//Plays buffer
-	soundFile->read(waveHeader.lpData, waveHeader.dwBufferLength);
+		if (!_hWaveOut)
+			goto return_false;
 
-	MMRESULT mr = waveOutPrepareHeader(_hWaveOut, &waveHeader, sizeof(WAVEHDR));
-	if (mr != MMSYSERR_NOERROR) {
-		return false;
-	}
+		if (!openWaveOutDevice(&_hWaveOut, _audioDevice.getData()[0].c_str(), soundFile->getFormat(), hDoneEvent)) {
+			LOG_ERROR("can't open wave out device");
+			goto return_false;
+		}
 
-	mr = waveOutWrite(_hWaveOut, &waveHeader, sizeof(WAVEHDR));
-	if (mr != MMSYSERR_NOERROR) {
-		return false;
-	}
+		//Initializes wave header
+		waveHeader.lpData = new char[soundFile->getLength()];
+		waveHeader.dwBufferLength = soundFile->getLength();
+		waveHeader.dwUser = 0;
+		waveHeader.dwFlags = 0;
+		waveHeader.dwLoops = 0;
+		waveHeader.dwBytesRecorded = 0;
+		waveHeader.lpNext = 0;
+		waveHeader.reserved = 0;
 
+		//Plays buffer
+		soundFile->read(waveHeader.lpData, waveHeader.dwBufferLength);
+
+		MMRESULT mr = waveOutPrepareHeader(_hWaveOut, &waveHeader, sizeof(WAVEHDR));
+		if (mr != MMSYSERR_NOERROR) {
+			goto return_false;
+		}
+
+		mr = waveOutWrite(_hWaveOut, &waveHeader, sizeof(WAVEHDR));
+		if (mr != MMSYSERR_NOERROR) {
+			goto return_false;
+		}
+	} // _mutex
+
 	//Waits for audio to finish playing
 	while (!(waveHeader.dwFlags & WHDR_DONE)) {
 		WaitForSingleObject(hDoneEvent, INFINITE);
 	}
 
 	//Cleans up
-	mr = waveOutUnprepareHeader(_hWaveOut, &waveHeader, sizeof(WAVEHDR));
-	if (mr != MMSYSERR_NOERROR) {
-		return false;
-	}
+	{
+		RecursiveMutex::ScopedLock scopedLock(_mutex);
 
-	mr = waveOutClose(_hWaveOut);
-	if (mr != MMSYSERR_NOERROR) {
-		return false;
-	}
+		if (!_hWaveOut)
+			goto return_false;
 
+		MMRESULT mr = waveOutUnprepareHeader(_hWaveOut, &waveHeader, sizeof(WAVEHDR));
+		if (mr != MMSYSERR_NOERROR) {
+			goto return_false;
+		}
+
+		mr = waveOutClose(_hWaveOut);
+		if (mr != MMSYSERR_NOERROR) {
+			goto return_false;
+		}
+	} // mutex 
+
 	delete [] waveHeader.lpData;
 	soundFile->close();
 	delete soundFile;
 
 	return true;
+
+return_false:
+	if (soundFile)
+		soundFile->close();
+	if (waveHeader.lpData != NULL)
+		delete [] waveHeader.lpData;
+return_soundfalse_1:
+	if (soundFile) {
+		delete soundFile;
+	}
+	return false;
 }
 
 void PlaySoundFile::stop() {
+	RecursiveMutex::ScopedLock scopedLock(_mutex);
+
 	if (_hWaveOut) {
 		stopWaveOutDevice(&_hWaveOut);
 	}
Index: libs/sound/src/win32/playsound/PlaySoundFile.h
===================================================================
--- libs/sound/src/win32/playsound/PlaySoundFile.h	(revision 468)
+++ libs/sound/src/win32/playsound/PlaySoundFile.h	(working copy)
@@ -21,6 +21,7 @@
 #define PLAYSOUNDFILE_H
 
 #include <util/NonCopyable.h>
+#include <thread/RecursiveMutex.h>
 
 #include <sound/AudioDevice.h>
 
@@ -65,6 +66,8 @@
 private:
 
 	AudioDevice _audioDevice;
+
+	static RecursiveMutex _mutex;
 };
 
 #endif	//PLAYSOUNDFILE_H
Index: libs/sound/src/win32/playsound/SoundFile.cpp
===================================================================
--- libs/sound/src/win32/playsound/SoundFile.cpp	(revision 468)
+++ libs/sound/src/win32/playsound/SoundFile.cpp	(working copy)
@@ -20,6 +20,7 @@
 #include "SoundFile.h"
 
 SoundFile::SoundFile() {
+	_soundFile = NULL;
 }
 
 bool SoundFile::open(const std::string & filename) {
@@ -38,7 +39,8 @@
 }
 
 void SoundFile::close() {
-	fclose(_soundFile);
+	if (_soundFile)
+		fclose(_soundFile);
 }
 
 long SoundFile::read(char * data, long bufferLength) {
