Update audio web di Chrome 49

Budiman
Chris Wilson

Chrome secara konsisten dan diam-diam meningkatkan dukungannya untuk Web Audio API. Di Chrome 49 (Beta mulai Februari 2016, dan diperkirakan akan menjadi Stabil pada Maret 2016), kami telah mengupdate beberapa fitur untuk melacak spesifikasi, dan juga menambahkan satu node baru.

decodeAudioData() sekarang menampilkan promise

Metode decodeAudioData() pada AudioContext sekarang menampilkan Promise, yang mengaktifkan penanganan pola asinkron berbasis Promise. Metode decodeAudioData() selalu menggunakan fungsi callback berhasil dan error sebagai parameter:

context.decodeAudioData( arraybufferData, onSuccess, onError);

Namun, kini Anda dapat menggunakan metode Promise standar untuk menangani sifat asinkron mendekode data audio:

context.decodeAudioData( arraybufferData ).then(
        (buffer) => { /* store the buffer */ },
        (reason) => { console.log("decode failed! " + reason) });

Meskipun dalam satu contoh terlihat lebih panjang, Promise membuat pemrograman asinkron lebih mudah dan lebih konsisten. Untuk kompatibilitas, fungsi callback Berhasil dan Error masih didukung, sesuai spesifikasi.

OfflineAudioContext sekarang mendukung menangguhkan() dan resume()

Secara sekilas, mungkin tampak aneh jika menangguhkan() di OfflineAudioContext. Lagi pula, suspend() telah ditambahkan ke AudioContext untuk mengaktifkan pemindahan hardware audio ke mode standby, yang tampaknya tidak ada gunanya dalam skenario saat Anda merender ke buffer (tentunya itulah tujuan OfflineAudioContext). Namun, inti dari fitur ini adalah kemampuan untuk membuat sebagian "skor" saja dalam satu waktu, untuk meminimalkan penggunaan memori. Anda dapat membuat lebih banyak node saat ditangguhkan di tengah proses render.

Sebagai contoh, Moonlight Sonata karya Beethoven berisi sekitar 6.500 catatan. Setiap "catatan" mungkin didekonstruksi menjadi setidaknya beberapa node grafik audio (mis., AudioBuffer dan node Keuntungan). Jika ingin merender keseluruhan tujuh setengah menit ke dalam buffer dengan OfflineAudioContext, Anda mungkin tidak ingin membuat semua node tersebut sekaligus. Sebagai gantinya, Anda dapat membuatnya dalam waktu singkat:

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();
}

Dengan demikian, Anda dapat meminimalkan jumlah node yang perlu dibuat sebelumnya pada awal rendering, dan mengurangi permintaan memori.

IIRFilterNode

Spesifikasi ini telah menambahkan node untuk audiophile yang ingin membuat infinite-impulse-response: IIRFilterNode. Filter ini melengkapi BiquadFilterNode, tetapi memungkinkan spesifikasi lengkap parameter respons filter (bukan AudioParams BiquadFilterNode yang mudah digunakan untuk jenis, frekuensi, Q, dan sejenisnya). IIRFilterNode memungkinkan spesifikasi filter yang tepat yang tidak dapat dibuat sebelumnya, seperti filter urutan tunggal; namun, penggunaan IIRFilterNode memerlukan pengetahuan mendalam tentang cara kerja filter IIR, dan filter juga tidak dapat dijadwalkan seperti BiquadFilterNodes.

Perubahan sebelumnya

Saya juga ingin menyebutkan beberapa peningkatan yang telah dilakukan sebelumnya: di Chrome 48, otomatisasi node BiquadFilter mulai berjalan dengan kecepatan audio. API tidak berubah sama sekali untuk melakukan ini, tetapi ini berarti sweep filter Anda akan terdengar lebih lancar. Selain itu, di Chrome 48, kami menambahkan perantaian ke metode AudioNode.connect() dengan menampilkan node yang kita hubungkan. Hal ini mempermudah pembuatan rantai node, seperti dalam contoh ini:

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

Itu saja untuk saat ini, dan teruslah bermain!