private void insertInternal(Song pSong, AudioDevice pAudioDevice) throws MusicPlayerException {
		//FIXME: move the opening and stuff into start.
		if ( this.mStreamPlayerRunnable != null ) {
			if ( !this.mStreamPlayerRunnable.isStopped() ) {
				throw new IllegalStateException( "You can only insert Songs while the Player is stopped!" );
			}
			else {
				try {
					this.mStreamPlayerRunnable.join();
				}
				catch (InterruptedException e) {
					throw new MusicPlayerException(
							"couldn't wait until the end of the current audio",
							e
					);
				}
			}
		}
		if ( this.mCurrentAudio != null && !this.mCurrentAudio.isClosed() ) {
			this.mCurrentAudio.close();
		}
		try {
			this.mCurrentSong = pSong;
			this.mCurrentAudio = pSong.getAudio();
			this.mCurrentAudio.open();
		}
		catch (MusicPlayerException e) {
			this.mCurrentAudio = null;
			this.mCurrentSong = null;
			throw e;
		}
		this.mCurrentAudioDevice = pAudioDevice;
		if ( this.mCurrentAudioDevice.isClosed() ) {
			this.mCurrentAudioDevice.open( this.mCurrentAudio.getAudioFormat() );
		}
		else {
			this.mCurrentAudioDevice.reopen( this.mCurrentAudio.getAudioFormat() );
		}
		this.mStreamPlayerRunnable = new StreamPlayerRunnable(
				this.mCurrentAudio,
				this.mCurrentAudioDevice,
				this,
				this.mPlayerRunnableListener
		);
	}