Thay đổi về Web Audio
Tại Google, chúng tôi rất yêu thích các tiêu chuẩn. Chúng tôi đang nỗ lực xây dựng nền tảng Web được xác định theo tiêu chuẩn. Một trong những vấn đề nhỏ trong thời gian đó là việc triển khai Web Audio API có tiền tố webkit (đặc biệt là đối tượng webkitAudioContext) và một số phần không còn được dùng nữa của Web Audio mà chúng tôi vẫn tiếp tục hỗ trợ.
Ban đầu, Chrome 36 dự kiến sẽ xoá tính năng hỗ trợ cho webkitAudioContext có tiền tố, vì chúng tôi đã bắt đầu hỗ trợ đối tượng AudioContext không có tiền tố. Việc này rắc rối hơn dự kiến, vì vậy, Chrome 36 hỗ trợ cả không có tiền tố và có tiền tố – tuy nhiên, ngay cả trong webkitAudioContext được giới thiệu lại, một số phương thức và thuộc tính cũ như createGainNode và createJavaScriptNode đã bị xoá. Tóm lại, trong Chrome 36, webkitAudioContext và AudioContext là các bí danh của nhau; không có sự khác biệt về chức năng giữa hai bí danh này.
Chúng tôi sẽ xoá hoàn toàn tính năng hỗ trợ tiền tố này sau Chrome 36, có thể là trong một vài bản phát hành. Chúng tôi sẽ thông báo tại đây khi thay đổi sắp diễn ra. Đồng thời, chúng tôi sẽ tiếp tục liên hệ với các tác giả để khắc phục ứng dụng Web Audio của họ.
Tại sao chúng ta lại làm như vậy thay vì quay lại cách triển khai trước đó? Một phần là do chúng tôi không muốn quay lại quá xa; chúng tôi đã xoá các API đó và như một hiệu ứng phụ tốt đẹp cho hiện tượng răng cưa này, các ứng dụng có thể hoạt động tốt trên Firefox, trình duyệt chưa bao giờ hỗ trợ đối tượng AudioContext có tiền tố (và cũng đúng như vậy!) trong tính năng hỗ trợ Web Audio được phát hành lần đầu vào mùa thu năm ngoái.
Phần còn lại của bản cập nhật này cung cấp hướng dẫn khắc phục những vấn đề có thể xảy ra trong mã của bạn do thay đổi này. Điều tuyệt vời khi khắc phục những vấn đề này là mã của bạn cũng có khả năng sẽ hoạt động trong Firefox! (Tôi đã nghĩ rằng ứng dụng Vocoder của mình bị hỏng do cách triển khai của Firefox, nhưng hóa ra đó là một trong những vấn đề này!)
Nếu chỉ muốn bắt đầu và chạy, bạn nên xem thư viện bản vá con khỉ mà tôi đã viết cho các ứng dụng được viết bằng mã Web Audio cũ – thư viện này có thể giúp bạn bắt đầu và chạy trong thời gian tối thiểu, vì thư viện này sẽ gán biệt hiệu cho các đối tượng và phương thức một cách thích hợp. Thật vậy, các bản vá mà thư viện liệt kê là một hướng dẫn hữu ích về những thay đổi.
Trước hết
Mọi tham chiếu đến window.webkitAudioContext
phải được chuyển sang window.AudioContext
. Thông thường, vấn đề này được khắc phục bằng một thao tác đơn giản:
window.AudioContext = window.AudioContext || window.webkitAudioContext;
Nếu ứng dụng của bạn phản hồi bằng nội dung như "Rất tiếc, trình duyệt của bạn không hỗ trợ Web Audio. Vui lòng sử dụng Chrome hoặc Safari”. – rất có thể bạn đang tìm kiếm webkitAudioContext
một cách rõ ràng. Nhà phát triển tồi! Bạn có thể đã hỗ trợ Firefox trong nhiều tháng!
Tuy nhiên, có một số cách xoá mã khác tinh tế hơn, một số cách có thể ít rõ ràng hơn.
- Các hằng số loại được liệt kê BiquadFilter cho thuộc tính
.type
(hiện là một chuỗi) không còn xuất hiện trên đối tượngBiquadFilterNode
và chúng tôi không hỗ trợ các hằng số này trên thuộc tính.type
. Vì vậy, bạn không sử dụng.LOWPASS
(hoặc 0) nữa – bạn đặt thành "lowpass". - Ngoài ra, thuộc tính
Oscillator.type
hiện cũng là một loại được liệt kê chuỗi – không còn.SAWTOOTH
nữa. PannerNode.type
hiện cũng là một loại được liệt kê chuỗi.PannerNode.distanceModel
hiện cũng là một loại liệt kê chuỗi.- Đổi tên
createGainNode
thànhcreateGain
- Đổi tên
createDelayNode
thànhcreateDelay
- Đổi tên
createJavaScriptNode
thànhcreateScriptProcessor
AudioBufferSourceNode.noteOn()
hiện được thay thế bằngstart()
AudioBufferSourceNode.noteGrainOn()
cũng được thay thế bằngstart()
AudioBufferSourceNode.noteOff()
được đổi tên thànhstop()
.OscillatorNode.noteOn()
được đổi tên thànhstart()
.OscillatorNode.noteOff()
được đổi tên thànhstop()
.AudioParam.setTargetValueAtTime()
được đổi tên thànhsetTargetAtTime()
.AudioContext.createWaveTable()
vàOscillatorNode.setWaveTable()
hiện được đổi tên thànhcreatePeriodicWave() and
setPeriodicWave()`.- Xoá
AudioBufferSourceNode.looping
và thay bằng.loop
- Xoá
AudioContext.createBuffer(ArrayBuffer, boolean)
để đồng bộ giải mã một blob dữ liệu âm thanh đã mã hoá. Lệnh gọi đồng bộ mất nhiều thời gian để hoàn tất là một phương pháp lập trình không tốt; thay vào đó, hãy sử dụng lệnh gọi decodeAudioData không đồng bộ. Đây là một trong những thay đổi khó khăn hơn – bạn cần thực sự thay đổi luồng logic – nhưng là một phương pháp hay hơn nhiều. Ehsan Angkari của Mozilla đã viết một ví dụ hay về cách thực hiện việc này trong bài đăng về việc chuyển đổi sang Web Audio chuẩn.
Rõ ràng là nhiều trong số này (chẳng hạn như việc đổi tên createGainNode và xoá tính năng giải mã đồng bộ trong createBuffer) sẽ xuất hiện trong bảng điều khiển công cụ dành cho nhà phát triển dưới dạng lỗi – tuy nhiên, một số khác, chẳng hạn như cách sử dụng sau:
MULTI_LINE_CODE_PLACEHOLDER_1
sẽ không xuất hiện và âm thầm không thành công (myFilterNode.BANDPASS hiện sẽ phân giải thành không xác định và việc cố gắng đặt .type thành không xác định sẽ không tạo ra bất kỳ hiệu ứng nào. Nhân tiện, đây là nguyên nhân khiến bộ mã hoá/giải mã lời nói không hoạt động.) Tương tự, chỉ cần gán filter.type cho một số từng hoạt động:
myFilterNode.type = 2;
Nhưng hiện tại, bạn cần sử dụng enum chuỗi:
myFilterNode.type = “bandpass”;
Vì vậy, bạn nên tìm kiếm các thuật ngữ sau trong mã của mình:
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
(vâng, cách này sẽ có nhiều kết quả dương tính giả – nhưng đó là cách duy nhất để phát hiện ví dụ cuối cùng ở trên!)
Xin nhắc lại, nếu bạn đang vội và muốn bắt đầu chạy, chỉ cần lấy một bản sao của thư viện monkeypatch webkitAudioContext của tôi và đưa vào ứng dụng của bạn. Chúc bạn thành công trong việc xâm nhập âm thanh!