Perubahan Audio Web di m36

Chris Wilson
Chris Wilson

Perubahan Web Audio

Di Google, kami menyukai standar. Kami memiliki misi untuk membangun platform Web yang ditentukan standar. Salah satu masalah kecil yang selama beberapa waktu ini terjadi adalah implementasi Web Audio API dengan awalan webkit (terutama objek webkitAudioContext), dan beberapa bagian Web Audio yang tidak digunakan lagi yang terus kami dukung.

Awalnya, Chrome 36 akan menghapus dukungan untuk webkitAudioContext yang diawali dengan awalan, karena kami telah mulai mendukung objek AudioContext tanpa awalan. Hal ini ternyata lebih merepotkan dari yang diperkirakan, sehingga Chrome 36 mendukung tanpa awalan dan dengan awalan - namun, bahkan di webkitAudioContext yang diperkenalkan kembali, beberapa metode dan atribut lama seperti createGainNode dan createJavaScriptNode telah dihapus. Singkatnya, di Chrome 36, webkitAudioContext dan AudioContext adalah alias satu sama lain; tidak ada perbedaan fungsi antara keduanya.

Kami akan menghapus dukungan untuk awalan ini sepenuhnya setelah Chrome 36, kemungkinan dalam beberapa rilis. Kami akan membuat pengumuman di sini jika perubahan akan segera dilakukan, dan kami terus menghubungi penulis untuk memperbaiki aplikasi Audio Web mereka.

Mengapa kita melakukan hal ini, bukan kembali ke implementasi sebelumnya? Yah, sebagian, kami enggan untuk mundur terlalu jauh; kami telah menghapus API tersebut, dan sebagai efek samping yang bagus untuk alias ini, aplikasi kemudian dapat berfungsi dengan baik di Firefox, yang belum pernah mendukung objek AudioContext dengan awalan (dan juga benar!) dalam dukungan Audio Web mereka yang awalnya dirilis musim gugur lalu.

Bagian lainnya dari update ini memberikan panduan untuk memperbaiki hal-hal yang mungkin rusak dalam kode Anda karena perubahan ini. Keuntungan dari memperbaiki masalah ini adalah kode Anda kemungkinan besar juga akan berfungsi di Firefox. (Saya sudah lama mengira bahwa aplikasi Vocoder saya rusak karena penerapan Firefox, tetapi ternyata salah satu masalah ini yang menyebabkannya!)

Jika Anda hanya ingin menyiapkan dan menjalankannya, sebaiknya lihat library monkey-patch yang saya tulis untuk aplikasi yang ditulis ke kode Web Audio lama - ini dapat membantu Anda menyiapkan dan menjalankannya dalam waktu minimum, karena akan membuat alias objek dan metode dengan tepat. Memang, patch yang tercantum dalam library adalah panduan yang baik untuk hal-hal yang telah berubah.

Pertama dan terpenting

Setiap referensi ke window.webkitAudioContext harus dibuat ke window.AudioContext. Sering kali, masalah ini telah diperbaiki dengan:

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

Jika aplikasi Anda merespons dengan sesuatu seperti “Sayangnya, browser Anda tidak mendukung Audio Web. Gunakan Chrome atau Safari.” - kemungkinan besar secara eksplisit mencari webkitAudioContext. Developer yang buruk! Anda mungkin telah mendukung Firefox selama berbulan-bulan.

Namun, ada beberapa penghapusan kode lain yang lebih halus, beberapa di antaranya mungkin kurang jelas.

  • Konstanta jenis yang dihitung BiquadFilter untuk atribut .type (yang sekarang berupa string) tidak lagi muncul di objek BiquadFilterNode, dan kami tidak mendukungnya di atribut .type. Jadi, Anda tidak lagi menggunakan .LOWPASS (atau 0) - Anda menyetelnya ke “lowpass”.
  • Selain itu, atribut Oscillator.type kini juga merupakan jenis string yang dienumerasi - tidak ada lagi .SAWTOOTH.
  • PannerNode.type kini juga merupakan jenis enumerasi string.
  • PannerNode.distanceModel kini juga merupakan jenis enumerasi string.
  • createGainNode diganti namanya menjadi createGain
  • createDelayNode diganti namanya menjadi createDelay
  • createJavaScriptNode diganti namanya menjadi createScriptProcessor
  • AudioBufferSourceNode.noteOn() kini diganti dengan start()
  • AudioBufferSourceNode.noteGrainOn() kini juga diganti dengan start()
  • AudioBufferSourceNode.noteOff() diganti nama menjadi stop()
  • OscillatorNode.noteOn() diganti nama menjadi start()
  • OscillatorNode.noteOff() diganti nama menjadi stop()
  • AudioParam.setTargetValueAtTime() diganti nama menjadi setTargetAtTime()
  • AudioContext.createWaveTable() dan OscillatorNode.setWaveTable() kini diganti namanya menjadi createPeriodicWave() andsetPeriodicWave()`.
  • AudioBufferSourceNode.looping dihapus, diganti dengan .loop
  • AudioContext.createBuffer(ArrayBuffer, boolean) untuk mendekode blob data audio yang dienkode secara sinkron telah dihapus. Panggilan sinkron yang memerlukan waktu lama untuk diselesaikan adalah praktik coding yang buruk; gunakan panggilan decodeAudioData asinkron. Ini adalah salah satu perubahan yang lebih menantang - Anda harus benar-benar mengubah alur logika - tetapi merupakan praktik yang jauh lebih baik. Ehsan Angkari dari Mozilla menulis contoh yang bagus tentang cara melakukannya dalam postingannya tentang mengonversi ke Audio Web standar.

Banyak dari perubahan ini (seperti penggantian nama createGainNode, dan penghapusan decoding sinkron di createBuffer) akan muncul di konsol alat developer sebagai error - namun, beberapa lainnya, seperti penggunaan ini:

MULTI_LINE_CODE_PLACEHOLDER_1

tidak akan muncul sama sekali, dan gagal secara diam-diam (myFilterNode.BANDPASS kini akan di-resolve ke undefined, dan upaya untuk menetapkan .type ke undefined hanya akan gagal menghasilkan efek apa pun. Omong-omong, inilah yang menyebabkan vocoder gagal.) Demikian pula, cukup tetapkan filter.type ke angka yang digunakan untuk berfungsi:

myFilterNode.type = 2;

Namun, sekarang Anda perlu menggunakan enumerasi string:

myFilterNode.type = bandpass;

Jadi, Anda dapat grep kode untuk istilah berikut:

  • 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 (ya, ini akan menghasilkan banyak positif palsu - tetapi ini adalah satu-satunya cara untuk menangkap contoh terakhir di atas!)

Sekali lagi, jika Anda terburu-buru dan ingin segera memulai, cukup ambil salinan library webkitAudioContext monkeypatch saya dan sertakan dalam aplikasi Anda. Selamat Mencoba Hacking Audio!