Update audio web di Chrome 49

Chris Wilson
Chris Wilson

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

decodeAudioData() kini menampilkan promise

Metode decodeAudioData() di AudioContext kini menampilkan Promise, yang memungkinkan penanganan pola asinkron berbasis Promise. Metode decodeAudioData() selalu menggunakan fungsi callback sukses dan error sebagai parameter:

context.decodeAudioData( arraybufferData, onSuccess, onError);

Namun, sekarang Anda dapat menggunakan metode Promise standar untuk menangani sifat asinkron decoding data audio:

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

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

OfflineAudioContext kini mendukung suspend() dan resume()

Sekilas, mungkin tampak aneh untuk memiliki suspend() di OfflineAudioContext. Lagi pula, suspend() ditambahkan ke AudioContext untuk memungkinkan hardware audio masuk ke mode standby, yang tampaknya tidak ada gunanya dalam skenario saat Anda merender ke buffering (tentu saja, itulah tujuan OfflineAudioContext). Namun, tujuan fitur ini adalah untuk dapat membuat hanya sebagian "skor" pada 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 not. Setiap "catatan" mungkin didekonstruksi menjadi minimal beberapa node grafik audio (misalnya, node AudioBuffer dan Gain). Jika ingin merender seluruh tujuh setengah menit ke dalam buffer dengan OfflineAudioContext, Anda mungkin tidak ingin membuat semua node tersebut sekaligus. Sebagai gantinya, Anda dapat membuatnya dalam bagian waktu:

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

Hal ini akan memungkinkan Anda meminimalkan jumlah node yang perlu dibuat sebelumnya di awal rendering, dan mengurangi permintaan memori.

IIRFilterNode

Spesifikasi telah menambahkan node untuk audiophile yang ingin membuat infinite-impulse-response sendiri yang ditentukan dengan tepat: 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 akurat yang tidak dapat dibuat sebelumnya, seperti filter urutan tunggal; Namun, penggunaan IIRFilterNode memerlukan beberapa pengetahuan mendalam tentang cara kerja filter IIR, dan filter tersebut 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 pada kecepatan audio. API tidak berubah sama sekali untuk melakukan hal ini, tetapi ini berarti sapuan filter Anda akan terdengar lebih halus. Selain itu, di Chrome 48, kami menambahkan rantai ke metode AudioNode.connect() dengan menampilkan node yang terhubung. Hal ini memudahkan pembuatan rantai node, seperti dalam contoh ini:

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

Sekian untuk saat ini, dan teruslah berkarya!