2012-11-08 14 views
6

Ben ScriptProcessorNode ait onaudioprocess özellikle ilgilendiğim (yakın zamana kadar JavaScriptNodeolarak adlandırılır). Ses işleme için periyodik olarak adlandırılan bir olay dinleyicisi. Ayrı bir iş parçacığında mı çalışıyor?Web Audio API olayları ayrı bir iş parçacığında mı çalışıyor?

Verileri dairesel bir arabelleğe beslemek ve bu geri çağrı dışında işlemek için CPU'yu bağlamayın. Async işlemesi için web çalışanlarını kullanabilirim, ancak AFAIK farklı thread'larda ring buffer'ın farklı bir uygulamasına ihtiyacım var.

Bunu test etmenin bir yolu var mı?

+0

Ayrıca web soketlerini kullanarak ses akışı mı? Nasıl bindin ? ... yan düğümde Web İşleyicisini bir Web Çalışanı iş parçacığı içinden başlatmak güzel olurdu! –

cevap

5

Tüm JavaScript tek-iş parçacıklı, eş zamanlı yürütülür. Herhangi bir eşzamansız öğe, işlenecekleri görev kuyruğuna ekleyen ve geçerli görev bittiğinde yürütülecek olaylar aracılığıyla yapılır.

Ayrı iş parçacığı kullanmak için Web İşçileri gibi bir ortama ihtiyacınız vardır - her iş parçacığının kendi yürütme içeriği (genel kapsam) ve görev sırası vardır; aralarındaki iletişim olaylarla yapılır.

onaudioprocess işleyicisi, DOM ile aynı kapsamda yaşıyor gibi, kendi iş parçacığının içinde çalışacak olması pek olası değildir. Gerçekten sayfa tepkisiz hale getiren bir yoğun hesaplama gerektiren bir görev varsa, ses olayları beslemek içine bir WebWorker kullanmalısınız: Bergi en çözümü ile

myScriptProcessorNode.onaudioprocess = myWebWorker.postMessage; 
+0

Daha önce web çalışanlarını kullandım. Ana iş parçacığı içinde ona işlenirse, sanırım kilitleme halkası arabelleğine ihtiyacım yok, sadece basit bir eşzamanlı, değil mi? Sorumu biraz değiştireceğim. – Davorin

+0

Evet, JavaScript ile kilitlemeye hiç gerek yok - bir seferde sadece bir yürütülmüş görev var. – Bergi

0

, sen structured clone algorithm değil ilgili sorunlarla gidiyoruz audioProcessingEvent öğesinde salt okunur parametreleri kopyalayabilmek. Ayrıca erişmek için ihtiyacımız olacak

_onAudioProcess(audioProcessingEvent) { 
    const {inputBuffer, outputBuffer} = audioProcessingEvent; 
    // The output buffer contains the samples that will be modified and 
    // eventually played, so we need to keep a reference to it. 
    this._outputBuffer = outputBuffer; 
    const numChannels = inputBuffer.numberOfChannels; 

    const inputChannels = 
    Array.from({length: numChannels}, (i) => { 
     return inputBuffer.getChannelData(i); 
    }); 

    this._worker.postMessage({ 
    command: 'DO_STUFF', 
    inputChannels: inputChannels, 
    }); 
} 

: Ne yapmak gerekir Eğer kopyalanabilen olan olaydan gereken parçaları patlak ve böylece gibi farklı bir veri yapısı içinde işçiye onları üzerinden geçmek olduğunu işlenen verileri kullanıcı tarafından tekrar çalınacak şekilde kopyalamak için setMessageHandler içindeki outputBuffer'ınıza referans.

İlgili konular