Изменения веб-аудио в m36

Крис Уилсон
Chris Wilson

Изменения в веб-аудио

Мы в 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 и включите ее в свое приложение. Удачного аудио взлома!