javascript - tutorial - web audio vocoder
Error al construir ''AudioContext'': el número de contextos de hardware alcanzó el máximo (4)
¿Hay alguna forma de eliminar un AudioContext
después de haberlo creado?
var analyzers = [];
var contexts = [];
try {
for(var i = 0; i<20; i++) {
contexts[i] = new AudioContext();
analyzers[i] = contexts[i].createAnalyser();
}
}catch(e) {
console.log(e);
// too many contexts created -- how do I remove them?
}
He intentado esto, pero no me permite crear nuevos contextos después del hecho: analyzers.forEach(function(analyzer){analyzer.disconnect(analyzer.context.destination)})
Estoy usando Chrome 36 en Ubuntu Linux 14.04.
AudioContext.close () lanzará el hardware del contexto, pero verifica que esté disponible solo para versiones recientes de Chrome y Firefox. No disponible para IE aparentemente. Consulte la documentación: https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/close
Estaba trabajando en un widget de reproductor de medios que se rompió en Chrome (pero no en Firefox) tan pronto como más de cinco se incrustaron en una sola página.
Descubrí que puede crear un solo AudioContext
y almacenarlo globalmente, luego hacer que cada instancia solo use el AudioContext
compartido. Parece que no funciona de manera diferente: puede adjuntar varios buffers y múltiples destinos y todo el audio se mezcla.
Esto podría requerir más esfuerzo si lo está utilizando para la sincronización, pero para la reproducción de uno o más flujos de audio generados sobre la marcha con el código JS, compartir un solo AudioContext
funciona bien.
Realmente deberías tener solo un AudioContext
en la página.
De la documentación: "En la mayoría de los casos de uso, solo se utiliza un único AudioContext por documento".
Realmente no puedo pensar en una razón por la que alguna vez necesitarías más de una. ¿Hay algún problema específico con el que te has encontrado para crear varios contextos?
Referenciarlo a una variable, es decir:
var myAudioCtx = new AudioContext();
Entonces destruye llamando
myAudioCtx.close();
Eso es.