public void run() {
		Frame frame;
		Timer timer = new Timer(framesBetweenSync, frameBuffer.capacity());
		try {
			while(!producerError & (!frameBuffer.isEmpty() || transceiver.isProducing())) {
				frame = frameBuffer.debuf();
				if(frame != null) {
					if(saturation) {
						if(frameBuffer.isStarving())
							timer.enterStarvingMode();
						if(frameBuffer.isSatiated())
							timer.enterSatiatedMode();
						if(frameBuffer.isBalanced())
							timer.enterBalancedMode();
					}
					try	{
						Thread.sleep(timer.getDelay(frame));
					}
					catch(InterruptedException e) {
						// nada
					}
					frameWriter.writeFrame(frame);
				}
			}
		}
		catch(InterruptedException e) {
			// shutdown in progress
			Fluid.error("WritingEngine: Interrupted", 2);			
		}
		catch(IOException e) {
			Fluid.error(e, 2);
			transceiver.consumerError(e);
		}
		transceiver.unregisterConsumer(writingEngine);
	}