2015-08-22 10 views
12

All'avvio dell'oscillatore, interromperlo e riavviarlo; Ottengo il seguente errore:(API audio Web) Errore nodo Oscillatore: impossibile richiamare l'avvio più volte

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

Ovviamente ho potuto utilizzare gain di "fermare" l'audio, ma che mi colpisce pratica come poveri. Qual è un modo più efficiente di fermare l'oscillatore mentre è in grado di riavviarlo?

codice (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); 
    }); 
}); 

soluzione attuale (al momento della domanda): http://jsfiddle.net/xbqbzgt2/2/

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

+0

Sembra una limitazione di implementazione .. Puoi provare a creare un nuovo 'OscillatorNode' su ogni' start() ' –

risposta

15

Un modo migliore sarebbe quello di avviare l'oscillatorNode una volta e collegare/scollegare l'oscillatorNode dal grafico quando necessario, vale a dire:

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); 
    }); 
}); 

questo modo muting in realizzata in muting the thermin (documentazione di mozilla web audio api)

1

La soluzione migliore che ho trovato finora è mantenere lo SAME audioContext durante la ricreazione di oscillator ogni volta che è necessario utilizzare i t.

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

FYI è possibile creare solo 6 audioContext oggetti per pagina del browser durata della vita (o almeno per il mio hardware):

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