Chrome 49'da web ses güncellemeleri

Cem Yılmaz
Chris Wilson

Chrome, Web Audio API için sunduğu desteği tutarlı ve sessiz bir şekilde iyileştirmektedir. Chrome 49'da (Şubat 2016'dan itibaren Beta ve Mart 2016'da Kararlı olacağını tahmin ediyoruz), spesifikasyonu takip etmek için çeşitli özellikleri güncelledik ve ayrıca yeni bir düğüm ekledik.

decodeAudioData() artık bir vaat döndürüyor

AudioContext üzerindeki decodeAudioData() yöntemi artık bir Promise döndürerek Promise tabanlı eşzamansız kalıp işlemeyi etkinleştirir. decodeAudioData() yöntemi, her zaman başarı ve hata geri çağırma işlevlerini parametre olarak alır:

context.decodeAudioData( arraybufferData, onSuccess, onError);

Ancak artık ses verilerinin kodunu çözmenin eşzamansız doğası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'lar eşzamansız programlamayı daha kolay ve daha tutarlı hale getirmektedir. Uyumluluk için Başarılı ve Hata geri çağırma işlevleri spesifikasyona göre hâlâ desteklenmektedir.

ÇevrimdışıAudioBağlam artık askıya alma işlevini ve devam ettirme işlevini destekliyor

OfflineAudioContext bir şekilde pozisyonun, bir üzerinde askıya alınması ilk bakışta garip görünebilir. Sonuçta suspend(), ses donanımının bekleme moduna alınmasını sağlamak için AudioContext'a eklendi. Bu mod, bir arabelleğe aldığınız senaryolarda bir anlam ifade etmez (elbette OfflineAudioContext için de geçerlidir). Bununla birlikte bu özelliğin amacı, bellek kullanımını en aza indirmek için aynı anda bir "puanın" yalnızca bir kısmını oluşturabilmektir. Oluşturma işleminin ortasında askıya alınmış durumdayken daha fazla düğüm oluşturabilirsiniz.

Örneğin, Beethoven'ın Ay Işığı Sonatı'nda yaklaşık 6.500 nota yer alıyor. Her "not", muhtemelen en az birkaç ses grafiği düğümüne (ör. bir AudioBuffer ve bir Kazanç düğümü) dönüşür. Yedi buçuk dakikalık sürenin tamamını OfflineAudioContext kullanarak bir tampon haline getirmek istiyorsanız muhtemelen tüm bu düğümleri aynı anda oluşturmak istemezsiniz. Bunun yerine, bunları zaman dilimlerinde 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, oluşturma işleminin başında önceden oluşturulması gereken düğüm sayısını ve bellek taleplerini azaltmanızı sağlar.

IIRFilterNode

Bu spesifikasyon, tam olarak belirtilmiş infinite-impulse-Responselarını oluşturmak isteyen ses tutkunları için bir düğüm ekledi: IIRFilterNode. Bu filtre, BiquadFilterNode'u tamamlar ancak (BiquadFilterNode'in tür, sıklık, Q vb. için kullanımı kolay AudioParams filtresi yerine) filtre yanıt parametrelerinin tam olarak belirtilmesine izin verir. IIRFilterNode, tek sıralı filtreler gibi daha önce oluşturulamayan filtrelerin hassas bir şekilde belirtilmesini sağlar. Ancak IIRFilterNode'un kullanılması, IIR filtrelerinin nasıl çalıştığına dair ayrıntılı bilgi gerektirir ve BiquadFilterNodes gibi planlanamazlar.

Önceki değişiklikler

Ayrıca, daha önce yapılan birkaç iyileştirmeden de bahsetmek isteriz: Chrome 48'de, BiquadFilter düğüm otomasyonu ses hızında çalışmaya başladı. Bu işlemi yapmak için API'de herhangi bir değişiklik yapılmamıştır ancak filtre süpürme işlemlerinizin daha akıcı bir şekilde çalışacağı anlamına gelir. Ayrıca Chrome 48'de, bağlandığımız düğümü döndürerek AudioNode.connect() yöntemine zincirleme bağlamayı ekledik. Bu, aşağıdaki örnekte olduğu gibi düğüm zincirlerini oluşturmayı kolaylaştırır:

sourceNode.connect(gainNode).connect(filterNode).connect(context.destination);

Şimdilik bu kadar. Başarılarınızın devamını dileriz.