Chrome, Web Audio API desteğini sürekli ve sessizce iyileştirmektedir. Chrome 49'da (Şubat 2016 itibarıyla Beta sürümünde, Mart 2016'da Mevcut Ürün sürümüne geçmesi bekleniyor) spesifikasyonu takip etmek için çeşitli özellikleri güncelledik ve bir yeni düğüm ekledik.
decodeAudioData() artık bir promise döndürüyor
AudioContext
üzerindeki decodeAudioData() yöntemi artık Promise tabanlı asenkron kalıp işlemeyi etkinleştiren bir Promise
döndürüyor. decodeAudioData()
yöntemi, her zaman parametre olarak başarı ve hata geri çağırma işlevlerini almıştır:
context.decodeAudioData( arraybufferData, onSuccess, onError);
Ancak artık ses verilerinin kodunu çözmenin eşzamansız yapısını işlemek için standart Promise yöntemini kullanabilirsiniz:
context.decodeAudioData( arraybufferData ).then(
(buffer) => { /* store the buffer */ },
(reason) => { console.log("decode failed! " + reason) });
Tek bir örnekte bu daha ayrıntılı görünse de Promise'ler, asenkron programlamayı daha kolay ve tutarlı hale getirir. Uyumluluk için, başarı ve hata geri çağırma işlevleri, spesifikasyona göre hâlâ desteklenmektedir.
OfflineAudioContext artık suspend() ve resume() işlevlerini destekliyor
İlk bakışta, OfflineAudioContext üzerinde suspend() işlevinin kullanılması garip görünebilir.
Sonuçta suspend()
, ses donanımının bekleme moduna geçirilmesini sağlamak için AudioContext
'e eklenmiştir. Bu, bir arabelleğe oluşturma işlemi gerçekleştirdiğiniz senaryolarda anlamsız görünür (OfflineAudioContext
'nin amacı elbette budur).
Ancak bu özelliğin amacı, bellek kullanımını en aza indirmek için bir "puan"ın yalnızca bir kısmını aynı anda oluşturabilmektir. Oluşturma işleminin ortasında askıya alınmışken daha fazla düğüm oluşturabilirsiniz.
Örneğin, Beethoven'ın Ay Işığı Sonatı yaklaşık 6.500 nota içerir.
Her "nota" muhtemelen en az birkaç ses grafiği düğümüne (ör. bir AudioBuffer ve bir Gain düğümü) ayrılır. Yedi buçuk dakikanın tamamını OfflineAudioContext
ile bir arabelleğe oluşturmak istiyorsanız muhtemelen tüm bu düğümleri tek seferde oluşturmak istemezsiniz. Bunun yerine, bunları zaman dilimleri halinde oluşturabilirsiniz:
var context = new OfflineAudioContext(2, length, sampleRate);
scheduleNextBlock();
context.startRendering().then( (buffer) => { /* store the buffer */ } );
function scheduleNextBlock() {
// create any notes for the next blockSize number of seconds here
// ...
// make sure to tell the context to suspend again after this block;
context.suspend(context.currentTime + blockSize).then( scheduleNextBlock );
context.resume();
}
Bu sayede, oluşturma işleminin başında önceden oluşturulması gereken düğüm sayısını en aza indirebilir ve bellek taleplerini azaltabilirsiniz.
IIRFilterNode
Spesifikasyona, kendi hassas olarak belirtilen sonsuz impuls yanıtlarını oluşturmak isteyen ses tutkunları için bir düğüm eklendi: IIRFilterNode.
Bu filtre, BiquadFilterNode'u tamamlar ancak filtre yanıtı parametrelerinin tam olarak belirtilmesine olanak tanır (tür, frekans, Q ve benzeri için BiquadFilterNode
'ın kullanımı kolay AudioParams
yerine). IIRFilterNode
, tek siparişli filtreler gibi daha önce oluşturulamayan filtrelerin hassas bir şekilde belirtilmesine olanak tanır. Ancak IIRFilterNode'u kullanmak için IIR filtrelerinin işleyiş şekli hakkında derin bilgi sahibi olmanız gerekir. Ayrıca, BiquadFilterNode'lar gibi planlanamaz.
Önceki değişiklikler
Daha önce kullanıma sunulan birkaç iyileştirmeden de bahsetmek isterim: Chrome 48'de BiquadFilter
düğüm otomasyonu ses hızında çalışmaya başladı. API bu işlem için hiç değişmedi ancak filtre geçişlerinizin daha da yumuşak ses çıkaracağı anlamına geliyor. Chrome 48'de, bağlandığımız düğümü döndürerek AudioNode.connect()
yöntemine zincirleme ekledik. Bu sayede, aşağıdaki örnekte gösterildiği gibi düğüm zincirleri oluşturmak daha kolaydır:
sourceNode.connect(gainNode).connect(filterNode).connect(context.destination);
Şimdilik bu kadar. İyi çalışmalar.