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 usunięcie obsługi interfejsu webkitAudioContext z prefiksem w Chrome 36, 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 zmiany staną się nieuniknione, opublikujemy o tym 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!). Web Audio zostało wprowadzone 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ż odpowiednie 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.
  • Wartość PannerNode.type jest teraz także typu wyliczonego ciągu znaków.
  • Wartość PannerNode.distanceModel jest teraz również typu wyliczonego ciągu znaków.
  • Zmieniono nazwę z createGainNode na createGain
  • Zmieniono nazwę z createDelayNode na createDelay
  • Zmieniono nazwę z createJavaScriptNode 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ę z AudioBufferSourceNode.noteOff() na stop()
  • Zmieniono nazwę z OscillatorNode.noteOn() na start()
  • Zmieniono nazwę z OscillatorNode.noteOff() na stop()
  • Zmieniono nazwę z AudioParam.setTargetValueAtTime() na setTargetAtTime()
  • Funkcje AudioContext.createWaveTable()OscillatorNode.setWaveTable() zostały teraz przemianowane na createPeriodicWave() andsetPeriodicWave()().
  • 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 przekształcaniu do standardowego formatu 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 przykład:

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 awarię vokodera). 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 przeszukiwać 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ąć, pobierz kopię biblioteki webkitAudioContext z monkeypatch i dodaj ją do aplikacji. Życzymy udanego tworzenia dźwięku!