Chrome đã không ngừng cải thiện khả năng hỗ trợ Web Audio API. Trong Chrome 49 (Bản thử nghiệm từ tháng 2 năm 2016 và dự kiến sẽ ra mắt bản ổn định vào tháng 3 năm 2016), chúng tôi đã cập nhật một số tính năng để theo dõi thông số kỹ thuật và cũng thêm một nút mới.
decodeAudioData() hiện trả về một lời hứa
Phương thức decodeAudioData() trên AudioContext
hiện trả về một Promise
, cho phép xử lý mẫu không đồng bộ dựa trên Lời hứa. Phương thức decodeAudioData()
luôn lấy các hàm gọi lại thành công và lỗi làm tham số:
context.decodeAudioData( arraybufferData, onSuccess, onError);
Nhưng giờ đây, bạn có thể sử dụng phương thức Promise tiêu chuẩn để xử lý bản chất không đồng bộ của việc giải mã dữ liệu âm thanh:
context.decodeAudioData( arraybufferData ).then(
(buffer) => { /* store the buffer */ },
(reason) => { console.log("decode failed! " + reason) });
Mặc dù trong một ví dụ đơn lẻ, cách này có vẻ dài dòng hơn, nhưng Lời hứa giúp lập trình không đồng bộ dễ dàng và nhất quán hơn. Để đảm bảo khả năng tương thích, các hàm gọi lại Thành công và lỗi vẫn được hỗ trợ theo thông số kỹ thuật.
OfflineAudioContext hiện hỗ trợ suspend() và resume()
Thoạt nhìn, có vẻ lạ khi bạn sử dụng suspend() trên một OfflineAudioContext.
Xét cho cùng, suspend()
được thêm vào AudioContext
để cho phép đặt phần cứng âm thanh vào chế độ chờ, điều này có vẻ vô nghĩa trong các trường hợp khi bạn kết xuất vào vùng đệm (dĩ nhiên, đó là mục đích của OfflineAudioContext
).
Tuy nhiên, điểm mấu chốt của tính năng này là chỉ có thể tạo một phần của "điểm số" tại một thời điểm để giảm thiểu mức sử dụng bộ nhớ. Bạn có thể tạo thêm các nút trong khi bị tạm ngưng giữa quá trình kết xuất.
Ví dụ: Bản nhạc Moonlight Sonata của Beethoven chứa khoảng 6.500 nốt nhạc.
Mỗi "note" có thể phân tích cú pháp thành ít nhất một vài nút biểu đồ âm thanh (ví dụ: AudioBuffer và nút Gain). Nếu muốn kết xuất toàn bộ 7 phút rưỡi vào vùng đệm bằng OfflineAudioContext
, có thể bạn sẽ không muốn tạo tất cả các nút đó cùng một lúc. Thay vào đó, bạn có thể tạo các chiến dịch trong các khoảng thời gian:
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();
}
Điều này sẽ giúp bạn giảm thiểu số lượng nút cần tạo trước khi bắt đầu kết xuất và giảm nhu cầu về bộ nhớ.
IIRFilterNode
Quy cách này đã thêm một nút dành cho những người đam mê âm thanh muốn tạo đáp ứng xung vô hạn được chỉ định chính xác của riêng họ: IIRFilterNode.
Bộ lọc này bổ sung cho BiquadFilterNode, nhưng cho phép chỉ định đầy đủ các tham số phản hồi bộ lọc (thay vì AudioParams
dễ sử dụng của BiquadFilterNode
cho loại, tần số, Q, v.v.). IIRFilterNode
cho phép chỉ định chính xác các bộ lọc không thể tạo trước đó, chẳng hạn như bộ lọc đơn hàng; tuy nhiên, việc sử dụng IIRFilterNode đòi hỏi một số kiến thức chuyên sâu về cách hoạt động của bộ lọc IIR và chúng cũng không thể lên lịch như BiquadFilterNodes.
Các thay đổi trước đó
Tôi cũng muốn đề cập đến một số điểm cải tiến đã được thực hiện trước đó: trong Chrome 48, tính năng tự động hoá nút BiquadFilter
bắt đầu chạy ở tốc độ âm thanh. API không thay đổi gì để thực hiện việc này, nhưng điều này có nghĩa là âm thanh quét bộ lọc của bạn sẽ nghe mượt mà hơn. Ngoài ra, trong Chrome 48, chúng tôi đã thêm tính năng tạo chuỗi vào phương thức AudioNode.connect()
bằng cách trả về nút mà chúng tôi đang kết nối. Điều này giúp bạn tạo chuỗi nút dễ dàng hơn, như trong ví dụ này:
sourceNode.connect(gainNode).connect(filterNode).connect(context.destination);
Đó là tất cả thông tin hiện tại. Chúc bạn thành công!