Вы можете узнать, когда шейдер завершил свою работу, с помощью слушателя ShaderEvent.COMPLETE.Вот так:
shaderJob.addEventListener(ShaderEvent.COMPLETE, onShaderComplete);
private function onShaderComplete(e:Event):void
{
//Do Something here
}
См. эту ссылку для получения более подробной информации.
Одна вещь о вашем коде, хотя.Вы выполняете эту шейдерную работу внутри sampleDataEvent, и я вижу, что это проблематично (возможно) в том смысле, что ваше микширование может быть не синхронизировано с вашим воспроизведением (то есть, если вы планируете микширование в реальном времени и запись смешанных данныхобратно в звуковой поток).Во всяком случае, это, возможно, проблема для нового вопроса.Это должно решить вашу проблему с необходимостью знать, когда микширование завершено.
Обратите внимание, что вам также необходимо добавить «false» в функцию shaderJob.start (false).Из документации о ShaderEvent.COMPLETE:
"Отправляется, когда ShaderJob, который выполняется асинхронно, завершает обработку данных с помощью шейдера. Экземпляр ShaderJob выполняется асинхронно, когда вызывается метод start () с ложным значением дляПараметр waitForCompletion. "
Обновление
В ответ на ваш запрос о том, как обрабатывать только в sampleDataEvent, если звук не обрабатывается:
private var isProcessing:Boolean = false;
private function onSoundData(event:SampleDataEvent):void {
if(isProcessing != true){
for(var i:int = 0; i < sound.length; i++){
bytes[i] = new ByteArray();
bytes[i].length = BUFFER_SIZE * 4 * 2;
sound[i].extract(bytes[i], BUFFER_SIZE);
var volume:Number = 0;
bytes[i].position = 0;
for(var j:int = 0; j < BUFFER_SIZE; j++){
volume += Math.abs(bytes[i].readFloat());
volume += Math.abs(bytes[i].readFloat());
}
volume = (volume / (BUFFER_SIZE * .5)) * sliders[i].value;
shader.data['track' + (i + 1)].width = BUFFER_SIZE / 1024;
shader.data['track' + (i + 1)].height = 512;
shader.data['track' + (i + 1)].input = bytes[i];
shader.data['vol' + (i + 1)].value = [sliders[i].value];
graph[i].scaleY = volume;
}
var shaderJob:ShaderJob = new ShaderJob(shader,event.data,BUFFER_SIZE / 1024,512);
shaderJob.start(false);
shaderJob.addEventListener(ShaderEvent.COMPLETE, onShaderComplete);
var shaderJob2:ShaderJob = new ShaderJob(shader,recBA,BUFFER_SIZE / 1024,512);
shaderJob2.start(false);
}
}
private function onShaderComplete(e:ShaderEvent):void
{
//Do something here
isProcessing = false;
}