javascript - AudioWorklet 中的 new Function()
问题描述
我想创建一个音频编辑器,您可以在其中将节点连接在一起以创建自定义音频组件。每次节点更改时,它们都会被编译成 javascript,然后由 a 运行new Function()
以获得更好的性能。我刚刚读到有可能创建一个AudioWorklet
在单独的线程上运行的 . 现在我想知道是否有可能将这两种想法结合起来,将我的算法AudioWorklet
作为一串javascript代码传递给,然后使用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();
});
推荐阅读
- php - PHP代码将带有附件的html电子邮件发送到Iphone Mail
- powerbi - 如何将我的数据源更改为 Power BI 上的 Sharepoint 数据源
- gradle - Gradle:在调用根任务时排除触发子项目任务
- reactjs - 如何在 React Apollo 的查询变量中传递全局函数值
- aspnetboilerplate - 异常运行测试“无法注册 IUserAppService”
- ruby-on-rails - 尝试使用 db:create 时出现“错误:Rake 中止”
- firefox - Kibana - 切换仪表板后删除的过滤器重新出现
- python - 如何从数据框中提取反义词并将其放入另一个使用 wordnet python
- c# - 如何预热 EF Core?
- kiwi-tcms - 将 Kiwi TCMS 从 v6.3 升级到 v6.4