| // 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.'); |