m36 中的網路音訊變更

克里斯威爾森
Chris Wilson

網路音訊變更

Google 非常熱愛標準。Google 的使命是建構符合標準的網路平台。有鑑於此,Webkit 改以 Web Audio API 做為前置詞 (特別是 webkitAudioContext 物件),還有過去一直以來一直受到支援的一些網路音訊。

由於我們已開始支援未加上前置字串的 AudioContext 物件,因此 Chrome 36 原先會停止支援前置字串的 webkitAudioContext。結果,這是不是預期中的問題,因此 Chrome 36 支援未加上前置字元和前置字元。不過,即使在已重新導入 webkitAudioContext 中,某些舊版方法和屬性 (例如 createGetNode 與 createJavaScriptNode) 已移除。簡單來說,在 Chrome 36 WebkitAudioContext 和 AudioContext 中是彼此的別名,兩者的功能並無差異。

我們將在 Chrome 36 版後完全移除對前置字串的支援,但這可能會在幾個版本中推出。如有任何即將發生的變更,我們會在這裡公告,並持續與作者聯絡,修正他們的網路音訊應用程式。

我們為何要改用這個功能,而不改回先前的實作方式?事實上,我們一直堅持要反向移民服務。我們移除了這些 API。在此令人印象深刻的是,應用程式可在 Firefox 上順暢運作,因為 Firefox 之前在上秋季推出的 Web Audio 支援中,從未支援任何前置字串的 AudioContext 物件,也相當適當。

本次更新的其餘部分提供指引,協助您修正因這項變更而造成程式碼毀損的功能。修正這些問題的最大好處是,您的程式碼很可能也能在 Firefox 中正常運作!(我想很長一段時間,我的 Vocoder 應用程式是因 Firefox 實作而損壞,但結果似乎就是其中一個問題!)

如果您只是想要輕鬆運作,建議您看看我為編寫成舊版 Web Audio 程式碼的應用程式編寫的 monkey-patch 程式庫,這可協助您迅速設定和執行應用程式,因為它能為物件和方法設定適當的別名。事實上,程式庫清單的修補程式就是大方向變更的內容。

首先最重要的一點

所有對 window.webkitAudioContext 的參照都應改為對 window.AudioContext。我們經常可以透過簡單的做法解決這個問題:

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

如果您的應用程式傳回訊息 (例如「很抱歉,您的瀏覽器不支援網路音訊」)。請使用 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
  • 用於同步解碼編碼音訊資料的 blob 已移除的 AudioContext.createBuffer(ArrayBuffer, boolean)。如果同步呼叫需要很長的時間才能完成,則編寫程式碼是不良的程式設計做法,請改用非同步解碼音訊資料呼叫。這是最困難的變動之一,您需要實際變更邏輯流程,但這是更好的做法。Mozilla 的 Ehsan Angkari 寫在示範文章中,講解如何改用標準網路音訊

在開發人員工具控制台中,有許多這類錯誤 (例如將 createGetNode 重新命名,以及移除 createBuffer 中的同步解碼) 時,將顯然顯示為錯誤,但也有其他幾種錯誤,如下所示:

MULTI_LINE_CODE_PLACEHOLDER_1

將完全不會顯示,且無訊息失敗 (myFilterNode.BANDPASS 現在解析為未定義,而嘗試將 .type 設為未定義) 只會無法產生任何效果。順帶一提,Vioser 失敗的原因為何)。同樣地,只要將 filter.type 指派給過去使用的數字即可:

myFilterNode.type = 2;

但現在您需要使用字串列舉:

myFilterNode.type = “bandpass”;

因此,您可能會想要針對以下字詞透過在您的程式碼中看到:

  • 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 (沒錯,這會有很多偽陽性,但這是擷取上述最後一個範例的唯一方法!)

如果您急需設定並開始使用,只要取得 my monkeypatch webkitAudioContext 程式庫的副本,然後將其納入您的應用程式即可。祝你音訊入侵愉快!