为了账号安全,请及时绑定邮箱和手机立即绑定

如何将模块导入在其他地方更改的 AudioWorkletProcessor?

如何将模块导入在其他地方更改的 AudioWorkletProcessor?

呼啦一阵风 2022-06-16 17:09:40
我正在尝试从另一个模块更改 AudioWorkletProcessor 使用的值,但从 AudioWorkletProcessor 的上下文来看,该值不会改变并且保持不变。但是从修改数据的模块来看,当查询到数据时,实际上已经发生了变化。就像有一个完全独立的模块实例/状态,它为修饰符(main.js)和读取器(audio-processor.js)保存数据(functions.js)在这里我们有audio-processor.jsimport { sawWave } from "/src/functions.js";var tick = 0class AudioProcessor extends AudioWorkletProcessor {    process(inputs, outputs, parameters) {        const output = outputs[0]        output.forEach(channel => {            // emphasis on sawWave function            var value = sawWave(tick) * 0.1;            for (let i = 0; i < channel.length; i++) {                channel[i] = value            }        });        tick++        return true    }}registerProcessor('audio-processor', AudioProcessor)这里我们有functions.js,它包含被导入到的 sawWave()audio-processor.jslet variables = {    // emphasis on this variable    sawWaveFrequency: 1}export function setSawFrequency(freq) {    variables.sawWaveFrequency = freq}export function sawWave(tick) {    console.log(variables.sawWaveFrequency)    // this function uses the variable defined above and is imported by audio-processor.js    // variables.sawWaveFrequency doesn't change for audio-processor.js when modified from main.js    // so the output will will always be as if variables.sawWaveFrequency = 1    return tick * variables.sawWaveFrequency % 10;}这里我们有main.js,它处理来自 HTML 页面的输入import { setSawFrequency } from "/src/functions.js";var audioContextvar whiteNoiseNodeasync function init() {    audioContext = new AudioContext()    await audioContext.audioWorklet.addModule("/src/audio-processor.js")    whiteNoiseNode = new AudioWorkletNode(audioContext, 'audio-processor')}function play() {    whiteNoiseNode.connect(audioContext.destination)}编辑:我认为你只应该使用AudioWorkletProcessor.port和parameters过程函数中的参数来与之通信?
查看完整描述

2 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

你已经在正确的轨道上。要更改您内部的值,您AudioWorkletProcessor可以使用自定义AudioParam或通过MessagePort.

您的代码不起作用的原因是从技术上讲,您最终会得到同一个模块的两个实例。AudioWorkletProcessor 在不同的线程上运行,并且无法访问在主线程上加载的模块。因此/src/functions.js被加载两次。一个实例存在于主线程上,另一个实例存在于音频线程上。他们每个人都不知道另一个人的存在。


查看完整回答
反对 回复 2022-06-16
?
噜噜哒

TA贡献1784条经验 获得超7个赞

您还可以使用一个 SharedArrayBuffer


在一个模块中创建共享内存对象。


  const length = 100;

  const size = Int32Array.BYTES_PER_ELEMENT * length;

  this.sab = new SharedArrayBuffer(size);

  this.sharedArray = new Int32Array(this.sab);

发送至AudioWorkletProcessor


  this.worker.port.postMessage({

      sab: this.sab

  });

在里面AudioWorkletProcessor


this.port.onmessage = event => {

      this.sharedArray = new Int32Array(event.data.sab);

}

现在两个模块共享同一个数组 ( this.sharedArray)。


查看完整回答
反对 回复 2022-06-16
  • 2 回答
  • 0 关注
  • 319 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号