Chrome ปรับปรุงการรองรับ Web Audio API อย่างต่อเนื่องและเงียบๆ ใน Chrome 49 (เบต้าในเดือนกุมภาพันธ์ 2016 และคาดว่าจะพร้อมใช้งานในเวอร์ชันเสถียรในเดือนมีนาคม 2016) เราได้อัปเดตฟีเจอร์หลายอย่างเพื่อติดตามข้อกําหนด และเพิ่มโหนดใหม่ 1 รายการ
ตอนนี้ decodeAudioData() จะแสดงผลเป็นพรอมต์
ตอนนี้วิธี decodeAudioData() ใน AudioContext
จะแสดงผลเป็น Promise
ซึ่งเปิดใช้การจัดการรูปแบบแบบแอซิงโครนัสที่อิงตาม Promise วิธีการ decodeAudioData()
จะใช้ฟังก์ชัน Callback สำเร็จและข้อผิดพลาดเป็นพารามิเตอร์เสมอ
context.decodeAudioData( arraybufferData, onSuccess, onError);
แต่ตอนนี้คุณใช้เมธอด Promise มาตรฐานเพื่อจัดการกับลักษณะการทำงานแบบอะซิงโครนัสของการทำความเข้าใจข้อมูลเสียงแทนได้ ดังนี้
context.decodeAudioData( arraybufferData ).then(
(buffer) => { /* store the buffer */ },
(reason) => { console.log("decode failed! " + reason) });
แม้ว่าในตัวอย่างเดียวนี้ รูปแบบนี้จะดูยืดเยื้อกว่า แต่ Promises ช่วยให้การเขียนโปรแกรมแบบแอซิงโครนัสง่ายขึ้นและสม่ำเสมอมากขึ้น ระบบยังคงรองรับฟังก์ชันการเรียกกลับ "สำเร็จ" และ "ข้อผิดพลาด" ตามข้อกําหนดเพื่อรักษาความเข้ากันได้
ตอนนี้ OfflineAudioContext รองรับ suspend() และ resume() แล้ว
เมื่อมองแวบแรก การมี suspend() ใน OfflineAudioContext อาจดูแปลกๆ
ท้ายที่สุดแล้ว suspend()
เพิ่มลงใน AudioContext
เพื่อเปิดใช้โหมดสแตนด์บายของฮาร์ดแวร์เสียง ซึ่งดูเหมือนจะไม่มีจุดประสงค์ใดๆ ในสถานการณ์ที่คุณกำลังแสดงผลไปยังบัฟเฟอร์ (ซึ่ง OfflineAudioContext
มีไว้เพื่อวัตถุประสงค์นี้อยู่แล้ว)
อย่างไรก็ตาม จุดประสงค์ของฟีเจอร์นี้คือการสร้าง "คะแนน" เพียงบางส่วนในแต่ละครั้งเพื่อลดการใช้หน่วยความจำ คุณสามารถสร้างโหนดเพิ่มเติมได้ขณะที่หยุดแสดงผลชั่วคราวอยู่
ตัวอย่างเช่น โซนาตาแสงจันทร์ของเบโธเฟนมีโน้ตประมาณ 6,500 ตัว
"โน้ต" แต่ละรายการอาจแยกวิเคราะห์เป็นโหนดกราฟเสียงอย่างน้อย 2 โหนด (เช่น โหนด AudioBuffer และ Gain) หากต้องการแสดงผลทั้ง 7 นาทีครึ่งลงในบัฟเฟอร์ด้วย OfflineAudioContext
คุณอาจไม่ต้องการสร้างโหนดทั้งหมดพร้อมกัน แต่คุณจะสร้างเป็นกลุ่มๆ ตามช่วงเวลาแทนได้ ดังนี้
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();
}
วิธีนี้จะช่วยให้คุณลดจํานวนโหนดที่ต้องสร้างไว้ล่วงหน้าตอนเริ่มต้นการแสดงผล และลดความต้องการหน่วยความจําได้
IIRFilterNode
ข้อกำหนดได้เพิ่มโหนดสำหรับนักฟังเพลงที่ต้องการสร้างการตอบสนองต่อแรงกระตุ้นแบบไม่จำกัดที่ระบุไว้อย่างละเอียดด้วยตนเอง ซึ่งก็คือ IIRFilterNode
ตัวกรองนี้ช่วยเสริม BiquadFilterNode แต่อนุญาตให้ระบุพารามิเตอร์การตอบสนองของตัวกรองได้ครบถ้วน (แทนที่จะใช้ BiquadFilterNode
ของ AudioParams
ที่ใช้งานง่ายสำหรับประเภท ความถี่, Q และอื่นๆ) IIRFilterNode
ช่วยให้ระบุตัวกรองได้อย่างแม่นยำ ซึ่งก่อนหน้านี้สร้างไม่ได้ เช่น ตัวกรองลำดับเดียว แต่การใช้ IIRFilterNode ต้องใช้ความรู้เชิงลึกเกี่ยวกับวิธีการทํางานของตัวกรอง IIR และตัวกรองเหล่านี้ยังกำหนดเวลาไม่ได้เหมือนกับ BiquadFilterNode
การเปลี่ยนแปลงก่อนหน้า
นอกจากนี้ เราขอพูดถึงการปรับปรุง 2 รายการที่เคยทำไปก่อนหน้านี้ด้วย ใน Chrome 48 BiquadFilter
การทำงานอัตโนมัติของโหนดเริ่มทำงานด้วยอัตราเสียง API ไม่ได้เปลี่ยนแปลงไปแม้แต่น้อย แต่การปรับปรุงนี้จะทำให้เสียงของฟิลเตอร์ Sweep ราบรื่นยิ่งขึ้น นอกจากนี้ ใน Chrome 48 เราได้เพิ่มการต่อเชื่อมไปยังAudioNode.connect()
วิธี โดยแสดงผลโหนดที่เราเชื่อมต่ออยู่ วิธีนี้ช่วยให้สร้างเชนโหนดได้ง่ายขึ้น ดังในตัวอย่างนี้
sourceNode.connect(gainNode).connect(filterNode).connect(context.destination);
เท่านี้ก่อนนะ แล้วพบกันใหม่