Изменения в веб-аудио
Мы в Google любим стандарты. Наша цель — создать веб-платформу, соответствующую стандартам. Одним из небольших недостатков в течение некоторого времени была реализация API веб-аудио с префиксом webkit (в частности, объекта webkitAudioContext) и некоторые устаревшие части веб-аудио, которые мы продолжаем поддерживать.
Первоначально планировалось, что в Chrome 36 будет удалена поддержка объекта webkitAudioContext с префиксом, поскольку мы начали поддерживать объект AudioContext без префикса. Это оказалось более хлопотным, чем ожидалось, поэтому Chrome 36 поддерживает как префиксы, так и префиксы — однако даже в вновь представленном webkitAudioContext несколько устаревших методов и атрибутов, таких как createGainNode и createJavaScriptNode, были удалены. Короче говоря, в Chrome 36 webkitAudioContext и AudioContext являются псевдонимами друг друга; между ними нет никакой разницы в функциональности.
Мы полностью удалим поддержку префикса после Chrome 36, вероятно, через пару релизов. Мы объявим здесь, когда изменение станет неизбежным, и продолжаем обращаться к авторам с просьбой исправить их приложения веб-аудио.
Почему мы сделали это, а не вернулись к предыдущей реализации? Ну, отчасти мы не хотели отходить слишком далеко назад; мы уже удалили эти API, и в качестве приятного побочного эффекта этого псевдонимирования приложения могут прекрасно работать в Firefox, который никогда не поддерживал объект AudioContext с префиксом (и это тоже совершенно правильно!) в своей первоначально выпущенной поддержке веб-аудио. прошлой осенью.
Остальная часть этого обновления содержит руководство по исправлению ошибок в вашем коде из-за этого изменения. Самое замечательное в решении этих проблем заключается в том, что ваш код, скорее всего, будет работать и в Firefox! (Долгое время я думал, что мое приложение Vocoder сломалось из-за реализации Firefox, но оказалось, что это одна из этих проблем!)
Если вы просто хотите приступить к работе, вы можете взглянуть на библиотеку обезьяньих патчей, которую я написал для приложений, написанных на старом коде веб-аудио — это может помочь вам начать работу за минимальное количество времени. время, так как оно будет соответствующим образом назначать псевдонимы объектам и методам. Действительно, патчи, перечисленные в библиотеке, являются хорошим путеводителем по тому, что изменилось.
Прежде всего
Любые ссылки на window.webkitAudioContext
вместо этого следует делать на window.AudioContext
. Часто это исправляется с помощью простого:
window.AudioContext = window.AudioContext || window.webkitAudioContext;
Если ваше приложение отвечает что-то вроде «К сожалению, ваш браузер не поддерживает веб-аудио. Пожалуйста, используйте Chrome или Safari». - вполне вероятно, что он явно ищет webkitAudioContext
. Плохой разработчик! Вы могли бы поддерживать Firefox месяцами!
Но есть и другие, более тонкие удаления кода, некоторые из которых могут быть менее очевидными.
- Константы перечисляемого типа BiquadFilter для атрибута
.type
(который теперь является строкой) больше не отображаются в объекте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() and
setPeriodicWave()`. -
AudioBufferSourceNode.looping
был удален в пользу.loop
-
AudioContext.createBuffer(ArrayBuffer, boolean)
для синхронного декодирования фрагмента закодированных аудиоданных был удален. Синхронные вызовы, выполнение которых занимает много времени, являются плохой практикой кодирования; вместо этого используйте асинхронный вызов decodeAudioData. Это одно из наиболее сложных изменений — вам нужно фактически изменить логический поток — но это гораздо лучшая практика. Эхсан Ангкари из Mozilla написал хороший пример того, как это сделать, в своем посте о преобразовании в стандартное веб-аудио .
Многие из них (например, переименование createGainNode и удаление синхронного декодирования в createBuffer), очевидно, будут отображаться в консоли инструментов разработчика как ошибка, однако некоторые другие, например, такое использование:
MULTI_LINE_CODE_PLACEHOLDER_1
не будет отображаться вообще и произойдет молчаливый сбой (теперь myFilterNode.BANDPASS будет разрешен в undefined, а попытка установить .type в undef просто не даст никакого эффекта. Это, кстати, и было причиной того, что вокодер потерпеть неудачу.) Аналогично, просто присвоив 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
(да, здесь будет много ложных срабатываний, но это единственный способ уловить последний пример выше!)
Еще раз: если вы спешите и хотите приступить к работе, просто возьмите копию моей библиотеки Monkeypatch webkitAudioContext и включите ее в свое приложение. Удачного аудио взлома!