<!doctype html> <meta charset=utf-8> <title>Test the ConstantSourceNode Interface</title> <script src=/resources/testharness.js></script> <script src=/resources/testharnessreport.js></script> <script> test(function(t) { var ac = new AudioContext(); var csn = ac.createConstantSource(); assert_true(csn.offset.value == 1.0, "Default offset is 1.0"); csn = new ConstantSourceNode(ac); assert_true(csn.offset.value == 1.0, "Default offset is 1.0"); csn = new ConstantSourceNode(ac, {offset: -0.25}); assert_true(csn.offset.value == -0.25, "Offset can be set during construction"); }, "ConstantSourceNode can be constructed"); test(function(t) { var ac = new AudioContext(); var csn = ac.createConstantSource(); assert_throws("InvalidStateError", function() { csn.stop(1); }, "Start must be called before stop"); assert_throws("NotSupportedError", function() { csn.start(-1); }, "When can not be negative"); csn.start(0); assert_throws("NotSupportedError", function() { csn.stop(-1); }, "When can not be negative"); }, "ConstantSourceNode stop and start"); async_test(function(t) { var ac = new OfflineAudioContext(1, 2048, 44100); var csn = ac.createConstantSource(); csn.connect(ac.destination); csn.start() csn.stop(1024/44100) csn.onended = function(e) { t.step(function() { assert_true(e.type == "ended", "Event type should be 'ended', received: " + e.type); }); t.done(); } ac.startRendering(); }, "ConstantSourceNode onended event"); async_test(function(t) { var ac = new OfflineAudioContext(1, 2048, 44100); var csn = ac.createConstantSource(); csn.connect(ac.destination); csn.start(512/44100) csn.stop(1024/44100) ac.oncomplete = function(e) { t.step(function() { var result = e.renderedBuffer.getChannelData(0); for (var i = 0; i < 2048; ++i) { if (i >= 512 && i < 1024) { assert_true(result[i] == 1.0, "sample " + i + " should equal 1.0"); } else { assert_true(result[i] == 0.0, "sample " + i + " should equal 0.0"); } } }); t.done(); } ac.startRendering(); }, "ConstantSourceNode start and stop when work"); async_test(function(t) { var ac = new OfflineAudioContext(1, 2048, 44100); var csn = ac.createConstantSource(); csn.offset.value = 0.25; csn.connect(ac.destination); csn.start() ac.oncomplete = function(e) { t.step(function() { var result = e.renderedBuffer.getChannelData(0); for (var i = 0; i < 2048; ++i) { assert_true(result[i] == 0.25, "sample " + i + " should equal 0.25"); } }); t.done(); } ac.startRendering(); }, "ConstantSourceNode with no automation"); async_test(function(t) { var ac = new OfflineAudioContext(1, 2048, 44100); var timeConstant = 2.0; var offsetStart = 0.25; var offsetEnd = 0.1; var csn = ac.createConstantSource(); csn.offset.value = offsetStart; csn.offset.setTargetAtTime(offsetEnd, 1024/ac.sampleRate, timeConstant); csn.connect(ac.destination); csn.start() ac.oncomplete = function(e) { t.step(function() { // create buffer with expected values var buffer = ac.createBuffer(1, 2048, ac.sampleRate); for (var i = 0; i < 2048; ++i) { if (i < 1024) { buffer.getChannelData(0)[i] = offsetStart; } else { time = (i-1024)/ac.sampleRate; buffer.getChannelData(0)[i] = offsetEnd + (offsetStart - offsetEnd)*Math.exp(-time/timeConstant); } } var result = e.renderedBuffer.getChannelData(0); var expected = buffer.getChannelData(0); for (var i = 0; i < 2048; ++i) { assert_true(Math.abs(result[i] - expected[i]) < 1e-6, "sample " + i + " should equal " + expected[i]); } }); t.done(); } ac.startRendering(); }, "ConstantSourceNode with automation"); </script>