2015-08-22 5 views
12

Wenn ich meinen Oszillator starte, stoppe es und starte es dann erneut; Ich erhalte den folgenden Fehler:(Web Audio API) Oscillator-Knotenfehler: kann den Start nicht mehr als einmal aufrufen

Uncaught InvalidStateError: Failed to execute 'start' on 'OscillatorNode': cannot call start more than once. 

Offensichtlich konnte ich gain verwenden, um „Stop“, um das Audio aber das scheint ihm eine schlechte Praxis. Was ist eine effizientere Art den Oszillator zu stoppen und gleichzeitig neu starten zu können?

Code (jsfiddle)

var ctx = new AudioContext(); 
var osc = ctx.createOscillator(); 

osc.frequency.value = 8000; 

osc.connect(ctx.destination); 

function startOsc(bool) { 
    if(bool === undefined) bool = true; 

    if(bool === true) { 
     osc.start(ctx.currentTime); 
    } else { 
     osc.stop(ctx.currentTime); 
    } 
} 

$(document).ready(function() { 
    $("#start").click(function() { 
     startOsc(); 
    }); 
    $("#stop").click(function() { 
     startOsc(false); 
    }); 
}); 

Aktuelle Lösung (zum Zeitpunkt der Frage): http://jsfiddle.net/xbqbzgt2/2/

Endlösung: http://jsfiddle.net/xbqbzgt2/3/

+0

Es sieht wie eine Einschränkung der Implementierung aus. Sie können versuchen, einen neuen 'OscillatorNode' auf jedem' start() 'zu erstellen –

Antwort

15

Eine bessere Möglichkeit, die oscillatorNode einmal beginnen würde und verbinden/trennen Sie das oscillatorNode aus der Kurve bei Bedarf, das heißt:

var ctx = new AudioContext(); 
var osc = ctx.createOscillator(); 
osc.frequency.value = 8000;  
osc.start();  
$(document).ready(function() { 
    $("#start").click(function() { 
     osc.connect(ctx.destination); 
    }); 
    $("#stop").click(function() { 
     osc.disconnect(ctx.destination); 
    }); 
}); 

Diese wie in Muting ingetan 0 (mozilla web audio api Dokumentation)

1

Die beste Lösung, die ich bisher gefunden habe ist es, die gleiche audioContext während der Wiederherstellung der oscillator jedes Mal, wenn Sie i t.

http://jsfiddle.net/xbqbzgt2/3/

FYI können Sie erstellen nur 6 audioContext Objekte pro Browserseite Lebensdauer (oder zumindest pro meine Hardware):

Uncaught NotSupportedError: Failed to construct 'AudioContext': The number of hardware contexts provided (6) is greater than or equal to the maximum bound (6).