2016-05-29 2 views
5

J'essaye d'implémenter un ScriptProcessorNode avec deux canaux d'entrée et un de sortie. Lorsque j'exécute ce code dans Google Chrome ainsi que dans Mozilla Firefox, l'erreur suivante est générée lors de l'exécution de ce code dans Mozilla Firefox: Comment puis-je connecter deux canaux d'entrée à ScriptProcessorNode? (Web Audio Api, JavaScript)

var source = new Array(2); 

source[0] = context.createBufferSource(); 
source[0].buffer = buffer[0]; 

source[1] = context.createBufferSource(); 
source[1].buffer = buffer[1]; 

var test = context.createScriptProcessor(4096, 2, 1); 

source[0].connect(test, 0, 0); 
source[1].connect(test, 0, 1); 

test.connect(context.destination); 

source[0].start(); 
source[1].start(); 
Il me dit que mon nœud test n'a qu'un seul canal d'entrée.

Uncaught IndexSizeError: Failed to execute 'connect' on 'AudioNode': input index (1) exceeds number of inputs (1). 

Quand je console imprimer le nombre de canaux d'entrée du ScriptProcessorNode test je reçois deux canaux d'entrée.

test.onaudioprocess = function(evt){ 
    console.log("number of input channels: " + evt.inputBuffer.numberOfChannels); 
} 

Néanmoins reliant deux noeuds à l'entrée du noeud test ne fonctionne pas comme je le fais. Je veux programmer un vocoder à l'intérieur de ScriptProcessorNode. Comment puis-je créer un ScriptProcessorNode avec deux canaux d'entrée et un canal de sortie et connecter deux nœuds source comme canal d'entrée et le context.destination comme canal de sortie?

+0

https://developer.mozilla.org/fr-fr/docs/Web/API/ChannelMergerNode Avez-vous considéré cela? –

+0

J'ai besoin des deux canaux d'entrée dans la fonction qui est déclenchée par onaudioprocess pour les connecter d'une manière spécifique ensemble. Je pourrais créer deux ScriptProcessorNodes et les fusionner après, mais je ne sais pas comment exécuter deux ScriptProcessorNodes en parallèle. – thiloilg

+0

Ce que je comprends bien, c'est que vous voulez que les deux canaux soient traités séparément? Dans ce cas, vous voulez probablement https://developer.mozilla.org/en-US/docs/Web/API/ChannelSplitterNode et deux différents 'ScriptProcessorNode's pour traiter chaque flux audio mono. –

Répondre

5

Le deuxième paramètre de createScriptProcessor est le nombre de canaux d'entrée à l'entrée unique du nœud, pas le nombre d'entrées au nœud.

Donc, la façon de faire est d'utiliser un ChannelMergerNode avec deux entrées. Connectez vos deux sources à chacune des entrées du noeud de fusion. La sortie de la fusion doit être connectée à votre noeud de traitement de script. Le rappel onaudioprocess reçoit un AudioBuffer avec deux canaux. Vous pouvez ensuite traiter ces deux canaux comme vous le souhaitez.

+0

Une chose que je trouve quelque peu effroyable à propos de '.connect (_, _, inputIndex)' est que, si je comprends bien, l'index d'entrée ne peut être utilisé qu'avec ** ChannelMergerNode'. Tous les autres types de nœuds ont une ou une entrée nulle. ChannelMergerNode est le seul type de nœud qui a plus d'une entrée. –

+0

Oui, c'était vrai. Mais 'AudioWorklets' peut avoir plus d'une entrée. –