rendered paste bodypackage 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();
}
}
}