| // META: global=window |
| // META: script=/common/media.js |
| // META: script=/webcodecs/utils.js |
| |
| var defaultInit = { |
| timestamp: 1234, |
| channels: 2, |
| sampleRate: 8000, |
| frames: 100, |
| } |
| |
| function createDefaultAudioData() { |
| return make_audio_data(defaultInit.timestamp, |
| defaultInit.channels, |
| defaultInit.sampleRate, |
| defaultInit.frames); |
| } |
| |
| async_test(t => { |
| let originalData = createDefaultAudioData(); |
| |
| let channel = new MessageChannel(); |
| let localPort = channel.port1; |
| let externalPort = channel.port2; |
| |
| externalPort.onmessage = t.step_func((e) => { |
| let newData = e.data; |
| |
| // We should have a valid deserialized buffer. |
| assert_equals(newData.numberOfFrames, defaultInit.frames, 'numberOfFrames'); |
| assert_equals( |
| newData.numberOfChannels, defaultInit.channels, 'numberOfChannels'); |
| assert_equals(newData.sampleRate, defaultInit.sampleRate, 'sampleRate'); |
| |
| const originalData_copyDest = new Float32Array(defaultInit.frames); |
| const newData_copyDest = new Float32Array(defaultInit.frames); |
| |
| for (var channel = 0; channel < defaultInit.channels; channel++) { |
| originalData.copyTo(originalData_copyDest, { planeIndex: channel}); |
| newData.copyTo(newData_copyDest, { planeIndex: channel}); |
| |
| for (var i = 0; i < newData_copyDest.length; i+=10) { |
| assert_equals(newData_copyDest[i], originalData_copyDest[i], |
| "data (ch=" + channel + ", i=" + i + ")"); |
| } |
| } |
| |
| newData.close(); |
| externalPort.postMessage("Done"); |
| }) |
| |
| localPort.onmessage = t.step_func_done((e) => { |
| assert_equals(originalData.numberOfFrames, defaultInit.frames); |
| originalData.close(); |
| }) |
| |
| localPort.postMessage(originalData); |
| |
| }, 'Verify closing AudioData does not propagate accross contexts.'); |
| |
| async_test(t => { |
| let data = createDefaultAudioData(); |
| |
| let channel = new MessageChannel(); |
| let localPort = channel.port1; |
| |
| localPort.onmessage = t.unreached_func(); |
| |
| data.close(); |
| |
| assert_throws_dom("DataCloneError", () => { |
| localPort.postMessage(data); |
| }); |
| |
| t.done(); |
| }, 'Verify posting closed AudioData throws.'); |
| |
| async_test(t => { |
| let localData = createDefaultAudioData(); |
| |
| let channel = new MessageChannel(); |
| let localPort = channel.port1; |
| let externalPort = channel.port2; |
| |
| externalPort.onmessage = t.step_func_done((e) => { |
| let externalData = e.data; |
| assert_equals(externalData.numberOfFrames, defaultInit.frames); |
| externalData.close(); |
| }) |
| |
| localPort.postMessage(localData, [localData]); |
| assert_not_equals(localData.numberOfFrames, defaultInit.frames); |
| }, 'Verify transferring audio data closes them.'); |