protected SoundPlayer() {
		this.buffers = new ArrayList<SoundPlay>();
		AudioFormat format = new AudioFormat(44100.0f, 16, 2, true, false);

		try {
			this.line = AudioSystem.getSourceDataLine(format);
			this.line.open(format, 4410);
			this.line.start();

			this.thread = new Thread(new Runnable() {
				@Override
				public void run() {
					SoundPlayer self = SoundPlayer.this;
					while(true) {
						int bytesToWrite = self.line.available();

						if(bytesToWrite > 0) {
							byte[] bytes = self.readBytes(bytesToWrite);

							int writtenBytes = 0;
							while(writtenBytes != bytesToWrite) {
								writtenBytes += self.line.write(bytes, writtenBytes, bytesToWrite - writtenBytes);
							}
						}

						try {
							Thread.sleep(1);
						}
						catch(InterruptedException e) {
							throw new RuntimeException(e);
						}
					}
				}
			});
			this.thread.setDaemon(true);
			this.thread.start();
		}
		catch(Exception e) {
			throw new RuntimeException(e);
		}
	}