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 obiekcieBiquadFilterNode
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 nacreateGain
- Nazwa
createDelayNode
została zmieniona nacreateDelay
- Nazwa
createJavaScriptNode
została zmieniona nacreateScriptProcessor
- 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()
nastop()
- Zmieniono nazwę
OscillatorNode.noteOn()
nastart()
- Zmieniono nazwę
OscillatorNode.noteOff()
nastop()
- Zmieniono nazwę
AudioParam.setTargetValueAtTime()
nasetTargetAtTime()
- Funkcje
AudioContext.createWaveTable()
iOscillatorNode.setWaveTable()
zostały teraz przemianowane nacreatePeriodicWave() and
setPeriodicWave() (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!