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