acquire-the-content.html (2877B)
1 <!doctype html> 2 <meta charset="utf-8"> 3 <title>Test for AudioBuffer's "acquire the content" operation</title> 4 <script src="/resources/testharness.js"></script> 5 <script src="/resources/testharnessreport.js"></script> 6 <script> 7 const SAMPLERATE = 8000; 8 const LENGTH = 128; 9 10 var tests = { 11 "AudioBufferSourceNode setter set with non-null buffer": function(oac) { 12 var buf = oac.createBuffer(1, LENGTH, SAMPLERATE) 13 var bs = new AudioBufferSourceNode(oac); 14 var channelData = buf.getChannelData(0); 15 for (var i = 0; i < channelData.length; i++) { 16 channelData[i] = 1.0; 17 } 18 bs.buffer = buf; 19 bs.start(); // This acquires the content since buf is not null 20 for (var i = 0; i < channelData.length; i++) { 21 channelData[i] = 0.5; 22 } 23 allSamplesAtOne(buf, "reading back"); 24 bs.connect(oac.destination); 25 return oac.startRendering(); 26 }, 27 "AudioBufferSourceNode buffer setter set with null" : (oac) => { 28 var buf = oac.createBuffer(1, LENGTH, SAMPLERATE) 29 var bs = new AudioBufferSourceNode(oac); 30 var channelData = buf.getChannelData(0); 31 for (var i = 0; i < channelData.length; i++) { 32 channelData[i] = 1.0; 33 } 34 bs.buffer = null; 35 bs.start(); // This does not acquire the content 36 bs.buffer = buf; // This does 37 for (var i = 0; i < channelData.length; i++) { 38 channelData[i] = 0.5; 39 } 40 allSamplesAtOne(buf, "reading back"); 41 bs.connect(oac.destination); 42 return oac.startRendering(); 43 }, 44 "ConvolverNode": (oac) => { 45 var buf = oac.createBuffer(1, LENGTH, SAMPLERATE) 46 var impulse = oac.createBuffer(1, 1, SAMPLERATE) 47 var bs = new AudioBufferSourceNode(oac); 48 var convolver = new ConvolverNode(oac, {disableNormalization: true}); 49 50 impulse.getChannelData(0)[0] = 1.0; // unit impulse function 51 convolver.buffer = impulse; // This does acquire the content 52 impulse.getChannelData(0)[0] = 0.5; 53 54 var channelData = buf.getChannelData(0); 55 for (var i = 0; i < channelData.length; i++) { 56 channelData[i] = 1.0; 57 } 58 bs.buffer = buf; 59 bs.start(); 60 61 bs.connect(convolver).connect(oac.destination); 62 return oac.startRendering(); 63 } 64 }; 65 66 function allSamplesAtOne(audiobuffer, location) { 67 var buf = audiobuffer.getChannelData(0); 68 for (var i = 0; i < buf.length; i++) { 69 // The convolver can introduce a slight numerical error. 70 if (Math.abs(buf[i] - 1.0) > 0.0001) { 71 assert_true(false, `Invalid value at index ${i}, expected close to 1.0, found ${buf[i]} when ${location}`) 72 return Promise.reject(); 73 } 74 } 75 assert_true(true, `Buffer unmodified when ${location}.`); 76 return Promise.resolve(); 77 } 78 79 for (const test of Object.keys(tests)) { 80 promise_test(async function(t) { 81 var buf = await tests[test](new OfflineAudioContext(1, LENGTH, SAMPLERATE)); 82 return allSamplesAtOne(buf, "rendering"); 83 }, test); 84 }; 85 </script>