m36 中的網路音訊變更

Chris Wilson
Chris Wilson

Web Audio 異動

Google 非常重視標準。我們的使命是打造符合標準定義的網路平台。其中一個小問題是 Web Audio API 的 webkit 前置字元實作方式 (特別是 webkitAudioContext 物件),以及我們持續支援的部分已淘汰的 Web Audio 元件。

我們原本計劃在 Chrome 36 中移除對前置字串 webkitAudioContext 的支援,因為我們已開始支援未加上前置字串的 AudioContext 物件。這項做法比預期更麻煩,因此 Chrome 36 同時支援未加上前置字元的和加上前置字元的做法。不過,即使在重新推出的 webkitAudioContext 中,也已移除 createGainNode 和 createJavaScriptNode 等多種舊版方法和屬性。簡而言之,在 Chrome 36 中,webkitAudioContext 和 AudioContext 是彼此的別名,兩者之間沒有功能差異。

我們將在 Chrome 36 之後完全移除對前置字元的支援,可能會在幾個版本後完成。變更即將生效時,我們會在這裡發布公告,並持續與作者聯絡,請他們修正 Web Audio 應用程式。

為什麼我們要這樣做,而不是恢復先前的實作方式?我們一直不願意太過往回溯,因此已移除這些 API。此外,這項別名化功能的附帶好處是,應用程式可以在 Firefox 上順利運作,因為 Firefox 在去年秋季推出的 Web Audio 支援功能中從未支援前置字首 AudioContext 物件 (這也是正確的做法)。

本更新的其餘部分會提供指南,協助您修正因這項異動而導致程式碼中可能發生的問題。修正這些問題的好處是,您的程式碼很可能只會在 Firefox 中運作!(我一直以為 Vocoder 應用程式是因為 Firefox 的導入方式而無法運作,但實際上是因為這些問題之一!)

如果您只想讓應用程式運作,不妨參考我為舊版 Web Audio 程式碼編寫的應用程式猴子補丁 程式庫,這樣就能在最短的時間內讓應用程式運作,因為這個程式庫會適當地為物件和方法建立別名。程式庫列出的修補程式確實是變更項目的絕佳指南。

首先

請將任何 window.webkitAudioContext 參照改為 window.AudioContext。通常只要簡單執行以下操作,就能解決這個問題:

window.AudioContext = window.AudioContext || window.webkitAudioContext;

如果應用程式回應類似「很抱歉,您的瀏覽器不支援 Web Audio。請使用 Chrome 或 Safari。」這很可能是明確尋找 webkitAudioContext。開發人員不良!你可能已經支持 Firefox 好幾個月了!

但還有一些較不明顯的程式碼移除作業。

  • .type 屬性 (現在是字串) 的 BiquadFilter 列舉型別常數不再顯示在 BiquadFilterNode 物件上,我們也不支援在 .type 屬性上使用這些常數。因此,您不再使用 .LOWPASS (或 0),而是將其設為「lowpass」。
  • 此外,Oscillator.type 屬性現在也同樣是字串列舉類型,不再是 .SAWTOOTH
  • PannerNode.type 現在也是字串列舉型別。
  • PannerNode.distanceModel 現在也是字串列舉型別。
  • createGainNode 已重新命名為 createGain
  • createDelayNode 已重新命名為 createDelay
  • createJavaScriptNode 已重新命名為 createScriptProcessor
  • AudioBufferSourceNode.noteOn() 現已替換為 start()
  • AudioBufferSourceNode.noteGrainOn() 也已由 start() 取代
  • 已將「AudioBufferSourceNode.noteOff()」重新命名為「stop()
  • 已將「OscillatorNode.noteOn()」重新命名為「start()
  • 已將「OscillatorNode.noteOff()」重新命名為「stop()
  • 已將「AudioParam.setTargetValueAtTime()」重新命名為「setTargetAtTime()
  • AudioContext.createWaveTable()OscillatorNode.setWaveTable() 現已重新命名為 createPeriodicWave() andsetPeriodicWave()`。
  • 已移除 AudioBufferSourceNode.looping,改用 .loop
  • AudioContext.createBuffer(ArrayBuffer, boolean) 已遭到移除,無法同步解碼已編碼音訊資料的 blob。同步呼叫需要很長的時間才能完成,這並非良好的程式碼編寫方式;請改用非同步的 decodeAudioData 呼叫。這是較具挑戰性的變更之一,因為您必須實際變更邏輯流程,但這也是更佳的做法。Mozilla 的 Ehsan Angkari 在這篇文章中提供了一個不錯的示例,說明如何執行這項操作。這篇文章說明瞭如何將音訊轉換為標準 Web Audio。

其中許多錯誤 (例如重新命名 createGainNode 和移除 createBuffer 中的同步解碼) 會明顯顯示在開發人員工具主控台中,但其他錯誤 (例如以下用法) 則不會:

MULTI_LINE_CODE_PLACEHOLDER_1

不會顯示,並且會靜默失敗 (myFilterNode.BANDPASS 會解析為 undefined,而嘗試將 .type 設為 undefined 的動作將無法產生任何效果)。順帶一提,這就是導致語音轉換器失敗的原因)。同樣地,只要將 filter.type 指派給用來運作的數字即可:

myFilterNode.type = 2;

但現在您必須使用字串列舉:

myFilterNode.type = bandpass;

因此,您可以使用 grep 搜尋程式碼中的以下字詞:

  • webkitAudioContext
  • .LOWPASS
  • .HIGHPASS
  • .BANDPASS
  • .LOWSHELF
  • .HIGHSHELF
  • .PEAKING
  • .NOTCH
  • .ALLPASS
  • .SINE
  • .SQUARE
  • .SAWTOOTH
  • .TRIANGLE
  • .noteOn
  • .noteGrainOn
  • .noteOff
  • .setWaveTable
  • .createWaveTable
  • .looping
  • .EQUALPOWER
  • .HRTF
  • .LINEAR
  • .INVERSE
  • .EXPONENTIAL
  • createGainNode
  • createDelayNode
  • .type (是的,這會產生許多誤報,但這是捕捉上述最後一個範例的唯一方法!)

再次提醒,如果您急著要開始使用,只要取得 我的 monkeypatch webkitAudioContext 程式庫的副本,並將其納入應用程式即可。祝您音訊駭客計畫順利!