| <!DOCTYPE html> |
| |
| <!-- |
| Tests that GainNode is properly scaling the gain. |
| We'll render 11 notes, starting at a gain of 1.0, decreasing in gain by 0.1. |
| The 11th note will be of gain 0.0, so it should be silent (at the end in the rendered output). |
| --> |
| |
| <html> |
| <head> |
| <script type="text/javascript" src="resources/audio-testing.js"></script> |
| |
| </head> |
| <body> |
| |
| <script> |
| |
| window.onload = init; |
| |
| var sampleRate = 44100.0; |
| var bufferDurationSeconds = 0.125; |
| var numberOfNotes = 11; |
| var noteSpacing = bufferDurationSeconds + 0.020; // leave 20ms of silence between each "note" |
| var lengthInSeconds = numberOfNotes * noteSpacing; |
| |
| var context = 0; |
| var sinWaveBuffer = 0; |
| |
| function createSinWaveBuffer(lengthInSeconds, frequency) { |
| var audioBuffer = context.createBuffer(2, lengthInSeconds * sampleRate, sampleRate); |
| |
| var n = audioBuffer.length; |
| var channelL = audioBuffer.getChannelData(0); |
| var channelR = audioBuffer.getChannelData(1); |
| |
| for (var i = 0; i < n; ++i) { |
| channelL[i] = Math.sin(frequency * 2.0*Math.PI * i / sampleRate); |
| channelR[i] = channelL[i]; |
| } |
| |
| return audioBuffer; |
| } |
| |
| function playNote(time, gain) { |
| var source = context.createBufferSource(); |
| source.buffer = sinWaveBuffer; |
| |
| var gainNode = context.createGain(); |
| gainNode.gain.value = gain; |
| |
| source.connect(gainNode); |
| gainNode.connect(context.destination); |
| |
| source.start(time); |
| } |
| |
| function init() { |
| if (!window.testRunner) |
| return; |
| |
| // Create offline audio context. |
| context = new OfflineAudioContext(2, sampleRate * lengthInSeconds, sampleRate); |
| |
| // Create a buffer for a short "note". |
| sinWaveBuffer = createSinWaveBuffer(bufferDurationSeconds, 880.0); |
| |
| // Render 11 notes, starting at a gain of 1.0, decreasing in gain by 0.1. |
| // The last note will be of gain 0.0, so shouldn't be perceptible in the rendered output. |
| for (var i = 0; i < numberOfNotes; ++i) { |
| var time = i * noteSpacing; |
| var gain = 1.0 - i / (numberOfNotes - 1); |
| playNote(time, gain); |
| } |
| |
| context.oncomplete = finishAudioTest; |
| context.startRendering(); |
| |
| testRunner.waitUntilDone(); |
| } |
| |
| </script> |
| |
| </body> |
| </html> |