public synchronized void playSound(final String soundName)
	{
		if (soundName == null || soundName.isEmpty())
		{
			return;
		}

		new Thread(new Runnable()
		{

			@Override
			public void run()
			{
				try
				{
					playClip(soundName);
				}
				catch (IOException e)
				{
					System.out.println(e.getLocalizedMessage());
				}
				catch (UnsupportedAudioFileException e)
				{
					System.out.println("WRONG AUDIOFILEFORMAT: " + soundName);
				}
				catch (LineUnavailableException e)
				{
					System.out.println("LineUnavailableException");
				}
				catch (InterruptedException e)
				{
					System.out.println("InterruptedException");
				}
			}

			private void playClip(String soundName) throws IOException, UnsupportedAudioFileException,
				LineUnavailableException, InterruptedException
			{
				class AudioListener implements LineListener
				{
					private boolean done = false;

					@Override
					public synchronized void update(LineEvent event)
					{
						Type eventType = event.getType();
						if (eventType == Type.STOP || eventType == Type.CLOSE)
						{
							done = true;
							notifyAll();
						}
					}

					public synchronized void waitUntilDone() throws InterruptedException
					{
						while (!done)
						{
							wait();
						}
					}
				}
				AudioListener listener = new AudioListener();
				final InputStream systemResourceAsStream = ClassLoader.getSystemResourceAsStream(prop
					.getProperty(soundName));
				final BufferedInputStream bufInputStream = new BufferedInputStream(systemResourceAsStream);
				AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(bufInputStream);
				try
				{
					Clip clip = AudioSystem.getClip();
					clip.addLineListener(listener);
					clip.open(audioInputStream);
					try
					{
						clip.start();
						listener.waitUntilDone();
					}
					finally
					{
						clip.close();
					}
				}
				finally
				{
					audioInputStream.close();
				}
			}
		}).start();
	}