Zmiany Web Audio w M36

Chris Wilson
Chris Wilson

Zmiany w Web Audio

W Google uwielbiamy standardy. Naszą misją jest tworzenie platformy internetowej opartej na standardach. Jednym z problemów, z którymi borykaliśmy się przez jakiś czas, była implementacja Web Audio API z prefiksem webkit (zwłaszcza obiekt webkitAudioContext) oraz niektóre wycofane elementy Web Audio, które nadal obsługiwaliśmy.

Pierwotnie planowaliśmy, że w Chrome 36 wyłączymy obsługę prefiksowanego webkitAudioContext, ponieważ zaczęliśmy obsługiwać obiekt AudioContext bez prefiksu. Okazało się, że jest to bardziej kłopotliwe niż się spodziewaliśmy, dlatego Chrome 36 obsługuje zarówno nazwy z preiksem, jak i bez niego. Jednak nawet w przypadku ponownie wprowadzonego webkitAudioContext usunięto kilka starszych metod i atrybutów, takich jak createGainNode i createJavaScriptNode. Krótko mówiąc, w Chrome 36 webkitAudioContext i AudioContext są aliasami siebie nawzajem; nie ma między nimi różnic w funkcjonalności.

Po Chrome 36 całkowicie usuniemy obsługę prefiksu, prawdopodobnie w kilku kolejnych wersjach. Gdy zmiana będzie nieuchronna, opublikujemy o niej komunikat. Wciąż też kontaktujemy się z autorami, aby poprawili swoje aplikacje Web Audio.

Dlaczego zdecydowaliśmy się na tę zmianę, zamiast przywrócić poprzednią implementację? Nie chcieliśmy cofać się zbytnio w czasie. Usunęliśmy te interfejsy API i jako przyjemny efekt uboczny tego zastąpienia aplikacje mogą teraz płynnie działać w Firefoksie, który nigdy nie obsługiwał obiektu AudioContext z prefiksem (i słusznie!). Obsługa Web Audio została wprowadzona w jego przypadku jesienią ubiegłego roku.

W dalszej części tej aktualizacji znajdziesz wskazówki dotyczące naprawiania elementów kodu, które mogą nie działać prawidłowo z powodu tej zmiany. Rozwiązanie tych problemów ma tę zaletę, że Twój kod będzie prawdopodobnie działał też w Firefoksie. (Długo myślałem, że moja aplikacja Vocoder jest uszkodzona z powodu implementacji w Firefoksie, ale okazało się, że to jeden z tych problemów).

Jeśli chcesz tylko zacząć pracę, możesz skorzystać z monkey-patch biblioteki, którą napisałem dla aplikacji napisanych w starym kodzie Web Audio. Pomoże Ci to zacząć pracę w minimalnym czasie, ponieważ odpowiednio zdefiniuje aliasy obiektów i metod. W zasadzie, zmiany w bibliotece są dobrze widoczne w łatkach.

Przede wszystkim

Wszelkie odwołania do window.webkitAudioContext powinny być zastąpione odwołaniami do window.AudioContext. Często można to naprawić, wykonując te proste czynności:

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

Jeśli aplikacja odpowiada komunikatem „Niestety, Twoja przeglądarka nie obsługuje Web Audio. Użyj przeglądarki Chrome lub Safari”. Prawdopodobnie szuka ona webkitAudioContext. Niewłaściwy deweloper Możesz wspierać Firefoxa od miesięcy.

Istnieją jednak inne, bardziej subtelne sposoby usuwania kodu, z których niektóre mogą być mniej oczywiste.

  • Stałe typu zaokrąglonego BiquadFilter dla atrybutu .type (który jest teraz ciągiem znaków) nie pojawiają się już w obiekcie BiquadFilterNode i nie są obsługiwane w atrybucie .type. Nie używasz już wartości .LOWPASS (ani 0) – ustawiasz ją na „lowpass”.
  • Atrybut Oscillator.type jest teraz również typem ciągu znaków, a nie jak wcześniej .SAWTOOTH.
  • PannerNode.type jest teraz również typem ciągu z wyliczeniami.
  • PannerNode.distanceModel jest teraz również typem ciągu z wyliczeniami.
  • Nazwa createGainNode została zmieniona na createGain
  • Nazwa createDelayNode została zmieniona na createDelay
  • Nazwa createJavaScriptNode została zmieniona na createScriptProcessor
  • Wartość AudioBufferSourceNode.noteOn() została zastąpiona wartością start()
  • Wartość AudioBufferSourceNode.noteGrainOn() została też zastąpiona wartością start()
  • Zmieniono nazwę AudioBufferSourceNode.noteOff() na stop()
  • Zmieniono nazwę OscillatorNode.noteOn() na start()
  • Zmieniono nazwę OscillatorNode.noteOff() na stop()
  • Zmieniono nazwę AudioParam.setTargetValueAtTime() na setTargetAtTime()
  • Funkcje AudioContext.createWaveTable()OscillatorNode.setWaveTable() zostały teraz przemianowane na createPeriodicWave() andsetPeriodicWave() (ustaw okresową falę).
  • Adres AudioBufferSourceNode.looping został usunięty na rzecz adresu .loop
  • Funkcja AudioContext.createBuffer(ArrayBuffer, boolean) do synchronicznego dekodowania zaszyfrowanych danych audio została usunięta. Wywołania synchroniczne, które zajmują dużo czasu, to zła praktyka kodowania. Zamiast nich używaj asynchronicznego wywołania decodeAudioData. Jest to jedna z bardziej skomplikowanych zmian – musisz zmienić przepływ logiki – ale znacznie lepsza. Ehsan Angkari z Mozilla opisał przykład, jak to zrobić, w artykule o konwertowaniu na standardowy format Web Audio.

Wiele z nich (np. zmiana nazwy funkcji createGainNode i usunięcie synchronicznego dekodowania w funkcji createBuffer) będzie oczywiście widoczne w konsoli narzędzi dla deweloperów jako błąd. Jednak inne, takie jak ten fragment kodu:

MULTI_LINE_CODE_PLACEHOLDER_1

nie pojawi się w ogóle i nie wywoła żadnego efektu (myFilterNode.BANDPASS zostanie przekształcony w undefined, a próba ustawienia wartości .type jako undefined nie przyniesie żadnego efektu. (To właśnie powodowało błąd kodera mowy). Podobnie, przypisując wartość typu filtra do liczby, która była używana:

myFilterNode.type = 2;

Teraz musisz użyć wyliczenia ciągów znaków:

myFilterNode.type = bandpass;

Możesz więc przeszukać kod pod kątem tych terminów:

  • 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 (tak, będzie to powodować wiele wyników fałszywie pozytywnych, ale jest to jedyny sposób na wykrycie ostatniego przykładu powyżej).

Jeśli nie masz czasu i chcesz szybko zacząć pracę, pobierz kopię biblioteki webkitAudioContext z monkeypatch i dodaj ją do aplikacji. Życzymy udanego tworzenia dźwięku!