@Override
	public void close() throws MusicPlayerException {
		this.mLock.lock();
		try {
			//auto close the current audio
			try (Audio audio = this.mCurrentAudio) {
				this.stop();
				if ( this.mCreateOwnThread && this.mPlaybackExecutor != null ) {
					((ExecutorService) this.mPlaybackExecutor).shutdown();
				}
				this.mSignallingExecutor.shutdown();
			}
			finally {
				if ( this.mCreateOwnThread ) {
					this.mPlaybackExecutor = null;
				}
				this.mStreamPlayerRunnable = null;
				this.mCurrentAudio = null;
				this.mCurrentAudioDevice = null;
				this.mCurrentSong = null;
			}
		}
		finally {
			this.mLock.unlock();
		}
	}