m36'da Web Audio değişiklikleri

Chris Wilson
Chris Wilson

Web Audio değişiklikleri

Google'da standartlara önem veriyoruz. Standartlarla tanımlanmış bir web platformu oluşturma misyonumuz var. Bir süredir bu konudaki küçük sorunlardan biri, Web Audio API'nin (özellikle webkitAudioContext nesnesi) webkit ön ekiyle uygulanmış olması ve desteklemeye devam ettiğimiz, desteği sonlandırılmış bazı Web Audio parçalarıydı.

Başına ön ek eklenmemiş AudioContext nesnesini desteklemeye başladığımızdan, Chrome 36'da başına ön ek eklenmiş webkitAudioContext desteğinin kaldırılması planlanmıştı. Bu, beklenenden daha fazla soruna yol açtığından Chrome 36 hem ön eksiz hem de ön ekli yöntemleri destekler. Ancak yeniden kullanıma sunulan webkitAudioContext'te bile createGainNode ve createJavaScriptNode gibi bazı eski yöntemler ve özellikler kaldırılmıştır. Özetlemek gerekirse, Chrome 36'ta webkitAudioContext ve AudioContext birbirinin takma adıdır; bu iki öğe arasında işlevsel açıdan fark yoktur.

Önek desteği, Chrome 36'dan sonra muhtemelen birkaç sürümde tamamen kaldırılacaktır. Değişiklik yaklaştığında burada bir duyuru yapacağız. Ayrıca, yazarlarla iletişime geçerek Web Audio uygulamalarını düzeltmelerini istiyoruz.

Önceki uygulamaya geri dönmek yerine bunu neden yaptık? Bu kararımızın bir nedeni de, çok geriye gitmekten çekinmemizdir. Bu API'leri zaten kaldırmıştık. Bu takma adlandırmanın güzel bir yan etkisi olarak, uygulamalar Firefox'ta sorunsuz bir şekilde çalışabilir. Firefox, ilk olarak geçen sonbaharda kullanıma sunulan Web Audio desteğinde ön ek eklenmiş AudioContext nesnesini hiçbir zaman desteklememiştir (ve bu doğru bir karardır).

Bu güncellemenin geri kalanında, bu değişiklik nedeniyle kodunuzda bozulmuş olabilecek öğeleri düzeltmeyle ilgili bir kılavuz sağlanmaktadır. Bu sorunları düzeltmenin en iyi yanı, kodunuzun Firefox'ta da çalışma olasılığının yüksek olmasıdır. (Uzun süredir Vocoder uygulamamın Firefox'un uygulaması nedeniyle bozuk olduğunu düşünüyordum ancak bunun bu sorunlardan biri olduğu ortaya çıktı!)

Hemen çalışmaya başlamak istiyorsanız eski Web Audio koduyla yazılmış uygulamalar için yazdığım monkey-patch kitaplığına göz atabilirsiniz. Bu kitaplık, nesneleri ve yöntemleri uygun şekilde takma adlandıracağından minimum sürede çalışmaya başlamanıza yardımcı olabilir. Kitaplığın listelediği yamalar, değişen öğeler için iyi bir rehberdir.

Öncelikle

window.webkitAudioContext'e yapılan tüm referanslar window.AudioContext olarak değiştirilmelidir. Bu sorun genellikle aşağıdaki basit işlemle çözülebilir:

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

Uygulamanız "Maalesef tarayıcınız Web Audio'yu desteklemiyor. Lütfen Chrome veya Safari'yi kullanın." şeklinde bir mesaj görüyorsanız büyük olasılıkla webkitAudioContext için açıkça arama yapıyordur. Kötü geliştirici! Firefox'u aylardır destekliyor olabilirsiniz.

Ancak, bazılarının daha belirsiz olabileceği birkaç tane daha ince kod kaldırma işlemi vardır.

  • .type özelliği (artık dize) için BiquadFilter listelenen tür sabitleri artık BiquadFilterNode nesnesinde görünmüyor ve .type özelliğinde desteklenmiyor. Bu nedenle artık .LOWPASS (veya 0) değerini kullanmıyor, "lowpass" olarak ayarlıyorsunuz.
  • Ayrıca Oscillator.type özelliği de artık dize olarak listelenen bir türdür. .SAWTOOTH artık kullanılamaz.
  • PannerNode.type artık dize dizili bir türdür.
  • PannerNode.distanceModel artık dize dizili bir türdür.
  • createGainNode, createGain olarak yeniden adlandırıldı
  • createDelayNode, createDelay olarak yeniden adlandırıldı
  • createJavaScriptNode, createScriptProcessor olarak yeniden adlandırıldı
  • AudioBufferSourceNode.noteOn(), start() ile değiştirildi
  • AudioBufferSourceNode.noteGrainOn() de start() ile değiştirildi
  • AudioBufferSourceNode.noteOff(), stop() olarak yeniden adlandırıldı
  • OscillatorNode.noteOn(), start() olarak yeniden adlandırıldı
  • OscillatorNode.noteOff(), stop() olarak yeniden adlandırıldı
  • AudioParam.setTargetValueAtTime(), setTargetAtTime() olarak yeniden adlandırıldı
  • AudioContext.createWaveTable() ve OscillatorNode.setWaveTable(), createPeriodicWave() andsetPeriodicWave()` olarak yeniden adlandırıldı.
  • AudioBufferSourceNode.looping, .loop için kaldırıldı
  • AudioContext.createBuffer(ArrayBuffer, boolean) kodlanmış ses verilerinin bir blob'unun kodunun senkronize olarak çözülmesi özelliği kaldırıldı. Tamamlanması uzun süren eşzamanlı çağrılar kötü kodlama uygulamasıdır. Bunun yerine zaman uyumsuz decodeAudioData çağrısını kullanın. Bu, mantık akışını gerçekten değiştirmeniz gerektiğinden daha zor değişikliklerden biridir ancak çok daha iyi bir uygulamadır. Mozilla'dan Ehsan Angkari, standart Web Audio'ya geçişle ilgili makalesinde bunun nasıl yapılacağına dair güzel bir örnek yazdı.

Bunların çoğu (ör. createGainNode işlevinin yeniden adlandırılması ve createBuffer işlevindeki senkronize kod çözme işleminin kaldırılması) geliştirici araçları konsolunda hata olarak gösterilir. Ancak aşağıdaki kullanım gibi bazı durumlarda:

MULTI_LINE_CODE_PLACEHOLDER_1

hiç gösterilmez ve sessizce başarısız olur (myFilterNode.BANDPASS artık undefined olarak çözülür ve .type değerini undefined olarak ayarlama girişimi hiçbir etki oluşturmaz. Bu arada, ses kodlayıcının başarısız olmasına neden olan da buydu.) Benzer şekilde, filter.type parametresini bir sayıya atayarak da bu sorunu çözebilirsiniz:

myFilterNode.type = 2;

Ancak artık dize numaralandırmasını kullanmanız gerekir:

myFilterNode.type = bandpass;

Bu nedenle, kodunuzda aşağıdaki terimleri arayabilirsiniz:

  • 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 (Evet, bu yöntemde çok sayıda yanlış pozitif olacaktır ancak yukarıdaki son örneği yakalamanın tek yolu budur.)

Aceleniz varsa ve hemen çalışmaya başlamak istiyorsanız monkeypatch webkitAudioContext kitaplığımın bir kopyasını alıp uygulamanıza eklemeniz yeterlidir. İyi çalışmalar.