<!DOCTYPE html>

<!--
Tests that that we can merge two mono streams into a stereo stream.
-->

<html>
<head>
<script src="../resources/js-test.js"></script>
<script type="text/javascript" src="resources/audio-testing.js"></script>
<script type="text/javascript" src="resources/buffer-loader.js"></script>
</head>

<body>

<div id="description"></div>
<div id="console"></div>

<script>
description("Tests audio channel merging of two mono streams into a single stereo stream.");

var sampleRate = 44100.0;
var lengthInSampleFrames = 512;

var context = 0;
var bufferLoader = 0;
var buffer1;
var buffer2;
var bufferSource1;
var bufferSource2;
var channelMerger;

function createBufferWithDCOffset(length, sampleRate, offset) {
    var buffer = context.createBuffer(1, length, sampleRate);
    var data = buffer.getChannelData(0);
    for (var i = 0; i < buffer.length; ++i)
        data[i] = offset;
    
    return buffer;
}

// checkResult() checks that the rendered buffer is stereo and that the left channel is all -1 and right channel all +1.
function checkResult(event) {
    var buffer = event.renderedBuffer;

    var success = true;

    if (buffer.numberOfChannels == 2) {
        var bufferDataL = buffer.getChannelData(0);
        var bufferDataR = buffer.getChannelData(1);
    
        // Go through every sample and make sure it's all -1 for the left-channel, and all +1 for the right-channel.
        for (var i = 0; i < buffer.length; ++i) {
            if (bufferDataL[i] != -1 || bufferDataR[i] != 1) {
                success = false;
                break;
            }
        }
    } else {
        success = false;
    }

    if (success) {
        testPassed("Correctly merged from two mono streams to stereo.");
    } else {
        testFailed("Merging error from two mono streams to stereo.");
    }

    finishJSTest();
}

function runTest() {
    window.jsTestIsAsync = true;
        
    // Create stereo offline audio context.
    context = new OfflineAudioContext(2, lengthInSampleFrames, sampleRate);

    // Create two mono buffers, one having all -1 values, the other all +1.
    buffer1 = createBufferWithDCOffset(lengthInSampleFrames, sampleRate, -1);
    buffer2 = createBufferWithDCOffset(lengthInSampleFrames, sampleRate, 1);

    // Create a buffer source for each of these buffers.
    bufferSource1 = context.createBufferSource();
    bufferSource2 = context.createBufferSource();
    bufferSource1.buffer = buffer1;
    bufferSource2.buffer = buffer2;

    // Create a channel merger and connect it so that it merges two mono streams into a single stereo stream.
    
    channelMerger = context.createChannelMerger();
    bufferSource1.connect(channelMerger, 0, 0); // connect to input 0 of the channel merger
    bufferSource2.connect(channelMerger, 0, 1); // connect to input 1 of the channel merger
    
    channelMerger.connect(context.destination);

    // Trigger both sources to start at the beginning.
    bufferSource1.start(0);
    bufferSource2.start(0);
    
    context.oncomplete = checkResult;
    context.startRendering();
}

runTest();

</script>
</body>
</html>
