When I start my oscillator, stop it, and then start it again; I get the following error:
Uncaught InvalidStateError: Failed to execute 'start' on 'OscillatorNode': cannot call start more than once.
Obviously I could use gain
to "stop" the audio but that strikes me as poor practice. What's a more efficient way of stopping the oscillator while being able to start it again?
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); }); });
Current solution (at time of question): http://jsfiddle.net/xbqbzgt2/2/
A better way would be to start the oscillatorNode once and connect/disconnect the oscillatorNode from the graph when needed, ie :
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); }); });
This how muting in done in muting the thermin (mozilla web audio api documentation)
The best solution I've found so far is to keep the SAME audioContext
while recreating the oscillator
every time you need to use it.
FYI You can only create 6 audioContext
objects per browser page lifespan (or at least per my hardware):
Uncaught NotSupportedError: Failed to construct 'AudioContext': The number of hardware contexts provided (6) is greater than or equal to the maximum bound (6).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With