audio-data-serialization.any.js (2703B)
1 // META: global=window 2 // META: script=/common/media.js 3 // META: script=/webcodecs/utils.js 4 5 var defaultInit = { 6 timestamp: 1234, 7 channels: 2, 8 sampleRate: 8000, 9 frames: 100, 10 } 11 12 function createDefaultAudioData() { 13 return make_audio_data(defaultInit.timestamp, 14 defaultInit.channels, 15 defaultInit.sampleRate, 16 defaultInit.frames); 17 } 18 19 async_test(t => { 20 let originalData = createDefaultAudioData(); 21 22 let channel = new MessageChannel(); 23 let localPort = channel.port1; 24 let externalPort = channel.port2; 25 26 externalPort.onmessage = t.step_func((e) => { 27 let newData = e.data; 28 29 // We should have a valid deserialized buffer. 30 assert_equals(newData.numberOfFrames, defaultInit.frames, 'numberOfFrames'); 31 assert_equals( 32 newData.numberOfChannels, defaultInit.channels, 'numberOfChannels'); 33 assert_equals(newData.sampleRate, defaultInit.sampleRate, 'sampleRate'); 34 35 const originalData_copyDest = new Float32Array(defaultInit.frames); 36 const newData_copyDest = new Float32Array(defaultInit.frames); 37 38 for (var channel = 0; channel < defaultInit.channels; channel++) { 39 originalData.copyTo(originalData_copyDest, { planeIndex: channel}); 40 newData.copyTo(newData_copyDest, { planeIndex: channel}); 41 42 for (var i = 0; i < newData_copyDest.length; i+=10) { 43 assert_equals(newData_copyDest[i], originalData_copyDest[i], 44 "data (ch=" + channel + ", i=" + i + ")"); 45 } 46 } 47 48 newData.close(); 49 externalPort.postMessage("Done"); 50 }) 51 52 localPort.onmessage = t.step_func_done((e) => { 53 assert_equals(originalData.numberOfFrames, defaultInit.frames); 54 originalData.close(); 55 }) 56 57 localPort.postMessage(originalData); 58 59 }, 'Verify closing AudioData does not propagate accross contexts.'); 60 61 async_test(t => { 62 let data = createDefaultAudioData(); 63 64 let channel = new MessageChannel(); 65 let localPort = channel.port1; 66 67 localPort.onmessage = t.unreached_func(); 68 69 data.close(); 70 71 assert_throws_dom("DataCloneError", () => { 72 localPort.postMessage(data); 73 }); 74 75 t.done(); 76 }, 'Verify posting closed AudioData throws.'); 77 78 async_test(t => { 79 let localData = createDefaultAudioData(); 80 81 let channel = new MessageChannel(); 82 let localPort = channel.port1; 83 let externalPort = channel.port2; 84 85 externalPort.onmessage = t.step_func_done((e) => { 86 let externalData = e.data; 87 assert_equals(externalData.numberOfFrames, defaultInit.frames); 88 externalData.close(); 89 }) 90 91 localPort.postMessage(localData, [localData]); 92 assert_not_equals(localData.numberOfFrames, defaultInit.frames); 93 }, 'Verify transferring audio data closes them.');