亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將模塊導入在其他地方更改的 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 關注
  • 279 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號