private void runSourcedDispatcher(){
		try {
			int bytesRead = 0;
			
			if(bytesToSkip!=0){
				audioInputStream.skip(bytesToSkip);
				bytesProcessed += bytesToSkip;
			}
			if(zeroPad){
				bytesRead = slideBuffer();
			}else {
				bytesRead = processFirstBuffer();
			}

			// as long as the stream has not ended or the number of bytes
			// processed is smaller than the number of bytes to process: process
			// bytes.
		audioLoop:
			while (bytesRead != -1 && !stopped) {
				
				//Makes sure the right buffers are processed, they can be changed by audio processors.
				audioEvent.setOverlap(floatOverlap);
				audioEvent.setFloatBuffer(audioFloatBuffer);
				audioEvent.setBytesProcessed(bytesProcessed);
				
				for (final AudioProcessor processor : audioProcessors) {
					if(!processor.process(audioEvent)){
						break audioLoop;
					}
				}
								
				//Update the number of bytes processed;
				bytesProcessed += bytesRead;
					
				// Read, convert and process consecutive overlapping buffers.
				// Slide the buffer.
				bytesRead = slideBuffer();
			}

			// Notify all processors that no more data is available. 
			// when stop() is called processingFinished is called explicitly, no need to do this again.
			// The explicit call is to prevent timing issues.
			if(!stopped){
				stop();
			}
		} catch (final IOException e) {
			LOG.log(Level.SEVERE, "Error while reading data from audio stream.", e);
		}
	}