2012-11-08 9 views
6

Jestem szczególnie zainteresowany w onaudioprocess z ScriptProcessorNode (do niedawna nazywane JavaScriptNode). Jest to detektor zdarzeń, który jest okresowo nazywany przetwarzaniem dźwięku. Czy działa w osobnym wątku?Czy zdarzenia Web Audio API są uruchamiane w osobnym wątku?

Chciałbym podawać dane do bufora kołowego i przetwarzać je poza tym wywoływaniem zwrotnym, więc nie wzywam procesora. Potrafię używać robotów sieciowych do przetwarzania asynchronicznego, ale AFAIK potrzebowałbym innej implementacji bufora pierścieniowego w przypadku różnych wątków.

Czy istnieje sposób na sprawdzenie tego?

+0

Czy przesyłasz także dźwięk za pomocą gniazd internetowych? Jak się masz? ... w węźle bocznym byłoby fajnie uruchomić Web Audio z poziomu wątku Web Worker! –

Odpowiedz

5

Wszystkie JavaScript są jednowątkowe, wykonywane synchronicznie. Wszelkie asynchroniczne rzeczy są wykonywane za pośrednictwem zdarzeń, które dodają swoje procedury obsługi do kolejki zadań - do wykonania po zakończeniu bieżącego zadania.

Aby używać oddzielnych wątków, potrzebne jest środowisko takie jak WebWorkers - każdy wątek ma swój własny kontekst wykonania (globalny zakres) i kolejkę zadań; komunikacja między nimi odbywa się za pośrednictwem zdarzeń.

Ponieważ obsługa onaudioprocess wydaje się żyć w tym samym zakresie co DOM, jest mało prawdopodobne, aby działała we własnym wątku. Jeśli naprawdę masz obliczeniowo zadania sprawia, że ​​Twoja strona nie reaguje, należy użyć WebWorker do którego karmić zdarzeń audio:

myScriptProcessorNode.onaudioprocess = myWebWorker.postMessage; 
+0

Korzystałem wcześniej z pracowników sieci. Jeśli w głównym wątku jest wykonywany proces naudowy, to chyba nie potrzebowałbym bufora z pierścieniem blokującym, tylko prostym synchronicznym, prawda? Przeformułuję nieco moje pytanie. – Davorin

+0

Tak, JavaScript nie wymaga blokowania - jest tylko jedno wykonane zadanie naraz. – Bergi

0

roztworem BERGI jest, masz zamiar uruchomić do problemów z nie structured clone algorithm możliwość kopiowania parametrów tylko do odczytu w audioProcessingEvent. Co trzeba zrobić, to wyrwać części potrzebne ze zdarzenia, które są Cloneable, i przekazać je do swojego pracownika w innej struktury danych tak:

_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, 
    }); 
} 

Będziecie też potrzebować dostępu odwołanie do twojego outputBuffer w setMessageHandler, w celu skopiowania przetworzonych danych, aby ostatecznie zostały odtworzone przez użytkownika.