Создание импульса с помощью JavaScriptNode (API Web Audio) - PullRequest
4 голосов
/ 09 февраля 2012

Я работаю с Web Audio API и пытаюсь создать JavaScriptNode, который выводит импульс.То есть мне нужен узел, который будет выводить 1, за которым следует целая куча нулей, и ничего больше.

Я думал, что приведенный ниже код будет разумным способом сделать это.Я инициализирую переменную с именем timeForAnImpulse значением true и использую эту переменную для запуска импульсивного вывода при обратном вызове аудио.В обратном вызове я затем устанавливаю «timeForAnImpulse» в false.

Кажется, что это должно работать, но это не так.Вместо одного импульса я получаю последовательность импульсов (1 в начале каждого буфера).Есть идеи, что я делаю не так?

<script type="text/javascript">

window.onload = init;

    function impulseNodeCB(evt){

        if(timeForAnImpulse){
            var buf = evt.outputBuffer.getChannelData(0);
            buf[0] = 1;
            timeForAnImpulse = false;
        }
    }

    var timeForAnImpulse = true;

    function init() {
        var context = new webkitAudioContext();
        impulseNode = context.createJavaScriptNode(2048,0,1);
        impulseNode.onaudioprocess = impulseNodeCB;
        impulseNode.connect(context.destination);   
    }

</script>

</head>

1 Ответ

4 голосов
/ 09 февраля 2012

Хорошо, я разобрался!

Я предполагал, что выходной буфер evt.outputBuffer.getChannelData(0) был инициализирован нулями в начале каждого обратного вызова. Это не так. Вместо этого он, кажется, сохраняет свои значения от своего последнего вызова. Явное обнуление буфера в предложении else решило проблему.

<script type="text/javascript">

window.onload = init;

    function impulseNodeCB(evt){

        if(timeForAnImpulse){
            var buf = evt.outputBuffer.getChannelData(0);
            buf[0] = 1;
            timeForAnImpulse = false;
        } else {
            buf[0] = 0;
        }
    }

    var timeForAnImpulse = true;

    function init() {
        var context = new webkitAudioContext();
        impulseNode = context.createJavaScriptNode(2048,0,1);
        impulseNode.onaudioprocess = impulseNodeCB;
        impulseNode.connect(context.destination);   
    }

</script>

</head>
...