All pastes #1366450 Raw Edit

henke37

public text v1 · immutable
#1366450 ·published 2009-03-20 20:05 UTC
rendered paste body
package Hyperion.Modules {
	
	import Hyperion.*;
	import Hyperion.GUI.*;
	
	import flash.utils.*;
	
	public class StereoSplitter extends Module {
		
		
		public var outSocketL_mc:Socket;
		public var outSocketR_mc:Socket;
		public var inSocket_mc:Socket;
		
		private var outputPinL:OutputPin;
		private var outputPinR:OutputPin;
		private var inputPin:InputPin;
		
		private var leftBuffer:ByteArray;
		private var rightBuffer:ByteArray;
		
		public function StereoSplitter(s:Synth) {
			super(s);
			
			outputPinR=new OutputPin(this,rightRend,outputPinReady);
			outputPinR.dataType=Pin.SoundWave | Pin.Mono;
			outputPinR.socket=outSocketR_mc;
			outputPins.push(outputPinR);
			
			outputPinL=new OutputPin(this,leftRend,outputPinReady);
			outputPinL.dataType=Pin.SoundWave | Pin.Mono;
			outputPinL.socket=outSocketL_mc;
			outputPins.push(outputPinL);
			
			inputPin=new InputPin(this);
			inputPin.socket=inSocket_mc;
			inputPin.dataType=Pin.SoundWave | Pin.Stereo;
			inputPins.push(inputPin);
			
			leftBuffer=new ByteArray();
			rightBuffer=new ByteArray();
		}
		
		private function outputPinReady() {
			return outputPinR.con && outputPinL.con && inputPin.con && inputPin.con.readyToPlay();
		}
		
		private function leftRend(b:ByteArray,s:uint) {
			rend(true,b,s);
		}
		
		private function rightRend(b:ByteArray,s:uint) {
			rend(false,b,s);
		}
		
		private function rend(left:Boolean,b:ByteArray,s:uint) {
			var buffer:ByteArray=left?leftBuffer:rightBuffer;
			var newBuff:ByteArray;
			var bufferLength:uint=buffer.length/4;
			
			
			if(bufferLength < s) {
				//uh oh, we need to read more samples!
				var splitBuffer=new ByteArray();
				var samplesNeeded:uint=s-bufferLength;
				
				inputPin.con.readWave(splitBuffer,samplesNeeded);
				
				leftBuffer.position=leftBuffer.length;
				rightBuffer.position=rightBuffer.length;
				splitBuffer.position=0;
				for(var i:uint;i<samplesNeeded;++i) {
					leftBuffer.writeFloat(splitBuffer.readFloat());
					rightBuffer.writeFloat(splitBuffer.readFloat());
				}
			}
			
			//read the bytes
			buffer.position=0;
			buffer.readBytes(b,b.position,s*4);
			
			//move the remains to the front
			newBuff=new ByteArray();
			buffer.readBytes(newBuff);
			
			if(left) {
				leftBuffer.clear();
				leftBuffer=newBuff;
			} else {
				rightBuffer.clear();
				rightBuffer=newBuff;
			}
		}
		
		public override function destroy() {
			inputPin.destroy();
			inputPin=null;
			
			outputPinR.destroy();
			outputPinR=null;
			outputPinL.destroy();
			outputPinL=null;
			
			leftBuffer.clear();
			rightBuffer.clear();
			
			leftBuffer=null;
			rightBuffer=null;
			
			super.destroy();
		}
	}
}