簡體   English   中英

AudioWorklet 內部的 new Function()

[英]new Function() inside of AudioWorklet

我想創建一個音頻編輯器,您可以在其中將節點連接在一起以創建自定義音頻組件。 每次節點更改時,它們都會被編譯成 javascript,然后由new Function()以獲得更好的性能。 我剛剛讀到有可能創建一個AudioWorklet ,它在單獨的線程上運行。 現在我想知道是否有可能以我的算法作為一串 javascript 代碼傳遞給AudioWorklet的方式結合這兩種想法,然后在構造函數中使用new Function(codeString)放入函數中。 然后 audioworklet 的process()函數將以某種方式調用自定義函數。

這在某種程度上是可能的,還是我要求太多? 在我花幾個小時試圖讓它工作之前,我想得到一個“是的,那是可能的”或“不,對不起”......

謝謝你的幫助,

總督

在@AKX 的評論的幫助下,我一起制定了這個解決方案。 字符串中的代碼稍后將被編譯器替換。



function generateProcessor()
{
    return (`

class TestProcessor extends AudioWorkletProcessor 
{
    process(inputs, outputs) 
    {
        const input = inputs[0];
        const output = outputs[0];

        for (let channel = 0; channel < output.length; ++channel) {
            for (let i = 0; i < output[channel].length; i++) {
                output[channel][i] = 0.01 * Math.acos(input[channel][i]);
            }
        }

        return true;
    }
}

registerProcessor('test-processor', TestProcessor);

`);
}

const button = document.querySelector('#button');

button.addEventListener('click', async (e) =>
{
    const audioContext = new AudioContext();

    await audioContext.audioWorklet.addModule(
        URL.createObjectURL(new Blob([
            generateProcessor()
        ], {type: "application/javascript"})));

    const oscillator = new OscillatorNode(audioContext);

    const testProcessor = new AudioWorkletNode(audioContext, 'test-processor');

    oscillator.connect(testProcessor).connect(audioContext.destination);

    oscillator.start();
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM