(inputSound.length*44100/1000)) {
// ran out of buffer
inputSoundPosition = 0;
}
inputSoundBuffer.position = 0;
inputSound.extract(inputSoundBuffer, 8192, inputSoundPosition);
inputSoundBuffer.position = 0;
faust.api_tick(8192, 1, inputSoundBuffer, event.data);
inputSoundPosition += 8192;
// uncomment this section to debug in case calling C++ isn't working:
// just copy the mp3 data directly to the output buffer.
/*
inputSound.extract(event.data, 8192, inputSoundPosition);
inputSoundPosition += (8192);
*/
} else {
faust.api_tick(8192, 0, inputSoundBuffer, event.data);
}
}
// "Start" button callback.
protected function button1_clickHandler(event:MouseEvent):void
{
initFaust();
dbgtext.text = "Playback started.";
sound.addEventListener(SampleDataEvent.SAMPLE_DATA, soundCallback);
sound.play();
}
public function onControlChange(id:int, val:Number):void {
if (!faustOK) return;
faust.api_onControlChange(id, val);
}
// UI Hooks
public function ui_addButton(label:String, id:int):void {
var b:Button = new Button();
b.label = label;
b.addEventListener("click", function(evt:Event):void {
onControlChange(id, 1.0);
});
addElement(b);
}
public function ui_addToggleButton(label:String, id:int):void {
// toggle/check buttons seem to be identical.
return ui_addCheckButton(label, id);
}
public function ui_addCheckButton(label:String, id:int):void {
var cb:CheckBox = new CheckBox();
cb.label = label;
cb.addEventListener("change",
function(evt:SliderEvent):void {
var checked_val:int = cb.selected ? 1.0 : 0.0;
onControlChange(id, checked_val);
});
}
public function ui_addVerticalSlider(label:String, id:int, init:Number, min:Number, max:Number, step:Number):void {
// Just call HSlider since we have a vertical cascade of controls.
return ui_addHorizontalSlider(label, id, init, min, max, step);
}
public function ui_addHorizontalSlider(label:String, id:int, init:Number, min:Number, max:Number, step:Number):void {
var compGroup:HGroup = new HGroup();
// Text label
var compLabel:Label = new Label();
compLabel.text = label;
// Actual control
var compSlider:spark.components.HSlider = new spark.components.HSlider();
compSlider.minimum = min;
compSlider.maximum = max;
compSlider.liveDragging = true; // update faust params while dragging the slider
compSlider.value = init;
compSlider.valueInterval = step;
compSlider.width = 200;
compSlider.addEventListener("change",
function(evt:Event):void {
onControlChange(id, compSlider.value);
});
// wire everything up
compGroup.addElement(compLabel);
compGroup.addElement(compSlider);
addElement(compGroup);
}
public function ui_addNumEntry(label:String, id:int, init:Number, min:Number, max:Number, step:Number):void {
// TODO: A proper text box requires validation.
// Also, slider controls could probably benefit from numeric input too...
// Create a unified control for {VSlider, HSlider, NumEntry}
return ui_addHorizontalSlider(label, id, init, min, max, step);
}
// Layout management
// These are "nice to have" functions but aren't critical.
// It doesn't look like they're widely used.
// TODO: if using Flex, these should be easy enough to implement.
public function ui_openFrameBox(label:String):void { }
public function ui_openTabBox(label:String):void { }
public function ui_openHorizontalBox(label:String):void { }
public function ui_openVerticalBox(label:String):void { }
public function ui_closeBox():void { }
// We don't need a run() notification since we call into Faust code directly.
public function ui_run():void { }
// "Load input sound" button callback
protected function button2_clickHandler(evt:MouseEvent):void {
inputSoundOn = false;
if (!inputSound)
inputSound = new Sound();
var urlReq:URLRequest = new URLRequest(mp3path.text);
inputSound.load(urlReq);
inputSound.addEventListener(Event.COMPLETE,
function(evt:Event):void {
dbgtext.text = "sound finished loading.";
inputSoundOn = true;
inputSoundPosition = 0;
});
}
//"Stop input sound" button callback
protected function button3_clickHandler(event:MouseEvent):void
{
dbgtext.text = "sound stopped.";
inputSoundOn = false;
inputSoundPosition = 0;
}
]]>