2016-01-13 3 views
1

Я играю с Web Audio API и используя этот код:Удаление console.log Перерывы кода с Web Audio API

function playTones(startFreq, numNotes) { 
    if (numNotes === 0) return; 

    var osc = AC.createOscillator(); 
    osc.frequency.value = startFreq; 
    osc.onended = function() { 
    playTones(startFreq + 20, numNotes-1); 
    }; 
    console.log(osc.onended); 

    osc.connect(AC.destination); 
    osc.start(); 
    osc.stop(AC.currentTime + 1); 
} 

Это просто должен играть серию заметок, каждый из которых 20Гц более высокий, чем предыдущая. Однако, когда я удаляю console.log, он не работает; он воспроизводит только первую ноту, а затем останавливается с обратным вызовом onended, который никогда не вызывается. Почему это произойдет? Спасибо за любую помощь.

+0

Определить 'osc' за пределами вашей' функции playTones', и передать его в качестве параметра. – jperezov

+0

работает для меня: https://jsfiddle.net/d3m041o6/ (с помощью Chrome 47 в Windows). Кроме того, я не понимаю, почему это должно изменить поведение кода, к сожалению – pomeh

+0

Хм, это странно, что эта скрипка работает ... Неправильно ли предположить, что этот обратный вызов 'onended' будет срабатывать, пока' osc' все еще существует? Другими словами, возвращается функция, а затем вызов 'onended' callback вызывается для' osc', но теперь он вышел из callstack, поэтому ничего не происходит? – JuliusAlexanderIV

ответ

0

Эй вы могли бы попробовать это:

var AC = new AudioContext(); 

    function playTones(startFreq, numNotes) { 
    if (numNotes === 0) return; 

    var osc = AC.createOscillator(); 
    osc.frequency.value = startFreq; 

    // console.log(osc.onended); 

    osc.connect(AC.destination); 
    osc.start(); 
    osc.stop(AC.currentTime + 1); 
    setTimeout(function(){playTones(startFreq+20,10)},1000); 
    } 

    playTones(200, 10);