2012-02-09 120 views
4

我正在使用Web Audio API,並且我正在嘗試創建一個輸出衝動的JavaScriptNode。也就是說,我想要一個節點,輸出一個1後跟一大堆零,而不是別的。用JavaScriptNode(Web Audio API)衝動

我認爲下面的代碼將是一個明智的方式來做到這一點。我將名爲「timeForAnImpulse」的變量初始化爲true,並使用此變量觸發音頻回調中的脈衝輸出。在回調中,我將「timeForAnImpulse」設置爲false。

這似乎應該可以工作,但事實並非如此。我得到了一個衝動訓練(在每個緩衝區的開始處一個1),而不是一個衝動。任何想法我做錯了什麼?

<script type="text/javascript"> 

window.onload = init; 

    function impulseNodeCB(evt){ 

     if(timeForAnImpulse){ 
      var buf = evt.outputBuffer.getChannelData(0); 
      buf[0] = 1; 
      timeForAnImpulse = false; 
     } 
    } 

    var timeForAnImpulse = true; 

    function init() { 
     var context = new webkitAudioContext(); 
     impulseNode = context.createJavaScriptNode(2048,0,1); 
     impulseNode.onaudioprocess = impulseNodeCB; 
     impulseNode.connect(context.destination); 
    } 

</script> 

</head> 
+0

所以你只是想創建一個非常簡單的「點擊」?正確。 – Lloyd 2012-02-09 16:18:09

+0

沒錯。當你測試/調試信號處理結構時,衝動會派上用場,儘管我承認他們聽起來並不好玩。 ;) – 2012-02-09 19:15:12

回答

4

好吧,我想通了!

我假定在每個回調開始時輸出緩衝區evt.outputBuffer.getChannelData(0)已初始化爲零。事實並非如此。相反,它似乎保留了上次調用的價值。在else子句中顯式調零緩衝區解決了該問題。

<script type="text/javascript"> 

window.onload = init; 

    function impulseNodeCB(evt){ 

     if(timeForAnImpulse){ 
      var buf = evt.outputBuffer.getChannelData(0); 
      buf[0] = 1; 
      timeForAnImpulse = false; 
     } else { 
      buf[0] = 0; 
     } 
    } 

    var timeForAnImpulse = true; 

    function init() { 
     var context = new webkitAudioContext(); 
     impulseNode = context.createJavaScriptNode(2048,0,1); 
     impulseNode.onaudioprocess = impulseNodeCB; 
     impulseNode.connect(context.destination); 
    } 

</script> 

</head> 
+1

你可能應該每次都在buf中設置每個值,而不僅僅是buf [0]。 API規範沒有做出任何承諾,所以輸出緩衝區可能包含垃圾。通過使用AudioBufferSourceNode,您也可以更高效地獲得相同的結果。 – aldel 2014-09-11 14:30:30